760b4a7c6c
#321 — `minstrel admin reset-password [-user admin] [-password X]`: loads config, updates BOTH password_hash (bcrypt) and subsonic_password (plaintext, for Subsonic t+s) so neither auth path is left stale; generates+prints a strong password when -password is omitted. Recovers a locked-out operator without DB surgery. Subcommand dispatch added to main.go (os.Args switch before flag-parse; server path untouched) plus a `minstrel migrate` subcommand exposing db.Migrate standalone. #339 — integration tests no longer truncate the dev DB: - deploy/initdb creates minstrel_test on a fresh compose volume; `make test-integration` ensures it idempotently and points MINSTREL_TEST_DATABASE_URL at minstrel_test. - docker-compose.yml + README updated. CI integration job (test-go.yml): the prior workflow only ran `go test -short -race` with no DB, so the entire integration suite silently t.Skip'd — "CI green" never covered API/db/scanner. New `integration` job runs the full `go test -race` against an ephemeral Postgres service, using the act_runner shared-daemon pattern: no published ports, discover the service container by job-name filter via the docker socket, reach it by bridge IP, hard exactly-one assertion + dev-compose-name reject (a wrong target would truncate real data), TCP-wait, `minstrel migrate`, then test. Fast `test` job kept as the quick gate. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
67 lines
2.0 KiB
YAML
67 lines
2.0 KiB
YAML
version: "3.9"
|
|
|
|
# Local development environment for Minstrel.
|
|
#
|
|
# Integration tests run against a SEPARATE database (minstrel_test) so a
|
|
# test run never truncates the dev `minstrel` DB (Fable #339). Use the
|
|
# Makefile target, which ensures the test DB exists then points the
|
|
# tests at it:
|
|
# make test-integration
|
|
# (CI runs the same suite against its own ephemeral Postgres service —
|
|
# see .forgejo/workflows/test-go.yml.)
|
|
#
|
|
# Full stack (server + db):
|
|
# docker compose up --build
|
|
|
|
services:
|
|
postgres:
|
|
image: postgres:16-alpine
|
|
environment:
|
|
POSTGRES_USER: minstrel
|
|
POSTGRES_PASSWORD: minstrel
|
|
POSTGRES_DB: minstrel
|
|
networks:
|
|
- minstrel
|
|
# ports:
|
|
# - "5432:5432"
|
|
volumes:
|
|
- minstrel-pgdata:/var/lib/postgresql/data
|
|
# Creates minstrel_test on a fresh volume (Fable #339). No-op on
|
|
# an existing volume — make test-integration ensures it instead.
|
|
- ./deploy/initdb:/docker-entrypoint-initdb.d:ro
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "pg_isready -U minstrel -d minstrel"]
|
|
interval: 5s
|
|
timeout: 5s
|
|
retries: 10
|
|
|
|
minstrel:
|
|
build: .
|
|
depends_on:
|
|
postgres:
|
|
condition: service_healthy
|
|
environment:
|
|
MINSTREL_DATABASE_URL: postgres://minstrel:minstrel@postgres:5432/minstrel?sslmode=disable
|
|
MINSTREL_LOG_FORMAT: text
|
|
MINSTREL_LIBRARY_SCAN_PATHS: /music
|
|
MINSTREL_LIBRARY_SCAN_ON_STARTUP: "true"
|
|
MINSTREL_STORAGE_DATA_DIR: /app/data
|
|
networks:
|
|
- minstrel
|
|
ports:
|
|
- "4533:4533"
|
|
volumes:
|
|
# Point ./music at your test library (symlink, bind-mount, whatever).
|
|
# Read-only so a buggy scanner can't rewrite your files.
|
|
- /mnt/Media/Music:/music:ro
|
|
# Cached artifacts: playlist cover collages, artist art, album-cover
|
|
# fallbacks (when the music dir is RO). Persists across container
|
|
# recreates so the operator doesn't redownload art on every up/down.
|
|
- minstrel-data:/app/data
|
|
|
|
volumes:
|
|
minstrel-pgdata:
|
|
minstrel-data:
|
|
|
|
networks:
|
|
minstrel: |