#!/usr/bin/env bash set -euo pipefail REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" # ------------------------------------------------------------------ # Load config (safe parser — only loads KEY=VALUE lines) # ------------------------------------------------------------------ if [ ! -f "$REPO_ROOT/.env" ]; then echo "ERROR: $REPO_ROOT/.env not found. Copy .env.example and fill in values." exit 1 fi set -a eval "$(grep -v '^#' "$REPO_ROOT/.env" | grep -v '^$' | grep '^[A-Za-z_][A-Za-z_0-9]*=' )" set +a # Validate required variables for var in DOMAIN DATA_ROOT; do if [ -z "${!var:-}" ]; then echo "ERROR: $var is not set in .env" exit 1 fi done echo "==> VPS info:" cat /etc/os-release echo "" # ------------------------------------------------------------------ # Install Docker if not present # ------------------------------------------------------------------ if ! command -v docker &>/dev/null; then echo "==> Installing Docker..." curl -fsSL https://get.docker.com | sh systemctl enable --now docker echo "==> Docker installed." else echo "==> Docker already installed: $(docker --version)" fi # Ensure docker compose plugin is available if ! docker compose version &>/dev/null; then echo "ERROR: docker compose plugin not found. Install it manually." exit 1 fi # ------------------------------------------------------------------ # Create shared Docker network # ------------------------------------------------------------------ if ! docker network inspect proxy &>/dev/null 2>&1; then echo "==> Creating 'proxy' Docker network..." docker network create proxy else echo "==> 'proxy' network already exists." fi # ------------------------------------------------------------------ # Create data directories # ------------------------------------------------------------------ echo "==> Creating data directories under $DATA_ROOT..." mkdir -p "$DATA_ROOT"/{caddy/data,caddy/config} mkdir -p "$DATA_ROOT"/{nextcloud/html,nextcloud/data,nextcloud/db} mkdir -p "$DATA_ROOT"/{gitea/data,gitea/config} mkdir -p /opt/backups # ------------------------------------------------------------------ # Check .env files exist for each service # ------------------------------------------------------------------ for svc in nextcloud gitea monitoring; do if [ ! -f "$REPO_ROOT/$svc/.env" ]; then echo "WARNING: $svc/.env not found. Copy $svc/.env.example and fill in values." fi done # ------------------------------------------------------------------ # Start all stacks # ------------------------------------------------------------------ echo "==> Pulling and starting all services..." docker compose --env-file "$REPO_ROOT/.env" --project-directory "$REPO_ROOT" pull docker compose --env-file "$REPO_ROOT/.env" --project-directory "$REPO_ROOT" up -d echo "" echo "==> All services started. Verify with: docker ps" echo "==> DNS A records required:" echo " nextcloud.t-gstone.de -> " echo " git.t-gstone.de -> "