85 lines
3.6 KiB
Bash
Executable File
85 lines
3.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# =============================================================================
|
|
# ©AngelaMos | 2026
|
|
# init.sh
|
|
# =============================================================================
|
|
# Idempotent setup helper.
|
|
# 1. Copies .env.example -> .env if .env is missing
|
|
# 2. Generates POSTGRES_PASSWORD and OPERATOR_TOKEN if their values are blank
|
|
# 3. Downloads GeoLite2-City.mmdb when MAXMIND_ACCOUNT_ID + MAXMIND_LICENSE_KEY are set
|
|
#
|
|
# Safe to run repeatedly: skips already-set values and existing mmdb.
|
|
# =============================================================================
|
|
|
|
set -euo pipefail
|
|
|
|
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
ENV_FILE="$DIR/.env"
|
|
EXAMPLE_FILE="$DIR/.env.example"
|
|
DATA_DIR="$DIR/data"
|
|
MMDB_PATH="$DATA_DIR/GeoLite2-City.mmdb"
|
|
|
|
# ── ensure .env exists ────────────────────────────────────────────────────────
|
|
if [[ ! -f "$ENV_FILE" ]]; then
|
|
if [[ ! -f "$EXAMPLE_FILE" ]]; then
|
|
echo "Error: $EXAMPLE_FILE missing — cannot bootstrap .env" >&2
|
|
exit 1
|
|
fi
|
|
cp "$EXAMPLE_FILE" "$ENV_FILE"
|
|
echo " created .env from .env.example"
|
|
fi
|
|
|
|
# ── secret generator ──────────────────────────────────────────────────────────
|
|
gen_secret() {
|
|
local key="$1"
|
|
local current
|
|
current="$(grep -E "^${key}=" "$ENV_FILE" | head -1 | cut -d= -f2- || true)"
|
|
|
|
if [[ -z "$current" ]]; then
|
|
local newval
|
|
newval="$(openssl rand -hex 32)"
|
|
if grep -qE "^${key}=" "$ENV_FILE"; then
|
|
sed -i "s|^${key}=.*|${key}=${newval}|" "$ENV_FILE"
|
|
else
|
|
printf '\n%s=%s\n' "$key" "$newval" >> "$ENV_FILE"
|
|
fi
|
|
echo " generated $key"
|
|
else
|
|
echo " $key already set, skipping"
|
|
fi
|
|
}
|
|
|
|
gen_secret POSTGRES_PASSWORD
|
|
gen_secret OPERATOR_TOKEN
|
|
|
|
# ── geoip database ────────────────────────────────────────────────────────────
|
|
ACCT="$(grep -E "^MAXMIND_ACCOUNT_ID=" "$ENV_FILE" | head -1 | cut -d= -f2- || true)"
|
|
KEY="$(grep -E "^MAXMIND_LICENSE_KEY=" "$ENV_FILE" | head -1 | cut -d= -f2- || true)"
|
|
|
|
if [[ -n "$ACCT" && -n "$KEY" ]]; then
|
|
if [[ ! -f "$MMDB_PATH" ]]; then
|
|
mkdir -p "$DATA_DIR"
|
|
echo " downloading GeoLite2-City.mmdb from MaxMind..."
|
|
tmp_dir="$(mktemp -d)"
|
|
trap 'rm -rf "$tmp_dir"' EXIT
|
|
if curl -sSf -u "$ACCT:$KEY" \
|
|
"https://download.maxmind.com/geoip/databases/GeoLite2-City/download?suffix=tar.gz" \
|
|
-o "$tmp_dir/geolite.tar.gz"; then
|
|
tar -xzf "$tmp_dir/geolite.tar.gz" -C "$tmp_dir" --strip-components=1 \
|
|
"*/GeoLite2-City.mmdb"
|
|
mv "$tmp_dir/GeoLite2-City.mmdb" "$MMDB_PATH"
|
|
echo " GeoLite2-City.mmdb downloaded to $MMDB_PATH"
|
|
else
|
|
echo " Warning: GeoLite2 download failed (check MAXMIND_ACCOUNT_ID and MAXMIND_LICENSE_KEY)" >&2
|
|
fi
|
|
else
|
|
echo " GeoLite2-City.mmdb already present, skipping"
|
|
fi
|
|
else
|
|
echo " MaxMind credentials not set in .env — geolocation will be disabled"
|
|
fi
|
|
|
|
# ── done ──────────────────────────────────────────────────────────────────────
|
|
echo ""
|
|
echo "Setup complete. Edit .env to set PUBLIC_BASE_URL + Turnstile keys, then 'just up'."
|