From 634e89a762372d5bb6a1fc9c276008b7b7db7dd1 Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Mon, 30 Mar 2026 10:11:32 +0200 Subject: [PATCH] feat: add Transmute, DrawDB, and Nametag CT scripts Transmute: Self-hosted file converter (Python 3.13/FastAPI + Node.js 20) - 100+ formats: images, video, audio, docs, spreadsheets, fonts - ffmpeg, ghostscript, inkscape, tesseract, libreoffice, pandoc, calibre - Port 3313, SQLite, Xvfb for headless rendering DrawDB: Database schema editor (pure SPA, Node.js 20 + Caddy) - Tags-only repo: uses fetch_and_deploy_gh_tag/check_for_gh_tag - Port 3000, no backend, no database Nametag: Personal relationships manager (Next.js standalone + PostgreSQL) - Prisma ORM, photo storage, cron jobs for reminders/purge - Port 3000, auto-verified accounts for self-hosted --- ct/drawdb.sh | 52 +++++++++++++++++ ct/nametag.sh | 78 +++++++++++++++++++++++++ ct/transmute.sh | 78 +++++++++++++++++++++++++ install/drawdb-install.sh | 42 +++++++++++++ install/nametag-install.sh | 86 +++++++++++++++++++++++++++ install/transmute-install.sh | 110 +++++++++++++++++++++++++++++++++++ json/drawdb.json | 33 +++++++++++ json/nametag.json | 38 ++++++++++++ json/transmute.json | 38 ++++++++++++ 9 files changed, 555 insertions(+) create mode 100644 ct/drawdb.sh create mode 100644 ct/nametag.sh create mode 100644 ct/transmute.sh create mode 100644 install/drawdb-install.sh create mode 100644 install/nametag-install.sh create mode 100644 install/transmute-install.sh create mode 100644 json/drawdb.json create mode 100644 json/nametag.json create mode 100644 json/transmute.json diff --git a/ct/drawdb.sh b/ct/drawdb.sh new file mode 100644 index 000000000..35df23663 --- /dev/null +++ b/ct/drawdb.sh @@ -0,0 +1,52 @@ +#!/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 +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://github.com/drawdb-io/drawdb + +APP="DrawDB" +var_tags="${var_tags:-database;dev-tools}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-2048}" +var_disk="${var_disk:-4}" +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/drawdb ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_tag "drawdb" "drawdb-io/drawdb"; then + CLEAN_INSTALL=1 fetch_and_deploy_gh_tag "drawdb" "drawdb-io/drawdb" "latest" "/opt/drawdb" + + msg_info "Rebuilding Frontend" + cd /opt/drawdb + $STD npm ci + NODE_OPTIONS="--max-old-space-size=4096" $STD npm run build + msg_ok "Rebuilt Frontend" + 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}:3000${CL}" diff --git a/ct/nametag.sh b/ct/nametag.sh new file mode 100644 index 000000000..40133a7d1 --- /dev/null +++ b/ct/nametag.sh @@ -0,0 +1,78 @@ +#!/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 +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://github.com/mattogodoy/nametag + +APP="Nametag" +var_tags="${var_tags:-contacts;crm}" +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/nametag ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_release "nametag" "mattogodoy/nametag"; then + msg_info "Stopping Service" + systemctl stop nametag + msg_ok "Stopped Service" + + msg_info "Backing up Data" + cp /opt/nametag/.env /opt/nametag.env.bak + cp -r /opt/nametag/data /opt/nametag_data_bak + msg_ok "Backed up Data" + + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "nametag" "mattogodoy/nametag" "tarball" "latest" "/opt/nametag" + + msg_info "Rebuilding Application" + cd /opt/nametag + $STD npm ci + $STD npx prisma generate + $STD npm run build + msg_ok "Rebuilt Application" + + msg_info "Restoring Data" + cp /opt/nametag.env.bak /opt/nametag/.env + cp -r /opt/nametag_data_bak/. /opt/nametag/data/ + rm -f /opt/nametag.env.bak + rm -rf /opt/nametag_data_bak + msg_ok "Restored Data" + + msg_info "Running Migrations" + cd /opt/nametag + $STD npx prisma migrate deploy + msg_ok "Ran Migrations" + + msg_info "Starting Service" + systemctl start nametag + 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}:3000${CL}" diff --git a/ct/transmute.sh b/ct/transmute.sh new file mode 100644 index 000000000..0af0f7635 --- /dev/null +++ b/ct/transmute.sh @@ -0,0 +1,78 @@ +#!/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 +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://github.com/transmute-app/transmute + +APP="Transmute" +var_tags="${var_tags:-files;converter}" +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/transmute ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_release "transmute" "transmute-app/transmute"; then + msg_info "Stopping Service" + systemctl stop transmute + msg_ok "Stopped Service" + + msg_info "Backing up Data" + cp /opt/transmute/backend/.env /opt/transmute.env.bak + cp -r /opt/transmute/data /opt/transmute_data_bak + msg_ok "Backed up Data" + + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "transmute" "transmute-app/transmute" "tarball" "latest" "/opt/transmute" + + msg_info "Updating Python Dependencies" + cd /opt/transmute + $STD uv venv /opt/transmute/.venv + $STD uv pip install --python /opt/transmute/.venv/bin/python -r requirements.txt + msg_ok "Updated Python Dependencies" + + msg_info "Rebuilding Frontend" + cd /opt/transmute/frontend + $STD npm ci + $STD npm run build + msg_ok "Rebuilt Frontend" + + msg_info "Restoring Data" + cp /opt/transmute.env.bak /opt/transmute/backend/.env + cp -r /opt/transmute_data_bak/. /opt/transmute/data/ + rm -f /opt/transmute.env.bak + rm -rf /opt/transmute_data_bak + msg_ok "Restored Data" + + msg_info "Starting Service" + systemctl start transmute + 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}:3313${CL}" diff --git a/install/drawdb-install.sh b/install/drawdb-install.sh new file mode 100644 index 000000000..68f2b16e6 --- /dev/null +++ b/install/drawdb-install.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: MickLesk +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://github.com/drawdb-io/drawdb + +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 caddy +msg_ok "Installed Dependencies" + +NODE_VERSION="20" setup_nodejs +fetch_and_deploy_gh_tag "drawdb" "drawdb-io/drawdb" "latest" "/opt/drawdb" + +msg_info "Building Frontend" +cd /opt/drawdb +$STD npm ci +NODE_OPTIONS="--max-old-space-size=4096" $STD npm run build +msg_ok "Built Frontend" + +msg_info "Configuring Caddy" +cat </etc/caddy/Caddyfile +:3000 { + root * /opt/drawdb/dist + file_server + try_files {path} /index.html +} +EOF +systemctl reload caddy +msg_ok "Configured Caddy" + +motd_ssh +customize +cleanup_lxc diff --git a/install/nametag-install.sh b/install/nametag-install.sh new file mode 100644 index 000000000..66a5462f3 --- /dev/null +++ b/install/nametag-install.sh @@ -0,0 +1,86 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: MickLesk +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://github.com/mattogodoy/nametag + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +PG_VERSION="16" setup_postgresql +PG_DB_NAME="nametag_db" PG_DB_USER="nametag" setup_postgresql_db +NODE_VERSION="20" setup_nodejs +fetch_and_deploy_gh_release "nametag" "mattogodoy/nametag" "tarball" "latest" "/opt/nametag" + +msg_info "Setting up Application" +cd /opt/nametag +$STD npm ci +$STD npx prisma generate +DATABASE_URL="postgresql://${PG_DB_USER}:${PG_DB_PASS}@127.0.0.1:5432/${PG_DB_NAME}" $STD npx prisma migrate deploy +msg_ok "Set up Application" + +msg_info "Configuring Nametag" +NEXTAUTH_SECRET=$(openssl rand -base64 32) +CRON_SECRET=$(openssl rand -base64 16) +mkdir -p /opt/nametag/data/photos +cat </opt/nametag/.env +DATABASE_URL=postgresql://${PG_DB_USER}:${PG_DB_PASS}@127.0.0.1:5432/${PG_DB_NAME} +NEXTAUTH_URL=http://${LOCAL_IP}:3000 +NEXTAUTH_SECRET=${NEXTAUTH_SECRET} +CRON_SECRET=${CRON_SECRET} +PHOTO_STORAGE_PATH=/opt/nametag/data/photos +NODE_ENV=production +EOF +msg_ok "Configured Nametag" + +msg_info "Building Application" +cd /opt/nametag +set -a +source /opt/nametag/.env +set +a +$STD npm run build +msg_ok "Built Application" + +msg_info "Running Production Seed" +cd /opt/nametag +$STD npx esbuild prisma/seed.production.ts --platform=node --format=cjs --outfile=prisma/seed.production.js --bundle --external:@prisma/client --external:pg --minify +$STD node prisma/seed.production.js +msg_ok "Ran Production Seed" + +msg_info "Creating Service" +cat </etc/systemd/system/nametag.service +[Unit] +Description=Nametag - Personal Relationships Manager +After=network.target postgresql.service + +[Service] +Type=simple +WorkingDirectory=/opt/nametag +EnvironmentFile=/opt/nametag/.env +ExecStart=/usr/bin/node /opt/nametag/.next/standalone/server.js +Restart=on-failure +RestartSec=5 + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now nametag +msg_ok "Created Service" + +msg_info "Setting up Cron Jobs" +cat </etc/cron.d/nametag +0 8 * * * root curl -sf -H "Authorization: Bearer ${CRON_SECRET}" http://127.0.0.1:3000/api/cron/send-reminders >/dev/null 2>&1 +0 3 * * * root curl -sf -H "Authorization: Bearer ${CRON_SECRET}" http://127.0.0.1:3000/api/cron/purge-deleted >/dev/null 2>&1 +EOF +chmod 644 /etc/cron.d/nametag +msg_ok "Set up Cron Jobs" + +motd_ssh +customize +cleanup_lxc diff --git a/install/transmute-install.sh b/install/transmute-install.sh new file mode 100644 index 000000000..3d1ba2c62 --- /dev/null +++ b/install/transmute-install.sh @@ -0,0 +1,110 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: MickLesk +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://github.com/transmute-app/transmute + +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 \ + inkscape \ + tesseract-ocr \ + libreoffice-impress \ + libreoffice-common \ + libmagic1 \ + xvfb \ + libpango-1.0-0 \ + libpangocairo-1.0-0 \ + libgdk-pixbuf-2.0-0 \ + libffi-dev \ + libcairo2 \ + librsvg2-bin \ + unar \ + python3-numpy \ + python3-lxml \ + python3-tinycss2 \ + python3-cssselect +msg_ok "Installed Dependencies" + +UV_PYTHON="3.13" setup_uv +NODE_VERSION="20" setup_nodejs +setup_ffmpeg +setup_gs + +msg_info "Installing Pandoc" +PANDOC_VERSION=$(get_latest_github_release "jgm/pandoc") +curl -fsSL "https://github.com/jgm/pandoc/releases/download/${PANDOC_VERSION}/pandoc-${PANDOC_VERSION#v}-linux-amd64.tar.gz" -o /tmp/pandoc.tar.gz +tar -xzf /tmp/pandoc.tar.gz -C /tmp +cp /tmp/pandoc-*/bin/pandoc /usr/local/bin/pandoc +chmod +x /usr/local/bin/pandoc +rm -rf /tmp/pandoc* +msg_ok "Installed Pandoc" + +msg_info "Installing Calibre" +CALIBRE_VERSION=$(get_latest_github_release "kovidgoyal/calibre") +curl -fsSL "https://github.com/kovidgoyal/calibre/releases/download/${CALIBRE_VERSION}/calibre-${CALIBRE_VERSION#v}-x86_64.txz" -o /tmp/calibre.txz +mkdir -p /opt/calibre +tar -xJf /tmp/calibre.txz -C /opt/calibre +ln -sf /opt/calibre/ebook-convert /usr/bin/ebook-convert +rm -f /tmp/calibre.txz +msg_ok "Installed Calibre" + +fetch_and_deploy_gh_release "transmute" "transmute-app/transmute" "tarball" "latest" "/opt/transmute" + +msg_info "Setting up Python Backend" +cd /opt/transmute +$STD uv venv /opt/transmute/.venv +$STD uv pip install --python /opt/transmute/.venv/bin/python -r requirements.txt +msg_ok "Set up Python Backend" + +msg_info "Configuring Transmute" +SECRET_KEY=$(openssl rand -hex 64) +cat </opt/transmute/backend/.env +AUTH_SECRET_KEY=${SECRET_KEY} +HOST=0.0.0.0 +PORT=3313 +DATA_DIR=/opt/transmute/data +WEB_DIR=/opt/transmute/frontend/dist +EOF +mkdir -p /opt/transmute/data +msg_ok "Configured Transmute" + +msg_info "Building Frontend" +cd /opt/transmute/frontend +$STD npm ci +$STD npm run build +msg_ok "Built Frontend" + +msg_info "Creating Service" +cat </etc/systemd/system/transmute.service +[Unit] +Description=Transmute File Converter +After=network.target + +[Service] +Type=simple +WorkingDirectory=/opt/transmute +EnvironmentFile=/opt/transmute/backend/.env +Environment=DISPLAY=:99 +ExecStartPre=/usr/bin/Xvfb :99 -screen 0 1024x768x24 -nolisten tcp +ExecStart=/opt/transmute/.venv/bin/python backend/main.py +Restart=on-failure +RestartSec=5 + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now transmute +msg_ok "Created Service" + +motd_ssh +customize +cleanup_lxc diff --git a/json/drawdb.json b/json/drawdb.json new file mode 100644 index 000000000..6b11789e5 --- /dev/null +++ b/json/drawdb.json @@ -0,0 +1,33 @@ +{ + "name": "DrawDB", + "slug": "drawdb", + "categories": [20], + "date_created": "2026-03-30", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": "https://github.com/drawdb-io/drawdb", + "website": "https://drawdb.vercel.app", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/drawdb.webp", + "config_path": "", + "description": "DrawDB is a free, simple, and intuitive database entity relationship (DBER) editor right in your browser. Build diagrams with a few clicks, export SQL scripts, and customize your editor.", + "install_methods": [ + { + "type": "default", + "script": "ct/drawdb.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 4, + "os": "Debian", + "version": "13" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/json/nametag.json b/json/nametag.json new file mode 100644 index 000000000..5cd5af36c --- /dev/null +++ b/json/nametag.json @@ -0,0 +1,38 @@ +{ + "name": "Nametag", + "slug": "nametag", + "categories": [0], + "date_created": "2026-03-30", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": "https://github.com/mattogodoy/nametag", + "website": "https://nametag.one", + "logo": "https://raw.githubusercontent.com/mattogodoy/nametag/master/public/android-chrome-192x192.png", + "config_path": "/opt/nametag/.env", + "description": "Nametag is a personal relationships manager that helps you remember the people in your life. Track birthdays, contact info, relationships, and visualize your network as an interactive graph.", + "install_methods": [ + { + "type": "default", + "script": "ct/nametag.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": "Debian", + "version": "13" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Create your first account via the web UI — self-hosted accounts are auto-verified.", + "type": "info" + } + ] +} diff --git a/json/transmute.json b/json/transmute.json new file mode 100644 index 000000000..4c8e9768d --- /dev/null +++ b/json/transmute.json @@ -0,0 +1,38 @@ +{ + "name": "Transmute", + "slug": "transmute", + "categories": [11], + "date_created": "2026-03-30", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3313, + "documentation": "https://transmute.sh/docs/getting-started/", + "website": "https://transmute.sh", + "logo": "https://raw.githubusercontent.com/transmute-app/transmute/main/frontend/public/transmute-logo.svg", + "config_path": "/opt/transmute/backend/.env", + "description": "Transmute is a free, open-source, self-hosted file converter built for privacy. Convert images, video, audio, documents, spreadsheets, subtitles, and fonts locally with no file size limits.", + "install_methods": [ + { + "type": "default", + "script": "ct/transmute.sh", + "resources": { + "cpu": 4, + "ram": 4096, + "hdd": 16, + "os": "Debian", + "version": "13" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Create your first account via the web UI — it becomes the admin account.", + "type": "info" + } + ] +}