2026-02-18 17:15:31 -07:00

114 lines
3.0 KiB
Bash
Executable File

#!/usr/bin/env bash
# =============================================================================
# Bunker Ops — Scaffold a New Instance
# Creates host_vars directory with main.yml + vault.yml for a new instance
#
# Usage: ./scripts/add-instance.sh <hostname> <domain> <ssh-host> [--tier 0|1|2]
# =============================================================================
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
INVENTORY_DIR="${PROJECT_DIR}/inventory/host_vars"
# --- Parse args ---
HOSTNAME="${1:-}"
DOMAIN="${2:-}"
SSH_HOST="${3:-}"
TIER=1
shift 3 2>/dev/null || true
while [[ $# -gt 0 ]]; do
case "$1" in
--tier) TIER="$2"; shift 2 ;;
*) echo "Unknown option: $1"; exit 1 ;;
esac
done
if [[ -z "$HOSTNAME" ]] || [[ -z "$DOMAIN" ]] || [[ -z "$SSH_HOST" ]]; then
echo "Usage: $0 <hostname> <domain> <ssh-host> [--tier 0|1|2]"
echo ""
echo "Arguments:"
echo " hostname Ansible inventory name (e.g., edmonton-prod)"
echo " domain Instance domain (e.g., betteredmonton.org)"
echo " ssh-host SSH address (e.g., 10.0.1.10 or user@host)"
echo ""
echo "Options:"
echo " --tier N Bunker Ops tier (0=standalone, 1=managed, 2=fleet)"
echo ""
echo "Examples:"
echo " $0 edmonton-prod betteredmonton.org 10.0.1.10"
echo " $0 calgary-staging staging.bettercalgary.org deploy@10.0.2.20 --tier 2"
exit 1
fi
HOST_DIR="${INVENTORY_DIR}/${HOSTNAME}"
if [[ -d "$HOST_DIR" ]]; then
echo "ERROR: Host directory already exists: ${HOST_DIR}"
echo "Remove it first if you want to recreate."
exit 1
fi
# --- Determine Bunker Ops settings ---
BUNKER_OPS_ENABLED="false"
if [[ "$TIER" == "2" ]]; then
BUNKER_OPS_ENABLED="true"
fi
MONITORING_ENABLED="false"
if [[ "$TIER" -ge 1 ]]; then
MONITORING_ENABLED="true"
fi
# --- Create main.yml ---
mkdir -p "$HOST_DIR"
cat > "${HOST_DIR}/main.yml" << EOF
---
# Instance: ${HOSTNAME}
# Domain: ${DOMAIN}
# Tier: ${TIER}
cml_domain: ${DOMAIN}
cml_node_env: production
# Feature toggles
cml_enable_media: "false"
cml_listmonk_sync_enabled: "false"
cml_gancio_sync_enabled: "false"
cml_email_test_mode: "true"
cml_monitoring_enabled: ${MONITORING_ENABLED}
# SMTP (update for production email)
cml_smtp_host: mailhog-changemaker
cml_smtp_port: 1025
cml_smtp_user: ""
# Pangolin tunnel (configure after setup)
cml_pangolin_api_url: "https://api.bnkserve.org/v1"
cml_pangolin_org_id: ""
# Bunker Ops
bunker_ops_enabled: ${BUNKER_OPS_ENABLED}
bunker_ops_instance_label: "${DOMAIN}"
bunker_ops_remote_write_url: ""
EOF
echo "Created: ${HOST_DIR}/main.yml"
# --- Generate vault ---
"${SCRIPT_DIR}/bootstrap-vault.sh" "$HOSTNAME" --domain "$DOMAIN"
# --- Append to hosts.yml reminder ---
echo ""
echo "Add to inventory/hosts.yml under changemaker_instances:"
echo ""
echo " ${HOSTNAME}:"
echo " ansible_host: ${SSH_HOST}"
echo " ansible_user: deploy"
echo " cml_domain: ${DOMAIN}"
echo ""
echo "Then deploy:"
echo " ansible-playbook playbooks/deploy.yml --limit ${HOSTNAME}"