architect/_archive/2025-11-26-cleanup/cifra/domains/04_deployment/docs/guide.md

DEPLOY MODE — Режим деплоя

Версия: 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 (опционально)

Шаги:

  1. Подготовка кода:
    ```bash
    # На control server
    cd /opt/claude-workspace/projects/{project}/solution/mvp/

# Проверка
python -m pytest tests/
git status
```

  1. Создать Docker конфигурацию:

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
```

  1. Упаковать приложение:
    bash tar -czf /tmp/{project}.tar.gz .

  2. Загрузить на сервер:
    bash scp /tmp/{project}.tar.gz root@{server}:/opt/{project}/ ssh root@{server} "cd /opt/{project} && tar -xzf {project}.tar.gz"

  3. Запустить на сервере:
    bash ssh root@{server} << 'EOF' cd /opt/{project} docker-compose up -d EOF

  4. Проверить статус:
    bash ssh root@{server} "docker ps | grep {project}" ssh root@{server} "curl -I http://localhost:{port}"

  5. Настроить 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

  1. Настроить SSL (если нужен HTTPS):
    bash certbot --nginx -d {domain}

  2. Обновить документацию:

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"
```

  1. Git commit:
    bash git add infrastructure/ git add docker-compose.yml Dockerfile git commit -m "deploy: настроен деплой {project} на {server}"

Выход:
- Приложение работает на сервере
- Документация обновлена
- Rollback план готов


ПРОЦЕДУРА: Обновление существующего приложения

Шаги:

  1. 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

  2. Загрузить новую версию:
    bash cd /opt/claude-workspace/projects/{project}/solution/mvp/ tar -czf /tmp/{project}.tar.gz . scp /tmp/{project}.tar.gz root@{server}:/opt/{project}/

  3. Развернуть:
    bash ssh root@{server} << 'EOF' cd /opt/{project} tar -xzf {project}.tar.gz docker-compose up -d --build EOF

  4. Проверить:
    bash ssh root@{server} "docker ps | grep {project}" ssh root@{server} "docker logs {project}_app --tail 50" curl -I https://{domain}

  5. Если ошибка → 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 и восстановление

Создание 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

БЕЗОПАСНОСТЬ

⚠️ ПРАВИЛА ДЛЯ PRODUCTION:

  1. ВСЕГДА делать backup перед изменениями
  2. ВСЕГДА тестировать на staging
  3. НИКОГДА не удалять production сервисы без подтверждения
  4. НИКОГДА не делать 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}

РАБОТА С НЕСКОЛЬКИМИ ОКРУЖЕНИЯМИ

Development (локально)

# 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

Staging (тестовый сервер)

# 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

Production (production сервер)

# 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

TROUBLESHOOTING

Проблема: Контейнер не запускается

Диагностика:

docker ps -a | grep {project}
docker logs {project}_app
docker inspect {project}_app

Решение:
- Проверить логи на ошибки
- Проверить порты (может быть занят)
- Проверить volumes
- Пересобрать образ: docker-compose up -d --build


Проблема: 502 Bad Gateway (Nginx)

Диагностика:

tail /var/log/nginx/error.log
docker logs {project}_app
curl http://localhost:{port}

Решение:
- Проверить что контейнер запущен
- Проверить порт в nginx конфиге
- Проверить что приложение слушает правильный порт


Проблема: SSL сертификат истёк

Диагностика:

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)