mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-07-12 00:52:14 +02:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4346e3c14c | |||
| 5a5931ab74 | |||
| 6ada844abe |
@@ -499,27 +499,6 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## 2026-07-11
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- LocalAGI ([#15687](https://github.com/community-scripts/ProxmoxVE/pull/15687))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- fix(adventurelog): allow pnpm build scripts so install/update doesn't abort [@TowyTowy](https://github.com/TowyTowy) ([#15681](https://github.com/community-scripts/ProxmoxVE/pull/15681))
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- fix(fileflows): install .NET 10 ASP.NET Core Runtime to match current release [@TowyTowy](https://github.com/TowyTowy) ([#15702](https://github.com/community-scripts/ProxmoxVE/pull/15702))
|
|
||||||
- Fix spacing on VLAN Input Box in haos-vm.sh [@pumrum](https://github.com/pumrum) ([#15696](https://github.com/community-scripts/ProxmoxVE/pull/15696))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- [tools.func]: Add function to handle deployment via GitLab release tags [@tremor021](https://github.com/tremor021) ([#15641](https://github.com/community-scripts/ProxmoxVE/pull/15641))
|
|
||||||
|
|
||||||
## 2026-07-10
|
## 2026-07-10
|
||||||
|
|
||||||
### 🆕 New Scripts
|
### 🆕 New Scripts
|
||||||
@@ -530,7 +509,6 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
- Adapt to new artifact filename format for pocket id [@wollew](https://github.com/wollew) ([#15689](https://github.com/community-scripts/ProxmoxVE/pull/15689))
|
|
||||||
- Fireshare: Fix for install and upgrade to v1.7.3 [@tremor021](https://github.com/tremor021) ([#15673](https://github.com/community-scripts/ProxmoxVE/pull/15673))
|
- Fireshare: Fix for install and upgrade to v1.7.3 [@tremor021](https://github.com/tremor021) ([#15673](https://github.com/community-scripts/ProxmoxVE/pull/15673))
|
||||||
- Endurain: Fix update procedure [@tremor021](https://github.com/tremor021) ([#15674](https://github.com/community-scripts/ProxmoxVE/pull/15674))
|
- Endurain: Fix update procedure [@tremor021](https://github.com/tremor021) ([#15674](https://github.com/community-scripts/ProxmoxVE/pull/15674))
|
||||||
|
|
||||||
|
|||||||
@@ -60,7 +60,6 @@ function update_script() {
|
|||||||
$STD .venv/bin/python -m manage migrate
|
$STD .venv/bin/python -m manage migrate
|
||||||
|
|
||||||
cd /opt/adventurelog/frontend
|
cd /opt/adventurelog/frontend
|
||||||
grep -q "^dangerouslyAllowAllBuilds:" ./pnpm-workspace.yaml 2>/dev/null || echo "dangerouslyAllowAllBuilds: true" >>./pnpm-workspace.yaml
|
|
||||||
$STD pnpm i
|
$STD pnpm i
|
||||||
$STD pnpm build
|
$STD pnpm build
|
||||||
msg_ok "Updated AdventureLog"
|
msg_ok "Updated AdventureLog"
|
||||||
|
|||||||
@@ -43,28 +43,6 @@ function update_script() {
|
|||||||
tar -czf "$backup_filename" -C /opt/fileflows Data
|
tar -czf "$backup_filename" -C /opt/fileflows Data
|
||||||
msg_ok "Backup Created"
|
msg_ok "Backup Created"
|
||||||
|
|
||||||
# FileFlows tracks the latest release, whose .NET target can move (e.g. 8 -> 10);
|
|
||||||
# ensure the current ASP.NET Core Runtime so an existing install doesn't fail to
|
|
||||||
# start after updating to a newer .NET major version.
|
|
||||||
msg_info "Ensuring ASP.NET Core Runtime"
|
|
||||||
if [[ "$(arch_resolve)" == "arm64" ]]; then
|
|
||||||
if [[ ! -x /usr/lib/dotnet10/dotnet ]]; then
|
|
||||||
curl -fsSL https://dot.net/v1/dotnet-install.sh -o /tmp/dotnet-install.sh
|
|
||||||
$STD bash /tmp/dotnet-install.sh --channel 10.0 --runtime aspnetcore --install-dir /usr/lib/dotnet10
|
|
||||||
ln -sf /usr/lib/dotnet10/dotnet /usr/bin/dotnet
|
|
||||||
rm -f /tmp/dotnet-install.sh
|
|
||||||
fi
|
|
||||||
elif ! is_package_installed "aspnetcore-runtime-10.0"; then
|
|
||||||
$STD apt remove -y aspnetcore-runtime-8.0 aspnetcore-runtime-9.0 2>/dev/null || true
|
|
||||||
setup_deb822_repo \
|
|
||||||
"microsoft" \
|
|
||||||
"https://packages.microsoft.com/keys/microsoft-2025.asc" \
|
|
||||||
"https://packages.microsoft.com/debian/13/prod/" \
|
|
||||||
"trixie"
|
|
||||||
$STD apt install -y aspnetcore-runtime-10.0
|
|
||||||
fi
|
|
||||||
msg_ok "Ensured ASP.NET Core Runtime"
|
|
||||||
|
|
||||||
fetch_and_deploy_from_url "https://fileflows.com/downloads/zip" "/opt/fileflows"
|
fetch_and_deploy_from_url "https://fileflows.com/downloads/zip" "/opt/fileflows"
|
||||||
|
|
||||||
msg_info "Starting Service"
|
msg_info "Starting Service"
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
__ _____ __________
|
|
||||||
/ / ____ _________ _/ / | / ____/ _/
|
|
||||||
/ / / __ \/ ___/ __ `/ / /| |/ / __ / /
|
|
||||||
/ /___/ /_/ / /__/ /_/ / / ___ / /_/ // /
|
|
||||||
/_____/\____/\___/\__,_/_/_/ |_\____/___/
|
|
||||||
|
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
__ ______ __
|
||||||
|
/ /_____ _____ _________ ____ _ __/ __/ /___ _/ /_____
|
||||||
|
/ __/ __ \/ ___/_____/ ___/ __ \/ __ \ | /| / / /_/ / __ `/ //_/ _ \
|
||||||
|
/ /_/ /_/ / / /_____(__ ) / / / /_/ / |/ |/ / __/ / /_/ / ,< / __/
|
||||||
|
\__/\____/_/ /____/_/ /_/\____/|__/|__/_/ /_/\__,_/_/|_|\___/
|
||||||
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
#!/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: BillyOutlast
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/mudler/LocalAGI
|
|
||||||
|
|
||||||
APP="LocalAGI"
|
|
||||||
var_tags="${var_tags:-ai}"
|
|
||||||
var_cpu="${var_cpu:-2}"
|
|
||||||
var_ram="${var_ram:-4096}"
|
|
||||||
var_disk="${var_disk:-20}"
|
|
||||||
var_os="${var_os:-debian}"
|
|
||||||
var_version="${var_version:-13}"
|
|
||||||
var_arm64="${var_arm64:-no}"
|
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
|
||||||
var_gpu="${var_gpu:-no}"
|
|
||||||
|
|
||||||
header_info "$APP"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
check_container_storage
|
|
||||||
check_container_resources
|
|
||||||
|
|
||||||
if [[ ! -d /opt/localagi ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "localagi" "mudler/LocalAGI"; then
|
|
||||||
msg_info "Stopping Service"
|
|
||||||
systemctl stop localagi
|
|
||||||
msg_ok "Stopped Service"
|
|
||||||
|
|
||||||
create_backup /opt/localagi/.env
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "localagi" "mudler/LocalAGI" "tarball" "latest" "/opt/localagi"
|
|
||||||
restore_backup
|
|
||||||
|
|
||||||
msg_info "Building LocalAGI"
|
|
||||||
cd /opt/localagi/webui/react-ui
|
|
||||||
$STD bun install
|
|
||||||
$STD bun run build
|
|
||||||
cd /opt/localagi
|
|
||||||
$STD go build -o /usr/local/bin/localagi
|
|
||||||
msg_ok "Updated LocalAGI successfully"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
|
||||||
systemctl start localagi
|
|
||||||
msg_ok "Started Service"
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
exit
|
|
||||||
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 "${GATEWAY}${BGN}http://${IP}:3000${CL}"
|
|
||||||
+1
-1
@@ -71,7 +71,7 @@ function update_script() {
|
|||||||
cp /opt/pocket-id/.env /opt/env
|
cp /opt/pocket-id/.env /opt/env
|
||||||
fi
|
fi
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "pocket-id" "pocket-id/pocket-id" "singlefile" "latest" "/opt/pocket-id/" "pocket-id_linux_$(arch_resolve)"
|
fetch_and_deploy_gh_release "pocket-id" "pocket-id/pocket-id" "singlefile" "latest" "/opt/pocket-id/" "pocket-id-linux-$(arch_resolve)"
|
||||||
mv /opt/env /opt/pocket-id/.env
|
mv /opt/env /opt/pocket-id/.env
|
||||||
|
|
||||||
msg_info "Starting Service"
|
msg_info "Starting Service"
|
||||||
|
|||||||
@@ -0,0 +1,63 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2025 community-scripts ORG
|
||||||
|
# Author: KernelSailor
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://snowflake.torproject.org/
|
||||||
|
|
||||||
|
APP="tor-snowflake"
|
||||||
|
var_tags="${var_tags:-privacy;proxy;tor}"
|
||||||
|
var_cpu="${var_cpu:-1}"
|
||||||
|
var_ram="${var_ram:-512}"
|
||||||
|
var_disk="${var_disk:-4}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-yes}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
var_nesting="${var_nesting:-0}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
|
||||||
|
msg_info "Updating Container OS"
|
||||||
|
$STD apt update
|
||||||
|
$STD apt upgrade -y
|
||||||
|
msg_ok "Updated Container OS"
|
||||||
|
|
||||||
|
RELEASE=$(curl -fsSL https://gitlab.torproject.org/api/v4/projects/tpo%2Fanti-censorship%2Fpluggable-transports%2Fsnowflake/releases | jq -r '.[0].tag_name' | sed 's/^v//')
|
||||||
|
if [[ ! -f ~/.tor-snowflake ]] || [[ "${RELEASE}" != "$(cat ~/.tor-snowflake)" ]]; then
|
||||||
|
msg_info "Stopping Service"
|
||||||
|
systemctl stop snowflake-proxy
|
||||||
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
|
setup_go
|
||||||
|
fetch_and_deploy_from_url "https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake/-/archive/v${RELEASE}/snowflake-v${RELEASE}.tar.gz" "/opt/tor-snowflake"
|
||||||
|
|
||||||
|
msg_info "Updating Snowflake"
|
||||||
|
cd /opt/tor-snowflake/proxy
|
||||||
|
$STD go build -o snowflake-proxy .
|
||||||
|
echo "${RELEASE}" >~/.tor-snowflake
|
||||||
|
msg_ok "Updated Snowflake to v${RELEASE}"
|
||||||
|
|
||||||
|
msg_info "Starting Service"
|
||||||
|
systemctl start snowflake-proxy
|
||||||
|
msg_ok "Started Service"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
else
|
||||||
|
msg_ok "No update required. Snowflake is already at v${RELEASE}."
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
@@ -72,7 +72,6 @@ BODY_SIZE_LIMIT=Infinity
|
|||||||
ORIGIN='http://$LOCAL_IP:3000'
|
ORIGIN='http://$LOCAL_IP:3000'
|
||||||
EOF
|
EOF
|
||||||
cd /opt/adventurelog/frontend
|
cd /opt/adventurelog/frontend
|
||||||
grep -q "^dangerouslyAllowAllBuilds:" ./pnpm-workspace.yaml 2>/dev/null || echo "dangerouslyAllowAllBuilds: true" >>./pnpm-workspace.yaml
|
|
||||||
$STD pnpm i
|
$STD pnpm i
|
||||||
$STD pnpm build
|
$STD pnpm build
|
||||||
msg_ok "Installed AdventureLog"
|
msg_ok "Installed AdventureLog"
|
||||||
|
|||||||
@@ -26,8 +26,8 @@ msg_info "Installing ASP.NET Core Runtime"
|
|||||||
if [[ "$(arch_resolve)" == "arm64" ]]; then
|
if [[ "$(arch_resolve)" == "arm64" ]]; then
|
||||||
# packages.microsoft.com only ships amd64 debs for Debian; use dotnet-install on arm64
|
# packages.microsoft.com only ships amd64 debs for Debian; use dotnet-install on arm64
|
||||||
curl -fsSL https://dot.net/v1/dotnet-install.sh -o /tmp/dotnet-install.sh
|
curl -fsSL https://dot.net/v1/dotnet-install.sh -o /tmp/dotnet-install.sh
|
||||||
$STD bash /tmp/dotnet-install.sh --channel 10.0 --runtime aspnetcore --install-dir /usr/lib/dotnet10
|
$STD bash /tmp/dotnet-install.sh --channel 8.0 --runtime aspnetcore --install-dir /usr/lib/dotnet8
|
||||||
ln -sf /usr/lib/dotnet10/dotnet /usr/bin/dotnet
|
ln -sf /usr/lib/dotnet8/dotnet /usr/bin/dotnet
|
||||||
rm -f /tmp/dotnet-install.sh
|
rm -f /tmp/dotnet-install.sh
|
||||||
else
|
else
|
||||||
setup_deb822_repo \
|
setup_deb822_repo \
|
||||||
@@ -35,7 +35,7 @@ else
|
|||||||
"https://packages.microsoft.com/keys/microsoft-2025.asc" \
|
"https://packages.microsoft.com/keys/microsoft-2025.asc" \
|
||||||
"https://packages.microsoft.com/debian/13/prod/" \
|
"https://packages.microsoft.com/debian/13/prod/" \
|
||||||
"trixie"
|
"trixie"
|
||||||
$STD apt install -y aspnetcore-runtime-10.0
|
$STD apt install -y aspnetcore-runtime-8.0
|
||||||
fi
|
fi
|
||||||
msg_ok "Installed ASP.NET Core Runtime"
|
msg_ok "Installed ASP.NET Core Runtime"
|
||||||
|
|
||||||
|
|||||||
@@ -1,75 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: BillyOutlast
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/mudler/LocalAGI
|
|
||||||
|
|
||||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
|
||||||
APP="LocalAGI"
|
|
||||||
color
|
|
||||||
verb_ip6
|
|
||||||
catch_errors
|
|
||||||
setting_up_container
|
|
||||||
network_check
|
|
||||||
update_os
|
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
|
||||||
$STD apt install -y build-essential
|
|
||||||
msg_ok "Installed Dependencies"
|
|
||||||
|
|
||||||
NODE_VERSION="24" setup_nodejs
|
|
||||||
setup_go
|
|
||||||
|
|
||||||
msg_info "Installing Bun"
|
|
||||||
export BUN_INSTALL="/root/.bun"
|
|
||||||
curl -fsSL https://bun.sh/install | $STD bash
|
|
||||||
ln -sf /root/.bun/bin/bun /usr/local/bin/bun
|
|
||||||
ln -sf /root/.bun/bin/bunx /usr/local/bin/bunx
|
|
||||||
msg_ok "Installed Bun"
|
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "localagi" "mudler/LocalAGI" "tarball" "latest" "/opt/localagi"
|
|
||||||
|
|
||||||
msg_info "Configuring LocalAGI"
|
|
||||||
mkdir -p /opt/localagi/pool
|
|
||||||
cat <<'EOF' >/opt/localagi/.env
|
|
||||||
LOCALAGI_MODEL=gemma-3-4b-it-qat
|
|
||||||
LOCALAGI_MULTIMODAL_MODEL=moondream2-20250414
|
|
||||||
LOCALAGI_IMAGE_MODEL=sd-1.5-ggml
|
|
||||||
LOCALAGI_LLM_API_URL=http://127.0.0.1:11434/v1
|
|
||||||
LOCALAGI_STATE_DIR=/opt/localagi/pool
|
|
||||||
EOF
|
|
||||||
msg_ok "Configured LocalAGI"
|
|
||||||
|
|
||||||
msg_info "Setting up LocalAGI"
|
|
||||||
cd /opt/localagi/webui/react-ui
|
|
||||||
$STD bun install
|
|
||||||
$STD bun run build
|
|
||||||
cd /opt/localagi
|
|
||||||
$STD go build -o /usr/local/bin/localagi
|
|
||||||
msg_ok "Set up LocalAGI"
|
|
||||||
|
|
||||||
msg_info "Creating LocalAGI systemd service"
|
|
||||||
cat <<EOF >/etc/systemd/system/localagi.service
|
|
||||||
[Unit]
|
|
||||||
Description=LocalAGI
|
|
||||||
After=network.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
User=root
|
|
||||||
Type=simple
|
|
||||||
EnvironmentFile=/opt/localagi/.env
|
|
||||||
|
|
||||||
WorkingDirectory=/opt/localagi
|
|
||||||
ExecStart=/usr/local/bin/localagi
|
|
||||||
Restart=on-failure
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
EOF
|
|
||||||
systemctl enable -q --now localagi
|
|
||||||
msg_ok "Created LocalAGI systemd service"
|
|
||||||
|
|
||||||
motd_ssh
|
|
||||||
customize
|
|
||||||
cleanup_lxc
|
|
||||||
@@ -14,7 +14,7 @@ network_check
|
|||||||
update_os
|
update_os
|
||||||
|
|
||||||
read -r -p "${TAB3}What public URL do you want to use (e.g. pocketid.mydomain.com)? " public_url
|
read -r -p "${TAB3}What public URL do you want to use (e.g. pocketid.mydomain.com)? " public_url
|
||||||
fetch_and_deploy_gh_release "pocket-id" "pocket-id/pocket-id" "singlefile" "latest" "/opt/pocket-id/" "pocket-id_linux_$(arch_resolve)"
|
fetch_and_deploy_gh_release "pocket-id" "pocket-id/pocket-id" "singlefile" "latest" "/opt/pocket-id/" "pocket-id-linux-$(arch_resolve)"
|
||||||
|
|
||||||
msg_info "Configuring Pocket ID"
|
msg_info "Configuring Pocket ID"
|
||||||
ENCRYPTION_KEY=$(openssl rand -base64 32)
|
ENCRYPTION_KEY=$(openssl rand -base64 32)
|
||||||
|
|||||||
@@ -0,0 +1,52 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2025 community-scripts ORG
|
||||||
|
# Author: KernelSailor
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://snowflake.torproject.org/
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
setup_go
|
||||||
|
|
||||||
|
msg_info "Building Snowflake"
|
||||||
|
RELEASE=$(curl -fsSL https://gitlab.torproject.org/api/v4/projects/tpo%2Fanti-censorship%2Fpluggable-transports%2Fsnowflake/releases | jq -r '.[0].tag_name' | sed 's/^v//')
|
||||||
|
$STD curl -fsSL "https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake/-/archive/v${RELEASE}/snowflake-v${RELEASE}.tar.gz" -o /opt/snowflake.tar.gz
|
||||||
|
$STD tar -xzf /opt/snowflake.tar.gz -C /opt
|
||||||
|
rm -rf /opt/snowflake.tar.gz
|
||||||
|
mv /opt/snowflake-v${RELEASE} /opt/tor-snowflake
|
||||||
|
cd /opt/tor-snowflake/proxy
|
||||||
|
$STD go build -o snowflake-proxy .
|
||||||
|
echo "${RELEASE}" >~/.tor-snowflake
|
||||||
|
msg_ok "Built Snowflake Proxy v${RELEASE}"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/snowflake-proxy.service
|
||||||
|
[Unit]
|
||||||
|
Description=Snowflake Proxy Service
|
||||||
|
Documentation=https://snowflake.torproject.org/
|
||||||
|
After=network-online.target
|
||||||
|
Wants=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
WorkingDirectory=/opt/tor-snowflake/proxy
|
||||||
|
ExecStart=/opt/tor-snowflake/proxy/snowflake-proxy -verbose -unsafe-logging
|
||||||
|
Restart=always
|
||||||
|
RestartSec=10
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now snowflake-proxy
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
-193
@@ -2559,199 +2559,6 @@ fetch_and_deploy_gh_tag() {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
# Get the latest GitLab repository tag matching a glob pattern.
|
|
||||||
#
|
|
||||||
# Description:
|
|
||||||
# - Queries the GitLab repository tags API (up to 100 tags per page)
|
|
||||||
# - Filters tag names against a shell glob pattern (e.g. "web-v*" or "mobile-v*")
|
|
||||||
# - Always excludes pre-release tags (those containing alpha, beta, or rc)
|
|
||||||
# - Sorts matching tags with `sort -V` and returns the highest one
|
|
||||||
# - Supports GITLAB_TOKEN for private/rate-limited projects
|
|
||||||
#
|
|
||||||
# Usage:
|
|
||||||
# get_latest_gl_tag "owner/repo" "web-v*"
|
|
||||||
# get_latest_gl_tag "owner/repo" "mobile-v*"
|
|
||||||
# get_latest_gl_tag "owner/repo" # returns newest tag (no filter)
|
|
||||||
#
|
|
||||||
# Arguments:
|
|
||||||
# $1 - GitLab repo path (namespace/project, e.g. "mygroup/myapp")
|
|
||||||
# $2 - Optional glob pattern to filter tag names (e.g. "web-v*")
|
|
||||||
#
|
|
||||||
# Returns:
|
|
||||||
# Latest matching tag name on stdout, or non-zero on failure
|
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
get_latest_gl_tag() {
|
|
||||||
local repo="$1"
|
|
||||||
local pattern="${2:-}"
|
|
||||||
|
|
||||||
local repo_encoded
|
|
||||||
repo_encoded=$(printf '%s' "$repo" | sed 's|/|%2F|g')
|
|
||||||
|
|
||||||
local api_base="https://gitlab.com/api/v4/projects/${repo_encoded}/repository/tags"
|
|
||||||
local api_timeout="--connect-timeout 10 --max-time 60"
|
|
||||||
|
|
||||||
local header=()
|
|
||||||
[[ -n "${GITLAB_TOKEN:-}" ]] && header=(-H "PRIVATE-TOKEN: $GITLAB_TOKEN")
|
|
||||||
|
|
||||||
# If a pattern is given, pass it as a regex search to reduce server-side results.
|
|
||||||
# GitLab ?search= supports anchored regex; convert leading glob prefix to regex anchor.
|
|
||||||
local search_param=""
|
|
||||||
if [[ -n "$pattern" ]]; then
|
|
||||||
# Strip trailing wildcard for the search hint (server-side prefix filter).
|
|
||||||
local prefix="${pattern%%\**}"
|
|
||||||
[[ -n "$prefix" ]] && search_param="?search=^${prefix}&per_page=100" || search_param="?per_page=100"
|
|
||||||
else
|
|
||||||
search_param="?per_page=100"
|
|
||||||
fi
|
|
||||||
|
|
||||||
local temp_file
|
|
||||||
temp_file=$(mktemp) || return 1
|
|
||||||
|
|
||||||
local http_code
|
|
||||||
http_code=$(curl $api_timeout -sSL -w "%{http_code}" -o "$temp_file" \
|
|
||||||
"${header[@]}" "${api_base}${search_param}" 2>/dev/null) || true
|
|
||||||
|
|
||||||
if [[ "$http_code" != "200" ]]; then
|
|
||||||
rm -f "$temp_file"
|
|
||||||
msg_error "GitLab tags API returned HTTP $http_code for $repo"
|
|
||||||
return 22
|
|
||||||
fi
|
|
||||||
|
|
||||||
local tag=""
|
|
||||||
if [[ -n "$pattern" ]]; then
|
|
||||||
# Client-side glob filter + pre-release exclusion, then version-sort to pick the highest match.
|
|
||||||
tag=$(jq -r '.[].name' "$temp_file" 2>/dev/null | while IFS= read -r t; do
|
|
||||||
case "$t" in
|
|
||||||
*alpha* | *beta* | *rc*) continue ;;
|
|
||||||
$pattern) echo "$t" ;;
|
|
||||||
esac
|
|
||||||
done | sort -V | tail -n1)
|
|
||||||
else
|
|
||||||
# No pattern: skip pre-release tags, take the first remaining (newest) one.
|
|
||||||
tag=$(jq -r '.[].name' "$temp_file" 2>/dev/null |
|
|
||||||
grep -Eiv '(alpha|beta|rc)' |
|
|
||||||
head -n1)
|
|
||||||
fi
|
|
||||||
|
|
||||||
rm -f "$temp_file"
|
|
||||||
|
|
||||||
if [[ -z "$tag" ]]; then
|
|
||||||
msg_error "No tags matching '${pattern:-*}' found for ${repo}"
|
|
||||||
return 250
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "$tag"
|
|
||||||
}
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
# Fetches and deploys a GitLab tag-based source tarball.
|
|
||||||
#
|
|
||||||
# Description:
|
|
||||||
# - Resolves the latest tag matching the given glob pattern via get_latest_gl_tag
|
|
||||||
# (or uses the exact tag if one is provided instead of "latest")
|
|
||||||
# - Downloads the GitLab source tarball for that tag
|
|
||||||
# - Extracts it to the target directory
|
|
||||||
# - Writes the resolved tag to ~/.<app> for update-checking
|
|
||||||
#
|
|
||||||
# Usage:
|
|
||||||
# fetch_and_deploy_gl_tag "myapp" "mygroup/myrepo" "web-v*"
|
|
||||||
# fetch_and_deploy_gl_tag "myapp" "mygroup/myrepo" "mobile-v*" "/opt/myapp"
|
|
||||||
# fetch_and_deploy_gl_tag "myapp" "mygroup/myrepo" "v*" # any v-tag
|
|
||||||
# fetch_and_deploy_gl_tag "myapp" "mygroup/myrepo" "web-v3.0*" # narrow version range
|
|
||||||
#
|
|
||||||
# Arguments:
|
|
||||||
# $1 - App name (used for version file ~/.<app> and lowercase tarball name)
|
|
||||||
# $2 - GitLab repo path (namespace/project, e.g. "mygroup/myapp")
|
|
||||||
# $3 - Tag pattern: glob (e.g. "web-v*") or exact tag (e.g. "web-v3.0.0").
|
|
||||||
# Use "latest" to fetch the single newest tag with no pattern filter.
|
|
||||||
# $4 - Target directory (default: /opt/$app)
|
|
||||||
#
|
|
||||||
# Notes:
|
|
||||||
# - Supports CLEAN_INSTALL=1 to wipe target before extracting
|
|
||||||
# - Supports GITLAB_TOKEN for private/rate-limited projects
|
|
||||||
# - For repos that only publish tags, not formal GitLab Releases
|
|
||||||
# (use fetch_and_deploy_gl_release for proper Releases with assets)
|
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
fetch_and_deploy_gl_tag() {
|
|
||||||
local app="$1"
|
|
||||||
local repo="$2"
|
|
||||||
local tag_pattern="${3:-latest}"
|
|
||||||
local target="${4:-/opt/$app}"
|
|
||||||
|
|
||||||
local app_lc=""
|
|
||||||
app_lc="$(echo "${app,,}" | tr -d ' ')"
|
|
||||||
local version_file="$HOME/.${app_lc}"
|
|
||||||
|
|
||||||
local api_timeout="--connect-timeout 10 --max-time 60"
|
|
||||||
local download_timeout="--connect-timeout 15 --max-time 900"
|
|
||||||
|
|
||||||
local header=()
|
|
||||||
[[ -n "${GITLAB_TOKEN:-}" ]] && header=(-H "PRIVATE-TOKEN: $GITLAB_TOKEN")
|
|
||||||
|
|
||||||
# Resolve the tag: if caller passed a glob/latest, query the API.
|
|
||||||
# If caller passed an exact tag (no wildcards), use it directly.
|
|
||||||
local resolved_tag="$tag_pattern"
|
|
||||||
if [[ "$tag_pattern" == "latest" || "$tag_pattern" == *"*"* || "$tag_pattern" == *"?"* ]]; then
|
|
||||||
local glob_arg=""
|
|
||||||
[[ "$tag_pattern" != "latest" ]] && glob_arg="$tag_pattern"
|
|
||||||
resolved_tag=$(get_latest_gl_tag "$repo" "$glob_arg") || {
|
|
||||||
msg_error "Failed to determine latest tag matching '${tag_pattern}' for ${repo}"
|
|
||||||
return 250
|
|
||||||
}
|
|
||||||
fi
|
|
||||||
|
|
||||||
local current_version=""
|
|
||||||
[[ -f "$version_file" ]] && current_version=$(<"$version_file")
|
|
||||||
|
|
||||||
if [[ "$current_version" == "$resolved_tag" ]]; then
|
|
||||||
msg_ok "$app is already up-to-date ($resolved_tag)"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
local repo_encoded
|
|
||||||
repo_encoded=$(printf '%s' "$repo" | sed 's|/|%2F|g')
|
|
||||||
|
|
||||||
# GitLab source tarball URL (no release needed, works for any tag).
|
|
||||||
local version_safe="${resolved_tag//\//-}"
|
|
||||||
local tarball_url="https://gitlab.com/${repo}/-/archive/${resolved_tag}/${app_lc}-${version_safe}.tar.gz"
|
|
||||||
|
|
||||||
local tmpdir
|
|
||||||
tmpdir=$(mktemp -d) || return 1
|
|
||||||
local filename="${app_lc}-${version_safe}.tar.gz"
|
|
||||||
|
|
||||||
msg_info "Fetching GitLab tag: ${app} (${resolved_tag})"
|
|
||||||
|
|
||||||
curl $download_timeout -fsSL "${header[@]}" -o "$tmpdir/$filename" "$tarball_url" || {
|
|
||||||
msg_error "Download failed: $tarball_url"
|
|
||||||
rm -rf "$tmpdir"
|
|
||||||
return 7
|
|
||||||
}
|
|
||||||
|
|
||||||
mkdir -p "$target"
|
|
||||||
if [[ "${CLEAN_INSTALL:-0}" == "1" ]]; then
|
|
||||||
rm -rf "${target:?}/"*
|
|
||||||
fi
|
|
||||||
|
|
||||||
tar --no-same-owner -xzf "$tmpdir/$filename" -C "$tmpdir" || {
|
|
||||||
msg_error "Failed to extract tarball"
|
|
||||||
rm -rf "$tmpdir"
|
|
||||||
return 251
|
|
||||||
}
|
|
||||||
|
|
||||||
local unpack_dir
|
|
||||||
unpack_dir=$(find "$tmpdir" -mindepth 1 -maxdepth 1 -type d | head -n1)
|
|
||||||
|
|
||||||
shopt -s dotglob nullglob
|
|
||||||
cp -r "$unpack_dir"/* "$target/"
|
|
||||||
shopt -u dotglob nullglob
|
|
||||||
|
|
||||||
rm -rf "$tmpdir"
|
|
||||||
echo "$resolved_tag" >"$version_file"
|
|
||||||
msg_ok "Deployed ${app} ${resolved_tag} to ${target}"
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
# Checks for new GitHub tag (for repos without releases).
|
# Checks for new GitHub tag (for repos without releases).
|
||||||
#
|
#
|
||||||
|
|||||||
Reference in New Issue
Block a user