Removes every wrapper script under deploy/ (up.ps1, up.sh, scripts/*,
zitadel/provision.*) and folds their logic into three one-shot services
in compose.yml, following the pattern already used by seaweedfs-init:
keys-init generates the RS256 stream-ticket key pair
migrate applies the EF Core migrations (backend/Musify.Migrator.Dockerfile)
zitadel-init creates the Musify project + OIDC apps, writes the client
ids back into the active env file
Deploying is now two plain `docker compose` commands, no scripts to run
or chmod:
docker compose -f deploy/compose.yml -f deploy/compose.dev.yml up -d
docker compose -f deploy/compose.yml -f deploy/compose.dev.yml --profile apps up -d --build
(swap compose.dev.yml for compose.prod.yml + --env-file deploy/.env.prod
for production). The first command brings up infra and lets the bootstrap
jobs run to completion; the second builds and starts the apps, which by
then read real OIDC values instead of empty ones — compose interpolates
${VAR} once per invocation, so this can't collapse into a single command
without the apps reading their own config file at container start instead
of via compose env (out of scope here).
Also:
- DatabaseDesignTimeFactory now also reads Database__ConnectionString
from the environment, and DesignSettings.json is optional, so the new
migrate container works without user-secrets or a config file excluded
from the Docker build context by .dockerignore.
- nginx's depends_on no longer lists the apps-profile services: it does
not need them at its own startup (every vhost resolves its upstream at
request time via the embedded Docker resolver), and requiring them made
`compose.prod.yml up -d` (without --profile apps) an invalid project.
- env_get/env_set in zitadel-init strip \r: the mounted env file can have
CRLF line endings on Windows, which otherwise makes an empty-looking
value non-empty to `[ -z ... ]`. .env.example/.env.prod.example are
pinned to LF via .gitattributes for the same reason. Also fixed:
rewriting the bind-mounted env file in place instead of renaming a temp
file over it (rename onto a bind-mounted inode fails with "Resource
busy").
- Removed compose.share.yml and zitadel/.output-share/ — a "temporary"
personal overlay that had leaked a real Zitadel service-account PAT
into git history (committed in 70968b3). That token should be rotated.
- Removed deploy/.tmp/ from .gitignore: nothing mounts or creates it
anymore (it never actually did, either — no compose service referenced
it, only the now-removed up.ps1 did).
Verified end-to-end with Docker: a clean `down -v` + fresh `up -d` +
`--profile apps up -d --build` on the dev stack brings up all four one-shot
jobs successfully and all four apps healthy (api/gateway return 200,
worker starts its consumers with no errors, web-player responds). Also
verified compose.prod.yml starts nginx cleanly with dummy certs and no
apps running, confirming the depends_on fix.
67 lines
2.6 KiB
Bash
67 lines
2.6 KiB
Bash
# Development configuration for deploy/compose.yml + compose.dev.yml.
|
|
# Copy to deploy/.env and adjust. Not versioned.
|
|
#
|
|
# cp deploy/.env.example deploy/.env
|
|
|
|
DOTNET_ENVIRONMENT=Development
|
|
|
|
# --- Public URLs -------------------------------------------------------------
|
|
# How each service is reached from *outside* Docker. `host.docker.internal`
|
|
# resolves to the same address from the browser, from apps running on the host
|
|
# and from inside the containers, which is what makes the OIDC issuer and the
|
|
# presigned S3 URLs valid in both run modes.
|
|
PUBLIC_WEB_URL=http://localhost:3000
|
|
PUBLIC_API_URL=http://localhost:5111
|
|
PUBLIC_STREAM_URL=http://localhost:8081
|
|
PUBLIC_AUTH_URL=http://host.docker.internal:8080
|
|
|
|
# --- PostgreSQL (shared by Musify and Zitadel) -------------------------------
|
|
POSTGRES_USER=postgres
|
|
POSTGRES_PASSWORD=postgres
|
|
POSTGRES_DB=musify_db
|
|
POSTGRES_HOST_PORT=59000
|
|
|
|
# --- Zitadel (OIDC) ----------------------------------------------------------
|
|
# The masterkey MUST be exactly 32 characters. The external domain/port form
|
|
# the token issuer, so they have to match PUBLIC_AUTH_URL. Changing them needs
|
|
# a re-init: docker compose -f deploy/compose.yml -f deploy/compose.dev.yml down -v
|
|
ZITADEL_MASTERKEY=MasterkeyNeedsToHave32Characters
|
|
ZITADEL_EXTERNAL_DOMAIN=host.docker.internal
|
|
ZITADEL_EXTERNAL_PORT=8080
|
|
ZITADEL_EXTERNAL_SECURE=false
|
|
ZITADEL_DATABASE_PASSWORD=zitadel
|
|
# Console login: <username>@zitadel.<external domain>
|
|
ZITADEL_ADMIN_USERNAME=admin
|
|
ZITADEL_ADMIN_PASSWORD=Password1!
|
|
# Allows the OIDC apps to use plain-http redirect URIs (dev only).
|
|
ZITADEL_DEV_MODE=true
|
|
|
|
# OIDC clients: the zitadel-init one-shot service (see compose.yml) fills
|
|
# these in automatically on `docker compose up -d`.
|
|
AUTH_CLIENT_ID=
|
|
WEB_CLIENT_ID=
|
|
WEB_CLIENT_SECRET=
|
|
|
|
# --- RabbitMQ (MassTransit) --------------------------------------------------
|
|
RABBITMQ_DEFAULT_USER=guest
|
|
RABBITMQ_DEFAULT_PASS=guest
|
|
|
|
# --- SeaweedFS (S3) ----------------------------------------------------------
|
|
S3_ACCESS_KEY=admin_access_key
|
|
S3_SECRET_KEY=admin_secret_key
|
|
S3_BUCKET=webapi-storage
|
|
S3_PUBLIC_URL=http://host.docker.internal:8333
|
|
S3_USE_HTTP=true
|
|
|
|
# --- Web player --------------------------------------------------------------
|
|
# Key material for the encrypted session cookie: any long random string.
|
|
SESSION_SECRET=dev-session-secret-change-me-0123456789abcdef
|
|
# Allows the plain-HTTP Zitadel issuer in a production Node build (dev only).
|
|
AUTH_ALLOW_INSECURE_HTTP=true
|
|
|
|
# --- Misc --------------------------------------------------------------------
|
|
AUTH_REQUIRE_HTTPS=false
|
|
PGADMIN_DEFAULT_EMAIL=admin@musify.dev
|
|
PGADMIN_DEFAULT_PASSWORD=admin
|
|
PGADMIN_HOST_PORT=5050
|