Files
shop-server/docs/superpowers/specs/2026-05-14-auto-deploy-design.md
T

96 lines
4.8 KiB
Markdown

# Auto-Deploy для Craftshop
**Дата:** 2026-05-14
**Статус:** Утверждён
## Мотивация
Заменить ручной SSH-деплой (deploy-ssh.sh) на скрипт с автоматическим детектом изменений через git diff. Деплоятся только те компоненты (client/server), которые реально изменились с последнего деплоя. Удалить устаревшие скрипты и документацию.
## Состав репозитория после изменений
### Новые файлы
| Файл | Назначение |
|---|---|
| `scripts/deploy-auto.sh` | Основной скрипт — детект изменений, сборка, деплой |
| `scripts/SERVER_SETUP.md` | Инструкция с командами для первичной настройки LXC от root |
### Изменённые файлы
| Файл | Изменение |
|---|---|
| `.gitignore` | Добавить `.deployed-commit` |
| `README.md` | Убрать ссылки на удалённые doc'и, добавить секцию по деплою |
### Удаляемые файлы
| Файл | Причина |
|---|---|
| `scripts/deploy-ssh.sh` | Заменён на `deploy-auto.sh` |
| `scripts/deploy-ssh.ps1` | Не нужен |
| `scripts/deploy.env.example` | Есть `deploy.env` |
| `scripts/read-deploy-env.ps1` | Не нужен |
| `scripts/register-ssh-key-for-root.ps1` | Разовое действие |
| `scripts/complete-lan-deploy.ps1` | Устарел |
| `scripts/craftshop-remote-lan.env` | Устарел |
| `scripts/server-bootstrap.sh` | Заменён на `SERVER_SETUP.md` |
| `docs/deploy-changes.md` | Неактуально |
| `docs/test-deploy-proxmox.md` | Неактуально |
| `docs/nginx-upload-limit.md` | Неактуально |
## deploy-auto.sh — алгоритм
1. Загрузить `scripts/deploy.env` (без перезаписи уже экспортированных переменных)
2. Прочитать `.deployed-commit` (если нет файла — взять `HEAD~1`)
3. `git diff --name-only <last_commit> HEAD` → определить:
- `changed_client` — есть изменения в `client/`
- `changed_server` — есть изменения в `server/`
- `changed_shared` — есть изменения в `shared/`
4. Если `changed_shared``changed_server=true`, `changed_client=true` (shared используется обоими)
5. Если ни один флаг не true → `echo "nothing to deploy"` → exit 0
6. **Клиент:** `cd client && npm ci && npm run build` → rsync/tar `client/dist/``$DEPLOY_PATH/www/`
7. **Сервер:** rsync/tar `server/` и `shared/``$DEPLOY_PATH/` → remote `npm ci && npx prisma generate && npx prisma migrate deploy` → remote `systemctl restart craftshop-api`
8. Если все шаги успешны → записать `HEAD` в `.deployed-commit`
9. Флаг `--force` — игнорировать diff и деплоить всё
### Интерфейс команд
| Команда | Что делает |
|---|---|
| `./scripts/deploy-auto.sh` | Деплой изменений |
| `./scripts/deploy-auto.sh --force` | Полный деплой всех компонентов |
| `./scripts/deploy-auto.sh --frontend-only` | Только клиент |
| `./scripts/deploy-auto.sh --backend-only` | Только сервер |
### Поддерживаемые конфиги (deploy.env)
Обязательные: `DEPLOY_HOST`, `DEPLOY_PATH`
Опциональные: `DEPLOY_USER` (root), `DEPLOY_SSH_IDENTITY`, `DEPLOY_RESTART_CMD`, `DEPLOY_FRONTEND_DIST`
### Transport
Переиспользуется логика из текущего `deploy-ssh.sh`:
- Linux/macOS → rsync
- Git Bash Windows → tar | ssh (из‑за проблем cwRsync)
## SERVER_SETUP.md — структура
Инструкция с блоками копируемых команд для последовательного выполнения от root:
1. Установка Node.js 22.x (NodeSource)
2. Создание пользователя deploy
3. Создание директорий `/opt/craftshop/{server,www,uploads}`
4. systemd unit `craftshop-api`
5. Установка и настройка nginx (статика + proxy /api + /uploads)
6. NetBird VPN (подключение к сети)
7. Настройка `.env`
8. Запуск сервиса и проверка `GET /health`
## Безопасность
- `prisma migrate deploy` — не сбрасывает БД, только накатывает новые миграции
- `*.db` исключены из rsync
- `.env` и `.dev_env` исключены из rsync
- `.deployed-commit` — локальный файл, добавлен в .gitignore