96 lines
3.3 KiB
Bash
Executable File
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>"
|