start sh
This commit is contained in:
parent
0a04290235
commit
4ed7eae715
|
|
@ -0,0 +1,127 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
echo "MY Network Node setup (interactive)"
|
||||||
|
|
||||||
|
ENV_FILE=".env"
|
||||||
|
EXAMPLE_FILE=".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
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
if [[ "$NODE_PRIVACY" == "private" ]]; then
|
||||||
|
read -rp "Public host URL (leave empty for private): " PUBLIC_HOST || true
|
||||||
|
else
|
||||||
|
read -rp "Public host URL (e.g., https://node.example.com) [$(grep -E '^PUBLIC_HOST=' "$ENV_FILE" | cut -d'=' -f2)]: " PUBLIC_HOST
|
||||||
|
PUBLIC_HOST=${PUBLIC_HOST:-$(grep -E '^PUBLIC_HOST=' "$ENV_FILE" | cut -d'=' -f2)}
|
||||||
|
fi
|
||||||
|
|
||||||
|
read -rp "Internal app port (SANIC_PORT) [$(grep -E '^SANIC_PORT=' "$ENV_FILE" | cut -d'=' -f2)]: " SANIC_PORT
|
||||||
|
SANIC_PORT=${SANIC_PORT:-$(grep -E '^SANIC_PORT=' "$ENV_FILE" | cut -d'=' -f2)}
|
||||||
|
|
||||||
|
read -rp "Published backend port on host (BACKEND_HTTP_PORT) [$(grep -E '^BACKEND_HTTP_PORT=' "$ENV_FILE" | cut -d'=' -f2)]: " BACKEND_HTTP_PORT
|
||||||
|
BACKEND_HTTP_PORT=${BACKEND_HTTP_PORT:-$(grep -E '^BACKEND_HTTP_PORT=' "$ENV_FILE" | cut -d'=' -f2)}
|
||||||
|
|
||||||
|
read -rp "Bootstrap seeds (comma-separated URLs) [$(grep -E '^BOOTSTRAP_SEEDS=' "$ENV_FILE" | cut -d'=' -f2)]: " BOOTSTRAP_SEEDS
|
||||||
|
BOOTSTRAP_SEEDS=${BOOTSTRAP_SEEDS:-$(grep -E '^BOOTSTRAP_SEEDS=' "$ENV_FILE" | cut -d'=' -f2)}
|
||||||
|
|
||||||
|
read -rp "Handshake interval seconds [$(grep -E '^HANDSHAKE_INTERVAL_SEC=' "$ENV_FILE" | cut -d'=' -f2)]: " HANDSHAKE_INTERVAL_SEC
|
||||||
|
HANDSHAKE_INTERVAL_SEC=${HANDSHAKE_INTERVAL_SEC:-$(grep -E '^HANDSHAKE_INTERVAL_SEC=' "$ENV_FILE" | cut -d'=' -f2)}
|
||||||
|
|
||||||
|
read -rp "Telegram uploader bot token (TELEGRAM_API_KEY) [$(grep -E '^TELEGRAM_API_KEY=' "$ENV_FILE" | cut -d'=' -f2)]: " TELEGRAM_API_KEY
|
||||||
|
TELEGRAM_API_KEY=${TELEGRAM_API_KEY:-$(grep -E '^TELEGRAM_API_KEY=' "$ENV_FILE" | cut -d'=' -f2)}
|
||||||
|
|
||||||
|
read -rp "Telegram client bot token (CLIENT_TELEGRAM_API_KEY) [$(grep -E '^CLIENT_TELEGRAM_API_KEY=' "$ENV_FILE" | cut -d'=' -f2)]: " CLIENT_TELEGRAM_API_KEY
|
||||||
|
CLIENT_TELEGRAM_API_KEY=${CLIENT_TELEGRAM_API_KEY:-$(grep -E '^CLIENT_TELEGRAM_API_KEY=' "$ENV_FILE" | cut -d'=' -f2)}
|
||||||
|
|
||||||
|
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="./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")"
|
||||||
|
KEYHEX=$(python3 - <<'PY'
|
||||||
|
import os, binascii
|
||||||
|
print(binascii.b2a_hex(os.urandom(32)).decode())
|
||||||
|
PY
|
||||||
|
)
|
||||||
|
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 ./data/ipfs ./data/tusd ./app-logs ./dynamicStorage
|
||||||
|
update_env IPFS_DATA_DIR_HOST "./data/ipfs"
|
||||||
|
update_env TUSD_DATA_DIR_HOST "./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. 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
|
||||||
|
docker compose up -d --build
|
||||||
|
else
|
||||||
|
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"
|
||||||
Loading…
Reference in New Issue