diff --git a/ct/alpine-komodo.sh b/ct/alpine-komodo.sh index f1bf55c9d..e137a5e16 100644 --- a/ct/alpine-komodo.sh +++ b/ct/alpine-komodo.sh @@ -19,44 +19,46 @@ variables color catch_errors +ADDON_SCRIPT="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/komodo.sh" + function update_script() { - [[ -d /opt/komodo ]] || { + if [[ ! -d /opt/komodo ]]; then msg_error "No ${APP} Installation Found!" exit - } - - msg_info "Updating ${APP}" - COMPOSE_FILE=$(find /opt/komodo -maxdepth 1 -type f -name '*.compose.yaml' ! -name 'compose.env' | head -n1) - if [[ -z "$COMPOSE_FILE" ]]; then - msg_error "No valid compose file found in /opt/komodo!" - exit fi - COMPOSE_BASENAME=$(basename "$COMPOSE_FILE") - if [[ "$COMPOSE_BASENAME" == "sqlite.compose.yaml" || "$COMPOSE_BASENAME" == "postgres.compose.yaml" ]]; then - msg_error "❌ Detected outdated Komodo setup using SQLite or PostgreSQL (FerretDB v1)." - echo -e "${YW}This configuration is no longer supported since Komodo v1.18.0.${CL}" - echo -e "${YW}Please follow the migration guide:${CL}" - echo -e "${BGN}https://github.com/community-scripts/ProxmoxVE/discussions/5689${CL}\n" + msg_warn "⚠️ ${APP} has been migrated to an addon script." + echo "" + msg_info "This is a one-time migration. After this, you can update ${APP} anytime with:" + echo -e "${TAB}${TAB}${GN}update_komodo${CL} or ${GN}bash <(curl -fsSL ${ADDON_SCRIPT})${CL}" + echo "" + read -r -p "${TAB}Migrate update function now? [y/N]: " CONFIRM + if [[ ! "${CONFIRM,,}" =~ ^(y|yes)$ ]]; then + msg_warn "Migration skipped. The old update will continue to work for now." + msg_info "Updating ${APP} (legacy)" + COMPOSE_FILE=$(find /opt/komodo -maxdepth 1 -type f -name '*.compose.yaml' ! -name 'compose.env' | head -n1) + if [[ -z "$COMPOSE_FILE" ]]; then + msg_error "No valid compose file found in /opt/komodo!" + exit 1 + fi + $STD docker compose -p komodo -f "$COMPOSE_FILE" --env-file /opt/komodo/compose.env pull + $STD docker compose -p komodo -f "$COMPOSE_FILE" --env-file /opt/komodo/compose.env up -d + msg_ok "Updated ${APP}" exit fi - BACKUP_FILE="/opt/komodo/${COMPOSE_BASENAME}.bak_$(date +%Y%m%d_%H%M%S)" - cp "$COMPOSE_FILE" "$BACKUP_FILE" || { - msg_error "Failed to create backup of ${COMPOSE_BASENAME}!" - exit - } - GITHUB_URL="https://raw.githubusercontent.com/moghtech/komodo/main/compose/${COMPOSE_BASENAME}" - if ! curl -fsSL "$GITHUB_URL" -o "$COMPOSE_FILE"; then - msg_error "Failed to download ${COMPOSE_BASENAME} from GitHub!" - mv "$BACKUP_FILE" "$COMPOSE_FILE" - exit - fi - $STD docker compose -p komodo -f "$COMPOSE_FILE" --env-file /opt/komodo/compose.env pull - $STD docker compose -p komodo -f "$COMPOSE_FILE" --env-file /opt/komodo/compose.env up -d - msg_ok "Updated Alpine-Komodo" - msg_ok "Updated successfully!" - exit 0 + msg_info "Migrating update function" + cat <<'MIGRATION_EOF' >/usr/bin/update +bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/komodo.sh)" +MIGRATION_EOF + chmod +x /usr/bin/update + + ln -sf /usr/bin/update /usr/bin/update_komodo 2>/dev/null || true + msg_ok "Migration complete" + + msg_info "Running addon update" + type=update bash <(curl -fsSL "${ADDON_SCRIPT}") + exit } start diff --git a/ct/coolify.sh b/ct/coolify.sh index e09acec41..44c7ff2ba 100644 --- a/ct/coolify.sh +++ b/ct/coolify.sh @@ -19,6 +19,8 @@ variables color catch_errors +ADDON_SCRIPT="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/coolify.sh" + function update_script() { header_info check_container_storage @@ -29,10 +31,31 @@ function update_script() { exit fi - msg_info "Updating Coolify" - $STD bash <(curl -fsSL https://cdn.coollabs.io/coolify/install.sh) - msg_ok "Updated Coolify" - msg_ok "Updated successfully!" + msg_warn "⚠️ ${APP} has been migrated to an addon script." + echo "" + msg_info "This is a one-time migration. After this, you can update ${APP} anytime with:" + echo -e "${TAB}${TAB}${GN}update_coolify${CL} or ${GN}bash <(curl -fsSL ${ADDON_SCRIPT})${CL}" + echo "" + read -r -p "${TAB}Migrate update function now? [y/N]: " CONFIRM + if [[ ! "${CONFIRM,,}" =~ ^(y|yes)$ ]]; then + msg_warn "Migration skipped. The old update will continue to work for now." + msg_info "Updating ${APP} (legacy)" + $STD bash <(curl -fsSL https://cdn.coollabs.io/coolify/install.sh) + msg_ok "Updated ${APP}" + exit + fi + + msg_info "Migrating update function" + cat <<'MIGRATION_EOF' >/usr/bin/update +bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/coolify.sh)" +MIGRATION_EOF + chmod +x /usr/bin/update + + ln -sf /usr/bin/update /usr/bin/update_coolify 2>/dev/null || true + msg_ok "Migration complete" + + msg_info "Running addon update" + type=update bash <(curl -fsSL "${ADDON_SCRIPT}") exit } diff --git a/ct/dockge.sh b/ct/dockge.sh index b71a130c2..6612e165c 100644 --- a/ct/dockge.sh +++ b/ct/dockge.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) # Copyright (c) 2021-2026 tteck -# Author: tteck (tteckster) +# Author: tteck (tteckster) | Migration: MickLesk (CanbiZ) # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://dockge.kuma.pet/ @@ -19,26 +19,45 @@ variables color catch_errors +ADDON_SCRIPT="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/dockge.sh" + function update_script() { header_info check_container_storage check_container_resources + if [[ ! -d /opt/dockge ]]; then msg_error "No ${APP} Installation Found!" exit fi - msg_info "Updating base system" - $STD apt update - $STD apt upgrade -y - msg_ok "Base system updated" + msg_warn "⚠️ ${APP} has been migrated to an addon script." + echo "" + msg_info "This is a one-time migration. After this, you can update ${APP} anytime with:" + echo -e "${TAB}${TAB}${GN}update_dockge${CL} or ${GN}bash <(curl -fsSL ${ADDON_SCRIPT})${CL}" + echo "" + read -r -p "${TAB}Migrate update function now? [y/N]: " CONFIRM + if [[ ! "${CONFIRM,,}" =~ ^(y|yes)$ ]]; then + msg_warn "Migration skipped. The old update will continue to work for now." + msg_info "Updating ${APP} (legacy)" + cd /opt/dockge + $STD docker compose pull + $STD docker compose up -d + msg_ok "Updated ${APP}" + exit + fi - msg_info "Updating Dockge" - cd /opt/dockge - $STD docker compose pull - $STD docker compose up -d - msg_ok "Updated Dockge" - msg_ok "Updated successfully!" + msg_info "Migrating update function" + cat <<'MIGRATION_EOF' >/usr/bin/update +bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/dockge.sh)" +MIGRATION_EOF + chmod +x /usr/bin/update + + ln -sf /usr/bin/update /usr/bin/update_dockge 2>/dev/null || true + msg_ok "Migration complete" + + msg_info "Running addon update" + type=update bash <(curl -fsSL "${ADDON_SCRIPT}") exit } diff --git a/ct/dokploy.sh b/ct/dokploy.sh index 610c43ef9..55a2a9be6 100644 --- a/ct/dokploy.sh +++ b/ct/dokploy.sh @@ -19,6 +19,8 @@ variables color catch_errors +ADDON_SCRIPT="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/dokploy.sh" + function update_script() { header_info check_container_storage @@ -29,10 +31,31 @@ function update_script() { exit fi - msg_info "Updating Dokploy" - curl -sSL https://dokploy.com/install.sh | $STD bash -s update - msg_ok "Updated Dokploy" - msg_ok "Updated successfully!" + msg_warn "⚠️ ${APP} has been migrated to an addon script." + echo "" + msg_info "This is a one-time migration. After this, you can update ${APP} anytime with:" + echo -e "${TAB}${TAB}${GN}update_dokploy${CL} or ${GN}bash <(curl -fsSL ${ADDON_SCRIPT})${CL}" + echo "" + read -r -p "${TAB}Migrate update function now? [y/N]: " CONFIRM + if [[ ! "${CONFIRM,,}" =~ ^(y|yes)$ ]]; then + msg_warn "Migration skipped. The old update will continue to work for now." + msg_info "Updating ${APP} (legacy)" + curl -sSL https://dokploy.com/install.sh | $STD bash -s update + msg_ok "Updated ${APP}" + exit + fi + + msg_info "Migrating update function" + cat <<'MIGRATION_EOF' >/usr/bin/update +bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/dokploy.sh)" +MIGRATION_EOF + chmod +x /usr/bin/update + + ln -sf /usr/bin/update /usr/bin/update_dokploy 2>/dev/null || true + msg_ok "Migration complete" + + msg_info "Running addon update" + type=update bash <(curl -fsSL "${ADDON_SCRIPT}") exit } diff --git a/ct/komodo.sh b/ct/komodo.sh index c71827eb6..a1a54dc33 100644 --- a/ct/komodo.sh +++ b/ct/komodo.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) # Copyright (c) 2021-2026 community-scripts ORG -# Author: MickLesk +# Author: MickLesk (CanbiZ) # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://komo.do/ @@ -19,49 +19,49 @@ variables color catch_errors +ADDON_SCRIPT="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/komodo.sh" + function update_script() { header_info check_container_storage check_container_resources - [[ -d /opt/komodo ]] || { + if [[ ! -d /opt/komodo ]]; then msg_error "No ${APP} Installation Found!" - exit 1 - } - - msg_info "Updating Komodo" - COMPOSE_FILE=$(find /opt/komodo -maxdepth 1 -type f -name '*.compose.yaml' ! -name 'compose.env' | head -n1) - if [[ -z "$COMPOSE_FILE" ]]; then - msg_error "No valid compose file found in /opt/komodo!" - exit 1 - fi - COMPOSE_BASENAME=$(basename "$COMPOSE_FILE") - - if [[ "$COMPOSE_BASENAME" == "sqlite.compose.yaml" || "$COMPOSE_BASENAME" == "postgres.compose.yaml" ]]; then - msg_error "❌ Detected outdated Komodo setup using SQLite or PostgreSQL (FerretDB v1)." - echo -e "${YW}This configuration is no longer supported since Komodo v1.18.0.${CL}" - echo -e "${YW}Please follow the migration guide:${CL}" - echo -e "${BGN}https://github.com/community-scripts/ProxmoxVE/discussions/5689${CL}\n" - exit 1 + exit fi - BACKUP_FILE="/opt/komodo/${COMPOSE_BASENAME}.bak_$(date +%Y%m%d_%H%M%S)" - cp "$COMPOSE_FILE" "$BACKUP_FILE" || { - msg_error "Failed to create backup of ${COMPOSE_BASENAME}!" - exit 1 - } - GITHUB_URL="https://raw.githubusercontent.com/moghtech/komodo/main/compose/${COMPOSE_BASENAME}" - if ! curl -fsSL "$GITHUB_URL" -o "$COMPOSE_FILE"; then - msg_error "Failed to download ${COMPOSE_BASENAME} from GitHub!" - mv "$BACKUP_FILE" "$COMPOSE_FILE" - exit 1 + msg_warn "⚠️ ${APP} has been migrated to an addon script." + echo "" + msg_info "This is a one-time migration. After this, you can update ${APP} anytime with:" + echo -e "${TAB}${TAB}${GN}update_komodo${CL} or ${GN}bash <(curl -fsSL ${ADDON_SCRIPT})${CL}" + echo "" + read -r -p "${TAB}Migrate update function now? [y/N]: " CONFIRM + if [[ ! "${CONFIRM,,}" =~ ^(y|yes)$ ]]; then + msg_warn "Migration skipped. The old update will continue to work for now." + msg_info "Updating ${APP} (legacy)" + COMPOSE_FILE=$(find /opt/komodo -maxdepth 1 -type f -name '*.compose.yaml' ! -name 'compose.env' | head -n1) + if [[ -z "$COMPOSE_FILE" ]]; then + msg_error "No valid compose file found in /opt/komodo!" + exit 1 + fi + $STD docker compose -p komodo -f "$COMPOSE_FILE" --env-file /opt/komodo/compose.env pull + $STD docker compose -p komodo -f "$COMPOSE_FILE" --env-file /opt/komodo/compose.env up -d + msg_ok "Updated ${APP}" + exit fi - if ! grep -qxF 'COMPOSE_KOMODO_BACKUPS_PATH=/etc/komodo/backups' /opt/komodo/compose.env; then - sed -i '/^COMPOSE_KOMODO_IMAGE_TAG=latest$/a COMPOSE_KOMODO_BACKUPS_PATH=/etc/komodo/backups' /opt/komodo/compose.env - fi - $STD docker compose -p komodo -f "$COMPOSE_FILE" --env-file /opt/komodo/compose.env pull - $STD docker compose -p komodo -f "$COMPOSE_FILE" --env-file /opt/komodo/compose.env up -d - msg_ok "Updated Komodo" + + msg_info "Migrating update function" + cat <<'MIGRATION_EOF' >/usr/bin/update +bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/komodo.sh)" +MIGRATION_EOF + chmod +x /usr/bin/update + + ln -sf /usr/bin/update /usr/bin/update_komodo 2>/dev/null || true + msg_ok "Migration complete" + + msg_info "Running addon update" + type=update bash <(curl -fsSL "${ADDON_SCRIPT}") exit } diff --git a/ct/runtipi.sh b/ct/runtipi.sh index 105bcc8b7..4b62015a4 100644 --- a/ct/runtipi.sh +++ b/ct/runtipi.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) # Copyright (c) 2021-2026 tteck -# Author: tteck (tteckster) +# Author: tteck (tteckster) | Migration: MickLesk (CanbiZ) # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://runtipi.io/ @@ -19,16 +19,43 @@ variables color catch_errors +ADDON_SCRIPT="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/runtipi.sh" + function update_script() { header_info check_container_storage check_container_resources + if [[ ! -d /opt/runtipi ]]; then msg_error "No ${APP} Installation Found!" exit fi - cd /opt/runtipi && ./runtipi-cli update latest - msg_ok "Updated successfully!" + + msg_warn "⚠️ ${APP} has been migrated to an addon script." + echo "" + msg_info "This is a one-time migration. After this, you can update ${APP} anytime with:" + echo -e "${TAB}${TAB}${GN}update_runtipi${CL} or ${GN}bash <(curl -fsSL ${ADDON_SCRIPT})${CL}" + echo "" + read -r -p "${TAB}Migrate update function now? [y/N]: " CONFIRM + if [[ ! "${CONFIRM,,}" =~ ^(y|yes)$ ]]; then + msg_warn "Migration skipped. The old update will continue to work for now." + msg_info "Updating ${APP} (legacy)" + cd /opt/runtipi && ./runtipi-cli update latest + msg_ok "Updated ${APP}" + exit + fi + + msg_info "Migrating update function" + cat <<'MIGRATION_EOF' >/usr/bin/update +bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/runtipi.sh)" +MIGRATION_EOF + chmod +x /usr/bin/update + + ln -sf /usr/bin/update /usr/bin/update_runtipi 2>/dev/null || true + msg_ok "Migration complete" + + msg_info "Running addon update" + type=update bash <(curl -fsSL "${ADDON_SCRIPT}") exit } diff --git a/frontend/public/json/coolify.json b/frontend/public/json/coolify.json index 5a7c17ecd..82fe06409 100644 --- a/frontend/public/json/coolify.json +++ b/frontend/public/json/coolify.json @@ -1,52 +1,56 @@ { - "name": "Coolify", - "slug": "coolify", - "categories": [ - 3 - ], - "date_created": "2025-12-09", - "type": "ct", - "updateable": true, - "privileged": false, - "interface_port": 8000, - "documentation": "https://coolify.io/docs", - "config_path": "/data/coolify", - "website": "https://coolify.io/", - "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/coolify.webp", - "description": "Coolify is an open-source & self-hostable alternative to Heroku, Netlify, and Vercel. It helps you manage your servers, applications, and databases on your own hardware with Docker. Deploy any application from Git repositories, Docker images, or use pre-built templates.", - "install_methods": [ - { - "type": "default", - "script": "ct/coolify.sh", - "resources": { - "cpu": 2, - "ram": 4096, - "hdd": 30, - "os": "Debian", - "version": "13" - } - } - ], - "default_credentials": { - "username": null, - "password": null + "name": "Coolify", + "slug": "coolify", + "categories": [ + 3 + ], + "date_created": "2025-12-09", + "type": "addon", + "updateable": true, + "privileged": false, + "interface_port": 8000, + "documentation": "https://coolify.io/docs", + "website": "https://coolify.io/", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/coolify.webp", + "config_path": "/data/coolify", + "description": "Coolify is an open-source & self-hostable alternative to Heroku, Netlify, and Vercel. It helps you manage your servers, applications, and databases on your own hardware with Docker. Deploy any application from Git repositories, Docker images, or use pre-built templates.", + "install_methods": [ + { + "type": "default", + "script": "tools/addon/coolify.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "This is an addon script intended to be used on top of an existing Docker container.", + "type": "info" }, - "notes": [ - { - "text": "Initial setup will be done via the web interface on first access.", - "type": "info" - }, - { - "text": "Coolify has built-in auto-updates. You can configure update frequency in Settings.", - "type": "info" - }, - { - "text": "Coolify requires SSH access to manage deployments. SSH is enabled automatically.", - "type": "info" - }, - { - "text": "This container uses Docker-in-Docker (nesting) for application deployments.", - "type": "warning" - } - ] + { + "text": "Execute within an existing LXC console (Debian / Ubuntu / Alpine supported)", + "type": "info" + }, + { + "text": "Initial setup will be done via the web interface on first access.", + "type": "info" + }, + { + "text": "Coolify has built-in auto-updates. You can configure update frequency in Settings.", + "type": "info" + }, + { + "text": "To update via CLI, run the addon script again and select Update, or use: bash <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/coolify.sh)", + "type": "info" + } + ] } diff --git a/frontend/public/json/dockge.json b/frontend/public/json/dockge.json index 75c590f2c..a0d60f184 100644 --- a/frontend/public/json/dockge.json +++ b/frontend/public/json/dockge.json @@ -5,25 +5,25 @@ 3 ], "date_created": "2024-05-02", - "type": "ct", + "type": "addon", "updateable": true, "privileged": false, "interface_port": 5001, "documentation": null, "website": "https://github.com/louislam/dockge", "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/dockge.webp", - "config_path": "", + "config_path": "/opt/dockge/compose.yaml", "description": "Dockge is a fancy, easy-to-use and reactive self-hosted docker compose.yaml stack-oriented manager.", "install_methods": [ { "type": "default", - "script": "ct/dockge.sh", + "script": "tools/addon/dockge.sh", "resources": { - "cpu": 2, - "ram": 2048, - "hdd": 18, - "os": "debian", - "version": "13" + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null } } ], @@ -33,12 +33,16 @@ }, "notes": [ { - "text": "Options to add Immich and/or Home Assistant", + "text": "This is an addon script intended to be used on top of an existing Docker container.", "type": "info" }, { - "text": "If the LXC is created Privileged, the script will automatically set up USB passthrough.", - "type": "warning" + "text": "Execute within an existing LXC console (Debian / Ubuntu / Alpine supported)", + "type": "info" + }, + { + "text": "To update, run the addon script again and select Update, or use: bash <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/dockge.sh)", + "type": "info" } ] } diff --git a/frontend/public/json/dokploy.json b/frontend/public/json/dokploy.json index 59b4941e7..a07a2ec19 100644 --- a/frontend/public/json/dokploy.json +++ b/frontend/public/json/dokploy.json @@ -1,48 +1,56 @@ { - "name": "Dokploy", - "slug": "dokploy", - "categories": [ - 3 - ], - "date_created": "2025-12-09", - "type": "ct", - "updateable": true, - "privileged": true, - "interface_port": 3000, - "documentation": "https://docs.dokploy.com/", - "config_path": "/etc/dokploy", - "website": "https://dokploy.com/", - "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/png/dokploy.png", - "description": "Dokploy is a free, self-hostable Platform as a Service (PaaS) that simplifies the deployment and management of applications and databases. Built with Docker and Traefik, it offers features like automatic SSL, Docker Compose support, database backups, and a real-time monitoring dashboard.", - "install_methods": [ - { - "type": "default", - "script": "ct/dokploy.sh", - "resources": { - "cpu": 2, - "ram": 2048, - "hdd": 10, - "os": "Debian", - "version": "13" - } - } - ], - "default_credentials": { - "username": null, - "password": null + "name": "Dokploy", + "slug": "dokploy", + "categories": [ + 3 + ], + "date_created": "2025-12-09", + "type": "addon", + "updateable": true, + "privileged": true, + "interface_port": 3000, + "documentation": "https://docs.dokploy.com/", + "website": "https://dokploy.com/", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/png/dokploy.png", + "config_path": "/etc/dokploy", + "description": "Dokploy is a free, self-hostable Platform as a Service (PaaS) that simplifies the deployment and management of applications and databases. Built with Docker and Traefik, it offers features like automatic SSL, Docker Compose support, database backups, and a real-time monitoring dashboard.", + "install_methods": [ + { + "type": "default", + "script": "tools/addon/dokploy.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "This is an addon script intended to be used on top of an existing Docker container.", + "type": "info" }, - "notes": [ - { - "text": "Initial setup will be done via the web interface on first access.", - "type": "info" - }, - { - "text": "Dokploy has built-in auto-updates via the web interface.", - "type": "info" - }, - { - "text": "This container uses Docker-in-Docker (nesting) for application deployments.", - "type": "warning" - } - ] + { + "text": "Execute within an existing LXC console (Debian / Ubuntu / Alpine supported)", + "type": "info" + }, + { + "text": "Initial setup will be done via the web interface on first access.", + "type": "info" + }, + { + "text": "Dokploy has built-in auto-updates via the web interface.", + "type": "info" + }, + { + "text": "To update via CLI, run the addon script again and select Update, or use: bash <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/dokploy.sh)", + "type": "info" + } + ] } diff --git a/frontend/public/json/komodo.json b/frontend/public/json/komodo.json index 051ad5ec3..e594ffc60 100644 --- a/frontend/public/json/komodo.json +++ b/frontend/public/json/komodo.json @@ -5,7 +5,7 @@ 3 ], "date_created": "2025-01-01", - "type": "ct", + "type": "addon", "updateable": true, "privileged": false, "interface_port": 9120, @@ -17,24 +17,13 @@ "install_methods": [ { "type": "default", - "script": "ct/komodo.sh", + "script": "tools/addon/komodo.sh", "resources": { - "cpu": 2, - "ram": 2048, - "hdd": 10, - "os": "debian", - "version": "13" - } - }, - { - "type": "alpine", - "script": "ct/alpine-komodo.sh", - "resources": { - "cpu": 1, - "ram": 1024, - "hdd": 10, - "os": "alpine", - "version": "3.23" + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null } } ], @@ -44,7 +33,19 @@ }, "notes": [ { - "text": "For admin username and password type `cat ~/komodo.creds` inside LXC.", + "text": "This is an addon script intended to be used on top of an existing Docker container.", + "type": "info" + }, + { + "text": "Execute within an existing LXC console (Debian / Ubuntu / Alpine supported)", + "type": "info" + }, + { + "text": "For admin username and password, run: cat ~/komodo.creds", + "type": "info" + }, + { + "text": "To update, run the addon script again and select Update, or use: bash <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/komodo.sh)", "type": "info" } ] diff --git a/frontend/public/json/runtipi.json b/frontend/public/json/runtipi.json index fb8772c5c..fc517447b 100644 --- a/frontend/public/json/runtipi.json +++ b/frontend/public/json/runtipi.json @@ -5,25 +5,25 @@ 2 ], "date_created": "2024-05-02", - "type": "ct", + "type": "addon", "updateable": true, "privileged": false, "interface_port": 80, "documentation": "https://runtipi.io/docs/introduction", "website": "https://runtipi.io/", "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/runtipi.webp", - "config_path": "opt/runtipi/state/settings.json", + "config_path": "/opt/runtipi/state/settings.json", "description": "Runtipi lets you install all your favorite self-hosted apps without the hassle of configuring and managing each service. One-click installs and updates for more than 180 popular apps.", "install_methods": [ { "type": "default", - "script": "ct/runtipi.sh", + "script": "tools/addon/runtipi.sh", "resources": { - "cpu": 2, - "ram": 2048, - "hdd": 8, - "os": "debian", - "version": "13" + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null } } ], @@ -32,9 +32,21 @@ "password": null }, "notes": [ + { + "text": "This is an addon script intended to be used on top of an existing Docker container.", + "type": "info" + }, + { + "text": "Execute within an existing LXC console (Debian / Ubuntu only)", + "type": "info" + }, { "text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.", "type": "warning" + }, + { + "text": "To update via CLI, run the addon script again and select Update, or use: bash <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/runtipi.sh)", + "type": "info" } ] } diff --git a/install/alpine-komodo-install.sh b/install/alpine-komodo-install.sh deleted file mode 100644 index 9a4e38c2c..000000000 --- a/install/alpine-komodo-install.sh +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE -# Source: https://komo.do/ - -source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" -color -verb_ip6 -catch_errors -setting_up_container -network_check -update_os - -msg_info "Installing Dependencies" -$STD apk add --no-cache ca-certificates openssl -msg_ok "Installed Dependencies" - -msg_info "Setup Docker Repository" -$STD apk add --no-cache docker docker-cli docker-compose openrc -msg_ok "Setup Docker Repository" - -msg_info "Enabling Docker Service" -$STD rc-update add docker boot -$STD service docker start -msg_ok "Enabled Docker Service" - -echo "${TAB3}Choose the database for Komodo installation:" -echo "${TAB3}1) MongoDB (recommended)" -echo "${TAB3}2) FerretDB" -read -rp "${TAB3}Enter your choice (default: 1): " DB_CHOICE -DB_CHOICE=${DB_CHOICE:-1} - -case $DB_CHOICE in -1) - DB_COMPOSE_FILE="mongo.compose.yaml" - ;; -2) - DB_COMPOSE_FILE="ferretdb.compose.yaml" - ;; -*) - echo "Invalid choice. Defaulting to MongoDB." - DB_COMPOSE_FILE="mongo.compose.yaml" - ;; -esac - -mkdir -p /opt/komodo -cd /opt/komodo -curl -fsSL "https://raw.githubusercontent.com/moghtech/komodo/main/compose/$DB_COMPOSE_FILE" -o "$(basename "$DB_COMPOSE_FILE")" - -msg_info "Setup Komodo Environment" -curl -fsSL "https://raw.githubusercontent.com/moghtech/komodo/main/compose/compose.env" -o "/opt/komodo/compose.env" -DB_PASSWORD=$(openssl rand -base64 16 | tr -d '/+=') -PASSKEY=$(openssl rand -base64 24 | tr -d '/+=') -WEBHOOK_SECRET=$(openssl rand -base64 24 | tr -d '/+=') -JWT_SECRET=$(openssl rand -base64 24 | tr -d '/+=') - -sed -i "s/^KOMODO_DB_USERNAME=.*/KOMODO_DB_USERNAME=komodo_admin/" /opt/komodo/compose.env -sed -i "s/^KOMODO_DB_PASSWORD=.*/KOMODO_DB_PASSWORD=${DB_PASSWORD}/" /opt/komodo/compose.env -sed -i "s/^KOMODO_PASSKEY=.*/KOMODO_PASSKEY=${PASSKEY}/" /opt/komodo/compose.env -sed -i "s/^KOMODO_WEBHOOK_SECRET=.*/KOMODO_WEBHOOK_SECRET=${WEBHOOK_SECRET}/" /opt/komodo/compose.env -sed -i "s/^KOMODO_JWT_SECRET=.*/KOMODO_JWT_SECRET=${JWT_SECRET}/" /opt/komodo/compose.env -msg_ok "Setup Komodo Environment" - -msg_info "Initialize Komodo" -$STD docker compose -p komodo -f "/opt/komodo/$DB_COMPOSE_FILE" --env-file /opt/komodo/compose.env up -d -msg_ok "Initialized Komodo" - -motd_ssh -customize - -msg_info "Cleaning up" -$STD apk cache clean -msg_ok "Cleaned" diff --git a/install/coolify-install.sh b/install/coolify-install.sh deleted file mode 100644 index 7ad9325c2..000000000 --- a/install/coolify-install.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE -# Source: https://coolify.io/ - -source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" -color -verb_ip6 -catch_errors -setting_up_container -network_check -update_os - -msg_info "Installing Dependencies" -$STD apt install -y \ - git \ - openssl -msg_ok "Installed Dependencies" - -msg_warn "WARNING: This script will run an external installer from a third-party source (https://coolify.io/)." -msg_warn "The following code is NOT maintained or audited by our repository." -msg_warn "If you have any doubts or concerns, please review the installer code before proceeding:" -msg_custom "${TAB3}${GATEWAY}${BGN}${CL}" "\e[1;34m" "→ https://cdn.coollabs.io/coolify/install.sh" -echo -read -r -p "${TAB3}Do you want to continue? [y/N]: " CONFIRM -if [[ ! "$CONFIRM" =~ ^([yY][eE][sS]|[yY])$ ]]; then - msg_error "Aborted by user. No changes have been made." - exit 10 -fi - -msg_info "Installing Coolify (Patience - this installs Docker and pulls containers)" -$STD bash <(curl -fsSL https://cdn.coollabs.io/coolify/install.sh) -msg_ok "Installed Coolify" - -motd_ssh -customize -cleanup_lxc diff --git a/install/dockge-install.sh b/install/dockge-install.sh deleted file mode 100644 index f6e9f2fed..000000000 --- a/install/dockge-install.sh +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 tteck -# Author: tteck (tteckster) -# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE -# Source: https://dockge.kuma.pet/ - -source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" -color -verb_ip6 -catch_errors -setting_up_container -network_check -update_os - -DOCKER_LATEST_VERSION=$(get_latest_github_release "moby/moby") - -msg_info "Installing Docker $DOCKER_LATEST_VERSION (with Compose, Buildx)" -DOCKER_CONFIG_PATH='/etc/docker/daemon.json' -mkdir -p $(dirname $DOCKER_CONFIG_PATH) -echo -e '{\n "log-driver": "journald"\n}' >/etc/docker/daemon.json -$STD sh <(curl -fsSL https://get.docker.com) -msg_ok "Installed Docker $DOCKER_LATEST_VERSION" - -msg_info "Installing Dockge" -mkdir -p /opt/{dockge,stacks} -curl -fsSL "https://raw.githubusercontent.com/louislam/dockge/master/compose.yaml" -o "/opt/dockge/compose.yaml" -cd /opt/dockge -$STD docker compose up -d -msg_ok "Installed Dockge" - -read -r -p "${TAB3}Would you like to add Immich? " prompt -if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then - msg_info "Adding Immich compose.yaml" - mkdir -p /opt/stacks/immich - curl -fsSL "https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml" -o "/opt/stacks/immich/compose.yaml" - curl -fsSL "https://github.com/immich-app/immich/releases/latest/download/example.env" -o "/opt/stacks/immich/.env" - msg_ok "Added Immich compose.yaml" -fi - -read -r -p "${TAB3}Would you like to add Home Assistant? " prompt -if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then - msg_info "Adding Home Assistant compose.yaml" - mkdir -p /opt/stacks/homeassistant - cat </opt/stacks/homeassistant/compose.yaml -version: "3" -services: - homeassistant: - container_name: homeassistant - image: ghcr.io/home-assistant/home-assistant:stable - volumes: - - ./config:/config - - /etc/localtime:/etc/localtime:ro - - /run/dbus:/run/dbus:ro - restart: unless-stopped - privileged: true - network_mode: host -EOF - msg_ok "Added Home Assistant compose.yaml" -fi - -motd_ssh -customize -cleanup_lxc diff --git a/install/dokploy-install.sh b/install/dokploy-install.sh deleted file mode 100644 index 988749f30..000000000 --- a/install/dokploy-install.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE -# Source: https://dokploy.com/ - -source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" -color -verb_ip6 -catch_errors -setting_up_container -network_check -update_os - -msg_info "Installing Dependencies" -$STD apt install -y \ - git \ - openssl \ - redis -msg_ok "Installed Dependencies" - -msg_warn "WARNING: This script will run an external installer from a third-party source (https://dokploy.com/)." -msg_warn "The following code is NOT maintained or audited by our repository." -msg_warn "If you have any doubts or concerns, please review the installer code before proceeding:" -msg_custom "${TAB3}${GATEWAY}${BGN}${CL}" "\e[1;34m" "→ https://dokploy.com/install.sh" -echo -read -r -p "${TAB3}Do you want to continue? [y/N]: " CONFIRM -if [[ ! "$CONFIRM" =~ ^([yY][eE][sS]|[yY])$ ]]; then - msg_error "Aborted by user. No changes have been made." - exit 10 -fi - -msg_info "Installing Dokploy (Patience - this installs Docker and pulls containers)" -$STD bash <(curl -sSL https://dokploy.com/install.sh) -msg_ok "Installed Dokploy" - -motd_ssh -customize -cleanup_lxc diff --git a/install/komodo-install.sh b/install/komodo-install.sh deleted file mode 100644 index 272b2bfeb..000000000 --- a/install/komodo-install.sh +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: MickLesk -# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE -# Source: https://komo.do/ - -source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" -color -verb_ip6 -catch_errors -setting_up_container -network_check -update_os - -msg_info "Setup Docker Repository" -setup_deb822_repo \ - "docker" \ - "https://download.docker.com/linux/$(get_os_info id)/gpg" \ - "https://download.docker.com/linux/$(get_os_info id)" \ - "$(get_os_info codename)" \ - "stable" \ - "$(dpkg --print-architecture)" -msg_ok "Setup Docker Repository" - -msg_info "Installing Docker" -$STD apt install -y \ - docker-ce \ - docker-ce-cli \ - containerd.io \ - docker-buildx-plugin \ - docker-compose-plugin -msg_ok "Installed Docker" - -echo "${TAB3}Choose the database for Komodo installation:" -echo "${TAB3}1) MongoDB (recommended)" -echo "${TAB3}2) FerretDB" -read -rp "${TAB3}Enter your choice (default: 1): " DB_CHOICE -DB_CHOICE=${DB_CHOICE:-1} - -case $DB_CHOICE in -1) - DB_COMPOSE_FILE="mongo.compose.yaml" - ;; -2) - DB_COMPOSE_FILE="ferretdb.compose.yaml" - ;; -*) - echo "Invalid choice. Defaulting to MongoDB." - DB_COMPOSE_FILE="mongo.compose.yaml" - ;; -esac -mkdir -p /opt/komodo -cd /opt/komodo -curl -fsSL "https://raw.githubusercontent.com/moghtech/komodo/main/compose/$DB_COMPOSE_FILE" -o "/opt/komodo/$DB_COMPOSE_FILE" - -msg_info "Setup Komodo Environment" -curl -fsSL "https://raw.githubusercontent.com/moghtech/komodo/main/compose/compose.env" -o "/opt/komodo/compose.env" -DB_PASSWORD=$(openssl rand -base64 16 | tr -d '/+=') -ADMIN_PASSWORD=$(openssl rand -base64 8 | tr -d '/+=') -PASSKEY=$(openssl rand -base64 24 | tr -d '/+=') -WEBHOOK_SECRET=$(openssl rand -base64 24 | tr -d '/+=') -JWT_SECRET=$(openssl rand -base64 24 | tr -d '/+=') - -sed -i "s/^KOMODO_DB_USERNAME=.*/KOMODO_DB_USERNAME=komodo_admin/" /opt/komodo/compose.env -sed -i "s/^KOMODO_DB_PASSWORD=.*/KOMODO_DB_PASSWORD=${DB_PASSWORD}/" /opt/komodo/compose.env -sed -i "s/^KOMODO_INIT_ADMIN_PASSWORD=changeme/KOMODO_INIT_ADMIN_PASSWORD=${ADMIN_PASSWORD}/" /opt/komodo/compose.env -sed -i "s/^KOMODO_PASSKEY=.*/KOMODO_PASSKEY=${PASSKEY}/" /opt/komodo/compose.env -sed -i "s/^KOMODO_WEBHOOK_SECRET=.*/KOMODO_WEBHOOK_SECRET=${WEBHOOK_SECRET}/" /opt/komodo/compose.env -sed -i "s/^KOMODO_JWT_SECRET=.*/KOMODO_JWT_SECRET=${JWT_SECRET}/" /opt/komodo/compose.env -{ - echo "Komodo Credentials" - echo "" - echo "Admin User : admin" - echo "Admin Password: $ADMIN_PASSWORD" -} >>~/komodo.creds -msg_ok "Setup Komodo Environment" - -msg_info "Initialize Komodo" -$STD docker compose -p komodo -f /opt/komodo/$DB_COMPOSE_FILE --env-file /opt/komodo/compose.env up -d -msg_ok "Initialized Komodo" - -motd_ssh -customize -cleanup_lxc diff --git a/install/runtipi-install.sh b/install/runtipi-install.sh deleted file mode 100644 index 04ec9c974..000000000 --- a/install/runtipi-install.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 tteck -# Author: tteck (tteckster) -# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE -# Source: https://runtipi.io/ - -source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" -color -verb_ip6 -catch_errors -setting_up_container -network_check -update_os - -msg_warn "WARNING: This script will run an external installer from a third-party source (https://runtipi.io/)." -msg_warn "The following code is NOT maintained or audited by our repository." -msg_warn "If you have any doubts or concerns, please review the installer code before proceeding:" -msg_custom "${TAB3}${GATEWAY}${BGN}${CL}" "\e[1;34m" "→ https://raw.githubusercontent.com/runtipi/runtipi/master/scripts/install.sh" -echo -read -r -p "${TAB3}Do you want to continue? [y/N]: " CONFIRM -if [[ ! "$CONFIRM" =~ ^([yY][eE][sS]|[yY])$ ]]; then - msg_error "Aborted by user. No changes have been made." - exit 10 -fi - -msg_info "Installing Runtipi (Patience)" -DOCKER_CONFIG_PATH='/etc/docker/daemon.json' -mkdir -p "$(dirname "$DOCKER_CONFIG_PATH")" -echo -e '{\n "log-driver": "journald"\n}' >"$DOCKER_CONFIG_PATH" -cd /opt -curl -fsSL "https://raw.githubusercontent.com/runtipi/runtipi/master/scripts/install.sh" -o "install.sh" -chmod +x install.sh -$STD ./install.sh -chmod 666 /opt/runtipi/state/settings.json -rm -f /opt/install.sh -msg_ok "Installed Runtipi" - -motd_ssh -customize -cleanup_lxc diff --git a/misc/core.func b/misc/core.func index 2175a26bb..d31c486d5 100644 --- a/misc/core.func +++ b/misc/core.func @@ -848,7 +848,9 @@ exit_script() { get_header() { local app_name=$(echo "${APP,,}" | tr -d ' ') local app_type=${APP_TYPE:-ct} # Default to 'ct' if not set - local header_url="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/${app_type}/headers/${app_name}" + local header_dir="${app_type}" + [[ "$app_type" == "addon" ]] && header_dir="tools" + local header_url="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/${header_dir}/headers/${app_name}" local local_header_path="/usr/local/community-scripts/headers/${app_type}/${app_name}" mkdir -p "$(dirname "$local_header_path")" diff --git a/tools/addon/coolify.sh b/tools/addon/coolify.sh new file mode 100644 index 000000000..f85a27a51 --- /dev/null +++ b/tools/addon/coolify.sh @@ -0,0 +1,215 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://coolify.io/ | Github: https://github.com/coollabsio/coolify +if ! command -v curl &>/dev/null; then + printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2 + if [[ -f /etc/alpine-release ]]; then + apk update >/dev/null 2>&1 + apk add --no-cache curl >/dev/null 2>&1 + else + apt-get update >/dev/null 2>&1 + apt-get install -y curl >/dev/null 2>&1 + fi +fi +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true + +# Enable error handling +set -Eeuo pipefail +trap 'error_handler' ERR + +# ============================================================================== +# CONFIGURATION +# ============================================================================== +APP="Coolify" +APP_TYPE="addon" +INSTALL_PATH="/data/coolify" +DEFAULT_PORT=8000 + +# Initialize all core functions (colors, formatting, icons, STD mode) +load_functions + +# ============================================================================== +# UNINSTALL +# ============================================================================== +function uninstall() { + msg_info "Uninstalling ${APP}" + + if command -v docker &>/dev/null; then + msg_info "Stopping and removing Docker containers" + cd /data/coolify/source 2>/dev/null && docker compose down --remove-orphans 2>/dev/null || true + $STD docker stop $(docker ps -aq) 2>/dev/null || true + $STD docker rm $(docker ps -aq) 2>/dev/null || true + $STD docker network prune -f 2>/dev/null || true + msg_ok "Stopped and removed Docker containers" + fi + + rm -rf "$INSTALL_PATH" + msg_ok "${APP} has been uninstalled" +} + +# ============================================================================== +# UPDATE +# ============================================================================== +function update() { + msg_info "Updating ${APP}" + $STD bash <(curl -fsSL https://cdn.coollabs.io/coolify/install.sh) + msg_ok "Updated ${APP}" + + msg_ok "Updated successfully" + exit +} + +# ============================================================================== +# PROXMOX HOST CHECK +# ============================================================================== +function check_proxmox_host() { + if command -v pveversion &>/dev/null; then + msg_error "Running on the Proxmox host is NOT recommended!" + msg_error "This should be executed inside an LXC container." + echo "" + echo -n "${TAB}Continue anyway? (y/N): " + read -r confirm + if [[ ! "${confirm,,}" =~ ^(y|yes)$ ]]; then + msg_warn "Aborted. Please run this inside an LXC container." + exit 0 + fi + msg_warn "Proceeding on Proxmox host at your own risk!" + fi +} + +# ============================================================================== +# CHECK / INSTALL DOCKER +# ============================================================================== +function check_or_install_docker() { + if command -v docker &>/dev/null; then + msg_ok "Docker $(docker --version | cut -d' ' -f3 | tr -d ',') is available" + if docker compose version &>/dev/null; then + msg_ok "Docker Compose is available" + else + msg_error "Docker Compose plugin is not available. Please install it." + exit 1 + fi + return + fi + + msg_warn "Docker is not installed." + echo -n "${TAB}Install Docker now? (y/N): " + read -r install_docker_prompt + if [[ ! "${install_docker_prompt,,}" =~ ^(y|yes)$ ]]; then + msg_error "Docker is required for ${APP}. Exiting." + exit 1 + fi + + msg_info "Installing Docker" + if [[ -f /etc/alpine-release ]]; then + $STD apk add docker docker-cli-compose + $STD rc-service docker start + $STD rc-update add docker default + else + DOCKER_CONFIG_PATH='/etc/docker/daemon.json' + mkdir -p "$(dirname "$DOCKER_CONFIG_PATH")" + echo -e '{\n "log-driver": "journald"\n}' >"$DOCKER_CONFIG_PATH" + $STD sh <(curl -fsSL https://get.docker.com) + fi + msg_ok "Installed Docker" +} + +# ============================================================================== +# INSTALL +# ============================================================================== +function install() { + check_or_install_docker + + msg_info "Installing dependencies" + if [[ -f /etc/alpine-release ]]; then + $STD apk add --no-cache git openssl + else + $STD apt-get update + $STD apt-get install -y git openssl + fi + msg_ok "Installed dependencies" + + msg_warn "WARNING: This will run an external installer from https://coolify.io/" + msg_warn "The following code is NOT maintained or audited by our repository." + msg_warn "Review: https://cdn.coollabs.io/coolify/install.sh" + echo "" + echo -n "${TAB}Do you want to continue? (y/N): " + read -r confirm + if [[ ! "${confirm,,}" =~ ^(y|yes)$ ]]; then + msg_warn "Installation cancelled. Exiting." + exit 0 + fi + + msg_info "Installing ${APP} (this installs Docker and pulls containers)" + $STD bash <(curl -fsSL https://cdn.coollabs.io/coolify/install.sh) + msg_ok "Installed ${APP}" + + echo "" + msg_ok "${APP} is reachable at: ${BL}http://${LOCAL_IP}:${DEFAULT_PORT}${CL}" +} + +# ============================================================================== +# MAIN +# ============================================================================== + +# Handle type=update (called from update script) +if [[ "${type:-}" == "update" ]]; then + header_info + if [[ -d "$INSTALL_PATH" ]]; then + update + else + msg_error "${APP} is not installed. Nothing to update." + exit 1 + fi + exit 0 +fi + +header_info +check_proxmox_host +get_lxc_ip + +# Check if already installed +if [[ -d "$INSTALL_PATH" ]]; 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} - Coolify (via external installer)" +echo -e "${TAB} - Docker (if not already installed)" +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 diff --git a/tools/addon/dockge.sh b/tools/addon/dockge.sh new file mode 100644 index 000000000..c961b136b --- /dev/null +++ b/tools/addon/dockge.sh @@ -0,0 +1,209 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: tteck (tteckster) | Addon: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://dockge.kuma.pet/ | Github: https://github.com/louislam/dockge +if ! command -v curl &>/dev/null; then + printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2 + if [[ -f /etc/alpine-release ]]; then + apk update >/dev/null 2>&1 + apk add --no-cache curl >/dev/null 2>&1 + else + apt-get update >/dev/null 2>&1 + apt-get install -y curl >/dev/null 2>&1 + fi +fi +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true + +# Enable error handling +set -Eeuo pipefail +trap 'error_handler' ERR + +# ============================================================================== +# CONFIGURATION +# ============================================================================== +APP="Dockge" +APP_TYPE="addon" +INSTALL_PATH="/opt/dockge" +STACKS_PATH="/opt/stacks" +COMPOSE_FILE="${INSTALL_PATH}/compose.yaml" +DEFAULT_PORT=5001 + +# Initialize all core functions (colors, formatting, icons, STD mode) +load_functions + +# ============================================================================== +# 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 --remove-orphans + msg_ok "Stopped and removed Docker containers" + fi + + rm -rf "$INSTALL_PATH" + msg_ok "${APP} has been uninstalled" + msg_warn "Stacks directory ${STACKS_PATH} was NOT removed. Delete manually if no longer needed." +} + +# ============================================================================== +# 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 +} + +# ============================================================================== +# PROXMOX HOST CHECK +# ============================================================================== +function check_proxmox_host() { + if command -v pveversion &>/dev/null; then + msg_error "Running on the Proxmox host is NOT recommended!" + msg_error "This should be executed inside an LXC container." + echo "" + echo -n "${TAB}Continue anyway? (y/N): " + read -r confirm + if [[ ! "${confirm,,}" =~ ^(y|yes)$ ]]; then + msg_warn "Aborted. Please run this inside an LXC container." + exit 0 + fi + msg_warn "Proceeding on Proxmox host at your own risk!" + fi +} + +# ============================================================================== +# CHECK / INSTALL DOCKER +# ============================================================================== +function check_or_install_docker() { + if command -v docker &>/dev/null; then + msg_ok "Docker $(docker --version | cut -d' ' -f3 | tr -d ',') is available" + if docker compose version &>/dev/null; then + msg_ok "Docker Compose is available" + else + msg_error "Docker Compose plugin is not available. Please install it." + exit 1 + fi + return + fi + + msg_warn "Docker is not installed." + echo -n "${TAB}Install Docker now? (y/N): " + read -r install_docker_prompt + if [[ ! "${install_docker_prompt,,}" =~ ^(y|yes)$ ]]; then + msg_error "Docker is required for ${APP}. Exiting." + exit 1 + fi + + msg_info "Installing Docker" + if [[ -f /etc/alpine-release ]]; then + $STD apk add docker docker-cli-compose + $STD rc-service docker start + $STD rc-update add docker default + else + DOCKER_CONFIG_PATH='/etc/docker/daemon.json' + mkdir -p "$(dirname "$DOCKER_CONFIG_PATH")" + echo -e '{\n "log-driver": "journald"\n}' >"$DOCKER_CONFIG_PATH" + $STD sh <(curl -fsSL https://get.docker.com) + fi + msg_ok "Installed Docker" +} + +# ============================================================================== +# INSTALL +# ============================================================================== +function install() { + check_or_install_docker + + msg_info "Creating install directories" + mkdir -p "$INSTALL_PATH" "$STACKS_PATH" + msg_ok "Created ${INSTALL_PATH} and ${STACKS_PATH}" + + msg_info "Downloading Docker Compose file" + curl -fsSL "https://raw.githubusercontent.com/louislam/dockge/master/compose.yaml" -o "$COMPOSE_FILE" + msg_ok "Downloaded Docker Compose file" + + msg_info "Starting ${APP}" + cd "$INSTALL_PATH" + $STD docker compose up -d + msg_ok "Started ${APP}" + + echo "" + msg_ok "${APP} is reachable at: ${BL}http://${LOCAL_IP}:${DEFAULT_PORT}${CL}" +} + +# ============================================================================== +# 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 +check_proxmox_host +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} - Dockge (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 diff --git a/tools/addon/dokploy.sh b/tools/addon/dokploy.sh new file mode 100644 index 000000000..c4d7263ff --- /dev/null +++ b/tools/addon/dokploy.sh @@ -0,0 +1,214 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://dokploy.com/ | Github: https://github.com/Dokploy/dokploy +if ! command -v curl &>/dev/null; then + printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2 + if [[ -f /etc/alpine-release ]]; then + apk update >/dev/null 2>&1 + apk add --no-cache curl >/dev/null 2>&1 + else + apt-get update >/dev/null 2>&1 + apt-get install -y curl >/dev/null 2>&1 + fi +fi +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true + +# Enable error handling +set -Eeuo pipefail +trap 'error_handler' ERR + +# ============================================================================== +# CONFIGURATION +# ============================================================================== +APP="Dokploy" +APP_TYPE="addon" +INSTALL_PATH="/etc/dokploy" +DEFAULT_PORT=3000 + +# Initialize all core functions (colors, formatting, icons, STD mode) +load_functions + +# ============================================================================== +# UNINSTALL +# ============================================================================== +function uninstall() { + msg_info "Uninstalling ${APP}" + + if command -v docker &>/dev/null; then + msg_info "Stopping and removing Docker containers" + $STD docker stop $(docker ps -aq) 2>/dev/null || true + $STD docker rm $(docker ps -aq) 2>/dev/null || true + $STD docker network prune -f 2>/dev/null || true + msg_ok "Stopped and removed Docker containers" + fi + + rm -rf "$INSTALL_PATH" + msg_ok "${APP} has been uninstalled" +} + +# ============================================================================== +# UPDATE +# ============================================================================== +function update() { + msg_info "Updating ${APP}" + $STD curl -sSL https://dokploy.com/install.sh | bash -s update + msg_ok "Updated ${APP}" + + msg_ok "Updated successfully" + exit +} + +# ============================================================================== +# PROXMOX HOST CHECK +# ============================================================================== +function check_proxmox_host() { + if command -v pveversion &>/dev/null; then + msg_error "Running on the Proxmox host is NOT recommended!" + msg_error "This should be executed inside an LXC container." + echo "" + echo -n "${TAB}Continue anyway? (y/N): " + read -r confirm + if [[ ! "${confirm,,}" =~ ^(y|yes)$ ]]; then + msg_warn "Aborted. Please run this inside an LXC container." + exit 0 + fi + msg_warn "Proceeding on Proxmox host at your own risk!" + fi +} + +# ============================================================================== +# CHECK / INSTALL DOCKER +# ============================================================================== +function check_or_install_docker() { + if command -v docker &>/dev/null; then + msg_ok "Docker $(docker --version | cut -d' ' -f3 | tr -d ',') is available" + if docker compose version &>/dev/null; then + msg_ok "Docker Compose is available" + else + msg_error "Docker Compose plugin is not available. Please install it." + exit 1 + fi + return + fi + + msg_warn "Docker is not installed." + echo -n "${TAB}Install Docker now? (y/N): " + read -r install_docker_prompt + if [[ ! "${install_docker_prompt,,}" =~ ^(y|yes)$ ]]; then + msg_error "Docker is required for ${APP}. Exiting." + exit 1 + fi + + msg_info "Installing Docker" + if [[ -f /etc/alpine-release ]]; then + $STD apk add docker docker-cli-compose + $STD rc-service docker start + $STD rc-update add docker default + else + DOCKER_CONFIG_PATH='/etc/docker/daemon.json' + mkdir -p "$(dirname "$DOCKER_CONFIG_PATH")" + echo -e '{\n "log-driver": "journald"\n}' >"$DOCKER_CONFIG_PATH" + $STD sh <(curl -fsSL https://get.docker.com) + fi + msg_ok "Installed Docker" +} + +# ============================================================================== +# INSTALL +# ============================================================================== +function install() { + check_or_install_docker + + msg_info "Installing dependencies" + if [[ -f /etc/alpine-release ]]; then + $STD apk add --no-cache git openssl + else + $STD apt-get update + $STD apt-get install -y git openssl redis + fi + msg_ok "Installed dependencies" + + msg_warn "WARNING: This will run an external installer from https://dokploy.com/" + msg_warn "The following code is NOT maintained or audited by our repository." + echo "" + echo -n "${TAB}Do you want to continue? (y/N): " + read -r confirm + if [[ ! "${confirm,,}" =~ ^(y|yes)$ ]]; then + msg_warn "Installation cancelled. Exiting." + exit 0 + fi + + msg_info "Installing ${APP} (this installs Docker and pulls containers)" + $STD bash <(curl -sSL https://dokploy.com/install.sh) + msg_ok "Installed ${APP}" + + echo "" + msg_ok "${APP} is reachable at: ${BL}http://${LOCAL_IP}:${DEFAULT_PORT}${CL}" +} + +# ============================================================================== +# MAIN +# ============================================================================== + +# Handle type=update (called from update script) +if [[ "${type:-}" == "update" ]]; then + header_info + if [[ -d "$INSTALL_PATH" ]]; then + update + else + msg_error "${APP} is not installed. Nothing to update." + exit 1 + fi + exit 0 +fi + +header_info +check_proxmox_host +get_lxc_ip + +# Check if already installed +if [[ -d "$INSTALL_PATH" ]]; 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} - Dokploy (via external installer)" +echo -e "${TAB} - Docker (if not already installed)" +echo -e "${TAB} - Redis" +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 diff --git a/tools/addon/komodo.sh b/tools/addon/komodo.sh new file mode 100644 index 000000000..69f5f2f39 --- /dev/null +++ b/tools/addon/komodo.sh @@ -0,0 +1,293 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://komo.do/ | Github: https://github.com/mbecker20/komodo +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 || apk update >/dev/null 2>&1 + apt-get install -y curl >/dev/null 2>&1 || apk add --no-cache curl >/dev/null 2>&1 +fi +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true + +# Enable error handling +set -Eeuo pipefail +trap 'error_handler' ERR + +# ============================================================================== +# CONFIGURATION +# ============================================================================== +APP="Komodo" +APP_TYPE="addon" +INSTALL_PATH="/opt/komodo" +COMPOSE_ENV="${INSTALL_PATH}/compose.env" +DEFAULT_PORT=9120 + +# Initialize all core functions (colors, formatting, icons, STD mode) +load_functions + +# ============================================================================== +# HELPERS +# ============================================================================== +function find_compose_file() { + COMPOSE_FILE=$(find "$INSTALL_PATH" -maxdepth 1 -type f -name '*.compose.yaml' ! -name 'compose.env' | head -n1) + if [[ -z "${COMPOSE_FILE:-}" ]]; then + msg_error "No valid compose file found in ${INSTALL_PATH}!" + exit 1 + fi + COMPOSE_BASENAME=$(basename "$COMPOSE_FILE") +} + +function check_legacy_db() { + if [[ "$COMPOSE_BASENAME" == "sqlite.compose.yaml" || "$COMPOSE_BASENAME" == "postgres.compose.yaml" ]]; then + msg_error "Detected outdated Komodo setup using SQLite or PostgreSQL (FerretDB v1)." + echo -e "${YW}This configuration is no longer supported since Komodo v1.18.0.${CL}" + echo -e "${YW}Please follow the migration guide:${CL}" + echo -e "${BGN}https://github.com/community-scripts/ProxmoxVE/discussions/5689${CL}\n" + exit 1 + fi +} + +# ============================================================================== +# UNINSTALL +# ============================================================================== +function uninstall() { + msg_info "Uninstalling ${APP}" + + find_compose_file + msg_info "Stopping and removing Docker containers" + cd "$INSTALL_PATH" + $STD docker compose -p komodo -f "$COMPOSE_FILE" --env-file "$COMPOSE_ENV" down --volumes --remove-orphans + msg_ok "Stopped and removed Docker containers" + + rm -rf "$INSTALL_PATH" + msg_ok "${APP} has been uninstalled" +} + +# ============================================================================== +# UPDATE +# ============================================================================== +function update() { + find_compose_file + check_legacy_db + + msg_info "Updating ${APP}" + BACKUP_FILE="${INSTALL_PATH}/${COMPOSE_BASENAME}.bak_$(date +%Y%m%d_%H%M%S)" + cp "$COMPOSE_FILE" "$BACKUP_FILE" || { + msg_error "Failed to create backup of ${COMPOSE_BASENAME}!" + exit 1 + } + + GITHUB_URL="https://raw.githubusercontent.com/moghtech/komodo/main/compose/${COMPOSE_BASENAME}" + if ! curl -fsSL "$GITHUB_URL" -o "$COMPOSE_FILE"; then + msg_error "Failed to download ${COMPOSE_BASENAME} from GitHub!" + mv "$BACKUP_FILE" "$COMPOSE_FILE" + exit 1 + fi + + if ! grep -qxF 'COMPOSE_KOMODO_BACKUPS_PATH=/etc/komodo/backups' "$COMPOSE_ENV"; then + sed -i '/^COMPOSE_KOMODO_IMAGE_TAG=latest$/a COMPOSE_KOMODO_BACKUPS_PATH=/etc/komodo/backups' "$COMPOSE_ENV" + fi + + $STD docker compose -p komodo -f "$COMPOSE_FILE" --env-file "$COMPOSE_ENV" pull + $STD docker compose -p komodo -f "$COMPOSE_FILE" --env-file "$COMPOSE_ENV" up -d + msg_ok "Updated ${APP}" + + msg_ok "Updated successfully" + exit +} + +# ============================================================================== +# PROXMOX HOST CHECK +# ============================================================================== +function check_proxmox_host() { + if command -v pveversion &>/dev/null; then + msg_error "Running on the Proxmox host is NOT recommended!" + msg_error "This should be executed inside an LXC container." + echo "" + echo -n "${TAB}Continue anyway? (y/N): " + read -r confirm + if [[ ! "${confirm,,}" =~ ^(y|yes)$ ]]; then + msg_warn "Aborted. Please run this inside an LXC container." + exit 0 + fi + msg_warn "Proceeding on Proxmox host at your own risk!" + fi +} + +# ============================================================================== +# CHECK / INSTALL DOCKER +# ============================================================================== +function check_or_install_docker() { + if command -v docker &>/dev/null; then + msg_ok "Docker $(docker --version | cut -d' ' -f3 | tr -d ',') is available" + if docker compose version &>/dev/null; then + msg_ok "Docker Compose is available" + else + msg_error "Docker Compose plugin is not available. Please install it." + exit 1 + fi + return + fi + + msg_warn "Docker is not installed." + echo -n "${TAB}Install Docker now? (y/N): " + read -r install_docker_prompt + if [[ ! "${install_docker_prompt,,}" =~ ^(y|yes)$ ]]; then + msg_error "Docker is required for ${APP}. Exiting." + exit 1 + fi + + msg_info "Installing Docker" + if [[ -f /etc/alpine-release ]]; then + $STD apk add docker docker-cli-compose + $STD rc-service docker start + $STD rc-update add docker default + else + DOCKER_CONFIG_PATH='/etc/docker/daemon.json' + mkdir -p "$(dirname "$DOCKER_CONFIG_PATH")" + echo -e '{\n "log-driver": "journald"\n}' >"$DOCKER_CONFIG_PATH" + $STD sh <(curl -fsSL https://get.docker.com) + fi + msg_ok "Installed Docker" +} + +# ============================================================================== +# INSTALL +# ============================================================================== +function install() { + check_or_install_docker + + echo -e "${TAB}Choose the database for Komodo:" + echo -e "${TAB} 1) MongoDB (recommended)" + echo -e "${TAB} 2) FerretDB" + echo -n "${TAB}Enter your choice (default: 1): " + read -r DB_CHOICE + DB_CHOICE=${DB_CHOICE:-1} + + case $DB_CHOICE in + 1) DB_COMPOSE_FILE="mongo.compose.yaml" ;; + 2) DB_COMPOSE_FILE="ferretdb.compose.yaml" ;; + *) + msg_warn "Invalid choice. Defaulting to MongoDB." + DB_COMPOSE_FILE="mongo.compose.yaml" + ;; + esac + + msg_info "Creating install directory" + mkdir -p "$INSTALL_PATH" + msg_ok "Created ${INSTALL_PATH}" + + msg_info "Downloading Docker Compose file" + curl -fsSL "https://raw.githubusercontent.com/moghtech/komodo/main/compose/$DB_COMPOSE_FILE" -o "${INSTALL_PATH}/${DB_COMPOSE_FILE}" + msg_ok "Downloaded ${DB_COMPOSE_FILE}" + + msg_info "Configuring environment" + curl -fsSL "https://raw.githubusercontent.com/moghtech/komodo/main/compose/compose.env" -o "$COMPOSE_ENV" + + DB_PASSWORD=$(openssl rand -base64 16 | tr -d '/+=') + ADMIN_PASSWORD=$(openssl rand -base64 8 | tr -d '/+=') + PASSKEY=$(openssl rand -base64 24 | tr -d '/+=') + WEBHOOK_SECRET=$(openssl rand -base64 24 | tr -d '/+=') + JWT_SECRET=$(openssl rand -base64 24 | tr -d '/+=') + + sed -i "s/^KOMODO_DB_USERNAME=.*/KOMODO_DB_USERNAME=komodo_admin/" "$COMPOSE_ENV" + sed -i "s/^KOMODO_DB_PASSWORD=.*/KOMODO_DB_PASSWORD=${DB_PASSWORD}/" "$COMPOSE_ENV" + sed -i "s/^KOMODO_INIT_ADMIN_PASSWORD=changeme/KOMODO_INIT_ADMIN_PASSWORD=${ADMIN_PASSWORD}/" "$COMPOSE_ENV" + sed -i "s/^KOMODO_PASSKEY=.*/KOMODO_PASSKEY=${PASSKEY}/" "$COMPOSE_ENV" + sed -i "s/^KOMODO_WEBHOOK_SECRET=.*/KOMODO_WEBHOOK_SECRET=${WEBHOOK_SECRET}/" "$COMPOSE_ENV" + sed -i "s/^KOMODO_JWT_SECRET=.*/KOMODO_JWT_SECRET=${JWT_SECRET}/" "$COMPOSE_ENV" + msg_ok "Configured environment" + + msg_info "Starting ${APP}" + cd "$INSTALL_PATH" + $STD docker compose -p komodo -f "${INSTALL_PATH}/${DB_COMPOSE_FILE}" --env-file "$COMPOSE_ENV" up -d + msg_ok "Started ${APP}" + + { + echo "Komodo Credentials" + echo "" + echo "Admin User : admin" + echo "Admin Password: $ADMIN_PASSWORD" + } >>~/komodo.creds + + echo "" + msg_ok "${APP} is reachable at: ${BL}http://${LOCAL_IP}:${DEFAULT_PORT}${CL}" + echo "" + echo -e " Komodo Credentials" + echo -e " ==================" + echo -e " User : admin" + echo -e " Password: ${ADMIN_PASSWORD}" + echo "" + msg_info "Credentials saved to ~/komodo.creds" +} + +# ============================================================================== +# MAIN +# ============================================================================== + +# Handle type=update (called from update script) +if [[ "${type:-}" == "update" ]]; then + header_info + COMPOSE_FILE="" + COMPOSE_BASENAME="" + if [[ -d "$INSTALL_PATH" ]]; then + update + else + msg_error "${APP} is not installed. Nothing to update." + exit 1 + fi + exit 0 +fi + +header_info +check_proxmox_host +get_lxc_ip + +# Declare variables used by find_compose_file +COMPOSE_FILE="" +COMPOSE_BASENAME="" + +# Check if already installed +if [[ -d "$INSTALL_PATH" ]]; 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} - Komodo (via Docker Compose)" +echo -e "${TAB} - MongoDB or FerretDB (your choice)" +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 diff --git a/tools/addon/runtipi.sh b/tools/addon/runtipi.sh new file mode 100644 index 000000000..6b9e41ac4 --- /dev/null +++ b/tools/addon/runtipi.sh @@ -0,0 +1,223 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://runtipi.io/ | Github: https://github.com/runtipi/runtipi +if ! command -v curl &>/dev/null; then + printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2 + if [[ -f /etc/alpine-release ]]; then + apk update >/dev/null 2>&1 + apk add --no-cache curl >/dev/null 2>&1 + else + apt-get update >/dev/null 2>&1 + apt-get install -y curl >/dev/null 2>&1 + fi +fi +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true + +# Enable error handling +set -Eeuo pipefail +trap 'error_handler' ERR + +# ============================================================================== +# CONFIGURATION +# ============================================================================== +APP="Runtipi" +APP_TYPE="addon" +INSTALL_PATH="/opt/runtipi" +DEFAULT_PORT=80 + +# Initialize all core functions (colors, formatting, icons, STD mode) +load_functions + +# ============================================================================== +# PROXMOX HOST CHECK +# ============================================================================== +function check_proxmox_host() { + if command -v pveversion &>/dev/null; then + msg_error "Running on the Proxmox host is NOT recommended!" + msg_error "This should be executed inside an LXC container." + echo "" + echo -n "${TAB}Continue anyway? (y/N): " + read -r confirm + if [[ ! "${confirm,,}" =~ ^(y|yes)$ ]]; then + msg_warn "Aborted. Please run this inside an LXC container." + exit 0 + fi + msg_warn "Proceeding on Proxmox host at your own risk!" + fi +} + +# ============================================================================== +# CHECK / INSTALL DOCKER +# ============================================================================== +function check_or_install_docker() { + if command -v docker &>/dev/null; then + msg_ok "Docker $(docker --version | cut -d' ' -f3 | tr -d ',') is available" + if docker compose version &>/dev/null; then + msg_ok "Docker Compose is available" + else + msg_error "Docker Compose plugin is not available. Please install it." + exit 1 + fi + return + fi + + msg_warn "Docker is not installed." + echo -n "${TAB}Install Docker now? (y/N): " + read -r install_docker_prompt + if [[ ! "${install_docker_prompt,,}" =~ ^(y|yes)$ ]]; then + msg_error "Docker is required for ${APP}. Exiting." + exit 1 + fi + + msg_info "Installing Docker" + DOCKER_CONFIG_PATH='/etc/docker/daemon.json' + mkdir -p "$(dirname "$DOCKER_CONFIG_PATH")" + echo -e '{\n "log-driver": "journald"\n}' >"$DOCKER_CONFIG_PATH" + $STD sh <(curl -fsSL https://get.docker.com) + msg_ok "Installed Docker" +} + +# ============================================================================== +# UNINSTALL +# ============================================================================== +function uninstall() { + msg_info "Uninstalling ${APP}" + + if [[ -f "${INSTALL_PATH}/runtipi-cli" ]]; then + msg_info "Stopping ${APP}" + cd "$INSTALL_PATH" + $STD ./runtipi-cli stop 2>/dev/null || true + msg_ok "Stopped ${APP}" + fi + + if command -v docker &>/dev/null; then + msg_info "Removing Docker containers" + cd "$INSTALL_PATH" 2>/dev/null && $STD docker compose down --remove-orphans 2>/dev/null || true + msg_ok "Removed Docker containers" + fi + + rm -rf "$INSTALL_PATH" + msg_ok "${APP} has been uninstalled" +} + +# ============================================================================== +# UPDATE +# ============================================================================== +function update() { + msg_info "Updating ${APP}" + cd "$INSTALL_PATH" + $STD ./runtipi-cli update latest + msg_ok "Updated ${APP}" + + msg_ok "Updated successfully" + exit +} + +# ============================================================================== +# INSTALL +# ============================================================================== +function install() { + check_or_install_docker + + msg_info "Installing dependencies" + $STD apt-get update + $STD apt-get install -y openssl + msg_ok "Installed dependencies" + + msg_warn "WARNING: This will run an external installer from https://runtipi.io/" + msg_warn "The following code is NOT maintained or audited by our repository." + msg_warn "Review: https://raw.githubusercontent.com/runtipi/runtipi/master/scripts/install.sh" + echo "" + echo -n "${TAB}Do you want to continue? (y/N): " + read -r confirm + if [[ ! "${confirm,,}" =~ ^(y|yes)$ ]]; then + msg_warn "Installation cancelled. Exiting." + exit 0 + fi + + msg_info "Installing ${APP} (this pulls Docker containers)" + DOCKER_CONFIG_PATH='/etc/docker/daemon.json' + mkdir -p "$(dirname "$DOCKER_CONFIG_PATH")" + [[ ! -f "$DOCKER_CONFIG_PATH" ]] && echo -e '{\n "log-driver": "journald"\n}' >"$DOCKER_CONFIG_PATH" + cd /opt + curl -fsSL "https://raw.githubusercontent.com/runtipi/runtipi/master/scripts/install.sh" -o "install.sh" + chmod +x install.sh + $STD ./install.sh + chmod 666 /opt/runtipi/state/settings.json 2>/dev/null || true + rm -f /opt/install.sh + msg_ok "Installed ${APP}" + + echo "" + msg_ok "${APP} is reachable at: ${BL}http://${LOCAL_IP}:${DEFAULT_PORT}${CL}" +} + +# ============================================================================== +# MAIN +# ============================================================================== + +# Handle type=update (called from update script) +if [[ "${type:-}" == "update" ]]; then + header_info + if [[ -d "$INSTALL_PATH" ]]; then + update + else + msg_error "${APP} is not installed. Nothing to update." + exit 1 + fi + exit 0 +fi + +if [[ -f /etc/alpine-release ]]; then + msg_error "${APP} does not support Alpine Linux. Please use a Debian or Ubuntu based LXC." + exit 1 +fi + +header_info +check_proxmox_host +get_lxc_ip + +# Check if already installed +if [[ -d "$INSTALL_PATH" ]]; 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} - Runtipi (via external installer)" +echo -e "${TAB} - Docker (if not already installed)" +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 diff --git a/tools/headers/coolify b/tools/headers/coolify new file mode 100644 index 000000000..1aa32d245 --- /dev/null +++ b/tools/headers/coolify @@ -0,0 +1,6 @@ + ______ ___ ____ + / ____/___ ____ / (_)/ __/_ __ + / / / __ \/ __ \/ / / /_/ / / / +/ /___/ /_/ / /_/ / / / __/ /_/ / +\____/\____/\____/_/_/_/ \__, / + /____/ diff --git a/tools/headers/dockge b/tools/headers/dockge new file mode 100644 index 000000000..dc84960a8 --- /dev/null +++ b/tools/headers/dockge @@ -0,0 +1,6 @@ + ____ __ + / __ \____ _____/ /______ ____ + / / / / __ \/ ___/ //_/ __ `/ _ \ + / /_/ / /_/ / /__/ ,< / /_/ / __/ +/_____/\____/\___/_/|_|\__, /\___/ + /____/ diff --git a/tools/headers/dokploy b/tools/headers/dokploy new file mode 100644 index 000000000..1104db800 --- /dev/null +++ b/tools/headers/dokploy @@ -0,0 +1,6 @@ + ____ __ __ + / __ \____ / /______ / /___ __ __ + / / / / __ \/ //_/ __ \/ / __ \/ / / / + / /_/ / /_/ / ,< / /_/ / / /_/ / /_/ / +/_____/\____/_/|_| .___/_/\____/\__, / + /_/ /____/ diff --git a/tools/headers/komodo b/tools/headers/komodo new file mode 100644 index 000000000..d7c7a6991 --- /dev/null +++ b/tools/headers/komodo @@ -0,0 +1,5 @@ + __ __ __ + / //_/___ ____ ___ ____ ____/ /___ + / ,< / __ \/ __ `__ \/ __ \/ __ / __ \ + / /| |/ /_/ / / / / / / /_/ / /_/ / /_/ / +/_/ |_|\____/_/ /_/ /_/\____/\__,_/\____/ diff --git a/tools/headers/runtipi b/tools/headers/runtipi new file mode 100644 index 000000000..e34ec09ea --- /dev/null +++ b/tools/headers/runtipi @@ -0,0 +1,5 @@ + ____ __ _ _ + / __ \__ ______ / /_(_)__ (_) + / /_/ / / / / __ \/ __/ / _ \/ / + / _, _/ /_/ / / / / /_/ / ___/ / +/_/ |_|\__,_/_/ /_/\__/_/_/ /_/