Flake to setup a local env for atproto development
1{ pkgs }:
2
3pkgs.writeShellScriptBin "pds" ''
4 set -e
5
6 # Default port for bluesky-pds
7 PORT=''${BLUESKY_PDS_PORT:-3000}
8
9 # Create data directories
10 mkdir -p ./data/pds/blocks
11 mkdir -p ./data/pds/db
12
13 echo "Starting Bluesky PDS on port $PORT..."
14 echo "Data directory: ./data/pds"
15
16 # Configure for local disk storage
17 export PDS_DATA_DIRECTORY="./data/pds"
18 export PDS_BLOBSTORE_DISK_LOCATION="./data/pds/blocks"
19 export PDS_DB_SQLITE_LOCATION="./data/pds/db/pds.sqlite"
20 export PDS_PORT="$PORT"
21
22 # Generate or use existing PLC rotation key
23 if [ ! -f "./data/pds/plc-rotation-key.txt" ]; then
24 echo "Generating PLC rotation key..."
25 ${pkgs.openssl}/bin/openssl rand -hex 32 > ./data/pds/plc-rotation-key.txt
26 fi
27 export PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX="$(cat ./data/pds/plc-rotation-key.txt)"
28
29 # Generate or use existing JWT secret
30 if [ ! -f "./data/pds/jwt-secret.txt" ]; then
31 echo "Generating JWT secret..."
32 ${pkgs.openssl}/bin/openssl rand -hex 32 > ./data/pds/jwt-secret.txt
33 fi
34 export PDS_JWT_SECRET="$(cat ./data/pds/jwt-secret.txt)"
35
36 # Set admin password
37 export PDS_ADMIN_PASSWORD="admin"
38
39 # Set hostname and URL scheme (using example.org domain)
40 export PDS_HOSTNAME="pds.example.org:8443"
41 export PDS_SERVICE_URL="https://pds.example.org:8443"
42
43 # Configure supported handle domains
44 export PDS_SERVICE_HANDLE_DOMAINS=".pds.example.org"
45
46 # Enable development mode
47 export PDS_DEV_MODE="true"
48
49 # Configure logging
50 export LOG_ENABLED="true"
51
52 # Configure SMTP for MailHog
53 export PDS_EMAIL_SMTP_URL="smtp://localhost:1025"
54 export PDS_EMAIL_FROM_ADDRESS="noreply@pds.example.org"
55
56 # Configure PLC server URL to use local Caddy-proxied server
57 export PDS_DID_PLC_URL="https://plc.example.org:8444"
58
59 ${pkgs.bluesky-pds}/bin/pds
60''