Configuration
All configuration is passed through environment variables set on the container,
either from your compose file or the image defaults. On first start the
entrypoint also copies them into /pds/pds.env, which is what pdsadmin reads.
Image defaults differ from upstream
This image ships a few defaults that differ from the upstream PDS. Most
notably PDS_BLOB_UPLOAD_LIMIT is raised to 50MB, and PDS_INVITE_REQUIRED
is pinned to true so registration stays invite-only.
Why these defaults are baked in
Some values look like duplicates of upstream defaults but are load-bearing. They are set by the image so the PDS behaves correctly out of the box.
PDS_BLOB_UPLOAD_LIMIT: the PDS falls back to5 * 1024 * 1024(5MB) when this is unset. The image's52428800(50MB) is a deliberate override. Remove it and uploads silently drop to 5MB.PDS_DATA_DIRECTORY: structural. When unset, the PDS writes its SQLite databases to the working directory (/app) instead of the/pdsvolume, so data would not persist across restarts. It must stay set.
Required¶
These have no default. The container will not start until each one is set. See Installation for the secret-generation commands.
| Variable | Description |
|---|---|
PDS_HOSTNAME |
Public hostname of the PDS, for example pds.example.com. |
PDS_JWT_SECRET |
Random secret for signing JWTs. openssl rand --hex 16. |
PDS_ADMIN_PASSWORD |
Password for the admin account. openssl rand --hex 16. |
PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX |
64 character hex (256 bit) secp256k1 private key. |
Optional¶
The default column shows the effective value, whether set by the image or applied by the PDS internally. Entries marked None are unset and have no value until you provide one. The full upstream list lives in packages/pds/src/config/env.ts.
| Variable | Default | Description |
|---|---|---|
PDS_INVITE_REQUIRED |
true |
Require an invite code to register. Keep true to block spam signups. |
PDS_HCAPTCHA_SITE_KEY |
None | hCaptcha site key. Enables captcha on registration when set. |
PDS_HCAPTCHA_SECRET_KEY |
None | hCaptcha secret key, paired with the site key. |
PDS_HCAPTCHA_TOKEN_SALT |
None | Salt used when hashing hCaptcha tokens. |
PDS_CONTACT_EMAIL_ADDRESS |
(empty) | Contact email advertised via describeServer. Set to your address. |
PDS_BLOB_UPLOAD_LIMIT |
52428800 |
Max blob upload size in bytes (50MB). The PDS falls back to 5MB when unset. |
PDS_PORT |
3000 |
Port the PDS listens on inside the container. |
EUID |
1000 |
User ID the service runs as. |
EGID |
1000 |
Group ID the service runs as. |
PDS_DATA_DIRECTORY |
/pds |
Data directory inside the container. |
PDS_BLOBSTORE_DISK_LOCATION |
/pds/blocks |
Blob storage location. |
PDS_DID_PLC_URL |
https://plc.directory |
PLC directory service. |
PDS_BSKY_APP_VIEW_URL |
https://api.bsky.app |
AppView service URL. |
PDS_BSKY_APP_VIEW_DID |
did:web:api.bsky.app |
AppView service DID. |
PDS_REPORT_SERVICE_URL |
https://mod.bsky.app |
Moderation report service URL. |
PDS_REPORT_SERVICE_DID |
did:plc:ar7c4by46qjdydhdevvrndac |
Moderation report service DID. |
PDS_CRAWLERS |
https://bsky.network |
Relay crawlers to notify of updates. |
LOG_ENABLED |
true |
Emit logs to stdout. |
PDS_EMAIL_SMTP_URL |
None | SMTP URL and authentication for outbound email. |
PDS_EMAIL_FROM_ADDRESS |
None | From address for outbound email. |
PDS_PRIVACY_POLICY_URL |
None | Privacy policy link advertised via describeServer. |
PDS_TERMS_OF_SERVICE_URL |
None | Terms of service link advertised via describeServer. |
PDS_RATE_LIMITS_ENABLED |
true |
Enable request rate limiting. |
Deprecated: PUID and PGID
Older versions used PUID and PGID. They still work as aliases for
EUID and EGID but print a deprecation notice on start. Use EUID and
EGID.