f69efb67ad
- Tauri desktop app (apps/desktop) - Python Django API service (services/api) - Deployment scripts and docs
169 lines
5.1 KiB
Bash
169 lines
5.1 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
BASE_DOMAIN="${NETMAKER_BASE_DOMAIN:-nm.101-96-214-81.nip.io}"
|
|
ADMIN_EMAIL="${NETMAKER_ADMIN_EMAIL:-admin@abyssinfo.local}"
|
|
ASSET_PORT="${NETMAKER_ASSET_PORT:-18080}"
|
|
ASSET_DIR="/tmp/netmaker-assets"
|
|
QUICK_SCRIPT="/tmp/nm-quick.sh"
|
|
|
|
echo "[AbyssInfo] Deploying Netmaker CE"
|
|
echo "[AbyssInfo] Base domain: ${BASE_DOMAIN}"
|
|
|
|
if [[ "$(id -u)" != "0" ]]; then
|
|
echo "[AbyssInfo] Please run as root." >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ ! -f "${QUICK_SCRIPT}" ]]; then
|
|
echo "[AbyssInfo] Missing ${QUICK_SCRIPT}" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ ! -d "${ASSET_DIR}" ]]; then
|
|
echo "[AbyssInfo] Missing ${ASSET_DIR}" >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "[AbyssInfo] Installing Netmaker quick-install dependencies ..."
|
|
dnf install -y wget jq bind-utils gawk wireguard-tools python3
|
|
|
|
echo "[AbyssInfo] Ensuring Docker is running ..."
|
|
mkdir -p /etc/docker
|
|
cat >/etc/docker/daemon.json <<'JSON'
|
|
{
|
|
"registry-mirrors": [
|
|
"https://docker.1ms.run",
|
|
"https://docker.m.daocloud.io",
|
|
"https://hub-mirror.c.163.com"
|
|
]
|
|
}
|
|
JSON
|
|
systemctl daemon-reload
|
|
systemctl restart docker
|
|
systemctl enable --now docker
|
|
|
|
echo "[AbyssInfo] Stopping Nginx to free ports 80/443 for Netmaker Caddy ..."
|
|
systemctl disable --now nginx 2>/dev/null || true
|
|
|
|
health_check() {
|
|
local dashboard_url="https://dashboard.${BASE_DOMAIN}"
|
|
|
|
if [[ ! -f /root/netmaker/docker-compose.yml ]]; then
|
|
echo "[AbyssInfo] Missing /root/netmaker/docker-compose.yml" >&2
|
|
return 1
|
|
fi
|
|
|
|
echo "[AbyssInfo] Netmaker containers:"
|
|
(cd /root/netmaker && docker compose ps)
|
|
|
|
echo "[AbyssInfo] Checking dashboard endpoint: ${dashboard_url}"
|
|
curl -kfsSI --connect-timeout 15 "${dashboard_url}" >/dev/null
|
|
}
|
|
|
|
apply_internal_only_defaults() {
|
|
local env_file="/root/netmaker/netmaker.env"
|
|
if [[ ! -f "${env_file}" ]]; then
|
|
return 0
|
|
fi
|
|
|
|
echo "[AbyssInfo] Applying internal-only Netmaker client defaults ..."
|
|
python3 - <<'PY'
|
|
from pathlib import Path
|
|
|
|
env_path = Path("/root/netmaker/netmaker.env")
|
|
values = {}
|
|
order = []
|
|
for line in env_path.read_text(encoding="utf-8").splitlines():
|
|
if not line or line.startswith("#") or "=" not in line:
|
|
continue
|
|
key, value = line.split("=", 1)
|
|
if key not in values:
|
|
order.append(key)
|
|
values[key] = value
|
|
|
|
for key, value in {
|
|
"DNS_MODE": "off",
|
|
"MANAGE_DNS": "false",
|
|
}.items():
|
|
if key not in values:
|
|
order.append(key)
|
|
values[key] = value
|
|
|
|
env_path.write_text("\n".join(f"{key}={values[key]}" for key in order) + "\n", encoding="utf-8")
|
|
PY
|
|
}
|
|
|
|
if [[ "${NETMAKER_FORCE_REINSTALL:-0}" == "1" ]]; then
|
|
echo "[AbyssInfo] Force reinstall requested. Removing previous Netmaker deployment ..."
|
|
if [[ -f /root/netmaker/docker-compose.yml ]]; then
|
|
(cd /root/netmaker && docker compose down --volumes || true)
|
|
fi
|
|
rm -rf /root/netmaker /etc/netmaker /etc/netclient
|
|
elif [[ -f /root/netmaker/docker-compose.yml ]]; then
|
|
echo "[AbyssInfo] Existing Netmaker deployment found. Starting services and running health check ..."
|
|
apply_internal_only_defaults
|
|
(cd /root/netmaker && docker compose up -d)
|
|
if health_check; then
|
|
echo "[AbyssInfo] Existing Netmaker deployment is healthy."
|
|
echo "[AbyssInfo] URLs:"
|
|
echo " Dashboard: https://dashboard.${BASE_DOMAIN}"
|
|
echo " API: https://api.${BASE_DOMAIN}"
|
|
echo " Broker: wss://broker.${BASE_DOMAIN}"
|
|
exit 0
|
|
fi
|
|
|
|
echo "[AbyssInfo] Existing deployment is not healthy. Set NETMAKER_FORCE_REINSTALL=1 to rebuild it." >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "[AbyssInfo] Preparing quick installer ..."
|
|
mkdir -p /root
|
|
cp "${QUICK_SCRIPT}" /root/nm-quick.sh
|
|
chmod +x /root/nm-quick.sh
|
|
|
|
# Use uploaded cached assets instead of pulling compose files from GitHub on the server.
|
|
sed -i "s|local BASE_URL=\"https://raw.githubusercontent.com/gravitl/netmaker/\$BRANCH\"|local BASE_URL=\"http://127.0.0.1:${ASSET_PORT}\"|g" /root/nm-quick.sh
|
|
|
|
echo "[AbyssInfo] Starting temporary local asset server ..."
|
|
pkill -f "python3 -m http.server ${ASSET_PORT}" 2>/dev/null || true
|
|
cd "${ASSET_DIR}"
|
|
python3 -m http.server "${ASSET_PORT}" --bind 127.0.0.1 >/tmp/abyssinfo-netmaker-assets.log 2>&1 &
|
|
ASSET_PID=$!
|
|
trap 'kill ${ASSET_PID} 2>/dev/null || true' EXIT
|
|
sleep 2
|
|
curl -fsS "http://127.0.0.1:${ASSET_PORT}/compose/docker-compose.yml" >/dev/null
|
|
|
|
echo "[AbyssInfo] Running Netmaker quick installer ..."
|
|
cd /root
|
|
export NM_DOMAIN="${BASE_DOMAIN}"
|
|
export NM_EMAIL="${ADMIN_EMAIL}"
|
|
export NM_SKIP_DEPS=1
|
|
|
|
# Input sequence for nm-quick CE:
|
|
# 1 = use auto/generated domain, email, y = confirm settings.
|
|
set +e
|
|
printf "1\n%s\ny\n" "${ADMIN_EMAIL}" | /root/nm-quick.sh -c
|
|
QUICK_EXIT=$?
|
|
set -e
|
|
|
|
echo "[AbyssInfo] Netmaker files:"
|
|
ls -la /root/netmaker
|
|
|
|
if ! health_check; then
|
|
echo "[AbyssInfo] Netmaker health check failed after quick installer exit code ${QUICK_EXIT}." >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ "${QUICK_EXIT}" != "0" ]]; then
|
|
echo "[AbyssInfo] Quick installer exited with ${QUICK_EXIT}, but Netmaker services are healthy. Continuing."
|
|
fi
|
|
|
|
apply_internal_only_defaults
|
|
(cd /root/netmaker && docker compose up -d)
|
|
|
|
echo "[AbyssInfo] URLs:"
|
|
echo " Dashboard: https://dashboard.${BASE_DOMAIN}"
|
|
echo " API: https://api.${BASE_DOMAIN}"
|
|
echo " Broker: wss://broker.${BASE_DOMAIN}"
|