···3030# Security Secrets
3131# =============================================================================
3232# These MUST be set in production (minimum 32 characters each)
3333-# In development, set BSPDS_ALLOW_INSECURE_SECRETS=1 to use defaults
3333+# In development, set TRANQUIL_PDS_ALLOW_INSECURE_SECRETS=1 to use defaults
3434# Server-wide secret for OAuth token signing (HS256)
3535# JWT_SECRET=your-secure-random-string-at-least-32-chars
3636# Secret for DPoP proof validation
···3838# Key for encrypting user signing keys at rest (AES-256-GCM)
3939# MASTER_KEY=your-secure-random-string-at-least-32-chars
4040# Set this ONLY in development to allow default/weak secrets
4141-# BSPDS_ALLOW_INSECURE_SECRETS=1
4141+# TRANQUIL_PDS_ALLOW_INSECURE_SECRETS=1
4242# =============================================================================
4343# PLC Directory
4444# =============================================================================
···11-# BSPDS
11+# Tranquil PDS
2233A production-grade Personal Data Server (PDS) for the AT Protocol. Drop-in replacement for Bluesky's reference PDS, written in rust with postgres and s3-compatible blob storage.
44
···11-# BSPDS Production Installation on Alpine Linux
11+# Tranquil PDS Production Installation on Alpine Linux
22> **Warning**: These instructions are untested and theoretical, written from the top of Lewis' head. They may contain errors or omissions. This warning will be removed once the guide has been verified.
3344-This guide covers installing BSPDS on Alpine Linux 3.23 (current stable as of December 2025).
44+This guide covers installing Tranquil PDS on Alpine Linux 3.23.
5566## Prerequisites
77- A VPS with at least 2GB RAM and 20GB disk
···2020source ~/.cargo/env
2121rustup default stable
2222```
2323-This installs the latest stable Rust (1.92+ as of December 2025). Alpine 3.23 also ships Rust 1.91 via `apk add rust cargo` if you prefer system packages.
2323+This installs the latest stable Rust. Alpine also ships Rust via `apk add rust cargo` if you prefer system packages.
2424## 3. Install postgres
2525-Alpine 3.23 includes PostgreSQL 18:
2625```sh
2726apk add postgresql postgresql-contrib
2827rc-update add postgresql
2928/etc/init.d/postgresql setup
3029rc-service postgresql start
3131-psql -U postgres -c "CREATE USER bspds WITH PASSWORD 'your-secure-password';"
3232-psql -U postgres -c "CREATE DATABASE pds OWNER bspds;"
3333-psql -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE pds TO bspds;"
3030+psql -U postgres -c "CREATE USER tranquil_pds WITH PASSWORD 'your-secure-password';"
3131+psql -U postgres -c "CREATE DATABASE pds OWNER tranquil_pds;"
3232+psql -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE pds TO tranquil_pds;"
3433```
3534## 4. Install minio
3635```sh
···7877mc mb local/pds-blobs
7978```
8079## 5. Install valkey
8181-Alpine 3.23 includes Valkey 9:
8280```sh
8381apk add valkey
8482rc-update add valkey
···9088export PATH="$HOME/.deno/bin:$PATH"
9189echo 'export PATH="$HOME/.deno/bin:$PATH"' >> ~/.profile
9290```
9393-## 7. Clone and Build BSPDS
9191+## 7. Clone and Build Tranquil PDS
9492```sh
9593mkdir -p /opt && cd /opt
9696-git clone https://tangled.org/lewis.moe/bspds-sandbox bspds
9797-cd bspds
9494+git clone https://tangled.org/lewis.moe/bspds-sandbox tranquil-pds
9595+cd tranquil-pds
9896cd frontend
9997deno task build
10098cd ..
···103101## 8. Install sqlx-cli and Run Migrations
104102```sh
105103cargo install sqlx-cli --no-default-features --features postgres
106106-export DATABASE_URL="postgres://bspds:your-secure-password@localhost:5432/pds"
104104+export DATABASE_URL="postgres://tranquil_pds:your-secure-password@localhost:5432/pds"
107105sqlx migrate run
108106```
109109-## 9. Configure BSPDS
107107+## 9. Configure Tranquil PDS
110108```sh
111111-mkdir -p /etc/bspds
112112-cp /opt/bspds/.env.example /etc/bspds/bspds.env
113113-chmod 600 /etc/bspds/bspds.env
109109+mkdir -p /etc/tranquil-pds
110110+cp /opt/tranquil-pds/.env.example /etc/tranquil-pds/tranquil-pds.env
111111+chmod 600 /etc/tranquil-pds/tranquil-pds.env
114112```
115115-Edit `/etc/bspds/bspds.env` and fill in your values. Generate secrets with:
113113+Edit `/etc/tranquil-pds/tranquil-pds.env` and fill in your values. Generate secrets with:
116114```sh
117115openssl rand -base64 48
118116```
119117## 10. Create OpenRC Service
120118```sh
121121-adduser -D -H -s /sbin/nologin bspds
122122-cp /opt/bspds/target/release/bspds /usr/local/bin/
123123-mkdir -p /var/lib/bspds
124124-cp -r /opt/bspds/frontend/dist /var/lib/bspds/frontend
125125-chown -R bspds:bspds /var/lib/bspds
126126-cat > /etc/init.d/bspds << 'EOF'
119119+adduser -D -H -s /sbin/nologin tranquil-pds
120120+cp /opt/tranquil-pds/target/release/tranquil-pds /usr/local/bin/
121121+mkdir -p /var/lib/tranquil-pds
122122+cp -r /opt/tranquil-pds/frontend/dist /var/lib/tranquil-pds/frontend
123123+chown -R tranquil-pds:tranquil-pds /var/lib/tranquil-pds
124124+cat > /etc/init.d/tranquil-pds << 'EOF'
127125#!/sbin/openrc-run
128128-name="bspds"
129129-description="BSPDS - AT Protocol PDS"
130130-command="/usr/local/bin/bspds"
131131-command_user="bspds"
126126+name="tranquil-pds"
127127+description="Tranquil PDS - AT Protocol PDS"
128128+command="/usr/local/bin/tranquil-pds"
129129+command_user="tranquil-pds"
132130command_background=true
133131pidfile="/run/${RC_SVCNAME}.pid"
134134-output_log="/var/log/bspds.log"
135135-error_log="/var/log/bspds.log"
132132+output_log="/var/log/tranquil-pds.log"
133133+error_log="/var/log/tranquil-pds.log"
136134depend() {
137135 need net postgresql minio
138136}
139137start_pre() {
140140- export FRONTEND_DIR=/var/lib/bspds/frontend
141141- . /etc/bspds/bspds.env
138138+ export FRONTEND_DIR=/var/lib/tranquil-pds/frontend
139139+ . /etc/tranquil-pds/tranquil-pds.env
142140 export SERVER_HOST SERVER_PORT PDS_HOSTNAME DATABASE_URL
143141 export S3_ENDPOINT AWS_REGION S3_BUCKET AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY
144142 export VALKEY_URL JWT_SECRET DPOP_SECRET MASTER_KEY CRAWLERS
145143}
146144EOF
147147-chmod +x /etc/init.d/bspds
148148-rc-update add bspds
149149-rc-service bspds start
145145+chmod +x /etc/init.d/tranquil-pds
146146+rc-update add tranquil-pds
147147+rc-service tranquil-pds start
150148```
151149## 11. Install and Configure nginx
152152-Alpine 3.23 includes nginx 1.28:
153150```sh
154151apk add nginx certbot certbot-nginx
155155-cat > /etc/nginx/http.d/bspds.conf << 'EOF'
152152+cat > /etc/nginx/http.d/tranquil-pds.conf << 'EOF'
156153server {
157154 listen 80;
158155 listen [::]:80;
···217214```
218215## 14. Verify Installation
219216```sh
220220-rc-service bspds status
217217+rc-service tranquil-pds status
221218curl -s https://pds.example.com/xrpc/_health
222219curl -s https://pds.example.com/.well-known/atproto-did
223220```
224221## Maintenance
225222View logs:
226223```sh
227227-tail -f /var/log/bspds.log
224224+tail -f /var/log/tranquil-pds.log
228225```
229229-Update BSPDS:
226226+Update Tranquil PDS:
230227```sh
231231-cd /opt/bspds
228228+cd /opt/tranquil-pds
232229git pull
233230cd frontend && deno task build && cd ..
234231cargo build --release
235235-rc-service bspds stop
236236-cp target/release/bspds /usr/local/bin/
237237-cp -r frontend/dist /var/lib/bspds/frontend
238238-DATABASE_URL="postgres://bspds:your-secure-password@localhost:5432/pds" sqlx migrate run
239239-rc-service bspds start
232232+rc-service tranquil-pds stop
233233+cp target/release/tranquil-pds /usr/local/bin/
234234+cp -r frontend/dist /var/lib/tranquil-pds/frontend
235235+DATABASE_URL="postgres://tranquil_pds:your-secure-password@localhost:5432/pds" sqlx migrate run
236236+rc-service tranquil-pds start
240237```
241238Backup database:
242239```sh
+77-77
docs/install-containers.md
···11-# BSPDS Containerized Production Deployment
11+# Tranquil PDS Containerized Production Deployment
22> **Warning**: These instructions are untested and theoretical, written from the top of Lewis' head. They may contain errors or omissions. This warning will be removed once the guide has been verified.
33-This guide covers deploying BSPDS using containers with podman.
33+This guide covers deploying Tranquil PDS using containers with podman.
44- **Debian 13+**: Uses systemd quadlets (modern, declarative container management)
55- **Alpine 3.23+**: Uses OpenRC service script with podman-compose
66## Prerequisites
···3939## 2. Create Directory Structure
4040```bash
4141mkdir -p /etc/containers/systemd
4242-mkdir -p /srv/bspds/{postgres,minio,valkey,certs,acme,config}
4242+mkdir -p /srv/tranquil-pds/{postgres,minio,valkey,certs,acme,config}
4343```
4444## 3. Create Environment File
4545```bash
4646-cp /opt/bspds/.env.example /srv/bspds/config/bspds.env
4747-chmod 600 /srv/bspds/config/bspds.env
4646+cp /opt/tranquil-pds/.env.example /srv/tranquil-pds/config/tranquil-pds.env
4747+chmod 600 /srv/tranquil-pds/config/tranquil-pds.env
4848```
4949-Edit `/srv/bspds/config/bspds.env` and fill in your values. Generate secrets with:
4949+Edit `/srv/tranquil-pds/config/tranquil-pds.env` and fill in your values. Generate secrets with:
5050```bash
5151openssl rand -base64 48
5252```
···5454## 4. Install Quadlet Definitions
5555Copy the quadlet files from the repository:
5656```bash
5757-cp /opt/bspds/deploy/quadlets/*.pod /etc/containers/systemd/
5858-cp /opt/bspds/deploy/quadlets/*.container /etc/containers/systemd/
5757+cp /opt/tranquil-pds/deploy/quadlets/*.pod /etc/containers/systemd/
5858+cp /opt/tranquil-pds/deploy/quadlets/*.container /etc/containers/systemd/
5959```
6060Note: Systemd doesn't support shell-style variable expansion in `Environment=` lines. The quadlet files expect DATABASE_URL to be set in the environment file.
6161## 5. Create nginx Configuration
6262```bash
6363-cp /opt/bspds/deploy/nginx/nginx-quadlet.conf /srv/bspds/config/nginx.conf
6363+cp /opt/tranquil-pds/deploy/nginx/nginx-quadlet.conf /srv/tranquil-pds/config/nginx.conf
6464```
6565-## 6. Build BSPDS Image
6565+## 6. Build Tranquil PDS Image
6666```bash
6767cd /opt
6868-git clone https://tangled.org/lewis.moe/bspds-sandbox bspds
6969-cd bspds
7070-podman build -t bspds:latest .
6868+git clone https://tangled.org/lewis.moe/bspds-sandbox tranquil-pds
6969+cd tranquil-pds
7070+podman build -t tranquil-pds:latest .
7171```
7272## 7. Create Podman Secrets
7373```bash
7474-source /srv/bspds/config/bspds.env
7575-echo "$DB_PASSWORD" | podman secret create bspds-db-password -
7676-echo "$MINIO_ROOT_PASSWORD" | podman secret create bspds-minio-password -
7474+source /srv/tranquil-pds/config/tranquil-pds.env
7575+echo "$DB_PASSWORD" | podman secret create tranquil-pds-db-password -
7676+echo "$MINIO_ROOT_PASSWORD" | podman secret create tranquil-pds-minio-password -
7777```
7878## 8. Start Services and Initialize
7979```bash
8080systemctl daemon-reload
8181-systemctl start bspds-db bspds-minio bspds-valkey
8181+systemctl start tranquil-pds-db tranquil-pds-minio tranquil-pds-valkey
8282sleep 10
8383```
84848585Create the minio bucket:
8686```bash
8787-podman run --rm --pod bspds \
8787+podman run --rm --pod tranquil-pds \
8888 -e MINIO_ROOT_USER=minioadmin \
8989 -e MINIO_ROOT_PASSWORD=your-minio-password \
9090 docker.io/minio/mc:RELEASE.2025-07-16T15-35-03Z \
···9494Run migrations:
9595```bash
9696cargo install sqlx-cli --no-default-features --features postgres
9797-DATABASE_URL="postgres://bspds:your-db-password@localhost:5432/pds" sqlx migrate run --source /opt/bspds/migrations
9797+DATABASE_URL="postgres://tranquil_pds:your-db-password@localhost:5432/pds" sqlx migrate run --source /opt/tranquil-pds/migrations
9898```
9999## 9. Obtain Wildcard SSL Certificate
100100User handles are served as subdomains (e.g., `alice.pds.example.com`), so you need a wildcard certificate. Wildcard certs require DNS-01 validation.
···102102Create temporary self-signed cert to start services:
103103```bash
104104openssl req -x509 -nodes -days 1 -newkey rsa:2048 \
105105- -keyout /srv/bspds/certs/privkey.pem \
106106- -out /srv/bspds/certs/fullchain.pem \
105105+ -keyout /srv/tranquil-pds/certs/privkey.pem \
106106+ -out /srv/tranquil-pds/certs/fullchain.pem \
107107 -subj "/CN=pds.example.com"
108108-systemctl start bspds-app bspds-nginx
108108+systemctl start tranquil-pds-app tranquil-pds-nginx
109109```
110110111111Get a wildcard certificate using DNS validation:
112112```bash
113113podman run --rm -it \
114114- -v /srv/bspds/certs:/etc/letsencrypt:Z \
114114+ -v /srv/tranquil-pds/certs:/etc/letsencrypt:Z \
115115 docker.io/certbot/certbot:v5.2.2 certonly \
116116 --manual --preferred-challenges dns \
117117 -d pds.example.com -d '*.pds.example.com' \
···123123124124Link certificates and restart:
125125```bash
126126-ln -sf /srv/bspds/certs/live/pds.example.com/fullchain.pem /srv/bspds/certs/fullchain.pem
127127-ln -sf /srv/bspds/certs/live/pds.example.com/privkey.pem /srv/bspds/certs/privkey.pem
128128-systemctl restart bspds-nginx
126126+ln -sf /srv/tranquil-pds/certs/live/pds.example.com/fullchain.pem /srv/tranquil-pds/certs/fullchain.pem
127127+ln -sf /srv/tranquil-pds/certs/live/pds.example.com/privkey.pem /srv/tranquil-pds/certs/privkey.pem
128128+systemctl restart tranquil-pds-nginx
129129```
130130## 10. Enable All Services
131131```bash
132132-systemctl enable bspds-db bspds-minio bspds-valkey bspds-app bspds-nginx
132132+systemctl enable tranquil-pds-db tranquil-pds-minio tranquil-pds-valkey tranquil-pds-app tranquil-pds-nginx
133133```
134134## 11. Configure Firewall
135135```bash
···142142## 12. Certificate Renewal
143143Add to root's crontab (`crontab -e`):
144144```
145145-0 0 * * * podman run --rm -v /srv/bspds/certs:/etc/letsencrypt:Z -v /srv/bspds/acme:/var/www/acme:Z docker.io/certbot/certbot:v5.2.2 renew --quiet && systemctl reload bspds-nginx
145145+0 0 * * * podman run --rm -v /srv/tranquil-pds/certs:/etc/letsencrypt:Z -v /srv/tranquil-pds/acme:/var/www/acme:Z docker.io/certbot/certbot:v5.2.2 renew --quiet && systemctl reload tranquil-pds-nginx
146146```
147147---
148148# Alpine 3.23+ with OpenRC
···161161```
162162## 2. Create Directory Structure
163163```sh
164164-mkdir -p /srv/bspds/{data,config}
165165-mkdir -p /srv/bspds/data/{postgres,minio,valkey,certs,acme}
164164+mkdir -p /srv/tranquil-pds/{data,config}
165165+mkdir -p /srv/tranquil-pds/data/{postgres,minio,valkey,certs,acme}
166166```
167167## 3. Clone Repository and Build
168168```sh
169169cd /opt
170170-git clone https://tangled.org/lewis.moe/bspds-sandbox bspds
171171-cd bspds
172172-podman build -t bspds:latest .
170170+git clone https://tangled.org/lewis.moe/bspds-sandbox tranquil-pds
171171+cd tranquil-pds
172172+podman build -t tranquil-pds:latest .
173173```
174174## 4. Create Environment File
175175```sh
176176-cp /opt/bspds/.env.example /srv/bspds/config/bspds.env
177177-chmod 600 /srv/bspds/config/bspds.env
176176+cp /opt/tranquil-pds/.env.example /srv/tranquil-pds/config/tranquil-pds.env
177177+chmod 600 /srv/tranquil-pds/config/tranquil-pds.env
178178```
179179-Edit `/srv/bspds/config/bspds.env` and fill in your values. Generate secrets with:
179179+Edit `/srv/tranquil-pds/config/tranquil-pds.env` and fill in your values. Generate secrets with:
180180```sh
181181openssl rand -base64 48
182182```
183183## 5. Set Up Compose and nginx
184184Copy the production compose and nginx configs:
185185```sh
186186-cp /opt/bspds/docker-compose.prod.yml /srv/bspds/docker-compose.yml
187187-cp /opt/bspds/nginx.prod.conf /srv/bspds/config/nginx.conf
186186+cp /opt/tranquil-pds/docker-compose.prod.yml /srv/tranquil-pds/docker-compose.yml
187187+cp /opt/tranquil-pds/nginx.prod.conf /srv/tranquil-pds/config/nginx.conf
188188```
189189-Edit `/srv/bspds/docker-compose.yml` to adjust paths if needed:
190190-- Update volume mounts to use `/srv/bspds/data/` paths
191191-- Update nginx cert paths to match `/srv/bspds/data/certs/`
192192-Edit `/srv/bspds/config/nginx.conf` to update cert paths:
189189+Edit `/srv/tranquil-pds/docker-compose.yml` to adjust paths if needed:
190190+- Update volume mounts to use `/srv/tranquil-pds/data/` paths
191191+- Update nginx cert paths to match `/srv/tranquil-pds/data/certs/`
192192+Edit `/srv/tranquil-pds/config/nginx.conf` to update cert paths:
193193- Change `/etc/nginx/certs/live/${PDS_HOSTNAME}/` to `/etc/nginx/certs/`
194194## 6. Create OpenRC Service
195195```sh
196196-cat > /etc/init.d/bspds << 'EOF'
196196+cat > /etc/init.d/tranquil-pds << 'EOF'
197197#!/sbin/openrc-run
198198-name="bspds"
199199-description="BSPDS AT Protocol PDS (containerized)"
198198+name="tranquil-pds"
199199+description="Tranquil PDS AT Protocol PDS (containerized)"
200200command="/usr/bin/podman-compose"
201201-command_args="-f /srv/bspds/docker-compose.yml up"
201201+command_args="-f /srv/tranquil-pds/docker-compose.yml up"
202202command_background=true
203203pidfile="/run/${RC_SVCNAME}.pid"
204204-directory="/srv/bspds"
204204+directory="/srv/tranquil-pds"
205205depend() {
206206 need net podman
207207 after firewall
208208}
209209start_pre() {
210210 set -a
211211- . /srv/bspds/config/bspds.env
211211+ . /srv/tranquil-pds/config/tranquil-pds.env
212212 set +a
213213}
214214stop() {
215215 ebegin "Stopping ${name}"
216216- cd /srv/bspds
216216+ cd /srv/tranquil-pds
217217 set -a
218218- . /srv/bspds/config/bspds.env
218218+ . /srv/tranquil-pds/config/tranquil-pds.env
219219 set +a
220220- podman-compose -f /srv/bspds/docker-compose.yml down
220220+ podman-compose -f /srv/tranquil-pds/docker-compose.yml down
221221 eend $?
222222}
223223EOF
224224-chmod +x /etc/init.d/bspds
224224+chmod +x /etc/init.d/tranquil-pds
225225```
226226## 7. Initialize Services
227227Start services:
228228```sh
229229-rc-service bspds start
229229+rc-service tranquil-pds start
230230sleep 15
231231```
232232233233Create the minio bucket:
234234```sh
235235-source /srv/bspds/config/bspds.env
236236-podman run --rm --network bspds_default \
235235+source /srv/tranquil-pds/config/tranquil-pds.env
236236+podman run --rm --network tranquil-pds_default \
237237 -e MINIO_ROOT_USER="$MINIO_ROOT_USER" \
238238 -e MINIO_ROOT_PASSWORD="$MINIO_ROOT_PASSWORD" \
239239 docker.io/minio/mc:RELEASE.2025-07-16T15-35-03Z \
···246246rustup-init -y
247247source ~/.cargo/env
248248cargo install sqlx-cli --no-default-features --features postgres
249249-DB_IP=$(podman inspect bspds-db-1 --format '{{.NetworkSettings.Networks.bspds_default.IPAddress}}')
250250-DATABASE_URL="postgres://bspds:$DB_PASSWORD@$DB_IP:5432/pds" sqlx migrate run --source /opt/bspds/migrations
249249+DB_IP=$(podman inspect tranquil-pds-db-1 --format '{{.NetworkSettings.Networks.tranquil-pds_default.IPAddress}}')
250250+DATABASE_URL="postgres://tranquil_pds:$DB_PASSWORD@$DB_IP:5432/pds" sqlx migrate run --source /opt/tranquil-pds/migrations
251251```
252252## 8. Obtain Wildcard SSL Certificate
253253User handles are served as subdomains (e.g., `alice.pds.example.com`), so you need a wildcard certificate. Wildcard certs require DNS-01 validation.
···255255Create temporary self-signed cert to start services:
256256```sh
257257openssl req -x509 -nodes -days 1 -newkey rsa:2048 \
258258- -keyout /srv/bspds/data/certs/privkey.pem \
259259- -out /srv/bspds/data/certs/fullchain.pem \
258258+ -keyout /srv/tranquil-pds/data/certs/privkey.pem \
259259+ -out /srv/tranquil-pds/data/certs/fullchain.pem \
260260 -subj "/CN=pds.example.com"
261261-rc-service bspds restart
261261+rc-service tranquil-pds restart
262262```
263263264264Get a wildcard certificate using DNS validation:
265265```sh
266266podman run --rm -it \
267267- -v /srv/bspds/data/certs:/etc/letsencrypt \
267267+ -v /srv/tranquil-pds/data/certs:/etc/letsencrypt \
268268 docker.io/certbot/certbot:v5.2.2 certonly \
269269 --manual --preferred-challenges dns \
270270 -d pds.example.com -d '*.pds.example.com' \
···274274275275Link certificates and restart:
276276```sh
277277-ln -sf /srv/bspds/data/certs/live/pds.example.com/fullchain.pem /srv/bspds/data/certs/fullchain.pem
278278-ln -sf /srv/bspds/data/certs/live/pds.example.com/privkey.pem /srv/bspds/data/certs/privkey.pem
279279-rc-service bspds restart
277277+ln -sf /srv/tranquil-pds/data/certs/live/pds.example.com/fullchain.pem /srv/tranquil-pds/data/certs/fullchain.pem
278278+ln -sf /srv/tranquil-pds/data/certs/live/pds.example.com/privkey.pem /srv/tranquil-pds/data/certs/privkey.pem
279279+rc-service tranquil-pds restart
280280```
281281## 9. Enable Service at Boot
282282```sh
283283-rc-update add bspds
283283+rc-update add tranquil-pds
284284```
285285## 10. Configure Firewall
286286```sh
···305305## 11. Certificate Renewal
306306Add to root's crontab (`crontab -e`):
307307```
308308-0 0 * * * podman run --rm -v /srv/bspds/data/certs:/etc/letsencrypt -v /srv/bspds/data/acme:/var/www/acme docker.io/certbot/certbot:v5.2.2 renew --quiet && rc-service bspds restart
308308+0 0 * * * podman run --rm -v /srv/tranquil-pds/data/certs:/etc/letsencrypt -v /srv/tranquil-pds/data/acme:/var/www/acme docker.io/certbot/certbot:v5.2.2 renew --quiet && rc-service tranquil-pds restart
309309```
310310---
311311# Verification and Maintenance
···317317## View Logs
318318**Debian:**
319319```bash
320320-journalctl -u bspds-app -f
321321-podman logs -f bspds-app
320320+journalctl -u tranquil-pds-app -f
321321+podman logs -f tranquil-pds-app
322322```
323323**Alpine:**
324324```sh
325325-podman-compose -f /srv/bspds/docker-compose.yml logs -f
326326-podman logs -f bspds-bspds-1
325325+podman-compose -f /srv/tranquil-pds/docker-compose.yml logs -f
326326+podman logs -f tranquil-pds-tranquil-pds-1
327327```
328328-## Update BSPDS
328328+## Update Tranquil PDS
329329```sh
330330-cd /opt/bspds
330330+cd /opt/tranquil-pds
331331git pull
332332-podman build -t bspds:latest .
332332+podman build -t tranquil-pds:latest .
333333```
334334335335Debian:
336336```bash
337337-systemctl restart bspds-app
337337+systemctl restart tranquil-pds-app
338338```
339339340340Alpine:
341341```sh
342342-rc-service bspds restart
342342+rc-service tranquil-pds restart
343343```
344344## Backup Database
345345**Debian:**
346346```bash
347347-podman exec bspds-db pg_dump -U bspds pds > /var/backups/pds-$(date +%Y%m%d).sql
347347+podman exec tranquil-pds-db pg_dump -U tranquil_pds pds > /var/backups/pds-$(date +%Y%m%d).sql
348348```
349349**Alpine:**
350350```sh
351351-podman exec bspds-db-1 pg_dump -U bspds pds > /var/backups/pds-$(date +%Y%m%d).sql
351351+podman exec tranquil-pds-db-1 pg_dump -U tranquil_pds pds > /var/backups/pds-$(date +%Y%m%d).sql
352352```
+40-43
docs/install-debian.md
···11-# BSPDS Production Installation on Debian
11+# Tranquil PDS Production Installation on Debian
22> **Warning**: These instructions are untested and theoretical, written from the top of Lewis' head. They may contain errors or omissions. This warning will be removed once the guide has been verified.
3344-This guide covers installing BSPDS on Debian 13 "Trixie" (current stable as of December 2025).
44+This guide covers installing Tranquil PDS on Debian 13 "Trixie".
5566## Prerequisites
77- A VPS with at least 2GB RAM and 20GB disk
···1919source ~/.cargo/env
2020rustup default stable
2121```
2222-This installs the latest stable Rust (1.92+ as of December 2025).
2222+This installs the latest stable Rust.
2323## 3. Install postgres
2424-Debian 13 includes PostgreSQL 17:
2524```bash
2625apt install -y postgresql postgresql-contrib
2726systemctl enable postgresql
2827systemctl start postgresql
2929-sudo -u postgres psql -c "CREATE USER bspds WITH PASSWORD 'your-secure-password';"
3030-sudo -u postgres psql -c "CREATE DATABASE pds OWNER bspds;"
3131-sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE pds TO bspds;"
2828+sudo -u postgres psql -c "CREATE USER tranquil_pds WITH PASSWORD 'your-secure-password';"
2929+sudo -u postgres psql -c "CREATE DATABASE pds OWNER tranquil_pds;"
3030+sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE pds TO tranquil_pds;"
3231```
3332## 4. Install minio
3433```bash
···7170mc mb local/pds-blobs
7271```
7372## 5. Install valkey
7474-Debian 13 includes Valkey 8:
7573```bash
7674apt install -y valkey
7775systemctl enable valkey-server
···8381export PATH="$HOME/.deno/bin:$PATH"
8482echo 'export PATH="$HOME/.deno/bin:$PATH"' >> ~/.bashrc
8583```
8686-## 7. Clone and Build BSPDS
8484+## 7. Clone and Build Tranquil PDS
8785```bash
8886cd /opt
8989-git clone https://tangled.org/lewis.moe/bspds-sandbox bspds
9090-cd bspds
8787+git clone https://tangled.org/lewis.moe/bspds-sandbox tranquil-pds
8888+cd tranquil-pds
9189cd frontend
9290deno task build
9391cd ..
···9694## 8. Install sqlx-cli and Run Migrations
9795```bash
9896cargo install sqlx-cli --no-default-features --features postgres
9999-export DATABASE_URL="postgres://bspds:your-secure-password@localhost:5432/pds"
9797+export DATABASE_URL="postgres://tranquil_pds:your-secure-password@localhost:5432/pds"
10098sqlx migrate run
10199```
102102-## 9. Configure BSPDS
100100+## 9. Configure Tranquil PDS
103101```bash
104104-mkdir -p /etc/bspds
105105-cp /opt/bspds/.env.example /etc/bspds/bspds.env
106106-chmod 600 /etc/bspds/bspds.env
102102+mkdir -p /etc/tranquil-pds
103103+cp /opt/tranquil-pds/.env.example /etc/tranquil-pds/tranquil-pds.env
104104+chmod 600 /etc/tranquil-pds/tranquil-pds.env
107105```
108108-Edit `/etc/bspds/bspds.env` and fill in your values. Generate secrets with:
106106+Edit `/etc/tranquil-pds/tranquil-pds.env` and fill in your values. Generate secrets with:
109107```bash
110108openssl rand -base64 48
111109```
112110## 10. Create Systemd Service
113111```bash
114114-useradd -r -s /sbin/nologin bspds
115115-cp /opt/bspds/target/release/bspds /usr/local/bin/
116116-mkdir -p /var/lib/bspds
117117-cp -r /opt/bspds/frontend/dist /var/lib/bspds/frontend
118118-chown -R bspds:bspds /var/lib/bspds
119119-cat > /etc/systemd/system/bspds.service << 'EOF'
112112+useradd -r -s /sbin/nologin tranquil-pds
113113+cp /opt/tranquil-pds/target/release/tranquil-pds /usr/local/bin/
114114+mkdir -p /var/lib/tranquil-pds
115115+cp -r /opt/tranquil-pds/frontend/dist /var/lib/tranquil-pds/frontend
116116+chown -R tranquil-pds:tranquil-pds /var/lib/tranquil-pds
117117+cat > /etc/systemd/system/tranquil-pds.service << 'EOF'
120118[Unit]
121121-Description=BSPDS - AT Protocol PDS
119119+Description=Tranquil PDS - AT Protocol PDS
122120After=network.target postgresql.service minio.service
123121[Service]
124122Type=simple
125125-User=bspds
126126-Group=bspds
127127-EnvironmentFile=/etc/bspds/bspds.env
128128-Environment=FRONTEND_DIR=/var/lib/bspds/frontend
129129-ExecStart=/usr/local/bin/bspds
123123+User=tranquil-pds
124124+Group=tranquil-pds
125125+EnvironmentFile=/etc/tranquil-pds/tranquil-pds.env
126126+Environment=FRONTEND_DIR=/var/lib/tranquil-pds/frontend
127127+ExecStart=/usr/local/bin/tranquil-pds
130128Restart=always
131129RestartSec=5
132130[Install]
133131WantedBy=multi-user.target
134132EOF
135133systemctl daemon-reload
136136-systemctl enable bspds
137137-systemctl start bspds
134134+systemctl enable tranquil-pds
135135+systemctl start tranquil-pds
138136```
139137## 11. Install and Configure nginx
140140-Debian 13 includes nginx 1.26:
141138```bash
142139apt install -y nginx certbot python3-certbot-nginx
143143-cat > /etc/nginx/sites-available/bspds << 'EOF'
140140+cat > /etc/nginx/sites-available/tranquil-pds << 'EOF'
144141server {
145142 listen 80;
146143 listen [::]:80;
···158155 }
159156}
160157EOF
161161-ln -s /etc/nginx/sites-available/bspds /etc/nginx/sites-enabled/
158158+ln -s /etc/nginx/sites-available/tranquil-pds /etc/nginx/sites-enabled/
162159rm -f /etc/nginx/sites-enabled/default
163160nginx -t
164161systemctl reload nginx
···192189```
193190## 14. Verify Installation
194191```bash
195195-systemctl status bspds
192192+systemctl status tranquil-pds
196193curl -s https://pds.example.com/xrpc/_health | jq
197194curl -s https://pds.example.com/.well-known/atproto-did
198195```
199196## Maintenance
200197View logs:
201198```bash
202202-journalctl -u bspds -f
199199+journalctl -u tranquil-pds -f
203200```
204204-Update BSPDS:
201201+Update Tranquil PDS:
205202```bash
206206-cd /opt/bspds
203203+cd /opt/tranquil-pds
207204git pull
208205cd frontend && deno task build && cd ..
209206cargo build --release
210210-systemctl stop bspds
211211-cp target/release/bspds /usr/local/bin/
212212-cp -r frontend/dist /var/lib/bspds/frontend
213213-DATABASE_URL="postgres://bspds:your-secure-password@localhost:5432/pds" sqlx migrate run
214214-systemctl start bspds
207207+systemctl stop tranquil-pds
208208+cp target/release/tranquil-pds /usr/local/bin/
209209+cp -r frontend/dist /var/lib/tranquil-pds/frontend
210210+DATABASE_URL="postgres://tranquil_pds:your-secure-password@localhost:5432/pds" sqlx migrate run
211211+systemctl start tranquil-pds
215212```
216213Backup database:
217214```bash
+1-1
docs/install-kubernetes.md
···11-# BSPDS on Kubernetes
11+# Tranquil PDS on Kubernetes
2233If you're reaching for kubernetes for this app, you're experienced enough to know how to spin up:
44
+36-37
docs/install-openbsd.md
···11-# BSPDS Production Installation on OpenBSD
11+# Tranquil PDS Production Installation on OpenBSD
22> **Warning**: These instructions are untested and theoretical, written from the top of Lewis' head. They may contain errors or omissions. This warning will be removed once the guide has been verified.
33-This guide covers installing BSPDS on OpenBSD 7.8 (current release as of December 2025).
33+This guide covers installing Tranquil PDS on OpenBSD 7.8.
44## Prerequisites
55- A VPS with at least 2GB RAM and 20GB disk
66- A domain name pointing to your server's IP
···1616```sh
1717pkg_add rust
1818```
1919-OpenBSD 7.8 ships Rust 1.82+. For the latest stable (1.92+), use rustup:
1919+OpenBSD ships Rust in ports. For the latest stable, use rustup:
2020```sh
2121pkg_add rustup
2222rustup-init -y
···2424rustup default stable
2525```
2626## 3. Install postgres
2727-OpenBSD 7.8 includes PostgreSQL 17 (PostgreSQL 18 may not yet be in ports):
2827```sh
2928pkg_add postgresql-server postgresql-client
3029mkdir -p /var/postgresql/data
···3231su - _postgresql -c "initdb -D /var/postgresql/data -U postgres -A scram-sha-256"
3332rcctl enable postgresql
3433rcctl start postgresql
3535-psql -U postgres -c "CREATE USER bspds WITH PASSWORD 'your-secure-password';"
3636-psql -U postgres -c "CREATE DATABASE pds OWNER bspds;"
3737-psql -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE pds TO bspds;"
3434+psql -U postgres -c "CREATE USER tranquil_pds WITH PASSWORD 'your-secure-password';"
3535+psql -U postgres -c "CREATE DATABASE pds OWNER tranquil_pds;"
3636+psql -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE pds TO tranquil_pds;"
3837```
3938## 4. Install minio
4039OpenBSD doesn't have a minio package. Options:
···9392export PATH="$HOME/.deno/bin:$PATH"
9493echo 'export PATH="$HOME/.deno/bin:$PATH"' >> ~/.profile
9594```
9696-## 7. Clone and Build BSPDS
9595+## 7. Clone and Build Tranquil PDS
9796```sh
9897mkdir -p /opt && cd /opt
9999-git clone https://tangled.org/lewis.moe/bspds-sandbox bspds
100100-cd bspds
9898+git clone https://tangled.org/lewis.moe/bspds-sandbox tranquil-pds
9999+cd tranquil-pds
101100cd frontend
102101deno task build
103102cd ..
···106105## 8. Install sqlx-cli and Run Migrations
107106```sh
108107cargo install sqlx-cli --no-default-features --features postgres
109109-export DATABASE_URL="postgres://bspds:your-secure-password@localhost:5432/pds"
108108+export DATABASE_URL="postgres://tranquil_pds:your-secure-password@localhost:5432/pds"
110109sqlx migrate run
111110```
112112-## 9. Configure BSPDS
111111+## 9. Configure Tranquil PDS
113112```sh
114114-mkdir -p /etc/bspds
115115-cp /opt/bspds/.env.example /etc/bspds/bspds.conf
116116-chmod 600 /etc/bspds/bspds.conf
113113+mkdir -p /etc/tranquil-pds
114114+cp /opt/tranquil-pds/.env.example /etc/tranquil-pds/tranquil-pds.conf
115115+chmod 600 /etc/tranquil-pds/tranquil-pds.conf
117116```
118118-Edit `/etc/bspds/bspds.conf` and fill in your values. Generate secrets with:
117117+Edit `/etc/tranquil-pds/tranquil-pds.conf` and fill in your values. Generate secrets with:
119118```sh
120119openssl rand -base64 48
121120```
122121## 10. Create rc.d Service
123122```sh
124124-useradd -d /var/empty -s /sbin/nologin _bspds
125125-cp /opt/bspds/target/release/bspds /usr/local/bin/
126126-mkdir -p /var/bspds
127127-cp -r /opt/bspds/frontend/dist /var/bspds/frontend
128128-chown -R _bspds:_bspds /var/bspds
129129-cat > /etc/rc.d/bspds << 'EOF'
123123+useradd -d /var/empty -s /sbin/nologin _tranquil_pds
124124+cp /opt/tranquil-pds/target/release/tranquil-pds /usr/local/bin/
125125+mkdir -p /var/tranquil-pds
126126+cp -r /opt/tranquil-pds/frontend/dist /var/tranquil-pds/frontend
127127+chown -R _tranquil_pds:_tranquil_pds /var/tranquil-pds
128128+cat > /etc/rc.d/tranquil_pds << 'EOF'
130129#!/bin/ksh
131131-daemon="/usr/local/bin/bspds"
132132-daemon_user="_bspds"
130130+daemon="/usr/local/bin/tranquil-pds"
131131+daemon_user="_tranquil_pds"
133132daemon_logger="daemon.info"
134133. /etc/rc.d/rc.subr
135134rc_pre() {
136136- export FRONTEND_DIR=/var/bspds/frontend
135135+ export FRONTEND_DIR=/var/tranquil-pds/frontend
137136 while IFS='=' read -r key value; do
138137 case "$key" in
139138 \#*|"") continue ;;
140139 esac
141140 export "$key=$value"
142142- done < /etc/bspds/bspds.conf
141141+ done < /etc/tranquil-pds/tranquil-pds.conf
143142}
144143rc_cmd $1
145144EOF
146146-chmod +x /etc/rc.d/bspds
147147-rcctl enable bspds
148148-rcctl start bspds
145145+chmod +x /etc/rc.d/tranquil_pds
146146+rcctl enable tranquil_pds
147147+rcctl start tranquil_pds
149148```
150149## 11. Install and Configure nginx
151150```sh
···227226```
228227## 14. Verify Installation
229228```sh
230230-rcctl check bspds
229229+rcctl check tranquil_pds
231230ftp -o - https://pds.example.com/xrpc/_health
232231ftp -o - https://pds.example.com/.well-known/atproto-did
233232```
···236235```sh
237236tail -f /var/log/daemon
238237```
239239-Update BSPDS:
238238+Update Tranquil PDS:
240239```sh
241241-cd /opt/bspds
240240+cd /opt/tranquil-pds
242241git pull
243242cd frontend && deno task build && cd ..
244243cargo build --release
245245-rcctl stop bspds
246246-cp target/release/bspds /usr/local/bin/
247247-cp -r frontend/dist /var/bspds/frontend
248248-DATABASE_URL="postgres://bspds:your-secure-password@localhost:5432/pds" sqlx migrate run
249249-rcctl start bspds
244244+rcctl stop tranquil_pds
245245+cp target/release/tranquil-pds /usr/local/bin/
246246+cp -r frontend/dist /var/tranquil-pds/frontend
247247+DATABASE_URL="postgres://tranquil_pds:your-secure-password@localhost:5432/pds" sqlx migrate run
248248+rcctl start tranquil_pds
250249```
251250Backup database:
252251```sh