From 9536d8fd32b86d3aafadcdcfb8246436f0a61ae6 Mon Sep 17 00:00:00 2001 From: Denny Subke <155585746+dennysubke@users.noreply.github.com> Date: Fri, 28 Nov 2025 14:32:44 +0100 Subject: [PATCH] App Submission: Arcane (#4017) Co-authored-by: al-lac --- arcane/data/app_data/.gitkeep | 1 + arcane/data/docker/.gitkeep | 1 + arcane/data/projects/.gitkeep | 1 + arcane/docker-compose.yml | 43 +++++++++++++++++++++++++++ arcane/entrypoint.sh | 38 ++++++++++++++++++++++++ arcane/umbrel-app.yml | 56 +++++++++++++++++++++++++++++++++++ 6 files changed, 140 insertions(+) create mode 100644 arcane/data/app_data/.gitkeep create mode 100644 arcane/data/docker/.gitkeep create mode 100644 arcane/data/projects/.gitkeep create mode 100644 arcane/docker-compose.yml create mode 100755 arcane/entrypoint.sh create mode 100644 arcane/umbrel-app.yml diff --git a/arcane/data/app_data/.gitkeep b/arcane/data/app_data/.gitkeep new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/arcane/data/app_data/.gitkeep @@ -0,0 +1 @@ + diff --git a/arcane/data/docker/.gitkeep b/arcane/data/docker/.gitkeep new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/arcane/data/docker/.gitkeep @@ -0,0 +1 @@ + diff --git a/arcane/data/projects/.gitkeep b/arcane/data/projects/.gitkeep new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/arcane/data/projects/.gitkeep @@ -0,0 +1 @@ + diff --git a/arcane/docker-compose.yml b/arcane/docker-compose.yml new file mode 100644 index 00000000..05d0a024 --- /dev/null +++ b/arcane/docker-compose.yml @@ -0,0 +1,43 @@ +version: "3.7" + +services: + app_proxy: + environment: + APP_HOST: arcane_arcane_1 + APP_PORT: 3552 + + docker: + image: docker:27.2.0-dind@sha256:f9f72ad901a78f27be922b2d320bbc263174f12919c1b37e6a01f828fa904565 + privileged: true + network_mode: host + stop_grace_period: 1m + restart: on-failure + environment: + DOCKER_ENSURE_BRIDGE: "dind0:10.32.0.1/16" + entrypoint: /entrypoint.sh + command: > + dockerd + --bridge dind0 + --data-root /data/data + --exec-root /data/exec + --host unix:///data/docker.sock + --pidfile /data/docker.pid + volumes: + - ${APP_DATA_DIR}/entrypoint.sh:/entrypoint.sh + - ${APP_DATA_DIR}/data/docker:/data + + arcane: + image: ghcr.io/getarcaneapp/arcane:v1.9.0@sha256:0077d89944dea0be1bafa06a005bf6744b7551bcc3d07773928dd7457a8bad43 + depends_on: + - docker + restart: on-failure + environment: + APP_URL: http://${DEVICE_DOMAIN_NAME}:3552 + PUID: 1000 + PGID: 1000 + ENCRYPTION_KEY: ${APP_PASSWORD} + JWT_SECRET: ${APP_PASSWORD} + volumes: + - ${APP_DATA_DIR}/data/app_data:/app/data + - ${APP_DATA_DIR}/data/projects:/app/data/projects + - ${APP_DATA_DIR}/data/docker:/var/run diff --git a/arcane/entrypoint.sh b/arcane/entrypoint.sh new file mode 100755 index 00000000..9e29bdfe --- /dev/null +++ b/arcane/entrypoint.sh @@ -0,0 +1,38 @@ +#!/bin/sh + +pidfile="/var/run/docker.pid" +if [[ -f "${pidfile}" ]] +then + rm -f "${pidfile}" +fi + +for command in iptables iptables-restore iptables-restore-translate iptables-save iptables-translate +do + ln -sf /sbin/xtables-nft-multi /sbin/$command +done + +ensure_bridge_exists() { + local name="${1}" + local ip_range="${2}" + if ip link show "${name}" &>/dev/null + then + echo "Bridge '${name}' already exists. Skipping creation." + ip addr show "${name}" + return + fi + echo "Bridge '${name}' does not exist. Creating..." + ip link add "${name}" type bridge + ip addr add "${ip_range}" dev "${name}" + ip link set "${name}" up + echo "Bridge '${name}' is now up with IP range '${ip_range}'." + ip addr show "${name}" +} + +if [[ "${DOCKER_ENSURE_BRIDGE}" != "" ]] +then + bridge="${DOCKER_ENSURE_BRIDGE%%:*}" + ip_range="${DOCKER_ENSURE_BRIDGE#*:}" + ensure_bridge_exists "${bridge}" "${ip_range}" +fi + +exec dockerd-entrypoint.sh $@ diff --git a/arcane/umbrel-app.yml b/arcane/umbrel-app.yml new file mode 100644 index 00000000..5f794fc0 --- /dev/null +++ b/arcane/umbrel-app.yml @@ -0,0 +1,56 @@ +manifestVersion: 1 +id: arcane +category: developer +name: Arcane +version: "1.9.0" +tagline: An easy and modern Docker management platform +description: >- + ⚠️ Make sure to only use named Docker volumes for your containers and projects. Data in bind-mounted volumes will be lost when the Arcane app is restarted or updated. + + + ⚠️ Watch out for port conflicts between your custom Docker containers and your umbrelOS apps. + + + Arcane is a powerful and modern container management platform designed to simplify the way developers interact with Docker environments. It provides a seamless and visually appealing interface that brings all aspects of container management together in one place. Users can create, start, stop, and inspect containers, explore networks, manage images, and handle volumes with precision and control. + + + Beyond basic management, Arcane enhances productivity by offering integrated tools that developers typically rely on during their daily workflows. Its built-in terminal allows direct interaction with running containers, while the embedded code editor enables quick configuration or script adjustments without switching to external applications. Real-time system insights and detailed logging give users a clear view of their infrastructure’s performance and resource usage. + + + The platform is designed to bridge the gap between simplicity and advanced control. It combines a clean, modern design with powerful backend capabilities, making it equally suitable for developers experimenting locally and professionals managing larger setups. With Arcane, managing containers feels more like using a well-crafted development environment than an administrative dashboard, allowing users to focus on building and running applications instead of dealing with complex Docker commands. + + + + 🧩 Arcane on Umbrel is designed for advanced users who want complete control over their containers. Follow these recommendations to ensure a reliable and stable experience. + + + 1. Persistent data: Always use named Docker volumes for your containers and projects. Any data stored in bind mounts will be lost when the Arcane app is updated or restarted. + + + 2. Port usage: Be mindful of port conflicts between your containers, Umbrel system services, and other installed or future apps. Assign unique port numbers to prevent conflicts. + + + 3. Restart behavior: Configure your containers with the restart policy set to unless stopped or always. This ensures they automatically restart after Arcane restarts or updates. + + + 4. Web access: You can access any container that exposes a web interface at `umbrel.local:PORT_NUMBER`. For example, if your app runs on port 5050, open `http://umbrel.local:5050` in your browser. +website: https://getarcane.app/ +dependencies: [] +repo: https://github.com/getarcaneapp/arcane +support: https://github.com/getarcaneapp/arcane/issues +port: 3552 +gallery: + - 1.jpg + - 2.jpg + - 3.jpg + - 4.jpg + - 5.jpg +path: "" +defaultUsername: "arcane" +defaultPassword: "arcane-admin" +releaseNotes: "" +permissions: + - GPU +developer: Arcane +submitter: dennysubke +submission: https://github.com/getumbrel/umbrel-apps/pull/4017