prod
This commit is contained in:
600
DEPLOYMENT_GUIDE.md
Normal file
600
DEPLOYMENT_GUIDE.md
Normal file
@@ -0,0 +1,600 @@
|
||||
# 🚀 Руководство по развертыванию 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 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 manage.py migrate
|
||||
|
||||
# Сборка статики
|
||||
docker exec django_app python 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 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**
|
||||
|
||||
Для получения помощи обратитесь к документации или проверьте логи контейнеров.
|
||||
Reference in New Issue
Block a user