# Продакшен-развёртывание (docs/deployment.md). Перед первым запуском: sudo ./install.sh # Обновление: ./update.sh name: pipu x-library-ro: &library-ro type: bind source: ${PIPU_DATA:-/srv/pipu}/library target: /library read_only: true bind: { propagation: rslave } x-restart: &restart restart: unless-stopped services: nginx: <<: *restart image: ${REGISTRY}/pipu-music-web:${PIPU_VERSION} ports: ["${HTTP_PORT:-80}:80"] volumes: - *library-ro - ${PIPU_DATA:-/srv/pipu}/cache:/cache:ro - ${PIPU_DATA:-/srv/pipu}/uploads:/uploads:ro depends_on: [api] api: <<: *restart image: ${REGISTRY}/pipu-music-api:${PIPU_VERSION} env_file: .env environment: &db-env DATABASE_URL: postgres://pipu:${POSTGRES_PASSWORD}@postgres:5432/pipu?sslmode=disable volumes: - *library-ro - ${PIPU_DATA:-/srv/pipu}/cache:/cache - ${PIPU_DATA:-/srv/pipu}/updates:/updates - ${PIPU_DATA:-/srv/pipu}/uploads:/uploads depends_on: postgres: { condition: service_healthy } redis: { condition: service_started } storage-agent: { condition: service_started } storage-agent: <<: *restart image: ${REGISTRY}/pipu-music-storage-agent:${PIPU_VERSION} cap_add: [SYS_ADMIN] security_opt: ["apparmor:unconfined"] environment: INTERNAL_TOKEN: ${INTERNAL_TOKEN} LIBRARY_ROOT: /library volumes: - type: bind source: ${PIPU_DATA:-/srv/pipu}/library target: /library bind: { propagation: rshared } - ${PIPU_DATA:-/srv/pipu}/uploads:/uploads:ro recommender: <<: *restart image: ${REGISTRY}/pipu-music-recommender:${PIPU_VERSION} command: ["serve"] env_file: .env environment: *db-env depends_on: postgres: { condition: service_healthy } analyzer: <<: *restart image: ${REGISTRY}/pipu-music-recommender:${PIPU_VERSION} command: ["analyze", "--workers", "4"] env_file: .env environment: *db-env volumes: - *library-ro - ${PIPU_DATA:-/srv/pipu}/models:/models deploy: { resources: { limits: { cpus: "4" } } } depends_on: postgres: { condition: service_healthy } postgres: <<: *restart image: pgvector/pgvector:pg17 environment: POSTGRES_USER: pipu POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: pipu volumes: [ "${PIPU_DATA:-/srv/pipu}/postgres:/var/lib/postgresql/data" ] healthcheck: test: ["CMD-SHELL", "pg_isready -U pipu -d pipu"] interval: 5s retries: 20 redis: <<: *restart image: redis:7-alpine command: ["redis-server", "--appendonly", "yes"] volumes: [ "${PIPU_DATA:-/srv/pipu}/redis:/data" ] meilisearch: <<: *restart image: getmeili/meilisearch:v1.11 environment: MEILI_MASTER_KEY: ${MEILI_MASTER_KEY} MEILI_ENV: production volumes: [ "${PIPU_DATA:-/srv/pipu}/meili:/meili_data" ]