Some days ago i wanted to run Graphite on our new server. So I created a new user and a virtualenv for it and installed Graphite into it. The server is a Debian Jessie so I wanted to run Graphite with systemd. In the official documentation is a systemd example, but unfortunately this only works without a virtualenv.
So I went searching in the Internet for a solution. As far as I found out there was only one working solution in the net, and one not working. The working solution suggested to encapsulate the source command together with the run command in a bash script.
I wasn't happy with this, because it take away the possibilities of socket activation. So I tried some things.
The first thing tried was to execute the
activate.sh script with the
ExecStartPre= hook. This does not work because the script tries to set the environment witch ends after the hook.
So I took a look into the
activate.sh and found out it only sets two environment variables (and define a new shell prompt and the deactivate function). So I tried to set the environment variables with systemds
Environment directive, and now it works.
[Unit] Description=graphite-web Requires=graphite-web.socket After=network.target [Service] PIDFile=/opt/graphite/graphite-web.pid User=graphite Group=graphite WorkingDirectory=/opt/graphite/webapp/graphite/ Environment=VIRTUAL_ENV="/home/graphite/.py-env" Environment=PATH="$VIRTUAL_ENV/bin:$PATH" ExecStart=/home/graphite/.py-env/bin/gunicorn --pid /opt/graphite/graphite-web.pid -w 2 wsgi:application ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s TERM $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target
The graphite-web.socket file:
[Unit] Description=graphite-web socket [Socket] ListenStream=/run/graphite-web/socket ListenStream=127.0.0.1:8980 #ListenStream=[::]:8000 [Install] WantedBy=sockets.target
the carbon-cache.service file:
[Unit] Description=carbon cahce The cache vor graphite Requires= After=network.target [Service] PIDFile=/opt/graphite/carbon-cache.pid User=graphite Group=graphite WorkingDirectory=/opt/graphite/bin Environment=VIRTUAL_ENV="/home/graphite/.py-env" Environment=PATH="$VIRTUAL_ENV/bin:$PATH" ExecStart=/opt/graphite/bin/carbon-cache.py --pidfile /opt/graphite/carbon-cache.pid start ExecReload=/bin/kill -USR1 $MAINPID ExecStop=/opt/graphite/bin/carbon-cache.py --pidfile /opt/graphite/carbon-cache.pid stop PrivateTmp=true Type=forking [Install] WantedBy=multi-user.target