configs/start.sh

144 lines
4.7 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
echo "MY Network Node setup (interactive)"
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
BASE_DIR="$SCRIPT_DIR/.."
ENV_FILE="$BASE_DIR/.env"
EXAMPLE_FILE="$BASE_DIR/.env.example"
if [[ ! -f "$ENV_FILE" ]]; then
if [[ -f "$EXAMPLE_FILE" ]]; then
cp "$EXAMPLE_FILE" "$ENV_FILE"
else
echo "Missing .env.example; cannot continue" >&2
exit 1
fi
fi
# Safe reader for existing values (does not fail under set -e -o pipefail)
ini_val() {
local key="$1"
local val
val=$(awk -F'=' -v k="$key" 'BEGIN{found=0} $1==k{print substr($0, index($0,$2)); found=1} END{ if(!found){} }' "$ENV_FILE" 2>/dev/null || true)
echo -n "$val"
}
read -rp "Node privacy (public/private) [public]: " NODE_PRIVACY
NODE_PRIVACY=${NODE_PRIVACY:-public}
if [[ "$NODE_PRIVACY" != "public" && "$NODE_PRIVACY" != "private" ]]; then
echo "Invalid privacy; defaulting to public"
NODE_PRIVACY=public
fi
# Helper to prompt only if missing in .env
ask_or_keep() {
local key="$1"; shift
local prompt="$1"; shift
local def="$1"; shift || true
local cur
cur=$(ini_val "$key")
if [[ -n "$cur" ]]; then
echo "$key is set in .env; keeping existing value"
eval "$key=\"$cur\""
else
read -rp "$prompt [${def}]: " val || true
val=${val:-$def}
eval "$key=\"$val\""
fi
}
if [[ "$NODE_PRIVACY" == "private" ]]; then
# For private nodes, PUBLIC_HOST optional; only ask if missing
ask_or_keep PUBLIC_HOST "Public host URL (leave empty for private)" ""
else
ask_or_keep PUBLIC_HOST "Public host URL (e.g., https://node.example.com)" "$(ini_val PUBLIC_HOST)"
fi
ask_or_keep SANIC_PORT "Internal app port (SANIC_PORT)" "$(ini_val SANIC_PORT)"
ask_or_keep BACKEND_HTTP_PORT "Published backend port on host (BACKEND_HTTP_PORT)" "$(ini_val BACKEND_HTTP_PORT)"
ask_or_keep BOOTSTRAP_SEEDS "Bootstrap seeds (comma-separated URLs)" "$(ini_val BOOTSTRAP_SEEDS)"
ask_or_keep HANDSHAKE_INTERVAL_SEC "Handshake interval seconds" "$(ini_val HANDSHAKE_INTERVAL_SEC)"
ask_or_keep TELEGRAM_API_KEY "Telegram uploader bot token (TELEGRAM_API_KEY)" "$(ini_val TELEGRAM_API_KEY)"
ask_or_keep CLIENT_TELEGRAM_API_KEY "Telegram client bot token (CLIENT_TELEGRAM_API_KEY)" "$(ini_val CLIENT_TELEGRAM_API_KEY)"
echo "Applying configuration to $ENV_FILE ..."
# In-place update helper
update_env() {
local key=$1 value=$2
if grep -qE "^${key}=" "$ENV_FILE"; then
sed -i.bak "s|^${key}=.*$|${key}=${value}|" "$ENV_FILE"
else
echo "${key}=${value}" >> "$ENV_FILE"
fi
}
update_env NODE_PRIVACY "$NODE_PRIVACY"
update_env PUBLIC_HOST "${PUBLIC_HOST:-}"
if [[ -n "${PUBLIC_HOST:-}" ]]; then
update_env PROJECT_HOST "$PUBLIC_HOST"
fi
update_env SANIC_PORT "$SANIC_PORT"
update_env BACKEND_HTTP_PORT "$BACKEND_HTTP_PORT"
update_env BOOTSTRAP_SEEDS "$BOOTSTRAP_SEEDS"
update_env HANDSHAKE_INTERVAL_SEC "$HANDSHAKE_INTERVAL_SEC"
update_env TELEGRAM_API_KEY "$TELEGRAM_API_KEY"
update_env CLIENT_TELEGRAM_API_KEY "$CLIENT_TELEGRAM_API_KEY"
# Ensure IPFS swarm key exists for private swarm by default
SWARM_KEY_FILE_DEFAULT="$BASE_DIR/configs/ipfs/swarm.key"
if [[ ! -f "$SWARM_KEY_FILE_DEFAULT" ]]; then
echo "Generating IPFS private swarm key at $SWARM_KEY_FILE_DEFAULT ..."
mkdir -p "$(dirname "$SWARM_KEY_FILE_DEFAULT")"
if command -v openssl >/dev/null 2>&1; then
KEYHEX=$(openssl rand -hex 32)
else
KEYHEX=$(head -c 32 /dev/urandom | od -An -tx1 | tr -d ' \n')
fi
cat > "$SWARM_KEY_FILE_DEFAULT" <<EOF
/key/swarm/psk/1.0.0/
/base16/
$KEYHEX
EOF
fi
update_env IPFS_SWARM_KEY_FILE "$SWARM_KEY_FILE_DEFAULT"
# Ensure data directories exist
mkdir -p "$BASE_DIR/data/ipfs" "$BASE_DIR/data/tusd" "$BASE_DIR/app-logs" "$BASE_DIR/dynamicStorage"
update_env IPFS_DATA_DIR_HOST "$BASE_DIR/data/ipfs"
update_env TUSD_DATA_DIR_HOST "$BASE_DIR/data/tusd"
if ! grep -qE '^IPFS_GATEWAY_BIND=' "$ENV_FILE"; then
update_env IPFS_GATEWAY_BIND "0.0.0.0"
fi
if [[ -n "${PUBLIC_HOST:-}" ]]; then
update_env VITE_TUS_ENDPOINT "${PUBLIC_HOST%/}/tus/files"
else
if ! grep -qE '^VITE_TUS_ENDPOINT=' "$ENV_FILE"; then
update_env VITE_TUS_ENDPOINT "http://localhost:1080/files"
fi
fi
echo "Config written to $ENV_FILE. Starting containers..."
if ! command -v docker >/dev/null 2>&1; then
echo "Docker is required. Please install Docker and retry." >&2
exit 1
fi
if ! command -v docker compose >/dev/null 2>&1 && ! command -v docker-compose >/dev/null 2>&1; then
echo "docker compose (v2) or docker-compose is required." >&2
exit 1
fi
set -x
if command -v docker compose >/dev/null 2>&1; then
(cd "$BASE_DIR" && docker compose up -d --build)
else
(cd "$BASE_DIR" && docker-compose up -d --build)
fi
set +x
echo "Setup complete. Check health: curl -fsS http://127.0.0.1:${BACKEND_HTTP_PORT}/api/system.version"