# 卫戍协议:盟约 · one command: `docker compose up -d` (docs/DEPLOY.md「Docker」). # The service builds the repository's own Dockerfile and tags the image; no other service is needed. services: stronghold: build: context: . # A) download the art while building (~550 MB, needs internet): uncomment # args: { FETCH_ASSETS: "1" } image: stronghold-protocol restart: unless-stopped ports: - "3000:3000" environment: # Skland (森空岛) account binding: SP_SKLAND=1 turns the module on (docs/skland.md) and SP_SKLAND_DB points its # SQLite credential store at the named volume below. To run without the module, comment out (or delete) both # lines — the server then keeps no account credentials at all and the volume is never written. SP_SKLAND: "1" SP_SKLAND_DB: /app/skland-data/skland.db volumes: # The credential database must survive `docker compose down`, `docker compose up --build` and image rebuilds, so # it lives in a named volume instead of the container's writable layer. A named volume behaves the same on Windows, # macOS and Linux and needs no host path or permission setup; `docker compose down -v` is what deletes it. # The database is a secret: never publish or serve it over HTTP (it is outside every static mount), and back it # up carefully (docs/DEPLOY.md「Docker」). - skland-data:/app/skland-data # B) the host's art instead of the downloaded copy, read-only (prepare it with `node tools/setup.mjs`): uncomment # - ./public/assets:/app/public/assets:ro # One named volume, one runtime database. `docker volume inspect` shows where the host keeps it; it is private to the # container user, so a bind mount (`./skland-data:/app/skland-data`) is only needed to read the file from the host. volumes: skland-data: