mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-04-18 16:32:17 +00:00
docs(contribution): update templates with modern patterns (#10227)
Based on analysis of latest 30 scripts (koel, wallabag, invoiceninja, etc.) Templates updated to reflect current best practices: ct/AppName.sh: - Use check_for_gh_release + fetch_and_deploy_gh_release pattern - CLEAN_INSTALL=1 for updates - Proper backup/restore workflow - Simplified configuration comments install/AppName-install.sh: - fetch_and_deploy_gh_release as primary download method (no separate RELEASE variable) - Real-world examples from Node.js, Python, PHP apps - import_local_ip called early - Setup runtimes/databases before app installation - cleanup_lxc at the end HELPER_FUNCTIONS.md: - fetch_and_deploy_gh_release as preferred method (documented first) - CLEAN_INSTALL=1 environment variable documented - prebuild type with asset_pattern documented - Clarified when to use get_latest_github_release vs fetch_and_deploy Closes #10194
This commit is contained in:
committed by
GitHub
parent
08cbeea4a9
commit
33ef33c833
@@ -1,11 +1,11 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: [YourUserName]
|
||||
# Author: [YourGitHubUsername]
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: [SOURCE_URL]
|
||||
# Source: [SOURCE_URL e.g. https://github.com/example/app]
|
||||
|
||||
# Import Functions und Setup
|
||||
# Import Functions and Setup
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
@@ -14,70 +14,177 @@ setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
# Installing Dependencies with the 3 core dependencies (curl;sudo;mc)
|
||||
# =============================================================================
|
||||
# DEPENDENCIES
|
||||
# =============================================================================
|
||||
# Only install what's actually needed - curl/sudo/mc are already in the base image
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt-get install -y \
|
||||
curl \
|
||||
sudo \
|
||||
mc \
|
||||
[PACKAGE_1] \
|
||||
[PACKAGE_2] \
|
||||
[PACKAGE_3]
|
||||
$STD apt install -y \
|
||||
nginx \
|
||||
build-essential
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
# Template: MySQL Database
|
||||
msg_info "Setting up Database"
|
||||
DB_NAME=[DB_NAME]
|
||||
DB_USER=[DB_USER]
|
||||
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
||||
$STD mysql -u root -e "CREATE DATABASE $DB_NAME;"
|
||||
$STD mysql -u root -e "CREATE USER '$DB_USER'@'localhost' IDENTIFIED WITH mysql_native_password AS PASSWORD('$DB_PASS');"
|
||||
$STD mysql -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH PRIVILEGES;"
|
||||
{
|
||||
echo "${APPLICATION} Credentials"
|
||||
echo "Database User: $DB_USER"
|
||||
echo "Database Password: $DB_PASS"
|
||||
echo "Database Name: $DB_NAME"
|
||||
} >>~/$APP_NAME.creds
|
||||
msg_ok "Set up Database"
|
||||
|
||||
# Temp
|
||||
|
||||
# Setup App
|
||||
msg_info "Setup ${APPLICATION}"
|
||||
RELEASE=$(curl -s https://api.github.com/repos/[REPO]/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
|
||||
curl -fsSL "https://github.com/[REPO]/archive/refs/tags/${RELEASE}.zip"
|
||||
unzip -q ${RELEASE}.zip
|
||||
mv ${APPLICATION}-${RELEASE}/ /opt/${APPLICATION}
|
||||
# =============================================================================
|
||||
# HELPER FUNCTIONS FROM tools.func
|
||||
# =============================================================================
|
||||
# These functions are available via $FUNCTIONS_FILE_PATH (tools.func)
|
||||
# Call them with optional environment variables for configuration
|
||||
#
|
||||
# --- Runtime & Language Setup ---
|
||||
# NODE_VERSION="22" setup_nodejs # Install Node.js (22, 24)
|
||||
# NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs # With pnpm
|
||||
# PYTHON_VERSION="3.13" setup_uv # Python with uv package manager
|
||||
# setup_go # Install Go (latest)
|
||||
# setup_rust # Install Rust via rustup
|
||||
# setup_ruby # Install Ruby
|
||||
# PHP_VERSION="8.4" PHP_FPM="YES" PHP_MODULE="mysqli,gd" setup_php
|
||||
# PHP_VERSION="8.3" PHP_FPM="YES" PHP_APACHE="YES" PHP_MODULE="bcmath,curl,gd,intl,mbstring,mysql,xml,zip" setup_php
|
||||
# setup_composer # Install PHP Composer
|
||||
# JAVA_VERSION="21" setup_java # Install Java (17, 21)
|
||||
#
|
||||
# --- Database Setup ---
|
||||
# setup_mariadb # Install MariaDB server
|
||||
# MARIADB_DB_NAME="mydb" MARIADB_DB_USER="myuser" setup_mariadb_db
|
||||
# setup_mysql # Install MySQL server
|
||||
# PG_VERSION="17" setup_postgresql # Install PostgreSQL (16, 17)
|
||||
# PG_VERSION="17" PG_MODULES="postgis" setup_postgresql # With extensions
|
||||
# PG_DB_NAME="mydb" PG_DB_USER="myuser" setup_postgresql_db
|
||||
# setup_mongodb # Install MongoDB
|
||||
#
|
||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
|
||||
msg_ok "Setup ${APPLICATION}"
|
||||
# --- GitHub Release (PREFERRED METHOD) ---
|
||||
# fetch_and_deploy_gh_release "appname" "owner/repo" # Downloads, extracts, tracks version
|
||||
# fetch_and_deploy_gh_release "appname" "owner/repo" "tarball" "latest" "/opt/appname"
|
||||
# fetch_and_deploy_gh_release "appname" "owner/repo" "prebuild" "latest" "/opt/appname" "app-*.tar.gz"
|
||||
#
|
||||
# --- Tools & Utilities ---
|
||||
# import_local_ip # Sets $LOCAL_IP variable (call early!)
|
||||
# setup_ffmpeg # Install FFmpeg with codecs
|
||||
# setup_hwaccel # Setup GPU hardware acceleration
|
||||
# setup_imagemagick # Install ImageMagick 7
|
||||
# setup_docker # Install Docker Engine
|
||||
# setup_adminer # Install Adminer for DB management
|
||||
# create_self_signed_cert # Creates cert in /etc/ssl/[appname]/
|
||||
|
||||
# =============================================================================
|
||||
# EXAMPLE 1: Node.js Application with PostgreSQL
|
||||
# =============================================================================
|
||||
# NODE_VERSION="22" setup_nodejs
|
||||
# PG_VERSION="17" setup_postgresql
|
||||
# PG_DB_NAME="myapp" PG_DB_USER="myapp" setup_postgresql_db
|
||||
# import_local_ip
|
||||
# fetch_and_deploy_gh_release "myapp" "owner/myapp" "tarball" "latest" "/opt/myapp"
|
||||
#
|
||||
# msg_info "Configuring MyApp"
|
||||
# cd /opt/myapp
|
||||
# $STD npm ci
|
||||
# cat <<EOF >/opt/myapp/.env
|
||||
# DATABASE_URL=postgresql://${PG_DB_USER}:${PG_DB_PASS}@localhost/${PG_DB_NAME}
|
||||
# HOST=${LOCAL_IP}
|
||||
# PORT=3000
|
||||
# EOF
|
||||
# msg_ok "Configured MyApp"
|
||||
|
||||
# =============================================================================
|
||||
# EXAMPLE 2: Python Application with uv
|
||||
# =============================================================================
|
||||
# PYTHON_VERSION="3.13" setup_uv
|
||||
# import_local_ip
|
||||
# fetch_and_deploy_gh_release "myapp" "owner/myapp" "tarball" "latest" "/opt/myapp"
|
||||
#
|
||||
# msg_info "Setting up MyApp"
|
||||
# cd /opt/myapp
|
||||
# $STD uv sync
|
||||
# cat <<EOF >/opt/myapp/.env
|
||||
# HOST=${LOCAL_IP}
|
||||
# PORT=8000
|
||||
# EOF
|
||||
# msg_ok "Setup MyApp"
|
||||
|
||||
# =============================================================================
|
||||
# EXAMPLE 3: PHP Application with MariaDB + Nginx
|
||||
# =============================================================================
|
||||
# PHP_VERSION="8.4" PHP_FPM="YES" PHP_MODULE="bcmath,curl,gd,intl,mbstring,mysql,xml,zip" setup_php
|
||||
# setup_composer
|
||||
# setup_mariadb
|
||||
# MARIADB_DB_NAME="myapp" MARIADB_DB_USER="myapp" setup_mariadb_db
|
||||
# import_local_ip
|
||||
# fetch_and_deploy_gh_release "myapp" "owner/myapp" "prebuild" "latest" "/opt/myapp" "myapp-*.tar.gz"
|
||||
#
|
||||
# msg_info "Configuring MyApp"
|
||||
# cd /opt/myapp
|
||||
# cp .env.example .env
|
||||
# sed -i "s|APP_URL=.*|APP_URL=http://${LOCAL_IP}|" .env
|
||||
# sed -i "s|DB_DATABASE=.*|DB_DATABASE=${MARIADB_DB_NAME}|" .env
|
||||
# sed -i "s|DB_USERNAME=.*|DB_USERNAME=${MARIADB_DB_USER}|" .env
|
||||
# sed -i "s|DB_PASSWORD=.*|DB_PASSWORD=${MARIADB_DB_PASS}|" .env
|
||||
# $STD composer install --no-dev --no-interaction
|
||||
# chown -R www-data:www-data /opt/myapp
|
||||
# msg_ok "Configured MyApp"
|
||||
|
||||
# =============================================================================
|
||||
# YOUR APPLICATION INSTALLATION
|
||||
# =============================================================================
|
||||
# 1. Setup runtimes and databases FIRST
|
||||
# 2. Call import_local_ip if you need the container IP
|
||||
# 3. Use fetch_and_deploy_gh_release to download the app (handles version tracking)
|
||||
# 4. Configure the application
|
||||
# 5. Create systemd service
|
||||
# 6. Finalize with motd_ssh, customize, cleanup_lxc
|
||||
|
||||
# --- Setup runtimes/databases ---
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
import_local_ip
|
||||
|
||||
# --- Download and install app ---
|
||||
fetch_and_deploy_gh_release "[appname]" "[owner/repo]" "tarball" "latest" "/opt/[appname]"
|
||||
|
||||
msg_info "Setting up [AppName]"
|
||||
cd /opt/[appname]
|
||||
$STD npm ci
|
||||
msg_ok "Setup [AppName]"
|
||||
|
||||
# =============================================================================
|
||||
# CONFIGURATION
|
||||
# =============================================================================
|
||||
|
||||
msg_info "Configuring [AppName]"
|
||||
cat <<EOF >/opt/[appname]/.env
|
||||
HOST=${LOCAL_IP}
|
||||
PORT=8080
|
||||
EOF
|
||||
msg_ok "Configured [AppName]"
|
||||
|
||||
# =============================================================================
|
||||
# SERVICE CREATION
|
||||
# =============================================================================
|
||||
|
||||
# Creating Service (if needed)
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/${APPLICATION}.service
|
||||
cat <<EOF >/etc/systemd/system/[appname].service
|
||||
[Unit]
|
||||
Description=${APPLICATION} Service
|
||||
Description=[AppName] Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
ExecStart=[START_COMMAND]
|
||||
Restart=always
|
||||
Type=simple
|
||||
User=root
|
||||
WorkingDirectory=/opt/[appname]
|
||||
ExecStart=/usr/bin/node /opt/[appname]/server.js
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now ${APPLICATION}.service
|
||||
systemctl enable -q --now [appname]
|
||||
msg_ok "Created Service"
|
||||
|
||||
# =============================================================================
|
||||
# CLEANUP & FINALIZATION
|
||||
# =============================================================================
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
|
||||
# Cleanup
|
||||
msg_info "Cleaning up"
|
||||
rm -f ${RELEASE}.zip
|
||||
$STD apt-get -y autoremove
|
||||
$STD apt-get -y autoclean
|
||||
msg_ok "Cleaned"
|
||||
# cleanup_lxc handles: apt autoremove, autoclean, temp files, bash history
|
||||
cleanup_lxc
|
||||
|
||||
Reference in New Issue
Block a user