#!/usr/bin/env bash set -euo pipefail set -x # Root check if [[ "$EUID" -ne 0 ]]; then echo "This script must be run as root. Try: sudo bash $0" exit 1 fi # OS check if [[ -x "$(command -v apt)" ]]; then OS_ID=$(grep '^ID=' /etc/os-release | cut -d= -f2 | tr -d '"') if [[ "$OS_ID" != "debian" && "$OS_ID" != "ubuntu" ]]; then echo "Unsupported OS: $OS_ID. This script only supports Debian or Ubuntu." exit 1 fi else echo "This script requires apt. Are you on a Debian/Ubuntu system?" exit 1 fi # Install essential dependencies apt-get update REQUIRED_PACKAGES=(figlet curl git gnupg lsb-release ca-certificates lolcat) for pkg in "${REQUIRED_PACKAGES[@]}"; do if ! dpkg -s "$pkg" &>/dev/null; then echo "Installing missing package: $pkg" apt-get install -y "$pkg" fi done # Banner echo 'ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEBAQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICAgICAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAgICAgICAgICMrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAgICAgICAgICBAKys9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEAgICAgICAuQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQEBAICAgICAgICAgICBAOiAgICAgICAgIEArKystPT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQCAgICAgICAgQCsrPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAgICAgIEAgICAgICAgIEAgICAgICAgICBAIysrLT09Oj09IyAgICAgICAgICAgICAgICAgICAgICAgICAgQEAgICAgICAgICVAKys9PT0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAKyAgICAgIEArKz0gICAgQEAgICAgICAgICtAKytAQEBAIz0tKyMlICAgICAgICAgICAgICAgICAgICAgICAgQCAgICAgICAgPUArKystPS0tLSsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBAQEAgICAgICAgQEBAQEBAQEBAICAgICAgICAgQCsrQCAgICAgIEAqIyUgICAgICAgICAgICAgICAgICAgICAgIEAgICAgICAgIC5AKysrLT09Oj0tLSslCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQEBAQEBAQC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAKysrQCAgICAgICBAKz0gICAgICAgICAgICAgICAgICAgICAgQCMgICAgICAgIEArKystPT06PS0tKyMlJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBAKystQCAgICAgIEArKys9PSAgICBAICAgICAgICAgICAgICAgQCAgICAgICAgQCsrKy09PTo9LS0rIyMlCiAgICAgICAgICAgICAgICBAICAgICAgICAgQD0gQEAgICAgICBAQEBAQEA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAKysrLT06QEBAQEArKystLT06PUAgICAgICBAICAgICAgICAgQC4gICAgICAgQCsrKy0tPTo9PS0rIyMlCiAgICAgICAgICAgQC4gICAgICUgICAgICBAKiAgIEArIEBAICAgICAgICAgLUBAQEBAQEBAQCAgICAgICAgIEBAQEAqKytAQCAgICAgICAgQCsrKyVAQEBAQCorKystLT09OkBAICAgICAgICAgQCsgICAgICBAICAgICAgIEBAKystLT06PT0tKyMjJUAKICAgICAgICBAQCAgICAgIEBALiAgICBAIEAgICAgIEAgICAgICAgICAgICAgIEArPS0rQC4gICAgICAgLkArKystLS1AQCAgICAgICAgQCUrK0AjICAgICAgIEA9PTo6OkAgICAgICAgICAgICBAKz09ICBALiAgICAgIC46ICAgIEArOj0tKysjJUAgIC1ACiAgICAgQC4gICAgICAgQEBAICAgICAgQCsgICAgICAgICAgICpAQCAgICAgICBAKz1AQCAgICAgICAgQCsrKy09PUBAICAgICAgICA6QCsrPUAgICAgICAgLkArKz0jQCAgICAgICAgICAgICA6Kis9OkBAICAgICAgICAgICAgICBAKysrKyNAQCAgICAgQCs9CiAgICBAICAgICAgIEBALiAgICAgICBAICAgICAgICAgICA9QEBAICAgICAgIEArQEAgICAgICAgIEArKystPT1AQCAgICAgICAgIEArKytAICAgICAgICBAKysrQEAgICAgICAgLSMgICAgICBAK0BAICAgICAgICAgICAgICAgIEArKytAQCAgICAgIEBAKys9PQogICBAQCAgICAgQEAgICAgICAgIEBAICAgICAgICAgICBAICAgICAgICAgQCtAQCAgICAgICAgQCMrKy0tPSVAICAgICAgICAgQCsrK0AgICAgICAgIEBAKytAICAgICAgICBAQEAgICAgICAgQCAgICAgICAgICAgICAgICAgIEArKkAgICAgICAgQEArKz0tPTo9KwogIEAgICAgIEBAICAgICAgICAtQCAgICAgICAgICAgICAgICAgICAgIEArQC4gICAgICAgIDpAKys9LT0lQCAgICAgICAgICVAK0AqICAgICAgICAgQCtAQCAgICAgICAgQCsrK0AgICAgICAgICAgICAgICAgICAgICAgICA6QEAgICAgICAgIEArKystLT06Oj0tKyUKIEAgICAgICAgICAgICAgICBAIyAgICAgICAgICAgICAgICAgIEBAI0BAICAgICAgICAgIEArKystPUAjICAgICAgICAgIEBAOiAgICAgICAgICAgQEAgICAgICAgICBAKysrLUAgICAgICAgICAgICAgICAgICAgICAgICAlICAgICAgICAgQCsrKy0tPTo6PS0tKyMlCkAgICAgICAgICAgICAgICBAICAgICAgICAgICAgIEArKytAQEBAICAgICAgICAgICAgQCsrKy1AQCAgICAgICAgICAgICAgICAgICAgICAgICA6KyAgICAgICBAICAgIEBAQCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICtAKysrLS09Ojo9LT0rIyUlCkAgICAgICAgOiAgICAgICAgICAgICBAQCAgICAgICAgICAgICAgICAgLkBAICAgICAgQEBAQCAgICAgICAgICAgICAgICAgICAgQEAgICAgICAgICAgICAgQCtAICAgICAgICAgICAgICAgQDogICAgICA9QEAgICAgICAgICAgICBAQCsrKy09PTo9PS0rKyMlJQogQCAgICBAQEAgICAgICAgICAgIEAqK0AgICAgICAgICAgICAgICVAKysrQCAgICAgICAgICAgICAgICAgICAgICAgICAgIEBAKytALiAgICAgICAgICBAKysrQCAgICAgICAgICAgIDpAK0AgICAgICVAK0AgICAgICAgICAgLkArKys9LT09Oj09LSsrIyUlCiAgICsrKysrLUAgICAgICAgQEArKystLUBAICAgICAgICArQEArKysrLS09QCAgICAgICAgIC4lICAgICAgICAgICAuQEArKysrLT1AKyAgICAgICBAIysrLS09I0AgICAgICAgQEArKysrQCAgICBAKysrLUAgICAgICA6QCorKystLT06Oj0tLSsjIyUKICAgID09PT09OjpAQEBAKisrKystPT06Oj0rQEBAQCUrKysrKy0tPT0tOj09QCUgICAgQEBAICAgICAgICVAICAgIEArKy0tPT06Oj09K0BAQEAjKysrLS09Oi09LSsrQEAjKysrKystLT09OisrKysrLT09OitAQEAjKysrKy0tPT06PT0tPSsjIyUKICAgICAgPT09PS09PT0tLS0tPT0tOj09LSsrIz09LS0tLT09PT06Oj09LS0rKyMrKysrK0AgICAgICAgQEAgICAgIEArPT06Oj09LS0rKiM9PS0tLS09PTo6PS0rKyMlPT09LS09PT06Oj09LS09PT09PTo9LS0rPS0tLS09PT06LT0tLSsrIyUlCiAgICAgICAlIyojIyUlPT0tOj09PS0tKyojJSUgPT09LT09PT09LS0rKyMjJSUlID09I0AgICAgICAtQEAgICAgICBAKys9PS0rKyojJSUgID09PS0tPT09LSsrIyUlICArPT09PT09PS0tKysjIyU9PT09LSsjJSU9PT0tPT09LS0rKyMjJQogICAgICAgICAgICAgICAlKysrKysjIyUlICAgICAlKisrKysrKyMjIyUlICAgICAgQCogICAgICBAK0AgICAgICBAKystPT0rIyUlICAgICAgJSorKysrKyMjJSUgICAgICUlKysrKysjIyUlICAgICUrKyMjJSAgICArKysrKyojIyUlCiAgICAgICAgICAgICAgICAgJSUlJSUgICAgICAgICAgICUlJSUlICAgICAgICAgICBAICAgICAgQEAgICAgICAgQCsrPT06PSslICAgICAgICAgICAlJSUlJSAgICAgICAgICAgICUlJSAgICAgICAgICAgICAgICAgICAgJSUlJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICAgICAgQEAgICAgICAgQCsrKz09PS0rJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICBAICAgICAgICBAKystPT06PT0qJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAuICAgICAgICAgICAgQCMrKy09Oj09LSslCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgICAgICAgICAgQEArKz0tPTo9LSsrJSUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEAgICAgICAgQEArKystPTo6PS0rIyUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQCVAQEArKys9LT09Oj0tLSsjJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKysrKy0tPT06Oj0tLSsjJSUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PT06Ojo9PS09KyMlJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKystLSsrIyMlJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUlJSUlJQ==' | base64 --decode | lolcat echo "Starting setup for Wetfish production environment" # Install Docker if missing if ! command -v docker &> /dev/null; then echo "Installing Docker..." install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/$OS_ID/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg chmod a+r /etc/apt/keyrings/docker.gpg echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/$OS_ID \ $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null apt-get update apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin else echo "Docker is already installed." fi # Create traefik-backend network if missing if ! docker network inspect traefik-backend &> /dev/null; then docker network create traefik-backend else echo "Docker network traefik-backend already exists." fi # Clone repo cd /opt REPO_DIR="/opt/production-manifests" if [[ ! -d "$REPO_DIR" ]]; then git clone \ --branch main \ --single-branch \ --recursive \ --recurse-submodules \ https://github.com/cybaxx/web-services-cybaxx.git \ "$REPO_DIR" else echo "Repo already exists at $REPO_DIR" fi # Start Traefik stack cd "$REPO_DIR/traefik" docker compose up -d echo "Waiting 60 seconds for Traefik to acquire certificates..." sleep 60 # Start all services cd "$REPO_DIR" bash ./init-servivces.sh up