112 lines
3.9 KiB
Markdown
112 lines
3.9 KiB
Markdown
# 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-скрипты из исторической монорепы (опционально)
|