# 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=divan;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} Cors__AllowedOrigins: https://${SITE_DOMAIN} # only the site may call the API from browsers 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: