Версия: 1.0
Дата создания: 2025-11-10
Режим для работы с инфраструктурой и развёртыванием приложений.
Когда использовать:
- Деплой приложения на сервер
- Настройка Docker
- Работа с Nginx/reverse proxy
- SSL сертификаты
- Мониторинг и логи
- Backup и восстановление
Инфраструктура:
- Настройка серверов
- Docker compose / Docker swarm
- Nginx конфигурация
- SSL через certbot
- Firewall (ufw)
- Systemd services
Деплой:
- Загрузка кода на сервер
- Сборка Docker образов
- Запуск контейнеров
- Обновление сервисов
- Rollback при ошибках
Мониторинг:
- Проверка статуса сервисов
- Логи (docker logs, journalctl)
- Метрики (CPU, RAM, disk)
- Health checks
PRODUCTION сервисы:
- ВСЕГДА делать backup перед изменениями
- ВСЕГДА иметь rollback план
- ВСЕГДА проверять на staging
- НИКОГДА не останавливать без подтверждения
Вход:
- project_name
- server (IP или hostname)
- port
- domain (опционально)
Шаги:
# Проверка
python -m pytest tests/
git status
```
Dockerfile:
```dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8501
CMD ["streamlit", "run", "app.py", "--server.port=8501", "--server.address=0.0.0.0"]
```
docker-compose.yml:
```yaml
version: '3.8'
services:
app:
build: .
container_name: {project}_app
ports:
- "{port}:8501"
environment:
- DATABASE_URL=sqlite:///data/app.db
volumes:
- ./data:/app/data
restart: unless-stopped
```
Упаковать приложение:
bash
tar -czf /tmp/{project}.tar.gz .
Загрузить на сервер:
bash
scp /tmp/{project}.tar.gz root@{server}:/opt/{project}/
ssh root@{server} "cd /opt/{project} && tar -xzf {project}.tar.gz"
Запустить на сервере:
bash
ssh root@{server} << 'EOF'
cd /opt/{project}
docker-compose up -d
EOF
Проверить статус:
bash
ssh root@{server} "docker ps | grep {project}"
ssh root@{server} "curl -I http://localhost:{port}"
Настроить Nginx (если нужен домен):
Создать /etc/nginx/sites-available/{project}:
```nginx
server {
listen 80;
server_name {domain};
location / {
proxy_pass http://localhost:{port};
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;
}
}
```
Включить:
bash
ln -s /etc/nginx/sites-available/{project} /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx
Настроить SSL (если нужен HTTPS):
bash
certbot --nginx -d {domain}
Обновить документацию:
infrastructure/DEPLOYMENT.md:
```markdown
# Deployment: {project}
## Дата первого деплоя
2025-11-10
## Сервер
- IP: {server}
- Domain: {domain}
- Port: {port}
## Как задеплоить обновление
bash
cd /opt/claude-workspace/projects/{project}/solution/mvp/
tar -czf /tmp/{project}.tar.gz .
scp /tmp/{project}.tar.gz root@{server}:/opt/{project}/
ssh root@{server} "cd /opt/{project} && docker-compose down && tar -xzf {project}.tar.gz && docker-compose up -d"
## Rollback
bash
ssh root@{server} "cd /opt/{project} && git checkout HEAD~1 && docker-compose restart"
```
bash
git add infrastructure/
git add docker-compose.yml Dockerfile
git commit -m "deploy: настроен деплой {project} на {server}"Выход:
- Приложение работает на сервере
- Документация обновлена
- Rollback план готов
Шаги:
Backup текущей версии:
bash
ssh root@{server} << 'EOF'
cd /opt/{project}
docker-compose down
tar -czf backup-$(date +%Y%m%d-%H%M%S).tar.gz .
mv backup-*.tar.gz ../backups/
EOF
Загрузить новую версию:
bash
cd /opt/claude-workspace/projects/{project}/solution/mvp/
tar -czf /tmp/{project}.tar.gz .
scp /tmp/{project}.tar.gz root@{server}:/opt/{project}/
Развернуть:
bash
ssh root@{server} << 'EOF'
cd /opt/{project}
tar -xzf {project}.tar.gz
docker-compose up -d --build
EOF
Проверить:
bash
ssh root@{server} "docker ps | grep {project}"
ssh root@{server} "docker logs {project}_app --tail 50"
curl -I https://{domain}
Если ошибка → Rollback:
bash
ssh root@{server} << 'EOF'
cd /opt/{project}
docker-compose down
tar -xzf ../backups/backup-TIMESTAMP.tar.gz
docker-compose up -d
EOF
Проверка статуса:
# Docker контейнеры
ssh root@{server} "docker ps -a | grep {project}"
# Логи
ssh root@{server} "docker logs {project}_app --tail 100 --follow"
# Ресурсы
ssh root@{server} "docker stats {project}_app --no-stream"
# HTTP доступность
curl -I https://{domain}
# SSL сертификат
ssh root@{server} "certbot certificates | grep {domain}"
Health check script:
infrastructure/scripts/health_check.sh:
#!/bin/bash
SERVER="root@{server}"
PROJECT="{project}"
DOMAIN="{domain}"
echo "=== Health Check: $PROJECT ==="
# 1. Контейнер запущен?
echo "1. Container status:"
ssh $SERVER "docker ps | grep $PROJECT" || echo "❌ Container not running"
# 2. Порт отвечает?
echo "2. Port check:"
ssh $SERVER "curl -f http://localhost:{port} > /dev/null 2>&1" && echo "✅ Port OK" || echo "❌ Port not responding"
# 3. Domain доступен?
echo "3. Domain check:"
curl -f -I https://$DOMAIN > /dev/null 2>&1 && echo "✅ Domain OK" || echo "❌ Domain not accessible"
# 4. SSL валиден?
echo "4. SSL check:"
ssl_expiry=$(ssh $SERVER "certbot certificates | grep -A 2 $DOMAIN | grep 'Expiry Date'")
echo "$ssl_expiry"
# 5. Ресурсы
echo "5. Resources:"
ssh $SERVER "docker stats $PROJECT --no-stream"
echo "=== End Health Check ==="
Просмотр логов:
# Docker контейнер
ssh root@{server} "docker logs {project}_app --tail 100"
# Следить за логами
ssh root@{server} "docker logs {project}_app --follow"
# Поиск ошибок
ssh root@{server} "docker logs {project}_app 2>&1 | grep -i error"
# Nginx логи
ssh root@{server} "tail -f /var/log/nginx/access.log"
ssh root@{server} "tail -f /var/log/nginx/error.log"
# Systemd сервисы
ssh root@{server} "journalctl -u docker -n 100"
Сохранение логов:
# Экспорт логов для анализа
ssh root@{server} "docker logs {project}_app --since 24h > /tmp/{project}_logs.txt"
scp root@{server}:/tmp/{project}_logs.txt ./logs/
Создание backup:
ssh root@{server} << 'EOF'
cd /opt/{project}
# 1. Остановить сервис
docker-compose down
# 2. Backup файлов
tar -czf backup-$(date +%Y%m%d-%H%M%S).tar.gz \
--exclude='*.tar.gz' \
--exclude='__pycache__' \
.
# 3. Backup БД (если есть)
docker run --rm \
-v {project}_db:/source \
-v $(pwd):/backup \
alpine tar -czf /backup/db-$(date +%Y%m%d-%H%M%S).tar.gz -C /source .
# 4. Переместить в backup папку
mv backup-*.tar.gz ../backups/
mv db-*.tar.gz ../backups/
# 5. Запустить обратно
docker-compose up -d
echo "✅ Backup completed"
EOF
Восстановление:
ssh root@{server} << 'EOF'
cd /opt/{project}
# 1. Остановить
docker-compose down
# 2. Восстановить файлы
tar -xzf ../backups/backup-TIMESTAMP.tar.gz
# 3. Восстановить БД (если есть)
docker run --rm \
-v {project}_db:/target \
-v $(pwd):/backup \
alpine sh -c "cd /target && tar -xzf /backup/db-TIMESTAMP.tar.gz"
# 4. Запустить
docker-compose up -d
echo "✅ Restore completed"
EOF
Автоматический backup (cron):
# Добавить в crontab на сервере
0 2 * * * cd /opt/{project} && /opt/{project}/backup.sh
docker system prune на production# ❌ ОПАСНО
docker stop $(docker ps -aq)
docker system prune -a
rm -rf /opt/
systemctl stop docker
reboot
# ❌ ОЧЕНЬ ОПАСНО для seller1.ru
docker service rm seller1-*
docker stack rm seller1-prod-stack
# ✅ OK
docker ps
docker logs {container}
docker stats
systemctl status docker
curl -I http://localhost:{port}
# docker-compose.dev.yml
services:
app:
build: .
environment:
- ENV=development
- DEBUG=true
volumes:
- .:/app # Hot reload
ports:
- "8501:8501"
Запуск:
docker-compose -f docker-compose.dev.yml up
# docker-compose.staging.yml
services:
app:
image: {registry}/{project}:staging
environment:
- ENV=staging
- DEBUG=false
restart: unless-stopped
Деплой:
docker-compose -f docker-compose.staging.yml up -d
# docker-compose.prod.yml
services:
app:
image: {registry}/{project}:latest
environment:
- ENV=production
- DEBUG=false
restart: always
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
Деплой (с осторожностью!):
docker-compose -f docker-compose.prod.yml up -d
Диагностика:
docker ps -a | grep {project}
docker logs {project}_app
docker inspect {project}_app
Решение:
- Проверить логи на ошибки
- Проверить порты (может быть занят)
- Проверить volumes
- Пересобрать образ: docker-compose up -d --build
Диагностика:
tail /var/log/nginx/error.log
docker logs {project}_app
curl http://localhost:{port}
Решение:
- Проверить что контейнер запущен
- Проверить порт в nginx конфиге
- Проверить что приложение слушает правильный порт
Диагностика:
certbot certificates
Решение:
certbot renew
systemctl reload nginx
scope: project
mode: deploy
loaded_files:
- infrastructure/DEPLOYMENT.md
- docker-compose.yml
- Dockerfile
- .env.production
cascade_enabled: true
registry_enabled: true
actions_allowed:
- read_docs: true
- write_docs: true
- read_code: true
- write_infrastructure: true
- run_commands: true
- ssh_access: true
- deploy: true
safety:
production_check: true # Спрашивать подтверждение для production
backup_required: true # Требовать backup перед изменениями
rollback_plan: true # Требовать rollback план
journaling: true
Перед деплоем на production:
После деплоя:
Текущий режим: Deploy Mode
Фокус: Инфраструктура и деплой
Safety: Enabled (production checks)