mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-03-08 04:08:11 +00:00
Compare commits
18 Commits
2026-03-06
...
pr-update-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bb55e694b2 | ||
|
|
2bb60e2cec | ||
|
|
f0d070b857 | ||
|
|
732de1a5bc | ||
|
|
5d7701275b | ||
|
|
8f557e460d | ||
|
|
148f0121df | ||
|
|
8eb2e58891 | ||
|
|
3ac7216e63 | ||
|
|
80f58e1e07 | ||
|
|
5446706286 | ||
|
|
79ed7e4b73 | ||
|
|
94d95ac5d2 | ||
|
|
a39b457888 | ||
|
|
94ff34d0df | ||
|
|
ff4648b7f3 | ||
|
|
acedb5fb55 | ||
|
|
4bd39e7bae |
21
CHANGELOG.md
21
CHANGELOG.md
@@ -412,6 +412,27 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
||||
|
||||
## 2026-03-07
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Grocy: bump PHP version from 8.3 to 8.5 [@MickLesk](https://github.com/MickLesk) ([#12651](https://github.com/community-scripts/ProxmoxVE/pull/12651))
|
||||
- Check for influxdb3 installation in update_script [@odin568](https://github.com/odin568) ([#12648](https://github.com/community-scripts/ProxmoxVE/pull/12648))
|
||||
- Update Rdtclient to dotnet 10.0 [@asylumexp](https://github.com/asylumexp) ([#12638](https://github.com/community-scripts/ProxmoxVE/pull/12638))
|
||||
- fix(immich): fix update script failing to add Debian testing repo when preferences file already exists [@Copilot](https://github.com/Copilot) ([#12631](https://github.com/community-scripts/ProxmoxVE/pull/12631))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- tools: add interactive GitHub PAT prompt on rate limit / auth failure [@MickLesk](https://github.com/MickLesk) ([#12652](https://github.com/community-scripts/ProxmoxVE/pull/12652))
|
||||
|
||||
### 🌐 Website
|
||||
|
||||
- #### 📝 Script Information
|
||||
|
||||
- Papra: update repository URL to papra-hq/papra [@MickLesk](https://github.com/MickLesk) ([#12650](https://github.com/community-scripts/ProxmoxVE/pull/12650))
|
||||
|
||||
## 2026-03-06
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
@@ -28,8 +28,8 @@ function update_script() {
|
||||
exit
|
||||
fi
|
||||
php_ver=$(php -v | head -n 1 | awk '{print $2}')
|
||||
if [[ ! $php_ver == "8.3"* ]]; then
|
||||
PHP_VERSION="8.3" PHP_APACHE="YES" setup_php
|
||||
if [[ ! $php_ver == "8.5"* ]]; then
|
||||
PHP_VERSION="8.5" PHP_APACHE="YES" setup_php
|
||||
fi
|
||||
if check_for_gh_release "grocy" "grocy/grocy"; then
|
||||
msg_info "Updating grocy"
|
||||
|
||||
6
ct/headers/immichframe
Normal file
6
ct/headers/immichframe
Normal file
@@ -0,0 +1,6 @@
|
||||
____ _ __ ______
|
||||
/ _/___ ___ ____ ___ (_)____/ /_ / ____/________ _____ ___ ___
|
||||
/ // __ `__ \/ __ `__ \/ / ___/ __ \/ /_ / ___/ __ `/ __ `__ \/ _ \
|
||||
_/ // / / / / / / / / / / / /__/ / / / __/ / / / /_/ / / / / / / __/
|
||||
/___/_/ /_/ /_/_/ /_/ /_/_/\___/_/ /_/_/ /_/ \__,_/_/ /_/ /_/\___/
|
||||
|
||||
@@ -36,9 +36,13 @@ function update_script() {
|
||||
exit
|
||||
fi
|
||||
|
||||
if [[ ! -f /etc/apt/preferences.d/preferences ]]; then
|
||||
if ! grep -qE '(^|[[:space:]])testing([[:space:]]|$)' /etc/apt/sources.list.d/debian.sources 2>/dev/null; then
|
||||
msg_info "Adding Debian Testing repo"
|
||||
sed -i 's/ trixie-updates/ trixie-updates testing/g' /etc/apt/sources.list.d/debian.sources
|
||||
if grep -q "trixie-updates" /etc/apt/sources.list.d/debian.sources 2>/dev/null; then
|
||||
sed -i 's/ trixie-updates/ trixie-updates testing/g' /etc/apt/sources.list.d/debian.sources
|
||||
else
|
||||
sed -i '/^[[:space:]]*Suites:.*trixie/ s/$/ testing/' /etc/apt/sources.list.d/debian.sources
|
||||
fi
|
||||
cat <<EOF >/etc/apt/preferences.d/preferences
|
||||
Package: *
|
||||
Pin: release a=unstable
|
||||
|
||||
81
ct/immichframe.sh
Normal file
81
ct/immichframe.sh
Normal file
@@ -0,0 +1,81 @@
|
||||
#!/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: Thiago Canozzo Lahr (tclahr)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/immichFrame/ImmichFrame
|
||||
|
||||
APP="ImmichFrame"
|
||||
var_tags="${var_tags:-photos;slideshow}"
|
||||
var_cpu="${var_cpu:-1}"
|
||||
var_ram="${var_ram:-1024}"
|
||||
var_disk="${var_disk:-8}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
if [[ ! -d /opt/immichframe ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if check_for_gh_release "immichframe" "immichFrame/ImmichFrame"; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop immichframe
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
msg_info "Backing up Configuration"
|
||||
cp -r /opt/immichframe/Config /tmp/immichframe_config.bak
|
||||
msg_ok "Backed up Configuration"
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "immichframe" "immichFrame/ImmichFrame" "tarball" "latest" "/tmp/immichframe"
|
||||
|
||||
msg_info "Setting up ImmichFrame"
|
||||
cd /tmp/immichframe
|
||||
$STD dotnet publish ImmichFrame.WebApi/ImmichFrame.WebApi.csproj \
|
||||
--configuration Release \
|
||||
--runtime linux-x64 \
|
||||
--self-contained false \
|
||||
--output /opt/immichframe
|
||||
|
||||
cd /tmp/immichframe/immichFrame.Web
|
||||
$STD npm ci --silent
|
||||
$STD npm run build
|
||||
rm -rf /opt/immichframe/wwwroot/*
|
||||
cp -r build/* /opt/immichframe/wwwroot
|
||||
rm -rf /tmp/immichframe
|
||||
msg_ok "Setup ImmichFrame"
|
||||
|
||||
msg_info "Restoring Configuration"
|
||||
cp -r /tmp/immichframe_config.bak/* /opt/immichframe/Config/
|
||||
rm -rf /tmp/immichframe_config.bak
|
||||
chown -R immichframe:immichframe /opt/immichframe
|
||||
msg_ok "Restored Configuration"
|
||||
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start immichframe
|
||||
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}:8080${CL}"
|
||||
@@ -23,7 +23,7 @@ function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
if [[ ! -f /usr/bin/influxd ]]; then
|
||||
if [[ ! -f /usr/bin/influxd && ! -f /usr/bin/influxdb3 ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
@@ -39,9 +39,9 @@ function update_script() {
|
||||
|
||||
fetch_and_deploy_gh_release "rdt-client" "rogerfar/rdt-client" "prebuild" "latest" "/opt/rdtc" "RealDebridClient.zip"
|
||||
cp -R /opt/rdtc-backup/appsettings.json /opt/rdtc/
|
||||
if dpkg-query -W dotnet-sdk-8.0 >/dev/null 2>&1; then
|
||||
$STD apt remove --purge -y dotnet-sdk-8.0
|
||||
ensure_dependencies aspnetcore-runtime-9.0
|
||||
if dpkg-query -W aspnetcore-runtime-9.0 >/dev/null 2>&1; then
|
||||
$STD apt remove --purge -y aspnetcore-runtime-9.0
|
||||
ensure_dependencies aspnetcore-runtime-10.0
|
||||
fi
|
||||
rm -rf /opt/rdtc-backup
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generated": "2026-03-07T00:19:56Z",
|
||||
"generated": "2026-03-07T18:06:42Z",
|
||||
"versions": [
|
||||
{
|
||||
"slug": "2fauth",
|
||||
@@ -116,9 +116,9 @@
|
||||
{
|
||||
"slug": "bentopdf",
|
||||
"repo": "alam00000/bentopdf",
|
||||
"version": "v2.4.0",
|
||||
"version": "v2.4.1",
|
||||
"pinned": false,
|
||||
"date": "2026-03-01T14:25:43Z"
|
||||
"date": "2026-03-07T09:14:39Z"
|
||||
},
|
||||
{
|
||||
"slug": "beszel",
|
||||
@@ -284,9 +284,9 @@
|
||||
{
|
||||
"slug": "discopanel",
|
||||
"repo": "nickheyer/discopanel",
|
||||
"version": "v2.0.0",
|
||||
"version": "v2.0.1",
|
||||
"pinned": false,
|
||||
"date": "2026-03-06T08:19:39Z"
|
||||
"date": "2026-03-07T02:43:33Z"
|
||||
},
|
||||
{
|
||||
"slug": "dispatcharr",
|
||||
@@ -438,9 +438,9 @@
|
||||
{
|
||||
"slug": "ghostfolio",
|
||||
"repo": "ghostfolio/ghostfolio",
|
||||
"version": "2.247.0",
|
||||
"version": "2.248.0",
|
||||
"pinned": false,
|
||||
"date": "2026-03-04T07:48:00Z"
|
||||
"date": "2026-03-07T17:24:24Z"
|
||||
},
|
||||
{
|
||||
"slug": "gitea",
|
||||
@@ -452,9 +452,9 @@
|
||||
{
|
||||
"slug": "gitea-mirror",
|
||||
"repo": "RayLabsHQ/gitea-mirror",
|
||||
"version": "v3.12.4",
|
||||
"version": "v3.12.5",
|
||||
"pinned": false,
|
||||
"date": "2026-03-06T05:02:40Z"
|
||||
"date": "2026-03-07T01:30:40Z"
|
||||
},
|
||||
{
|
||||
"slug": "glance",
|
||||
@@ -557,9 +557,9 @@
|
||||
{
|
||||
"slug": "homebox",
|
||||
"repo": "sysadminsmedia/homebox",
|
||||
"version": "v0.24.0",
|
||||
"version": "v0.24.1",
|
||||
"pinned": false,
|
||||
"date": "2026-03-03T16:09:55Z"
|
||||
"date": "2026-03-07T15:41:21Z"
|
||||
},
|
||||
{
|
||||
"slug": "homepage",
|
||||
@@ -613,9 +613,9 @@
|
||||
{
|
||||
"slug": "jackett",
|
||||
"repo": "Jackett/Jackett",
|
||||
"version": "v0.24.1292",
|
||||
"version": "v0.24.1307",
|
||||
"pinned": false,
|
||||
"date": "2026-03-06T05:57:21Z"
|
||||
"date": "2026-03-07T05:55:30Z"
|
||||
},
|
||||
{
|
||||
"slug": "jellystat",
|
||||
@@ -872,9 +872,9 @@
|
||||
{
|
||||
"slug": "metube",
|
||||
"repo": "alexta69/metube",
|
||||
"version": "2026.03.06",
|
||||
"version": "2026.03.07",
|
||||
"pinned": false,
|
||||
"date": "2026-03-06T13:52:56Z"
|
||||
"date": "2026-03-07T14:14:57Z"
|
||||
},
|
||||
{
|
||||
"slug": "miniflux",
|
||||
@@ -1145,9 +1145,9 @@
|
||||
{
|
||||
"slug": "pocketid",
|
||||
"repo": "pocket-id/pocket-id",
|
||||
"version": "v2.3.0",
|
||||
"version": "v2.4.0",
|
||||
"pinned": false,
|
||||
"date": "2026-02-23T19:50:48Z"
|
||||
"date": "2026-03-07T17:51:41Z"
|
||||
},
|
||||
{
|
||||
"slug": "powerdns",
|
||||
@@ -1355,9 +1355,9 @@
|
||||
{
|
||||
"slug": "scanopy",
|
||||
"repo": "scanopy/scanopy",
|
||||
"version": "v0.14.14",
|
||||
"version": "v0.14.15",
|
||||
"pinned": false,
|
||||
"date": "2026-03-06T06:50:38Z"
|
||||
"date": "2026-03-06T23:06:01Z"
|
||||
},
|
||||
{
|
||||
"slug": "scraparr",
|
||||
@@ -1467,9 +1467,9 @@
|
||||
{
|
||||
"slug": "sportarr",
|
||||
"repo": "Sportarr/Sportarr",
|
||||
"version": "v4.0.986.1061",
|
||||
"version": "v4.0.988.1063",
|
||||
"pinned": false,
|
||||
"date": "2026-03-06T01:04:24Z"
|
||||
"date": "2026-03-07T12:15:33Z"
|
||||
},
|
||||
{
|
||||
"slug": "stirling-pdf",
|
||||
@@ -1796,9 +1796,9 @@
|
||||
{
|
||||
"slug": "yubal",
|
||||
"repo": "guillevc/yubal",
|
||||
"version": "v0.6.2",
|
||||
"version": "v0.6.3",
|
||||
"pinned": false,
|
||||
"date": "2026-02-24T15:15:46Z"
|
||||
"date": "2026-03-07T03:24:05Z"
|
||||
},
|
||||
{
|
||||
"slug": "zerobyte",
|
||||
|
||||
40
frontend/public/json/immichframe.json
Normal file
40
frontend/public/json/immichframe.json
Normal file
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"name": "ImmichFrame",
|
||||
"slug": "immichframe",
|
||||
"categories": [
|
||||
13
|
||||
],
|
||||
"date_created": "2026-02-26",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 8080,
|
||||
"documentation": "https://immichframe.dev/docs/overview",
|
||||
"config_path": "/opt/immichframe/Config/Settings.yml",
|
||||
"website": "https://immichframe.dev/",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/immich-frame.webp",
|
||||
"description": "ImmichFrame is a digital photo frame web application that connects to your Immich server and displays your photos as a fullscreen slideshow.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/immichframe.sh",
|
||||
"resources": {
|
||||
"cpu": 1,
|
||||
"ram": 1024,
|
||||
"hdd": 8,
|
||||
"os": "Debian",
|
||||
"version": "13"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": [
|
||||
{
|
||||
"text": "After installation, edit `/opt/immichframe/Config/Settings.yml` and set ImmichServerUrl and ApiKey. Then restart the service with `systemctl restart immichframe`.",
|
||||
"type": "warning"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -9,8 +9,8 @@
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 1221,
|
||||
"documentation": "https://github.com/CorentinTh/papra",
|
||||
"website": "https://github.com/CorentinTh/papra",
|
||||
"documentation": "https://github.com/papra-hq/papra",
|
||||
"website": "https://github.com/papra-hq/papra",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/papra.webp",
|
||||
"config_path": "/opt/papra/.env",
|
||||
"description": "Papra is a modern, self-hosted document management system with full-text search, OCR support, and automatic document processing. Built with Node.js and featuring a clean web interface for organizing and managing your documents.",
|
||||
|
||||
@@ -17,7 +17,7 @@ msg_info "Installing Dependencies"
|
||||
$STD apt install -y apt-transport-https
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
PHP_VERSION="8.3" PHP_APACHE="YES" setup_php
|
||||
PHP_VERSION="8.5" PHP_APACHE="YES" setup_php
|
||||
fetch_and_deploy_gh_release "grocy" "grocy/grocy" "prebuild" "latest" "/var/www/html" "grocy*.zip"
|
||||
|
||||
msg_info "Configuring grocy"
|
||||
|
||||
84
install/immichframe-install.sh
Normal file
84
install/immichframe-install.sh
Normal file
@@ -0,0 +1,84 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: Thiago Canozzo Lahr (tclahr)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/immichFrame/ImmichFrame
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
setup_deb822_repo \
|
||||
"microsoft" \
|
||||
"https://packages.microsoft.com/keys/microsoft-2025.asc" \
|
||||
"https://packages.microsoft.com/debian/13/prod/" \
|
||||
"trixie" \
|
||||
"main"
|
||||
$STD apt install -y \
|
||||
libicu-dev \
|
||||
libssl-dev \
|
||||
gettext-base \
|
||||
dotnet-sdk-8.0 \
|
||||
aspnetcore-runtime-8.0
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
fetch_and_deploy_gh_release "immichframe" "immichFrame/ImmichFrame" "tarball" "latest" "/tmp/immichframe"
|
||||
|
||||
msg_info "Setting up ImmichFrame"
|
||||
mkdir -p /opt/immichframe
|
||||
cd /tmp/immichframe
|
||||
$STD dotnet publish ImmichFrame.WebApi/ImmichFrame.WebApi.csproj \
|
||||
--configuration Release \
|
||||
--runtime linux-x64 \
|
||||
--self-contained false \
|
||||
--output /opt/immichframe
|
||||
cd /tmp/immichframe/immichFrame.Web
|
||||
$STD npm ci
|
||||
$STD npm run build
|
||||
cp -r build/* /opt/immichframe/wwwroot
|
||||
$STD apt remove -y dotnet-sdk-8.0
|
||||
$STD apt autoremove -y
|
||||
rm -rf /tmp/immichframe
|
||||
mkdir -p /opt/immichframe/Config
|
||||
curl -fsSL "https://raw.githubusercontent.com/immichFrame/ImmichFrame/main/docker/Settings.example.yml" -o /opt/immichframe/Config/Settings.yml
|
||||
useradd -r -s /sbin/nologin -d /opt/immichframe -M immichframe
|
||||
chown -R immichframe:immichframe /opt/immichframe
|
||||
msg_ok "Setup ImmichFrame"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/immichframe.service
|
||||
[Unit]
|
||||
Description=ImmichFrame Digital Photo Frame
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=immichframe
|
||||
Group=immichframe
|
||||
WorkingDirectory=/opt/immichframe
|
||||
ExecStart=/usr/bin/dotnet /opt/immichframe/ImmichFrame.WebApi.dll
|
||||
Environment=ASPNETCORE_URLS=http://0.0.0.0:8080
|
||||
Environment=ASPNETCORE_ENVIRONMENT=Production
|
||||
Environment=DOTNET_CONTENTROOT=/opt/immichframe
|
||||
Restart=always
|
||||
RestartSec=5
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
SyslogIdentifier=immichframe
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now immichframe
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
@@ -19,7 +19,7 @@ setup_deb822_repo \
|
||||
"https://packages.microsoft.com/keys/microsoft-2025.asc" \
|
||||
"https://packages.microsoft.com/debian/13/prod/" \
|
||||
"trixie"
|
||||
$STD apt install -y aspnetcore-runtime-9.0
|
||||
$STD apt install -y aspnetcore-runtime-10.0
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
fetch_and_deploy_gh_release "rdt-client" "rogerfar/rdt-client" "prebuild" "latest" "/opt/rdtc" "RealDebridClient.zip"
|
||||
|
||||
@@ -1079,6 +1079,44 @@ is_package_installed() {
|
||||
dpkg-query -W -f='${Status}' "$package" 2>/dev/null | grep -q "^install ok installed$"
|
||||
}
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# Prompt user to enter a GitHub Personal Access Token (PAT) interactively
|
||||
# Returns 0 if a valid token was provided, 1 otherwise
|
||||
# ------------------------------------------------------------------------------
|
||||
prompt_for_github_token() {
|
||||
if [[ ! -t 0 ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
local reply
|
||||
read -rp "${TAB}Would you like to enter a GitHub Personal Access Token (PAT)? [y/N]: " reply
|
||||
reply="${reply:-n}"
|
||||
|
||||
if [[ ! "${reply,,}" =~ ^(y|yes)$ ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
local token
|
||||
while true; do
|
||||
read -rp "${TAB}Enter your GitHub PAT: " token
|
||||
# Trim leading/trailing whitespace
|
||||
token="$(echo "$token" | xargs)"
|
||||
if [[ -z "$token" ]]; then
|
||||
msg_warn "Token cannot be empty. Please try again."
|
||||
continue
|
||||
fi
|
||||
if [[ "$token" =~ [[:space:]] ]]; then
|
||||
msg_warn "Token must not contain spaces. Please try again."
|
||||
continue
|
||||
fi
|
||||
break
|
||||
done
|
||||
|
||||
export GITHUB_TOKEN="$token"
|
||||
msg_ok "GitHub token has been set."
|
||||
return 0
|
||||
}
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# GitHub API call with authentication and rate limit handling
|
||||
# ------------------------------------------------------------------------------
|
||||
@@ -1091,7 +1129,8 @@ github_api_call() {
|
||||
local header_args=()
|
||||
[[ -n "${GITHUB_TOKEN:-}" ]] && header_args=(-H "Authorization: Bearer $GITHUB_TOKEN")
|
||||
|
||||
for attempt in $(seq 1 $max_retries); do
|
||||
local attempt=1
|
||||
while ((attempt <= max_retries)); do
|
||||
local http_code
|
||||
http_code=$(curl -sSL -w "%{http_code}" -o "$output_file" \
|
||||
-H "Accept: application/vnd.github+json" \
|
||||
@@ -1108,7 +1147,11 @@ github_api_call() {
|
||||
if [[ -n "${GITHUB_TOKEN:-}" ]]; then
|
||||
msg_error "Your GITHUB_TOKEN appears to be invalid or expired."
|
||||
else
|
||||
msg_error "The repository may require authentication. Try: export GITHUB_TOKEN=\"ghp_your_token\""
|
||||
msg_error "The repository may require authentication."
|
||||
fi
|
||||
if prompt_for_github_token; then
|
||||
header_args=(-H "Authorization: Bearer $GITHUB_TOKEN")
|
||||
continue
|
||||
fi
|
||||
return 1
|
||||
;;
|
||||
@@ -1118,9 +1161,16 @@ github_api_call() {
|
||||
msg_warn "GitHub API rate limit, waiting ${retry_delay}s... (attempt $attempt/$max_retries)"
|
||||
sleep "$retry_delay"
|
||||
retry_delay=$((retry_delay * 2))
|
||||
((attempt++))
|
||||
continue
|
||||
fi
|
||||
msg_error "GitHub API rate limit exceeded (HTTP 403)."
|
||||
if prompt_for_github_token; then
|
||||
header_args=(-H "Authorization: Bearer $GITHUB_TOKEN")
|
||||
retry_delay=2
|
||||
attempt=1
|
||||
continue
|
||||
fi
|
||||
msg_error "To increase the limit, export a GitHub token before running the script:"
|
||||
msg_error " export GITHUB_TOKEN=\"ghp_your_token_here\""
|
||||
return 1
|
||||
@@ -1132,6 +1182,7 @@ github_api_call() {
|
||||
000 | "")
|
||||
if [[ $attempt -lt $max_retries ]]; then
|
||||
sleep "$retry_delay"
|
||||
((attempt++))
|
||||
continue
|
||||
fi
|
||||
msg_error "GitHub API connection failed (no response)."
|
||||
@@ -1141,12 +1192,14 @@ github_api_call() {
|
||||
*)
|
||||
if [[ $attempt -lt $max_retries ]]; then
|
||||
sleep "$retry_delay"
|
||||
((attempt++))
|
||||
continue
|
||||
fi
|
||||
msg_error "GitHub API call failed (HTTP $http_code)."
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
((attempt++))
|
||||
done
|
||||
|
||||
msg_error "GitHub API call failed after ${max_retries} attempts: ${url}"
|
||||
@@ -3123,11 +3176,30 @@ function fetch_and_deploy_gh_release() {
|
||||
if [[ "$http_code" == "200" ]]; then
|
||||
success=true
|
||||
break
|
||||
elif [[ "$http_code" == "401" ]]; then
|
||||
msg_error "GitHub API authentication failed (HTTP 401)."
|
||||
if [[ -n "${GITHUB_TOKEN:-}" ]]; then
|
||||
msg_error "Your GITHUB_TOKEN appears to be invalid or expired."
|
||||
else
|
||||
msg_error "The repository may require authentication."
|
||||
fi
|
||||
if prompt_for_github_token; then
|
||||
header=(-H "Authorization: token $GITHUB_TOKEN")
|
||||
continue
|
||||
fi
|
||||
break
|
||||
elif [[ "$http_code" == "403" ]]; then
|
||||
if ((attempt < max_retries)); then
|
||||
msg_warn "GitHub API rate limit hit, retrying in ${retry_delay}s... (attempt $attempt/$max_retries)"
|
||||
sleep "$retry_delay"
|
||||
retry_delay=$((retry_delay * 2))
|
||||
else
|
||||
msg_error "GitHub API rate limit exceeded (HTTP 403)."
|
||||
if prompt_for_github_token; then
|
||||
header=(-H "Authorization: token $GITHUB_TOKEN")
|
||||
retry_delay=2
|
||||
attempt=0
|
||||
fi
|
||||
fi
|
||||
else
|
||||
sleep "$retry_delay"
|
||||
@@ -3136,21 +3208,10 @@ function fetch_and_deploy_gh_release() {
|
||||
done
|
||||
|
||||
if ! $success; then
|
||||
if [[ "$http_code" == "401" ]]; then
|
||||
msg_error "GitHub API authentication failed (HTTP 401)."
|
||||
if [[ -n "${GITHUB_TOKEN:-}" ]]; then
|
||||
msg_error "Your GITHUB_TOKEN appears to be invalid or expired."
|
||||
else
|
||||
msg_error "The repository may require authentication. Try: export GITHUB_TOKEN=\"ghp_your_token\""
|
||||
fi
|
||||
elif [[ "$http_code" == "403" ]]; then
|
||||
msg_error "GitHub API rate limit exceeded (HTTP 403)."
|
||||
msg_error "To increase the limit, export a GitHub token before running the script:"
|
||||
msg_error " export GITHUB_TOKEN=\"ghp_your_token_here\""
|
||||
elif [[ "$http_code" == "000" || -z "$http_code" ]]; then
|
||||
if [[ "$http_code" == "000" || -z "$http_code" ]]; then
|
||||
msg_error "GitHub API connection failed (no response)."
|
||||
msg_error "Check your network/DNS: curl -sSL https://api.github.com/rate_limit"
|
||||
else
|
||||
elif [[ "$http_code" != "401" ]]; then
|
||||
msg_error "Failed to fetch release metadata (HTTP $http_code)"
|
||||
fi
|
||||
return 1
|
||||
|
||||
Reference in New Issue
Block a user