AkurAI Build
Menu

Public repository / 66e3647948f2e277afdd6ecd16939de8b6ad525f

AkurAI-Mail / deploy.sh

Latest change 66e3647948f2e277afdd6ecd16939de8b6ad525f - Initial commit: AkurAI Mail UI (SvelteKit+Bun) by Ólafur Búi Ólafsson

#!/usr/bin/env bash
set -euo pipefail

APP_DIR=/opt/akurai-mail-ui
SERVICE=akurai-mail-ui
HEALTH_URL=http://127.0.0.1:3000/
API_URL=http://127.0.0.1:3000/api/actions
PUBLIC_URL=http://mail.olibuijr.com/

cd "$APP_DIR"
VERSION=$(tr -d "\n" < VERSION)
echo "Deploying AkurAI Webmail Service $VERSION"
BACKUP_PATH=$("$APP_DIR/backup.sh")
echo "Backup: $BACKUP_PATH"

/home/ubuntu/.bun/bin/bun install --frozen-lockfile
/home/ubuntu/.bun/bin/bun run check
/home/ubuntu/.bun/bin/bun run build

sudo install -d -o ubuntu -g ubuntu /var/lib/akurai-mail
if [ ! -s /var/lib/akurai-mail/state.json ]; then
  printf '{"domain":"olibuijr.com","hostname":"mail.olibuijr.com","publicIp":"3.94.46.219","users":[],"aliases":[],"events":[],"metricsHistory":[]}\n' | sudo tee /var/lib/akurai-mail/state.json >/dev/null
fi
sudo chown ubuntu:ubuntu /var/lib/akurai-mail/state.json
sudo usermod -aG dovecot ubuntu
sudo usermod -aG mail ubuntu
sudo chown -R vmail:mail /var/vmail
sudo find /var/vmail -type d -exec chmod 2770 {} +
sudo find /var/vmail -type f -exec chmod 0660 {} +
echo "ubuntu ALL=(root) NOPASSWD: /usr/local/sbin/akurai-mail-server *" | sudo tee /etc/sudoers.d/akurai-mail-server >/dev/null
sudo chmod 0440 /etc/sudoers.d/akurai-mail-server
sudo install -m 755 scripts/akurai-mail-server /usr/local/sbin/akurai-mail-server
sudo install -m 755 backup.sh /usr/local/sbin/akurai-mail-backup
sudo install -m 755 rollback.sh /usr/local/sbin/akurai-mail-rollback
sudo systemctl daemon-reload
sudo systemctl restart "$SERVICE"
sleep 1
systemctl is-active --quiet "$SERVICE"

SERVICE_FILE=/etc/systemd/system/${SERVICE}.service
ADMIN_USER=$(awk -F= '$1 == "Environment" && $2 == "AKURAI_ADMIN_USER" {print substr($0, index($0, $3))}' "$SERVICE_FILE")
ADMIN_PASSWORD=$(awk -F= '$1 == "Environment" && $2 == "AKURAI_ADMIN_PASSWORD" {print substr($0, index($0, $3))}' "$SERVICE_FILE")

COOKIE_JAR=$(mktemp)
trap 'rm -f "$COOKIE_JAR"' EXIT
UNAUTH_CODE=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "$HEALTH_URL")
LOGIN_CODE=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 http://127.0.0.1:3000/login)
AUTH_REDIRECT_CODE=$(curl -s -c "$COOKIE_JAR" -o /dev/null -w "%{http_code}" --max-time 10 -X POST -H "Origin: http://127.0.0.1:3000" http://127.0.0.1:3000/login --data-urlencode "email=$ADMIN_USER" --data-urlencode "password=$ADMIN_PASSWORD")
AUTH_CODE=$(curl -s -b "$COOKIE_JAR" -o /dev/null -w "%{http_code}" --max-time 10 "$HEALTH_URL")
WEBMAIL_CODE=$(curl -s -b "$COOKIE_JAR" -o /dev/null -w "%{http_code}" --max-time 10 http://127.0.0.1:3000/webmail)
API_CODE=$(curl -s -b "$COOKIE_JAR" -o /dev/null -w "%{http_code}" --max-time 10 "$API_URL")

if [ "$UNAUTH_CODE" != "303" ]; then
  echo "Expected unauthenticated health check to return 303, got $UNAUTH_CODE" >&2
  exit 1
fi
if [ "$LOGIN_CODE" != "200" ]; then
  echo "Expected login screen to return 200, got $LOGIN_CODE" >&2
  exit 1
fi
if [ "$AUTH_REDIRECT_CODE" != "200" ]; then
  echo "Expected login POST action to return 200 with session cookie, got $AUTH_REDIRECT_CODE" >&2
  exit 1
fi
if [ "$AUTH_CODE" != "200" ]; then
  echo "Expected authenticated health check to return 200, got $AUTH_CODE" >&2
  exit 1
fi
if [ "$WEBMAIL_CODE" != "200" ]; then
  echo "Expected authenticated webmail check to return 200, got $WEBMAIL_CODE" >&2
  exit 1
fi
if [ "$API_CODE" != "405" ]; then
  echo "Expected API GET method guard to return 405, got $API_CODE" >&2
  exit 1
fi

sudo nginx -t >/dev/null
systemctl is-active --quiet nginx

echo "AkurAI Webmail Service $VERSION deployed"
echo "Local:  $HEALTH_URL"
echo "Public: $PUBLIC_URL"