diff --git a/src/content/blog/Django server установка и настройка.md b/src/content/blog/Django server установка и настройка.md new file mode 100644 index 0000000..2fee82e --- /dev/null +++ b/src/content/blog/Django server установка и настройка.md @@ -0,0 +1,299 @@ +## Рабочие коды + +```sh +sudo apt-get install -y zsh wget build-essential tree redis-server nginx zlib1g-dev libbz2-dev libreadline-dev llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev liblzma-dev python3-dev python3-pip python3-venv python3-pil python3-lxml libxslt-dev python3-libxml2 libffi-dev libssl-dev python3-dev gnumeric libsqlite3-dev libpq-dev libxml2-dev libxslt1-dev libjpeg-dev libfreetype6-dev libcurl4-openssl-dev libgdbm-dev libc6-dev supervisor +``` +Устанавливаем и включаем по умолчанию `Oh-my-zsh` +```sh +sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" +zsh +chsh -s $(which zsh) +sudo chsh -s $(which zsh) +``` +Устанавливаем и включаем по умолчанию `neofetch` +```sh +# Первый запуск для создания ~/.config/neofetch/config.conf +neofetch +# Далее добавляем в .bashrc в самый конец файла +echo "neofetch" >> ~/.zshrc +# Далее идем редактировать конфиг +nano ~/.config/neofetch/config.conf +``` +[Настройка описана вот в этой статье](https://xn----7sbabksvrfvnenyr4r.xn--p1ai/blog/09-graylog/#:~:text=cmd%20%2D%2Dreload-,%D0%9D%D0%B0%D1%81%D1%82%D0%BE%D0%B9%D0%BA%D0%B0%20neofetch,-%23%20%D0%9F%D0%B5%D1%80%D0%B2%D1%8B%D0%B9%20%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%20%D0%B4%D0%BB%D1%8F) +Редактируем сообщение приветствия +```sh +sudo nano /etc/motd +``` +## Добавляем бекэнд проект +Приступаем к установки виртуального окружения +```sh +python3 -m venv env +source env/bin/activate +pip install django +``` +Создаем каталог +```sh +mkdir /var/www/project +# даем права на группу +sudo chown -R root:users /var/www/project +sudo chmod 775 /var/www/project +cd /var/www/project +``` +Скачиваем нужную версию python и разворачиваем её +```sh +wget https://www.python.org/ftp/python/3.11.10/Python-3.11.10.tgz ; \ +tar xvf Python-3.11.* ; \ +cd Python-3.11.10 ; \ +mkdir ~/.python ; \ +./configure --enable-optimizations --prefix=/home//.python ; \ +make -j8 ; \ +sudo make altinstall +### +sudo /home//.python/bin/python3.11 -m pip install -U pip +``` +Разворачиваем виртуальную среду и обновляем его +```sh +/home//.python/bin/python3 -m venv env +source env/bin/activate +git clone https://github.com/Project1.git +pip install -U pip +pip install -r requirements.txt +``` +Создаём связь с БД +```shell +python.exe manage.py makemigrations accounts media main articles todos tenants teams properties goods documentsflow contracts techfeatures histories comments editors functionaldiagram +python manage.py migrate +python manage.py createsuperuser +### Уже можем проверить старт приложения +python manage.py runserver 0.0.0.0:8000 +``` +Добавляем доступ к порт если есть фаервол +```sh +sudo firewall-cmd --permanent --add-port=8000/tcp +sudo firewall-cmd --permanent --add-port=8001/tcp +sudo firewall-cmd --permanent --add-service=https +sudo firewall-cmd --permanent --add-service=http +sudo firewall-cmd --reload +``` +Устанавливаем и настраиваем `gunicorn` +Нужно создать 2 файла один в директории проекта, второй на уровне env +Первый файл `/var/www/project1/gunicorn_config.py` +```python +command = '/var/www/env/bin/gunicorn' +pythonpath = '/var/www/project1' +bind = '127.0.0.1:8001' +workers = 5 +user = '' +limit_request_fields = 32000 +limit_request_field_size = 0 +raw_env = 'DJANGO_SETTINGS_MODULE=project1.settings' +``` +Второй файл +```sh +#!/bin/bash +source /var/www/env/bin/activate +source /var/www/env/bin/postactivate +exec gunicorn -c "/var/www/project1/gunicorn_config.py" project1.wsgi +``` +Делаем файл исполняемым +```sh +chmod +x gunicorn_start.sh +``` +Устанавливаем и настраиваем `supervisior` +Создаем файл конфигурации `/etc/supervisior/conf.d/project1.conf` +```sh +[program:project1_gunicorn] +command=/var/www/gunicorn_start.sh +user= +process_name=%(program_name)s +numprocs=1 +autostart=true +autorestart=true +redirect_stderr=true +``` +Далее настройка nginx `/etc/nginx/sites-available/default` +```sh +server { + server_name example.com; + # Оптимизация SSL + ssl_session_cache shared:SSL:10m; + ssl_session_timeout 10m; + ssl_protocols TLSv1.2 TLSv1.3; + ssl_prefer_server_ciphers on; + ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384"; + # HTTP заголовки для безопасности + add_header X-Content-Type-Options nosniff; + add_header X-Frame-Options DENY; + add_header X-XSS-Protection "1; mode=block"; + add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; + # Основной корневой каталог + root /var/www/html; + index index.html index.htm index.nginx-debian.html; + # Прокси для backend + location / { + proxy_pass http://127.0.0.1:8001; + proxy_set_header X-Forwarded-Host $server_name; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"'; + # Убедитесь, что вам действительно нужно разрешить доступ с любого домена + add_header Access-Control-Allow-Origin *; + } + # Обработка медиа файлов + location /media/ { + alias /var/www/project1/media/; + expires max; + access_log on; + } + # Логи + error_log /var/log/nginx/backend-error.log; + access_log /var/log/nginx/backend-access.log; + # Максимальный размер загружаемого файла + client_max_body_size 100M; + # Защита от медленных атак (slowloris) + client_body_timeout 10s; + client_header_timeout 10s; + #send_timeout 10s; + keepalive_timeout 65; +} +# Редирект с HTTP на HTTPS +server { + listen 80; + listen [::]:80; + server_name example.com; + return 301 https://$host$request_uri; +} +``` +Далее перезагружаем nginx +```sh +sudo service nginx restart +``` +Далее для корректной работы нужно установить сертификат LetsEncrypt ssl, установка будет с помощью `certbot` +[Инструкция с официального сайта]([Инструкции Certbot | Certbot](https://certbot.eff.org/instructions?ws=nginx&os=pip)) +```sh +sudo apt update +sudo apt install python3 python3-venv libaugeas0 +sudo /home//.python/bin/python3 -m venv /opt/certbot/ +sudo /opt/certbot/bin/pip install --upgrade pip +sudo /opt/certbot/bin/pip install certbot certbot-nginx +sudo ln -s /opt/certbot/bin/certbot /usr/bin/certbot +sudo certbot --nginx +``` +Далее отвечаем на все вопросы, вот список особо интересных +Добавляем авто перевыпуск сертификата +``` +echo "0 0,12 * * * root /opt/certbot/bin/python -c 'import random; import time; time.sleep(random.random() * 3600)' && sudo certbot renew -q" | sudo tee -a /etc/crontab > /dev/null +``` +## добавляем фронтенд проект +```sh +git clone https://github.com/Project2.git +cd project2 +``` +Устанавливаем `npm` +```sh +sudo apt install -y npm +``` +Устанавливаем библиотеки из проекта +```sh +npm install +``` +Стартуем проект в режиме разработчика +```sh +npm run dev +``` +И опять возвращаемся к шагу добавления порта в фаервол +```sh +sudo firewall-cmd --permanent --add-port=8002/tcp +sudo firewall-cmd --reload +``` +Создаем новый файл конфигурации для nginx + `/etc/nginx/sites-available/example` +```sh +server { + listen 443; + server_name example2.com; + charset utf-8; + + # Оптимизация SSL + #ssl_session_cache shared:SSL:10m; + #ssl_session_timeout 10m; + #ssl_protocols TLSv1.2 TLSv1.3; + #ssl_prefer_server_ciphers on; + #ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384"; + + # HTTP headers для безопасности + add_header X-Content-Type-Options nosniff; + add_header X-Frame-Options DENY; + add_header X-XSS-Protection "1; mode=block"; + add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; + + } + # Обработка запросов + location / { + proxy_pass http://127.0.0.1:8002; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_cache_bypass $http_upgrade; + + # Защита от медленных атак (slowloris) + client_body_timeout 10s; + #client_header_timeout 10s; + send_timeout 10s; + } + + # Логи + error_log /var/log/nginx/frontend-error.log; + access_log /var/log/nginx/frontend-access.log; + + # Максимальный размер загружаемого файла (например, 100MB) + client_max_body_size 100M; + + # Защита от слишком долгих соединений + keepalive_timeout 65; +} + +# Редирект с HTTP на HTTPS +server { + listen 80; + server_name example2.com; + return 301 https://$host$request_uri; +} + +``` +Далее определяем оба файла настройка nginx +```sh +sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com +sudo ln -s /etc/nginx/sites-available/sample.org /etc/nginx/sites-enabled/sample.org +sudo nginx -t && sudo nginx -s reload +# Добавляем сертификат на новый домен +sudo certbot --nginx +``` +Устанавливаем приложения для постойного обновления pm2 +```sh +sudo npm i pm2 -g +``` +Создаем файл конфигурации вместе с проектом +```js +module.exports = { + apps: [ + { + name: 'project2', + port: '8002', + exec_mode: 'cluster', + instances: 'max', + script: './project2/.output/server/index.mjs' + } + ] +} +``` +Что бы после перезагрузки проект сам включался нужно добавить команду +```sh +pm2 startup +``` +