this repo has no description
1# Tranquil PDS Production Installation on Alpine Linux
2> **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.
3
4This guide covers installing Tranquil PDS on Alpine Linux 3.23.
5
6## Prerequisites
7- A VPS with at least 2GB RAM and 20GB disk
8- A domain name pointing to your server's IP
9- A **wildcard TLS certificate** for `*.pds.example.com` (user handles are served as subdomains)
10- Root access
11## 1. System Setup
12```sh
13apk update && apk upgrade
14apk add curl git build-base openssl-dev pkgconf
15```
16## 2. Install Rust
17```sh
18apk add rustup
19rustup-init -y
20source ~/.cargo/env
21rustup default stable
22```
23This installs the latest stable Rust. Alpine also ships Rust via `apk add rust cargo` if you prefer system packages.
24## 3. Install postgres
25```sh
26apk add postgresql postgresql-contrib
27rc-update add postgresql
28/etc/init.d/postgresql setup
29rc-service postgresql start
30psql -U postgres -c "CREATE USER tranquil_pds WITH PASSWORD 'your-secure-password';"
31psql -U postgres -c "CREATE DATABASE pds OWNER tranquil_pds;"
32psql -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE pds TO tranquil_pds;"
33```
34## 4. Install minio
35```sh
36curl -O https://dl.min.io/server/minio/release/linux-amd64/minio
37chmod +x minio
38mv minio /usr/local/bin/
39mkdir -p /var/lib/minio/data
40adduser -D -H -s /sbin/nologin minio-user
41chown -R minio-user:minio-user /var/lib/minio
42cat > /etc/conf.d/minio << 'EOF'
43MINIO_ROOT_USER="minioadmin"
44MINIO_ROOT_PASSWORD="your-minio-password"
45MINIO_VOLUMES="/var/lib/minio/data"
46MINIO_OPTS="--console-address :9001"
47EOF
48cat > /etc/init.d/minio << 'EOF'
49#!/sbin/openrc-run
50name="minio"
51description="MinIO Object Storage"
52command="/usr/local/bin/minio"
53command_args="server ${MINIO_VOLUMES} ${MINIO_OPTS}"
54command_user="minio-user"
55command_background=true
56pidfile="/run/${RC_SVCNAME}.pid"
57output_log="/var/log/minio.log"
58error_log="/var/log/minio.log"
59depend() {
60 need net
61}
62start_pre() {
63 . /etc/conf.d/minio
64 export MINIO_ROOT_USER MINIO_ROOT_PASSWORD
65}
66EOF
67chmod +x /etc/init.d/minio
68rc-update add minio
69rc-service minio start
70```
71Create the blob bucket (wait a few seconds for minio to start):
72```sh
73curl -O https://dl.min.io/client/mc/release/linux-amd64/mc
74chmod +x mc
75mv mc /usr/local/bin/
76mc alias set local http://localhost:9000 minioadmin your-minio-password
77mc mb local/pds-blobs
78```
79## 5. Install valkey
80```sh
81apk add valkey
82rc-update add valkey
83rc-service valkey start
84```
85## 6. Install deno (for frontend build)
86```sh
87curl -fsSL https://deno.land/install.sh | sh
88export PATH="$HOME/.deno/bin:$PATH"
89echo 'export PATH="$HOME/.deno/bin:$PATH"' >> ~/.profile
90```
91## 7. Clone and Build Tranquil PDS
92```sh
93mkdir -p /opt && cd /opt
94git clone https://tangled.org/lewis.moe/bspds-sandbox tranquil-pds
95cd tranquil-pds
96cd frontend
97deno task build
98cd ..
99cargo build --release
100```
101## 8. Install sqlx-cli and Run Migrations
102```sh
103cargo install sqlx-cli --no-default-features --features postgres
104export DATABASE_URL="postgres://tranquil_pds:your-secure-password@localhost:5432/pds"
105sqlx migrate run
106```
107## 9. Configure Tranquil PDS
108```sh
109mkdir -p /etc/tranquil-pds
110cp /opt/tranquil-pds/.env.example /etc/tranquil-pds/tranquil-pds.env
111chmod 600 /etc/tranquil-pds/tranquil-pds.env
112```
113Edit `/etc/tranquil-pds/tranquil-pds.env` and fill in your values. Generate secrets with:
114```sh
115openssl rand -base64 48
116```
117## 10. Create OpenRC Service
118```sh
119adduser -D -H -s /sbin/nologin tranquil-pds
120cp /opt/tranquil-pds/target/release/tranquil-pds /usr/local/bin/
121mkdir -p /var/lib/tranquil-pds
122cp -r /opt/tranquil-pds/frontend/dist /var/lib/tranquil-pds/frontend
123chown -R tranquil-pds:tranquil-pds /var/lib/tranquil-pds
124cat > /etc/init.d/tranquil-pds << 'EOF'
125#!/sbin/openrc-run
126name="tranquil-pds"
127description="Tranquil PDS - AT Protocol PDS"
128command="/usr/local/bin/tranquil-pds"
129command_user="tranquil-pds"
130command_background=true
131pidfile="/run/${RC_SVCNAME}.pid"
132output_log="/var/log/tranquil-pds.log"
133error_log="/var/log/tranquil-pds.log"
134depend() {
135 need net postgresql minio
136}
137start_pre() {
138 export FRONTEND_DIR=/var/lib/tranquil-pds/frontend
139 . /etc/tranquil-pds/tranquil-pds.env
140 export SERVER_HOST SERVER_PORT PDS_HOSTNAME DATABASE_URL
141 export S3_ENDPOINT AWS_REGION S3_BUCKET AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY
142 export VALKEY_URL JWT_SECRET DPOP_SECRET MASTER_KEY CRAWLERS
143}
144EOF
145chmod +x /etc/init.d/tranquil-pds
146rc-update add tranquil-pds
147rc-service tranquil-pds start
148```
149## 11. Install and Configure nginx
150```sh
151apk add nginx certbot certbot-nginx
152cat > /etc/nginx/http.d/tranquil-pds.conf << 'EOF'
153server {
154 listen 80;
155 listen [::]:80;
156 server_name pds.example.com;
157 location / {
158 proxy_pass http://127.0.0.1:3000;
159 proxy_http_version 1.1;
160 proxy_set_header Upgrade $http_upgrade;
161 proxy_set_header Connection "upgrade";
162 proxy_set_header Host $host;
163 proxy_set_header X-Real-IP $remote_addr;
164 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
165 proxy_set_header X-Forwarded-Proto $scheme;
166 proxy_read_timeout 86400;
167 }
168}
169EOF
170rc-update add nginx
171rc-service nginx start
172```
173## 12. Obtain Wildcard SSL Certificate
174User handles are served as subdomains (e.g., `alice.pds.example.com`), so you need a wildcard certificate.
175
176Wildcard certs require DNS-01 validation. For manual DNS validation (works with any provider):
177```sh
178certbot certonly --manual --preferred-challenges dns \
179 -d pds.example.com -d '*.pds.example.com'
180```
181Follow the prompts to add TXT records to your DNS.
182
183If your DNS provider has a certbot plugin, you can use that for auto-renewal:
184```sh
185apk add certbot-dns-cloudflare
186certbot certonly --dns-cloudflare \
187 --dns-cloudflare-credentials /etc/cloudflare.ini \
188 -d pds.example.com -d '*.pds.example.com'
189```
190
191After obtaining the cert, update nginx to use it, then set up auto-renewal:
192```sh
193echo "0 0 * * * certbot renew --quiet && rc-service nginx reload" | crontab -
194```
195## 13. Configure Firewall
196```sh
197apk add iptables ip6tables
198iptables -A INPUT -p tcp --dport 22 -j ACCEPT
199iptables -A INPUT -p tcp --dport 80 -j ACCEPT
200iptables -A INPUT -p tcp --dport 443 -j ACCEPT
201iptables -A INPUT -i lo -j ACCEPT
202iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
203iptables -P INPUT DROP
204ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT
205ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
206ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT
207ip6tables -A INPUT -i lo -j ACCEPT
208ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
209ip6tables -P INPUT DROP
210rc-update add iptables
211rc-update add ip6tables
212/etc/init.d/iptables save
213/etc/init.d/ip6tables save
214```
215## 14. Verify Installation
216```sh
217rc-service tranquil-pds status
218curl -s https://pds.example.com/xrpc/_health
219curl -s https://pds.example.com/.well-known/atproto-did
220```
221## Maintenance
222View logs:
223```sh
224tail -f /var/log/tranquil-pds.log
225```
226Update Tranquil PDS:
227```sh
228cd /opt/tranquil-pds
229git pull
230cd frontend && deno task build && cd ..
231cargo build --release
232rc-service tranquil-pds stop
233cp target/release/tranquil-pds /usr/local/bin/
234cp -r frontend/dist /var/lib/tranquil-pds/frontend
235DATABASE_URL="postgres://tranquil_pds:your-secure-password@localhost:5432/pds" sqlx migrate run
236rc-service tranquil-pds start
237```
238Backup database:
239```sh
240pg_dump -U postgres pds > /var/backups/pds-$(date +%Y%m%d).sql
241```