Files
shop-server/docs/superpowers/specs/2026-06-11-split-monorepo-design.md
T
Kirill 93b1624191 вы
2026-06-11 16:50:47 +05:00

3.9 KiB
Raw Blame History

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:

'@shared': path.resolve(projectRoot, '..', 'shop-server', 'shared'),

client/tsconfig.app.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 cinpx prisma generatenpm 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 cinpm testnpm 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-скрипты из исторической монорепы (опционально)