mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-03-20 17:03:05 +01:00
Compare commits
36 Commits
MickLesk-p
...
MickLesk-p
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
87cbfcea70 | ||
|
|
7c79b278eb | ||
|
|
ee01971321 | ||
|
|
aede3fe092 | ||
|
|
c0da26c179 | ||
|
|
be10f822e5 | ||
|
|
8b4f0f60e1 | ||
|
|
bd91c4d07f | ||
|
|
6bb264491c | ||
|
|
852e557b1b | ||
|
|
c5caca97fd | ||
|
|
dff876fb5c | ||
|
|
02e7e5af8d | ||
|
|
0f4bfc0b5a | ||
|
|
152be10741 | ||
|
|
341489ea3f | ||
|
|
ee7829496f | ||
|
|
b67cbc1585 | ||
|
|
bf17edcc89 | ||
|
|
8aa4e5b8cb | ||
|
|
7c770e2ee7 | ||
|
|
6d15a22d94 | ||
|
|
3db4ac1050 | ||
|
|
16dfad5c77 | ||
|
|
5197d759d7 | ||
|
|
c073286d53 | ||
|
|
cbaba2f133 | ||
|
|
48afb6c017 | ||
|
|
37f2e0242d | ||
|
|
7c62147a00 | ||
|
|
7d11f9acd6 | ||
|
|
55a877a3e2 | ||
|
|
27c9d7fd07 | ||
|
|
c907e10334 | ||
|
|
804c462dd3 | ||
|
|
9df9a2831e |
43
CHANGELOG.md
43
CHANGELOG.md
@@ -423,8 +423,51 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
## 2026-03-18
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- Split-Pro ([#12975](https://github.com/community-scripts/ProxmoxVE/pull/12975))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Paperless-NGX: increase default RAM to 3GB [@MickLesk](https://github.com/MickLesk) ([#13018](https://github.com/community-scripts/ProxmoxVE/pull/13018))
|
||||||
|
- Plex: restart service after update to apply new version [@MickLesk](https://github.com/MickLesk) ([#13017](https://github.com/community-scripts/ProxmoxVE/pull/13017))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- tools: centralize GPU group setup via setup_hwaccel [@MickLesk](https://github.com/MickLesk) ([#13044](https://github.com/community-scripts/ProxmoxVE/pull/13044))
|
||||||
|
- Termix: add guacd build and systemd integration [@MickLesk](https://github.com/MickLesk) ([#12999](https://github.com/community-scripts/ProxmoxVE/pull/12999))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Refactor: Jellyfin repo, ffmpeg package and symlinks [@MickLesk](https://github.com/MickLesk) ([#13045](https://github.com/community-scripts/ProxmoxVE/pull/13045))
|
||||||
|
- pve-scripts-local: Increase default disk size from 4GB to 10GB [@MickLesk](https://github.com/MickLesk) ([#13009](https://github.com/community-scripts/ProxmoxVE/pull/13009))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- tools.func: Implement check_for_gh_tag function [@MickLesk](https://github.com/MickLesk) ([#12998](https://github.com/community-scripts/ProxmoxVE/pull/12998))
|
||||||
|
- tools.func: Implement fetch_and_deploy_gh_tag function [@MickLesk](https://github.com/MickLesk) ([#13000](https://github.com/community-scripts/ProxmoxVE/pull/13000))
|
||||||
|
|
||||||
## 2026-03-17
|
## 2026-03-17
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Gluetun: add OpenVPN process user and cleanup stale config [@MickLesk](https://github.com/MickLesk) ([#13016](https://github.com/community-scripts/ProxmoxVE/pull/13016))
|
||||||
|
- Frigate: check OpenVino model files exist before configuring detector and use curl_with_retry instead of default wget [@MickLesk](https://github.com/MickLesk) ([#13019](https://github.com/community-scripts/ProxmoxVE/pull/13019))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- tools.func: Update `create_self_signed_cert()` [@tremor021](https://github.com/tremor021) ([#13008](https://github.com/community-scripts/ProxmoxVE/pull/13008))
|
||||||
|
|
||||||
## 2026-03-16
|
## 2026-03-16
|
||||||
|
|
||||||
### 🆕 New Scripts
|
### 🆕 New Scripts
|
||||||
|
|||||||
6
ct/headers/split-pro
Normal file
6
ct/headers/split-pro
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
_____ ___ __ ____
|
||||||
|
/ ___/____ / (_) /_ / __ \_________
|
||||||
|
\__ \/ __ \/ / / __/_____/ /_/ / ___/ __ \
|
||||||
|
___/ / /_/ / / / /_/_____/ ____/ / / /_/ /
|
||||||
|
/____/ .___/_/_/\__/ /_/ /_/ \____/
|
||||||
|
/_/
|
||||||
@@ -39,14 +39,23 @@ function update_script() {
|
|||||||
msg_ok "Updated Intel Dependencies"
|
msg_ok "Updated Intel Dependencies"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
msg_info "Setting up Jellyfin Repository"
|
||||||
|
setup_deb822_repo \
|
||||||
|
"jellyfin" \
|
||||||
|
"https://repo.jellyfin.org/jellyfin_team.gpg.key" \
|
||||||
|
"https://repo.jellyfin.org/$(get_os_info id)" \
|
||||||
|
"$(get_os_info codename)"
|
||||||
|
msg_ok "Set up Jellyfin Repository"
|
||||||
|
|
||||||
msg_info "Updating Jellyfin"
|
msg_info "Updating Jellyfin"
|
||||||
ensure_dependencies libjemalloc2
|
ensure_dependencies libjemalloc2
|
||||||
if [[ ! -f /usr/lib/libjemalloc.so ]]; then
|
if [[ ! -f /usr/lib/libjemalloc.so ]]; then
|
||||||
ln -sf /usr/lib/x86_64-linux-gnu/libjemalloc.so.2 /usr/lib/libjemalloc.so
|
ln -sf /usr/lib/x86_64-linux-gnu/libjemalloc.so.2 /usr/lib/libjemalloc.so
|
||||||
fi
|
fi
|
||||||
$STD apt update
|
|
||||||
$STD apt -y upgrade
|
$STD apt -y upgrade
|
||||||
$STD apt -y --with-new-pkgs upgrade jellyfin jellyfin-server
|
$STD apt -y --with-new-pkgs upgrade jellyfin jellyfin-server jellyfin-ffmpeg7
|
||||||
|
ln -sf /usr/lib/jellyfin-ffmpeg/ffmpeg /usr/bin/ffmpeg
|
||||||
|
ln -sf /usr/lib/jellyfin-ffmpeg/ffprobe /usr/bin/ffprobe
|
||||||
msg_ok "Updated Jellyfin"
|
msg_ok "Updated Jellyfin"
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
exit
|
exit
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
|
|||||||
APP="Paperless-ngx"
|
APP="Paperless-ngx"
|
||||||
var_tags="${var_tags:-document;management}"
|
var_tags="${var_tags:-document;management}"
|
||||||
var_cpu="${var_cpu:-2}"
|
var_cpu="${var_cpu:-2}"
|
||||||
var_ram="${var_ram:-2048}"
|
var_ram="${var_ram:-3072}"
|
||||||
var_disk="${var_disk:-12}"
|
var_disk="${var_disk:-12}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
|||||||
@@ -79,6 +79,11 @@ function update_script() {
|
|||||||
$STD apt update
|
$STD apt update
|
||||||
$STD apt install -y plexmediaserver
|
$STD apt install -y plexmediaserver
|
||||||
msg_ok "Updated Plex Media Server"
|
msg_ok "Updated Plex Media Server"
|
||||||
|
|
||||||
|
msg_info "Restarting Plex Media Server"
|
||||||
|
systemctl restart plexmediaserver
|
||||||
|
msg_ok "Restarted Plex Media Server"
|
||||||
|
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ APP="PVE-Scripts-Local"
|
|||||||
var_tags="${var_tags:-pve-scripts-local}"
|
var_tags="${var_tags:-pve-scripts-local}"
|
||||||
var_cpu="${var_cpu:-2}"
|
var_cpu="${var_cpu:-2}"
|
||||||
var_ram="${var_ram:-4096}"
|
var_ram="${var_ram:-4096}"
|
||||||
var_disk="${var_disk:-4}"
|
var_disk="${var_disk:-10}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ function update_script() {
|
|||||||
|
|
||||||
msg_info "Updating Sparky Fitness Backend"
|
msg_info "Updating Sparky Fitness Backend"
|
||||||
cd /opt/sparkyfitness/SparkyFitnessServer
|
cd /opt/sparkyfitness/SparkyFitnessServer
|
||||||
$STD npm install --legacy-peer-deps
|
$STD pnpm install
|
||||||
msg_ok "Updated Sparky Fitness Backend"
|
msg_ok "Updated Sparky Fitness Backend"
|
||||||
|
|
||||||
msg_info "Updating Sparky Fitness Frontend (Patience)"
|
msg_info "Updating Sparky Fitness Frontend (Patience)"
|
||||||
|
|||||||
68
ct/split-pro.sh
Normal file
68
ct/split-pro.sh
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: johanngrobe
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/oss-apps/split-pro
|
||||||
|
|
||||||
|
APP="Split-Pro"
|
||||||
|
var_tags="${var_tags:-finance;expense-sharing}"
|
||||||
|
var_cpu="${var_cpu:-2}"
|
||||||
|
var_ram="${var_ram:-4096}"
|
||||||
|
var_disk="${var_disk:-6}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
|
||||||
|
if [[ ! -d /opt/split-pro ]]; then
|
||||||
|
msg_error "No Split Pro Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_release "split-pro" "oss-apps/split-pro"; then
|
||||||
|
msg_info "Stopping Service"
|
||||||
|
systemctl stop split-pro
|
||||||
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
|
msg_info "Backing up Data"
|
||||||
|
cp /opt/split-pro/.env /opt/split-pro.env
|
||||||
|
msg_ok "Backed up Data"
|
||||||
|
|
||||||
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "split-pro" "oss-apps/split-pro" "tarball"
|
||||||
|
|
||||||
|
msg_info "Building Application"
|
||||||
|
cd /opt/split-pro
|
||||||
|
$STD pnpm install --frozen-lockfile
|
||||||
|
$STD pnpm build
|
||||||
|
cp /opt/split-pro.env /opt/split-pro/.env
|
||||||
|
rm -f /opt/split-pro.env
|
||||||
|
ln -sf /opt/split-pro_data/uploads /opt/split-pro/uploads
|
||||||
|
$STD pnpm exec prisma migrate deploy
|
||||||
|
msg_ok "Built Application"
|
||||||
|
|
||||||
|
msg_info "Starting Service"
|
||||||
|
systemctl start split-pro
|
||||||
|
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}"
|
||||||
114
ct/termix.sh
114
ct/termix.sh
@@ -29,10 +29,116 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_tag "guacd" "apache/guacamole-server"; then
|
||||||
|
msg_info "Stopping guacd"
|
||||||
|
systemctl stop guacd 2>/dev/null || true
|
||||||
|
msg_ok "Stopped guacd"
|
||||||
|
|
||||||
|
ensure_dependencies \
|
||||||
|
libcairo2-dev \
|
||||||
|
libjpeg62-turbo-dev \
|
||||||
|
libpng-dev \
|
||||||
|
libtool-bin \
|
||||||
|
uuid-dev \
|
||||||
|
libvncserver-dev \
|
||||||
|
freerdp3-dev \
|
||||||
|
libssh2-1-dev \
|
||||||
|
libtelnet-dev \
|
||||||
|
libwebsockets-dev \
|
||||||
|
libpulse-dev \
|
||||||
|
libvorbis-dev \
|
||||||
|
libwebp-dev \
|
||||||
|
libssl-dev \
|
||||||
|
libpango1.0-dev \
|
||||||
|
libswscale-dev \
|
||||||
|
libavcodec-dev \
|
||||||
|
libavutil-dev \
|
||||||
|
libavformat-dev
|
||||||
|
|
||||||
|
msg_info "Updating Guacamole Server (guacd)"
|
||||||
|
fetch_and_deploy_gh_tag "guacd" "apache/guacamole-server" "${CHECK_UPDATE_RELEASE}" "/opt/guacamole-server"
|
||||||
|
cd /opt/guacamole-server
|
||||||
|
export CPPFLAGS="-Wno-error=deprecated-declarations"
|
||||||
|
$STD autoreconf -fi
|
||||||
|
$STD ./configure --with-init-dir=/etc/init.d --enable-allow-freerdp-snapshots
|
||||||
|
$STD make
|
||||||
|
$STD make install
|
||||||
|
$STD ldconfig
|
||||||
|
cd /opt
|
||||||
|
rm -rf /opt/guacamole-server
|
||||||
|
msg_ok "Updated Guacamole Server (guacd) to ${CHECK_UPDATE_RELEASE}"
|
||||||
|
|
||||||
|
if [[ ! -f /etc/guacamole/guacd.conf ]]; then
|
||||||
|
mkdir -p /etc/guacamole
|
||||||
|
cat <<EOF >/etc/guacamole/guacd.conf
|
||||||
|
[server]
|
||||||
|
bind_host = 127.0.0.1
|
||||||
|
bind_port = 4822
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -f /etc/systemd/system/guacd.service ]] || grep -q "Type=forking" /etc/systemd/system/guacd.service 2>/dev/null; then
|
||||||
|
cat <<EOF >/etc/systemd/system/guacd.service
|
||||||
|
[Unit]
|
||||||
|
Description=Guacamole Proxy Daemon (guacd)
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
ExecStart=/usr/local/sbin/guacd -f -b 127.0.0.1 -l 4822
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! grep -q "guacd.service" /etc/systemd/system/termix.service 2>/dev/null; then
|
||||||
|
sed -i '/^After=network.target/s/$/ guacd.service/' /etc/systemd/system/termix.service
|
||||||
|
sed -i '/^\[Unit\]/a Wants=guacd.service' /etc/systemd/system/termix.service
|
||||||
|
fi
|
||||||
|
|
||||||
|
systemctl daemon-reload
|
||||||
|
systemctl enable -q --now guacd
|
||||||
|
fi
|
||||||
|
|
||||||
if check_for_gh_release "termix" "Termix-SSH/Termix"; then
|
if check_for_gh_release "termix" "Termix-SSH/Termix"; then
|
||||||
msg_info "Stopping Service"
|
msg_info "Stopping Termix"
|
||||||
systemctl stop termix
|
systemctl stop termix
|
||||||
msg_ok "Stopped Service"
|
msg_ok "Stopped Termix"
|
||||||
|
|
||||||
|
msg_info "Migrating Configuration"
|
||||||
|
if [[ ! -f /opt/termix/.env ]]; then
|
||||||
|
cat <<EOF >/opt/termix/.env
|
||||||
|
NODE_ENV=production
|
||||||
|
DATA_DIR=/opt/termix/data
|
||||||
|
GUACD_HOST=127.0.0.1
|
||||||
|
GUACD_PORT=4822
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
if ! grep -q "EnvironmentFile" /etc/systemd/system/termix.service 2>/dev/null; then
|
||||||
|
cat <<EOF >/etc/systemd/system/termix.service
|
||||||
|
[Unit]
|
||||||
|
Description=Termix Backend
|
||||||
|
After=network.target guacd.service
|
||||||
|
Wants=guacd.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=/opt/termix
|
||||||
|
EnvironmentFile=/opt/termix/.env
|
||||||
|
ExecStart=/usr/bin/node /opt/termix/dist/backend/backend/starter.js
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl daemon-reload
|
||||||
|
fi
|
||||||
|
msg_ok "Migrated Configuration"
|
||||||
|
|
||||||
msg_info "Backing up Data"
|
msg_info "Backing up Data"
|
||||||
cp -r /opt/termix/data /opt/termix_data_backup
|
cp -r /opt/termix/data /opt/termix_data_backup
|
||||||
@@ -102,9 +208,9 @@ function update_script() {
|
|||||||
msg_warn "Nginx configuration not updated. If Termix doesn't work, restore from backup or update manually."
|
msg_warn "Nginx configuration not updated. If Termix doesn't work, restore from backup or update manually."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
msg_info "Starting Service"
|
msg_info "Starting Termix"
|
||||||
systemctl start termix
|
systemctl start termix
|
||||||
msg_ok "Started Service"
|
msg_ok "Started Termix"
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
fi
|
fi
|
||||||
exit
|
exit
|
||||||
|
|||||||
@@ -35,7 +35,6 @@ setup_hwaccel
|
|||||||
msg_info "Installing Channels DVR Server (Patience)"
|
msg_info "Installing Channels DVR Server (Patience)"
|
||||||
cd /opt
|
cd /opt
|
||||||
$STD bash <(curl -fsSL https://getchannels.com/dvr/setup.sh)
|
$STD bash <(curl -fsSL https://getchannels.com/dvr/setup.sh)
|
||||||
sed -i -e 's/^sgx:x:104:$/render:x:104:root/' -e 's/^render:x:106:root$/sgx:x:106:/' /etc/group
|
|
||||||
msg_ok "Installed Channels DVR Server"
|
msg_ok "Installed Channels DVR Server"
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
|
|||||||
@@ -13,18 +13,10 @@ setting_up_container
|
|||||||
network_check
|
network_check
|
||||||
update_os
|
update_os
|
||||||
|
|
||||||
setup_hwaccel
|
setup_hwaccel "emby"
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "emby" "MediaBrowser/Emby.Releases" "binary"
|
fetch_and_deploy_gh_release "emby" "MediaBrowser/Emby.Releases" "binary"
|
||||||
|
|
||||||
msg_info "Configuring Emby"
|
|
||||||
if [[ "$CTTYPE" == "0" ]]; then
|
|
||||||
sed -i -e 's/^ssl-cert:x:104:$/render:x:104:root,emby/' -e 's/^render:x:108:root,emby$/ssl-cert:x:108:/' /etc/group
|
|
||||||
else
|
|
||||||
sed -i -e 's/^ssl-cert:x:104:$/render:x:104:emby/' -e 's/^render:x:108:emby$/ssl-cert:x:108:/' /etc/group
|
|
||||||
fi
|
|
||||||
msg_ok "Configured Emby"
|
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
customize
|
customize
|
||||||
cleanup_lxc
|
cleanup_lxc
|
||||||
|
|||||||
@@ -146,7 +146,7 @@ ldconfig
|
|||||||
msg_ok "Built libUSB"
|
msg_ok "Built libUSB"
|
||||||
|
|
||||||
msg_info "Bootstrapping pip"
|
msg_info "Bootstrapping pip"
|
||||||
wget -q https://bootstrap.pypa.io/get-pip.py -O /tmp/get-pip.py
|
curl_with_retry "https://bootstrap.pypa.io/get-pip.py" "/tmp/get-pip.py"
|
||||||
sed -i 's/args.append("setuptools")/args.append("setuptools==77.0.3")/' /tmp/get-pip.py
|
sed -i 's/args.append("setuptools")/args.append("setuptools==77.0.3")/' /tmp/get-pip.py
|
||||||
$STD python3 /tmp/get-pip.py "pip"
|
$STD python3 /tmp/get-pip.py "pip"
|
||||||
rm -f /tmp/get-pip.py
|
rm -f /tmp/get-pip.py
|
||||||
@@ -169,13 +169,13 @@ NODE_VERSION="20" setup_nodejs
|
|||||||
|
|
||||||
msg_info "Downloading Inference Models"
|
msg_info "Downloading Inference Models"
|
||||||
mkdir -p /models /openvino-model
|
mkdir -p /models /openvino-model
|
||||||
wget -q -O /edgetpu_model.tflite https://github.com/google-coral/test_data/raw/release-frogfish/ssdlite_mobiledet_coco_qat_postprocess_edgetpu.tflite
|
curl_with_retry "https://github.com/google-coral/test_data/raw/release-frogfish/ssdlite_mobiledet_coco_qat_postprocess_edgetpu.tflite" "/edgetpu_model.tflite"
|
||||||
wget -q -O /models/cpu_model.tflite https://github.com/google-coral/test_data/raw/release-frogfish/ssdlite_mobiledet_coco_qat_postprocess.tflite
|
curl_with_retry "https://github.com/google-coral/test_data/raw/release-frogfish/ssdlite_mobiledet_coco_qat_postprocess.tflite" "/models/cpu_model.tflite"
|
||||||
cp /opt/frigate/labelmap.txt /labelmap.txt
|
cp /opt/frigate/labelmap.txt /labelmap.txt
|
||||||
msg_ok "Downloaded Inference Models"
|
msg_ok "Downloaded Inference Models"
|
||||||
|
|
||||||
msg_info "Downloading Audio Model"
|
msg_info "Downloading Audio Model"
|
||||||
wget -q -O /tmp/yamnet.tar.gz https://www.kaggle.com/api/v1/models/google/yamnet/tfLite/classification-tflite/1/download
|
curl_with_retry "https://www.kaggle.com/api/v1/models/google/yamnet/tfLite/classification-tflite/1/download" "/tmp/yamnet.tar.gz"
|
||||||
$STD tar xzf /tmp/yamnet.tar.gz -C /
|
$STD tar xzf /tmp/yamnet.tar.gz -C /
|
||||||
mv /1.tflite /cpu_audio_model.tflite
|
mv /1.tflite /cpu_audio_model.tflite
|
||||||
cp /opt/frigate/audio-labelmap.txt /audio-labelmap.txt
|
cp /opt/frigate/audio-labelmap.txt /audio-labelmap.txt
|
||||||
@@ -205,7 +205,7 @@ msg_ok "Installed OpenVino"
|
|||||||
|
|
||||||
msg_info "Building OpenVino Model"
|
msg_info "Building OpenVino Model"
|
||||||
cd /models
|
cd /models
|
||||||
wget -q http://download.tensorflow.org/models/object_detection/ssdlite_mobilenet_v2_coco_2018_05_09.tar.gz
|
curl_with_retry "http://download.tensorflow.org/models/object_detection/ssdlite_mobilenet_v2_coco_2018_05_09.tar.gz" "ssdlite_mobilenet_v2_coco_2018_05_09.tar.gz"
|
||||||
$STD tar -zxf ssdlite_mobilenet_v2_coco_2018_05_09.tar.gz --no-same-owner
|
$STD tar -zxf ssdlite_mobilenet_v2_coco_2018_05_09.tar.gz --no-same-owner
|
||||||
if python3 /opt/frigate/docker/main/build_ov_model.py &>/dev/null; then
|
if python3 /opt/frigate/docker/main/build_ov_model.py &>/dev/null; then
|
||||||
mkdir -p /openvino-model
|
mkdir -p /openvino-model
|
||||||
@@ -219,7 +219,7 @@ if python3 /opt/frigate/docker/main/build_ov_model.py &>/dev/null; then
|
|||||||
if [[ -n "$OV_LABELS" ]]; then
|
if [[ -n "$OV_LABELS" ]]; then
|
||||||
ln -sf "$OV_LABELS" /openvino-model/coco_91cl_bkgr.txt
|
ln -sf "$OV_LABELS" /openvino-model/coco_91cl_bkgr.txt
|
||||||
else
|
else
|
||||||
wget -q "https://raw.githubusercontent.com/openvinotoolkit/open_model_zoo/master/data/dataset_classes/coco_91cl_bkgr.txt" -O /openvino-model/coco_91cl_bkgr.txt
|
curl_with_retry "https://raw.githubusercontent.com/openvinotoolkit/open_model_zoo/master/data/dataset_classes/coco_91cl_bkgr.txt" "/openvino-model/coco_91cl_bkgr.txt"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
sed -i 's/truck/car/g' /openvino-model/coco_91cl_bkgr.txt
|
sed -i 's/truck/car/g' /openvino-model/coco_91cl_bkgr.txt
|
||||||
@@ -246,7 +246,7 @@ msg_info "Configuring Frigate"
|
|||||||
mkdir -p /config /media/frigate
|
mkdir -p /config /media/frigate
|
||||||
cp -r /opt/frigate/config/. /config
|
cp -r /opt/frigate/config/. /config
|
||||||
|
|
||||||
curl -fsSL "https://github.com/intel-iot-devkit/sample-videos/raw/master/person-bicycle-car-detection.mp4" -o "/media/frigate/person-bicycle-car-detection.mp4"
|
curl_with_retry "https://github.com/intel-iot-devkit/sample-videos/raw/master/person-bicycle-car-detection.mp4" "/media/frigate/person-bicycle-car-detection.mp4"
|
||||||
|
|
||||||
echo "tmpfs /tmp/cache tmpfs defaults 0 0" >>/etc/fstab
|
echo "tmpfs /tmp/cache tmpfs defaults 0 0" >>/etc/fstab
|
||||||
|
|
||||||
@@ -289,7 +289,7 @@ detect:
|
|||||||
enabled: false
|
enabled: false
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
if grep -q -o -m1 -E 'avx[^ ]*|sse4_2' /proc/cpuinfo; then
|
if grep -q -o -m1 -E 'avx[^ ]*|sse4_2' /proc/cpuinfo && [[ -f /openvino-model/ssdlite_mobilenet_v2.xml ]] && [[ -f /openvino-model/coco_91cl_bkgr.txt ]]; then
|
||||||
cat <<EOF >>/config/config.yml
|
cat <<EOF >>/config/config.yml
|
||||||
ffmpeg:
|
ffmpeg:
|
||||||
hwaccel_args: auto
|
hwaccel_args: auto
|
||||||
|
|||||||
@@ -46,6 +46,9 @@ VPN_TYPE=openvpn
|
|||||||
OPENVPN_CUSTOM_CONFIG=/opt/gluetun-data/custom.ovpn
|
OPENVPN_CUSTOM_CONFIG=/opt/gluetun-data/custom.ovpn
|
||||||
OPENVPN_USER=
|
OPENVPN_USER=
|
||||||
OPENVPN_PASSWORD=
|
OPENVPN_PASSWORD=
|
||||||
|
OPENVPN_PROCESS_USER=root
|
||||||
|
PUID=0
|
||||||
|
PGID=0
|
||||||
HTTP_CONTROL_SERVER_ADDRESS=:8000
|
HTTP_CONTROL_SERVER_ADDRESS=:8000
|
||||||
HTTPPROXY=off
|
HTTPPROXY=off
|
||||||
SHADOWSOCKS=off
|
SHADOWSOCKS=off
|
||||||
@@ -76,6 +79,7 @@ User=root
|
|||||||
WorkingDirectory=/opt/gluetun-data
|
WorkingDirectory=/opt/gluetun-data
|
||||||
EnvironmentFile=/opt/gluetun-data/.env
|
EnvironmentFile=/opt/gluetun-data/.env
|
||||||
UnsetEnvironment=USER
|
UnsetEnvironment=USER
|
||||||
|
ExecStartPre=/bin/sh -c 'rm -f /etc/openvpn/target.ovpn'
|
||||||
ExecStart=/usr/local/bin/gluetun
|
ExecStart=/usr/local/bin/gluetun
|
||||||
Restart=on-failure
|
Restart=on-failure
|
||||||
RestartSec=5
|
RestartSec=5
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 tteck
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
# Author: tteck (tteckster)
|
# Author: MickLesk (CanbiZ)
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
# Source: https://jellyfin.org/
|
# Source: https://jellyfin.org/
|
||||||
|
|
||||||
@@ -14,31 +14,30 @@ network_check
|
|||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_custom "ℹ️" "${GN}" "If NVIDIA GPU passthrough is detected, you'll be asked whether to install drivers in the container"
|
msg_custom "ℹ️" "${GN}" "If NVIDIA GPU passthrough is detected, you'll be asked whether to install drivers in the container"
|
||||||
setup_hwaccel
|
setup_hwaccel "jellyfin"
|
||||||
|
|
||||||
msg_info "Installing Jellyfin"
|
msg_info "Installing Dependencies"
|
||||||
VERSION="$(awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release)"
|
ensure_dependencies libjemalloc2
|
||||||
if ! dpkg -s libjemalloc2 >/dev/null 2>&1; then
|
|
||||||
$STD apt install -y libjemalloc2
|
|
||||||
fi
|
|
||||||
if [[ ! -f /usr/lib/libjemalloc.so ]]; then
|
if [[ ! -f /usr/lib/libjemalloc.so ]]; then
|
||||||
ln -sf /usr/lib/x86_64-linux-gnu/libjemalloc.so.2 /usr/lib/libjemalloc.so
|
ln -sf /usr/lib/x86_64-linux-gnu/libjemalloc.so.2 /usr/lib/libjemalloc.so
|
||||||
fi
|
fi
|
||||||
if [[ ! -d /etc/apt/keyrings ]]; then
|
msg_ok "Installed Dependencies"
|
||||||
mkdir -p /etc/apt/keyrings
|
|
||||||
fi
|
|
||||||
curl -fsSL https://repo.jellyfin.org/jellyfin_team.gpg.key | gpg --dearmor --yes --output /etc/apt/keyrings/jellyfin.gpg
|
|
||||||
cat <<EOF >/etc/apt/sources.list.d/jellyfin.sources
|
|
||||||
Types: deb
|
|
||||||
URIs: https://repo.jellyfin.org/${PCT_OSTYPE}
|
|
||||||
Suites: ${VERSION}
|
|
||||||
Components: main
|
|
||||||
Architectures: amd64
|
|
||||||
Signed-By: /etc/apt/keyrings/jellyfin.gpg
|
|
||||||
EOF
|
|
||||||
|
|
||||||
$STD apt update
|
msg_info "Setting up Jellyfin Repository"
|
||||||
$STD apt install -y jellyfin
|
setup_deb822_repo \
|
||||||
|
"jellyfin" \
|
||||||
|
"https://repo.jellyfin.org/jellyfin_team.gpg.key" \
|
||||||
|
"https://repo.jellyfin.org/$(get_os_info id)" \
|
||||||
|
"$(get_os_info codename)"
|
||||||
|
msg_ok "Set up Jellyfin Repository"
|
||||||
|
|
||||||
|
msg_info "Installing Jellyfin"
|
||||||
|
$STD apt install -y jellyfin jellyfin-ffmpeg7
|
||||||
|
ln -sf /usr/lib/jellyfin-ffmpeg/ffmpeg /usr/bin/ffmpeg
|
||||||
|
ln -sf /usr/lib/jellyfin-ffmpeg/ffprobe /usr/bin/ffprobe
|
||||||
|
msg_ok "Installed Jellyfin"
|
||||||
|
|
||||||
|
msg_info "Configuring Jellyfin"
|
||||||
# Configure log rotation to prevent disk fill (keeps fail2ban compatibility) (PR: #1690 / Issue: #11224)
|
# Configure log rotation to prevent disk fill (keeps fail2ban compatibility) (PR: #1690 / Issue: #11224)
|
||||||
cat <<EOF >/etc/logrotate.d/jellyfin
|
cat <<EOF >/etc/logrotate.d/jellyfin
|
||||||
/var/log/jellyfin/*.log {
|
/var/log/jellyfin/*.log {
|
||||||
@@ -55,12 +54,7 @@ EOF
|
|||||||
chown -R jellyfin:adm /etc/jellyfin
|
chown -R jellyfin:adm /etc/jellyfin
|
||||||
sleep 10
|
sleep 10
|
||||||
systemctl restart jellyfin
|
systemctl restart jellyfin
|
||||||
if [[ "$CTTYPE" == "0" ]]; then
|
msg_ok "Configured Jellyfin"
|
||||||
sed -i -e 's/^ssl-cert:x:104:$/render:x:104:root,jellyfin/' -e 's/^render:x:108:root,jellyfin$/ssl-cert:x:108:/' /etc/group
|
|
||||||
else
|
|
||||||
sed -i -e 's/^ssl-cert:x:104:$/render:x:104:jellyfin/' -e 's/^render:x:108:jellyfin$/ssl-cert:x:108:/' /etc/group
|
|
||||||
fi
|
|
||||||
msg_ok "Installed Jellyfin"
|
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
customize
|
customize
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ EOF
|
|||||||
$STD apt update
|
$STD apt update
|
||||||
msg_ok "Set up Intel® Repositories"
|
msg_ok "Set up Intel® Repositories"
|
||||||
|
|
||||||
setup_hwaccel
|
setup_hwaccel "ollama"
|
||||||
|
|
||||||
msg_info "Installing Intel® Level Zero"
|
msg_info "Installing Intel® Level Zero"
|
||||||
# Debian 13+ has newer Level Zero packages in system repos that conflict with Intel repo packages
|
# Debian 13+ has newer Level Zero packages in system repos that conflict with Intel repo packages
|
||||||
@@ -89,8 +89,6 @@ msg_info "Creating ollama User and Group"
|
|||||||
if ! id ollama >/dev/null 2>&1; then
|
if ! id ollama >/dev/null 2>&1; then
|
||||||
useradd -r -s /usr/sbin/nologin -U -m -d /usr/share/ollama ollama
|
useradd -r -s /usr/sbin/nologin -U -m -d /usr/share/ollama ollama
|
||||||
fi
|
fi
|
||||||
$STD usermod -aG render ollama || true
|
|
||||||
$STD usermod -aG video ollama || true
|
|
||||||
$STD usermod -aG ollama $(id -u -n)
|
$STD usermod -aG ollama $(id -u -n)
|
||||||
msg_ok "Created ollama User and adjusted Groups"
|
msg_ok "Created ollama User and adjusted Groups"
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ setting_up_container
|
|||||||
network_check
|
network_check
|
||||||
update_os
|
update_os
|
||||||
|
|
||||||
setup_hwaccel
|
setup_hwaccel "plex"
|
||||||
|
|
||||||
msg_info "Setting Up Plex Media Server Repository"
|
msg_info "Setting Up Plex Media Server Repository"
|
||||||
setup_deb822_repo \
|
setup_deb822_repo \
|
||||||
@@ -26,11 +26,6 @@ msg_ok "Set Up Plex Media Server Repository"
|
|||||||
|
|
||||||
msg_info "Installing Plex Media Server"
|
msg_info "Installing Plex Media Server"
|
||||||
$STD apt install -y plexmediaserver
|
$STD apt install -y plexmediaserver
|
||||||
if [[ "$CTTYPE" == "0" ]]; then
|
|
||||||
sed -i -e 's/^ssl-cert:x:104:plex$/render:x:104:root,plex/' -e 's/^render:x:108:root$/ssl-cert:x:108:plex/' /etc/group
|
|
||||||
else
|
|
||||||
sed -i -e 's/^ssl-cert:x:104:plex$/render:x:104:plex/' -e 's/^render:x:108:$/ssl-cert:x:108:/' /etc/group
|
|
||||||
fi
|
|
||||||
msg_ok "Installed Plex Media Server"
|
msg_ok "Installed Plex Media Server"
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ msg_ok "Configured Sparky Fitness"
|
|||||||
|
|
||||||
msg_info "Building Backend"
|
msg_info "Building Backend"
|
||||||
cd /opt/sparkyfitness/SparkyFitnessServer
|
cd /opt/sparkyfitness/SparkyFitnessServer
|
||||||
$STD npm install --legacy-peer-deps
|
$STD pnpm install
|
||||||
msg_ok "Built Backend"
|
msg_ok "Built Backend"
|
||||||
|
|
||||||
msg_info "Building Frontend (Patience)"
|
msg_info "Building Frontend (Patience)"
|
||||||
|
|||||||
74
install/split-pro-install.sh
Normal file
74
install/split-pro-install.sh
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: johanngrobe
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/oss-apps/split-pro
|
||||||
|
|
||||||
|
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
|
||||||
|
PG_VERSION="17" PG_MODULES="cron" setup_postgresql
|
||||||
|
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
$STD apt install -y openssl
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
PG_DB_NAME="splitpro" PG_DB_USER="splitpro" PG_DB_EXTENSIONS="pg_cron" setup_postgresql_db
|
||||||
|
fetch_and_deploy_gh_release "split-pro" "oss-apps/split-pro" "tarball"
|
||||||
|
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
cd /opt/split-pro
|
||||||
|
$STD pnpm install --frozen-lockfile
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
msg_info "Building Split Pro"
|
||||||
|
cd /opt/split-pro
|
||||||
|
mkdir -p /opt/split-pro_data/uploads
|
||||||
|
ln -sf /opt/split-pro_data/uploads /opt/split-pro/uploads
|
||||||
|
NEXTAUTH_SECRET=$(openssl rand -base64 32)
|
||||||
|
cp .env.example .env
|
||||||
|
sed -i "s|^DATABASE_URL=.*|DATABASE_URL=\"postgresql://${PG_DB_USER}:${PG_DB_PASS}@localhost:5432/${PG_DB_NAME}\"|" .env
|
||||||
|
sed -i "s|^NEXTAUTH_SECRET=.*|NEXTAUTH_SECRET=\"${NEXTAUTH_SECRET}\"|" .env
|
||||||
|
sed -i "s|^NEXTAUTH_URL=.*|NEXTAUTH_URL=\"http://${LOCAL_IP}:3000\"|" .env
|
||||||
|
sed -i "s|^NEXTAUTH_URL_INTERNAL=.*|NEXTAUTH_URL_INTERNAL=\"http://localhost:3000\"|" .env
|
||||||
|
sed -i "/^POSTGRES_CONTAINER_NAME=/d" .env
|
||||||
|
sed -i "/^POSTGRES_USER=/d" .env
|
||||||
|
sed -i "/^POSTGRES_PASSWORD=/d" .env
|
||||||
|
sed -i "/^POSTGRES_DB=/d" .env
|
||||||
|
sed -i "/^POSTGRES_PORT=/d" .env
|
||||||
|
$STD pnpm build
|
||||||
|
$STD pnpm exec prisma migrate deploy
|
||||||
|
msg_ok "Built Split Pro"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/split-pro.service
|
||||||
|
[Unit]
|
||||||
|
Description=Split Pro
|
||||||
|
After=network.target postgresql.service
|
||||||
|
Requires=postgresql.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=/opt/split-pro
|
||||||
|
EnvironmentFile=/opt/split-pro/.env
|
||||||
|
ExecStart=/usr/bin/pnpm start
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now split-pro
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
@@ -19,9 +19,41 @@ $STD apt install -y \
|
|||||||
python3 \
|
python3 \
|
||||||
nginx \
|
nginx \
|
||||||
openssl \
|
openssl \
|
||||||
gettext-base
|
gettext-base \
|
||||||
|
libcairo2-dev \
|
||||||
|
libjpeg62-turbo-dev \
|
||||||
|
libpng-dev \
|
||||||
|
libtool-bin \
|
||||||
|
uuid-dev \
|
||||||
|
libvncserver-dev \
|
||||||
|
freerdp3-dev \
|
||||||
|
libssh2-1-dev \
|
||||||
|
libtelnet-dev \
|
||||||
|
libwebsockets-dev \
|
||||||
|
libpulse-dev \
|
||||||
|
libvorbis-dev \
|
||||||
|
libwebp-dev \
|
||||||
|
libssl-dev \
|
||||||
|
libpango1.0-dev \
|
||||||
|
libswscale-dev \
|
||||||
|
libavcodec-dev \
|
||||||
|
libavutil-dev \
|
||||||
|
libavformat-dev
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
msg_info "Building Guacamole Server (guacd)"
|
||||||
|
fetch_and_deploy_gh_tag "guacd" "apache/guacamole-server" "latest" "/opt/guacamole-server"
|
||||||
|
cd /opt/guacamole-server
|
||||||
|
export CPPFLAGS="-Wno-error=deprecated-declarations"
|
||||||
|
$STD autoreconf -fi
|
||||||
|
$STD ./configure --with-init-dir=/etc/init.d --enable-allow-freerdp-snapshots
|
||||||
|
$STD make
|
||||||
|
$STD make install
|
||||||
|
$STD ldconfig
|
||||||
|
cd /opt
|
||||||
|
rm -rf /opt/guacamole-server
|
||||||
|
msg_ok "Built Guacamole Server (guacd)"
|
||||||
|
|
||||||
NODE_VERSION="22" setup_nodejs
|
NODE_VERSION="22" setup_nodejs
|
||||||
fetch_and_deploy_gh_release "termix" "Termix-SSH/Termix"
|
fetch_and_deploy_gh_release "termix" "Termix-SSH/Termix"
|
||||||
|
|
||||||
@@ -74,17 +106,46 @@ systemctl reload nginx
|
|||||||
msg_ok "Configured Nginx"
|
msg_ok "Configured Nginx"
|
||||||
|
|
||||||
msg_info "Creating Service"
|
msg_info "Creating Service"
|
||||||
|
mkdir -p /etc/guacamole
|
||||||
|
cat <<EOF >/etc/guacamole/guacd.conf
|
||||||
|
[server]
|
||||||
|
bind_host = 127.0.0.1
|
||||||
|
bind_port = 4822
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat <<EOF >/opt/termix/.env
|
||||||
|
NODE_ENV=production
|
||||||
|
DATA_DIR=/opt/termix/data
|
||||||
|
GUACD_HOST=127.0.0.1
|
||||||
|
GUACD_PORT=4822
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat <<EOF >/etc/systemd/system/guacd.service
|
||||||
|
[Unit]
|
||||||
|
Description=Guacamole Proxy Daemon (guacd)
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
ExecStart=/usr/local/sbin/guacd -f -b 127.0.0.1 -l 4822
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
cat <<EOF >/etc/systemd/system/termix.service
|
cat <<EOF >/etc/systemd/system/termix.service
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=Termix Backend
|
Description=Termix Backend
|
||||||
After=network.target
|
After=network.target guacd.service
|
||||||
|
Wants=guacd.service
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
User=root
|
User=root
|
||||||
WorkingDirectory=/opt/termix
|
WorkingDirectory=/opt/termix
|
||||||
Environment=NODE_ENV=production
|
EnvironmentFile=/opt/termix/.env
|
||||||
Environment=DATA_DIR=/opt/termix/data
|
|
||||||
ExecStart=/usr/bin/node /opt/termix/dist/backend/backend/starter.js
|
ExecStart=/usr/bin/node /opt/termix/dist/backend/backend/starter.js
|
||||||
Restart=on-failure
|
Restart=on-failure
|
||||||
RestartSec=5
|
RestartSec=5
|
||||||
@@ -92,7 +153,7 @@ RestartSec=5
|
|||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
EOF
|
EOF
|
||||||
systemctl enable -q --now termix
|
systemctl enable -q --now guacd termix
|
||||||
msg_ok "Created Service"
|
msg_ok "Created Service"
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
|
|||||||
145
misc/tools.func
145
misc/tools.func
@@ -1979,6 +1979,47 @@ extract_version_from_json() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# Get latest GitHub tag (for repos that only publish tags, not releases).
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# get_latest_gh_tag "owner/repo" [prefix]
|
||||||
|
#
|
||||||
|
# Arguments:
|
||||||
|
# $1 - GitHub repo (owner/repo)
|
||||||
|
# $2 - Optional prefix filter (e.g., "v" to only match tags starting with "v")
|
||||||
|
#
|
||||||
|
# Returns:
|
||||||
|
# Latest tag name (stdout), or returns 1 on failure
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
get_latest_gh_tag() {
|
||||||
|
local repo="$1"
|
||||||
|
local prefix="${2:-}"
|
||||||
|
local temp_file
|
||||||
|
temp_file=$(mktemp)
|
||||||
|
|
||||||
|
if ! github_api_call "https://api.github.com/repos/${repo}/tags?per_page=50" "$temp_file"; then
|
||||||
|
rm -f "$temp_file"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local tag=""
|
||||||
|
if [[ -n "$prefix" ]]; then
|
||||||
|
tag=$(jq -r --arg p "$prefix" '[.[] | select(.name | startswith($p))][0].name // empty' "$temp_file")
|
||||||
|
else
|
||||||
|
tag=$(jq -r '.[0].name // empty' "$temp_file")
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -f "$temp_file"
|
||||||
|
|
||||||
|
if [[ -z "$tag" ]]; then
|
||||||
|
msg_error "No tags found for ${repo}"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$tag"
|
||||||
|
}
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
# Get latest GitHub release version with fallback to tags
|
# Get latest GitHub release version with fallback to tags
|
||||||
# Usage: get_latest_github_release "owner/repo" [strip_v] [include_prerelease]
|
# Usage: get_latest_github_release "owner/repo" [strip_v] [include_prerelease]
|
||||||
@@ -2159,6 +2200,49 @@ fetch_and_deploy_gh_tag() {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# Checks for new GitHub tag (for repos without releases).
|
||||||
|
#
|
||||||
|
# Description:
|
||||||
|
# - Uses get_latest_gh_tag to fetch the latest tag
|
||||||
|
# - Compares it to a local cached version (~/.<app>)
|
||||||
|
# - If newer, sets global CHECK_UPDATE_RELEASE and returns 0
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# if check_for_gh_tag "guacd" "apache/guacamole-server"; then
|
||||||
|
# fetch_and_deploy_gh_tag "guacd" "apache/guacamole-server" "/opt/guacamole-server"
|
||||||
|
# fi
|
||||||
|
#
|
||||||
|
# Notes:
|
||||||
|
# - For repos that only publish tags, not GitHub Releases
|
||||||
|
# - Same interface as check_for_gh_release
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
check_for_gh_tag() {
|
||||||
|
local app="$1"
|
||||||
|
local repo="$2"
|
||||||
|
local prefix="${3:-}"
|
||||||
|
local app_lc=""
|
||||||
|
app_lc="$(echo "${app,,}" | tr -d ' ')"
|
||||||
|
local current_file="$HOME/.${app_lc}"
|
||||||
|
|
||||||
|
msg_info "Checking for update: ${app}"
|
||||||
|
|
||||||
|
local latest=""
|
||||||
|
latest=$(get_latest_gh_tag "$repo" "$prefix") || return 1
|
||||||
|
|
||||||
|
local current=""
|
||||||
|
[[ -f "$current_file" ]] && current="$(<"$current_file")"
|
||||||
|
|
||||||
|
if [[ -z "$current" || "$current" != "$latest" ]]; then
|
||||||
|
CHECK_UPDATE_RELEASE="$latest"
|
||||||
|
msg_ok "Update available: ${app} ${current:-not installed} → ${latest}"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_ok "No update available: ${app} (${latest})"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# INSTALL FUNCTIONS
|
# INSTALL FUNCTIONS
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
@@ -2504,6 +2588,8 @@ check_for_codeberg_release() {
|
|||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
create_self_signed_cert() {
|
create_self_signed_cert() {
|
||||||
local APP_NAME="${1:-${APPLICATION}}"
|
local APP_NAME="${1:-${APPLICATION}}"
|
||||||
|
local HOSTNAME="$(hostname -f)"
|
||||||
|
local IP="$(hostname -I | awk '{print $1}')"
|
||||||
local APP_NAME_LC=$(echo "${APP_NAME,,}" | tr -d ' ')
|
local APP_NAME_LC=$(echo "${APP_NAME,,}" | tr -d ' ')
|
||||||
local CERT_DIR="/etc/ssl/${APP_NAME_LC}"
|
local CERT_DIR="/etc/ssl/${APP_NAME_LC}"
|
||||||
local CERT_KEY="${CERT_DIR}/${APP_NAME_LC}.key"
|
local CERT_KEY="${CERT_DIR}/${APP_NAME_LC}.key"
|
||||||
@@ -2521,8 +2607,8 @@ create_self_signed_cert() {
|
|||||||
|
|
||||||
mkdir -p "$CERT_DIR"
|
mkdir -p "$CERT_DIR"
|
||||||
$STD openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 \
|
$STD openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 \
|
||||||
-subj "/CN=${APP_NAME}" \
|
-subj "/CN=${HOSTNAME}" \
|
||||||
-addext "subjectAltName=DNS:${APP_NAME}" \
|
-addext "subjectAltName=DNS:${HOSTNAME},DNS:localhost,IP:${IP},IP:127.0.0.1" \
|
||||||
-keyout "$CERT_KEY" \
|
-keyout "$CERT_KEY" \
|
||||||
-out "$CERT_CRT" || {
|
-out "$CERT_CRT" || {
|
||||||
msg_error "Failed to create self-signed certificate"
|
msg_error "Failed to create self-signed certificate"
|
||||||
@@ -4170,6 +4256,8 @@ function setup_gs() {
|
|||||||
# - NVIDIA requires matching host driver version
|
# - NVIDIA requires matching host driver version
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
function setup_hwaccel() {
|
function setup_hwaccel() {
|
||||||
|
local service_user="${1:-}"
|
||||||
|
|
||||||
# Check if user explicitly disabled GPU in advanced settings
|
# Check if user explicitly disabled GPU in advanced settings
|
||||||
# ENABLE_GPU is exported from build.func
|
# ENABLE_GPU is exported from build.func
|
||||||
if [[ "${ENABLE_GPU:-no}" == "no" ]]; then
|
if [[ "${ENABLE_GPU:-no}" == "no" ]]; then
|
||||||
@@ -4421,7 +4509,7 @@ function setup_hwaccel() {
|
|||||||
# ═══════════════════════════════════════════════════════════════════════════
|
# ═══════════════════════════════════════════════════════════════════════════
|
||||||
# Device Permissions
|
# Device Permissions
|
||||||
# ═══════════════════════════════════════════════════════════════════════════
|
# ═══════════════════════════════════════════════════════════════════════════
|
||||||
_setup_gpu_permissions "$in_ct"
|
_setup_gpu_permissions "$in_ct" "$service_user"
|
||||||
|
|
||||||
cache_installed_version "hwaccel" "1.0"
|
cache_installed_version "hwaccel" "1.0"
|
||||||
msg_ok "Setup Hardware Acceleration"
|
msg_ok "Setup Hardware Acceleration"
|
||||||
@@ -5055,6 +5143,7 @@ EOF
|
|||||||
# ══════════════════════════════════════════════════════════════════════════════
|
# ══════════════════════════════════════════════════════════════════════════════
|
||||||
_setup_gpu_permissions() {
|
_setup_gpu_permissions() {
|
||||||
local in_ct="$1"
|
local in_ct="$1"
|
||||||
|
local service_user="${2:-}"
|
||||||
|
|
||||||
# /dev/dri permissions (Intel/AMD)
|
# /dev/dri permissions (Intel/AMD)
|
||||||
if [[ "$in_ct" == "0" && -d /dev/dri ]]; then
|
if [[ "$in_ct" == "0" && -d /dev/dri ]]; then
|
||||||
@@ -5121,6 +5210,12 @@ _setup_gpu_permissions() {
|
|||||||
chmod 666 /dev/kfd 2>/dev/null || true
|
chmod 666 /dev/kfd 2>/dev/null || true
|
||||||
msg_info "AMD ROCm compute device configured"
|
msg_info "AMD ROCm compute device configured"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Add service user to render and video groups for GPU hardware acceleration
|
||||||
|
if [[ -n "$service_user" ]]; then
|
||||||
|
$STD usermod -aG render "$service_user" 2>/dev/null || true
|
||||||
|
$STD usermod -aG video "$service_user" 2>/dev/null || true
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
@@ -6603,22 +6698,38 @@ EOF
|
|||||||
# - Optionally uses official PGDG repository for specific versions
|
# - Optionally uses official PGDG repository for specific versions
|
||||||
# - Detects existing PostgreSQL version
|
# - Detects existing PostgreSQL version
|
||||||
# - Dumps all databases before upgrade
|
# - Dumps all databases before upgrade
|
||||||
# - Installs optional PG_MODULES (e.g. postgis, contrib)
|
# - Installs optional PG_MODULES (e.g. postgis, contrib, cron)
|
||||||
# - Restores dumped data post-upgrade
|
# - Restores dumped data post-upgrade
|
||||||
#
|
#
|
||||||
# Variables:
|
# Variables:
|
||||||
# USE_PGDG_REPO - Use official PGDG repository (default: true)
|
# USE_PGDG_REPO - Use official PGDG repository (default: true)
|
||||||
# Set to "false" to use distro packages instead
|
# Set to "false" to use distro packages instead
|
||||||
# PG_VERSION - Major PostgreSQL version (e.g. 15, 16) (default: 16)
|
# PG_VERSION - Major PostgreSQL version (e.g. 15, 16) (default: 16)
|
||||||
# PG_MODULES - Comma-separated list of modules (e.g. "postgis,contrib")
|
# PG_MODULES - Comma-separated list of modules (e.g. "postgis,contrib,cron")
|
||||||
#
|
#
|
||||||
# Examples:
|
# Examples:
|
||||||
# setup_postgresql # Uses PGDG repo, PG 16
|
# setup_postgresql # Uses PGDG repo, PG 16
|
||||||
# PG_VERSION="17" setup_postgresql # Specific version from PGDG
|
# PG_VERSION="17" setup_postgresql # Specific version from PGDG
|
||||||
# USE_PGDG_REPO=false setup_postgresql # Uses distro package instead
|
# USE_PGDG_REPO=false setup_postgresql # Uses distro package instead
|
||||||
|
# PG_VERSION="17" PG_MODULES="cron" setup_postgresql # With pg_cron module
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
function setup_postgresql() {
|
# Internal helper: Configure shared_preload_libraries for pg_cron
|
||||||
|
_configure_pg_cron_preload() {
|
||||||
|
local modules="${1:-}"
|
||||||
|
[[ -z "$modules" ]] && return 0
|
||||||
|
if [[ ",$modules," == *",cron,"* ]]; then
|
||||||
|
local current_libs
|
||||||
|
current_libs=$(sudo -u postgres psql -tAc "SHOW shared_preload_libraries;" 2>/dev/null || echo "")
|
||||||
|
if [[ "$current_libs" != *"pg_cron"* ]]; then
|
||||||
|
local new_libs="${current_libs:+${current_libs},}pg_cron"
|
||||||
|
$STD sudo -u postgres psql -c "ALTER SYSTEM SET shared_preload_libraries = '${new_libs}';"
|
||||||
|
$STD systemctl restart postgresql
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
setup_postgresql() {
|
||||||
local PG_VERSION="${PG_VERSION:-16}"
|
local PG_VERSION="${PG_VERSION:-16}"
|
||||||
local PG_MODULES="${PG_MODULES:-}"
|
local PG_MODULES="${PG_MODULES:-}"
|
||||||
local USE_PGDG_REPO="${USE_PGDG_REPO:-true}"
|
local USE_PGDG_REPO="${USE_PGDG_REPO:-true}"
|
||||||
@@ -6656,6 +6767,7 @@ function setup_postgresql() {
|
|||||||
$STD apt install -y "postgresql-${CURRENT_PG_VERSION}-${module}" 2>/dev/null || true
|
$STD apt install -y "postgresql-${CURRENT_PG_VERSION}-${module}" 2>/dev/null || true
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
_configure_pg_cron_preload "$PG_MODULES"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -6691,6 +6803,7 @@ function setup_postgresql() {
|
|||||||
$STD apt install -y "postgresql-${INSTALLED_VERSION}-${module}" 2>/dev/null || true
|
$STD apt install -y "postgresql-${INSTALLED_VERSION}-${module}" 2>/dev/null || true
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
_configure_pg_cron_preload "$PG_MODULES"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -6712,6 +6825,7 @@ function setup_postgresql() {
|
|||||||
$STD apt install -y "postgresql-${PG_VERSION}-${module}" 2>/dev/null || true
|
$STD apt install -y "postgresql-${PG_VERSION}-${module}" 2>/dev/null || true
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
_configure_pg_cron_preload "$PG_MODULES"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -6739,13 +6853,16 @@ function setup_postgresql() {
|
|||||||
local SUITE
|
local SUITE
|
||||||
case "$DISTRO_CODENAME" in
|
case "$DISTRO_CODENAME" in
|
||||||
trixie | forky | sid)
|
trixie | forky | sid)
|
||||||
|
|
||||||
if verify_repo_available "https://apt.postgresql.org/pub/repos/apt" "trixie-pgdg"; then
|
if verify_repo_available "https://apt.postgresql.org/pub/repos/apt" "trixie-pgdg"; then
|
||||||
SUITE="trixie-pgdg"
|
SUITE="trixie-pgdg"
|
||||||
|
|
||||||
else
|
else
|
||||||
msg_warn "PGDG repo not available for ${DISTRO_CODENAME}, falling back to distro packages"
|
msg_warn "PGDG repo not available for ${DISTRO_CODENAME}, falling back to distro packages"
|
||||||
USE_PGDG_REPO=false setup_postgresql
|
USE_PGDG_REPO=false setup_postgresql
|
||||||
return $?
|
return $?
|
||||||
fi
|
fi
|
||||||
|
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
SUITE=$(get_fallback_suite "$DISTRO_ID" "$DISTRO_CODENAME" "https://apt.postgresql.org/pub/repos/apt")
|
SUITE=$(get_fallback_suite "$DISTRO_ID" "$DISTRO_CODENAME" "https://apt.postgresql.org/pub/repos/apt")
|
||||||
@@ -6829,6 +6946,7 @@ function setup_postgresql() {
|
|||||||
}
|
}
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
_configure_pg_cron_preload "$PG_MODULES"
|
||||||
}
|
}
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
@@ -6847,6 +6965,7 @@ function setup_postgresql() {
|
|||||||
# PG_DB_NAME="immich" PG_DB_USER="immich" PG_DB_EXTENSIONS="pgvector" setup_postgresql_db
|
# PG_DB_NAME="immich" PG_DB_USER="immich" PG_DB_EXTENSIONS="pgvector" setup_postgresql_db
|
||||||
# PG_DB_NAME="ghostfolio" PG_DB_USER="ghostfolio" PG_DB_GRANT_SUPERUSER="true" setup_postgresql_db
|
# PG_DB_NAME="ghostfolio" PG_DB_USER="ghostfolio" PG_DB_GRANT_SUPERUSER="true" setup_postgresql_db
|
||||||
# PG_DB_NAME="adventurelog" PG_DB_USER="adventurelog" PG_DB_EXTENSIONS="postgis" setup_postgresql_db
|
# PG_DB_NAME="adventurelog" PG_DB_USER="adventurelog" PG_DB_EXTENSIONS="postgis" setup_postgresql_db
|
||||||
|
# PG_DB_NAME="splitpro" PG_DB_USER="splitpro" PG_DB_EXTENSIONS="pg_cron" setup_postgresql_db
|
||||||
#
|
#
|
||||||
# Variables:
|
# Variables:
|
||||||
# PG_DB_NAME - Database name (required)
|
# PG_DB_NAME - Database name (required)
|
||||||
@@ -6878,6 +6997,13 @@ function setup_postgresql_db() {
|
|||||||
$STD sudo -u postgres psql -c "CREATE ROLE $PG_DB_USER WITH LOGIN PASSWORD '$PG_DB_PASS';"
|
$STD sudo -u postgres psql -c "CREATE ROLE $PG_DB_USER WITH LOGIN PASSWORD '$PG_DB_PASS';"
|
||||||
$STD sudo -u postgres psql -c "CREATE DATABASE $PG_DB_NAME WITH OWNER $PG_DB_USER ENCODING 'UTF8' TEMPLATE template0;"
|
$STD sudo -u postgres psql -c "CREATE DATABASE $PG_DB_NAME WITH OWNER $PG_DB_USER ENCODING 'UTF8' TEMPLATE template0;"
|
||||||
|
|
||||||
|
# Configure pg_cron database BEFORE creating the extension (must be set before pg_cron loads)
|
||||||
|
if [[ -n "${PG_DB_EXTENSIONS:-}" ]] && [[ ",${PG_DB_EXTENSIONS//[[:space:]]/}," == *",pg_cron,"* ]]; then
|
||||||
|
$STD sudo -u postgres psql -c "ALTER SYSTEM SET cron.database_name = '${PG_DB_NAME}';"
|
||||||
|
$STD sudo -u postgres psql -c "ALTER SYSTEM SET cron.timezone = 'UTC';"
|
||||||
|
$STD systemctl restart postgresql
|
||||||
|
fi
|
||||||
|
|
||||||
# Install extensions (comma-separated)
|
# Install extensions (comma-separated)
|
||||||
if [[ -n "${PG_DB_EXTENSIONS:-}" ]]; then
|
if [[ -n "${PG_DB_EXTENSIONS:-}" ]]; then
|
||||||
IFS=',' read -ra EXT_LIST <<<"${PG_DB_EXTENSIONS:-}"
|
IFS=',' read -ra EXT_LIST <<<"${PG_DB_EXTENSIONS:-}"
|
||||||
@@ -6887,6 +7013,12 @@ function setup_postgresql_db() {
|
|||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Grant pg_cron schema permissions to DB user
|
||||||
|
if [[ -n "${PG_DB_EXTENSIONS:-}" ]] && [[ ",${PG_DB_EXTENSIONS//[[:space:]]/}," == *",pg_cron,"* ]]; then
|
||||||
|
$STD sudo -u postgres psql -d "$PG_DB_NAME" -c "GRANT USAGE ON SCHEMA cron TO ${PG_DB_USER};"
|
||||||
|
$STD sudo -u postgres psql -d "$PG_DB_NAME" -c "GRANT ALL ON ALL TABLES IN SCHEMA cron TO ${PG_DB_USER};"
|
||||||
|
fi
|
||||||
|
|
||||||
# ALTER ROLE settings for Django/Rails compatibility (unless skipped)
|
# ALTER ROLE settings for Django/Rails compatibility (unless skipped)
|
||||||
if [[ "${PG_DB_SKIP_ALTER_ROLE:-}" != "true" ]]; then
|
if [[ "${PG_DB_SKIP_ALTER_ROLE:-}" != "true" ]]; then
|
||||||
$STD sudo -u postgres psql -c "ALTER ROLE $PG_DB_USER SET client_encoding TO 'utf8';"
|
$STD sudo -u postgres psql -c "ALTER ROLE $PG_DB_USER SET client_encoding TO 'utf8';"
|
||||||
@@ -6928,7 +7060,6 @@ function setup_postgresql_db() {
|
|||||||
export PG_DB_USER
|
export PG_DB_USER
|
||||||
export PG_DB_PASS
|
export PG_DB_PASS
|
||||||
}
|
}
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
# Installs rbenv and ruby-build, installs Ruby and optionally Rails.
|
# Installs rbenv and ruby-build, installs Ruby and optionally Rails.
|
||||||
#
|
#
|
||||||
|
|||||||
Reference in New Issue
Block a user