Add installers and CT templates for four apps

Add container templates (ct/) and install scripts (install/) plus metadata JSON entries for BunkerM, Colanode, Edit-Mind, and ExcaliDash. Each app includes an LXC template script with update routines, a corresponding installer that provisions dependencies, builds the app, configures services (systemd/nginx/supervisor), and example default environment/config. JSON metadata files register interface ports, recommended resources, documentation/website links, and notes for each app.
This commit is contained in:
MickLesk
2026-05-12 21:09:00 +02:00
parent 666005c4a4
commit c744b10caa
12 changed files with 1080 additions and 0 deletions

82
ct/bunkerm.sh Normal file
View File

@@ -0,0 +1,82 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
# Source: https://bunkerai.dev/
APP="BunkerM"
var_tags="${var_tags:-mqtt;iot;mosquitto}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /opt/bunkerm ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "bunkerm" "bunkeriot/BunkerM"; then
msg_info "Stopping Services"
systemctl stop bunkerm
msg_ok "Stopped Services"
msg_info "Backing up Data"
cp /etc/bunkerm/bunkerm.env /opt/bunkerm.env.bak
cp /var/lib/mosquitto/dynamic-security.json /opt/bunkerm.dynsec.bak 2>/dev/null || true
msg_ok "Backed up Data"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "bunkerm" "bunkeriot/BunkerM" "tarball"
msg_info "Rebuilding Frontend"
cd /opt/bunkerm/frontend
$STD npm ci
$STD npm run build
mkdir -p /nextjs
cp -r /opt/bunkerm/frontend/.next/standalone/. /nextjs/
cp -r /opt/bunkerm/frontend/.next/static /nextjs/.next/static
cp -r /opt/bunkerm/frontend/public /nextjs/public
msg_ok "Rebuilt Frontend"
msg_info "Updating Backend"
mkdir -p /app
cp -r /opt/bunkerm/backend/app/. /app/
touch /app/monitor/__init__.py
msg_ok "Updated Backend"
msg_info "Restoring Data"
cp /opt/bunkerm.env.bak /etc/bunkerm/bunkerm.env
cp /opt/bunkerm.dynsec.bak /var/lib/mosquitto/dynamic-security.json 2>/dev/null || true
rm -f /opt/bunkerm.env.bak /opt/bunkerm.dynsec.bak
msg_ok "Restored Data"
msg_info "Starting Services"
systemctl start bunkerm
msg_ok "Started Services"
msg_ok "Updated successfully!"
fi
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URLs:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:2000${CL} (Web UI)"
echo -e "${TAB}${GATEWAY}${BGN}mqtt://${IP}:1900${CL} (MQTT Broker)"

76
ct/colanode.sh Normal file
View File

@@ -0,0 +1,76 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
# Source: https://colanode.com/
APP="Colanode"
var_tags="${var_tags:-collaboration;notes;chat}"
var_cpu="${var_cpu:-4}"
var_ram="${var_ram:-4096}"
var_disk="${var_disk:-16}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /opt/colanode ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "colanode" "colanode/colanode"; then
msg_info "Stopping Services"
systemctl stop colanode-server
msg_ok "Stopped Services"
msg_info "Backing up Data"
cp /opt/colanode/.env /opt/colanode.env.bak
msg_ok "Backed up Data"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "colanode" "colanode/colanode" "tarball"
msg_info "Rebuilding Application"
cd /opt/colanode
$STD npm ci
$STD npm run build -w @colanode/core
$STD npm run build -w @colanode/crdt
$STD npm run build -w @colanode/server
$STD npm run build -w @colanode/client
$STD npm run build -w @colanode/ui
$STD npm run build -w @colanode/web
cp -r /opt/colanode/apps/web/dist/. /var/www/colanode/
msg_ok "Rebuilt Application"
msg_info "Restoring Data"
cp /opt/colanode.env.bak /opt/colanode/.env
rm -f /opt/colanode.env.bak
msg_ok "Restored Data"
msg_info "Starting Services"
systemctl start colanode-server
msg_ok "Started Services"
msg_ok "Updated successfully!"
fi
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URLs:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:4000${CL} (Web UI)"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL} (API Server)"

80
ct/deferred/edit-mind.sh Normal file
View File

@@ -0,0 +1,80 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
# Source: https://github.com/IliasHad/edit-mind
APP="Edit-Mind"
var_tags="${var_tags:-ai;media;photos}"
var_cpu="${var_cpu:-4}"
var_ram="${var_ram:-8192}"
var_disk="${var_disk:-32}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /opt/edit-mind ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "edit-mind" "IliasHad/edit-mind"; then
msg_info "Stopping Services"
systemctl stop edit-mind-web edit-mind-jobs
msg_ok "Stopped Services"
msg_info "Backing up Data"
cp /opt/edit-mind/.env /opt/edit-mind.env.bak
cp /opt/edit-mind/.env.system /opt/edit-mind.env.system.bak
msg_ok "Backed up Data"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "edit-mind" "IliasHad/edit-mind" "tarball"
msg_info "Rebuilding Application"
cd /opt/edit-mind
$STD pnpm install --prefer-frozen-lockfile
$STD pnpm --filter prisma generate
$STD pnpm run build:web
$STD pnpm rebuild @tailwindcss/oxide rollup onnxruntime-node
$STD pnpm run build:background-jobs
msg_ok "Rebuilt Application"
msg_info "Restoring Data"
cp /opt/edit-mind.env.bak /opt/edit-mind/.env
cp /opt/edit-mind.env.system.bak /opt/edit-mind/.env.system
rm -f /opt/edit-mind.env.bak /opt/edit-mind.env.system.bak
msg_ok "Restored Data"
msg_info "Running Migrations"
cd /opt/edit-mind
set -a && source /opt/edit-mind/.env && source /opt/edit-mind/.env.system && set +a
$STD pnpm --filter prisma migrate:deploy
msg_ok "Ran Migrations"
msg_info "Starting Services"
systemctl start edit-mind-web edit-mind-jobs
msg_ok "Started Services"
msg_ok "Updated successfully!"
fi
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3745${CL}"

82
ct/excalidash.sh Normal file
View File

@@ -0,0 +1,82 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
# Source: https://github.com/ZimengXiong/ExcaliDash
APP="ExcaliDash"
var_tags="${var_tags:-documents;drawing;collaboration}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /opt/excalidash ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "excalidash" "ZimengXiong/ExcaliDash"; then
msg_info "Stopping Service"
systemctl stop excalidash
msg_ok "Stopped Service"
msg_info "Backing up Data"
cp /opt/excalidash/backend/.env /opt/excalidash.env.bak
cp /opt/excalidash/backend/prisma/database.db /opt/excalidash.db.bak 2>/dev/null || true
msg_ok "Backed up Data"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "excalidash" "ZimengXiong/ExcaliDash" "tarball"
msg_info "Rebuilding Application"
cd /opt/excalidash/backend
$STD npm ci
$STD npx prisma generate
$STD npx tsc
cd /opt/excalidash/frontend
$STD npm ci
$STD npm run build
cp -r /opt/excalidash/frontend/dist/. /var/www/excalidash/
msg_ok "Rebuilt Application"
msg_info "Restoring Data"
cp /opt/excalidash.env.bak /opt/excalidash/backend/.env
cp /opt/excalidash.db.bak /opt/excalidash/backend/prisma/database.db 2>/dev/null || true
rm -f /opt/excalidash.env.bak /opt/excalidash.db.bak
msg_ok "Restored Data"
msg_info "Running Migrations"
cd /opt/excalidash/backend
set -a && source /opt/excalidash/backend/.env && set +a
$STD npx prisma migrate deploy
msg_ok "Ran Migrations"
msg_info "Starting Service"
systemctl start excalidash
msg_ok "Started Service"
msg_ok "Updated successfully!"
fi
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:6767${CL}"

177
install/bunkerm-install.sh Normal file
View File

@@ -0,0 +1,177 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
# Source: https://bunkerai.dev/
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 \
build-essential \
mosquitto \
mosquitto-clients \
libmosquitto-dev \
nginx \
supervisor \
python3 \
python3-dev \
python3-venv \
python3-pip \
libffi-dev \
libssl-dev \
gcc \
openssl
msg_ok "Installed Dependencies"
NODE_VERSION="20" setup_nodejs
fetch_and_deploy_gh_release "bunkerm" "bunkeriot/BunkerM" "tarball"
msg_info "Setting up Python Environment"
python3 -m venv /opt/venv
/opt/venv/bin/pip install --upgrade pip >/dev/null 2>&1
$STD /opt/venv/bin/pip install --no-cache-dir \
psutil \
paho-mqtt \
fastapi \
python-dotenv \
pydantic \
pydantic-settings \
"uvicorn[standard]" \
flask \
flask-cors \
pytz \
statistics \
python-multipart \
"passlib[bcrypt]" \
python-jwt \
PyJWT \
slowapi \
secure \
python-decouple \
starlette-context \
structlog \
python-json-logger \
aiofiles \
types-aiofiles \
typing-extensions \
"sqlalchemy[asyncio]>=2.0.30" \
"aiosqlite>=0.20.0" \
"alembic>=1.13.0" \
"httpx>=0.27.0" \
"numpy>=1.26.0" \
"websockets>=12.0" \
"apscheduler>=3.10.0" \
cryptography \
pyOpenSSL \
"python-jose[cryptography]" \
fastapi-jwt-auth \
fastapi-limiter
msg_ok "Set up Python Environment"
msg_info "Building Frontend"
cd /opt/bunkerm/frontend
AUTH_SECRET="build-time-placeholder" NEXT_TELEMETRY_DISABLED=1 $STD npm ci
AUTH_SECRET="build-time-placeholder" NEXT_TELEMETRY_DISABLED=1 $STD npm run build
mkdir -p /nextjs
cp -r /opt/bunkerm/frontend/.next/standalone/. /nextjs/
cp -r /opt/bunkerm/frontend/.next/static /nextjs/.next/static
cp -r /opt/bunkerm/frontend/public /nextjs/public
msg_ok "Built Frontend"
msg_info "Setting up Application"
mkdir -p /app
cp -r /opt/bunkerm/backend/app/. /app/
touch /app/monitor/__init__.py
msg_ok "Set up Application"
msg_info "Configuring Mosquitto"
mkdir -p /etc/mosquitto/conf.d /var/lib/mosquitto/db /var/log/mosquitto /tmp/mosquitto_backups /tmp/dynsec_backups
cp /opt/bunkerm/backend/mosquitto/config/mosquitto.conf /etc/mosquitto/mosquitto.conf
cp -r /opt/bunkerm/backend/etc/mosquitto/conf.d/. /etc/mosquitto/conf.d/
cp /opt/bunkerm/backend/mosquitto/dynsec/dynamic-security.json /var/lib/mosquitto/dynamic-security.json
touch /etc/mosquitto/mosquitto_passwd
id -u mosquitto &>/dev/null || useradd -r -s /usr/sbin/nologin mosquitto
chown -R mosquitto:mosquitto /var/lib/mosquitto /var/log/mosquitto /etc/mosquitto
chmod 664 /etc/mosquitto/mosquitto_passwd
msg_ok "Configured Mosquitto"
msg_info "Configuring Nginx"
mkdir -p /run/nginx /etc/nginx/conf.d /var/log/nginx /var/lib/history
cp /opt/bunkerm/nginx.conf /etc/nginx/nginx.conf
cp /opt/bunkerm/default-next.conf /etc/nginx/conf.d/default.conf
msg_ok "Configured Nginx"
msg_info "Configuring Supervisor"
mkdir -p /var/log/supervisor /var/log/api /etc/bunkerm /nextjs/data
cp /opt/bunkerm/supervisord-next.conf /etc/supervisor/conf.d/bunkerm.conf
msg_ok "Configured Supervisor"
msg_info "Creating Environment"
MQTT_USERNAME="bunker"
MQTT_PASSWORD="bunker"
JWT_SECRET=$(openssl rand -base64 48 | tr -dc 'a-zA-Z0-9' | cut -c1-48)
API_KEY=$(openssl rand -base64 48 | tr -dc 'a-zA-Z0-9' | cut -c1-48)
AUTH_SECRET=$(openssl rand -base64 48 | tr -dc 'a-zA-Z0-9' | cut -c1-48)
cat <<EOF >/etc/bunkerm/bunkerm.env
MQTT_BROKER=localhost
MQTT_PORT=1900
MQTT_USERNAME=${MQTT_USERNAME}
MQTT_PASSWORD=${MQTT_PASSWORD}
JWT_SECRET=${JWT_SECRET}
API_KEY=${API_KEY}
AUTH_SECRET=${AUTH_SECRET}
HOST_ADDRESS=${LOCAL_IP}
FRONTEND_URL=http://${LOCAL_IP}:2000
ALLOWED_ORIGINS=*
ALLOWED_HOSTS=*
RATE_LIMIT_PER_MINUTE=100
LOG_LEVEL=INFO
API_LOG_FILE=/var/log/api/api_activity.log
BROKER_LOG_PATH=/var/log/mosquitto/mosquitto.log
CLIENT_LOG_PATH=/var/log/api/api_activity.log
MOSQUITTO_PASSWD_PATH=/etc/mosquitto/mosquitto_passwd
MOSQUITTO_CONF_PATH=/etc/mosquitto/mosquitto.conf
MOSQUITTO_BACKUP_DIR=/tmp/mosquitto_backups
CONFIG_API_PORT=1005
DYNSEC_PATH=/var/lib/mosquitto/dynamic-security.json
DYNSEC_BACKUP_DIR=/tmp/dynsec_backups
MAX_UPLOAD_SIZE=10485760
PYTHONPATH=/app/monitor
NODE_ENV=production
BUNKERAI_API_KEY=
BUNKERAI_WS_URL=wss://api.bunkerai.dev/connect
EOF
msg_ok "Created Environment"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/bunkerm.service
[Unit]
Description=BunkerM MQTT Management Platform
After=network.target
[Service]
Type=simple
User=root
EnvironmentFile=/etc/bunkerm/bunkerm.env
ExecStart=/usr/bin/supervisord -c /etc/supervisor/conf.d/bunkerm.conf -n
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now bunkerm
msg_ok "Created Service"
motd_ssh
customize
cleanup_lxc

View File

@@ -0,0 +1,93 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
# Source: https://colanode.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 \
build-essential \
redis-server \
nginx
msg_ok "Installed Dependencies"
PG_VERSION="17" PG_MODULES="pgvector" setup_postgresql
PG_DB_NAME="colanode_db" PG_DB_USER="colanode" setup_postgresql_db
NODE_VERSION="22" setup_nodejs
fetch_and_deploy_gh_release "colanode" "colanode/colanode" "tarball"
msg_info "Building Application"
cd /opt/colanode
$STD npm ci
$STD npm run build -w @colanode/core
$STD npm run build -w @colanode/crdt
$STD npm run build -w @colanode/server
$STD npm run build -w @colanode/client
$STD npm run build -w @colanode/ui
$STD npm run build -w @colanode/web
$STD npm prune --production
msg_ok "Built Application"
msg_info "Configuring Application"
mkdir -p /var/lib/colanode/storage /var/www/colanode
cp -r /opt/colanode/apps/web/dist/. /var/www/colanode/
cat <<EOF >/opt/colanode/.env
POSTGRES_URL=postgresql://${PG_DB_USER}:${PG_DB_PASS}@127.0.0.1:5432/${PG_DB_NAME}
REDIS_URL=redis://127.0.0.1:6379
NODE_ENV=production
EOF
msg_ok "Configured Application"
msg_info "Configuring Nginx"
cat <<EOF >/etc/nginx/sites-available/colanode
server {
listen 4000;
server_name _;
root /var/www/colanode;
index index.html;
location / {
try_files \$uri \$uri/ /index.html;
}
}
EOF
ln -sf /etc/nginx/sites-available/colanode /etc/nginx/sites-enabled/colanode
rm -f /etc/nginx/sites-enabled/default
systemctl reload nginx
msg_ok "Configured Nginx"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/colanode-server.service
[Unit]
Description=Colanode Server
After=network.target postgresql.service redis-server.service
Requires=postgresql.service redis-server.service
[Service]
Type=simple
User=root
WorkingDirectory=/opt/colanode
EnvironmentFile=/opt/colanode/.env
ExecStart=/usr/bin/node apps/server/dist/index.js
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now colanode-server
msg_ok "Created Service"
motd_ssh
customize
cleanup_lxc

View File

@@ -0,0 +1,202 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
# Source: https://github.com/IliasHad/edit-mind
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 \
build-essential \
cmake \
redis-server \
nginx \
python3 \
python3-dev \
python3-venv \
python3-pip \
libgomp1 \
libglib2.0-0 \
libgl1 \
libsm6 \
libxext6 \
libxrender1 \
openssl
msg_ok "Installed Dependencies"
setup_ffmpeg
PG_VERSION="16" PG_MODULES="pgvector" setup_postgresql
PG_DB_NAME="editmind" PG_DB_USER="editmind" setup_postgresql_db
NODE_VERSION="22" setup_nodejs
msg_info "Installing pnpm"
$STD npm install -g pnpm@10
msg_ok "Installed pnpm"
fetch_and_deploy_gh_release "edit-mind" "IliasHad/edit-mind" "tarball"
msg_info "Installing Application Dependencies"
cd /opt/edit-mind
$STD pnpm install --prefer-frozen-lockfile
$STD pnpm --filter prisma generate
msg_ok "Installed Application Dependencies"
msg_info "Building Application"
$STD pnpm run build:web
$STD pnpm rebuild @tailwindcss/oxide rollup onnxruntime-node
$STD pnpm run build:background-jobs
msg_ok "Built Application"
msg_info "Setting up Python ML Environment"
python3 -m venv /opt/edit-mind/.venv
$STD /opt/edit-mind/.venv/bin/pip install --upgrade pip
$STD /opt/edit-mind/.venv/bin/pip install --no-cache-dir -r /opt/edit-mind/python/requirements.txt
msg_ok "Set up Python ML Environment"
msg_info "Setting up ChromaDB"
$STD /opt/edit-mind/.venv/bin/pip install --no-cache-dir chromadb
msg_ok "Set up ChromaDB"
msg_info "Configuring Application"
SESSION_SECRET=$(openssl rand -base64 32)
ENCRYPTION_KEY=$(openssl rand -base64 32)
mkdir -p /opt/edit-mind/.data /opt/edit-mind/ml-models
cat <<EOF >/opt/edit-mind/.env
SESSION_SECRET=${SESSION_SECRET}
ENCRYPTION_KEY=${ENCRYPTION_KEY}
HOST_MEDIA_PATH=/opt/edit-mind/media
OLLAMA_MODEL=qwen2.5:7b-instruct
USE_OLLAMA_MODEL=false
OLLAMA_HOST=
OLLAMA_PORT=
GEMINI_API_KEY=
USE_GEMINI=false
PORT=3745
BACKGROUND_JOBS_PORT=4000
ML_PORT=8765
REDIS_PORT=6379
POSTGRES_PORT=5432
CHROMA_PORT=8000
EOF
cat <<EOF >/opt/edit-mind/.env.system
DATABASE_URL=postgresql://${PG_DB_USER}:${PG_DB_PASS}@127.0.0.1:5432/${PG_DB_NAME}
REDIS_URL=redis://127.0.0.1:6379
REDIS_HOST=127.0.0.1
CHROMA_HOST=127.0.0.1
IS_PERSISTENT=TRUE
ML_HOST=127.0.0.1
PROCESSED_VIDEOS_DIR=/opt/edit-mind/.data
THUMBNAILS_PATH=/opt/edit-mind/.data/.thumbnails
STITCHED_VIDEOS_DIR=/opt/edit-mind/.data/.stitched-videos
FACES_DIR=/opt/edit-mind/.data/.faces
UNKNOWN_FACES_DIR=/opt/edit-mind/.data/.unknown_faces
KNOWN_FACES_FILE=/opt/edit-mind/.data/.faces.json
KNOWN_FACES_FILE_LOADED=/opt/edit-mind/.data/.known_faces.json
BACKGROUND_JOBS_URL=http://127.0.0.1:4000
NODE_ENV=production
ANONYMIZED_TELEMETRY=FALSE
WEB_APP_URL=http://127.0.0.1:3745
EOF
mkdir -p /opt/edit-mind/media
set -a && source /opt/edit-mind/.env && source /opt/edit-mind/.env.system && set +a
$STD pnpm --filter prisma migrate:deploy
$STD pnpm --filter db seed
msg_ok "Configured Application"
msg_info "Creating Services"
cat <<EOF >/etc/systemd/system/edit-mind-chroma.service
[Unit]
Description=Edit-Mind ChromaDB
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/edit-mind
Environment=IS_PERSISTENT=TRUE
ExecStart=/opt/edit-mind/.venv/bin/chroma run --host 127.0.0.1 --port 8000 --path /opt/edit-mind/.data/chroma
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
cat <<EOF >/etc/systemd/system/edit-mind-ml.service
[Unit]
Description=Edit-Mind ML Service
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/edit-mind
EnvironmentFile=/opt/edit-mind/.env
EnvironmentFile=/opt/edit-mind/.env.system
Environment=YOLO_CONFIG_DIR=/opt/edit-mind/ml-models/ultralytics
Environment=DEEPFACE_HOME=/opt/edit-mind/ml-models/deepface
Environment=TRANSCRIPTION_MODEL_CACHE=/opt/edit-mind/ml-models/whisper
Environment=TORCH_HOME=/opt/edit-mind/ml-models/torch
Environment=HF_HOME=/opt/edit-mind/ml-models/huggingface
ExecStart=/opt/edit-mind/.venv/bin/python /opt/edit-mind/python/main.py --host 0.0.0.0 --port 8765
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
cat <<EOF >/etc/systemd/system/edit-mind-jobs.service
[Unit]
Description=Edit-Mind Background Jobs
After=network.target postgresql.service redis-server.service edit-mind-chroma.service edit-mind-ml.service
[Service]
Type=simple
User=root
WorkingDirectory=/opt/edit-mind
EnvironmentFile=/opt/edit-mind/.env
EnvironmentFile=/opt/edit-mind/.env.system
ExecStart=/usr/bin/pnpm --filter background-jobs start
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
cat <<EOF >/etc/systemd/system/edit-mind-web.service
[Unit]
Description=Edit-Mind Web Application
After=network.target postgresql.service redis-server.service edit-mind-chroma.service
[Service]
Type=simple
User=root
WorkingDirectory=/opt/edit-mind
EnvironmentFile=/opt/edit-mind/.env
EnvironmentFile=/opt/edit-mind/.env.system
ExecStart=/usr/bin/pnpm --filter web start --host 0.0.0.0 --port 3745
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now edit-mind-chroma
systemctl enable -q --now edit-mind-ml
systemctl enable -q --now edit-mind-jobs
systemctl enable -q --now edit-mind-web
msg_ok "Created Services"
motd_ssh
customize
cleanup_lxc

View File

@@ -0,0 +1,112 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
# Source: https://github.com/ZimengXiong/ExcaliDash
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 \
build-essential \
python3 \
make \
nginx
msg_ok "Installed Dependencies"
NODE_VERSION="20" setup_nodejs
fetch_and_deploy_gh_release "excalidash" "ZimengXiong/ExcaliDash" "tarball"
msg_info "Building Backend"
cd /opt/excalidash/backend
$STD npm ci
$STD npx prisma generate
$STD npx tsc
msg_ok "Built Backend"
msg_info "Building Frontend"
cd /opt/excalidash/frontend
$STD npm ci
$STD npm run build
msg_ok "Built Frontend"
msg_info "Configuring Application"
mkdir -p /opt/excalidash/backend/prisma
mkdir -p /var/www/excalidash
cp -r /opt/excalidash/frontend/dist/. /var/www/excalidash/
cat <<EOF >/opt/excalidash/backend/.env
DATABASE_URL=file:/opt/excalidash/backend/prisma/database.db
PORT=8000
NODE_ENV=production
AUTH_MODE=local
TRUST_PROXY=false
RUN_MIGRATIONS=false
JWT_SECRET=$(openssl rand -hex 32)
CSRF_SECRET=$(openssl rand -base64 32)
EOF
cd /opt/excalidash/backend
set -a && source /opt/excalidash/backend/.env && set +a
$STD npx prisma migrate deploy
msg_ok "Configured Application"
msg_info "Configuring Nginx"
cat <<EOF >/etc/nginx/sites-available/excalidash
server {
listen 6767;
server_name _;
root /var/www/excalidash;
index index.html;
location / {
try_files \$uri \$uri/ /index.html;
}
location /api {
proxy_pass http://127.0.0.1:8000;
proxy_http_version 1.1;
proxy_set_header Upgrade \$http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
}
}
EOF
ln -sf /etc/nginx/sites-available/excalidash /etc/nginx/sites-enabled/excalidash
rm -f /etc/nginx/sites-enabled/default
systemctl reload nginx
msg_ok "Configured Nginx"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/excalidash.service
[Unit]
Description=ExcaliDash Service
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/excalidash/backend
EnvironmentFile=/opt/excalidash/backend/.env
ExecStart=/usr/bin/node dist/index.js
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now excalidash
msg_ok "Created Service"
motd_ssh
customize
cleanup_lxc

44
json/bunkerm.json Normal file
View File

@@ -0,0 +1,44 @@
{
"name": "BunkerM",
"slug": "bunkerm",
"categories": [
18
],
"date_created": "2026-05-12",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 2000,
"documentation": "https://bunkerai.dev/docs",
"website": "https://bunkerai.dev/",
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/bunkerm.webp",
"description": "All-in-one self-hosted MQTT broker management platform bundling Eclipse Mosquitto with a full-featured web dashboard, smart anomaly detection, local automation agents, and optional AI assistant.",
"install_methods": [
{
"type": "default",
"script": "ct/bunkerm.sh",
"config_path": "/etc/bunkerm/bunkerm.env",
"resources": {
"cpu": 2,
"ram": 2048,
"hdd": 8,
"os": "Debian",
"version": "13"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": [
{
"text": "MQTT broker is available on port 1900. Default MQTT credentials are username 'bunker' / password 'bunker' — change them after first login.",
"type": "warning"
},
{
"text": "Create your admin account on first visit to the web UI at port 2000.",
"type": "info"
}
]
}

44
json/colanode.json Normal file
View File

@@ -0,0 +1,44 @@
{
"name": "Colanode",
"slug": "colanode",
"categories": [
12
],
"date_created": "2026-05-12",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 4000,
"documentation": "https://github.com/colanode/colanode/blob/main/hosting/docker",
"website": "https://colanode.com/",
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/colanode.webp",
"description": "Open-source, local-first collaboration workspace — a self-hosted Slack and Notion alternative with real-time chat, rich text pages, customizable databases, and file management.",
"install_methods": [
{
"type": "default",
"script": "ct/colanode.sh",
"config_path": "/opt/colanode/.env",
"resources": {
"cpu": 4,
"ram": 4096,
"hdd": 16,
"os": "Debian",
"version": "13"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": [
{
"text": "Web UI is available on port 4000. Connect it to the API server at http://YOUR_IP:3000 from within the app.",
"type": "info"
},
{
"text": "Requires at least 4 GB RAM for the build process.",
"type": "warning"
}
]
}

44
json/edit-mind.json Normal file
View File

@@ -0,0 +1,44 @@
{
"name": "Edit-Mind",
"slug": "edit-mind",
"categories": [
13
],
"date_created": "2026-05-12",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 3745,
"documentation": "https://github.com/IliasHad/edit-mind",
"website": "https://github.com/IliasHad/edit-mind",
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/edit-mind.webp",
"description": "AI-powered media management platform with semantic search, face recognition, video transcription, smart collections, and background job processing for your personal media library.",
"install_methods": [
{
"type": "default",
"script": "ct/deferred/edit-mind.sh",
"config_path": "/opt/edit-mind/.env",
"resources": {
"cpu": 4,
"ram": 8192,
"hdd": 32,
"os": "Debian",
"version": "13"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": [
{
"text": "Requires at least 8 GB RAM. AI model downloads happen on first use and may take several minutes.",
"type": "warning"
},
{
"text": "Set HOST_MEDIA_PATH in /opt/edit-mind/.env to point to your media folder. GPU acceleration is not supported in LXC containers.",
"type": "info"
}
]
}

44
json/excalidash.json Normal file
View File

@@ -0,0 +1,44 @@
{
"name": "ExcaliDash",
"slug": "excalidash",
"categories": [
12
],
"date_created": "2026-05-12",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 6767,
"documentation": "https://github.com/ZimengXiong/ExcaliDash/blob/main/README.md",
"website": "https://github.com/ZimengXiong/ExcaliDash",
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/excalidraw.webp",
"description": "Self-hosted dashboard and organizer for Excalidraw with persistent storage, real-time collaboration, version history, multi-user authentication, and scoped sharing.",
"install_methods": [
{
"type": "default",
"script": "ct/excalidash.sh",
"config_path": "/opt/excalidash/backend/.env",
"resources": {
"cpu": 2,
"ram": 2048,
"hdd": 8,
"os": "Debian",
"version": "13"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": [
{
"text": "ExcaliDash is in BETA. Back up your data regularly.",
"type": "warning"
},
{
"text": "Create your admin account on first visit at the web UI.",
"type": "info"
}
]
}