this repo has no description
1# Tranquil PDS Production Installation on Debian 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 Debian 13 "Trixie". 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 or sudo access 11## 1. System Setup 12```bash 13apt update && apt upgrade -y 14apt install -y curl git build-essential pkg-config libssl-dev 15``` 16## 2. Install Rust 17```bash 18curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y 19source ~/.cargo/env 20rustup default stable 21``` 22This installs the latest stable Rust. 23## 3. Install postgres 24```bash 25apt install -y postgresql postgresql-contrib 26systemctl enable postgresql 27systemctl start postgresql 28sudo -u postgres psql -c "CREATE USER tranquil_pds WITH PASSWORD 'your-secure-password';" 29sudo -u postgres psql -c "CREATE DATABASE pds OWNER tranquil_pds;" 30sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE pds TO tranquil_pds;" 31``` 32## 4. Install minio 33```bash 34curl -O https://dl.min.io/server/minio/release/linux-amd64/minio 35chmod +x minio 36mv minio /usr/local/bin/ 37mkdir -p /var/lib/minio/data 38useradd -r -s /sbin/nologin minio-user 39chown -R minio-user:minio-user /var/lib/minio 40cat > /etc/default/minio << 'EOF' 41MINIO_ROOT_USER=minioadmin 42MINIO_ROOT_PASSWORD=your-minio-password 43MINIO_VOLUMES="/var/lib/minio/data" 44MINIO_OPTS="--console-address :9001" 45EOF 46cat > /etc/systemd/system/minio.service << 'EOF' 47[Unit] 48Description=MinIO Object Storage 49After=network.target 50[Service] 51User=minio-user 52Group=minio-user 53EnvironmentFile=/etc/default/minio 54ExecStart=/usr/local/bin/minio server $MINIO_VOLUMES $MINIO_OPTS 55Restart=always 56LimitNOFILE=65536 57[Install] 58WantedBy=multi-user.target 59EOF 60systemctl daemon-reload 61systemctl enable minio 62systemctl start minio 63``` 64Create the blob bucket (wait a few seconds for minio to start): 65```bash 66curl -O https://dl.min.io/client/mc/release/linux-amd64/mc 67chmod +x mc 68mv mc /usr/local/bin/ 69mc alias set local http://localhost:9000 minioadmin your-minio-password 70mc mb local/pds-blobs 71``` 72## 5. Install valkey 73```bash 74apt install -y valkey 75systemctl enable valkey-server 76systemctl start valkey-server 77``` 78## 6. Install deno (for frontend build) 79```bash 80curl -fsSL https://deno.land/install.sh | sh 81export PATH="$HOME/.deno/bin:$PATH" 82echo 'export PATH="$HOME/.deno/bin:$PATH"' >> ~/.bashrc 83``` 84## 7. Clone and Build Tranquil PDS 85```bash 86cd /opt 87git clone https://tangled.org/lewis.moe/bspds-sandbox tranquil-pds 88cd tranquil-pds 89cd frontend 90deno task build 91cd .. 92cargo build --release 93``` 94## 8. Install sqlx-cli and Run Migrations 95```bash 96cargo install sqlx-cli --no-default-features --features postgres 97export DATABASE_URL="postgres://tranquil_pds:your-secure-password@localhost:5432/pds" 98sqlx migrate run 99``` 100## 9. Configure Tranquil PDS 101```bash 102mkdir -p /etc/tranquil-pds 103cp /opt/tranquil-pds/.env.example /etc/tranquil-pds/tranquil-pds.env 104chmod 600 /etc/tranquil-pds/tranquil-pds.env 105``` 106Edit `/etc/tranquil-pds/tranquil-pds.env` and fill in your values. Generate secrets with: 107```bash 108openssl rand -base64 48 109``` 110## 10. Create Systemd Service 111```bash 112useradd -r -s /sbin/nologin tranquil-pds 113cp /opt/tranquil-pds/target/release/tranquil-pds /usr/local/bin/ 114mkdir -p /var/lib/tranquil-pds 115cp -r /opt/tranquil-pds/frontend/dist /var/lib/tranquil-pds/frontend 116chown -R tranquil-pds:tranquil-pds /var/lib/tranquil-pds 117cat > /etc/systemd/system/tranquil-pds.service << 'EOF' 118[Unit] 119Description=Tranquil PDS - AT Protocol PDS 120After=network.target postgresql.service minio.service 121[Service] 122Type=simple 123User=tranquil-pds 124Group=tranquil-pds 125EnvironmentFile=/etc/tranquil-pds/tranquil-pds.env 126Environment=FRONTEND_DIR=/var/lib/tranquil-pds/frontend 127ExecStart=/usr/local/bin/tranquil-pds 128Restart=always 129RestartSec=5 130[Install] 131WantedBy=multi-user.target 132EOF 133systemctl daemon-reload 134systemctl enable tranquil-pds 135systemctl start tranquil-pds 136``` 137## 11. Install and Configure nginx 138```bash 139apt install -y nginx certbot python3-certbot-nginx 140cat > /etc/nginx/sites-available/tranquil-pds << 'EOF' 141server { 142 listen 80; 143 listen [::]:80; 144 server_name pds.example.com; 145 location / { 146 proxy_pass http://127.0.0.1:3000; 147 proxy_http_version 1.1; 148 proxy_set_header Upgrade $http_upgrade; 149 proxy_set_header Connection "upgrade"; 150 proxy_set_header Host $host; 151 proxy_set_header X-Real-IP $remote_addr; 152 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 153 proxy_set_header X-Forwarded-Proto $scheme; 154 proxy_read_timeout 86400; 155 } 156} 157EOF 158ln -s /etc/nginx/sites-available/tranquil-pds /etc/nginx/sites-enabled/ 159rm -f /etc/nginx/sites-enabled/default 160nginx -t 161systemctl reload nginx 162``` 163## 12. Obtain Wildcard SSL Certificate 164User handles are served as subdomains (e.g., `alice.pds.example.com`), so you need a wildcard certificate. 165 166Wildcard certs require DNS-01 validation. If your DNS provider has a certbot plugin: 167```bash 168apt install -y python3-certbot-dns-cloudflare 169certbot certonly --dns-cloudflare \ 170 --dns-cloudflare-credentials /etc/cloudflare.ini \ 171 -d pds.example.com -d '*.pds.example.com' 172``` 173 174For manual DNS validation (works with any provider): 175```bash 176certbot certonly --manual --preferred-challenges dns \ 177 -d pds.example.com -d '*.pds.example.com' 178``` 179Follow the prompts to add TXT records to your DNS. Note: manual mode doesn't auto-renew. 180 181After obtaining the cert, update nginx to use it and reload. 182## 13. Configure Firewall 183```bash 184apt install -y ufw 185ufw allow ssh 186ufw allow 80/tcp 187ufw allow 443/tcp 188ufw enable 189``` 190## 14. Verify Installation 191```bash 192systemctl status tranquil-pds 193curl -s https://pds.example.com/xrpc/_health | jq 194curl -s https://pds.example.com/.well-known/atproto-did 195``` 196## Maintenance 197View logs: 198```bash 199journalctl -u tranquil-pds -f 200``` 201Update Tranquil PDS: 202```bash 203cd /opt/tranquil-pds 204git pull 205cd frontend && deno task build && cd .. 206cargo build --release 207systemctl stop tranquil-pds 208cp target/release/tranquil-pds /usr/local/bin/ 209cp -r frontend/dist /var/lib/tranquil-pds/frontend 210DATABASE_URL="postgres://tranquil_pds:your-secure-password@localhost:5432/pds" sqlx migrate run 211systemctl start tranquil-pds 212``` 213Backup database: 214```bash 215sudo -u postgres pg_dump pds > /var/backups/pds-$(date +%Y%m%d).sql 216```