# Split monorepo into shop-server & shop-client > Дата: 2026-06-11 ## Цель Разделить монорепу `shop_deploy` на два независимых git-репозитория, размещённых на Gitea (192.168.1.110:3000), с автоматическим деплоем через Gitea CI/CD. ## Репозитории ### shop-server **URL:** `http://192.168.1.110:3000/admin/shop-server.git` **Содержимое:** ``` .gitignore README.md AGENTS.md .gitea/workflows/deploy.yml server/ # Fastify + Prisma backend shared/ # Каноничное место shared/constants/ scripts/ backup-db.sh craftshop-backup.service craftshop-backup.timer SERVER_SETUP.md ``` ### shop-client **URL:** `http://192.168.1.110:3000/admin/shop-client.git` **Содержимое:** ``` .gitignore README.md AGENTS.md .gitea/workflows/deploy.yml client/ # React + Vite frontend ``` **Не переносятся** в новые репо: `.cursor/`, `.opencode/`, `.agents/`, `REFACTORING_PLAN.md`, `skills-lock.json`, `node_modules/`, `docs/`, `.superpowers/` — остаются в исторической монорепе. ## Доступ к shared/ `shared/` живёт в **shop-server** как каноничный источник. ### shop-client: alias на shared/ `client/vite.config.ts`: ```ts '@shared': path.resolve(projectRoot, '..', 'shop-server', 'shared'), ``` `client/tsconfig.app.json`: ```json "@shared/*": ["../../shop-server/shared/*"] ``` Это работает при условии, что оба репо клонированы рядом: ``` ~/projects/ shop-server/ server/ shared/ shop-client/ client/ ``` В CI Gitea делает checkout обоих репо в одной workspace. ### shop-server Изменений не требуется — `shared/` уже внутри репо. Сервер импортирует `shared/` через относительные пути (`../../shared/...`). ## CI/CD (Gitea Actions) Runner: self-hosted на машине, где работает приложение (192.168.1.88 или аналог). Триггер: push в `main`. ### shop-server CI (.gitea/workflows/deploy.yml) 1. `actions/checkout` shop-server 2. `npm ci` → `npx prisma generate` → `npm test` 3. Rsync `server/` → `/opt/craftshop/server/` (исключая node_modules, uploads, .env, *.db) 4. Rsync `shared/` → `/opt/craftshop/shared/` 5. `npx prisma migrate deploy` на сервере 6. `systemctl restart craftshop-api` ### shop-client CI (.gitea/workflows/deploy.yml) 1. `actions/checkout` shop-client 2. `actions/checkout` shop-server в `../shop-server/` 3. `npm ci` → `npm test` → `npm run build` 4. Rsync `client/dist/` → `/opt/craftshop/www/` ## Что удаляется - `deploy-auto.sh` — заменён Gitea CI - `.deployed-commit` — отслеживание заменено на push-триггер - `scripts/deploy.env` — не нужен (CI конфигурируется в Gitea) - `scripts/craftshop-netbird.conf` — nginx настраивается один раз по `SERVER_SETUP.md` ## Этапы реализации 1. Создать пустые репо в Gitea 2. Инициализировать shop-server: скопировать server/, shared/, scripts/ в чистый git-репо, сделать init-коммит, запушить 3. Инициализировать shop-client: скопировать client/ в чистый git-репо, поправить alias на shared/, сделать init-коммит, запушить 4. Настроить self-hosted runner на целевой машине 5. Создать `.gitea/workflows/deploy.yml` в каждом репо 6. Проверить деплой через push 7. Удалить deploy-скрипты из исторической монорепы (опционально)