forked from
tranquil.farm/tranquil-pds
Our Personal Data Server from scratch!
1[server]
2# Public hostname of the PDS, such as `pds.example.com`.
3#
4# Can also be specified via environment variable `PDS_HOSTNAME`.
5#
6# Required! This value must be specified.
7#hostname =
8
9# Address to bind the HTTP server to.
10#
11# Can also be specified via environment variable `SERVER_HOST`.
12#
13# Default value: "127.0.0.1"
14#host = "127.0.0.1"
15
16# Port to bind the HTTP server to.
17#
18# Can also be specified via environment variable `SERVER_PORT`.
19#
20# Default value: 3000
21#port = 3000
22
23# List of domains for user handles.
24# Defaults to the PDS hostname when not set.
25#
26# Can also be specified via environment variable `PDS_USER_HANDLE_DOMAINS`.
27#user_handle_domains =
28
29# Enable PDS-hosted did:web identities. Hosting did:web requires a
30# long-term commitment to serve DID documents; opt-in only.
31#
32# Can also be specified via environment variable `ENABLE_PDS_HOSTED_DID_WEB`.
33#
34# Default value: false
35#enable_pds_hosted_did_web = false
36
37# When set to true, skip age-assurance birthday prompt for all accounts.
38#
39# Can also be specified via environment variable `PDS_AGE_ASSURANCE_OVERRIDE`.
40#
41# Default value: false
42#age_assurance_override = false
43
44# Require an invite code for new account registration.
45#
46# Can also be specified via environment variable `INVITE_CODE_REQUIRED`.
47#
48# Default value: true
49#invite_code_required = true
50
51# Allow HTTP (non-TLS) proxy requests. Only useful during development.
52#
53# Can also be specified via environment variable `ALLOW_HTTP_PROXY`.
54#
55# Default value: false
56#allow_http_proxy = false
57
58# Disable all rate limiting. Should only be used in testing.
59#
60# Can also be specified via environment variable `DISABLE_RATE_LIMITING`.
61#
62# Default value: false
63#disable_rate_limiting = false
64
65# List of additional banned words for handle validation.
66#
67# Can also be specified via environment variable `PDS_BANNED_WORDS`.
68#banned_words =
69
70# URL to a privacy policy page.
71#
72# Can also be specified via environment variable `PRIVACY_POLICY_URL`.
73#privacy_policy_url =
74
75# URL to terms of service page.
76#
77# Can also be specified via environment variable `TERMS_OF_SERVICE_URL`.
78#terms_of_service_url =
79
80# Operator contact email address.
81#
82# Can also be specified via environment variable `CONTACT_EMAIL`.
83#contact_email =
84
85# Maximum allowed blob size in bytes (default 10 GiB).
86#
87# Can also be specified via environment variable `MAX_BLOB_SIZE`.
88#
89# Default value: 10737418240
90#max_blob_size = 10737418240
91
92# Maximum allowed number of preferences
93#
94# Can also be specified via environment variable `MAX_PREFERENCES_COUNT`.
95#
96# Default value: 1000
97#max_preferences_count = 1000
98
99[frontend]
100# Whether to enable the built in serving of the frontend.
101#
102# Can also be specified via environment variable `FRONTEND_ENABLED`.
103#
104# Default value: true
105#enabled = true
106
107# Directory to serve as the frontend. The oauth_client_metadata.json will have any references to
108# the frontend hostname replaced by the configured frontend hostname.
109#
110# Can also be specified via environment variable `FRONTEND_DIR`.
111#
112# Default value: "/var/lib/tranquil-pds/frontend"
113#dir = "/var/lib/tranquil-pds/frontend"
114
115[database]
116# PostgreSQL connection URL.
117#
118# Can also be specified via environment variable `DATABASE_URL`.
119#
120# Required! This value must be specified.
121#url =
122
123# Maximum number of connections in the pool.
124#
125# Can also be specified via environment variable `DATABASE_MAX_CONNECTIONS`.
126#
127# Default value: 100
128#max_connections = 100
129
130# Minimum number of idle connections kept in the pool.
131#
132# Can also be specified via environment variable `DATABASE_MIN_CONNECTIONS`.
133#
134# Default value: 10
135#min_connections = 10
136
137# Timeout in seconds when acquiring a connection from the pool.
138#
139# Can also be specified via environment variable `DATABASE_ACQUIRE_TIMEOUT_SECS`.
140#
141# Default value: 10
142#acquire_timeout_secs = 10
143
144[secrets]
145# Secret used for signing JWTs. Must be at least 32 characters in
146# production.
147#
148# Can also be specified via environment variable `JWT_SECRET`.
149#jwt_secret =
150
151# Secret used for DPoP proof validation. Must be at least 32 characters
152# in production.
153#
154# Can also be specified via environment variable `DPOP_SECRET`.
155#dpop_secret =
156
157# Master key used for key-encryption and HKDF derivation. Must be at
158# least 32 characters in production.
159#
160# Can also be specified via environment variable `MASTER_KEY`.
161#master_key =
162
163# PLC rotation key (DID key). If not set, user-level keys are used.
164#
165# Can also be specified via environment variable `PLC_ROTATION_KEY`.
166#plc_rotation_key =
167
168# Allow insecure/test secrets. NEVER enable in production.
169#
170# Can also be specified via environment variable `TRANQUIL_PDS_ALLOW_INSECURE_SECRETS`.
171#
172# Default value: false
173#allow_insecure = false
174
175[storage]
176# Storage backend: `filesystem` or `s3`.
177#
178# Can also be specified via environment variable `BLOB_STORAGE_BACKEND`.
179#
180# Default value: "filesystem"
181#backend = "filesystem"
182
183# Path on disk for the filesystem blob backend.
184#
185# Can also be specified via environment variable `BLOB_STORAGE_PATH`.
186#
187# Default value: "/var/lib/tranquil-pds/blobs"
188#path = "/var/lib/tranquil-pds/blobs"
189
190# S3 bucket name for blob storage.
191#
192# Can also be specified via environment variable `S3_BUCKET`.
193#s3_bucket =
194
195# Custom S3 endpoint URL.
196#
197# Can also be specified via environment variable `S3_ENDPOINT`.
198#s3_endpoint =
199
200# Repository backend: `postgres` by default, or `tranquil-store`, our embedded db.
201# tranquil-store is EXPERIMENTAL!!!! RISK OF TOTAL DATA LOSS.
202#
203# Can also be specified via environment variable `REPO_BACKEND`.
204#
205# Default value: "postgres"
206#repo_backend = "postgres"
207
208[tranquil_store]
209# Directory for tranquil-store data: the metastore, eventlog, and blockstore.
210#
211# Can also be specified via environment variable `TRANQUIL_STORE_DATA_DIR`.
212#
213# Default value: "/var/lib/tranquil-pds/store"
214#data_dir = "/var/lib/tranquil-pds/store"
215
216# Fjall block cache size in megabytes. Defaults to 20% of system RAM when unset.
217#
218# Can also be specified via environment variable `TRANQUIL_STORE_MEMORY_BUDGET_MB`.
219#memory_budget_mb =
220
221# Number of handler threads. Defaults to available_parallelism / 2.
222#
223# Can also be specified via environment variable `TRANQUIL_STORE_HANDLER_THREADS`.
224#handler_threads =
225
226# Maximum total bytes of pending (unsynced) eventlog payloads. Appenders block
227# once this budget is exhausted until in-flight events drain via fsync. Set to
228# 0 to disable backpressure. Default: 1 GiB.
229#
230# Can also be specified via environment variable `TRANQUIL_STORE_EVENTLOG_PENDING_BYTES_BUDGET`.
231#
232# Default value: 1073741824
233#eventlog_pending_bytes_budget = 1073741824
234
235# Maximum size of an individual eventlog payload in bytes. Single events
236# larger than this are rejected at append time. Default: 256 MiB.
237#
238# Can also be specified via environment variable `TRANQUIL_STORE_EVENTLOG_MAX_EVENT_PAYLOAD`.
239#
240# Default value: 268435456
241#eventlog_max_event_payload = 268435456
242
243# Maximum size of an individual blockstore data file in bytes. When the
244# active data file reaches this size it is rolled over and becomes
245# eligible for compaction. Default: 256 MiB.
246#
247# Can also be specified via environment variable `TRANQUIL_STORE_MAX_BLOCKSTORE_FILE_SIZE`.
248#
249# Default value: 268435456
250#max_blockstore_file_size = 268435456
251
252# Maximum size of an individual eventlog segment file in bytes. When the
253# active segment reaches this size it is sealed and a new one is created.
254# Safe to change on a running instance. Default: 256 MiB.
255#
256# Can also be specified via environment variable `TRANQUIL_STORE_MAX_EVENTLOG_SEGMENT_SIZE`.
257#
258# Default value: 268435456
259#max_eventlog_segment_size = 268435456
260
261[cache]
262# Cache backend: `ripple` by default, or `valkey`.
263#
264# Can also be specified via environment variable `CACHE_BACKEND`.
265#
266# Default value: "ripple"
267#backend = "ripple"
268
269# Valkey / Redis connection URL. Required when `backend = "valkey"`.
270#
271# Can also be specified via environment variable `VALKEY_URL`.
272#valkey_url =
273
274[cache.ripple]
275# Address to bind the Ripple gossip protocol listener.
276#
277# Can also be specified via environment variable `RIPPLE_BIND`.
278#
279# Default value: "0.0.0.0:0"
280#bind_addr = "0.0.0.0:0"
281
282# List of seed peer addresses.
283#
284# Can also be specified via environment variable `RIPPLE_PEERS`.
285#peers =
286
287# Unique machine identifier. Auto-derived from hostname when not set.
288#
289# Can also be specified via environment variable `RIPPLE_MACHINE_ID`.
290#machine_id =
291
292# Gossip protocol interval in milliseconds.
293#
294# Can also be specified via environment variable `RIPPLE_GOSSIP_INTERVAL_MS`.
295#
296# Default value: 200
297#gossip_interval_ms = 200
298
299# Maximum cache size in megabytes.
300#
301# Can also be specified via environment variable `RIPPLE_CACHE_MAX_MB`.
302#
303# Default value: 256
304#cache_max_mb = 256
305
306[plc]
307# Base URL of the PLC directory.
308#
309# Can also be specified via environment variable `PLC_DIRECTORY_URL`.
310#
311# Default value: "https://plc.directory"
312#directory_url = "https://plc.directory"
313
314# HTTP request timeout in seconds.
315#
316# Can also be specified via environment variable `PLC_TIMEOUT_SECS`.
317#
318# Default value: 10
319#timeout_secs = 10
320
321# TCP connect timeout in seconds.
322#
323# Can also be specified via environment variable `PLC_CONNECT_TIMEOUT_SECS`.
324#
325# Default value: 5
326#connect_timeout_secs = 5
327
328# Seconds to cache DID documents in memory.
329#
330# Can also be specified via environment variable `DID_CACHE_TTL_SECS`.
331#
332# Default value: 300
333#did_cache_ttl_secs = 300
334
335[firehose]
336# Size of the in-memory broadcast buffer for firehose events.
337#
338# Can also be specified via environment variable `FIREHOSE_BUFFER_SIZE`.
339#
340# Default value: 10000
341#buffer_size = 10000
342
343# How many hours of historical events to replay for cursor-based
344# firehose connections.
345#
346# Can also be specified via environment variable `FIREHOSE_BACKFILL_HOURS`.
347#
348# Default value: 72
349#backfill_hours = 72
350
351# Maximum concurrent full-repo exports, eg. getRepo without `since`.
352#
353# Can also be specified via environment variable `MAX_CONCURRENT_REPO_EXPORTS`.
354#
355# Default value: 4
356#max_concurrent_repo_exports = 4
357
358# List of relay / crawler notification URLs.
359#
360# Can also be specified via environment variable `CRAWLERS`.
361#crawlers =
362
363[email]
364# Sender email address. When unset, email sending is disabled.
365#
366# Can also be specified via environment variable `MAIL_FROM_ADDRESS`.
367#from_address =
368
369# Display name used in the `From` header.
370#
371# Can also be specified via environment variable `MAIL_FROM_NAME`.
372#
373# Default value: "Tranquil PDS"
374#from_name = "Tranquil PDS"
375
376# Path to the `sendmail` binary.
377#
378# Can also be specified via environment variable `SENDMAIL_PATH`.
379#
380# Default value: "/usr/sbin/sendmail"
381#sendmail_path = "/usr/sbin/sendmail"
382
383[discord]
384# Discord bot token. When unset, Discord integration is disabled.
385#
386# Can also be specified via environment variable `DISCORD_BOT_TOKEN`.
387#bot_token =
388
389[telegram]
390# Telegram bot token. When unset, Telegram integration is disabled.
391#
392# Can also be specified via environment variable `TELEGRAM_BOT_TOKEN`.
393#bot_token =
394
395# Secret token for incoming webhook verification.
396#
397# Can also be specified via environment variable `TELEGRAM_WEBHOOK_SECRET`.
398#webhook_secret =
399
400[signal]
401# Protocol state is stored in postgres' signal_* tables.
402# Link a device via the admin API before enabling.
403#
404# Can also be specified via environment variable `SIGNAL_ENABLED`.
405#
406# Default value: false
407#enabled = false
408
409[notifications]
410# Polling interval in milliseconds for the comms queue.
411#
412# Can also be specified via environment variable `NOTIFICATION_POLL_INTERVAL_MS`.
413#
414# Default value: 1000
415#poll_interval_ms = 1000
416
417# Number of notifications to process per batch.
418#
419# Can also be specified via environment variable `NOTIFICATION_BATCH_SIZE`.
420#
421# Default value: 100
422#batch_size = 100
423
424[sso]
425[sso.github]
426# Can also be specified via environment variable `SSO_GITHUB_ENABLED`.
427# Default value: false
428#enabled = false
429
430# Can also be specified via environment variable `SSO_GITHUB_CLIENT_ID`.
431#client_id =
432
433# Can also be specified via environment variable `SSO_GITHUB_CLIENT_SECRET`.
434#client_secret =
435
436# Can also be specified via environment variable `SSO_GITHUB_DISPLAY_NAME`.
437#display_name =
438
439[sso.discord]
440# Can also be specified via environment variable `SSO_DISCORD_ENABLED`.
441# Default value: false
442#enabled = false
443
444# Can also be specified via environment variable `SSO_DISCORD_CLIENT_ID`.
445#client_id =
446
447# Can also be specified via environment variable `SSO_DISCORD_CLIENT_SECRET`.
448#client_secret =
449
450# Can also be specified via environment variable `SSO_DISCORD_DISPLAY_NAME`.
451#display_name =
452
453[sso.google]
454# Can also be specified via environment variable `SSO_GOOGLE_ENABLED`.
455# Default value: false
456#enabled = false
457
458# Can also be specified via environment variable `SSO_GOOGLE_CLIENT_ID`.
459#client_id =
460
461# Can also be specified via environment variable `SSO_GOOGLE_CLIENT_SECRET`.
462#client_secret =
463
464# Can also be specified via environment variable `SSO_GOOGLE_DISPLAY_NAME`.
465#display_name =
466
467[sso.gitlab]
468# Can also be specified via environment variable `SSO_GITLAB_ENABLED`.
469# Default value: false
470#enabled = false
471
472# Can also be specified via environment variable `SSO_GITLAB_CLIENT_ID`.
473#client_id =
474
475# Can also be specified via environment variable `SSO_GITLAB_CLIENT_SECRET`.
476#client_secret =
477
478# Can also be specified via environment variable `SSO_GITLAB_ISSUER`.
479#issuer =
480
481# Can also be specified via environment variable `SSO_GITLAB_DISPLAY_NAME`.
482#display_name =
483
484[sso.oidc]
485# Can also be specified via environment variable `SSO_OIDC_ENABLED`.
486# Default value: false
487#enabled = false
488
489# Can also be specified via environment variable `SSO_OIDC_CLIENT_ID`.
490#client_id =
491
492# Can also be specified via environment variable `SSO_OIDC_CLIENT_SECRET`.
493#client_secret =
494
495# Can also be specified via environment variable `SSO_OIDC_ISSUER`.
496#issuer =
497
498# Can also be specified via environment variable `SSO_OIDC_DISPLAY_NAME`.
499#display_name =
500
501[sso.apple]
502# Can also be specified via environment variable `SSO_APPLE_ENABLED`.
503# Default value: false
504#enabled = false
505
506# Can also be specified via environment variable `SSO_APPLE_CLIENT_ID`.
507#client_id =
508
509# Can also be specified via environment variable `SSO_APPLE_TEAM_ID`.
510#team_id =
511
512# Can also be specified via environment variable `SSO_APPLE_KEY_ID`.
513#key_id =
514
515# Can also be specified via environment variable `SSO_APPLE_PRIVATE_KEY`.
516#private_key =
517
518[moderation]
519# External report-handling service URL.
520#
521# Can also be specified via environment variable `REPORT_SERVICE_URL`.
522#report_service_url =
523
524# DID of the external report-handling service.
525#
526# Can also be specified via environment variable `REPORT_SERVICE_DID`.
527#report_service_did =
528
529[import]
530# Whether the PDS accepts repo imports.
531#
532# Can also be specified via environment variable `ACCEPTING_REPO_IMPORTS`.
533#
534# Default value: true
535#accepting = true
536
537# Maximum allowed import archive size in bytes (default 1 GiB).
538#
539# Can also be specified via environment variable `MAX_IMPORT_SIZE`.
540#
541# Default value: 1073741824
542#max_size = 1073741824
543
544# Maximum number of blocks allowed in an import.
545#
546# Can also be specified via environment variable `MAX_IMPORT_BLOCKS`.
547#
548# Default value: 500000
549#max_blocks = 500000
550
551# Skip CAR verification during import. Only for development/debugging.
552#
553# Can also be specified via environment variable `SKIP_IMPORT_VERIFICATION`.
554#
555# Default value: false
556#skip_verification = false
557
558[scheduled]
559# Interval in seconds between scheduled delete checks.
560#
561# Can also be specified via environment variable `SCHEDULED_DELETE_CHECK_INTERVAL_SECS`.
562#
563# Default value: 3600
564#delete_check_interval_secs = 3600
565
566# Interval in seconds between data file compaction scans (tranquil-store only).
567# Set to 0 to disable.
568#
569# Can also be specified via environment variable `COMPACTION_INTERVAL_SECS`.
570#
571# Default value: 3600
572#compaction_interval_secs = 3600
573
574# Liveness ratio threshold below which a data file is compacted (0.0-1.0).
575#
576# Can also be specified via environment variable `COMPACTION_LIVENESS_THRESHOLD`.
577#
578# Default value: 0.7
579#compaction_liveness_threshold = 0.7
580
581# Grace period in milliseconds before a zero-refcount block can be removed by compaction.
582#
583# Can also be specified via environment variable `COMPACTION_GRACE_PERIOD_MS`.
584#
585# Default value: 600000
586#compaction_grace_period_ms = 600000
587
588# Interval in seconds between reachability walk runs (tranquil-store only).
589# Set to 0 to disable. Default: weekly.
590#
591# Can also be specified via environment variable `REACHABILITY_WALK_INTERVAL_SECS`.
592#
593# Default value: 604800
594#reachability_walk_interval_secs = 604800
595
596# Interval in seconds between continuous archival passes (tranquil-store only).
597# Sealed eventlog segments are copied to the archival destination each tick.
598# Set to 0 to disable. Default: 60 seconds.
599#
600# Can also be specified via environment variable `ARCHIVAL_INTERVAL_SECS`.
601#
602# Default value: 60
603#archival_interval_secs = 60
604
605# Archival destination directory for sealed eventlog segments.
606# If unset, archival is disabled.
607#
608# Can also be specified via environment variable `ARCHIVAL_DEST_DIR`.
609#archival_dest_dir =
610
611# Maximum age of events retained in the eventlog before pruning.
612# Per the atproto firehose spec, the relay backfill window only needs
613# to cover "hours or days".
614#
615# Can also be specified via environment variable `EVENT_RETENTION_MAX_AGE_SECS`.
616#
617# Default value: 604800
618#event_retention_max_age_secs = 604800
619
620# Interval in seconds between event retention prune passes.
621# Set to 0 to disable.
622#
623# Can also be specified via environment variable `EVENT_RETENTION_INTERVAL_SECS`.
624#
625# Default value: 3600
626#event_retention_interval_secs = 3600