Monorepo for Aesthetic.Computer
aesthetic.computer
1#!/usr/bin/env fish
2# Silo Deployment Script
3# Deploys the Silo data dashboard to DigitalOcean droplet
4#
5# Usage:
6# fish deploy.fish # Full deploy (server + dashboard, restarts service)
7# fish deploy.fish --dash # Dashboard-only (uploads HTML, SIGHUP reload, zero downtime)
8
9set RED '\033[0;31m'
10set GREEN '\033[0;32m'
11set YELLOW '\033[1;33m'
12set NC '\033[0m'
13
14set SCRIPT_DIR (dirname (status --current-filename))
15set VAULT_DIR "$SCRIPT_DIR/../aesthetic-computer-vault"
16set SSH_KEY "$VAULT_DIR/home/.ssh/id_rsa"
17set SERVICE_ENV "$VAULT_DIR/silo/.env"
18set SILO_HOST "silo.aesthetic.computer"
19set SILO_USER "root"
20set REMOTE_DIR "/opt/silo"
21
22set DASH_ONLY false
23if contains -- --dash $argv
24 set DASH_ONLY true
25end
26
27# Check for required files
28if not test -f $SSH_KEY
29 echo -e "$RED x SSH key not found: $SSH_KEY$NC"
30 exit 1
31end
32
33if not test -f $SERVICE_ENV; and test $DASH_ONLY = false
34 echo -e "$RED x Service env not found: $SERVICE_ENV$NC"
35 exit 1
36end
37
38# Test SSH connection
39echo -e "$GREEN-> Testing SSH connection to $SILO_HOST...$NC"
40if not ssh -i $SSH_KEY -o StrictHostKeyChecking=no -o ConnectTimeout=10 $SILO_USER@$SILO_HOST "echo ok" &>/dev/null
41 echo -e "$RED x Cannot connect to $SILO_HOST$NC"
42 exit 1
43end
44echo -e "$GREEN Connected.$NC"
45
46if test $DASH_ONLY = true
47 # Dashboard-only deploy: upload HTML, send SIGHUP (no restart)
48 echo -e "$GREEN-> Uploading dashboard.html (zero-downtime)...$NC"
49 scp -i $SSH_KEY -o StrictHostKeyChecking=no \
50 $SCRIPT_DIR/dashboard.html \
51 $SILO_USER@$SILO_HOST:$REMOTE_DIR/
52
53 ssh -i $SSH_KEY $SILO_USER@$SILO_HOST "
54 chown silo:silo $REMOTE_DIR/dashboard.html
55 kill -HUP \$(systemctl show -p MainPID --value silo)
56 "
57 echo -e "$GREEN Dashboard reloaded (SIGHUP). No restart needed.$NC"
58else
59 # Full deploy: upload all files + restart
60 echo -e "$GREEN-> Uploading silo files...$NC"
61 scp -i $SSH_KEY -o StrictHostKeyChecking=no \
62 $SCRIPT_DIR/server.mjs \
63 $SCRIPT_DIR/dashboard.html \
64 $SCRIPT_DIR/package.json \
65 $SCRIPT_DIR/package-lock.json \
66 $SILO_USER@$SILO_HOST:$REMOTE_DIR/
67
68 # Upload production .env from vault
69 scp -i $SSH_KEY -o StrictHostKeyChecking=no \
70 $SERVICE_ENV $SILO_USER@$SILO_HOST:$REMOTE_DIR/.env
71
72 # Fix ownership, install deps if needed, restart
73 echo -e "$GREEN-> Installing dependencies & restarting...$NC"
74 ssh -i $SSH_KEY $SILO_USER@$SILO_HOST "
75 chown -R silo:silo $REMOTE_DIR
76 cd $REMOTE_DIR && npm install --production --silent 2>&1 | tail -1
77 systemctl restart silo
78 sleep 2
79 systemctl is-active silo
80 "
81
82 set STATUS $status
83 if test $STATUS -eq 0
84 echo -e "$GREEN Silo is running.$NC"
85 else
86 echo -e "$RED x Silo failed to start. Check logs:$NC"
87 echo -e "$YELLOW ssh -i $SSH_KEY $SILO_USER@$SILO_HOST journalctl -u silo -n 30$NC"
88 exit 1
89 end
90end
91
92echo ""
93echo -e "$GREEN Done. Silo deployed to https://$SILO_HOST$NC"