From d7f0ae73496fd99bd1ad283062c702138122675f Mon Sep 17 00:00:00 2001 From: summoningpixels <97950412+summoningpixels@users.noreply.github.com> Date: Wed, 18 Feb 2026 16:21:39 +0200 Subject: [PATCH 1/5] Create arcane.json --- frontend/public/json/arcane.json | 40 ++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 frontend/public/json/arcane.json diff --git a/frontend/public/json/arcane.json b/frontend/public/json/arcane.json new file mode 100644 index 000000000..4f002e9ba --- /dev/null +++ b/frontend/public/json/arcane.json @@ -0,0 +1,40 @@ +{ + "name": "Arcane", + "slug": "arcane", + "categories": [ + 3 + ], + "date_created": "2026-02-18", + "type": "addon", + "updateable": true, + "privileged": false, + "interface_port": 3552, + "documentation": "https://getarcane.app/docs", + "website": "https://getarcane.app/", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/arcane.webp", + "config_path": "/opt/arcane/.env", + "description": "Arcane is designed to be an easy and modern Docker management platform, built with everybody in mind. The goal of Arcane is to be built for and by the community to make sure nobody feels left out or behind with their specific features or processes. ", + "install_methods": [ + { + "type": "default", + "script": "tools/addon/arcane.sh", + "resources": { + "cpu": 0, + "ram": 0, + "hdd": 0, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": "arcane", + "password": "arcane-admin" + }, + "notes": [ + { + "text": "This is an addon script intended to be used on top of an existing Docker container.", + "type": "info" + } + ] +} From 786093a288077af4720cf9f1b260ade239306bb5 Mon Sep 17 00:00:00 2001 From: summoningpixels <97950412+summoningpixels@users.noreply.github.com> Date: Wed, 18 Feb 2026 16:24:46 +0200 Subject: [PATCH 2/5] Create arcane.sh --- tools/addon/arcane.sh | 215 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 215 insertions(+) create mode 100644 tools/addon/arcane.sh diff --git a/tools/addon/arcane.sh b/tools/addon/arcane.sh new file mode 100644 index 000000000..0653a347c --- /dev/null +++ b/tools/addon/arcane.sh @@ -0,0 +1,215 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: summoningpixels +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/getarcaneapp/arcane + +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/core.func) +source <(curl -fsSL https://raw.githubusercontent.com/summoningpixels/ProxmoxVED/main/misc/tools.func) +source <(curl -fsSL https://raw.githubusercontent.com/summoningpixels/ProxmoxVED/main/miscmisc/error_handler.func) +source <(curl -fsSL https://raw.githubusercontent.com/summoningpixels/ProxmoxVED/main/misc/misc/api.func) 2>/dev/null || true + +# Enable error handling +set -Eeuo pipefail +trap 'error_handler' ERR + +# ============================================================================== +# CONFIGURATION +# ============================================================================== +APP="Arcane" +APP_TYPE="addon" +INSTALL_PATH="/opt/arcane" +COMPOSE_FILE="${INSTALL_PATH}/compose.yaml" +ENV_FILE="${INSTALL_PATH}/.env" +DEFAULT_PORT=3552 + +# Initialize all core functions (colors, formatting, icons, STD mode) +load_functions + +# ============================================================================== +# HEADER +# ============================================================================== +function header_info { + clear + cat <<"EOF" + ___ ____ _________ _ ________ + / | / __ \/ ____/ | / | / / ____/ + / /| | / /_/ / / / /| | / |/ / __/ + / ___ |/ _, _/ /___/ ___ |/ /| / /___ +/_/ |_/_/ |_|\____/_/ |_/_/ |_/_____/ + +EOF +} + +# ============================================================================== +# UNINSTALL +# ============================================================================== +function uninstall() { + msg_info "Uninstalling ${APP}" + + if [[ -f "$COMPOSE_FILE" ]]; then + msg_info "Stopping and removing Docker containers" + cd "$INSTALL_PATH" + $STD docker compose down --volumes --remove-orphans || true + msg_ok "Stopped and removed Docker containers" + fi + + rm -rf "$INSTALL_PATH" + rm -f "/usr/local/bin/update_arcane" + msg_ok "${APP} has been uninstalled" +} + +# ============================================================================== +# UPDATE +# ============================================================================== +function update() { + msg_info "Pulling latest ${APP} image" + cd "$INSTALL_PATH" + $STD docker compose pull + msg_ok "Pulled latest image" + + msg_info "Restarting ${APP}" + $STD docker compose up -d --remove-orphans + msg_ok "Restarted ${APP}" + + msg_ok "Updated successfully" + exit +} + +# ============================================================================== +# CHECK DOCKER +# ============================================================================== +function check_docker() { + if ! command -v docker &>/dev/null; then + msg_error "Docker is not installed. This script requires an existing Docker LXC. Exiting." + exit 1 + fi + if ! docker compose version &>/dev/null; then + msg_error "Docker Compose plugin is not available. Please install it before running this script. Exiting." + exit 1 + fi + msg_ok "Docker $(docker --version | cut -d' ' -f3 | tr -d ',') and Docker Compose are available" +} + +# ============================================================================== +# INSTALL +# ============================================================================== +function install() { + check_docker + + msg_info "Creating install directory" + mkdir -p "$INSTALL_PATH" + msg_ok "Created ${INSTALL_PATH}" + + # Generate secrets and config values + local ENCRYPTION_KEY JWT_SECRET PROJ_DIR + ENCRYPTION_KEY=$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | head -c32) + JWT_SECRET=$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | head -c32) + PROJ_DIR="/etc/arcane/projects" + + msg_info "Creating stacks directory" + mkdir -p "$PROJ_DIR" + msg_ok "Created ${PROJ_DIR}" + + msg_info "Downloading Docker Compose file" + curl -fsSL "https://raw.githubusercontent.com/getarcaneapp/arcane/refs/heads/main/docker/examples/compose.basic.yaml" -o "$COMPOSE_FILE" + msg_ok "Downloaded Docker Compose file" + + msg_info "Downloading .env file" + curl -fsSL "https://raw.githubusercontent.com/getarcaneapp/arcane/refs/heads/main/.env.example" -o "$ENV_FILE" + chmod 600 "$ENV_FILE" + msg_ok "Downloaded .env file" + + msg_info "Configuring compose and env files" + sed -i '/^[[:space:]]*#/!s|/host/path/to/projects|'"$PROJ_DIR"'|g' "$COMPOSE_FILE" + sed -i '/^[[:space:]]*#/!s|ENCRYPTION_KEY=.*|ENCRYPTION_KEY='"$ENCRYPTION_KEY"'|g' "$COMPOSE_FILE" + sed -i '/^[[:space:]]*#/!s|JWT_SECRET=.*|JWT_SECRET='"$JWT_SECRET"'|g' "$COMPOSE_FILE" + sed -i '/^[[:space:]]*#/!s|APP_URL=.*|APP_URL=http://localhost:'"$DEFAULT_PORT"'|g' "$ENV_FILE" + sed -i '/^[[:space:]]*#/!s|ENCRYPTION_KEY=.*|#&|g' "$ENV_FILE" + sed -i '/^[[:space:]]*#/!s|JWT_SECRET=.*|#&|g' "$ENV_FILE" + msg_ok "Configured compose and env files" + + msg_info "Starting ${APP}" + cd "$INSTALL_PATH" + $STD docker compose up -d + msg_ok "Started ${APP}" + + # Create update script + msg_info "Creating update script" + cat <<'UPDATEEOF' >/usr/local/bin/update_arcane +#!/usr/bin/env bash +# Arcane Update Script +type=update bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/tools/addon/arcane.sh)" +UPDATEEOF + chmod +x /usr/local/bin/update_arcane + msg_ok "Created update script (/usr/local/bin/update_arcane)" + + echo "" + msg_ok "${APP} is reachable at: ${BL}http://${LOCAL_IP}:${DEFAULT_PORT}${CL}" + echo "" + echo -e "Arcane Credentials" + echo -e "==================" + echo -e "User: arcane" + echo -e "Password: arcane-admin" + echo "" + msg_warn "On first access, you'll be prompted to change your password." +} + +# ============================================================================== +# MAIN +# ============================================================================== + +# Handle type=update (called from update script) +if [[ "${type:-}" == "update" ]]; then + header_info + if [[ -f "$COMPOSE_FILE" ]]; then + update + else + msg_error "${APP} is not installed. Nothing to update." + exit 1 + fi + exit 0 +fi + +header_info +get_lxc_ip + +# Check if already installed +if [[ -f "$COMPOSE_FILE" ]]; then + msg_warn "${APP} is already installed." + echo "" + + echo -n "${TAB}Uninstall ${APP}? (y/N): " + read -r uninstall_prompt + if [[ "${uninstall_prompt,,}" =~ ^(y|yes)$ ]]; then + uninstall + exit 0 + fi + + echo -n "${TAB}Update ${APP}? (y/N): " + read -r update_prompt + if [[ "${update_prompt,,}" =~ ^(y|yes)$ ]]; then + update + exit 0 + fi + + msg_warn "No action selected. Exiting." + exit 0 +fi + +# Fresh installation +msg_warn "${APP} is not installed." +echo "" +echo -e "${TAB}${INFO} This will install:" +echo -e "${TAB} - Arcane (via Docker Compose)" +echo "" + +echo -n "${TAB}Install ${APP}? (y/N): " +read -r install_prompt +if [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then + install +else + msg_warn "Installation cancelled. Exiting." + exit 0 +fi From aef833c87856d401d68a223a0afff39ca3fdb3e0 Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Wed, 18 Feb 2026 15:39:21 +0100 Subject: [PATCH 3/5] Update frontend/public/json/arcane.json Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- frontend/public/json/arcane.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/public/json/arcane.json b/frontend/public/json/arcane.json index 4f002e9ba..249aa99e4 100644 --- a/frontend/public/json/arcane.json +++ b/frontend/public/json/arcane.json @@ -19,9 +19,9 @@ "type": "default", "script": "tools/addon/arcane.sh", "resources": { - "cpu": 0, - "ram": 0, - "hdd": 0, + "cpu": null, + "ram": null, + "hdd": null, "os": null, "version": null } From 829f6bf03844ddad8c659e57e0d9c0c940367c4e Mon Sep 17 00:00:00 2001 From: summoningpixels <97950412+summoningpixels@users.noreply.github.com> Date: Wed, 18 Feb 2026 16:43:24 +0200 Subject: [PATCH 4/5] Update tools/addon/arcane.sh Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- tools/addon/arcane.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/addon/arcane.sh b/tools/addon/arcane.sh index 0653a347c..dd46994ef 100644 --- a/tools/addon/arcane.sh +++ b/tools/addon/arcane.sh @@ -6,9 +6,9 @@ # Source: https://github.com/getarcaneapp/arcane source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/core.func) -source <(curl -fsSL https://raw.githubusercontent.com/summoningpixels/ProxmoxVED/main/misc/tools.func) -source <(curl -fsSL https://raw.githubusercontent.com/summoningpixels/ProxmoxVED/main/miscmisc/error_handler.func) -source <(curl -fsSL https://raw.githubusercontent.com/summoningpixels/ProxmoxVED/main/misc/misc/api.func) 2>/dev/null || true +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/tools.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/error_handler.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/api.func) 2>/dev/null || true # Enable error handling set -Eeuo pipefail From ddb8d4890d412e0c2e01f51b9523ecb78caef5d1 Mon Sep 17 00:00:00 2001 From: summoningpixels <97950412+summoningpixels@users.noreply.github.com> Date: Wed, 18 Feb 2026 16:47:35 +0200 Subject: [PATCH 5/5] Update arcane.sh --- tools/addon/arcane.sh | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tools/addon/arcane.sh b/tools/addon/arcane.sh index dd46994ef..8bc14fd0e 100644 --- a/tools/addon/arcane.sh +++ b/tools/addon/arcane.sh @@ -4,7 +4,12 @@ # Author: summoningpixels # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/getarcaneapp/arcane - +if ! command -v curl &>/dev/null; then + printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2 + apt-get update >/dev/null 2>&1 + apt-get install -y curl >/dev/null 2>&1 +fi +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/core.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/core.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/tools.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/error_handler.func) @@ -51,7 +56,7 @@ function uninstall() { if [[ -f "$COMPOSE_FILE" ]]; then msg_info "Stopping and removing Docker containers" cd "$INSTALL_PATH" - $STD docker compose down --volumes --remove-orphans || true + $STD docker compose down --volumes --remove-orphans msg_ok "Stopped and removed Docker containers" fi