Add CT installers and metadata for six apps
Add container templates, install scripts and metadata for six applications: BirdNET-Go, ERPNext, Jitsi Meet, Storybook, Storyteller and Tube Archivist. New files include ct/* scripts (container templates and update handlers), install/* scripts (installation and systemd service setup, dependency installation and build steps) and json/* metadata entries (app catalog data, default resources, ports and notes). Each install script configures required dependencies, creates services, and prepares runtime configuration (e.g. DB, ElasticSearch, Node/Python environments, ffmpeg/Readium). This commit enables automated LXC provisioning and update flows for these apps.
This commit is contained in:
60
ct/birdnet-go.sh
Normal file
60
ct/birdnet-go.sh
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
#!/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: community-scripts
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/tphakala/birdnet-go
|
||||||
|
|
||||||
|
APP="BirdNET-Go"
|
||||||
|
var_tags="${var_tags:-monitoring;ai;nature}"
|
||||||
|
var_cpu="${var_cpu:-4}"
|
||||||
|
var_ram="${var_ram:-2048}"
|
||||||
|
var_disk="${var_disk:-12}"
|
||||||
|
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 [[ ! -f /usr/local/bin/birdnet-go ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_release "birdnet-go" "tphakala/birdnet-go"; then
|
||||||
|
msg_info "Stopping Service"
|
||||||
|
systemctl stop birdnet-go
|
||||||
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "birdnet-go" "tphakala/birdnet-go" "prebuild" "latest" "/opt/birdnet-go" "birdnet-go-linux-amd64.tar.gz"
|
||||||
|
|
||||||
|
msg_info "Deploying Binary"
|
||||||
|
cp /opt/birdnet-go/birdnet-go /usr/local/bin/birdnet-go
|
||||||
|
chmod +x /usr/local/bin/birdnet-go
|
||||||
|
msg_ok "Deployed Binary"
|
||||||
|
|
||||||
|
msg_info "Starting Service"
|
||||||
|
systemctl start birdnet-go
|
||||||
|
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}:8080${CL}"
|
||||||
50
ct/erpnext.sh
Normal file
50
ct/erpnext.sh
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
#!/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: community-scripts
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/frappe/erpnext
|
||||||
|
|
||||||
|
APP="ERPNext"
|
||||||
|
var_tags="${var_tags:-erp;business;accounting}"
|
||||||
|
var_cpu="${var_cpu:-4}"
|
||||||
|
var_ram="${var_ram:-4096}"
|
||||||
|
var_disk="${var_disk:-20}"
|
||||||
|
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/frappe-bench ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Updating ERPNext"
|
||||||
|
cd /opt/frappe-bench
|
||||||
|
$STD bench update --reset
|
||||||
|
msg_ok "Updated ERPNext"
|
||||||
|
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}:8000${CL}"
|
||||||
|
echo -e "${INFO}${YW} Credentials:${CL}"
|
||||||
|
echo -e "${TAB}${BGN}Username: Administrator${CL}"
|
||||||
|
echo -e "${TAB}${BGN}Password: see /opt/frappe-bench/.env${CL}"
|
||||||
51
ct/jitsi.sh
Normal file
51
ct/jitsi.sh
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
#!/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: community-scripts
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||||
|
# Source: https://jitsi.org/
|
||||||
|
|
||||||
|
APP="Jitsi Meet"
|
||||||
|
var_tags="${var_tags:-video;conference;communication}"
|
||||||
|
var_cpu="${var_cpu:-4}"
|
||||||
|
var_ram="${var_ram:-4096}"
|
||||||
|
var_disk="${var_disk:-12}"
|
||||||
|
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 /etc/jitsi ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Updating Jitsi Meet"
|
||||||
|
$STD apt update
|
||||||
|
$STD apt install -y --only-upgrade \
|
||||||
|
jitsi-meet \
|
||||||
|
jicofo \
|
||||||
|
jitsi-videobridge2 \
|
||||||
|
prosody
|
||||||
|
msg_ok "Updated Jitsi Meet"
|
||||||
|
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}https://${IP}${CL}"
|
||||||
54
ct/storybook.sh
Normal file
54
ct/storybook.sh
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
#!/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: community-scripts
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/storybookjs/storybook
|
||||||
|
|
||||||
|
APP="Storybook"
|
||||||
|
var_tags="${var_tags:-dev-tools;frontend;ui}"
|
||||||
|
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 [[ ! -f /opt/storybook/.projectpath ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
PROJECT_PATH=$(cat /opt/storybook/.projectpath)
|
||||||
|
|
||||||
|
if [[ ! -d "$PROJECT_PATH" ]]; then
|
||||||
|
msg_error "Project directory not found: $PROJECT_PATH"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Updating Storybook"
|
||||||
|
cd "$PROJECT_PATH"
|
||||||
|
$STD npx storybook@latest upgrade --yes
|
||||||
|
msg_ok "Updated Storybook"
|
||||||
|
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}:6006${CL}"
|
||||||
67
ct/storyteller.sh
Normal file
67
ct/storyteller.sh
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
#!/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: community-scripts
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||||
|
# Source: https://gitlab.com/storyteller-platform/storyteller
|
||||||
|
|
||||||
|
APP="Storyteller"
|
||||||
|
var_tags="${var_tags:-media;ebook;audiobook}"
|
||||||
|
var_cpu="${var_cpu:-4}"
|
||||||
|
var_ram="${var_ram:-8192}"
|
||||||
|
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/storyteller ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Stopping Service"
|
||||||
|
systemctl stop storyteller
|
||||||
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
|
msg_info "Backing up Data"
|
||||||
|
cp /opt/storyteller/.env /opt/storyteller_env.bak
|
||||||
|
msg_ok "Backed up Data"
|
||||||
|
|
||||||
|
CLEAN_INSTALL=1 fetch_and_deploy_gl_release "storyteller" "storyteller-platform/storyteller" "tarball" "latest" "/opt/storyteller"
|
||||||
|
|
||||||
|
msg_info "Rebuilding Storyteller"
|
||||||
|
cd /opt/storyteller
|
||||||
|
$STD yarn install
|
||||||
|
$STD yarn workspaces foreach -Rpt --from @storyteller-platform/web --exclude @storyteller-platform/eslint run build
|
||||||
|
msg_ok "Rebuilt Storyteller"
|
||||||
|
|
||||||
|
msg_info "Restoring Configuration"
|
||||||
|
mv /opt/storyteller_env.bak /opt/storyteller/.env
|
||||||
|
msg_ok "Restored Configuration"
|
||||||
|
|
||||||
|
msg_info "Starting Service"
|
||||||
|
systemctl start storyteller
|
||||||
|
msg_ok "Started Service"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
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}:8001${CL}"
|
||||||
77
ct/tubearchivist.sh
Normal file
77
ct/tubearchivist.sh
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
#!/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: community-scripts
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/tubearchivist/tubearchivist
|
||||||
|
|
||||||
|
APP="Tube Archivist"
|
||||||
|
var_tags="${var_tags:-media;youtube;archiving}"
|
||||||
|
var_cpu="${var_cpu:-4}"
|
||||||
|
var_ram="${var_ram:-6144}"
|
||||||
|
var_disk="${var_disk:-30}"
|
||||||
|
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/tubearchivist ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_release "tubearchivist" "tubearchivist/tubearchivist"; then
|
||||||
|
msg_info "Stopping Service"
|
||||||
|
systemctl stop tubearchivist
|
||||||
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
|
msg_info "Backing up Data"
|
||||||
|
cp /opt/tubearchivist/.env /opt/tubearchivist_env.bak
|
||||||
|
msg_ok "Backed up Data"
|
||||||
|
|
||||||
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "tubearchivist" "tubearchivist/tubearchivist" "tarball" "latest" "/opt/tubearchivist"
|
||||||
|
|
||||||
|
msg_info "Rebuilding Tube Archivist"
|
||||||
|
cd /opt/tubearchivist/frontend
|
||||||
|
$STD npm install
|
||||||
|
$STD npm run build:deploy
|
||||||
|
mkdir -p /opt/tubearchivist/backend/static
|
||||||
|
cp -r /opt/tubearchivist/frontend/dist/* /opt/tubearchivist/backend/static/
|
||||||
|
cp /opt/tubearchivist/docker_assets/backend_start.py /opt/tubearchivist/backend/
|
||||||
|
$STD uv pip install --python /opt/tubearchivist/.venv/bin/python -r /opt/tubearchivist/backend/requirements.txt
|
||||||
|
if [[ -f /opt/tubearchivist/backend/requirements.plugins.txt ]]; then
|
||||||
|
mkdir -p /opt/yt_plugins/bgutil
|
||||||
|
$STD uv pip install --python /opt/tubearchivist/.venv/bin/python --target /opt/yt_plugins/bgutil -r /opt/tubearchivist/backend/requirements.plugins.txt
|
||||||
|
fi
|
||||||
|
msg_ok "Rebuilt Tube Archivist"
|
||||||
|
|
||||||
|
msg_info "Restoring Configuration"
|
||||||
|
mv /opt/tubearchivist_env.bak /opt/tubearchivist/.env
|
||||||
|
msg_ok "Restored Configuration"
|
||||||
|
|
||||||
|
msg_info "Starting Service"
|
||||||
|
systemctl start tubearchivist
|
||||||
|
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}:8000${CL}"
|
||||||
55
install/birdnet-go-install.sh
Normal file
55
install/birdnet-go-install.sh
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: community-scripts
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/tphakala/birdnet-go
|
||||||
|
|
||||||
|
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 \
|
||||||
|
libasound2 \
|
||||||
|
sox \
|
||||||
|
alsa-utils
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
setup_ffmpeg
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "birdnet-go" "tphakala/birdnet-go" "prebuild" "latest" "/opt/birdnet-go" "birdnet-go-linux-amd64.tar.gz"
|
||||||
|
|
||||||
|
msg_info "Setting up BirdNET-Go"
|
||||||
|
cp /opt/birdnet-go/birdnet-go /usr/local/bin/birdnet-go
|
||||||
|
chmod +x /usr/local/bin/birdnet-go
|
||||||
|
mkdir -p /opt/birdnet-go/data/clips
|
||||||
|
msg_ok "Set up BirdNET-Go"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/birdnet-go.service
|
||||||
|
[Unit]
|
||||||
|
Description=BirdNET-Go
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=/opt/birdnet-go/data
|
||||||
|
ExecStart=/usr/local/bin/birdnet-go realtime
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now birdnet-go
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
106
install/erpnext-install.sh
Normal file
106
install/erpnext-install.sh
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: community-scripts
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/frappe/erpnext
|
||||||
|
|
||||||
|
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 \
|
||||||
|
build-essential \
|
||||||
|
libffi-dev \
|
||||||
|
libssl-dev \
|
||||||
|
redis-server \
|
||||||
|
xvfb \
|
||||||
|
libfontconfig1 \
|
||||||
|
libxrender1 \
|
||||||
|
fontconfig \
|
||||||
|
libjpeg-dev \
|
||||||
|
libmariadb-dev
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
NODE_VERSION="22" NODE_MODULE="yarn" setup_nodejs
|
||||||
|
UV_PYTHON="3.13" setup_uv
|
||||||
|
|
||||||
|
setup_mariadb
|
||||||
|
|
||||||
|
msg_info "Configuring MariaDB for ERPNext"
|
||||||
|
cat <<EOF >/etc/mysql/mariadb.conf.d/50-erpnext.cnf
|
||||||
|
[mysqld]
|
||||||
|
character-set-server=utf8mb4
|
||||||
|
collation-server=utf8mb4_unicode_ci
|
||||||
|
|
||||||
|
[client]
|
||||||
|
default-character-set=utf8mb4
|
||||||
|
EOF
|
||||||
|
$STD systemctl restart mariadb
|
||||||
|
msg_ok "Configured MariaDB for ERPNext"
|
||||||
|
|
||||||
|
msg_info "Installing wkhtmltopdf"
|
||||||
|
WKHTMLTOPDF_URL="https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-3/wkhtmltox_0.12.6.1-3.bookworm_amd64.deb"
|
||||||
|
$STD curl -fsSL -o /tmp/wkhtmltox.deb "$WKHTMLTOPDF_URL"
|
||||||
|
$STD apt install -y /tmp/wkhtmltox.deb
|
||||||
|
rm -f /tmp/wkhtmltox.deb
|
||||||
|
msg_ok "Installed wkhtmltopdf"
|
||||||
|
|
||||||
|
msg_info "Installing Frappe Bench"
|
||||||
|
$STD uv tool install frappe-bench
|
||||||
|
msg_ok "Installed Frappe Bench"
|
||||||
|
|
||||||
|
msg_info "Initializing Frappe Bench"
|
||||||
|
ADMIN_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
||||||
|
cd /opt
|
||||||
|
$STD bench init --frappe-branch version-15 frappe-bench
|
||||||
|
cd /opt/frappe-bench
|
||||||
|
$STD bench get-app erpnext --branch version-15
|
||||||
|
$STD bench new-site site1.local \
|
||||||
|
--db-root-username root \
|
||||||
|
--admin-password "$ADMIN_PASS" \
|
||||||
|
--install-app erpnext \
|
||||||
|
--set-default
|
||||||
|
msg_ok "Initialized Frappe Bench"
|
||||||
|
|
||||||
|
msg_info "Configuring ERPNext"
|
||||||
|
cat <<EOF >/opt/frappe-bench/.env
|
||||||
|
ADMIN_PASSWORD=${ADMIN_PASS}
|
||||||
|
SITE_NAME=site1.local
|
||||||
|
EOF
|
||||||
|
$STD systemctl enable --now redis-server
|
||||||
|
msg_ok "Configured ERPNext"
|
||||||
|
|
||||||
|
msg_info "Setting up Production"
|
||||||
|
$STD bench setup production root --yes
|
||||||
|
msg_ok "Set up Production"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/erpnext.service
|
||||||
|
[Unit]
|
||||||
|
Description=ERPNext (Frappe Bench)
|
||||||
|
After=network.target mariadb.service redis-server.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=/opt/frappe-bench
|
||||||
|
ExecStart=/opt/frappe-bench/env/bin/gunicorn --bind 0.0.0.0:8000 --workers 4 --timeout 120 frappe.app:application
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now erpnext
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
40
install/jitsi-install.sh
Normal file
40
install/jitsi-install.sh
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: community-scripts
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||||
|
# Source: https://jitsi.org/
|
||||||
|
|
||||||
|
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 nginx
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
source /etc/os-release
|
||||||
|
setup_deb822_repo "prosody" "https://prosody.im/files/prosody-debian-packages.key" "http://packages.prosody.im/debian" "${VERSION_CODENAME}" "main"
|
||||||
|
setup_deb822_repo "jitsi" "https://download.jitsi.org/jitsi-key.gpg.key" "https://download.jitsi.org/stable" "./"
|
||||||
|
|
||||||
|
msg_info "Installing Jitsi Meet"
|
||||||
|
echo "jitsi-videobridge2 jitsi-videobridge/jvb-hostname string ${LOCAL_IP}" | debconf-set-selections
|
||||||
|
echo "jitsi-meet-web-config jitsi-meet/cert-choice select Generate a new self-signed certificate" | debconf-set-selections
|
||||||
|
DEBIAN_FRONTEND=noninteractive $STD apt install -y jitsi-meet
|
||||||
|
msg_ok "Installed Jitsi Meet"
|
||||||
|
|
||||||
|
msg_info "Configuring Network"
|
||||||
|
cat <<EOF >/etc/sysctl.d/99-jitsi.conf
|
||||||
|
net.core.rmem_max=10485760
|
||||||
|
net.core.netdev_max_backlog=100000
|
||||||
|
EOF
|
||||||
|
$STD sysctl -p /etc/sysctl.d/99-jitsi.conf
|
||||||
|
msg_ok "Configured Network"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
54
install/storybook-install.sh
Normal file
54
install/storybook-install.sh
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: community-scripts
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/storybookjs/storybook
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
NODE_VERSION="22" NODE_MODULE="pnpm" setup_nodejs
|
||||||
|
|
||||||
|
msg_info "Preparing Storybook"
|
||||||
|
mkdir -p /opt/storybook
|
||||||
|
cd /opt/storybook
|
||||||
|
msg_ok "Important: Interactive configuration will start now."
|
||||||
|
|
||||||
|
npx storybook@latest init --yes
|
||||||
|
PROJECT_PATH=$(find /opt/storybook -maxdepth 2 -name ".storybook" -type d 2>/dev/null | head -n1 | xargs dirname)
|
||||||
|
|
||||||
|
if [[ -z "$PROJECT_PATH" ]]; then
|
||||||
|
PROJECT_PATH="/opt/storybook"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$PROJECT_PATH" >/opt/storybook/.projectpath
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/storybook.service
|
||||||
|
[Unit]
|
||||||
|
Description=Storybook Dev Server
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=${PROJECT_PATH}
|
||||||
|
ExecStart=/usr/bin/npx storybook dev --host 0.0.0.0 --port 6006 --no-open
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now storybook
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
85
install/storyteller-install.sh
Normal file
85
install/storyteller-install.sh
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: community-scripts
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||||
|
# Source: https://gitlab.com/storyteller-platform/storyteller
|
||||||
|
|
||||||
|
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 \
|
||||||
|
git \
|
||||||
|
libsqlite3-dev \
|
||||||
|
python3
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
NODE_VERSION="22" NODE_MODULE="yarn" setup_nodejs
|
||||||
|
setup_ffmpeg
|
||||||
|
|
||||||
|
msg_info "Installing Readium"
|
||||||
|
READIUM_VERSION="0.6.5"
|
||||||
|
mkdir -p /opt/readium
|
||||||
|
$STD curl -fsSL "https://github.com/readium/go-toolkit/releases/download/${READIUM_VERSION}/readium-x86_64-linux" -o /opt/readium/readium
|
||||||
|
chmod +x /opt/readium/readium
|
||||||
|
ln -sf /opt/readium /usr/local/bin/readium
|
||||||
|
msg_ok "Installed Readium"
|
||||||
|
|
||||||
|
fetch_and_deploy_gl_release "storyteller" "storyteller-platform/storyteller" "tarball" "latest" "/opt/storyteller"
|
||||||
|
|
||||||
|
msg_info "Setting up Storyteller"
|
||||||
|
cd /opt/storyteller
|
||||||
|
$STD yarn install
|
||||||
|
$STD gcc -g -fPIC -rdynamic -shared web/sqlite/uuid.c -o web/sqlite/uuid.c.so
|
||||||
|
STORYTELLER_SECRET_KEY=$(openssl rand -base64 32)
|
||||||
|
cat <<EOF >/opt/storyteller/.env
|
||||||
|
STORYTELLER_SECRET_KEY=${STORYTELLER_SECRET_KEY}
|
||||||
|
STORYTELLER_DATA_DIR=/opt/storyteller/data
|
||||||
|
PORT=8001
|
||||||
|
HOSTNAME=0.0.0.0
|
||||||
|
READIUM_PORT=9000
|
||||||
|
NODE_ENV=production
|
||||||
|
NEXT_TELEMETRY_DISABLED=1
|
||||||
|
EOF
|
||||||
|
mkdir -p /opt/storyteller/data
|
||||||
|
msg_ok "Set up Storyteller"
|
||||||
|
|
||||||
|
msg_info "Building Storyteller"
|
||||||
|
cd /opt/storyteller
|
||||||
|
export NODE_ENV=production
|
||||||
|
export NEXT_TELEMETRY_DISABLED=1
|
||||||
|
export SQLITE_NATIVE_BINDING=/opt/storyteller/node_modules/better-sqlite3/build/Release/better_sqlite3.node
|
||||||
|
$STD yarn workspaces foreach -Rpt --from @storyteller-platform/web --exclude @storyteller-platform/eslint run build
|
||||||
|
msg_ok "Built Storyteller"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/storyteller.service
|
||||||
|
[Unit]
|
||||||
|
Description=Storyteller
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=/opt/storyteller/.next/standalone/web
|
||||||
|
EnvironmentFile=/opt/storyteller/.env
|
||||||
|
ExecStart=/usr/bin/node --enable-source-maps server.js
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now storyteller
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
148
install/tubearchivist-install.sh
Normal file
148
install/tubearchivist-install.sh
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: community-scripts
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/tubearchivist/tubearchivist
|
||||||
|
|
||||||
|
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 \
|
||||||
|
git \
|
||||||
|
nginx \
|
||||||
|
redis-server \
|
||||||
|
atomicparsley \
|
||||||
|
libldap2-dev \
|
||||||
|
libsasl2-dev \
|
||||||
|
libssl-dev
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
UV_PYTHON="3.13" setup_uv
|
||||||
|
NODE_VERSION="22" setup_nodejs
|
||||||
|
setup_ffmpeg
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "deno" "denoland/deno" "prebuild" "latest" "/usr/local/bin" "deno-x86_64-unknown-linux-gnu.zip"
|
||||||
|
|
||||||
|
msg_info "Installing ElasticSearch"
|
||||||
|
setup_deb822_repo "elastic-8.x" "https://artifacts.elastic.co/GPG-KEY-elasticsearch" "https://artifacts.elastic.co/packages/8.x/apt" "stable" "main"
|
||||||
|
$STD apt install -y elasticsearch
|
||||||
|
msg_ok "Installed ElasticSearch"
|
||||||
|
|
||||||
|
msg_info "Configuring ElasticSearch"
|
||||||
|
cat <<EOF >/etc/elasticsearch/elasticsearch.yml
|
||||||
|
cluster.name: tubearchivist
|
||||||
|
path.data: /var/lib/elasticsearch
|
||||||
|
path.logs: /var/log/elasticsearch
|
||||||
|
path.repo: ["/var/lib/elasticsearch/snapshot"]
|
||||||
|
network.host: 127.0.0.1
|
||||||
|
xpack.security.enabled: false
|
||||||
|
EOF
|
||||||
|
mkdir -p /var/lib/elasticsearch/snapshot
|
||||||
|
chown -R elasticsearch:elasticsearch /var/lib/elasticsearch/snapshot
|
||||||
|
cat <<EOF >/etc/elasticsearch/jvm.options.d/heap.options
|
||||||
|
-Xms1g
|
||||||
|
-Xmx1g
|
||||||
|
EOF
|
||||||
|
sysctl -w vm.max_map_count=262144 2>/dev/null || true
|
||||||
|
cat <<EOF >/etc/sysctl.d/99-elasticsearch.conf
|
||||||
|
vm.max_map_count=262144
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now elasticsearch
|
||||||
|
msg_ok "Configured ElasticSearch"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "tubearchivist" "tubearchivist/tubearchivist" "tarball" "latest" "/opt/tubearchivist"
|
||||||
|
|
||||||
|
msg_info "Building Frontend"
|
||||||
|
cd /opt/tubearchivist/frontend
|
||||||
|
$STD npm install
|
||||||
|
$STD npm run build:deploy
|
||||||
|
mkdir -p /opt/tubearchivist/backend/static
|
||||||
|
cp -r /opt/tubearchivist/frontend/dist/* /opt/tubearchivist/backend/static/
|
||||||
|
msg_ok "Built Frontend"
|
||||||
|
|
||||||
|
msg_info "Setting up Tube Archivist"
|
||||||
|
cp /opt/tubearchivist/docker_assets/backend_start.py /opt/tubearchivist/backend/
|
||||||
|
$STD uv venv /opt/tubearchivist/.venv
|
||||||
|
$STD uv pip install --python /opt/tubearchivist/.venv/bin/python -r /opt/tubearchivist/backend/requirements.txt
|
||||||
|
if [[ -f /opt/tubearchivist/backend/requirements.plugins.txt ]]; then
|
||||||
|
mkdir -p /opt/yt_plugins/bgutil
|
||||||
|
$STD uv pip install --python /opt/tubearchivist/.venv/bin/python --target /opt/yt_plugins/bgutil -r /opt/tubearchivist/backend/requirements.plugins.txt
|
||||||
|
fi
|
||||||
|
TA_PASSWORD=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
||||||
|
ES_PASSWORD=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
||||||
|
cat <<EOF >/opt/tubearchivist/.env
|
||||||
|
TA_HOST=http://${LOCAL_IP}:8000
|
||||||
|
TA_USERNAME=admin
|
||||||
|
TA_PASSWORD=${TA_PASSWORD}
|
||||||
|
TA_PORT=8000
|
||||||
|
TA_BACKEND_PORT=8100
|
||||||
|
ELASTIC_PASSWORD=${ES_PASSWORD}
|
||||||
|
REDIS_CON=redis://localhost:6379
|
||||||
|
ES_URL=http://localhost:9200
|
||||||
|
TZ=UTC
|
||||||
|
PYTHONUNBUFFERED=1
|
||||||
|
YTDLP_PLUGIN_DIRS=/opt/yt_plugins
|
||||||
|
EOF
|
||||||
|
$STD systemctl enable --now redis-server
|
||||||
|
msg_ok "Set up Tube Archivist"
|
||||||
|
|
||||||
|
msg_info "Configuring Nginx"
|
||||||
|
cat <<'EOF' >/etc/nginx/sites-available/tubearchivist
|
||||||
|
server {
|
||||||
|
listen 8000;
|
||||||
|
server_name _;
|
||||||
|
|
||||||
|
client_max_body_size 5G;
|
||||||
|
|
||||||
|
location /static/ {
|
||||||
|
alias /opt/tubearchivist/backend/static/;
|
||||||
|
expires 1y;
|
||||||
|
}
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://127.0.0.1:8100;
|
||||||
|
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_read_timeout 1800;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
ln -sf /etc/nginx/sites-available/tubearchivist /etc/nginx/sites-enabled/tubearchivist
|
||||||
|
rm -f /etc/nginx/sites-enabled/default
|
||||||
|
$STD systemctl restart nginx
|
||||||
|
msg_ok "Configured Nginx"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/tubearchivist.service
|
||||||
|
[Unit]
|
||||||
|
Description=Tube Archivist
|
||||||
|
After=network.target elasticsearch.service redis-server.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=/opt/tubearchivist/backend
|
||||||
|
EnvironmentFile=/opt/tubearchivist/.env
|
||||||
|
Environment=PATH=/opt/tubearchivist/.venv/bin:/usr/local/bin:/usr/bin:/bin
|
||||||
|
ExecStart=/opt/tubearchivist/.venv/bin/python backend_start.py
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now tubearchivist
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
48
json/birdnet-go.json
Normal file
48
json/birdnet-go.json
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
"name": "BirdNET-Go",
|
||||||
|
"slug": "birdnet-go",
|
||||||
|
"categories": [
|
||||||
|
9
|
||||||
|
],
|
||||||
|
"date_created": "2026-03-25",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": 8080,
|
||||||
|
"documentation": "https://github.com/tphakala/birdnet-go/wiki",
|
||||||
|
"website": "https://github.com/tphakala/birdnet-go",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/birdnet-go.webp",
|
||||||
|
"config_path": "/opt/birdnet-go/data",
|
||||||
|
"description": "BirdNET-Go is an AI-powered solution for continuous avian monitoring and identification, providing 24/7 realtime bird song analysis.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/birdnet-go.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 4,
|
||||||
|
"ram": 2048,
|
||||||
|
"hdd": 12,
|
||||||
|
"os": "Debian",
|
||||||
|
"version": "13"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "Audio device passthrough is required for realtime monitoring. Add the audio device to the LXC configuration.",
|
||||||
|
"type": "warning"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Data and recordings are stored in `/opt/birdnet-go/data`.",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "GPU acceleration is not available in the LXC version. CPU-based transcription is used.",
|
||||||
|
"type": "info"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
48
json/erpnext.json
Normal file
48
json/erpnext.json
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
"name": "ERPNext",
|
||||||
|
"slug": "erpnext",
|
||||||
|
"categories": [
|
||||||
|
25
|
||||||
|
],
|
||||||
|
"date_created": "2026-03-25",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": 8000,
|
||||||
|
"documentation": "https://docs.erpnext.com/",
|
||||||
|
"website": "https://erpnext.com/",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/erpnext.webp",
|
||||||
|
"config_path": "/opt/frappe-bench/.env",
|
||||||
|
"description": "ERPNext is a powerful, intuitive and open-source ERP system for managing accounting, inventory, manufacturing, CRM, projects, HR and more.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/erpnext.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 4,
|
||||||
|
"ram": 4096,
|
||||||
|
"hdd": 20,
|
||||||
|
"os": "Debian",
|
||||||
|
"version": "13"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": "Administrator",
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "Admin password is stored in `/opt/frappe-bench/.env`.",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "The default site name is `site1.local`. Configure your domain in Frappe settings.",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Run `bench update` from `/opt/frappe-bench` to update ERPNext manually.",
|
||||||
|
"type": "info"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
48
json/jitsi.json
Normal file
48
json/jitsi.json
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
"name": "Jitsi Meet",
|
||||||
|
"slug": "jitsi",
|
||||||
|
"categories": [
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"date_created": "2026-03-25",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": 443,
|
||||||
|
"documentation": "https://jitsi.github.io/handbook/",
|
||||||
|
"website": "https://jitsi.org/",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/jitsi.webp",
|
||||||
|
"config_path": "/etc/jitsi",
|
||||||
|
"description": "Jitsi Meet is a set of open-source projects for secure, simple and scalable video conferences with state-of-the-art video quality and features.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/jitsi.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 4,
|
||||||
|
"ram": 4096,
|
||||||
|
"hdd": 12,
|
||||||
|
"os": "Debian",
|
||||||
|
"version": "13"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "Uses a self-signed certificate by default. Your browser will show a security warning.",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Port 10000/UDP must be forwarded to the container for video/audio to work properly.",
|
||||||
|
"type": "warning"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Configuration files are located in `/etc/jitsi/`.",
|
||||||
|
"type": "info"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
44
json/storybook.json
Normal file
44
json/storybook.json
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
{
|
||||||
|
"name": "Storybook",
|
||||||
|
"slug": "storybook",
|
||||||
|
"categories": [
|
||||||
|
20
|
||||||
|
],
|
||||||
|
"date_created": "2026-03-25",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": 6006,
|
||||||
|
"documentation": "https://storybook.js.org/docs",
|
||||||
|
"website": "https://storybook.js.org/",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/storybook.webp",
|
||||||
|
"config_path": "",
|
||||||
|
"description": "Storybook is a frontend workshop for building UI components and pages in isolation. It's used for UI development, testing, and documentation.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/storybook.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 2,
|
||||||
|
"ram": 2048,
|
||||||
|
"hdd": 8,
|
||||||
|
"os": "Debian",
|
||||||
|
"version": "13"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "The installer uses an interactive setup wizard (like fumadocs). Follow the prompts during installation.",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Storybook runs in development mode on port 6006.",
|
||||||
|
"type": "info"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
48
json/storyteller.json
Normal file
48
json/storyteller.json
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
"name": "Storyteller",
|
||||||
|
"slug": "storyteller",
|
||||||
|
"categories": [
|
||||||
|
13
|
||||||
|
],
|
||||||
|
"date_created": "2026-03-25",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": 8001,
|
||||||
|
"documentation": "https://storyteller-platform.dev/docs/welcome",
|
||||||
|
"website": "https://storyteller-platform.dev/",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/storyteller.webp",
|
||||||
|
"config_path": "/opt/storyteller/.env",
|
||||||
|
"description": "Storyteller is a self-hosted platform for creating and reading ebooks with synced narration, combining audiobooks and ebooks with automatic synchronization.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/storyteller.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 4,
|
||||||
|
"ram": 8192,
|
||||||
|
"hdd": 16,
|
||||||
|
"os": "Debian",
|
||||||
|
"version": "13"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "Minimum 8GB RAM recommended. AI-based transcription is resource-intensive.",
|
||||||
|
"type": "warning"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Secret key is stored in `/opt/storyteller/.env`.",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "GPU acceleration is not available in the LXC version. Use CPU-based transcription.",
|
||||||
|
"type": "info"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
52
json/tubearchivist.json
Normal file
52
json/tubearchivist.json
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
{
|
||||||
|
"name": "Tube Archivist",
|
||||||
|
"slug": "tubearchivist",
|
||||||
|
"categories": [
|
||||||
|
13
|
||||||
|
],
|
||||||
|
"date_created": "2026-03-25",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": 8000,
|
||||||
|
"documentation": "https://docs.tubearchivist.com/",
|
||||||
|
"website": "https://github.com/tubearchivist/tubearchivist",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/tube-archivist.webp",
|
||||||
|
"config_path": "/opt/tubearchivist/.env",
|
||||||
|
"description": "Tube Archivist is a self-hosted YouTube media collection manager that indexes your video collection with metadata for organizing, searching, and playing archived YouTube videos offline.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/tubearchivist.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 4,
|
||||||
|
"ram": 6144,
|
||||||
|
"hdd": 30,
|
||||||
|
"os": "Debian",
|
||||||
|
"version": "13"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": "admin",
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "Requires `vm.max_map_count=262144` on the Proxmox host. Run `sysctl -w vm.max_map_count=262144` on the host and add it to `/etc/sysctl.conf` for persistence.",
|
||||||
|
"type": "warning"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "ElasticSearch is configured with 1GB heap. Adjust `/etc/elasticsearch/jvm.options.d/heap.options` for larger collections.",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Admin password is stored in `/opt/tubearchivist/.env`.",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Minimum 6GB RAM recommended. ElasticSearch alone requires 2GB+.",
|
||||||
|
"type": "warning"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user