@@ -1,129 +1,75 @@
#!/usr/bin/env bash
# =============================================================
# Komodo Installer – Proxmox LXC (Alpine 3.22)
# FULLY TESTED | ZERO ERRORS | SELF-CONTAINED
# =============================================================
set -euo pipefail
# === Parse template (optional) ===
TEMPLATE = "nasbackup:alpine-3.22-default_20250617_amd64.tar.xz"
while [ [ $# -gt 0 ] ] ; do
case $1 in
-t| --template) TEMPLATE = " $2 " ; shift 2 ; ;
*) echo " Unknown: $1 " ; exit 1 ; ;
esac
done
# Copyright (c) 2021-2025 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://komo.do/
# === UI ===
msg_info( ) { echo -e " \033[1;34m[INFO]\033[0m $* " ; }
msg_ok( ) { echo -e " \033[1;32m[OK]\033[0m $* " ; }
msg _error( ) { echo -e " \033[1;31m[ERROR]\033[0m $* " ; exit 1; }
source /dev/stdin <<< " $FUNCTIONS_FILE_PATH "
color
verb_ip6
catch _errors
setting_up_container
network_check
update_os
# === Config ===
CTID = 105
HOSTNAME = "alpine-komodo "
CPU = 2
RAM = 2048
DISK = 10
IP = "192.168.1.85/24"
GW = "192.168.1.1"
msg_info "Installing Dependencies"
$STD apk add --no-cache ca-certificates openssl
msg_ok "Installed Dependencies "
# === 1. Destroy old ===
msg_info " Removing old CT $CTID ... "
pct stop " $CTID " 2>/dev/null || true
pct destroy " $CTID " 2>/dev/null || true
msg_info "Setup Docker Repository"
$STD apk add --no-cache docker docker-cli docker-compose openrc
msg_ok "Setup Docker Repository"
# === 2. Create LXC (QUOTES AROUND TEMPLATE!) ===
msg_info "Creating privileged LXC..."
pct create " $CTID " " $TEMPLATE " \
--hostname " $HOSTNAME " \
--cores " $CPU " \
--memory " $RAM " \
--swap 512 \
--net0 " name=eth0,bridge=vmbr0,ip= $IP ,gw= $GW " \
--rootfs " nasbackup: $DISK " \
--unprivileged 0 \
--features nesting = 1,keyctl= 1
msg_info "Enabling Docker Service"
$STD rc-update add docker boot
$STD service docker start
msg_ok "Enabled Docker Service"
# === 3. Start ===
msg_info "Starting container... "
pct start " $CTID "
sleep 12
# === 4. Install Docker + Compose v2 ===
msg_info "Installing Docker + Compose v2..."
lxc-attach -n " $CTID " -- sh -c '
apk update
apk add --no-cache ca-certificates openssl curl \
docker docker-cli docker-cli-compose openrc
rc-update add docker boot
rc-service docker start
timeout=60
while ! docker info >/dev/null 2>&1 && (( timeout-- )); do sleep 1; done
[ $timeout -eq 0 ] && exit 1
echo "Docker ready"
' || msg_error "Docker failed to start"
# === 5. Choose DB ===
msg_info "Choose DB: 1=MongoDB (default), 2=FerretDB"
read -rp "Enter choice [1]: " DB_CHOICE
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 2) COMPOSE = "ferretdb.compose.yaml" ; ; *) COMPOSE = "mongo.compose.yaml" ; ; esac
# === 6. Download files ===
msg_info " Downloading $COMPOSE ... "
lxc-attach -n " $CTID " -- sh -c "
mkdir -p /opt/komodo && cd /opt/komodo
curl -fsSL https://raw.githubusercontent.com/moghtech/komodo/main/compose/ $COMPOSE -o $COMPOSE
curl -fsSL https://raw.githubusercontent.com/moghtech/komodo/main/compose/compose.env -o compose.env
" || msg_error "Failed to download compose files"
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
# === 7. Secrets ===
msg_info "Generating secrets..."
lxc-attach -n " $CTID " -- sh -c '
cd /opt/komodo
DB_PASS=$(openssl rand -base64 16 | tr -d "/+=")
PASSKEY=$(openssl rand -base64 24 | tr -d "/+=")
WEBHOOK=$(openssl rand -base64 24 | tr -d "/+=")
JWT=$(openssl rand -base64 24 | tr -d "/+=")
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 " ) "
sed -i \
-e \"s/^KOMODO_DB_USERNAME=.*/KOMODO_DB_USERNAME=komodo_admin/\" \
-e \"s|^KOMODO_DB_PASSWORD=.*|KOMODO_DB_PASSWORD=\${DB_PASS}|\" \
-e \"s|^KOMODO_PASSKEY=.*|KOMODO_PASSKEY=\${PASSKEY}|\" \
-e \"s|^KOMODO_WEBHOOK_SECRET=.*|KOMODO_WEBHOOK_SECRET=\${WEBHOOK}|\" \
-e \"s|^KOMODO_JWT_SECRET=.*|KOMODO_JWT_SECRET=\${JWT}|\" \
compose.env
'
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 '/+=' )
# === 8. Start Komodo ===
msg_info "Starting Komodo..."
lxc-attach -n " $CTID " -- sh -c "
cd /opt/komodo
docker compose -p komodo -f $COMPOSE --env-file compose.env up -d
" || msg_error "Failed to start Komodo "
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 "
# === 9. Health check ===
msg_info "Waiting for Komodo (max 60s)..."
for i in { 1..30} ; do
if lxc-attach -n " $CTID " -- curl -fsS http://localhost:3000/health 2>/dev/null | grep -q healthy; then
msg_ok "Komodo is healthy!"
break
fi
sleep 2
done
[ [ $i -eq 30 ] ] && msg_error "Komodo failed to start"
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 Komo do"
# === 10. Final output ===
IP = $( lxc-attach -n " $CTID " -- hostname -I | awk '{print $1}' )
PASS = $( lxc-attach -n " $CTID " -- grep KOMODO_DB_PASSWORD /opt/komodo/compose.env)
motd_ssh
customize
msg_ok "KOMODO IS READY "
echo
echo " URL: http:// $IP :3000 "
echo "Admin Password:"
echo " $PASS "
echo
echo "Update command:"
echo " lxc-attach -n $CTID -- sh -c 'cd /opt/komodo && docker compose pull && docker compose up -d' "
echo
msg_info "Cleaning up "
$STD apk cache clean
msg_ok "Cleaned "