From 9b93d6898b8fdd6d3f894bce06f0ee8aed9b6af2 Mon Sep 17 00:00:00 2001 From: lolwierd Date: Fri, 27 Mar 2026 19:32:47 +0530 Subject: [PATCH] feat: add domain and install scripts for apps --- ghost/domain.sh | 57 ++++++++++++++++++++++++++++++++++++++ ghost/install.sh | 28 +++++++++++++++++++ gitea/domain.sh | 28 +++++++++++++++++++ gitea/install.sh | 45 ++++++++++++++++++++++++++++++ jellyfin/domain.sh | 28 +++++++++++++++++++ jellyfin/install.sh | 42 ++++++++++++++++++++++++++++ metabase/domain.sh | 28 +++++++++++++++++++ metabase/install.sh | 41 +++++++++++++++++++++++++++ n8n/domain.sh | 28 +++++++++++++++++++ n8n/install.sh | 47 +++++++++++++++++++++++++++++++ nocodb/domain.sh | 28 +++++++++++++++++++ nocodb/install.sh | 38 +++++++++++++++++++++++++ open-webui/domain.sh | 28 +++++++++++++++++++ open-webui/install.sh | 42 ++++++++++++++++++++++++++++ openclaw/domain.sh | 63 ++++++++++++++++++++++++++++++++++++++++++ openclaw/install.sh | 27 ++++++++++++++++++ picoclaw/domain.sh | 47 +++++++++++++++++++++++++++++++ picoclaw/install.sh | 27 ++++++++++++++++++ plausible/domain.sh | 49 ++++++++++++++++++++++++++++++++ plausible/install.sh | 29 +++++++++++++++++++ signoz/domain.sh | 12 ++++---- signoz/install.sh | 16 ++++++----- uptime-kuma/domain.sh | 28 +++++++++++++++++++ uptime-kuma/install.sh | 38 +++++++++++++++++++++++++ vaultwarden/domain.sh | 28 +++++++++++++++++++ vaultwarden/install.sh | 41 +++++++++++++++++++++++++++ 26 files changed, 900 insertions(+), 13 deletions(-) create mode 100644 ghost/domain.sh create mode 100644 ghost/install.sh create mode 100644 gitea/domain.sh create mode 100644 gitea/install.sh create mode 100644 jellyfin/domain.sh create mode 100644 jellyfin/install.sh create mode 100644 metabase/domain.sh create mode 100644 metabase/install.sh create mode 100644 n8n/domain.sh create mode 100644 n8n/install.sh create mode 100644 nocodb/domain.sh create mode 100644 nocodb/install.sh create mode 100644 open-webui/domain.sh create mode 100644 open-webui/install.sh create mode 100644 openclaw/domain.sh create mode 100644 openclaw/install.sh create mode 100644 picoclaw/domain.sh create mode 100644 picoclaw/install.sh create mode 100644 plausible/domain.sh create mode 100644 plausible/install.sh create mode 100644 uptime-kuma/domain.sh create mode 100644 uptime-kuma/install.sh create mode 100644 vaultwarden/domain.sh create mode 100644 vaultwarden/install.sh diff --git a/ghost/domain.sh b/ghost/domain.sh new file mode 100644 index 0000000..4caaf63 --- /dev/null +++ b/ghost/domain.sh @@ -0,0 +1,57 @@ +#!/bin/bash + +APP_NAME="ghost" +APP_DIR="/var/excloud/apps" +APP_UPSTREAM_PORT="${EXC_APP_UPSTREAM_PORT:-2368}" + +DOMAIN="${1}" + +if [ -z "${DOMAIN}" ]; then + echo "Error: URL argument is required. Example:" >&2 + echo "domain.sh sub.example.com" >&2 + exit 1 +fi + +GHOST_DIR="${APP_DIR}/${APP_NAME}" +ENV_FILE="${GHOST_DIR}/.env" +OVERRIDE_FILE="${GHOST_DIR}/compose.override.yml" +ROOT_PASSWORD_FILE="${GHOST_DIR}/.database_root_password" +DATABASE_PASSWORD_FILE="${GHOST_DIR}/.database_password" + +if [ ! -f "${ROOT_PASSWORD_FILE}" ]; then + openssl rand -hex 32 > "${ROOT_PASSWORD_FILE}" +fi + +if [ ! -f "${DATABASE_PASSWORD_FILE}" ]; then + openssl rand -hex 32 > "${DATABASE_PASSWORD_FILE}" +fi + +DATABASE_ROOT_PASSWORD="$(cat "${ROOT_PASSWORD_FILE}")" +DATABASE_PASSWORD="$(cat "${DATABASE_PASSWORD_FILE}")" + +cat > "${ENV_FILE}" < "${OVERRIDE_FILE}" < /etc/caddy/Caddyfile <&2 + echo "install.sh sub.example.com" >&2 + exit 1 +fi + +GHOST_DIR="${APP_DIR}/${APP_NAME}" + +apt-get install -y caddy git openssl + +if [ ! -d "${GHOST_DIR}/.git" ]; then + git clone "${REPO_URL}" "${GHOST_DIR}" +fi + +bash "${SCRIPT_DIR}/domain.sh" "${DOMAIN}" diff --git a/gitea/domain.sh b/gitea/domain.sh new file mode 100644 index 0000000..511ee7c --- /dev/null +++ b/gitea/domain.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +APP_NAME="gitea" +APP_DIR="/var/excloud/apps" +APP_UPSTREAM_PORT="${EXC_APP_UPSTREAM_PORT:-3000}" + +DOMAIN="${1}" + +if [ -z "${DOMAIN}" ]; then + echo "Error: URL argument is required. Example:" >&2 + echo "domain.sh sub.example.com" >&2 + exit 1 +fi + +URL="https://${DOMAIN}" +COMPOSE_FILE="${APP_DIR}/${APP_NAME}/docker-compose.yml" + +cat > /etc/caddy/Caddyfile <&2 + echo "install.sh sub.example.com" >&2 + exit 1 +fi + +GITEA_DIR="${APP_DIR}/${APP_NAME}" +COMPOSE_FILE="${GITEA_DIR}/docker-compose.yml" + +apt-get install -y caddy +mkdir -p "${GITEA_DIR}" + +cat > "${COMPOSE_FILE}" <&2 + echo "domain.sh sub.example.com" >&2 + exit 1 +fi + +URL="https://${DOMAIN}" +COMPOSE_FILE="${APP_DIR}/${APP_NAME}/docker-compose.yml" + +cat > /etc/caddy/Caddyfile <&2 + echo "install.sh sub.example.com" >&2 + exit 1 +fi + +JELLYFIN_DIR="${APP_DIR}/${APP_NAME}" +COMPOSE_FILE="${JELLYFIN_DIR}/docker-compose.yml" + +apt-get install -y caddy +mkdir -p "${JELLYFIN_DIR}" +mkdir -p /srv/media/movies /srv/media/shows /srv/media/music + +cat > "${COMPOSE_FILE}" <&2 + echo "domain.sh sub.example.com" >&2 + exit 1 +fi + +URL="https://${DOMAIN}" +COMPOSE_FILE="${APP_DIR}/${APP_NAME}/docker-compose.yml" + +cat > /etc/caddy/Caddyfile <&2 + echo "install.sh sub.example.com" >&2 + exit 1 +fi + +METABASE_DIR="${APP_DIR}/${APP_NAME}" +COMPOSE_FILE="${METABASE_DIR}/docker-compose.yml" + +apt-get install -y caddy +mkdir -p "${METABASE_DIR}" + +cat > "${COMPOSE_FILE}" <&2 + echo "domain.sh sub.example.com" >&2 + exit 1 +fi + +URL="https://${DOMAIN}" +COMPOSE_FILE="${APP_DIR}/${APP_NAME}/docker-compose.yml" + +cat > /etc/caddy/Caddyfile <&2 + echo "install.sh sub.example.com" >&2 + exit 1 +fi + +N8N_DIR="${APP_DIR}/${APP_NAME}" +COMPOSE_FILE="${N8N_DIR}/docker-compose.yml" + +apt-get install -y caddy +mkdir -p "${N8N_DIR}" + +cat > "${COMPOSE_FILE}" <&2 + echo "domain.sh sub.example.com" >&2 + exit 1 +fi + +URL="https://${DOMAIN}" +COMPOSE_FILE="${APP_DIR}/${APP_NAME}/docker-compose.yml" + +cat > /etc/caddy/Caddyfile <&2 + echo "install.sh sub.example.com" >&2 + exit 1 +fi + +NOCODB_DIR="${APP_DIR}/${APP_NAME}" +COMPOSE_FILE="${NOCODB_DIR}/docker-compose.yml" + +apt-get install -y caddy +mkdir -p "${NOCODB_DIR}" + +cat > "${COMPOSE_FILE}" <&2 + echo "domain.sh sub.example.com" >&2 + exit 1 +fi + +URL="https://${DOMAIN}" +COMPOSE_FILE="${APP_DIR}/${APP_NAME}/docker-compose.yml" + +cat > /etc/caddy/Caddyfile <&2 + echo "install.sh sub.example.com" >&2 + exit 1 +fi + +OPEN_WEBUI_DIR="${APP_DIR}/${APP_NAME}" +COMPOSE_FILE="${OPEN_WEBUI_DIR}/docker-compose.yml" + +apt-get install -y caddy openssl +mkdir -p "${OPEN_WEBUI_DIR}" + +WEBUI_SECRET_KEY="$(openssl rand -hex 32)" + +cat > "${COMPOSE_FILE}" <&2 + echo "domain.sh sub.example.com" >&2 + exit 1 +fi + +OPENCLAW_DIR="${APP_DIR}/${APP_NAME}" +DATA_DIR="${OPENCLAW_DIR}/data" +CONFIG_DIR="${DATA_DIR}/config" +WORKSPACE_DIR="${DATA_DIR}/workspace" +TOKEN_FILE="${OPENCLAW_DIR}/.gateway_token" +ENV_FILE="${OPENCLAW_DIR}/.env" +LEGACY_OVERRIDE_FILE="${OPENCLAW_DIR}/compose.override.yml" + +mkdir -p "${CONFIG_DIR}/identity" +mkdir -p "${CONFIG_DIR}/agents/main/agent" +mkdir -p "${CONFIG_DIR}/agents/main/sessions" +mkdir -p "${WORKSPACE_DIR}" +chown -R 1000:1000 "${DATA_DIR}" + +if [ ! -f "${TOKEN_FILE}" ]; then + openssl rand -hex 32 > "${TOKEN_FILE}" +fi + +OPENCLAW_GATEWAY_TOKEN="$(cat "${TOKEN_FILE}")" + +cat > "${ENV_FILE}" < /etc/caddy/Caddyfile <&2 + echo "install.sh sub.example.com" >&2 + exit 1 +fi + +OPENCLAW_DIR="${APP_DIR}/${APP_NAME}" + +apt-get install -y caddy git openssl + +if [ ! -d "${OPENCLAW_DIR}/.git" ]; then + git clone "${REPO_URL}" "${OPENCLAW_DIR}" +fi + +bash "${SCRIPT_DIR}/domain.sh" "${DOMAIN}" diff --git a/picoclaw/domain.sh b/picoclaw/domain.sh new file mode 100644 index 0000000..f9607ed --- /dev/null +++ b/picoclaw/domain.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +APP_NAME="picoclaw" +APP_DIR="/var/excloud/apps" +APP_UPSTREAM_PORT="${EXC_APP_UPSTREAM_PORT:-18800}" +APP_BRIDGE_PORT="${EXC_APP_BRIDGE_PORT:-18790}" + +DOMAIN="${1}" + +if [ -z "${DOMAIN}" ]; then + echo "Error: URL argument is required. Example:" >&2 + echo "domain.sh sub.example.com" >&2 + exit 1 +fi + +PICOCLAW_DIR="${APP_DIR}/${APP_NAME}" +DATA_DIR="${PICOCLAW_DIR}/docker/data" +CONFIG_FILE="${DATA_DIR}/config.json" +OVERRIDE_FILE="${PICOCLAW_DIR}/docker/compose.override.yml" + +mkdir -p "${DATA_DIR}/workspace" + +if [ ! -f "${CONFIG_FILE}" ]; then + cp "${PICOCLAW_DIR}/config/config.example.json" "${CONFIG_FILE}" +fi + +cat > "${OVERRIDE_FILE}" < /etc/caddy/Caddyfile <&2 + echo "install.sh sub.example.com" >&2 + exit 1 +fi + +PICOCLAW_DIR="${APP_DIR}/${APP_NAME}" + +apt-get install -y caddy git + +if [ ! -d "${PICOCLAW_DIR}/.git" ]; then + git clone "${REPO_URL}" "${PICOCLAW_DIR}" +fi + +bash "${SCRIPT_DIR}/domain.sh" "${DOMAIN}" diff --git a/plausible/domain.sh b/plausible/domain.sh new file mode 100644 index 0000000..9f39422 --- /dev/null +++ b/plausible/domain.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +APP_NAME="plausible" +APP_DIR="/var/excloud/apps" +APP_UPSTREAM_PORT="${EXC_APP_UPSTREAM_PORT:-8000}" + +DOMAIN="${1}" + +if [ -z "${DOMAIN}" ]; then + echo "Error: URL argument is required. Example:" >&2 + echo "domain.sh sub.example.com" >&2 + exit 1 +fi + +PLAUSIBLE_DIR="${APP_DIR}/${APP_NAME}" +ENV_FILE="${PLAUSIBLE_DIR}/.env" +OVERRIDE_FILE="${PLAUSIBLE_DIR}/compose.override.yml" +SECRET_KEY_FILE="${PLAUSIBLE_DIR}/.secret_key_base" + +if [ ! -f "${SECRET_KEY_FILE}" ]; then + openssl rand -base64 48 > "${SECRET_KEY_FILE}" +fi + +SECRET_KEY_BASE="$(tr -d '\n' < "${SECRET_KEY_FILE}")" + +cat > "${ENV_FILE}" < "${OVERRIDE_FILE}" < /etc/caddy/Caddyfile <&2 + echo "install.sh sub.example.com" >&2 + exit 1 +fi + +PLAUSIBLE_DIR="${APP_DIR}/${APP_NAME}" + +apt-get install -y caddy git openssl + +if [ ! -d "${PLAUSIBLE_DIR}/.git" ]; then + git clone -b "${REPO_REF}" --single-branch "${REPO_URL}" "${PLAUSIBLE_DIR}" +fi + +bash "${SCRIPT_DIR}/domain.sh" "${DOMAIN}" diff --git a/signoz/domain.sh b/signoz/domain.sh index fd78851..10270f5 100644 --- a/signoz/domain.sh +++ b/signoz/domain.sh @@ -38,26 +38,26 @@ set_env "SIGNOZ_ALERTMANAGER_SIGNOZ_EXTERNAL_URL" "${URL}" ".services.signoz.env cat > /etc/caddy/Caddyfile << EOF ${URL} { - reverse_proxy localhost:${APP_UPSTREAM_PORT} + reverse_proxy 127.0.0.1:${APP_UPSTREAM_PORT} } ${URL}:4317 { - reverse_proxy h2c://localhost:44317 + reverse_proxy h2c://127.0.0.1:44317 } ${URL}:4318 { - reverse_proxy localhost:44318 + reverse_proxy 127.0.0.1:44318 } # ${INTERNAL_URL} { -# reverse_proxy localhost:${APP_UPSTREAM_PORT} +# reverse_proxy 127.0.0.1:${APP_UPSTREAM_PORT} # } # # ${INTERNAL_URL}:4317 { -# reverse_proxy h2c://localhost:44317 +# reverse_proxy h2c://127.0.0.1:44317 # } # # ${INTERNAL_URL}:4318 { -# reverse_proxy localhost:44318 +# reverse_proxy 127.0.0.1:44318 # } EOF diff --git a/signoz/install.sh b/signoz/install.sh index 8d28ec7..92f04ed 100644 --- a/signoz/install.sh +++ b/signoz/install.sh @@ -17,14 +17,16 @@ if [ -z "$DOMAIN" ]; then fi JWT_SECRET=$(openssl rand -hex 16 | cut -c-32) - -if [ -f "${APP_DIR}/jwt-secret" ]; then - JWT_SECRET=$(cat ${APP_DIR}/jwt-secret) -else - echo $JWT_SECRET > ${APP_DIR}/jwt-secret -fi - SIGNOZ_DIR="${APP_DIR}/signoz" +JWT_SECRET_FILE="${SIGNOZ_DIR}/jwt-secret" + +mkdir -p "${SIGNOZ_DIR}" + +if [ -f "${JWT_SECRET_FILE}" ]; then + JWT_SECRET=$(cat "${JWT_SECRET_FILE}") +else + echo "${JWT_SECRET}" > "${JWT_SECRET_FILE}" +fi COMPOSE_FILE="${SIGNOZ_DIR}/deploy/docker/docker-compose.yaml" OTEL_SERVICE_PATH='.services["otel-collector"].ports' SIGNOZ_SERVICE_PATH=".services.signoz.ports" diff --git a/uptime-kuma/domain.sh b/uptime-kuma/domain.sh new file mode 100644 index 0000000..3a022ce --- /dev/null +++ b/uptime-kuma/domain.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +APP_NAME="uptime-kuma" +APP_DIR="/var/excloud/apps" +APP_UPSTREAM_PORT="${EXC_APP_UPSTREAM_PORT:-3001}" + +DOMAIN="${1}" + +if [ -z "${DOMAIN}" ]; then + echo "Error: URL argument is required. Example:" >&2 + echo "domain.sh sub.example.com" >&2 + exit 1 +fi + +URL="https://${DOMAIN}" +COMPOSE_FILE="${APP_DIR}/${APP_NAME}/docker-compose.yml" + +cat > /etc/caddy/Caddyfile <&2 + echo "install.sh sub.example.com" >&2 + exit 1 +fi + +UPTIME_KUMA_DIR="${APP_DIR}/${APP_NAME}" +COMPOSE_FILE="${UPTIME_KUMA_DIR}/docker-compose.yml" + +apt-get install -y caddy +mkdir -p "${UPTIME_KUMA_DIR}" + +cat > "${COMPOSE_FILE}" <&2 + echo "domain.sh sub.example.com" >&2 + exit 1 +fi + +URL="https://${DOMAIN}" +COMPOSE_FILE="${APP_DIR}/${APP_NAME}/docker-compose.yml" + +cat > /etc/caddy/Caddyfile <&2 + echo "install.sh sub.example.com" >&2 + exit 1 +fi + +VAULTWARDEN_DIR="${APP_DIR}/${APP_NAME}" +COMPOSE_FILE="${VAULTWARDEN_DIR}/docker-compose.yml" + +apt-get install -y caddy +mkdir -p "${VAULTWARDEN_DIR}" + +cat > "${COMPOSE_FILE}" <