Files

96 lines
3.3 KiB
Bash
Executable File

#!/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}
chown -R 1000:1000 "$DATA_ROOT"/gitea
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
# ------------------------------------------------------------------
# Lock down .env files (readable only by root)
# ------------------------------------------------------------------
echo "==> Securing .env files..."
for envfile in "$REPO_ROOT"/.env "$REPO_ROOT"/*/.env; do
[ -f "$envfile" ] && chmod 600 "$envfile" && chown root:root "$envfile"
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 -> <VPS_IP>"
echo " git.t-gstone.de -> <VPS_IP>"