divan/docker-compose.yml
Anas Rashid 532d005cdb Rename Ganjoor -> Divan throughout the code
Projects (GanjooRazor -> DivanRazor, GanjoorService.sln -> DivanService.sln), files,
folders, classes, namespaces, settings, API routes (/api/divan) and DB tables (Divan*).
External addresses (ganjoor.net, github.com/ganjoor) unchanged. Migrations renamed
consistently (no pending model changes); requires a fresh database.
Upstream RUNNING_LOCALLY/SEMANTIC_SEARCH docs archived unmodified under docs/.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 23:49:01 +02:00

70 lines
2.5 KiB
YAML

# Divan stack: SQL Server + API (RMuseum) + site (DivanRazor) behind Caddy (automatic HTTPS).
# Setup: cp .env.example .env, edit it, then `docker compose up -d --build`. See DIVAN.md.
services:
db:
image: mcr.microsoft.com/mssql/server:2022-latest # x86-64 only
environment:
ACCEPT_EULA: "Y"
MSSQL_PID: Express
MSSQL_SA_PASSWORD: ${MSSQL_SA_PASSWORD:?set in .env}
volumes:
- mssql:/var/opt/mssql
healthcheck:
test: ["CMD-SHELL", "/opt/mssql-tools18/bin/sqlcmd -C -S localhost -U sa -P \"$$MSSQL_SA_PASSWORD\" -Q 'SELECT 1' || exit 1"]
interval: 10s
timeout: 5s
retries: 30
restart: unless-stopped
api:
build: { context: ., args: { PROJECT: RMuseum } }
depends_on: { db: { condition: service_healthy } }
environment:
ConnectionStrings__DefaultConnection: "Server=db;Database=museum;User Id=sa;Password=${MSSQL_SA_PASSWORD};TrustServerCertificate=True;MultipleActiveResultSets=true"
Security__Secret: ${JWT_SECRET:?set in .env}
RSecurityBackend__ApplicationName: Divan
RSecurityBackend__FirstUserEmail: ${ADMIN_EMAIL:?set in .env}
SignUp__Enabled: ${SIGNUP_ENABLED:-False}
WebServiceUrl: https://${API_DOMAIN}
# Linux paths for upstream's Windows defaults
PictureFileService__StoragePath: /data/museum
PictureFileService__TrashStoragePath: /data/museum-trash
AudioUploadService__TempUploadPath: /data/tempaudio
AudioUploadService__LocalAudioRepositoryPath: /data/audio
Divan__SitemapLocation: /data/sitemap.xml
PublicDataExport__LocalWorkingCopyPath: /data/public-export
volumes:
- data:/data
restart: unless-stopped
site:
build: { context: ., args: { PROJECT: DivanRazor } }
depends_on: [api]
environment:
APIRoot: http://api:8080 # server-side calls stay on the docker network
GlobalAPIRoot: https://${API_DOMAIN} # what browsers use
SiteUrl: https://${SITE_DOMAIN}
DataProtectionPersistPath: /data/keys
TrackingScript: "" # upstream's is Divan's analytics
SemanticSearchAPIRoot: "" # upstream's indexes Persian Divan, not Divan
volumes:
- data:/data
restart: unless-stopped
caddy:
image: caddy:2
depends_on: [site, api]
ports: ["80:80", "443:443"]
environment:
SITE_DOMAIN: ${SITE_DOMAIN}
API_DOMAIN: ${API_DOMAIN}
volumes:
- ./deploy/Caddyfile:/etc/caddy/Caddyfile:ro
- caddy:/data
restart: unless-stopped
volumes:
mssql:
data:
caddy: