nkbmusic/server/install.sh
metatroncubeswdev 178d2d00ab Nanga Kathai: Flutter app, self-hosted backend and song tools
- Flutter app (Android/iOS): home, explore, albums, search, player with
  equalizer, mini player, sign up/sign in with email codes, profile,
  encrypted offline downloads, About page
- server/: one-command deploy of self-hosted Supabase behind HestiaCP/nginx
  (or Caddy), migrations, backups, email templates
- supabase/migrations: schema, row-level security, profiles
- tools/: song scanner and importer

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 10:39:26 -04:00

97 lines
3.5 KiB
Bash

#!/bin/sh
# Sets up the Nanga Kathai backend (self-hosted Supabase) on a Linux server.
#
# Usage: sh install.sh <domain> [install-dir]
# e.g. sh install.sh app.nkbmusic.com
#
# NK_PROXY=external (default): the server's nginx/HestiaCP proxies https://<domain>
# to 127.0.0.1:${API_GW_HTTP_PORT:-18000}.
# NK_PROXY=caddy: nothing else uses ports 80/443; Caddy gets the certificate itself.
#
# Needs: git, docker with the compose plugin (v2.24+), and DNS for <domain> pointing at this server.
set -eu
SUPABASE_REF="self-hosted/v0.8.3" # pinned; upgrade later with the project's update.sh
DOMAIN="${1:-}"
TARGET="${2:-$HOME/nk-backend}"
NK_PROXY="${NK_PROXY:-external}"
API_GW_HTTP_PORT="${API_GW_HTTP_PORT:-18000}"
HERE="$(cd "$(dirname "$0")" && pwd)"
if [ -z "$DOMAIN" ]; then
echo "Usage: sh install.sh <domain> [install-dir]" >&2
exit 1
fi
for cmd in git docker; do
command -v "$cmd" >/dev/null 2>&1 || {
echo "Missing '$cmd'. Install Docker with: curl -fsSL https://get.docker.com | sh" >&2
exit 1
}
done
docker compose version >/dev/null 2>&1 || { echo "Missing the docker compose plugin." >&2; exit 1; }
if [ -e "$TARGET/supabase-project/.env" ]; then
echo "$TARGET/supabase-project already exists; refusing to overwrite its secrets." >&2
exit 1
fi
echo "==> Fetching Supabase $SUPABASE_REF"
mkdir -p "$TARGET"
cd "$TARGET"
rm -rf supabase-src
git clone --filter=blob:none --no-checkout --depth=1 --quiet --branch "$SUPABASE_REF" \
https://github.com/supabase/supabase supabase-src
(cd supabase-src && git sparse-checkout init --cone && git sparse-checkout set docker && git checkout --quiet)
mkdir -p supabase-project
cp -rf supabase-src/docker/. supabase-project
rm -rf supabase-src
cd supabase-project
cp .env.example .env
printf 'ref=%s\n' "$SUPABASE_REF" > .supabase-version
echo "==> Generating secrets and API keys"
sh utils/generate-keys.sh --update-env >/dev/null
sh utils/add-new-auth-keys.sh --update-env >/dev/null
set_env() { # set_env KEY VALUE (replaces the line KEY=...)
sed -i "s|^$1=.*|$1=$2|" .env
}
set_env PROXY_DOMAIN "$DOMAIN"
set_env SUPABASE_PUBLIC_URL "https://$DOMAIN"
set_env API_EXTERNAL_URL "https://$DOMAIN/auth/v1"
set_env SITE_URL "https://$DOMAIN"
set_env DASHBOARD_USERNAME "nkadmin"
grep -q '^API_GW_HTTP_PORT=' .env || echo "API_GW_HTTP_PORT=$API_GW_HTTP_PORT" >> .env
set_env API_GW_HTTP_PORT "$API_GW_HTTP_PORT"
set_env DASHBOARD_PASSWORD "$(LC_ALL=C tr -dc 'A-Za-z0-9' </dev/urandom | head -c 24)"
echo "==> Adding Nanga Kathai config"
mkdir -p nk
cp -r "$HERE/caddy" "$HERE/email-templates" "$HERE/sql" nk/
cp "$HERE/docker-compose.nk.yml" "$HERE/docker-compose.nk-caddy.yml" .
mkdir -p nk/migrations
cp "$HERE/../supabase/migrations/"*.sql nk/migrations/
if [ "$NK_PROXY" = caddy ]; then
sh run.sh config add caddy nk nk-caddy >/dev/null
else
sh run.sh config add nk >/dev/null
fi
echo "==> Pulling images (this downloads a few GB the first time)"
docker compose pull --quiet
cat <<EOF
Done. Installed in: $TARGET/supabase-project
Next steps:
1. Set your email (SMTP) details in .env: SMTP_ADMIN_EMAIL, SMTP_HOST, SMTP_PORT,
SMTP_USER, SMTP_PASS, SMTP_SENDER_NAME (needed for sign-in codes)
2. cd $TARGET/supabase-project && sh run.sh start
3. sh $HERE/apply-migrations.sh $TARGET/supabase-project
4. Reverse proxy (NK_PROXY=external): https://$DOMAIN -> http://127.0.0.1:$API_GW_HTTP_PORT
Admin dashboard: https://$DOMAIN (user: nkadmin, password: DASHBOARD_PASSWORD in .env)
5. App keys: grep -E '^SUPABASE_PUBLISHABLE_KEY=' .env
EOF