Skip to main content

max / multithreaded

4.7 KB · 157 lines History Blame Raw
1 #!/bin/bash
2 # Multithreaded Deployment Script
3 # Builds natively on astra (aarch64), deploys to /opt/multithreaded.
4 # Run from the multithreaded project root.
5 #
6 # Usage:
7 # ./deploy/deploy.sh # Build + deploy + restart
8 # ./deploy/deploy.sh --setup # First-time: create user, dirs, db, build, install, seed
9
10 set -e
11
12 # Configuration
13 SERVER="max@100.106.221.39"
14 REMOTE_DIR="/opt/multithreaded"
15 SRC_DIR="src/multithreaded"
16 BINARY_NAME="multithreaded"
17 DEPLOY_DIR="deploy"
18
19 # Check we're in the right directory
20 if [ ! -f "Cargo.toml" ] || ! grep -q 'name = "multithreaded"' Cargo.toml; then
21 echo "Error: Run this script from the MNW/multithreaded/ directory"
22 exit 1
23 fi
24
25 rsync_source() {
26 echo "[rsync] Uploading source to $SERVER:~/$SRC_DIR/..."
27 ssh $SERVER "mkdir -p ~/$SRC_DIR"
28 rsync -az --delete \
29 --exclude target/ \
30 --exclude .env \
31 --exclude .git/ \
32 ./ $SERVER:~/$SRC_DIR/
33
34 # Sync shared dependencies (Cargo.toml references ../../Shared/ from ~/src/multithreaded/)
35 local root
36 root="$(cd ../.. && pwd)"
37 for dep in docengine tagtree s3-storage; do
38 local dep_dir="$root/Shared/$dep"
39 if [ -d "$dep_dir" ]; then
40 echo "[rsync] Syncing shared dep: $dep"
41 ssh $SERVER "mkdir -p ~/Shared/$dep"
42 rsync -az --delete --exclude target --exclude .git \
43 "$dep_dir/" "$SERVER:~/Shared/$dep/"
44 fi
45 done
46 echo "[rsync] Done"
47 }
48
49 build_remote() {
50 echo "[build] Building release on astra..."
51 ssh $SERVER "cd ~/$SRC_DIR && ~/.cargo/bin/cargo build --release 2>&1"
52 echo "[build] Done"
53 }
54
55 deploy_files() {
56 echo "[deploy] Stopping service + copying binary + assets to $REMOTE_DIR..."
57 ssh $SERVER "
58 sudo systemctl stop multithreaded || true
59 sudo cp ~/$SRC_DIR/target/release/$BINARY_NAME $REMOTE_DIR/$BINARY_NAME
60 sudo chmod +x $REMOTE_DIR/$BINARY_NAME
61 sudo rsync -a --delete ~/$SRC_DIR/static/ $REMOTE_DIR/static/
62 sudo rsync -a --delete ~/$SRC_DIR/migrations/ $REMOTE_DIR/migrations/
63 sudo chown -R multithreaded:multithreaded $REMOTE_DIR
64 "
65 echo "[deploy] Done"
66 }
67
68 restart_app() {
69 echo "[restart] Restarting multithreaded..."
70 ssh $SERVER "sudo systemctl restart multithreaded"
71 sleep 2
72 echo ""
73 ssh $SERVER "sudo systemctl status multithreaded --no-pager"
74 echo ""
75 echo "[health] Checking..."
76 ssh $SERVER "curl -s -o /dev/null -w 'HTTP %{http_code}\n' http://127.0.0.1:3400/"
77 }
78
79 first_time_setup() {
80 echo "=== First-Time Setup ==="
81
82 echo "[setup] Creating system user..."
83 ssh $SERVER "
84 sudo useradd --system --shell /usr/sbin/nologin --home-dir $REMOTE_DIR multithreaded 2>/dev/null || echo 'User already exists'
85 "
86
87 echo "[setup] Creating directories..."
88 ssh $SERVER "
89 sudo mkdir -p $REMOTE_DIR
90 sudo chown multithreaded:multithreaded $REMOTE_DIR
91 "
92
93 echo "[setup] Creating database role + database..."
94 ssh $SERVER "
95 sudo -u postgres createuser multithreaded 2>/dev/null || echo 'Role already exists'
96 createdb multithreaded 2>/dev/null || echo 'Database already exists'
97 sudo -u postgres psql -c 'GRANT ALL PRIVILEGES ON DATABASE multithreaded TO multithreaded;' 2>/dev/null
98 sudo -u postgres psql -d multithreaded -c 'GRANT ALL ON SCHEMA public TO multithreaded;' 2>/dev/null
99 "
100
101 rsync_source
102 build_remote
103
104 echo "[setup] Installing files..."
105 deploy_files
106
107 echo "[setup] Installing env file..."
108 ssh $SERVER "
109 sudo cp ~/$SRC_DIR/$DEPLOY_DIR/env.production $REMOTE_DIR/.env
110 sudo chmod 600 $REMOTE_DIR/.env
111 sudo chown multithreaded:multithreaded $REMOTE_DIR/.env
112 "
113
114 echo "[setup] Installing systemd service..."
115 ssh $SERVER "
116 sudo cp ~/$SRC_DIR/$DEPLOY_DIR/multithreaded.service /etc/systemd/system/multithreaded.service
117 sudo systemctl daemon-reload
118 sudo systemctl enable multithreaded
119 "
120
121 echo "[setup] Starting service..."
122 ssh $SERVER "sudo systemctl start multithreaded"
123 sleep 2
124
125 echo "[setup] Running seed..."
126 ssh $SERVER "
127 cd $REMOTE_DIR
128 sudo -u multithreaded $REMOTE_DIR/$BINARY_NAME --seed
129 "
130
131 echo ""
132 ssh $SERVER "sudo systemctl status multithreaded --no-pager"
133 echo ""
134 echo "[health] Checking..."
135 ssh $SERVER "curl -s -o /dev/null -w 'HTTP %{http_code}\n' http://127.0.0.1:3400/"
136 }
137
138 case "${1:-deploy}" in
139 --setup)
140 first_time_setup
141 ;;
142 deploy|"")
143 echo "=== Deploy ==="
144 rsync_source
145 build_remote
146 deploy_files
147 restart_app
148 ;;
149 *)
150 echo "Usage: $0 [--setup]"
151 exit 1
152 ;;
153 esac
154
155 echo ""
156 echo "=== Done ==="
157