···66- a PersistentVolume for blob storage
77- the app itself (it's just a container with some env vars)
8899-See [configuration.md](configuration.md) for what each env var does and why the secret ones matter. This guide covers the Kubernetes-specific wiring.
99+See `example.toml` for what each config option does and why the secret ones matter. This guide covers the Kubernetes-specific wiring.
10101111-Simply, the container image expects:
1111+Minimally, the container image expects:
1212- A TOML config file mounted at `/etc/tranquil-pds/config.toml` (or passed via `--config`)
1313- `DATABASE_URL` - postgres connection string
1414- `BLOB_STORAGE_PATH` - path to blob storage (mount a PV here)
···20202121## TLS and DNS
22222323-You need a wildcard TLS certificate covering `*.your-pds-hostname.example.com` — user handles resolve as subdomains, so every user's handle requires a matching cert SAN.
2323+You need a wildcard TLS certificate covering `*.your-pds-hostname.example.com` - user handles resolve as subdomains, so every user's handle requires a matching cert SAN.
24242525An approach using Cert Manager would look something like this:
2626···226226227227## Custom homepage
228228229229-Mount a ConfigMap with your `homepage.html` into the container's frontend directory and it becomes your landing page. The account dashboard lives at `/app/` so you won't displace it.
229229+Mount a ConfigMap with your `homepage.html` into the container's frontend directory and it becomes your landing page. Go nuts with it. Account dashboard is at `/app/` so you won't break anything.
230230+230231231232```yaml
232233apiVersion: v1
+28-4
example.toml
···11+# Configuration is loaded in this order:
22+#
33+# 1. Environment variables (highest priority, always win)
44+# 2. A custom config file, either passed with --config or the file
55+# referenced in the TRANQUIL_PDS_CONFIG environment variable
66+# 3. /etc/tranquil-pds/config.toml (always loaded as a base, even when
77+# a custom config path is specified)
88+#
99+# Useful commands:
1010+# tranquil-pds validate - validate your config without starting
1111+# tranquil-pds config-template - generate a commented example.toml
1212+113[server]
214# Public hostname of the PDS, such as `pds.example.com`.
315#
···142154#acquire_timeout_secs = 10
143155144156[secrets]
145145-# Secret used for signing JWTs. Must be at least 32 characters in
157157+# Secret used for signing session JWTs. Must be at least 32 characters in
146158# production.
147159#
148160# Can also be specified via environment variable `JWT_SECRET`.
···355367# Default value: 4
356368#max_concurrent_repo_exports = 4
357369358358-# List of relay / crawler notification URLs.
370370+# List of relay / crawler notification URLs. Notified when new events are
371371+# committed to an account's repo.
372372+#
373373+# Defaults to [ "https://bsky.network" ] when unset.
359374#
360375# Can also be specified via environment variable `CRAWLERS`.
361376#crawlers =
362377363378[email]
364364-# Sender email address. When unset, email sending is disabled.
379379+# Sender email address. When unset, email sending is disabled entirely.
380380+#
381381+# Email is fully optional. However, at least one comms method (email,
382382+# Discord, Telegram, or Signal) must be configured for account
383383+# verification, password resets, and 2FA backup codes to work.
365384#
366385# Can also be specified via environment variable `MAIL_FROM_ADDRESS`.
367386#from_address =
···469488#require_tls = false
470489471490[email.dkim]
472472-# DKIM selector. When unset, outgoing mail is not signed.
491491+# DKIM signing configuration.
492492+#
493493+# The corresponding DNS TXT record at <selector>._domainkey.<domain> must
494494+# be published before mail is sent.
495495+#
496496+# DKIM selector. When unset, outgoing mail is not DKIM-signed.
473497#
474498# Can also be specified via environment variable `MAIL_DKIM_SELECTOR`.
475499#selector =