- Changed 'python manage.py' to 'python smartsoltech/manage.py' in all deployment scripts - Fixed deploy.sh, quick-deploy.sh - Updated DEPLOYMENT_GUIDE.md and DEPLOYMENT_SCRIPTS.md documentation - Added SERVER_FIX.md with instructions for server fix Fixes issue: python: can't open file '/app/manage.py': [Errno 2] No such file or directory
601 lines
16 KiB
Markdown
601 lines
16 KiB
Markdown
# 🚀 Руководство по развертыванию SmartSolTech на продакшн
|
||
|
||
## 📋 Предварительные требования
|
||
|
||
### На продакшн сервере должно быть установлено:
|
||
- Ubuntu 20.04/22.04 или Debian 11/12
|
||
- Docker 24.0+
|
||
- Docker Compose 2.0+
|
||
- Nginx (для reverse proxy)
|
||
- Certbot (для SSL сертификатов)
|
||
- Git
|
||
|
||
## 🔧 Шаг 1: Подготовка сервера
|
||
|
||
### 1.1 Обновление системы
|
||
```bash
|
||
sudo apt update && sudo apt upgrade -y
|
||
```
|
||
|
||
### 1.2 Установка Docker
|
||
```bash
|
||
# Установка Docker
|
||
curl -fsSL https://get.docker.com -o get-docker.sh
|
||
sudo sh get-docker.sh
|
||
|
||
# Добавление пользователя в группу docker
|
||
sudo usermod -aG docker $USER
|
||
newgrp docker
|
||
|
||
# Проверка установки
|
||
docker --version
|
||
docker compose version
|
||
```
|
||
|
||
### 1.3 Установка Nginx и Certbot
|
||
```bash
|
||
sudo apt install nginx certbot python3-certbot-nginx -y
|
||
```
|
||
|
||
### 1.4 Настройка firewall
|
||
```bash
|
||
sudo ufw allow OpenSSH
|
||
sudo ufw allow 'Nginx Full'
|
||
sudo ufw enable
|
||
```
|
||
|
||
## 📦 Шаг 2: Клонирование проекта
|
||
|
||
```bash
|
||
# Создание директории для проекта
|
||
sudo mkdir -p /var/www/smartsoltech.kr
|
||
sudo chown $USER:$USER /var/www/smartsoltech.kr
|
||
|
||
# Клонирование репозитория
|
||
cd /var/www/smartsoltech.kr
|
||
git clone https://github.com/your-username/smartsoltech.kr.git .
|
||
|
||
# Или загрузка через SCP/SFTP
|
||
```
|
||
|
||
## 🔐 Шаг 3: Настройка переменных окружения
|
||
|
||
### 3.1 Создание .env файла
|
||
```bash
|
||
cd /var/www/smartsoltech.kr
|
||
cp .env.example .env
|
||
nano .env
|
||
```
|
||
|
||
### 3.2 Настройка .env для продакшена
|
||
```bash
|
||
# Django Settings
|
||
SECRET_KEY=GENERATE_NEW_SECRET_KEY_HERE_MINIMUM_50_CHARACTERS
|
||
DEBUG=False
|
||
ALLOWED_HOSTS=localhost,127.0.0.1,smartsoltech.kr,www.smartsoltech.kr
|
||
CSRF_TRUSTED_ORIGINS=https://smartsoltech.kr,https://www.smartsoltech.kr
|
||
|
||
# PostgreSQL Database
|
||
POSTGRES_DB=smartsoltech_db
|
||
POSTGRES_USER=smartsoltech_user
|
||
POSTGRES_PASSWORD=STRONG_PASSWORD_HERE
|
||
POSTGRES_HOST=postgres_db
|
||
|
||
# PgAdmin (опционально, можно отключить в проде)
|
||
PGADMIN_DEFAULT_EMAIL=admin@smartsoltech.kr
|
||
PGADMIN_DEFAULT_PASSWORD=ANOTHER_STRONG_PASSWORD
|
||
|
||
# Zabbix Agent
|
||
ZBX_SERVER_HOST=your-zabbix-server-ip
|
||
|
||
# Telegram Bot (настраивается через админку)
|
||
# TELEGRAM_BOT_TOKEN=your-bot-token-from-botfather
|
||
|
||
# Email Settings (настраивается через админку)
|
||
# SMTP_SERVER=smtp.gmail.com
|
||
# SMTP_PORT=587
|
||
# SENDER_EMAIL=your-email@gmail.com
|
||
```
|
||
|
||
### 3.3 Генерация нового SECRET_KEY
|
||
```bash
|
||
# На сервере запустите:
|
||
python3 -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
|
||
```
|
||
|
||
## 🐳 Шаг 4: Настройка Docker Compose для продакшена
|
||
|
||
### 4.1 Создание docker-compose.prod.yml
|
||
```bash
|
||
nano docker-compose.prod.yml
|
||
```
|
||
|
||
```yaml
|
||
version: '3.8'
|
||
|
||
services:
|
||
postgres_db:
|
||
image: postgres:17-alpine
|
||
container_name: postgres_db
|
||
restart: always
|
||
environment:
|
||
POSTGRES_DB: ${POSTGRES_DB}
|
||
POSTGRES_USER: ${POSTGRES_USER}
|
||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||
volumes:
|
||
- postgres_data:/var/lib/postgresql/data
|
||
networks:
|
||
- backend
|
||
healthcheck:
|
||
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"]
|
||
interval: 10s
|
||
timeout: 5s
|
||
retries: 5
|
||
|
||
django_app:
|
||
build: .
|
||
container_name: django_app
|
||
restart: always
|
||
command: >
|
||
sh -c "python manage.py collectstatic --noinput &&
|
||
python manage.py migrate &&
|
||
gunicorn smartsoltech.wsgi:application --bind 0.0.0.0:8000 --workers 4 --timeout 120"
|
||
volumes:
|
||
- static_volume:/app/staticfiles
|
||
- media_volume:/app/media
|
||
environment:
|
||
- SECRET_KEY=${SECRET_KEY}
|
||
- DEBUG=${DEBUG}
|
||
- ALLOWED_HOSTS=${ALLOWED_HOSTS}
|
||
- CSRF_TRUSTED_ORIGINS=${CSRF_TRUSTED_ORIGINS}
|
||
- POSTGRES_DB=${POSTGRES_DB}
|
||
- POSTGRES_USER=${POSTGRES_USER}
|
||
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
|
||
- POSTGRES_HOST=${POSTGRES_HOST}
|
||
depends_on:
|
||
postgres_db:
|
||
condition: service_healthy
|
||
networks:
|
||
- backend
|
||
expose:
|
||
- "8000"
|
||
|
||
telegram_bot:
|
||
build: .
|
||
container_name: telegram_bot
|
||
restart: always
|
||
command: python manage.py run_telegram_bot
|
||
environment:
|
||
- SECRET_KEY=${SECRET_KEY}
|
||
- DEBUG=${DEBUG}
|
||
- POSTGRES_DB=${POSTGRES_DB}
|
||
- POSTGRES_USER=${POSTGRES_USER}
|
||
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
|
||
- POSTGRES_HOST=${POSTGRES_HOST}
|
||
depends_on:
|
||
postgres_db:
|
||
condition: service_healthy
|
||
networks:
|
||
- backend
|
||
|
||
nginx:
|
||
image: nginx:alpine
|
||
container_name: nginx
|
||
restart: always
|
||
ports:
|
||
- "80:80"
|
||
- "443:443"
|
||
volumes:
|
||
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
|
||
- ./nginx/conf.d:/etc/nginx/conf.d:ro
|
||
- static_volume:/var/www/static:ro
|
||
- media_volume:/var/www/media:ro
|
||
- /etc/letsencrypt:/etc/letsencrypt:ro
|
||
- /var/www/certbot:/var/www/certbot:ro
|
||
depends_on:
|
||
- django_app
|
||
networks:
|
||
- backend
|
||
|
||
volumes:
|
||
postgres_data:
|
||
static_volume:
|
||
media_volume:
|
||
|
||
networks:
|
||
backend:
|
||
driver: bridge
|
||
```
|
||
|
||
## 🌐 Шаг 5: Настройка Nginx
|
||
|
||
### 5.1 Создание конфигурации Nginx
|
||
```bash
|
||
mkdir -p nginx/conf.d
|
||
nano nginx/conf.d/smartsoltech.conf
|
||
```
|
||
|
||
```nginx
|
||
# Редирект с www на non-www
|
||
server {
|
||
listen 80;
|
||
listen [::]:80;
|
||
server_name www.smartsoltech.kr;
|
||
return 301 https://smartsoltech.kr$request_uri;
|
||
}
|
||
|
||
# HTTP → HTTPS редирект
|
||
server {
|
||
listen 80;
|
||
listen [::]:80;
|
||
server_name smartsoltech.kr;
|
||
|
||
# Let's Encrypt challenge
|
||
location /.well-known/acme-challenge/ {
|
||
root /var/www/certbot;
|
||
}
|
||
|
||
location / {
|
||
return 301 https://$server_name$request_uri;
|
||
}
|
||
}
|
||
|
||
# HTTPS конфигурация
|
||
server {
|
||
listen 443 ssl http2;
|
||
listen [::]:443 ssl http2;
|
||
server_name smartsoltech.kr;
|
||
|
||
# SSL сертификаты
|
||
ssl_certificate /etc/letsencrypt/live/smartsoltech.kr/fullchain.pem;
|
||
ssl_certificate_key /etc/letsencrypt/live/smartsoltech.kr/privkey.pem;
|
||
ssl_trusted_certificate /etc/letsencrypt/live/smartsoltech.kr/chain.pem;
|
||
|
||
# SSL настройки
|
||
ssl_protocols TLSv1.2 TLSv1.3;
|
||
ssl_ciphers HIGH:!aNULL:!MD5;
|
||
ssl_prefer_server_ciphers on;
|
||
ssl_session_cache shared:SSL:10m;
|
||
ssl_session_timeout 10m;
|
||
|
||
# Security headers
|
||
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
|
||
add_header X-Frame-Options "SAMEORIGIN" always;
|
||
add_header X-Content-Type-Options "nosniff" always;
|
||
add_header X-XSS-Protection "1; mode=block" always;
|
||
|
||
# Максимальный размер загружаемых файлов
|
||
client_max_body_size 100M;
|
||
|
||
# Статические файлы
|
||
location /static/ {
|
||
alias /var/www/static/;
|
||
expires 30d;
|
||
add_header Cache-Control "public, immutable";
|
||
}
|
||
|
||
# Медиа файлы
|
||
location /media/ {
|
||
alias /var/www/media/;
|
||
expires 7d;
|
||
add_header Cache-Control "public";
|
||
}
|
||
|
||
# Django приложение
|
||
location / {
|
||
proxy_pass http://django_app:8000;
|
||
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_redirect off;
|
||
proxy_buffering off;
|
||
}
|
||
|
||
# Логи
|
||
access_log /var/log/nginx/smartsoltech_access.log;
|
||
error_log /var/log/nginx/smartsoltech_error.log;
|
||
}
|
||
```
|
||
|
||
### 5.2 Создание nginx.conf
|
||
```bash
|
||
nano nginx/nginx.conf
|
||
```
|
||
|
||
```nginx
|
||
user nginx;
|
||
worker_processes auto;
|
||
error_log /var/log/nginx/error.log warn;
|
||
pid /var/run/nginx.pid;
|
||
|
||
events {
|
||
worker_connections 1024;
|
||
}
|
||
|
||
http {
|
||
include /etc/nginx/mime.types;
|
||
default_type application/octet-stream;
|
||
|
||
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
||
'$status $body_bytes_sent "$http_referer" '
|
||
'"$http_user_agent" "$http_x_forwarded_for"';
|
||
|
||
access_log /var/log/nginx/access.log main;
|
||
|
||
sendfile on;
|
||
tcp_nopush on;
|
||
keepalive_timeout 65;
|
||
gzip on;
|
||
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
|
||
|
||
include /etc/nginx/conf.d/*.conf;
|
||
}
|
||
```
|
||
|
||
## 🔒 Шаг 6: Получение SSL сертификата
|
||
|
||
### 6.1 Временный запуск для получения сертификата
|
||
```bash
|
||
# Запуск только postgres и django
|
||
docker compose -f docker-compose.prod.yml up -d postgres_db django_app
|
||
|
||
# Ожидание запуска
|
||
sleep 10
|
||
|
||
# Получение сертификата
|
||
sudo certbot certonly --webroot -w /var/www/certbot \
|
||
-d smartsoltech.kr \
|
||
-d www.smartsoltech.kr \
|
||
--email admin@smartsoltech.kr \
|
||
--agree-tos \
|
||
--no-eff-email
|
||
```
|
||
|
||
### 6.2 Настройка автообновления сертификата
|
||
```bash
|
||
# Создание cron задачи
|
||
sudo crontab -e
|
||
|
||
# Добавить строку:
|
||
0 3 * * * certbot renew --quiet --post-hook "docker exec nginx nginx -s reload"
|
||
```
|
||
|
||
## 🚀 Шаг 7: Запуск приложения
|
||
|
||
### 7.1 Сборка и запуск контейнеров
|
||
```bash
|
||
cd /var/www/smartsoltech.kr
|
||
|
||
# Сборка образов
|
||
docker compose -f docker-compose.prod.yml build
|
||
|
||
# Запуск контейнеров
|
||
docker compose -f docker-compose.prod.yml up -d
|
||
|
||
# Проверка статуса
|
||
docker compose -f docker-compose.prod.yml ps
|
||
```
|
||
|
||
### 7.2 Проверка логов
|
||
```bash
|
||
# Логи Django
|
||
docker logs django_app --tail 100 -f
|
||
|
||
# Логи Nginx
|
||
docker logs nginx --tail 100 -f
|
||
|
||
# Логи PostgreSQL
|
||
docker logs postgres_db --tail 100 -f
|
||
```
|
||
|
||
## 👤 Шаг 8: Создание суперпользователя
|
||
|
||
```bash
|
||
docker exec -it django_app python smartsoltech/manage.py createsuperuser
|
||
```
|
||
|
||
## 📊 Шаг 9: Настройка мониторинга (опционально)
|
||
|
||
### 9.1 Zabbix Agent
|
||
```bash
|
||
# Обновить в .env
|
||
ZBX_SERVER_HOST=your-zabbix-server-ip
|
||
|
||
# Перезапустить контейнеры
|
||
docker compose -f docker-compose.prod.yml restart
|
||
```
|
||
|
||
### 9.2 Логирование
|
||
```bash
|
||
# Настройка ротации логов
|
||
sudo nano /etc/logrotate.d/docker-containers
|
||
|
||
# Содержимое:
|
||
/var/lib/docker/containers/*/*.log {
|
||
rotate 7
|
||
daily
|
||
compress
|
||
missingok
|
||
delaycompress
|
||
copytruncate
|
||
}
|
||
```
|
||
|
||
## 🔄 Шаг 10: Обновление приложения
|
||
|
||
### 10.1 Скрипт для обновления
|
||
```bash
|
||
nano /var/www/smartsoltech.kr/update.sh
|
||
chmod +x /var/www/smartsoltech.kr/update.sh
|
||
```
|
||
|
||
```bash
|
||
#!/bin/bash
|
||
set -e
|
||
|
||
echo "🔄 Начало обновления..."
|
||
|
||
# Переход в директорию проекта
|
||
cd /var/www/smartsoltech.kr
|
||
|
||
# Получение последних изменений
|
||
git pull origin master
|
||
|
||
# Остановка контейнеров
|
||
docker compose -f docker-compose.prod.yml down
|
||
|
||
# Пересборка образов
|
||
docker compose -f docker-compose.prod.yml build
|
||
|
||
# Запуск контейнеров
|
||
docker compose -f docker-compose.prod.yml up -d
|
||
|
||
# Ожидание запуска
|
||
sleep 10
|
||
|
||
# Применение миграций
|
||
docker exec django_app python smartsoltech/manage.py migrate
|
||
|
||
# Сборка статики
|
||
docker exec django_app python smartsoltech/manage.py collectstatic --noinput
|
||
|
||
# Проверка статуса
|
||
docker compose -f docker-compose.prod.yml ps
|
||
|
||
echo "✅ Обновление завершено!"
|
||
```
|
||
|
||
### 10.2 Использование
|
||
```bash
|
||
/var/www/smartsoltech.kr/update.sh
|
||
```
|
||
|
||
## 🔍 Проверка работоспособности
|
||
|
||
### Чеклист проверки:
|
||
- [ ] Сайт доступен по https://smartsoltech.kr
|
||
- [ ] SSL сертификат валиден
|
||
- [ ] Редирект с HTTP на HTTPS работает
|
||
- [ ] Редирект с www на non-www работает
|
||
- [ ] Статические файлы загружаются
|
||
- [ ] Админ панель доступна: /admin/
|
||
- [ ] Все страницы открываются без ошибок
|
||
- [ ] Формы отправляются корректно
|
||
- [ ] Telegram бот работает
|
||
- [ ] Email уведомления приходят
|
||
|
||
### Тестирование
|
||
```bash
|
||
# Проверка SSL
|
||
curl -I https://smartsoltech.kr
|
||
|
||
# Проверка редиректов
|
||
curl -I http://smartsoltech.kr
|
||
curl -I http://www.smartsoltech.kr
|
||
|
||
# Проверка страниц
|
||
curl https://smartsoltech.kr/
|
||
curl https://smartsoltech.kr/services/
|
||
curl https://smartsoltech.kr/about/
|
||
curl https://smartsoltech.kr/blog/
|
||
```
|
||
|
||
## 🐛 Устранение неполадок
|
||
|
||
### Проблема: Контейнеры не запускаются
|
||
```bash
|
||
# Проверка логов
|
||
docker compose -f docker-compose.prod.yml logs
|
||
|
||
# Пересоздание контейнеров
|
||
docker compose -f docker-compose.prod.yml down -v
|
||
docker compose -f docker-compose.prod.yml up -d
|
||
```
|
||
|
||
### Проблема: 502 Bad Gateway
|
||
```bash
|
||
# Проверка статуса Django
|
||
docker exec django_app ps aux
|
||
|
||
# Перезапуск Django
|
||
docker compose -f docker-compose.prod.yml restart django_app
|
||
```
|
||
|
||
### Проблема: Статические файлы не загружаются
|
||
```bash
|
||
# Пересборка статики
|
||
docker exec django_app python smartsoltech/manage.py collectstatic --noinput
|
||
|
||
# Проверка прав
|
||
docker exec nginx ls -la /var/www/static/
|
||
```
|
||
|
||
## 📱 Настройка Telegram бота
|
||
|
||
1. Зайти в админ панель: https://smartsoltech.kr/admin/
|
||
2. Перейти в "Настройки коммуникации" → "Telegram settings"
|
||
3. Добавить bot token и bot name
|
||
4. Перезапустить telegram_bot контейнер:
|
||
```bash
|
||
docker compose -f docker-compose.prod.yml restart telegram_bot
|
||
```
|
||
|
||
## 📧 Настройка Email
|
||
|
||
1. Зайти в админ панель: https://smartsoltech.kr/admin/
|
||
2. Перейти в "Настройки коммуникации" → "Email settings"
|
||
3. Заполнить SMTP настройки
|
||
4. Отправить тестовое письмо
|
||
|
||
## 🔐 Безопасность
|
||
|
||
### Рекомендации:
|
||
1. **Регулярно обновляйте систему**:
|
||
```bash
|
||
sudo apt update && sudo apt upgrade
|
||
```
|
||
|
||
2. **Настройте fail2ban**:
|
||
```bash
|
||
sudo apt install fail2ban
|
||
sudo systemctl enable fail2ban
|
||
```
|
||
|
||
3. **Настройте резервное копирование БД**:
|
||
```bash
|
||
# Создать скрипт backup.sh
|
||
#!/bin/bash
|
||
docker exec postgres_db pg_dump -U ${POSTGRES_USER} ${POSTGRES_DB} > /backups/smartsoltech_$(date +%Y%m%d).sql
|
||
|
||
# Добавить в crontab
|
||
0 2 * * * /var/www/smartsoltech.kr/backup.sh
|
||
```
|
||
|
||
4. **Мониторинг логов**:
|
||
```bash
|
||
tail -f /var/log/nginx/smartsoltech_error.log
|
||
docker logs django_app --tail 100 -f
|
||
```
|
||
|
||
## 📊 Производительность
|
||
|
||
### Рекомендуемые настройки сервера:
|
||
- **CPU**: минимум 2 ядра
|
||
- **RAM**: минимум 4GB
|
||
- **Disk**: минимум 40GB SSD
|
||
- **Bandwidth**: минимум 100Mbps
|
||
|
||
### Оптимизация Django:
|
||
- Gunicorn workers: `(2 × CPU cores) + 1`
|
||
- PostgreSQL shared_buffers: `25% от RAM`
|
||
- Nginx worker_connections: `1024`
|
||
|
||
---
|
||
|
||
## 🎉 Готово!
|
||
|
||
Ваш сайт развернут и работает по адресу: **https://smartsoltech.kr**
|
||
|
||
Для получения помощи обратитесь к документации или проверьте логи контейнеров.
|