Likes and dislikes without a network are kept in a pending_reactions table (last reaction per track wins) and sent when the connection returns, instead of being rolled back. Downloaded track DTOs pick up the new reaction so the offline wave and Downloads reflect it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
pipu-music
Self-hosted музыкальный сервис: веб и Android-приложение, библиотека на NFS, умная бесконечная лента «Моя волна» с учётом вкуса, звучания треков и настроения.
- Идея продукта: docs/IDEA.md
- Документация для разработки: docs/README.md
- План: docs/roadmap.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, docker.yml) и релиз по тегу (release.yml) |
Разработка
Нужны: Go 1.24+, Node 22 + pnpm 11, uv, Docker; для Android — JDK 17 и Android SDK.
pnpm install
docker compose -f deploy/compose.dev.yaml up -d
API (из services/api):
DATABASE_URL="postgres://pipu:pipu@localhost:5432/pipu?sslmode=disable" REDIS_URL="redis://localhost:6379/0" MEILI_URL="http://localhost:7700" MEILI_MASTER_KEY="dev-master-key-change-me" LIBRARY_HOST_ROOT="$PWD/../../tests/fixtures/music/out" X_ACCEL=false CACHE_DIR="$PWD/.cache" go run ./cmd/api
Веб на http://localhost:5173 (проксирует /api на :8080):
pnpm --filter @pipu/web dev
Проверки — те же, что в CI:
pnpm typecheck && pnpm test && pnpm i18n:check && pnpm test:scripts
cd services/api && go vet ./... && go test ./...
cd services/recommender && uv run ruff check . && uv run mypy pipu_rec && uv run pytest
После изменения api/openapi.yaml или packages/design-tokens/tokens.json перегенерируйте код и закоммитьте результат:
pnpm generate && (cd services/api && go generate ./...)
Релиз
Тег vX.Y.Z (или vX.Y.Z-rc.N) запускает .gitea/workflows/release.yml: Gitea Release с заметками → подписанный APK докладывается в него.
Docker-образы не публикуются: сервер клонирует репозиторий и собирает их сам (deploy/update.sh,
docs/install-guide.md). Нужные секреты — в шапке workflow и в docs/ci-cd.md.