#!/usr/bin/env bash set -euo pipefail REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" ENV_FILE="${REPO_DIR}/.env" ENV_EXAMPLE="${REPO_DIR}/env.example" BINARY_DIR="${REPO_DIR}/bin" BINARY="${BINARY_DIR}/eden-room" SERVICE_NAME="eden-room" SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service" EDEN_USER="eden" EDEN_GROUP="eden" BASE_URL="https://git.eden-emu.dev/eden-emu/eden/releases/download" require_root() { if [[ "${EUID}" -ne 0 ]]; then echo "Run as root: sudo $0" >&2 exit 1 fi } load_env() { if [[ -f "${ENV_FILE}" ]]; then # shellcheck source=/dev/null source "${ENV_FILE}" elif [[ -f "${ENV_EXAMPLE}" ]]; then # shellcheck source=/dev/null source "${ENV_EXAMPLE}" fi : "${EDEN_RELEASE_VERSION:=v0.2.0-rc2}" : "${EDEN_ROOM_ARCH:=x86_64-unknown-linux-musl}" : "${PORT:=24872}" } create_user() { if ! id "${EDEN_USER}" &>/dev/null; then useradd -r -s /usr/sbin/nologin -d "${REPO_DIR}" "${EDEN_USER}" echo "Created system user: ${EDEN_USER}" fi } setup_env() { if [[ ! -f "${ENV_FILE}" ]]; then cp "${ENV_EXAMPLE}" "${ENV_FILE}" chmod 600 "${ENV_FILE}" echo "Created ${ENV_FILE} from env.example — edit it before starting the service." else echo "Using existing ${ENV_FILE}" fi } download_binary() { mkdir -p "${BINARY_DIR}" local url="${BASE_URL}/${EDEN_RELEASE_VERSION}/eden-room-${EDEN_ROOM_ARCH}" echo "Downloading eden-room ${EDEN_RELEASE_VERSION} (${EDEN_ROOM_ARCH})..." curl -fsSL "${url}" -o "${BINARY}.tmp" chmod +x "${BINARY}.tmp" mv "${BINARY}.tmp" "${BINARY}" echo "Installed ${BINARY}" } setup_firewall() { if command -v ufw &>/dev/null && ufw status | grep -q "Status: active"; then ufw allow "${PORT}/tcp" comment "eden-room" ufw allow "${PORT}/udp" comment "eden-room" echo "UFW rules added for port ${PORT} (tcp/udp)" else echo "UFW not active — open port ${PORT}/tcp and ${PORT}/udp in your cloud firewall manually." fi } install_systemd() { cat > "${SERVICE_FILE}" </dev/null || true chmod +x "${BINARY}" } metaserver_hosts_hint() { if ! grep -q 'api.ynet-fun.xyz' /etc/hosts 2>/dev/null; then echo "" echo "Tip: if public lobby registration fails, add to /etc/hosts:" echo " 28.165.181.135 api.ynet-fun.xyz" fi } binary_only() { require_root load_env download_binary fix_permissions echo "Binary updated at ${BINARY}" } main() { if [[ "${1:-}" == "--binary-only" ]]; then binary_only return fi require_root load_env create_user setup_env download_binary setup_firewall install_systemd fix_permissions metaserver_hosts_hint echo "" echo "Install complete." echo " 1. Edit ${ENV_FILE} (set EDEN_TOKEN and ROOM_NAME)" echo " 2. sudo systemctl start ${SERVICE_NAME}" echo " 3. sudo journalctl -u eden-room -f" } main "$@"