Running django channels with daphne on systemd

后端 未结 3 1299
Happy的楠姐
Happy的楠姐 2020-12-30 18:00

First of all, sorry for the long question, I hope a few of you have patience for this.

TL; DR: How do I load django settings correctly in systemd?

I am fol

相关标签:
3条回答
  • 2020-12-30 18:03

    Yes, supervisord did work. Key bits of the /etc/supervisor/conf.d/project_name.conf were (some further links in the commented portions):

    [program:platform_asgi_daphne]
    ; # https://stackoverflow.com/questions/17055951/how-to-set-environment-variables-in-supervisor-service
    ; # https://github.com/django/daphne/pull/37
    ; # https://wiki.cac.washington.edu/display/infra/Extracting+Certificate+and+Private+Key+Files+from+a+.pfx+File
    ; # daphne -e ssl:8443:privateKey=localhost.key:certKey=localhost.crt <channel_layer>
    environment =
        DJANGO_SECRET_KEY='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
        DJANGO_DEBUG='True'
    directory=/path/to/project/
    ; # http://channels.readthedocs.io/en/stable/deploying.html
    ; command=/path/to/venv/bin/daphne --port 80 --bind 0.0.0.0 classact.asgi:channel_layer
    command=/path/to/venv/bin/daphne -e ssl:443:privateKey=../keys/server.key:certKey=../keys/server.crt --bind 0.0.0.0 projectfoldername.asgi:channel_layer
    ;user=webapps
    ;group=webapps
    user=root
    group=webapps
    
    [program:platform_asgi_workers]
    ; # https://github.com/django/channels/issues/408#issuecomment-276384104
    environment =
        DJANGO_SECRET_KEY='xxxxxxxxxxxxxxxxxxxxxxxxx',
        DJANGO_DEBUG='True'
    command=/path/to/venv/bin/python /path/to/project/manage.py runworker
    process_name=asgi_worker%(process_num)s
    numprocs=2
    ;user=webapps
    user=root
    group=webapps
    

    I had a couple of issues running as the user webapps which have yet to be sorted out so they run as root (writing to an encrypted folder with odd perms). I didn't get to the point where I wasn't repeating a bunch of environment vars in each section (there is probably a way). There are several others there like the database, user, static root etc depending on the platform (prod or dev).

    I also have some certs to deal with so that is shown as well (if not needed take out the ssl parts). Also note running two workers.

    0 讨论(0)
  • 2020-12-30 18:19

    In your posted configs the daphne port seems to be off.

    you wrote:

    ws = new WebSocket("ws://localhost:8000/order/1/")
    ws.send("test")`
    

    while using 8001 in your systemd startup file

    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
    
    0 讨论(0)
  • 2020-12-30 18:20

    I've just deployed my django channel app, and the following systemd service file worked for me without using supervisor:

    /etc/systemd/system/django-channels-daphne.service

    [Unit]
    Description=daphne server script for my project
    After=network.target
    
    [Service]
    User=webuser
    Group=webuser
    WorkingDirectory=/path/to/myproject
    Environment=DJANGO_SECRET_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    Environment=DJANGO_ALLOWED_HOSTS=myapp.chatbot.ai
    ExecStart=/path/to/python/virtualenv/bin/daphne -b 0.0.0.0 -p 8000 myproject.asgi:channel_layer
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
    

    /etc/systemd/system/django-channels-runworker.service

    [Unit]
    Description=python runworker server for myproject
    After=network.target
    
    [Service]
    User=webuser
    Group=webuser
    WorkingDirectory=/path/to/myproject
    Environment=DJANGO_SECRET_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    Environment=DJANGO_ALLOWED_HOSTS=myapp.chatbot.ai
    ExecStart=/path/to/python/virtualenv/bin/python /path/to/myproject/manage.py runworker --threads 4 
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
    

    /path/to/myproject/myproject/asgi.py

    import os
    import channels
    
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
    channel_layer = channels.asgi.get_channel_layer()
    

    Some lines in /path/to/myproject/myproject/settings.py:

    ALLOWED_HOSTS = [os.environ['DJANGO_ALLOWED_HOSTS']]
    SECRET_KEY = os.environ['DJANGO_SECRET_KEY']
    
    0 讨论(0)
提交回复
热议问题