title: Running django channels with daphne on systemd
body: <p>First of all, sorry for the long question, I hope a few of you have patience for this.</p>
  
  <h2>TL; DR: How do I load django settings correctly in systemd?</h2>
  
  <p>I am following this guide, <a href="http://masnun.rocks/2016/11/02/deploying-django-channels-using-daphne/" rel="noreferrer">Deploying Django Channels Using Daphne</a>, so I can run some real-time apps (using WebSockets). Without nginx, and running from the command line the worker (python manage.py runworker) and interface (daphne), I can access the correct channels consumer class, as can be seen in the log below (these were triggered from a javascript client):</p>
  
  <pre><code>2017-10-09 21:10:35,210 - DEBUG - worker - Got message on websocket.connect (reply daphne.response.CYeWgnNQoY!mwuQrazQtv)
  2017-10-09 21:10:35,211 - DEBUG - runworker - websocket.connect
  2017-10-09 21:10:35,211 - DEBUG - worker - Dispatching message on websocket.connect to api.consumers.OrderConsumer
  2017-10-09 21:10:48,132 - DEBUG - worker - Got message on websocket.receive (reply daphne.response.CYeWgnNQoY!mwuQrazQtv)
  2017-10-09 21:10:48,132 - DEBUG - runworker - websocket.receive
  2017-10-09 21:10:48,132 - DEBUG - worker - Dispatching message on websocket.receive to api.consumers.OrderConsumer
  </code></pre>
  
  <p>These events were triggered by the following javascript calls:</p>
  
  <pre><code>ws = new WebSocket("ws://localhost:8000/order/1/")
  ws.send("test")
  </code></pre>
  
  <p>With nginx, and running both interface and worker on systemd, I get the following log despite using the exact same trigger input.</p>
  
  <pre><code>2017-10-09 20:38:35,503 - DEBUG - worker - Got message on websocket.connect (reply daphne.response.PPGuXtBmQD!EgUfaNZjUj)
  2017-10-09 20:38:35,503 - DEBUG - runworker - websocket.connect
  2017-10-09 20:38:35,503 - DEBUG - worker - Dispatching message on websocket.connect to channels.routing.connect_consumer
  2017-10-09 20:38:42,993 - DEBUG - worker - Got message on websocket.receive (reply daphne.response.PPGuXtBmQD!EgUfaNZjUj)
  2017-10-09 20:38:42,993 - DEBUG - runworker - websocket.receive
  2017-10-09 20:38:42,993 - DEBUG - worker - Dispatching message on websocket.receive to channels.routing.null_consumer
  </code></pre>
  
  <p>Please note that the receive channel is being routed to a <code>null_consumer</code>. I believe the problem here is simply the fact that <code>channels.routing</code> is not being well setup. Since I use the same setting (Django settings file) in both versions, this probably means that the setting itself is not being correctly loaded. Please consider the following files.</p>
  
  <pre><code>## rest-api/farmaApp/settings.py
  
  ...
  CHANNEL_LAYERS = {
      'default': {
          'BACKEND': 'asgi_redis.RedisChannelLayer',
          'CONFIG': {
              'hosts': [('localhost', 6379)],
          },
          'ROUTING': 'farmaApp.routing.channel_routing',
      }
  }
  ...
  </code></pre>
  
  <p>Which should setup <code>channels.routing</code> to:</p>
  
  <pre><code>## rest-api/farmaApp/routing.py
  
  from channels.routing import route
  from api.consumers import ws_connect, ws_disconnect, OrderConsumer
  
  channel_routing = [
      route('websocket.connect', ws_connect, path=r'^/users/'),
      route('websocket.disconnect', ws_disconnect, path=r'^/users/'),
      OrderConsumer.as_route(path=r'^/order/(?P&lt;order_id&gt;[\d+])/'),
  ]
  </code></pre>
  
  <p>Again, I don't think the configuration itself is wrong, as it works without systemd. Finally, here are my systemd configs:</p>
  
  <pre><code>## /etc/systemd/system/daphne.service
  
  [Unit]
  Description=daphne daemon
  After=network.target
  
  [Service]
  User=ubuntu
  Group=www-data
  WorkingDirectory=/home/ubuntu/rest-api
  Environment=DJANGO_SETTINGS_MODULE=farmaApp.settings
  ExecStart=/home/ubuntu/rest-api/env/bin/daphne --access-log /home/ubuntu/rest-api/access.log -b 0.0.0.0 -p 8001 farmaApp.asgi:channel_layer
  
  [Install]
  WantedBy=multi-user.target
  
  
  ## /etc/systemd/system/django_worker.service
  [Unit]
  Description=django_worker daemon
  After=network.target
  
  [Service]
  User=ubuntu
  Group=www-data
  WorkingDirectory=/home/ubuntu/rest-api
  Environment=DJANGO_SETTINGS_MODULE=farmaApp.settings
  ExecStart=/home/ubuntu/rest-api/env/bin/python manage.py runworker -v 2
  
  [Install]
  WantedBy=multi-user.target
  </code></pre>
  
  <p>Note on both config files that I export to the environment the DJANGO_SETTINGS_MODULE variable as according to the linked guide. I believe this isn't working as expected.</p>