#!/bin/sh # Sets up the Nanga Kathai backend (self-hosted Supabase) on a Linux server. # # Usage: sh install.sh [install-dir] # e.g. sh install.sh app.nkbmusic.com # # NK_PROXY=external (default): the server's nginx/HestiaCP proxies https:// # 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 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 [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' Adding Nanga Kathai config" mkdir -p nk cp -r "$HERE/caddy" "$HERE/email-templates" "$HERE/sql" "$HERE/nginx" 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 < 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