From 77471d9991a0f4f451299babd6beb390588e2a96 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Tue, 21 Feb 2017 11:22:56 +0100
Subject: [PATCH] information about production deployment readme.md

---
 readme.md | 137 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 136 insertions(+), 1 deletion(-)

diff --git a/readme.md b/readme.md
index 14a40866..ebabb3fd 100644
--- a/readme.md
+++ b/readme.md
@@ -57,4 +57,139 @@ MEDIA_ROOT = '/tmp/media' # Warning! `/tmp` directory can be flushed in any mome
   - For reference of HTML tempalte, see [https://almsaeedstudio.com/themes/AdminLTE/pages/widgets.html#](https://almsaeedstudio.com/themes/AdminLTE/pages/widgets.html#)
 
 ## Production deployment
-  - extract static files and make them available via nginx: `./manage.py collectstatic`
\ No newline at end of file
+  - git pull and other project installation should be performed in a dir where this django app should be installed, in this tutorial it's /var/www/scheduling-system/
+  - install nginx: `apt-get install nginx`
+  - create gunicorn service in systemd (http://docs.gunicorn.org/en/stable/deploy.html#systemd): 
+
+### /etc/systemd/system/gunicorn.service 
+
+```
+[Unit]
+Description=gunicorn daemon
+Requires=gunicorn.socket
+After=network.target
+
+[Service]
+PIDFile=/run/gunicorn/pid
+User=www-data
+Group=www-data
+WorkingDirectory=/var/www/scheduling-system/smash
+
+ExecStart=/var/www/scheduling-system/env/bin/gunicorn --pid /run/gunicorn/pid smash.wsgi
+ExecReload=/bin/kill -s HUP $MAINPID
+ExecStop=/bin/kill -s TERM $MAINPID
+PrivateTmp=true
+
+[Install]
+WantedBy=multi-user.target
+```
+### /etc/systemd/system/gunicorn.socket
+
+```
+[Unit]
+Description=gunicorn socket
+
+[Socket]
+ListenStream=/run/gunicorn/socket
+ListenStream=0.0.0.0:9000
+ListenStream=[::]:8000
+
+[Install]
+WantedBy=sockets.target
+  
+   - modify nginx configuration
+
+# /etc/nginx/nginx.conf
+
+user www-data;
+worker_processes auto;
+pid /run/nginx.pid;
+
+events {
+        worker_connections 768;
+        # multi_accept on;
+}
+http {
+        sendfile on;
+        tcp_nopush on;
+        tcp_nodelay on;
+        keepalive_timeout 65;
+        types_hash_max_size 2048;
+
+        include /etc/nginx/mime.types;
+        default_type application/octet-stream;
+
+        ##
+        # SSL Settings
+        ##
+
+        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
+        ssl_prefer_server_ciphers on;
+
+        ##
+        # Logging Settings
+        ##
+
+        access_log /var/log/nginx/access.log;
+        error_log /var/log/nginx/error.log;
+
+        ##
+        # Gzip Settings
+        ##
+
+        gzip on;
+        gzip_disable "msie6";
+
+        include /etc/nginx/conf.d/*.conf;
+        include /etc/nginx/sites-enabled/*;
+}
+```
+
+### /etc/nginx/sites-enabled/default
+
+```
+upstream app_server {
+    # fail_timeout=0 means we always retry an upstream even if it failed
+    # to return a good HTTP response
+
+    # for UNIX domain socket setups
+    server unix:/run/gunicorn/socket fail_timeout=0;
+
+    # for a TCP configuration
+    # server 192.168.0.7:8000 fail_timeout=0;
+}
+
+server {
+        listen 80 default_server;
+        listen [::]:80 default_server;
+
+        listen 443 ssl;
+
+
+        root /var/www/html;
+
+        # Add index.php to the list if you are using PHP
+        index index.html index.htm index.nginx-debian.html;
+
+        server_name prc.parkinson.lu;
+
+        ssl_certificate /etc/nginx/ssl/nginx.crt;
+        ssl_certificate_key /etc/nginx/ssl/nginx.key;
+
+
+        location / {
+              # checks for static file, if not found proxy to app
+              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+              # enable this if and only if you use HTTPS
+              # proxy_set_header X-Forwarded-Proto https;
+              proxy_set_header Host $http_host;
+              # we don't want nginx trying to do something clever with
+              # redirects, we set the Host: header above already.
+              proxy_redirect off;
+              proxy_pass http://app_server;
+    }
+
+}
+```
+  - extract static files and make them available via nginx: `./manage.py collectstatic`
+  - you start application by starting gunicorn and nginx: `service gunicorn start`, `service nginx start`
\ No newline at end of file
-- 
GitLab