mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-09-22 12:17:18 +02:00
Pangolin: Bump to 1.20.0 | BREAKING: Switch to PostgreSQL (#15682)
* Pangolin: Bump to 1.20.0 and harden SQLite migrations Bump the default Pangolin version to 1.20.0 in both CT and install scripts. Update the CT upgrade path to validate required 1.20.0 schema objects, clear stale versionMigrations markers when needed, retry migrations once, and abort with a clear error if the schema is still incomplete to avoid a broken runtime. * extend migration check... * another try... * bump pangolin to PSQL * remove migration paths * remove old migrations * use create_backup and restore_backup * Block Pangolin SQLite upgrades Update the Pangolin CT upgrade path to fail fast when PostgreSQL is not installed. The script now explains that upgrades to Pangolin 1.20.0+ require PostgreSQL and that SQLite data cannot be migrated automatically. * fix env * Update pangolin.sh * Update pangolin-install.sh
This commit is contained in:
committed by
GitHub
parent
80c4b04d83
commit
07e31eb5bc
+18
-21
@@ -6,7 +6,7 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
|
|||||||
# Source: https://pangolin.net/ | Github: https://github.com/fosrl/pangolin
|
# Source: https://pangolin.net/ | Github: https://github.com/fosrl/pangolin
|
||||||
|
|
||||||
APP="Pangolin"
|
APP="Pangolin"
|
||||||
PANGOLIN_VERSION="${PANGOLIN_VERSION:-1.18.4}"
|
PANGOLIN_VERSION="${PANGOLIN_VERSION:-1.20.0}"
|
||||||
var_tags="${var_tags:-proxy}"
|
var_tags="${var_tags:-proxy}"
|
||||||
var_cpu="${var_cpu:-2}"
|
var_cpu="${var_cpu:-2}"
|
||||||
var_ram="${var_ram:-4096}"
|
var_ram="${var_ram:-4096}"
|
||||||
@@ -33,6 +33,15 @@ function update_script() {
|
|||||||
|
|
||||||
ensure_dependencies build-essential python3
|
ensure_dependencies build-essential python3
|
||||||
|
|
||||||
|
if ! command -v psql &>/dev/null; then
|
||||||
|
msg_error "This installation uses SQLite and cannot be upgraded to Pangolin ${PANGOLIN_VERSION}."
|
||||||
|
echo -e "${INFO}${YW}Starting with Pangolin 1.20.0, PostgreSQL is required as the database backend.${CL}"
|
||||||
|
echo -e "${INFO}${YW}An automatic migration of your existing SQLite data is not supported.${CL}"
|
||||||
|
echo -e "${INFO}${YW}Please create a new LXC with the Pangolin install script, which sets up PostgreSQL automatically.${CL}"
|
||||||
|
echo -e "${INFO}${YW}Your current data is preserved in this container and can be manually migrated if needed.${CL}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
NODE_VERSION="24" setup_nodejs
|
NODE_VERSION="24" setup_nodejs
|
||||||
|
|
||||||
if check_for_gh_release "pangolin" "fosrl/pangolin" "$PANGOLIN_VERSION" "Pinned to a tested release because Pangolin's schema changes have repeatedly broken unattended updates. To try a newer version at your own risk, run: 'export PANGOLIN_VERSION=<tag>' and re-run update. If it breaks, please open an issue at https://github.com/community-scripts/ProxmoxVE/issues with the error log."; then
|
if check_for_gh_release "pangolin" "fosrl/pangolin" "$PANGOLIN_VERSION" "Pinned to a tested release because Pangolin's schema changes have repeatedly broken unattended updates. To try a newer version at your own risk, run: 'export PANGOLIN_VERSION=<tag>' and re-run update. If it breaks, please open an issue at https://github.com/community-scripts/ProxmoxVE/issues with the error log."; then
|
||||||
@@ -41,13 +50,8 @@ function update_script() {
|
|||||||
systemctl stop gerbil
|
systemctl stop gerbil
|
||||||
msg_info "Service stopped"
|
msg_info "Service stopped"
|
||||||
|
|
||||||
msg_info "Creating backup"
|
DB_URL=$(sed -n 's/.*connection_string: "\(.*\)".*/\1/p' /opt/pangolin/config/config.yml)
|
||||||
tar -czf /opt/pangolin_config_backup.tar.gz -C /opt/pangolin config
|
create_backup /opt/pangolin/config
|
||||||
if [[ -f /opt/pangolin/config/db/db.sqlite ]]; then
|
|
||||||
cp -a /opt/pangolin/config/db/db.sqlite \
|
|
||||||
"/opt/pangolin/config/db/db.sqlite.pre-${PANGOLIN_VERSION}-$(date +%Y%m%d-%H%M%S).bak"
|
|
||||||
fi
|
|
||||||
msg_ok "Created backup"
|
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "pangolin" "fosrl/pangolin" "tarball" "$PANGOLIN_VERSION"
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "pangolin" "fosrl/pangolin" "tarball" "$PANGOLIN_VERSION"
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "gerbil" "fosrl/gerbil" "singlefile" "latest" "/usr/bin" "gerbil_linux_$(arch_resolve)"
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "gerbil" "fosrl/gerbil" "singlefile" "latest" "/usr/bin" "gerbil_linux_$(arch_resolve)"
|
||||||
@@ -55,23 +59,21 @@ function update_script() {
|
|||||||
msg_info "Updating Pangolin"
|
msg_info "Updating Pangolin"
|
||||||
cd /opt/pangolin
|
cd /opt/pangolin
|
||||||
$STD npm ci
|
$STD npm ci
|
||||||
$STD npm run set:sqlite
|
$STD npm run set:pg
|
||||||
$STD npm run set:oss
|
$STD npm run set:oss
|
||||||
rm -rf server/private
|
rm -rf server/private
|
||||||
$STD npm run db:generate
|
DATABASE_URL="$DB_URL" $STD npm run db:generate
|
||||||
$STD npm run build
|
$STD npm run build
|
||||||
$STD npm run build:cli
|
$STD npm run build:cli
|
||||||
cp -R .next/standalone ./
|
cp -R .next/standalone ./
|
||||||
|
cp -r server/migrations ./dist/init
|
||||||
chmod +x ./dist/cli.mjs
|
chmod +x ./dist/cli.mjs
|
||||||
cp server/db/names.json ./dist/names.json
|
cp server/db/names.json ./dist/names.json
|
||||||
cp server/db/ios_models.json ./dist/ios_models.json
|
cp server/db/ios_models.json ./dist/ios_models.json
|
||||||
cp server/db/mac_models.json ./dist/mac_models.json
|
cp server/db/mac_models.json ./dist/mac_models.json
|
||||||
msg_ok "Updated Pangolin"
|
msg_ok "Updated Pangolin"
|
||||||
|
|
||||||
msg_info "Restoring config"
|
restore_backup
|
||||||
tar -xzf /opt/pangolin_config_backup.tar.gz -C /opt/pangolin --overwrite
|
|
||||||
rm -f /opt/pangolin_config_backup.tar.gz
|
|
||||||
msg_ok "Restored config"
|
|
||||||
|
|
||||||
if ! grep -q '^ExecStartPre=/usr/bin/node dist/migrations.mjs' /etc/systemd/system/pangolin.service 2>/dev/null; then
|
if ! grep -q '^ExecStartPre=/usr/bin/node dist/migrations.mjs' /etc/systemd/system/pangolin.service 2>/dev/null; then
|
||||||
msg_info "Adding migration step to pangolin.service"
|
msg_info "Adding migration step to pangolin.service"
|
||||||
@@ -82,13 +84,8 @@ function update_script() {
|
|||||||
|
|
||||||
msg_info "Running database migrations"
|
msg_info "Running database migrations"
|
||||||
cd /opt/pangolin
|
cd /opt/pangolin
|
||||||
SQLITE_DB="/opt/pangolin/config/db/db.sqlite"
|
|
||||||
if [[ -f "$SQLITE_DB" ]]; then
|
|
||||||
if ! sqlite3 "$SQLITE_DB" ".tables" 2>/dev/null | tr ' ' '\n' | grep -qx "statusHistory"; then
|
|
||||||
sqlite3 "$SQLITE_DB" "DELETE FROM versionMigrations;" 2>/dev/null || true
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
ENVIRONMENT=prod $STD node dist/migrations.mjs
|
ENVIRONMENT=prod $STD node dist/migrations.mjs
|
||||||
|
|
||||||
msg_ok "Ran database migrations"
|
msg_ok "Ran database migrations"
|
||||||
|
|
||||||
msg_info "Updating Badger plugin version"
|
msg_info "Updating Badger plugin version"
|
||||||
@@ -112,4 +109,4 @@ description
|
|||||||
msg_ok "Completed successfully!\n"
|
msg_ok "Completed successfully!\n"
|
||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
echo -e "${INFO}${YW}Access it using the following URL:${CL}"
|
echo -e "${INFO}${YW}Access it using the following URL:${CL}"
|
||||||
echo -e "${GATEWAY}${BGN}https://<YOUR_PANGOLIN_URL>${CL}"
|
echo -e "${GATEWAY}${BGN}https://<YOUR_PANGOLIN_URL> or http://${IP}:3002${CL}"
|
||||||
|
|||||||
@@ -16,18 +16,19 @@ update_os
|
|||||||
msg_info "Installing Dependencies"
|
msg_info "Installing Dependencies"
|
||||||
$STD apt install -y \
|
$STD apt install -y \
|
||||||
build-essential \
|
build-essential \
|
||||||
python3 \
|
|
||||||
sqlite3 \
|
|
||||||
iptables
|
iptables
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
NODE_VERSION="24" setup_nodejs
|
NODE_VERSION="24" setup_nodejs
|
||||||
PANGOLIN_VERSION="${PANGOLIN_VERSION:-1.18.4}"
|
PG_VERSION="17" setup_postgresql
|
||||||
|
PG_DB_NAME="pangolin" PG_DB_USER="pangolin" setup_postgresql_db
|
||||||
|
PANGOLIN_VERSION="${PANGOLIN_VERSION:-1.20.0}"
|
||||||
fetch_and_deploy_gh_release "pangolin" "fosrl/pangolin" "tarball" "$PANGOLIN_VERSION"
|
fetch_and_deploy_gh_release "pangolin" "fosrl/pangolin" "tarball" "$PANGOLIN_VERSION"
|
||||||
fetch_and_deploy_gh_release "gerbil" "fosrl/gerbil" "singlefile" "latest" "/usr/bin" "gerbil_linux_$(arch_resolve)"
|
fetch_and_deploy_gh_release "gerbil" "fosrl/gerbil" "singlefile" "latest" "/usr/bin" "gerbil_linux_$(arch_resolve)"
|
||||||
fetch_and_deploy_gh_release "traefik" "traefik/traefik" "prebuild" "latest" "/usr/bin" "traefik_v*_linux_$(arch_resolve).tar.gz"
|
fetch_and_deploy_gh_release "traefik" "traefik/traefik" "prebuild" "latest" "/usr/bin" "traefik_v*_linux_$(arch_resolve).tar.gz"
|
||||||
|
|
||||||
read -rp "${TAB3}Enter your Pangolin URL (ex: https://pangolin.example.com): " pango_url
|
read -rp "${TAB3}Enter your Pangolin URL (ex: https://pangolin.example.com): " pango_url
|
||||||
|
[[ "$pango_url" != https://* && "$pango_url" != http://* ]] && pango_url="https://${pango_url}"
|
||||||
read -rp "${TAB3}Enter your email address: " pango_email
|
read -rp "${TAB3}Enter your email address: " pango_email
|
||||||
|
|
||||||
msg_info "Setup Pangolin"
|
msg_info "Setup Pangolin"
|
||||||
@@ -36,13 +37,14 @@ BADGER_VERSION=$(get_latest_github_release "fosrl/badger" "false")
|
|||||||
cd /opt/pangolin
|
cd /opt/pangolin
|
||||||
mkdir -p /opt/pangolin/config/{traefik,db,letsencrypt,logs}
|
mkdir -p /opt/pangolin/config/{traefik,db,letsencrypt,logs}
|
||||||
$STD npm ci
|
$STD npm ci
|
||||||
$STD npm run set:sqlite
|
$STD npm run set:pg
|
||||||
$STD npm run set:oss
|
$STD npm run set:oss
|
||||||
rm -rf server/private
|
rm -rf server/private
|
||||||
$STD npm run db:generate
|
DATABASE_URL="postgresql://pangolin:${PG_DB_PASS}@localhost:5432/pangolin" $STD npm run db:generate
|
||||||
$STD npm run build
|
$STD npm run build
|
||||||
$STD npm run build:cli
|
$STD npm run build:cli
|
||||||
cp -R .next/standalone ./
|
cp -R .next/standalone ./
|
||||||
|
cp -r server/migrations ./dist/init
|
||||||
|
|
||||||
cat <<EOF >/usr/local/bin/pangctl
|
cat <<EOF >/usr/local/bin/pangctl
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
@@ -74,6 +76,9 @@ flags:
|
|||||||
require_email_verification: false
|
require_email_verification: false
|
||||||
disable_signup_without_invite: false
|
disable_signup_without_invite: false
|
||||||
disable_user_create_org: false
|
disable_user_create_org: false
|
||||||
|
|
||||||
|
postgres:
|
||||||
|
connection_string: "postgresql://pangolin:${PG_DB_PASS}@localhost:5432/pangolin"
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
cat <<EOF >/opt/pangolin/config/traefik/traefik_config.yml
|
cat <<EOF >/opt/pangolin/config/traefik/traefik_config.yml
|
||||||
@@ -181,7 +186,8 @@ http:
|
|||||||
servers:
|
servers:
|
||||||
- url: "http://$LOCAL_IP:3000"
|
- url: "http://$LOCAL_IP:3000"
|
||||||
EOF
|
EOF
|
||||||
$STD npm run db:push
|
export ENVIRONMENT=prod
|
||||||
|
$STD node dist/migrations.mjs
|
||||||
|
|
||||||
. /etc/os-release
|
. /etc/os-release
|
||||||
if [ "$VERSION_CODENAME" = "trixie" ]; then
|
if [ "$VERSION_CODENAME" = "trixie" ]; then
|
||||||
@@ -197,7 +203,8 @@ msg_info "Creating Services"
|
|||||||
cat <<EOF >/etc/systemd/system/pangolin.service
|
cat <<EOF >/etc/systemd/system/pangolin.service
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=Pangolin Service
|
Description=Pangolin Service
|
||||||
After=network.target
|
After=network.target postgresql.service
|
||||||
|
Wants=postgresql.service
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
|
|||||||
Reference in New Issue
Block a user