This commit is contained in:
2025-11-24 11:31:29 +09:00
parent ce7119e9e9
commit 1da6180658
30 changed files with 4352 additions and 272 deletions

600
DEPLOYMENT_GUIDE.md Normal file
View 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**
Для получения помощи обратитесь к документации или проверьте логи контейнеров.