atproto user agency toolkit for individuals and groups
1#!/bin/bash
2# Start both p2pds nodes for two-node testing
3# Usage: scripts/start-both.sh [--clean]
4set -e
5
6# Stop previous instances if pid files exist
7bash scripts/stop-both.sh 2>/dev/null || true
8
9# Optionally wipe all data
10if [ "$1" = "--clean" ]; then
11 echo "Cleaning node data..."
12 rm -rf data/pds.db data/pds.db-shm data/pds.db-wal data/blobs data/ipfs
13 rm -rf data-node2/pds.db data-node2/pds.db-shm data-node2/pds.db-wal data-node2/blobs data-node2/ipfs
14 echo "Data wiped (kept .env files)"
15fi
16
17# Build first
18npm run build
19
20# Start node 1 (random port)
21PORT1=$(python3 -c 'import socket; s=socket.socket(); s.bind(("",0)); print(s.getsockname()[1]); s.close()')
22export PORT=$PORT1
23node dist/server.js > /tmp/p2pds-node1.log 2>&1 &
24echo $! > /tmp/p2pds-node1.pid
25echo "$PORT1" > /tmp/p2pds-node1.port
26echo "Node 1 started (pid $!, port $PORT1, log: /tmp/p2pds-node1.log)"
27
28# Start node 2 (random port, different env)
29PORT2=$(python3 -c 'import socket; s=socket.socket(); s.bind(("",0)); print(s.getsockname()[1]); s.close()')
30set -a && source data-node2/.env && set +a
31export PORT=$PORT2
32node dist/server.js > /tmp/p2pds-node2.log 2>&1 &
33echo $! > /tmp/p2pds-node2.pid
34echo "$PORT2" > /tmp/p2pds-node2.port
35echo "Node 2 started (pid $!, port $PORT2, log: /tmp/p2pds-node2.log)"
36
37# Wait for both to be ready
38echo ""
39echo "Waiting for nodes..."
40for node in 1 2; do
41 for i in $(seq 1 30); do
42 if grep -q "P2PDS_READY" "/tmp/p2pds-node${node}.log" 2>/dev/null; then
43 echo "Node $node ready (port $(cat /tmp/p2pds-node${node}.port))"
44 break
45 fi
46 if grep -q "Error:" "/tmp/p2pds-node${node}.log" 2>/dev/null; then
47 echo "Node $node FAILED:"
48 cat "/tmp/p2pds-node${node}.log"
49 break
50 fi
51 sleep 1
52 done
53done
54
55echo ""
56echo "=== NODE 1 (port $PORT1) ==="
57tail -10 /tmp/p2pds-node1.log
58echo ""
59echo "=== NODE 2 (port $PORT2) ==="
60tail -10 /tmp/p2pds-node2.log