ci / api (push) Successful in 50s
ci / recommender (push) Successful in 37s
ci / docker (образы собираются — их сервер собирает сам при обновлении) (apps/web/Dockerfile, web, ) (push) Successful in 44s
release / android + release (push) Failing after 53s
ci / contract (сгенерированный код совпадает с openapi.yaml) (push) Successful in 45s
ci / ts (packages + web) (push) Successful in 37s
ci / docker (образы собираются — их сервер собирает сам при обновлении) (services/api/Dockerfile, api, api) (push) Successful in 1m30s
ci / docker (образы собираются — их сервер собирает сам при обновлении) (services/api/Dockerfile, storage-agent, storage-agent) (push) Successful in 52s
ci / docker (образы собираются — их сервер собирает сам при обновлении) (services/recommender/Dockerfile, recommender, ) (push) Successful in 28s
ci / mobile (Metro-бандл Android) (push) Successful in 49s
release / verify (push) Successful in 1m14s
- deploy/compose.yaml: every app service has `build:` (repo root context), local tags pipu-music-<service>:<version> - deploy/update.sh: git fetch → checkout tag (latest release by default, or vX.Y.Z / main) → docker compose build --pull → up -d → prune → /readyz; re-executes from a temp copy because checkout may replace the script - install.sh / .env.example: no REGISTRY, PIPU_VERSION set by update.sh, .env owned by the invoking user - release.yml: drop image publishing; release ships APK + sha256 only - ci.yml: new `docker` job builds all images without push - docs: install guide uses git clone, deployment/ci-cd updated, ADR-013 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
71 lines
2.9 KiB
Markdown
71 lines
2.9 KiB
Markdown
# pipu-music
|
|
|
|
Self-hosted музыкальный сервис: веб и Android-приложение, библиотека на NFS,
|
|
умная бесконечная лента «Моя волна» с учётом вкуса, звучания треков и настроения.
|
|
|
|
- Идея продукта: [docs/IDEA.md](docs/IDEA.md)
|
|
- Документация для разработки: [docs/README.md](docs/README.md)
|
|
- План: [docs/roadmap.md](docs/roadmap.md)
|
|
- Установка сервера на свой домен: [docs/install-guide.md](docs/install-guide.md)
|
|
|
|
## Структура
|
|
|
|
| Путь | Что |
|
|
|---|---|
|
|
| `api/openapi.yaml` | Контракт публичного API — источник истины для сервера и клиентов |
|
|
| `services/api` | Go: публичный API (`cmd/api`) и агент хранилищ (`cmd/storage-agent`) |
|
|
| `services/recommender` | Python: рекомендации (`pipu-rec serve`) и аудиоанализ (`pipu-rec analyze`) |
|
|
| `apps/web` | Веб-клиент (React + Vite) |
|
|
| `apps/mobile` | Android-приложение (React Native + Expo) |
|
|
| `packages/*` | Общий TS-код: `api-client`, `core`, `i18n`, `design-tokens` |
|
|
| `deploy/` | Docker Compose, nginx, скрипты установки и обновления |
|
|
| `tests/fixtures/music` | Генератор тестовой библиотеки (нужен ffmpeg) |
|
|
| `.gitea/workflows` | CI (`ci.yml`) и релиз по тегу (`release.yml`) |
|
|
|
|
## Разработка
|
|
|
|
Нужны: Go 1.24+, Node 22 + pnpm 11, uv, Docker; для Android — JDK 17 и Android SDK.
|
|
|
|
```bash
|
|
pnpm install
|
|
docker compose -f deploy/compose.dev.yaml up -d
|
|
```
|
|
|
|
API (из `services/api`):
|
|
|
|
```bash
|
|
DATABASE_URL="postgres://pipu:pipu@localhost:5432/pipu?sslmode=disable" REDIS_URL="redis://localhost:6379/0" go run ./cmd/api
|
|
```
|
|
|
|
Веб на http://localhost:5173 (проксирует `/api` на `:8080`):
|
|
|
|
```bash
|
|
pnpm --filter @pipu/web dev
|
|
```
|
|
|
|
Проверки — те же, что в CI:
|
|
|
|
```bash
|
|
pnpm typecheck && pnpm test && pnpm i18n:check && pnpm test:scripts
|
|
```
|
|
|
|
```bash
|
|
cd services/api && go vet ./... && go test ./...
|
|
```
|
|
|
|
```bash
|
|
cd services/recommender && uv run ruff check . && uv run mypy pipu_rec && uv run pytest
|
|
```
|
|
|
|
После изменения `api/openapi.yaml` или `packages/design-tokens/tokens.json` перегенерируйте код и закоммитьте результат:
|
|
|
|
```bash
|
|
pnpm generate && (cd services/api && go generate ./...)
|
|
```
|
|
|
|
## Релиз
|
|
|
|
Тег `vX.Y.Z` (или `vX.Y.Z-rc.N`) запускает `.gitea/workflows/release.yml`: проверки → подписанный APK → Gitea Release.
|
|
Docker-образы не публикуются: сервер клонирует репозиторий и собирает их сам (`deploy/update.sh`,
|
|
[docs/install-guide.md](docs/install-guide.md)). Нужные секреты — в шапке workflow и в [docs/ci-cd.md](docs/ci-cd.md).
|