 
   
                                                Ядро K2 Cloud ERP автоматично встановлює все, що необхідно для роботи системи. Воно автоматично встановить Python, якщо його немає в Linux (у Windows це є обов‘язком адміністратора), встановлює pip та всі необхідні компоненти та залежності.
Система K2 Cloud ERP з коробки підтримує багатопоточність. Але для реальної роботи все ж таки рекомендується налаштувати вебсервер Nginx та налаштувати сервіс додатка K2 Cloud ERP, щоб він стартував автоматично.
Щоб створити сервіс, заходите в папку /etc/systemd/system.
Створюєте файл з тією назвою, яку буде мати сервіс. Наприклад: k2update.service
В цьому файлі пишете:
[Unit]
# Назва сервісу
Description=Gunicorn instance to server k2update
After=network.target
[Service]
# Користувач та група під якими буде працювати сервіс
User=www-data
Group=www-data
# Шлях д каталогу з K2CloudERP
WorkingDirectory=/var/www/k2cloud/k2update/k2update-real
# Шлях до середи Python
Environment="PATH=/var/www/k2cloud/k2update/venv"
# Можна підключатись, як через sock файли, так і через порти. 
#ExecStart=gunicorn --workers 4 --bind unix:/var/run/k2update/k2update.sock -m 007 app:app
# Підключаємось через порт проекта по замовчуванню
# Вказали 4 ворк-процеса та 4 потока. Ці параметри потрібно міняти в залежності від кількості ваших процесорів та кількості користувачів
ExecStart=gunicorn --workers 4 --threads 4 -m 007 app:app
[Install]
WantedBy=multi-user.target
Ви створили сервіс.
Коли ви вносите зміни в сервісі, необхідно перезавантажити демони:
systemctl daemon-reload
Запустити сервіс можна командою:
service k2update start
Зупинити сервіс:
service k2update stop
Перезавантажити:
service k2update restart
Подивитись статус сервіса:
systemctl status k2update
Якщо сервіс працює, то повинні показуватись його процеси:

Для того, щоб сервіс автоматично завантажувався при перезавантаженні сервера, потрібно виконати команду:
systemctl enable k2update.service
Тепер налаштуємо конфіг вебсервера Nginx для домену з сервісом K2 Cloud ERP.
Заходимо в папку: /etc/nginx/sites-enabled
Створюємо файл, як звучить домен: k2update.corp2.eu
Пишемо в ньому:
server {
    listen 80;
    server_name k2update.corp2.eu;
    # Лог зі зверненнями до веб-серверу
    access_log /var/log/nginx/k2update.corp2.eu_access.log main;
    # Лог з помилками
    error_log /var/log/nginx/k2update.corp2.eu_error.log;
    # Root-каталог
    root /var/www/corp2/demo9.corp2.net/site/www;
     # Статическиое наполнение отдает сам nginx
location ~* ^.+.(jpg|jpeg|gif|png|ico|css|bmp|swf|txt|exe|7z|rar|pdf|jfif|zip|htm|arj|fla|avi|fla|shtml|rss|atom|tif|tiff|wbmp|jng|svg|svgz|ear|json|hqx|doc|ps|eps|ai|rtf|xls|ppt|wmlc|kml|kmz|cco|jardiff|jnlp|rpm|sea|xhtml|xpi|dll|bin|deb|dmg|eot|iso|img|msi|msp|msm|ogx|mid|midi|kar|mpga|mpega|mp2|mp3|m4a|oga|ogg|spx|ra|3gpp|3gp|mp4|mpeg|mpg|mpe|ogv|mov|flv|mng|asx|asf|wmv|avi|v8i)$ {
           root $root;
           expires  10d;
           break;
        }
location ~* .(js|css|png|jpg|jpeg|gif|ico)$ {
    expires 24h;
    log_not_found off;
}
    location / {
        # Якщо працюємо через порти
        proxy_pass http://127.0.0.1:8000;
        # Якщо працюємо через sock
        #proxy_pass http://unix:/var/run/k2update/k2update.sock;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
Для того, щоб спрацювали зміни, виконуємо релоад вебсервера:
nginx -s reload
У нас на фронті стоїть Nginx, який відповідає за ssl шифрування сайтів та за кешування інформації. Його основна функція – швидко отримати від бекенд вебсервера контент, тим самим звільнивши бекенд від роботи, й передати цей контент по https-протоколу.
Генеруємо SSL-сертифікат. Ми генеруємо сертифікат без необхідності перезавантаження вебсервера командою:
certbot certonly --nginx -d "k2update-test.corp2.eu"
Тепер налаштуємо конфіг Nginx. Переходимо в папку: /etc/nginx/sites-enabled
Створюємо файл з такою ж назвою, як звучить домен: k2update.corp2.eu
Вставляємо в нього наступну інформацію:
server {
        listen *:443 ssl;
        listen *:80;
        # Рут каталог тут не важливий, бо він на іншому сервері
        #root /var/www/corp2/corp2.eu/www;
        index index.php index.htm index.html;
        server_name k2update.corp2.eu;
     
        access_log /var/log/nginx/k2update.corp2.eu_access.log main;
        error_log /var/log/nginx/k2update.corp2.eu_error.log;
               # Заставляємо завжди працювати по https 
               if ( $scheme = "http" ) {
                   rewrite ^/(.*)$ https://$host/$1 permanent;
               }
            ssl_certificate /etc/letsencrypt/live/k2update.corp2.eu/fullchain.pem; # managed by Certbot
            ssl_certificate_key /etc/letsencrypt/live/k2update.corp2.eu/privkey.pem; # managed by Certbot
                ssl_session_cache shared:SSL:10m;
                ssl_session_timeout 5m;
                ssl_dhparam /etc/ssl/certs/dhparam.pem;
                add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
                ssl_protocols TLSv1.1 TLSv1.2;
                ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-
                ssl_prefer_server_ciphers on;
                #ssl_session_timeout 5m;
                #ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
                #ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
                #ssl_prefer_server_ciphers on;
# Статическиое наполнение отдает сам nginx
        # back-end этим заниматься не должен
location ~* ^.+.(jpg|jpeg|gif|png|ico|css|bmp|swf|txt|exe|7z|rar|pdf|jfif|zip|htm|arj|fla|avi|fla|shtml|rss|atom|tif|tiff|wbmp|jng|svg|svgz|ear|json|hqx|doc|ps|eps|ai|rtf|xls|ppt|wmlc|kml|kmz|cco|jardiff|jnlp|rpm|sea|xhtml|xpi|dll|bin|deb|dmg|eot|iso|img|msi|msp|msm|ogx|mid|midi|kar|mpga|mpega|mp2|mp3|m4a|oga|ogg|spx|ra|3gpp|3gp|mp4|mpeg|mpg|mpe|ogv|mov|flv|mng|asx|asf|wmv|avi|v8i)$ {
#            root /var/www/corp2/corp2.eu/www;
#           expires   10d;
#           break;
#        }
        location ~* {
           proxy_pass http://192.168.20.229:80;
           proxy_redirect http://192.168.20.229:80/ /;
           proxy_set_header Host $host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $remote_addr;
           proxy_connect_timeout 120;
           proxy_send_timeout 120;
           proxy_read_timeout 120;
           proxy_cache off;
           add_header Cache-Control no-cache;
           expires 1s;
           proxy_no_cache 1;
           proxy_cache_bypass 1;
        }
} 
Релоад вебсервера:
nginx -s reload