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