# 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
