mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-11-05 13:04:37 +01:00
Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 215f9be228 | |||
| 3e7fcf1350 | |||
| 8ba3582919 | |||
| 37e4a33615 |
@@ -571,6 +571,29 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
## 2026-11-05
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- OPNsense VM: wait for the FreeBSD login prompt instead of 180 seconds [@MickLesk](https://github.com/MickLesk) ([#18467](https://github.com/community-scripts/ProxmoxVE/pull/18467))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Tududi: run 2.0 on PostgreSQL, keep SQLite installs on 1.15.0 [@MickLesk](https://github.com/MickLesk) ([#18465](https://github.com/community-scripts/ProxmoxVE/pull/18465))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- fix: keep the existing install until the new archive has extracted [@rcourtman](https://github.com/rcourtman) ([core#201](https://github.com/community-scripts/core/pull/201))
|
||||||
|
- fix: keep the install when a clone or an Alpine extract fails [@rcourtman](https://github.com/rcourtman) ([core#210](https://github.com/community-scripts/core/pull/210))
|
||||||
|
|
||||||
|
### 🧰 Tools
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Arcane: write both env names, stop shipping the unused .env [@MickLesk](https://github.com/MickLesk) ([#18466](https://github.com/community-scripts/ProxmoxVE/pull/18466))
|
||||||
|
|
||||||
## 2026-11-04
|
## 2026-11-04
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
### 🚀 Updated Scripts
|
||||||
|
|||||||
+14
-2
@@ -32,7 +32,14 @@ function update_script() {
|
|||||||
|
|
||||||
NODE_VERSION="22" setup_nodejs
|
NODE_VERSION="22" setup_nodejs
|
||||||
|
|
||||||
if check_for_gh_release "tududi" "chrisvel/tududi"; then
|
RELEASE=""
|
||||||
|
if ! grep -qs '^DATABASE_URL=' /opt/tududi/backend/.env; then
|
||||||
|
RELEASE="v1.15.0"
|
||||||
|
msg_warn "Tududi 2.0 runs on PostgreSQL only, so this SQLite install stays on 1.15.0"
|
||||||
|
msg_warn "To move to 2.0, export in Settings > Backups and import into a new Tududi LXC"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_release "tududi" "chrisvel/tududi" "${RELEASE}" "2.0 needs PostgreSQL"; then
|
||||||
msg_info "Stopping Service"
|
msg_info "Stopping Service"
|
||||||
systemctl stop tududi
|
systemctl stop tududi
|
||||||
msg_ok "Stopped Service"
|
msg_ok "Stopped Service"
|
||||||
@@ -43,9 +50,14 @@ function update_script() {
|
|||||||
else
|
else
|
||||||
cp /opt/tududi/.env /opt/tududi.env
|
cp /opt/tududi/.env /opt/tududi.env
|
||||||
fi
|
fi
|
||||||
|
if ! grep -q '^TUDUDI_UPLOAD_PATH=' /opt/tududi.env; then
|
||||||
|
mkdir -p /opt/tududi-uploads
|
||||||
|
[[ -d /opt/tududi/backend/uploads ]] && cp -a /opt/tududi/backend/uploads/. /opt/tududi-uploads/
|
||||||
|
echo "TUDUDI_UPLOAD_PATH=/opt/tududi-uploads" >>/opt/tududi.env
|
||||||
|
fi
|
||||||
msg_ok "Backed up env file"
|
msg_ok "Backed up env file"
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "tududi" "chrisvel/tududi" "tarball" "latest" "/opt/tududi"
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "tududi" "chrisvel/tududi" "tarball" "${CHECK_UPDATE_RELEASE}" "/opt/tududi"
|
||||||
|
|
||||||
msg_info "Updating Tududi"
|
msg_info "Updating Tududi"
|
||||||
cd /opt/tududi
|
cd /opt/tududi
|
||||||
|
|||||||
@@ -13,13 +13,9 @@ setting_up_container
|
|||||||
network_check
|
network_check
|
||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
|
||||||
$STD apt install -y \
|
|
||||||
sqlite3 \
|
|
||||||
yq
|
|
||||||
msg_ok "Installed Dependencies"
|
|
||||||
|
|
||||||
NODE_VERSION="22" setup_nodejs
|
NODE_VERSION="22" setup_nodejs
|
||||||
|
PG_VERSION="17" setup_postgresql
|
||||||
|
PG_DB_NAME="tududi" PG_DB_USER="tududi" setup_postgresql_db
|
||||||
fetch_and_deploy_gh_release "tududi" "chrisvel/tududi" "tarball" "latest" "/opt/tududi"
|
fetch_and_deploy_gh_release "tududi" "chrisvel/tududi" "tarball" "latest" "/opt/tududi"
|
||||||
|
|
||||||
msg_info "Configuring Tududi"
|
msg_info "Configuring Tududi"
|
||||||
@@ -30,30 +26,22 @@ $STD npm run frontend:build
|
|||||||
mv ./dist ./backend
|
mv ./dist ./backend
|
||||||
msg_ok "Configured Tududi"
|
msg_ok "Configured Tududi"
|
||||||
|
|
||||||
msg_info "Creating env and database"
|
msg_info "Creating env"
|
||||||
DB_LOCATION="/opt/tududi-db"
|
mkdir -p /opt/tududi-uploads
|
||||||
UPLOAD_DIR="/opt/tududi-uploads"
|
|
||||||
mkdir -p {"$DB_LOCATION","$UPLOAD_DIR"}
|
|
||||||
SECRET="$(openssl rand -hex 64)"
|
SECRET="$(openssl rand -hex 64)"
|
||||||
sed -e '/^NODE_ENV=/s/=.*$/=production/' \
|
sed -e '/^NODE_ENV=/s/=.*$/=production/' \
|
||||||
-e 's/^TUDUDI_USER/# TUDUDI_USER/g' \
|
-e 's/^TUDUDI_USER/# TUDUDI_USER/g' \
|
||||||
-e "/_SECRET=/s/=.*$/=${SECRET}/" \
|
-e "s/^TUDUDI_SESSION_SECRET=.*/TUDUDI_SESSION_SECRET=${SECRET}/" \
|
||||||
-e '/^# DB_FILE=/s/^# //' \
|
-e "s|^DATABASE_URL=.*|DATABASE_URL=postgres://tududi:${PG_DB_PASS}@localhost:5432/tududi|" \
|
||||||
-e "s|^DB_FILE=.*|DB_FILE=${DB_LOCATION}/production.sqlite3|" \
|
|
||||||
-e "/^# TUDUDI_ALLOWED/s/^# //; \
|
|
||||||
\|_ORIGINS=|s|=.*$|=<your tududi IP or FDQN>|" \
|
|
||||||
-e "/^# TUDUDI_UPLOAD/s/^# //; \
|
|
||||||
\|UPLOAD_PATH=|s|=.*$|=${UPLOAD_DIR}|" \
|
|
||||||
/opt/tududi/backend/.env.example >/opt/tududi/backend/.env
|
/opt/tududi/backend/.env.example >/opt/tududi/backend/.env
|
||||||
export DB_FILE="${DB_LOCATION}/production.sqlite3"
|
echo "TUDUDI_UPLOAD_PATH=/opt/tududi-uploads" >>/opt/tududi/backend/.env
|
||||||
$STD npm run db:init
|
msg_ok "Created env"
|
||||||
msg_ok "Created env and database"
|
|
||||||
|
|
||||||
msg_info "Creating service"
|
msg_info "Creating service"
|
||||||
cat <<EOF >/etc/systemd/system/tududi.service
|
cat <<EOF >/etc/systemd/system/tududi.service
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=Tududi Service
|
Description=Tududi Service
|
||||||
After=network.target
|
After=network.target postgresql.service
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
|
|||||||
+17
-13
@@ -58,8 +58,21 @@ function uninstall() {
|
|||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# UPDATE
|
# UPDATE
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
|
# Arcane 3 needs the ARCANE_* names, the current latest image reads only the old ones.
|
||||||
|
function sync_env_names() {
|
||||||
|
local key
|
||||||
|
for key in ENCRYPTION_KEY PROJECTS_DIRECTORY; do
|
||||||
|
grep -q "^[[:space:]]*- ARCANE_${key}=" "$COMPOSE_FILE" || sed -i "/^[[:space:]]*- ${key}=/{p;s/- ${key}=/- ARCANE_${key}=/;}" "$COMPOSE_FILE"
|
||||||
|
grep -q "^[[:space:]]*- ${key}=" "$COMPOSE_FILE" || sed -i "/^[[:space:]]*- ARCANE_${key}=/{p;s/- ARCANE_${key}=/- ${key}=/;}" "$COMPOSE_FILE"
|
||||||
|
done
|
||||||
|
if [[ -f "$ENV_FILE" ]]; then
|
||||||
|
sed -i 's/^ARCANE_#/#ARCANE_/' "$ENV_FILE"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
function update() {
|
function update() {
|
||||||
chown -R 65532:65532 /etc/arcane/projects /etc/arcane/builds 2>/dev/null || true
|
chown -R 65532:65532 /etc/arcane/projects /etc/arcane/builds 2>/dev/null || true
|
||||||
|
sync_env_names
|
||||||
|
|
||||||
msg_info "Pulling latest ${APP} image"
|
msg_info "Pulling latest ${APP} image"
|
||||||
cd "$INSTALL_PATH"
|
cd "$INSTALL_PATH"
|
||||||
@@ -85,9 +98,8 @@ function install() {
|
|||||||
msg_ok "Created ${INSTALL_PATH}"
|
msg_ok "Created ${INSTALL_PATH}"
|
||||||
|
|
||||||
# Generate secrets and config values
|
# Generate secrets and config values
|
||||||
local ENCRYPTION_KEY JWT_SECRET PROJ_DIR BUILDS_DIR
|
local ENCRYPTION_KEY PROJ_DIR BUILDS_DIR
|
||||||
ENCRYPTION_KEY=$(random_password 32)
|
ENCRYPTION_KEY=$(random_password 32)
|
||||||
JWT_SECRET=$(random_password 32)
|
|
||||||
PROJ_DIR="/etc/arcane/projects"
|
PROJ_DIR="/etc/arcane/projects"
|
||||||
BUILDS_DIR="/etc/arcane/builds"
|
BUILDS_DIR="/etc/arcane/builds"
|
||||||
|
|
||||||
@@ -108,20 +120,12 @@ function install() {
|
|||||||
curl -fsSL "https://raw.githubusercontent.com/getarcaneapp/arcane/refs/heads/main/docker/examples/compose.basic.yaml" -o "$COMPOSE_FILE"
|
curl -fsSL "https://raw.githubusercontent.com/getarcaneapp/arcane/refs/heads/main/docker/examples/compose.basic.yaml" -o "$COMPOSE_FILE"
|
||||||
msg_ok "Downloaded Docker Compose file"
|
msg_ok "Downloaded Docker Compose file"
|
||||||
|
|
||||||
msg_info "Downloading .env file"
|
msg_info "Configuring compose file"
|
||||||
curl -fsSL "https://raw.githubusercontent.com/getarcaneapp/arcane/refs/heads/main/.env.example" -o "$ENV_FILE"
|
|
||||||
chmod 600 "$ENV_FILE"
|
|
||||||
msg_ok "Downloaded .env file"
|
|
||||||
|
|
||||||
msg_info "Configuring compose and env files"
|
|
||||||
sed -i '/^[[:space:]]*#/!s|/host/path/to/projects|'"$PROJ_DIR"'|g' "$COMPOSE_FILE"
|
sed -i '/^[[:space:]]*#/!s|/host/path/to/projects|'"$PROJ_DIR"'|g' "$COMPOSE_FILE"
|
||||||
sed -i '/^[[:space:]]*#/!s|/host/path/to/builds|'"$BUILDS_DIR"'|g' "$COMPOSE_FILE"
|
sed -i '/^[[:space:]]*#/!s|/host/path/to/builds|'"$BUILDS_DIR"'|g' "$COMPOSE_FILE"
|
||||||
sed -i '/^[[:space:]]*#/!s|ENCRYPTION_KEY=.*|ENCRYPTION_KEY='"$ENCRYPTION_KEY"'|g' "$COMPOSE_FILE"
|
sed -i '/^[[:space:]]*#/!s|ENCRYPTION_KEY=.*|ENCRYPTION_KEY='"$ENCRYPTION_KEY"'|g' "$COMPOSE_FILE"
|
||||||
sed -i '/^[[:space:]]*#/!s|JWT_SECRET=.*|JWT_SECRET='"$JWT_SECRET"'|g' "$COMPOSE_FILE"
|
sync_env_names
|
||||||
sed -i '/^[[:space:]]*#/!s|APP_URL=.*|APP_URL=http://localhost:'"$DEFAULT_PORT"'|g' "$ENV_FILE"
|
msg_ok "Configured compose file"
|
||||||
sed -i '/^[[:space:]]*#/!s|ENCRYPTION_KEY=.*|#&|g' "$ENV_FILE"
|
|
||||||
sed -i '/^[[:space:]]*#/!s|JWT_SECRET=.*|#&|g' "$ENV_FILE"
|
|
||||||
msg_ok "Configured compose and env files"
|
|
||||||
|
|
||||||
msg_info "Starting ${APP}"
|
msg_info "Starting ${APP}"
|
||||||
cd "$INSTALL_PATH"
|
cd "$INSTALL_PATH"
|
||||||
|
|||||||
+20
-1
@@ -442,7 +442,26 @@ msg_ok "Bridge interfaces have been successfully added."
|
|||||||
msg_ok "Created a OPNsense VM ${CL}${BL}(${HN})"
|
msg_ok "Created a OPNsense VM ${CL}${BL}(${HN})"
|
||||||
msg_ok "Starting OPNsense VM (the bootstrap takes 10-30 minutes)"
|
msg_ok "Starting OPNsense VM (the bootstrap takes 10-30 minutes)"
|
||||||
$STD qm start $VMID
|
$STD qm start $VMID
|
||||||
sleep 180
|
# The FreeBSD image prints its login prompt on the serial console too. Boot takes
|
||||||
|
# under a minute with DHCP, each NIC without a DHCP server adds a 60s timeout.
|
||||||
|
SERIAL_LOG="${TEMP_DIR}/serial-${VMID}.log"
|
||||||
|
timeout 900 socat -u "UNIX-CONNECT:/var/run/qemu-server/${VMID}.serial0" - >"$SERIAL_LOG" 2>/dev/null &
|
||||||
|
SERIAL_PID=$!
|
||||||
|
boot_wait=0
|
||||||
|
until grep -aq 'login:' "$SERIAL_LOG" 2>/dev/null || ! kill -0 "$SERIAL_PID" 2>/dev/null; do
|
||||||
|
sleep 5
|
||||||
|
boot_wait=$((boot_wait + 5))
|
||||||
|
done
|
||||||
|
kill "$SERIAL_PID" 2>/dev/null || true
|
||||||
|
if grep -aq 'login:' "$SERIAL_LOG" 2>/dev/null; then
|
||||||
|
msg_ok "FreeBSD booted after ${boot_wait}s"
|
||||||
|
elif [ $boot_wait -lt 180 ]; then
|
||||||
|
msg_warn "Could not read the serial console, waiting 3 minutes instead"
|
||||||
|
sleep $((180 - boot_wait))
|
||||||
|
else
|
||||||
|
msg_warn "No login prompt on the serial console after $((boot_wait / 60)) minutes; continuing"
|
||||||
|
fi
|
||||||
|
sleep 3
|
||||||
send_line_to_vm "root"
|
send_line_to_vm "root"
|
||||||
sleep 2
|
sleep 2
|
||||||
send_line_to_vm ""
|
send_line_to_vm ""
|
||||||
|
|||||||
Reference in New Issue
Block a user