# garage-ware — Docker Compose configuration. # # cp .env.docker.example .env.docker && docker compose up -d # # Note the filename: .env.docker, not .env — a checkout of this repo already # uses .env for local development. # # Only three values really need your attention: GARAGE_ADMIN_URL, # GARAGE_ADMIN_TOKEN and GARAGE_S3_ENDPOINT. Everything else has a working # default, and the container prints a configuration check on startup naming # anything still missing. # --------------------------------------------------------------------------- # Garage admin API — REQUIRED for cluster status, buckets, keys and metrics. # --------------------------------------------------------------------------- # NOTE: this is the ADMIN port (3903 by default), not the S3 port (3900). # Mint a token on a cluster node with: garage admin-token create --name garage-ware GARAGE_ADMIN_URL=http://garage.internal:3903 GARAGE_ADMIN_TOKEN= # --------------------------------------------------------------------------- # Garage S3 gateway — REQUIRED for the in-app file browser and connect page. # --------------------------------------------------------------------------- # The browser signs S3 requests directly against this endpoint using the user's # own credentials, so each bucket must allow CORS from this app's origin # (GET/PUT/HEAD, the authorization/x-amz-*/content-type request headers, ETag # exposed). See docker/README.md for a ready-made CORS document. GARAGE_S3_ENDPOINT=https://s3.example.com GARAGE_S3_REGION=us-east-1 # Set only if you advertise a different URL to users than the CORS-enabled one # the in-app browser talks to. # GARAGE_PUBLIC_S3_ENDPOINT=https://s3.example.com # --------------------------------------------------------------------------- # This deployment's public URL. # --------------------------------------------------------------------------- # Used to build links in outgoing email (storage invites, usage alerts) and in # the setup banner. If unset, those emails are skipped and nothing is sent. # Must match how users actually reach this app, including the host port from # docker-compose.yml (8080 by default). APP_PUBLIC_URL=http://localhost:8080 # --------------------------------------------------------------------------- # Who may create an account. # --------------------------------------------------------------------------- # closed (default) — nobody; admins create every account # invite — only addresses holding a pending storage invite, plus # anyone an admin invites from /admin/users # open — anyone who can reach the sign-up page # While no administrator exists yet, sign-up stays open regardless, so the owner # can create the account they will claim with. Claim promptly. SIGNUP_MODE=closed # --------------------------------------------------------------------------- # Community self-service features (optional). Both default OFF; only `true` # or `1` enables. # --------------------------------------------------------------------------- # Let users claim cluster nodes themselves (proving the full node id) and # release them. Off = admins assign owners; an assigned owner still grants. # FEATURE_NODE_CLAIMS=true # Let users self-claim pre-existing Garage keys (proving the secret) and the # buckets those keys own. Off = admins onboard assets via import. # FEATURE_ASSET_CLAIMS=true # --------------------------------------------------------------------------- # First-run ownership (optional). # --------------------------------------------------------------------------- # By default the container prints a one-time claim token to its logs; you paste # it at /setup after signing up. These two are alternatives to that: # # Auto-promote whoever signs up with this address — but only while there is no # administrator yet, so it is not a standing back door. # # WEAKER THAN THE TOKEN: an address is rarely secret, sign-up is open until the # instance is claimed, and no email verification is required. Anyone who reaches # the app first and guesses the address becomes the administrator. Prefer the # token unless this deployment is unreachable from the public internet. # SETUP_OWNER_EMAIL=you@example.com # # Supply the claim token yourself instead of letting the container mint one # (useful when the token comes from a secret manager). Never written to disk. # SETUP_CLAIM_TOKEN= # --------------------------------------------------------------------------- # PocketBase superuser (optional). # --------------------------------------------------------------------------- # Leave both unset and the container generates a password on first boot, storing # it at /data/pb_superuser.env (mode 0600). Set BOTH to manage them yourself. # Setting only one is a hard error — a half-configured credential is a typo. # POCKETBASE_ADMIN_EMAIL=admin@example.com # POCKETBASE_ADMIN_PASSWORD= # --------------------------------------------------------------------------- # Optional tuning. # --------------------------------------------------------------------------- # Average object size in MB; when set, each bucket gets an object-count cap # derived from its byte quota. Leave unset to apply no object cap. # GARAGE_AVG_OBJECT_SIZE_MB=4 # Days of per-node metrics history to keep. 0 = keep forever. NODE_METRICS_RETENTION_DAYS=90