Compare commits

..

2 Commits

Author SHA1 Message Date
f690a74664 update mysql 2025-07-09 14:23:51 +02:00
422bb0a01f Refactor: Ghost 2025-07-09 14:15:24 +02:00
28 changed files with 532 additions and 598 deletions

43
.github/autolabeler-config.json generated vendored
View File

@ -4,7 +4,6 @@
"fileStatus": "added", "fileStatus": "added",
"includeGlobs": [ "includeGlobs": [
"ct/**", "ct/**",
"tools/**",
"install/**", "install/**",
"misc/**", "misc/**",
"turnkey/**", "turnkey/**",
@ -18,13 +17,16 @@
"fileStatus": "modified", "fileStatus": "modified",
"includeGlobs": [ "includeGlobs": [
"ct/**", "ct/**",
"tools/**",
"install/**", "install/**",
"misc/**", "misc/**",
"turnkey/**", "turnkey/**",
"vm/**" "vm/**"
], ],
"excludeGlobs": [] "excludeGlobs": [
"misc/build.func",
"misc/install.func",
"misc/api.func"
]
} }
], ],
"delete script": [ "delete script": [
@ -32,7 +34,6 @@
"fileStatus": "removed", "fileStatus": "removed",
"includeGlobs": [ "includeGlobs": [
"ct/**", "ct/**",
"tools/**",
"install/**", "install/**",
"misc/**", "misc/**",
"turnkey/**", "turnkey/**",
@ -45,7 +46,11 @@
{ {
"fileStatus": null, "fileStatus": null,
"includeGlobs": [ "includeGlobs": [
"*.md" "*.md",
".github/**",
"misc/*.func",
"misc/create_lxc.sh",
"api/**"
], ],
"excludeGlobs": [] "excludeGlobs": []
} }
@ -57,9 +62,7 @@
"misc/*.func", "misc/*.func",
"misc/create_lxc.sh" "misc/create_lxc.sh"
], ],
"excludeGlobs": [ "excludeGlobs": []
"misc/api.func"
]
} }
], ],
"website": [ "website": [
@ -68,9 +71,7 @@
"includeGlobs": [ "includeGlobs": [
"frontend/**" "frontend/**"
], ],
"excludeGlobs": [ "excludeGlobs": []
"frontend/public/json/**"
]
} }
], ],
"api": [ "api": [
@ -101,6 +102,26 @@
"excludeGlobs": [] "excludeGlobs": []
} }
], ],
"high risk": [
{
"fileStatus": null,
"includeGlobs": [
"misc/build.func",
"misc/install.func",
"misc/create_lxc.sh"
],
"excludeGlobs": []
}
],
"documentation": [
{
"fileStatus": null,
"includeGlobs": [
"*.md"
],
"excludeGlobs": []
}
],
"addon": [ "addon": [
{ {
"fileStatus": null, "fileStatus": null,

120
.github/changelog-pr-config.json generated vendored
View File

@ -1,148 +1,112 @@
[ [
{ {
"title": "🆕 New Scripts", "title": "🆕 New Scripts",
"labels": [ "labels": ["new script"]
"new script"
]
}, },
{ {
"title": "🚀 Updated Scripts", "title": "🚀 Updated Scripts",
"labels": [ "labels": ["update script"],
"update script"
],
"subCategories": [ "subCategories": [
{ {
"title": "🐞 Bug Fixes", "title": "🐞 Bug Fixes",
"labels": [ "labels": ["bugfix"],
"bugfix" "notes" : []
],
"notes": []
}, },
{ {
"title": "✨ New Features", "title": "✨ New Features",
"labels": [ "labels": ["feature"],
"feature" "notes" : []
],
"notes": []
}, },
{ {
"title": "💥 Breaking Changes", "title": "💥 Breaking Changes",
"labels": [ "labels": ["breaking change"],
"breaking change" "notes" : []
],
"notes": []
}, },
{ {
"title": "🔧 Refactor", "title": "🔧 Refactor",
"labels": [ "labels": ["refactor"],
"refactor" "notes" : []
],
"notes": []
} }
] ]
}, },
{ {
"title": "🧰 Maintenance", "title": "🧰 Maintenance",
"labels": [ "labels": ["maintenance"],
"maintenance"
],
"subCategories": [ "subCategories": [
{ {
"title": "🐞 Bug Fixes", "title": "🐞 Bug Fixes",
"labels": [ "labels": ["bugfix"],
"bugfix" "notes" : []
],
"notes": []
}, },
{ {
"title": "✨ New Features", "title": "✨ New Features",
"labels": [ "labels": ["feature"],
"feature" "notes" : []
],
"notes": []
}, },
{ {
"title": "💥 Breaking Changes", "title": "💥 Breaking Changes",
"labels": [ "labels": ["breaking change"],
"breaking change" "notes" : []
],
"notes": []
}, },
{ {
"title": "📡 API", "title": "📡 API",
"labels": [ "labels": ["api"],
"api" "notes" : []
],
"notes": []
}, },
{ {
"title": "💾 Core", "title": "💾 Core",
"labels": [ "labels": ["core"],
"core" "notes" : []
],
"notes": []
}, },
{ {
"title": "📂 Github", "title": "📂 Github",
"labels": [ "labels": ["github"],
"github" "notes" : []
],
"notes": []
}, },
{ {
"title": "📝 Documentation", "title" :"📝 Documentation",
"labels": [ "labels": ["documentation"],
"maintenance" "notes" : []
],
"notes": []
}, },
{ {
"title": "🔧 Refactor", "title" :"🔧 Refactor",
"labels": [ "labels": ["refactor"],
"refactor" "notes" : []
],
"notes": []
} }
] ]
}, },
{ {
"title": "🌐 Website", "title": "🌐 Website",
"labels": [ "labels": ["website"],
"website"
],
"subCategories": [ "subCategories": [
{ {
"title": "🐞 Bug Fixes", "title": "🐞 Bug Fixes",
"labels": [ "labels": ["bugfix"],
"bugfix" "notes" : []
],
"notes": []
}, },
{ {
"title": "✨ New Features", "title": "✨ New Features",
"labels": [ "labels": ["feature"],
"feature" "notes" : []
],
"notes": []
}, },
{ {
"title": "💥 Breaking Changes", "title": "💥 Breaking Changes",
"labels": [ "labels": ["breaking change"],
"breaking change" "notes" : []
],
"notes": []
}, },
{ {
"title": "📝 Script Information", "title": "📝 Script Information",
"labels": [ "labels": ["json"],
"json" "notes" : []
],
"notes": []
} }
] ]
}, },
{ {
"title": "❔ Unlabelled", "title": "❔ Unlabelled",
"labels": [] "labels": []
},
{
"title": "💥 Breaking Changes",
"labels": ["breaking change"]
} }
] ]

24
.github/workflows/autolabeler.yml generated vendored
View File

@ -34,7 +34,7 @@ jobs:
const autolabelerConfig = JSON.parse(fileContent); const autolabelerConfig = JSON.parse(fileContent);
const prNumber = context.payload.pull_request.number; const prNumber = context.payload.pull_request.number;
const prBody = context.payload.pull_request.body || ""; const prBody = context.payload.pull_request.body.toLowerCase();
let labelsToAdd = new Set(); let labelsToAdd = new Set();
@ -74,35 +74,19 @@ jobs:
"✨ **New feature**": "feature", "✨ **New feature**": "feature",
"💥 **Breaking change**": "breaking change", "💥 **Breaking change**": "breaking change",
"🆕 **New script**": "new script", "🆕 **New script**": "new script",
"🌍 **Website update**": "website", // handled special "🌍 **Website update**": "website",
"🔧 **Refactoring / Code Cleanup**": "refactor", "🔧 **Refactoring / Code Cleanup**": "refactor",
"📝 **Documentation update**": "documentation" // mapped to maintenance "📝 **Documentation update**": "documentation"
}; };
for (const [checkbox, label] of Object.entries(templateLabelMappings)) { for (const [checkbox, label] of Object.entries(templateLabelMappings)) {
const escapedCheckbox = checkbox.replace(/([.*+?^=!:${}()|[\]\/\\])/g, "\\$1"); const escapedCheckbox = checkbox.replace(/([.*+?^=!:${}()|[\]\/\\])/g, "\\$1");
const regex = new RegExp(`- \\[(x|X)\\]\\s*${escapedCheckbox}`, "i"); const regex = new RegExp(`- \\[(x|X)\\]\\s*${escapedCheckbox}`, "i");
if (regex.test(prBody)) { if (regex.test(prBody)) {
if (label === "website") { labelsToAdd.add(label);
const hasJson = prFiles.some((f) => f.filename.startsWith("frontend/public/json/"));
const hasUpdateScript = labelsToAdd.has("update script");
const hasContentLabel = ["bugfix", "feature", "refactor"].some((l) => labelsToAdd.has(l));
if (!(hasUpdateScript && hasContentLabel)) {
labelsToAdd.add(hasJson ? "json" : "website");
}
} else if (label === "documentation") {
labelsToAdd.add("maintenance");
} else {
labelsToAdd.add(label);
}
} }
} }
} }
if (labelsToAdd.size === 0) {
labelsToAdd.add("needs triage");
}
if (labelsToAdd.size > 0) { if (labelsToAdd.size > 0) {
await github.rest.issues.addLabels({ await github.rest.issues.addLabels({

2
.github/workflows/changelog-pr.yml generated vendored
View File

@ -80,7 +80,7 @@ jobs:
{ title: "💥 Breaking Changes", labels: ["breaking change"], notes: [] }, { title: "💥 Breaking Changes", labels: ["breaking change"], notes: [] },
{ title: "📡 API", labels: ["api"], notes: [] }, { title: "📡 API", labels: ["api"], notes: [] },
{ title: "Github", labels: ["github"], notes: [] }, { title: "Github", labels: ["github"], notes: [] },
{ title: "📝 Documentation", labels: ["maintenance"], notes: [] }, { title: "📝 Documentation", labels: ["documentation"], notes: [] },
{ title: "🔧 Refactor", labels: ["refactor"], notes: [] } { title: "🔧 Refactor", labels: ["refactor"], notes: [] }
] : ] :
obj.labels.includes("website") ? [ obj.labels.includes("website") ? [

View File

@ -10,53 +10,22 @@
> [!CAUTION] > [!CAUTION]
Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes. Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes.
## 2025-07-10
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- PLANKA: Fix paths to application directory [@tremor021](https://github.com/tremor021) ([#5900](https://github.com/community-scripts/ProxmoxVE/pull/5900))
## 2025-07-09 ## 2025-07-09
### 🚀 Updated Scripts ### 🚀 Updated Scripts
- #### 🐞 Bug Fixes - #### 🐞 Bug Fixes
- Omada Update: add missing exit [@MickLesk](https://github.com/MickLesk) ([#5894](https://github.com/community-scripts/ProxmoxVE/pull/5894))
- FreshRSS: fix needed php modules [@MickLesk](https://github.com/MickLesk) ([#5886](https://github.com/community-scripts/ProxmoxVE/pull/5886))
- core: Fix VAAPI passthrough for unprivileged LXC containers via devX [@MickLesk](https://github.com/MickLesk) ([#5875](https://github.com/community-scripts/ProxmoxVE/pull/5875))
- tools.func: fix an bug while php libapache2-mod breaks [@MickLesk](https://github.com/MickLesk) ([#5857](https://github.com/community-scripts/ProxmoxVE/pull/5857))
- BabyBuddy: fix path issues for update [@MickLesk](https://github.com/MickLesk) ([#5856](https://github.com/community-scripts/ProxmoxVE/pull/5856)) - BabyBuddy: fix path issues for update [@MickLesk](https://github.com/MickLesk) ([#5856](https://github.com/community-scripts/ProxmoxVE/pull/5856))
- tools.func: fix an bug while php libapache2-mod breaks [@MickLesk](https://github.com/MickLesk) ([#5857](https://github.com/community-scripts/ProxmoxVE/pull/5857))
- #### ✨ New Features
- tools.func: strip leading folders for prebuild assets [@MickLesk](https://github.com/MickLesk) ([#5865](https://github.com/community-scripts/ProxmoxVE/pull/5865))
- #### 💥 Breaking Changes
- Refactor: Stirling-PDF [@MickLesk](https://github.com/MickLesk) ([#5872](https://github.com/community-scripts/ProxmoxVE/pull/5872))
- #### 🔧 Refactor - #### 🔧 Refactor
- Refactor: EMQX [@tremor021](https://github.com/tremor021) ([#5840](https://github.com/community-scripts/ProxmoxVE/pull/5840))
- Refactor: Excalidraw [@tremor021](https://github.com/tremor021) ([#5841](https://github.com/community-scripts/ProxmoxVE/pull/5841))
- Refactor: Firefly [@tremor021](https://github.com/tremor021) ([#5844](https://github.com/community-scripts/ProxmoxVE/pull/5844))
- Refactor: gatus [@tremor021](https://github.com/tremor021) ([#5849](https://github.com/community-scripts/ProxmoxVE/pull/5849))
- Refactor: FreshRSS [@tremor021](https://github.com/tremor021) ([#5847](https://github.com/community-scripts/ProxmoxVE/pull/5847)) - Refactor: FreshRSS [@tremor021](https://github.com/tremor021) ([#5847](https://github.com/community-scripts/ProxmoxVE/pull/5847))
- Refactor: Fluid-Calendar [@tremor021](https://github.com/tremor021) ([#5846](https://github.com/community-scripts/ProxmoxVE/pull/5846)) - Refactor: Fluid-Calendar [@tremor021](https://github.com/tremor021) ([#5846](https://github.com/community-scripts/ProxmoxVE/pull/5846))
- Refactor: Commafeed [@tremor021](https://github.com/tremor021) ([#5802](https://github.com/community-scripts/ProxmoxVE/pull/5802)) - Refactor: EMQX [@tremor021](https://github.com/tremor021) ([#5840](https://github.com/community-scripts/ProxmoxVE/pull/5840))
- Refactor: FlareSolverr [@tremor021](https://github.com/tremor021) ([#5845](https://github.com/community-scripts/ProxmoxVE/pull/5845)) - Refactor: Excalidraw [@tremor021](https://github.com/tremor021) ([#5841](https://github.com/community-scripts/ProxmoxVE/pull/5841))
- Refactor: Glance [@tremor021](https://github.com/tremor021) ([#5874](https://github.com/community-scripts/ProxmoxVE/pull/5874)) - Refactor: gatus [@tremor021](https://github.com/tremor021) ([#5849](https://github.com/community-scripts/ProxmoxVE/pull/5849))
- Refactor: Gitea [@tremor021](https://github.com/tremor021) ([#5876](https://github.com/community-scripts/ProxmoxVE/pull/5876))
- Refactor: Ghost (use now MySQL) [@MickLesk](https://github.com/MickLesk) ([#5871](https://github.com/community-scripts/ProxmoxVE/pull/5871))
### 🧰 Maintenance
- #### 📂 Github
- Github: AutoLabler | ChangeLog (Refactor) [@MickLesk](https://github.com/MickLesk) ([#5868](https://github.com/community-scripts/ProxmoxVE/pull/5868))
## 2025-07-08 ## 2025-07-08

View File

@ -23,13 +23,12 @@ function update_script() {
header_info header_info
check_container_storage check_container_storage
check_container_resources check_container_resources
if [[ ! -d /opt/commafeed ]]; then if [[ ! -d /opt/commafeed ]]; then
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit exit
fi fi
RELEASE=$(curl -fsSL https://api.github.com/repos/Athou/commafeed/releases/latest | grep '"tag_name":' | cut -d'"' -f4) RELEASE=$(curl -fsSL https://api.github.com/repos/Athou/commafeed/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
if [[ "${RELEASE}" != "$(cat ~/.commafeed 2>/dev/null)" ]] || [[ ! -f ~/.commafeed ]]; then if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Stopping ${APP}" msg_info "Stopping ${APP}"
systemctl stop commafeed systemctl stop commafeed
msg_ok "Stopped ${APP}" msg_ok "Stopped ${APP}"
@ -40,15 +39,13 @@ function update_script() {
$STD apt-get install -y rsync $STD apt-get install -y rsync
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
fi fi
if [ -d /opt/commafeed/data ] && [ "$(ls -A /opt/commafeed/data)" ]; then
mv /opt/commafeed/data /opt/data.bak
fi
fetch_and_deploy_gh_release "commafeed" "Athou/commafeed" "prebuild" "latest" "/opt/commafeed" "commafeed-*-h2-jvm.zip"
msg_info "Updating ${APP} to ${RELEASE}" msg_info "Updating ${APP} to ${RELEASE}"
if [ -d /opt/commafeed/data.bak ] && [ "$(ls -A /opt/commafeed/data.bak)" ]; then curl -fsSL "https://github.com/Athou/commafeed/releases/download/${RELEASE}/commafeed-${RELEASE}-h2-jvm.zip" -o $(basename "https://github.com/Athou/commafeed/releases/download/${RELEASE}/commafeed-${RELEASE}-h2-jvm.zip")
mv /opt/commafeed/data.bak /opt/commafeed/data $STD unzip commafeed-"${RELEASE}"-h2-jvm.zip
fi rsync -a --exclude 'data/' commafeed-"${RELEASE}"-h2/ /opt/commafeed/
rm -rf commafeed-"${RELEASE}"-h2 commafeed-"${RELEASE}"-h2-jvm.zip
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated ${APP} to ${RELEASE}" msg_ok "Updated ${APP} to ${RELEASE}"
msg_info "Starting ${APP}" msg_info "Starting ${APP}"

View File

@ -29,20 +29,17 @@ function update_script() {
exit exit
fi fi
RELEASE=$(curl -fsSL https://api.github.com/repos/firefly-iii/firefly-iii/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4)}') RELEASE=$(curl -fsSL https://api.github.com/repos/firefly-iii/firefly-iii/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4)}')
if [[ "${RELEASE}" != "$(cat ~/.firefly 2>/dev/null)" ]] || [[ ! -f ~/.firefly ]]; then if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Stopping Apache2" msg_info "Stopping Apache2"
systemctl stop apache2 systemctl stop apache2
msg_ok "Stopped Apache2" msg_ok "Stopped Apache2"
msg_info "Backing up data" msg_info "Updating ${APP} to v${RELEASE}"
cp /opt/firefly/.env /opt/.env cp /opt/firefly/.env /opt/.env
cp -r /opt/firefly/storage /opt/storage cp -r /opt/firefly/storage /opt/storage
msg_ok "Backed up data" cd /opt
curl -fsSL "https://github.com/firefly-iii/firefly-iii/releases/download/v${RELEASE}/FireflyIII-v${RELEASE}.tar.gz" -o $(basename "https://github.com/firefly-iii/firefly-iii/releases/download/v${RELEASE}/FireflyIII-v${RELEASE}.tar.gz")
fetch_and_deploy_gh_release "firefly" "firefly-iii/firefly-iii" tar -xzf FireflyIII-v${RELEASE}.tar.gz -C /opt/firefly --exclude='storage'
msg_info "Updating ${APP} to v${RELEASE}"
rm -rf /opt/firefly/storage
cp /opt/.env /opt/firefly/.env cp /opt/.env /opt/firefly/.env
cp -r /opt/storage /opt/firefly/storage cp -r /opt/storage /opt/firefly/storage
cd /opt/firefly cd /opt/firefly
@ -53,12 +50,16 @@ function update_script() {
$STD php artisan view:clear $STD php artisan view:clear
$STD php artisan firefly-iii:upgrade-database $STD php artisan firefly-iii:upgrade-database
$STD php artisan firefly-iii:laravel-passport-keys $STD php artisan firefly-iii:laravel-passport-keys
echo "${RELEASE}" >"/opt/${APP}_version.txt"
msg_ok "Updated ${APP} to v${RELEASE}" msg_ok "Updated ${APP} to v${RELEASE}"
msg_info "Starting Apache2" msg_info "Starting Apache2"
systemctl start apache2 systemctl start apache2
msg_ok "Started Apache2" msg_ok "Started Apache2"
msg_info "Cleaning up"
rm -rf /opt/FireflyIII-v${RELEASE}.tar.gz
msg_ok "Cleaned"
msg_ok "Updated Successfully" msg_ok "Updated Successfully"
else else
msg_ok "No update required. ${APP} is already at v${RELEASE}." msg_ok "No update required. ${APP} is already at v${RELEASE}."

View File

@ -23,23 +23,20 @@ function update_script() {
header_info header_info
check_container_storage check_container_storage
check_container_resources check_container_resources
if [[ ! -f /etc/systemd/system/flaresolverr.service ]]; then if [[ ! -f /etc/systemd/system/flaresolverr.service ]]; then
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit exit
fi fi
RELEASE=$(curl -fsSL https://api.github.com/repos/FlareSolverr/FlareSolverr/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4)}') RELEASE=$(curl -fsSL https://github.com/FlareSolverr/FlareSolverr/releases/latest | grep "title>Release" | cut -d " " -f 4)
if [[ "${RELEASE}" != "$(cat ~/.flaresolverr 2>/dev/null)" ]] || [[ ! -f ~/.flaresolverr ]]; then if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
msg_info "Stopping service" msg_info "Updating $APP LXC"
systemctl stop flaresolverr systemctl stop flaresolverr
msg_ok "Stopped service" curl -fsSL "https://github.com/FlareSolverr/FlareSolverr/releases/download/$RELEASE/flaresolverr_linux_x64.tar.gz" -o $(basename "https://github.com/FlareSolverr/FlareSolverr/releases/download/$RELEASE/flaresolverr_linux_x64.tar.gz")
tar -xzf flaresolverr_linux_x64.tar.gz -C /opt
rm -rf /opt/flaresolverr rm flaresolverr_linux_x64.tar.gz
fetch_and_deploy_gh_release "flaresolverr" "FlareSolverr/FlareSolverr" "prebuild" "latest" "/opt/flaresolverr" "flaresolverr_linux_x64.tar.gz"
msg_info "Starting service"
systemctl start flaresolverr systemctl start flaresolverr
msg_ok "Started service" echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated $APP LXC"
else else
msg_ok "No update required. ${APP} is already at ${RELEASE}" msg_ok "No update required. ${APP} is already at ${RELEASE}"
fi fi

View File

@ -20,33 +20,24 @@ color
catch_errors catch_errors
function update_script() { function update_script() {
header_info header_info
check_container_storage check_container_storage
check_container_resources check_container_resources
if [[ ! -f /usr/local/bin/gitea ]]; then
if [[ ! -f /usr/local/bin/gitea ]]; then msg_error "No ${APP} Installation Found!"
msg_error "No ${APP} Installation Found!" exit
exit fi
fi RELEASE=$(curl -fsSL https://github.com/go-gitea/gitea/releases/latest | grep "title>Release" | cut -d " " -f 4 | sed 's/^v//')
RELEASE=$(curl -fsSL https://github.com/go-gitea/gitea/releases/latest | grep "title>Release" | cut -d " " -f 4 | sed 's/^v//') msg_info "Updating $APP to ${RELEASE}"
if [[ "${RELEASE}" != "$(cat ~/.gitea 2>/dev/null)" ]] || [[ ! -f ~/.gitea ]]; then FILENAME="gitea-$RELEASE-linux-amd64"
msg_info "Stopping service" curl -fsSL "https://github.com/go-gitea/gitea/releases/download/v$RELEASE/gitea-$RELEASE-linux-amd64" -o $FILENAME
systemctl stop gitea systemctl stop gitea
msg_ok "Service stopped" rm -rf /usr/local/bin/gitea
mv $FILENAME /usr/local/bin/gitea
rm -rf /usr/local/bin/gitea chmod +x /usr/local/bin/gitea
fetch_and_deploy_gh_release "gitea" "go-gitea/gitea" "singlefile" "latest" "/usr/local/bin" "gitea-*-linux-amd64" systemctl start gitea
chmod +x /usr/local/bin/gitea msg_ok "Updated $APP Successfully"
exit
msg_info "Starting service"
systemctl start gitea
msg_ok "Started service"
msg_ok "Update Successful"
else
msg_ok "No update required. ${APP} is already at ${RELEASE}"
fi
exit
} }
start start

View File

@ -28,19 +28,28 @@ function update_script() {
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit exit
fi fi
RELEASE=$(curl -fsSL https://api.github.com/repos/glanceapp/glance/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') RELEASE=$(curl -fsSL https://api.github.com/repos/glanceapp/glance/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
if [[ "${RELEASE}" != "$(cat ~/.glance 2>/dev/null)" ]] || [[ ! -f ~/.glance ]]; then if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Stopping Service" msg_info "Stopping Service"
systemctl stop glance systemctl stop glance
msg_ok "Stopped Service" msg_ok "Stopped Service"
rm -f /opt/glance/glance msg_info "Updating ${APP} to v${RELEASE}"
fetch_and_deploy_gh_release "glance" "glanceapp/glance" "prebuild" "latest" "/opt/glance" "glance-linux-amd64.tar.gz" cd /opt
curl -fsSL "https://github.com/glanceapp/glance/releases/download/v${RELEASE}/glance-linux-amd64.tar.gz" -o $(basename "https://github.com/glanceapp/glance/releases/download/v${RELEASE}/glance-linux-amd64.tar.gz")
rm -rf /opt/glance/glance
tar -xzf glance-linux-amd64.tar.gz -C /opt/glance
echo "${RELEASE}" >"/opt/${APP}_version.txt"
msg_ok "Updated ${APP} to v${RELEASE}"
msg_info "Starting Service" msg_info "Starting Service"
systemctl start glance systemctl start glance
msg_ok "Started Service" msg_ok "Started Service"
msg_info "Cleaning up"
rm -rf /opt/glance-linux-amd64.tar.gz
msg_ok "Cleaned"
msg_ok "Updated Successfully" msg_ok "Updated Successfully"
else else
msg_ok "No update required. ${APP} is already at v${RELEASE}." msg_ok "No update required. ${APP} is already at v${RELEASE}."

View File

@ -66,7 +66,6 @@ function update_script() {
$STD dpkg -i "$OMADA_PKG" $STD dpkg -i "$OMADA_PKG"
rm -f "$OMADA_PKG" rm -f "$OMADA_PKG"
msg_ok "Updated Omada Controller" msg_ok "Updated Omada Controller"
exit 0
} }
start start

View File

@ -40,20 +40,20 @@ function update_script() {
mkdir -p /opt/planka-backup/user-avatars mkdir -p /opt/planka-backup/user-avatars
mkdir -p /opt/planka-backup/background-images mkdir -p /opt/planka-backup/background-images
mkdir -p /opt/planka-backup/attachments mkdir -p /opt/planka-backup/attachments
mv /opt/planka/.env /opt/planka-backup mv /opt/planka/planka/.env /opt/planka-backup
[ -n "$(ls -A /opt/planka/public/favicons 2>/dev/null)" ] && mv /opt/planka/public/favicons/* /opt/planka-backup/favicons/ [ -n "$(ls -A /opt/planka/planka/public/favicons 2>/dev/null)" ] && mv /opt/planka/planka/public/favicons/* /opt/planka-backup/favicons/
[ -n "$(ls -A /opt/planka/public/user-avatars 2>/dev/null)" ] && mv /opt/planka/public/user-avatars/* /opt/planka-backup/user-avatars/ [ -n "$(ls -A /opt/planka/planka/public/user-avatars 2>/dev/null)" ] && mv /opt/planka/planka/public/user-avatars/* /opt/planka-backup/user-avatars/
[ -n "$(ls -A /opt/planka/public/background-images 2>/dev/null)" ] && mv /opt/planka/public/background-images/* /opt/planka-backup/background-images/ [ -n "$(ls -A /opt/planka/planka/public/background-images 2>/dev/null)" ] && mv /opt/planka/planka/public/background-images/* /opt/planka-backup/background-images/
[ -n "$(ls -A /opt/planka/private/attachments 2>/dev/null)" ] && mv /opt/planka/private/attachments/* /opt/planka-backup/attachments/ [ -n "$(ls -A /opt/planka/planka/private/attachments 2>/dev/null)" ] && mv /opt/planka/planka/private/attachments/* /opt/planka-backup/attachments/
rm -rf /opt/planka rm -rf /opt/planka
fetch_and_deploy_gh_release "planka" "plankanban/planka" "prebuild" "latest" "/opt/planka" "planka-prebuild.zip" fetch_and_deploy_gh_release "planka" "plankanban/planka" "prebuild" "latest" "/opt/planka" "planka-prebuild.zip"
cd /opt/planka cd /opt/planka/planka
$STD npm install $STD npm install
mv /opt/planka-backup/.env /opt/planka/ mv /opt/planka-backup/.env /opt/planka/planka/
[ -n "$(ls -A /opt/planka-backup/favicons 2>/dev/null)" ] && mv /opt/planka-backup/favicons/* /opt/planka/public/favicons/ [ -n "$(ls -A /opt/planka-backup/favicons 2>/dev/null)" ] && mv /opt/planka-backup/favicons/* /opt/planka/planka/public/favicons/
[ -n "$(ls -A /opt/planka-backup/user-avatars 2>/dev/null)" ] && mv /opt/planka-backup/user-avatars/* /opt/planka/public/user-avatars/ [ -n "$(ls -A /opt/planka-backup/user-avatars 2>/dev/null)" ] && mv /opt/planka-backup/user-avatars/* /opt/planka/planka/public/user-avatars/
[ -n "$(ls -A /opt/planka-backup/background-images 2>/dev/null)" ] && mv /opt/planka-backup/background-images/* /opt/planka/public/background-images/ [ -n "$(ls -A /opt/planka-backup/background-images 2>/dev/null)" ] && mv /opt/planka-backup/background-images/* /opt/planka/planka/public/background-images/
[ -n "$(ls -A /opt/planka-backup/attachments 2>/dev/null)" ] && mv /opt/planka-backup/attachments/* /opt/planka/private/attachments/ [ -n "$(ls -A /opt/planka-backup/attachments 2>/dev/null)" ] && mv /opt/planka-backup/attachments/* /opt/planka/planka/private/attachments/
msg_ok "Updated $APP to ${RELEASE}" msg_ok "Updated $APP to ${RELEASE}"
msg_info "Starting $APP" msg_info "Starting $APP"

View File

@ -27,41 +27,31 @@ function update_script() {
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit exit
fi fi
RELEASE=$(curl -fsSL https://api.github.com/repos/Stirling-Tools/Stirling-PDF/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') msg_info "Updating ${APP}"
if [[ "${RELEASE}" != "$(cat ~/.stirling-pdf 2>/dev/null)" ]] || [[ ! -f ~/.stirling-pdf ]]; then systemctl stop stirlingpdf
if [[ ! -f /etc/systemd/system/unoserver.service ]]; then if [[ -n $(dpkg -l | grep -w ocrmypdf) ]] && [[ -z $(dpkg -l | grep -w qpdf) ]]; then
msg_custom "⚠️ " "\e[33m" "Legacy installation detected please recreate the container using the latest install script." $STD apt-get remove -y ocrmypdf
exit 0 $STD apt-get install -y qpdf
fi
PYTHON_VERSION="3.12" setup_uv
JAVA_VERSION="21" setup_java
msg_info "Stopping Services"
systemctl stop stirlingpdf libreoffice-listener unoserver
msg_ok "Stopped Services"
if [[ -f ~/.Stirling-PDF-login ]]; then
USE_ORIGINAL_FILENAME=true fetch_and_deploy_gh_release "stirling-pdf" "Stirling-Tools/Stirling-PDF" "singlefile" "latest" "/opt/Stirling-PDF" "Stirling-PDF-with-login.jar"
mv /opt/Stirling-PDF/Stirling-PDF-with-login.jar /opt/Stirling-PDF/Stirling-PDF.jar
else
USE_ORIGINAL_FILENAME=true fetch_and_deploy_gh_release "stirling-pdf" "Stirling-Tools/Stirling-PDF" "singlefile" "latest" "/opt/Stirling-PDF" "Stirling-PDF.jar"
fi
msg_info "Refreshing Font Cache"
$STD fc-cache -fv
msg_ok "Font Cache Updated"
msg_info "Starting Services"
systemctl start stirlingpdf libreoffice-listener unoserver
msg_ok "Started Services"
msg_ok "Update Successful"
else
msg_ok "No update required. ${APP} is already at v${RELEASE}"
fi fi
RELEASE=$(curl -fsSL https://api.github.com/repos/Stirling-Tools/Stirling-PDF/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
curl -fsSL "https://github.com/Stirling-Tools/Stirling-PDF/archive/refs/tags/v$RELEASE.tar.gz" -o $(basename "https://github.com/Stirling-Tools/Stirling-PDF/archive/refs/tags/v$RELEASE.tar.gz")
tar -xzf v$RELEASE.tar.gz
cd Stirling-PDF-$RELEASE
chmod +x ./gradlew
$STD ./gradlew build -x spotlessApply -x spotlessCheck -x test -x sonarqube
rm -rf /opt/Stirling-PDF/Stirling-PDF-*.jar
cp -r ./stirling-pdf/build/libs/*.jar /opt/Stirling-PDF/Stirling-PDF-$RELEASE.jar
cp -r scripts /opt/Stirling-PDF/
cp -r pipeline /opt/Stirling-PDF/
cp -r stirling-pdf/src/main/resources/static/fonts/*.ttf /usr/share/fonts/opentype/noto/
cd ~
rm -rf Stirling-PDF-$RELEASE v$RELEASE.tar.gz
ln -sf /opt/Stirling-PDF/Stirling-PDF-$RELEASE.jar /opt/Stirling-PDF/Stirling-PDF.jar
systemctl start stirlingpdf
msg_ok "Updated ${APP} to v$RELEASE"
exit exit
} }
start start
build_container build_container
description description

View File

@ -1,35 +1,35 @@
{ {
"name": "Stirling-PDF", "name": "Stirling-PDF",
"slug": "stirling-pdf", "slug": "stirling-pdf",
"categories": [ "categories": [
12 12
], ],
"date_created": "2024-05-02", "date_created": "2024-05-02",
"type": "ct", "type": "ct",
"updateable": true, "updateable": true,
"privileged": false, "privileged": false,
"interface_port": 8080, "interface_port": 8080,
"documentation": null, "documentation": null,
"website": "https://github.com/Stirling-Tools/Stirling-PDF", "website": "https://github.com/Stirling-Tools/Stirling-PDF",
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/stirling-pdf.webp", "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/stirling-pdf.webp",
"config_path": "/opt/Stirling-PDF/.env", "config_path": "/opt/Stirling-PDF/.env",
"description": "Stirling-PDF is a powerful locally hosted web based PDF manipulation tool that allows you to perform various operations on PDF files, such as splitting merging, converting, reorganizing, adding images, rotating, compressing, and more.", "description": "Stirling-PDF is a powerful locally hosted web based PDF manipulation tool that allows you to perform various operations on PDF files, such as splitting merging, converting, reorganizing, adding images, rotating, compressing, and more.",
"install_methods": [ "install_methods": [
{ {
"type": "default", "type": "default",
"script": "ct/stirling-pdf.sh", "script": "ct/stirling-pdf.sh",
"resources": { "resources": {
"cpu": 2, "cpu": 2,
"ram": 2048, "ram": 2048,
"hdd": 8, "hdd": 8,
"os": "debian", "os": "debian",
"version": "12" "version": "12"
} }
} }
], ],
"default_credentials": { "default_credentials": {
"username": "admin", "username": null,
"password": "stirling" "password": null
}, },
"notes": [] "notes": []
} }

View File

@ -1,119 +1,4 @@
[ [
{
"name": "steveiliop56/tinyauth",
"version": "v3.6.0",
"date": "2025-07-09T23:15:25Z"
},
{
"name": "pocket-id/pocket-id",
"version": "v1.6.2",
"date": "2025-07-09T22:14:10Z"
},
{
"name": "NginxProxyManager/nginx-proxy-manager",
"version": "v2.12.6",
"date": "2025-07-09T21:52:15Z"
},
{
"name": "apache/tika",
"version": "3.2.1",
"date": "2025-07-09T20:47:29Z"
},
{
"name": "sabnzbd/sabnzbd",
"version": "4.5.2",
"date": "2025-07-09T19:08:28Z"
},
{
"name": "raydak-labs/configarr",
"version": "v1.13.6",
"date": "2025-07-09T17:23:01Z"
},
{
"name": "msgbyte/tianji",
"version": "v1.23.3",
"date": "2025-07-09T16:39:30Z"
},
{
"name": "hargata/lubelog",
"version": "v1.4.9",
"date": "2025-07-09T16:27:46Z"
},
{
"name": "duplicati/duplicati",
"version": "v2.1.0.123-2.1.0.123_canary_2025-07-09",
"date": "2025-07-09T16:08:36Z"
},
{
"name": "keycloak/keycloak",
"version": "26.3.1",
"date": "2025-07-09T15:41:43Z"
},
{
"name": "nicolargo/glances",
"version": "v4.3.3",
"date": "2025-07-09T15:35:44Z"
},
{
"name": "rclone/rclone",
"version": "v1.70.3",
"date": "2025-07-09T15:06:31Z"
},
{
"name": "home-assistant/operating-system",
"version": "16.0",
"date": "2025-07-09T13:28:43Z"
},
{
"name": "element-hq/synapse",
"version": "v1.133.0",
"date": "2025-07-01T15:13:42Z"
},
{
"name": "AdguardTeam/AdGuardHome",
"version": "v0.107.63",
"date": "2025-06-26T14:34:19Z"
},
{
"name": "crowdsecurity/crowdsec",
"version": "v1.6.9",
"date": "2025-06-17T11:54:50Z"
},
{
"name": "n8n-io/n8n",
"version": "n8n@1.102.0",
"date": "2025-07-07T15:32:29Z"
},
{
"name": "fuma-nama/fumadocs",
"version": "fumadocs-ui@15.6.3",
"date": "2025-07-09T09:28:42Z"
},
{
"name": "cockpit-project/cockpit",
"version": "342",
"date": "2025-07-09T08:48:21Z"
},
{
"name": "esphome/esphome",
"version": "2025.6.3",
"date": "2025-07-03T01:07:26Z"
},
{
"name": "Jackett/Jackett",
"version": "v0.22.2135",
"date": "2025-07-09T05:58:50Z"
},
{
"name": "MediaBrowser/Emby.Releases",
"version": "4.9.1.2",
"date": "2025-06-26T22:08:00Z"
},
{
"name": "henrygd/beszel",
"version": "v0.11.1",
"date": "2025-04-29T01:14:35Z"
},
{ {
"name": "Prowlarr/Prowlarr", "name": "Prowlarr/Prowlarr",
"version": "v1.37.0.5076", "version": "v1.37.0.5076",
@ -129,6 +14,11 @@
"version": "v0.35.0", "version": "v0.35.0",
"date": "2025-05-21T18:00:32Z" "date": "2025-05-21T18:00:32Z"
}, },
{
"name": "steveiliop56/tinyauth",
"version": "v3.4.1",
"date": "2025-06-11T07:53:44Z"
},
{ {
"name": "rcourtman/Pulse", "name": "rcourtman/Pulse",
"version": "v3.40.1", "version": "v3.40.1",
@ -149,6 +39,11 @@
"version": "v5.20.0", "version": "v5.20.0",
"date": "2025-07-08T16:27:11Z" "date": "2025-07-08T16:27:11Z"
}, },
{
"name": "fuma-nama/fumadocs",
"version": "create-fumadocs-app@15.6.2",
"date": "2025-07-08T14:26:05Z"
},
{ {
"name": "jenkinsci/jenkins", "name": "jenkinsci/jenkins",
"version": "jenkins-2.518", "version": "jenkins-2.518",
@ -159,11 +54,6 @@
"version": "v1.6.2", "version": "v1.6.2",
"date": "2025-07-08T13:52:33Z" "date": "2025-07-08T13:52:33Z"
}, },
{
"name": "wazuh/wazuh",
"version": "coverity-w28-4.13.0",
"date": "2025-07-08T11:25:24Z"
},
{ {
"name": "mattermost/mattermost", "name": "mattermost/mattermost",
"version": "preview-v0.1", "version": "preview-v0.1",
@ -174,6 +64,11 @@
"version": "v2.38.2", "version": "v2.38.2",
"date": "2025-07-08T09:35:14Z" "date": "2025-07-08T09:35:14Z"
}, },
{
"name": "Jackett/Jackett",
"version": "v0.22.2132",
"date": "2025-07-08T05:52:22Z"
},
{ {
"name": "Checkmk/checkmk", "name": "Checkmk/checkmk",
"version": "v2.4.0p7", "version": "v2.4.0p7",
@ -189,6 +84,21 @@
"version": "r8.0.12-rc0", "version": "r8.0.12-rc0",
"date": "2025-07-07T23:35:35Z" "date": "2025-07-07T23:35:35Z"
}, },
{
"name": "keycloak/keycloak",
"version": "26.3.0",
"date": "2025-07-02T12:26:44Z"
},
{
"name": "duplicati/duplicati",
"version": "v2.1.0.122-2.1.0.122_canary_2025-07-07",
"date": "2025-07-07T17:54:52Z"
},
{
"name": "msgbyte/tianji",
"version": "v1.23.2",
"date": "2025-07-07T16:51:43Z"
},
{ {
"name": "TandoorRecipes/recipes", "name": "TandoorRecipes/recipes",
"version": "1.5.35", "version": "1.5.35",
@ -199,6 +109,11 @@
"version": "pmm-6401-v1.121.0", "version": "pmm-6401-v1.121.0",
"date": "2025-07-07T16:16:13Z" "date": "2025-07-07T16:16:13Z"
}, },
{
"name": "n8n-io/n8n",
"version": "n8n@1.100.0",
"date": "2025-06-23T12:48:35Z"
},
{ {
"name": "photoprism/photoprism", "name": "photoprism/photoprism",
"version": "250707-d28b3101e", "version": "250707-d28b3101e",
@ -239,6 +154,11 @@
"version": "v1.5.2", "version": "v1.5.2",
"date": "2025-05-11T16:40:55Z" "date": "2025-05-11T16:40:55Z"
}, },
{
"name": "MediaBrowser/Emby.Releases",
"version": "4.9.1.2",
"date": "2025-06-26T22:08:00Z"
},
{ {
"name": "firefly-iii/firefly-iii", "name": "firefly-iii/firefly-iii",
"version": "v6.2.20", "version": "v6.2.20",
@ -259,6 +179,11 @@
"version": "v1.0.0-beta14", "version": "v1.0.0-beta14",
"date": "2025-07-06T21:07:07Z" "date": "2025-07-06T21:07:07Z"
}, },
{
"name": "pocket-id/pocket-id",
"version": "v1.6.1",
"date": "2025-07-06T20:59:34Z"
},
{ {
"name": "Luligu/matterbridge", "name": "Luligu/matterbridge",
"version": "3.1.2", "version": "3.1.2",
@ -304,6 +229,11 @@
"version": "v6.12.7", "version": "v6.12.7",
"date": "2025-06-18T03:44:24Z" "date": "2025-06-18T03:44:24Z"
}, },
{
"name": "nicolargo/glances",
"version": "v4.3.2",
"date": "2025-07-05T16:00:15Z"
},
{ {
"name": "runtipi/runtipi", "name": "runtipi/runtipi",
"version": "v4.3.0", "version": "v4.3.0",
@ -354,6 +284,11 @@
"version": "v0.85.0", "version": "v0.85.0",
"date": "2025-07-04T00:06:47Z" "date": "2025-07-04T00:06:47Z"
}, },
{
"name": "home-assistant/operating-system",
"version": "15.2",
"date": "2025-04-14T15:37:12Z"
},
{ {
"name": "cloudflare/cloudflared", "name": "cloudflare/cloudflared",
"version": "2025.7.0", "version": "2025.7.0",
@ -369,11 +304,21 @@
"version": "v3.2.1", "version": "v3.2.1",
"date": "2025-07-03T16:09:19Z" "date": "2025-07-03T16:09:19Z"
}, },
{
"name": "cockpit-project/cockpit",
"version": "310.5",
"date": "2025-07-03T14:05:25Z"
},
{ {
"name": "Dolibarr/dolibarr", "name": "Dolibarr/dolibarr",
"version": "18.0.7", "version": "18.0.7",
"date": "2025-07-03T08:57:21Z" "date": "2025-07-03T08:57:21Z"
}, },
{
"name": "esphome/esphome",
"version": "2025.6.3",
"date": "2025-07-03T01:07:26Z"
},
{ {
"name": "actualbudget/actual", "name": "actualbudget/actual",
"version": "v25.7.1", "version": "v25.7.1",
@ -384,11 +329,21 @@
"version": "v1.12.2-rc.0", "version": "v1.12.2-rc.0",
"date": "2025-07-03T00:31:22Z" "date": "2025-07-03T00:31:22Z"
}, },
{
"name": "hargata/lubelog",
"version": "v1.4.8",
"date": "2025-07-02T21:15:13Z"
},
{ {
"name": "Koenkk/zigbee2mqtt", "name": "Koenkk/zigbee2mqtt",
"version": "2.5.1", "version": "2.5.1",
"date": "2025-07-02T19:38:06Z" "date": "2025-07-02T19:38:06Z"
}, },
{
"name": "wazuh/wazuh",
"version": "coverity-w27-4.13.0",
"date": "2025-07-01T03:17:32Z"
},
{ {
"name": "glpi-project/glpi", "name": "glpi-project/glpi",
"version": "10.0.18", "version": "10.0.18",
@ -434,6 +389,11 @@
"version": "v0.57.0", "version": "v0.57.0",
"date": "2025-07-01T16:47:46Z" "date": "2025-07-01T16:47:46Z"
}, },
{
"name": "element-hq/synapse",
"version": "v1.133.0",
"date": "2025-07-01T15:13:42Z"
},
{ {
"name": "zabbix/zabbix", "name": "zabbix/zabbix",
"version": "7.4.0", "version": "7.4.0",
@ -444,6 +404,11 @@
"version": "v0.15.0-rc3", "version": "v0.15.0-rc3",
"date": "2025-07-01T04:09:37Z" "date": "2025-07-01T04:09:37Z"
}, },
{
"name": "NginxProxyManager/nginx-proxy-manager",
"version": "v2.12.4",
"date": "2025-07-01T01:45:42Z"
},
{ {
"name": "MagicMirrorOrg/MagicMirror", "name": "MagicMirrorOrg/MagicMirror",
"version": "v2.32.0", "version": "v2.32.0",
@ -494,6 +459,16 @@
"version": "version/2025.6.3", "version": "version/2025.6.3",
"date": "2025-06-27T14:01:06Z" "date": "2025-06-27T14:01:06Z"
}, },
{
"name": "rclone/rclone",
"version": "v1.70.2",
"date": "2025-06-27T13:21:17Z"
},
{
"name": "sabnzbd/sabnzbd",
"version": "4.5.1",
"date": "2025-04-11T09:57:47Z"
},
{ {
"name": "FlowiseAI/Flowise", "name": "FlowiseAI/Flowise",
"version": "flowise@3.0.3", "version": "flowise@3.0.3",
@ -504,6 +479,11 @@
"version": "v4.3.3", "version": "v4.3.3",
"date": "2025-06-26T18:42:56Z" "date": "2025-06-26T18:42:56Z"
}, },
{
"name": "apache/tika",
"version": "3.2.1-rc2",
"date": "2025-06-26T17:10:25Z"
},
{ {
"name": "tailscale/tailscale", "name": "tailscale/tailscale",
"version": "v1.84.3", "version": "v1.84.3",
@ -514,6 +494,11 @@
"version": "v3.5.0-rc1", "version": "v3.5.0-rc1",
"date": "2025-06-26T15:08:43Z" "date": "2025-06-26T15:08:43Z"
}, },
{
"name": "AdguardTeam/AdGuardHome",
"version": "v0.107.63",
"date": "2025-06-26T14:34:19Z"
},
{ {
"name": "node-red/node-red", "name": "node-red/node-red",
"version": "4.1.0-beta.2", "version": "4.1.0-beta.2",
@ -674,6 +659,11 @@
"version": "v2.1.5", "version": "v2.1.5",
"date": "2025-06-17T18:04:11Z" "date": "2025-06-17T18:04:11Z"
}, },
{
"name": "crowdsecurity/crowdsec",
"version": "v1.6.9",
"date": "2025-06-17T11:54:50Z"
},
{ {
"name": "donaldzou/WGDashboard", "name": "donaldzou/WGDashboard",
"version": "v4.2.4", "version": "v4.2.4",
@ -974,11 +964,21 @@
"version": "3.5.0", "version": "3.5.0",
"date": "2025-05-05T16:28:24Z" "date": "2025-05-05T16:28:24Z"
}, },
{
"name": "raydak-labs/configarr",
"version": "v1.13.5",
"date": "2025-05-03T09:48:44Z"
},
{ {
"name": "WordPress/WordPress", "name": "WordPress/WordPress",
"version": "6.8.1", "version": "6.8.1",
"date": "2025-04-30T16:44:16Z" "date": "2025-04-30T16:44:16Z"
}, },
{
"name": "henrygd/beszel",
"version": "v0.11.1",
"date": "2025-04-29T01:14:35Z"
},
{ {
"name": "deluge-torrent/deluge", "name": "deluge-torrent/deluge",
"version": "deluge-2.2.0", "version": "deluge-2.2.0",

View File

@ -13,8 +13,12 @@ setting_up_container
network_check network_check
update_os update_os
msg_info "Installing Dependencies"
$STD apt-get install -y apache2
msg_ok "Installed Dependencies"
PG_VERSION="16" setup_postgresql PG_VERSION="16" setup_postgresql
PHP_APACHE="YES" PHP_MODULE="pgsql" PHP_VERSION="8.2" setup_php PHP_APACHE="YES" PHP_MODULE="pgsql, dom" PHP_VERSION="8.2" setup_php
fetch_and_deploy_gh_release "baikal" "sabre-io/Baikal" fetch_and_deploy_gh_release "baikal" "sabre-io/Baikal"
msg_info "Setting up PostgreSQL Database" msg_info "Setting up PostgreSQL Database"

View File

@ -17,8 +17,22 @@ msg_info "Installing Dependencies"
$STD apt-get install -y rsync $STD apt-get install -y rsync
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
JAVA_VERSION="17" setup_java msg_info "Installing Azul Zulu"
fetch_and_deploy_gh_release "commafeed" "Athou/commafeed" "prebuild" "latest" "/opt/commafeed" "commafeed-*-h2-jvm.zip" curl -fsSL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xB1998361219BD9C9" -o "/etc/apt/trusted.gpg.d/zulu-repo.asc"
curl -fsSL "https://cdn.azul.com/zulu/bin/zulu-repo_1.0.0-3_all.deb" -o "zulu-repo_1.0.0-3_all.deb"
$STD dpkg -i zulu-repo_1.0.0-3_all.deb
$STD apt-get update
$STD apt-get -y install zulu17-jdk
msg_ok "Installed Azul Zulu"
RELEASE=$(curl -fsSL https://api.github.com/repos/Athou/commafeed/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
msg_info "Installing CommaFeed ${RELEASE}"
mkdir /opt/commafeed
curl -fsSL "https://github.com/Athou/commafeed/releases/download/${RELEASE}/commafeed-${RELEASE}-h2-jvm.zip" -o "commafeed-${RELEASE}-h2-jvm.zip"
$STD unzip commafeed-${RELEASE}-h2-jvm.zip
mv commafeed-${RELEASE}-h2/* /opt/commafeed/
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
msg_ok "Installed CommaFeed ${RELEASE}"
msg_info "Creating Service" msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/commafeed.service cat <<EOF >/etc/systemd/system/commafeed.service
@ -41,6 +55,7 @@ motd_ssh
customize customize
msg_info "Cleaning up" msg_info "Cleaning up"
rm -rf commafeed-${RELEASE}-h2 commafeed-${RELEASE}-h2-jvm.zip zulu-repo_1.0.0-3_all.deb
$STD apt-get -y autoremove $STD apt-get -y autoremove
$STD apt-get -y autoclean $STD apt-get -y autoclean
msg_ok "Cleaned" msg_ok "Cleaned"

View File

@ -57,32 +57,15 @@ else
fi fi
fi fi
read -r -p "${TAB3}Expose Docker TCP socket (⚠️ insecure)? <y/N> " prompt read -r -p "${TAB3}Would you like to expose the Docker TCP socket? <y/N> " prompt
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
msg_info "Enabling Docker TCP socket on port 2375 (insecure)" msg_info "Exposing Docker TCP socket"
$STD mkdir -p /etc/docker
mkdir -p /etc/docker $STD echo '{ "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"] }' > /etc/docker/daemon.json
echo '{ "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"] }' > /etc/docker/daemon.json $STD rc-service docker restart
msg_ok "Exposed Docker TCP socket at tcp://+:2375"
mkdir -p /etc/systemd/system/docker.service.d
cat <<EOF > /etc/systemd/system/docker.service.d/override.conf
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd
EOF
$STD systemctl daemon-reexec
$STD systemctl daemon-reload
if systemctl restart docker; then
msg_ok "Docker TCP socket now available on tcp://0.0.0.0:2375"
else
msg_error "Docker failed to restart. Check journalctl -xeu docker.service"
exit 1
fi
fi fi
motd_ssh motd_ssh
customize customize

View File

@ -14,14 +14,17 @@ network_check
update_os update_os
msg_info "Installing Dependencies" msg_info "Installing Dependencies"
$STD apt-get install -y apache2 curl -fsSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg
echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ bookworm main" >/etc/apt/sources.list.d/php.list
$STD apt-get update
$STD apt-get install -y \
apache2 \
libapache2-mod-php8.4 \
php8.4-{bcmath,cli,intl,curl,zip,gd,xml,mbstring,mysql} \
composer
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
PHP_VERSION="8.4" PHP_APACHE="YES" PHP_MODULE="mysql" setup_php
setup_composer
setup_mariadb setup_mariadb
fetch_and_deploy_gh_release "firefly" "firefly-iii/firefly-iii"
LOCAL_IP=$(hostname -I | awk '{print $1}')
msg_info "Setting up database" msg_info "Setting up database"
DB_NAME=firefly DB_NAME=firefly
@ -38,7 +41,13 @@ mariadb -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH PRI
} >>~/firefly.creds } >>~/firefly.creds
msg_ok "Set up database" msg_ok "Set up database"
msg_info "Configuring Firefly III (Patience)" msg_info "Installing Firefly III (Patience)"
LOCAL_IP=$(hostname -I | awk '{print $1}')
RELEASE=$(curl -fsSL https://api.github.com/repos/firefly-iii/firefly-iii/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4)}')
cd /opt
curl -fsSL "https://github.com/firefly-iii/firefly-iii/releases/download/v${RELEASE}/FireflyIII-v${RELEASE}.tar.gz" -o "FireflyIII-v${RELEASE}.tar.gz"
mkdir -p /opt/firefly
tar -xzf FireflyIII-v${RELEASE}.tar.gz -C /opt/firefly
chown -R www-data:www-data /opt/firefly chown -R www-data:www-data /opt/firefly
chmod -R 775 /opt/firefly/storage chmod -R 775 /opt/firefly/storage
cd /opt/firefly cd /opt/firefly
@ -60,7 +69,8 @@ tar -xzf "DataImporter-v${IMPORTER_RELEASE}.tar.gz" -C /opt/firefly/dataimporter
cp /opt/firefly/dataimporter/.env.example /opt/firefly/dataimporter/.env cp /opt/firefly/dataimporter/.env.example /opt/firefly/dataimporter/.env
sed -i "s#FIREFLY_III_URL=#FIREFLY_III_URL=http://${LOCAL_IP}#g" /opt/firefly/dataimporter/.env sed -i "s#FIREFLY_III_URL=#FIREFLY_III_URL=http://${LOCAL_IP}#g" /opt/firefly/dataimporter/.env
chown -R www-data:www-data /opt/firefly chown -R www-data:www-data /opt/firefly
msg_ok "Configured Firefly III" echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt"
msg_ok "Installed Firefly III"
msg_info "Creating Service" msg_info "Creating Service"
cat <<EOF >/etc/apache2/sites-available/firefly.conf cat <<EOF >/etc/apache2/sites-available/firefly.conf
@ -102,6 +112,7 @@ motd_ssh
customize customize
msg_info "Cleaning up" msg_info "Cleaning up"
rm -rf "/opt/FireflyIII-v${RELEASE}.tar.gz"
rm -rf "/opt/DataImporter-v${IMPORTER_RELEASE}.tar.gz" rm -rf "/opt/DataImporter-v${IMPORTER_RELEASE}.tar.gz"
$STD apt-get -y autoremove $STD apt-get -y autoremove
$STD apt-get -y autoclean $STD apt-get -y autoclean

View File

@ -15,9 +15,8 @@ network_check
update_os update_os
msg_info "Installing Dependencies" msg_info "Installing Dependencies"
$STD apt-get install -y \ $STD apt-get install -y apt-transport-https
apt-transport-https \ $STD apt-get install -y xvfb
xvfb
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
msg_info "Installing Chrome" msg_info "Installing Chrome"
@ -27,7 +26,13 @@ $STD apt update
$STD apt install -y google-chrome-stable $STD apt install -y google-chrome-stable
msg_ok "Installed Chrome" msg_ok "Installed Chrome"
fetch_and_deploy_gh_release "flaresolverr" "FlareSolverr/FlareSolverr" "prebuild" "latest" "/opt/flaresolverr" "flaresolverr_linux_x64.tar.gz" msg_info "Installing FlareSolverr"
RELEASE=$(curl -fsSL https://github.com/FlareSolverr/FlareSolverr/releases/latest | grep "title>Release" | cut -d " " -f 4)
$STD curl -fsSL "https://github.com/FlareSolverr/FlareSolverr/releases/download/$RELEASE/flaresolverr_linux_x64.tar.gz" -o "flaresolverr_linux_x64.tar.gz"
$STD tar -xzf flaresolverr_linux_x64.tar.gz -C /opt
$STD rm flaresolverr_linux_x64.tar.gz
echo "${RELEASE}" >/opt/"${APPLICATION}"_version.txt
msg_ok "Installed FlareSolverr"
msg_info "Creating Service" msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/flaresolverr.service cat <<EOF >/etc/systemd/system/flaresolverr.service

View File

@ -13,7 +13,7 @@ setting_up_container
network_check network_check
update_os update_os
PHP_VERSION="8.2" PHP_MODULE="curl,xml,mbstring,intl,zip,pgsql,gmp" PHP_APACHE="YES" setup_php PHP_VERSION="8.2" PHP_MODULE="dom,json,ctype,pgsql,gmp,iconv" PHP_APACHE="YES" setup_php
PG_VERSION="16" setup_postgresql PG_VERSION="16" setup_postgresql
msg_info "Setting up PostgreSQL" msg_info "Setting up PostgreSQL"

View File

@ -19,9 +19,10 @@ $STD apt-get install -y git
$STD apt-get install -y sqlite3 $STD apt-get install -y sqlite3
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
fetch_and_deploy_gh_release "gitea" "go-gitea/gitea" "singlefile" "latest" "/usr/local/bin" "gitea-*-linux-amd64" msg_info "Installing Gitea"
RELEASE=$(curl -fsSL https://github.com/go-gitea/gitea/releases/latest | grep "title>Release" | cut -d " " -f 4 | sed 's/^v//')
msg_info "Configuring Gitea" curl -fsSL "https://github.com/go-gitea/gitea/releases/download/v$RELEASE/gitea-$RELEASE-linux-amd64" -o "gitea-$RELEASE-linux-amd64"
mv gitea* /usr/local/bin/gitea
chmod +x /usr/local/bin/gitea chmod +x /usr/local/bin/gitea
adduser --system --group --disabled-password --shell /bin/bash --home /etc/gitea gitea >/dev/null adduser --system --group --disabled-password --shell /bin/bash --home /etc/gitea gitea >/dev/null
mkdir -p /var/lib/gitea/{custom,data,log} mkdir -p /var/lib/gitea/{custom,data,log}
@ -30,7 +31,7 @@ chmod -R 750 /var/lib/gitea/
chown root:gitea /etc/gitea chown root:gitea /etc/gitea
chmod 770 /etc/gitea chmod 770 /etc/gitea
sudo -u gitea ln -s /var/lib/gitea/data/.ssh/ /etc/gitea/.ssh sudo -u gitea ln -s /var/lib/gitea/data/.ssh/ /etc/gitea/.ssh
msg_ok "Configured Gitea" msg_ok "Installed Gitea"
msg_info "Creating Service" msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/gitea.service cat <<EOF >/etc/systemd/system/gitea.service

View File

@ -13,9 +13,12 @@ setting_up_container
network_check network_check
update_os update_os
fetch_and_deploy_gh_release "glance" "glanceapp/glance" "prebuild" "latest" "/opt/glance" "glance-linux-amd64.tar.gz" msg_info "Installing Glance"
RELEASE=$(curl -fsSL https://api.github.com/repos/glanceapp/glance/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
msg_info "Configuring Glance" cd /opt
curl -fsSL "https://github.com/glanceapp/glance/releases/download/v${RELEASE}/glance-linux-amd64.tar.gz" -o "glance-linux-amd64.tar.gz"
mkdir -p /opt/glance
tar -xzf glance-linux-amd64.tar.gz -C /opt/glance
cat <<EOF >/opt/glance/glance.yml cat <<EOF >/opt/glance/glance.yml
pages: pages:
- name: Startpage - name: Startpage
@ -36,7 +39,9 @@ pages:
- title: Helper Scripts - title: Helper Scripts
url: https://github.com/community-scripts/ProxmoxVE url: https://github.com/community-scripts/ProxmoxVE
EOF EOF
msg_ok "Configured Glance"
echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt"
msg_ok "Installed Glance"
msg_info "Creating Service" msg_info "Creating Service"
service_path="/etc/systemd/system/glance.service" service_path="/etc/systemd/system/glance.service"
@ -62,6 +67,7 @@ motd_ssh
customize customize
msg_info "Cleaning up" msg_info "Cleaning up"
rm -rf /opt/glance-linux-amd64.tar.gz
$STD apt-get -y autoremove $STD apt-get -y autoremove
$STD apt-get -y autoclean $STD apt-get -y autoclean
msg_ok "Cleaned" msg_ok "Cleaned"

View File

@ -45,12 +45,12 @@ fetch_and_deploy_gh_release "planka" "plankanban/planka" "prebuild" "latest" "/o
msg_info "Configuring PLANKA" msg_info "Configuring PLANKA"
LOCAL_IP=$(hostname -I | awk '{print $1}') LOCAL_IP=$(hostname -I | awk '{print $1}')
SECRET_KEY=$(openssl rand -hex 64) SECRET_KEY=$(openssl rand -hex 64)
cd /opt/planka cd /opt/planka/planka
$STD npm install $STD npm install
cp .env.sample .env cp .env.sample .env
sed -i "s#http://localhost:1337#http://$LOCAL_IP:1337#g" /opt/planka/.env sed -i "s#http://localhost:1337#http://$LOCAL_IP:1337#g" /opt/planka/planka/.env
sed -i "s#postgres@localhost#planka:$DB_PASS@localhost#g" /opt/planka/.env sed -i "s#postgres@localhost#planka:$DB_PASS@localhost#g" /opt/planka/planka/.env
sed -i "s#notsecretkey#$SECRET_KEY#g" /opt/planka/.env sed -i "s#notsecretkey#$SECRET_KEY#g" /opt/planka/planka/.env
$STD npm run db:init $STD npm run db:init
msg_ok "Configured PLANKA" msg_ok "Configured PLANKA"
@ -84,7 +84,7 @@ Description=planka Service
After=network.target After=network.target
[Service] [Service]
WorkingDirectory=/opt/planka WorkingDirectory=/opt/planka/planka
ExecStart=/usr/bin/npm start --prod ExecStart=/usr/bin/npm start --prod
Restart=always Restart=always

View File

@ -15,6 +15,7 @@ update_os
msg_info "Installing Dependencies (Patience)" msg_info "Installing Dependencies (Patience)"
$STD apt-get install -y \ $STD apt-get install -y \
git \
automake \ automake \
autoconf \ autoconf \
libtool \ libtool \
@ -24,26 +25,10 @@ $STD apt-get install -y \
make \ make \
g++ \ g++ \
unpaper \ unpaper \
fonts-urw-base35 \
qpdf \ qpdf \
poppler-utils poppler-utils
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
PYTHON_VERSION="3.12" setup_uv
JAVA_VERSION="21" setup_java
read -r -p "${TAB3}Do you want to Stirling-PDF with Login? (no/n = without Login) [Y/n] " response
response=${response,,} # Convert to lowercase
login_mode="false"
if [[ "$response" == "y" || "$response" == "yes" || -z "$response" ]]; then
USE_ORIGINAL_FILENAME=true fetch_and_deploy_gh_release "stirling-pdf" "Stirling-Tools/Stirling-PDF" "singlefile" "latest" "/opt/Stirling-PDF" "Stirling-PDF-with-login.jar"
mv /opt/Stirling-PDF/Stirling-PDF-with-login.jar /opt/Stirling-PDF/Stirling-PDF.jar
touch ~/.Stirling-PDF-login
login_mode="true"
else
USE_ORIGINAL_FILENAME=true fetch_and_deploy_gh_release "stirling-pdf" "Stirling-Tools/Stirling-PDF" "singlefile" "latest" "/opt/Stirling-PDF" "Stirling-PDF.jar"
fi
msg_info "Installing LibreOffice Components" msg_info "Installing LibreOffice Components"
$STD apt-get install -y \ $STD apt-get install -y \
libreoffice-writer \ libreoffice-writer \
@ -52,35 +37,32 @@ $STD apt-get install -y \
libreoffice-core \ libreoffice-core \
libreoffice-common \ libreoffice-common \
libreoffice-base-core \ libreoffice-base-core \
libreoffice-script-provider-python \ python3-uno
libreoffice-java-common \
unoconv \
pngquant \
weasyprint
msg_ok "Installed LibreOffice Components" msg_ok "Installed LibreOffice Components"
msg_info "Installing Python Dependencies" msg_info "Installing Python Dependencies"
mkdir -p /tmp/stirling-pdf $STD apt-get install -y \
$STD uv venv /opt/.venv python3 \
export PATH="/opt/.venv/bin:$PATH" python3-pip
source /opt/.venv/bin/activate rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
$STD uv pip install --upgrade pip $STD pip3 install \
$STD uv pip install \ uno \
opencv-python-headless \ opencv-python-headless \
ocrmypdf \ unoconv \
pillow \ pngquant \
pdf2image WeasyPrint
$STD apt-get install -y python3-uno python3-pip
$STD pip3 install --break-system-packages unoserver
ln -sf /opt/.venv/bin/python3 /usr/local/bin/python3
ln -sf /opt/.venv/bin/pip /usr/local/bin/pip
msg_ok "Installed Python Dependencies" msg_ok "Installed Python Dependencies"
msg_info "Installing Azul Zulu"
curl -fsSL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xB1998361219BD9C9" -o "/etc/apt/trusted.gpg.d/zulu-repo.asc"
curl -fsSL "https://cdn.azul.com/zulu/bin/zulu-repo_1.0.0-3_all.deb" -o "/zulu-repo_1.0.0-3_all.deb"
$STD dpkg -i zulu-repo_1.0.0-3_all.deb
$STD apt-get update
$STD apt-get -y install zulu17-jdk
msg_ok "Installed Azul Zulu"
msg_info "Installing JBIG2" msg_info "Installing JBIG2"
$STD curl -fsSL -o /tmp/jbig2enc.tar.gz https://github.com/agl/jbig2enc/archive/refs/tags/0.30.tar.gz $STD git clone https://github.com/agl/jbig2enc /opt/jbig2enc
mkdir -p /opt/jbig2enc
tar -xzf /tmp/jbig2enc.tar.gz -C /opt/jbig2enc --strip-components=1
cd /opt/jbig2enc cd /opt/jbig2enc
$STD bash ./autogen.sh $STD bash ./autogen.sh
$STD bash ./configure $STD bash ./configure
@ -92,46 +74,25 @@ msg_info "Installing Language Packs (Patience)"
$STD apt-get install -y 'tesseract-ocr-*' $STD apt-get install -y 'tesseract-ocr-*'
msg_ok "Installed Language Packs" msg_ok "Installed Language Packs"
msg_info "Creating Environment Variables" msg_info "Installing Stirling-PDF (Additional Patience)"
cat <<EOF >/opt/Stirling-PDF/.env RELEASE=$(curl -fsSL https://api.github.com/repos/Stirling-Tools/Stirling-PDF/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
# Java tuning curl -fsSL "https://github.com/Stirling-Tools/Stirling-PDF/archive/refs/tags/v${RELEASE}.tar.gz" -o "v${RELEASE}.tar.gz"
JAVA_BASE_OPTS="-XX:+UnlockExperimentalVMOptions -XX:MaxRAMPercentage=75 -XX:InitiatingHeapOccupancyPercent=20 -XX:+G1PeriodicGCInvokesConcurrent -XX:G1PeriodicGCInterval=10000 -XX:+UseStringDeduplication -XX:G1PeriodicGCSystemLoadThreshold=70" tar -xzf v${RELEASE}.tar.gz
JAVA_CUSTOM_OPTS="" cd Stirling-PDF-$RELEASE
chmod +x ./gradlew
# LibreOffice $STD ./gradlew build -x spotlessApply -x spotlessCheck -x test -x sonarqube
PATH=/opt/.venv/bin:/usr/lib/libreoffice/program:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin mkdir -p /opt/Stirling-PDF
UNO_PATH=/usr/lib/libreoffice/program touch /opt/Stirling-PDF/.env
URE_BOOTSTRAP=file:///usr/lib/libreoffice/program/fundamentalrc mv ./stirling-pdf/build/libs/*.jar /opt/Stirling-PDF/Stirling-PDF-$RELEASE.jar
PYTHONPATH=/usr/lib/libreoffice/program:/opt/.venv/lib/python3.12/site-packages mv scripts /opt/Stirling-PDF/
LD_LIBRARY_PATH=/usr/lib/libreoffice/program mv pipeline /opt/Stirling-PDF/
mv stirling-pdf/src/main/resources/static/fonts/*.ttf /usr/share/fonts/opentype/noto/
STIRLING_TEMPFILES_DIRECTORY=/tmp/stirling-pdf ln -s /opt/Stirling-PDF/Stirling-PDF-$RELEASE.jar /opt/Stirling-PDF/Stirling-PDF.jar
TMPDIR=/tmp/stirling-pdf ln -s /usr/share/tesseract-ocr/5/tessdata/ /usr/share/tessdata
TEMP=/tmp/stirling-pdf msg_ok "Installed Stirling-PDF"
TMP=/tmp/stirling-pdf
# Paths
PATH=/opt/.venv/bin:/usr/lib/libreoffice/program:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
EOF
if [[ "$login_mode" == "true" ]]; then
cat <<EOF >>/opt/Stirling-PDF/.env
# activate Login
DISABLE_ADDITIONAL_FEATURES=false
SECURITY_ENABLELOGIN=true
# login credentials
SECURITY_INITIALLOGIN_USERNAME=admin
SECURITY_INITIALLOGIN_PASSWORD=stirling
EOF
fi
msg_ok "Created Environment Variables"
msg_info "Refreshing Font Cache"
$STD fc-cache -fv
msg_ok "Font Cache Updated"
msg_info "Creating Service" msg_info "Creating Service"
# Create LibreOffice listener service
cat <<EOF >/etc/systemd/system/libreoffice-listener.service cat <<EOF >/etc/systemd/system/libreoffice-listener.service
[Unit] [Unit]
Description=LibreOffice Headless Listener Service Description=LibreOffice Headless Listener Service
@ -148,6 +109,14 @@ Restart=always
WantedBy=multi-user.target WantedBy=multi-user.target
EOF EOF
# Set up environment variables
cat <<EOF >/opt/Stirling-PDF/.env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/libreoffice/program
UNO_PATH=/usr/lib/libreoffice/program
PYTHONPATH=/usr/lib/python3/dist-packages:/usr/lib/libreoffice/program
LD_LIBRARY_PATH=/usr/lib/libreoffice/program
EOF
cat <<EOF >/etc/systemd/system/stirlingpdf.service cat <<EOF >/etc/systemd/system/stirlingpdf.service
[Unit] [Unit]
Description=Stirling-PDF service Description=Stirling-PDF service
@ -170,32 +139,16 @@ RestartSec=10
WantedBy=multi-user.target WantedBy=multi-user.target
EOF EOF
cat <<EOF >/etc/systemd/system/unoserver.service # Enable and start services
[Unit]
Description=UnoServer RPC Interface
After=libreoffice-listener.service
Requires=libreoffice-listener.service
[Service]
Type=simple
ExecStart=/usr/local/bin/unoserver --port 2003 --interface 127.0.0.1
Restart=always
EnvironmentFile=/opt/Stirling-PDF/.env
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now libreoffice-listener systemctl enable -q --now libreoffice-listener
systemctl enable -q --now stirlingpdf systemctl enable -q --now stirlingpdf
systemctl enable -q --now unoserver
msg_ok "Created Service" msg_ok "Created Service"
motd_ssh motd_ssh
customize customize
msg_info "Cleaning up" msg_info "Cleaning up"
rm -f /tmp/jbig2enc.tar.gz rm -rf v${RELEASE}.tar.gz /zulu-repo_1.0.0-3_all.deb
$STD apt-get -y autoremove $STD apt-get -y autoremove
$STD apt-get -y autoclean $STD apt-get -y autoclean
msg_ok "Cleaned" msg_ok "Cleaned"

View File

@ -1142,48 +1142,64 @@ EOF
echo "" echo ""
msg_custom "⚙️ " "\e[96m" "Configuring VAAPI passthrough for LXC container" msg_custom "⚙️ " "\e[96m" "Configuring VAAPI passthrough for LXC container"
if [ "$CT_TYPE" != "0" ]; then if [ "$CT_TYPE" != "0" ]; then
msg_custom "⚠️ " "\e[33m" "Container is unprivileged VAAPI passthrough may not work without additional host configuration (e.g., idmap)." msg_custom "⚠️ " "\e[33m" "Container is unprivileged VAAPI passthrough may not work without additional host configuration (e.g., idmap)."
fi fi
msg_custom " " "\e[96m" "VAAPI enables GPU hardware acceleration (e.g., for video transcoding in Jellyfin or Plex)." msg_custom " " "\e[96m" "VAAPI enables GPU hardware acceleration (e.g., for video transcoding in Jellyfin or Plex)."
echo "" echo ""
read -rp "➤ Automatically mount all available VAAPI devices? [Y/n]: " VAAPI_ALL read -rp "➤ Automatically mount all available VAAPI devices? [Y/n]: " VAAPI_ALL
if [[ "$VAAPI_ALL" =~ ^[Yy]$|^$ ]]; then if [[ "$VAAPI_ALL" =~ ^[Yy]$|^$ ]]; then
if [ "$CT_TYPE" == "0" ]; then # Mount all devices automatically
# PRV Container → alles zulässig if [[ -e /dev/dri/renderD128 ]]; then
[[ -e /dev/dri/renderD128 ]] && { echo "lxc.cgroup2.devices.allow: c 226:128 rwm" >>"$LXC_CONFIG"
echo "lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file" >>"$LXC_CONFIG"
fi
if [[ -e /dev/dri/card0 ]]; then
echo "lxc.cgroup2.devices.allow: c 226:0 rwm" >>"$LXC_CONFIG"
echo "lxc.mount.entry: /dev/dri/card0 dev/dri/card0 none bind,optional,create=file" >>"$LXC_CONFIG"
fi
if [[ -e /dev/fb0 ]]; then
echo "lxc.cgroup2.devices.allow: c 29:0 rwm" >>"$LXC_CONFIG"
echo "lxc.mount.entry: /dev/fb0 dev/fb0 none bind,optional,create=file" >>"$LXC_CONFIG"
fi
if [[ -d /dev/dri ]]; then
echo "lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir" >>"$LXC_CONFIG"
fi
else
# Manual selection per device
if [[ -e /dev/dri/renderD128 ]]; then
read -rp "➤ Mount /dev/dri/renderD128 (GPU rendering)? [y/N]: " MOUNT_D128
if [[ "$MOUNT_D128" =~ ^[Yy]$ ]]; then
echo "lxc.cgroup2.devices.allow: c 226:128 rwm" >>"$LXC_CONFIG" echo "lxc.cgroup2.devices.allow: c 226:128 rwm" >>"$LXC_CONFIG"
echo "lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file" >>"$LXC_CONFIG" echo "lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file" >>"$LXC_CONFIG"
} fi
[[ -e /dev/dri/card0 ]] && { fi
if [[ -e /dev/dri/card0 ]]; then
read -rp "➤ Mount /dev/dri/card0 (GPU hardware interface)? [y/N]: " MOUNT_CARD0
if [[ "$MOUNT_CARD0" =~ ^[Yy]$ ]]; then
echo "lxc.cgroup2.devices.allow: c 226:0 rwm" >>"$LXC_CONFIG" echo "lxc.cgroup2.devices.allow: c 226:0 rwm" >>"$LXC_CONFIG"
echo "lxc.mount.entry: /dev/dri/card0 dev/dri/card0 none bind,optional,create=file" >>"$LXC_CONFIG" echo "lxc.mount.entry: /dev/dri/card0 dev/dri/card0 none bind,optional,create=file" >>"$LXC_CONFIG"
}
[[ -e /dev/fb0 ]] && { fi
fi
if [[ -e /dev/fb0 ]]; then
read -rp "➤ Mount /dev/fb0 (Framebuffer, GUI)? [y/N]: " MOUNT_FB0
if [[ "$MOUNT_FB0" =~ ^[Yy]$ ]]; then
echo "lxc.cgroup2.devices.allow: c 29:0 rwm" >>"$LXC_CONFIG" echo "lxc.cgroup2.devices.allow: c 29:0 rwm" >>"$LXC_CONFIG"
echo "lxc.mount.entry: /dev/fb0 dev/fb0 none bind,optional,create=file" >>"$LXC_CONFIG" echo "lxc.mount.entry: /dev/fb0 dev/fb0 none bind,optional,create=file" >>"$LXC_CONFIG"
} fi
[[ -d /dev/dri ]] && {
echo "lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir" >>"$LXC_CONFIG"
}
else
# UNPRV Container → nur devX für UI
[[ -e /dev/dri/card0 ]] && echo "dev0: /dev/dri/card0,gid=44" >>"$LXC_CONFIG"
[[ -e /dev/dri/card1 ]] && echo "dev0: /dev/dri/card1,gid=44" >>"$LXC_CONFIG"
[[ -e /dev/dri/renderD128 ]] && echo "dev1: /dev/dri/renderD128,gid=104" >>"$LXC_CONFIG"
fi fi
fi
fi if [[ -d /dev/dri ]]; then
if [ "$CT_TYPE" == "1" ] && [ "$is_vaapi_app" == "true" ]; then echo "lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir" >>"$LXC_CONFIG"
if [[ -e /dev/dri/card0 ]]; then fi
echo "dev0: /dev/dri/card0,gid=44" >>"$LXC_CONFIG"
elif [[ -e /dev/dri/card1 ]]; then
echo "dev0: /dev/dri/card1,gid=44" >>"$LXC_CONFIG"
fi
if [[ -e /dev/dri/renderD128 ]]; then
echo "dev1: /dev/dri/renderD128,gid=104" >>"$LXC_CONFIG"
fi fi
fi fi

View File

@ -355,6 +355,7 @@ msg_custom() {
[[ -z "$msg" ]] && return [[ -z "$msg" ]] && return
stop_spinner stop_spinner
echo -e "${BFR:-} ${symbol} ${color}${msg}${CL:-\e[0m}" echo -e "${BFR:-} ${symbol} ${color}${msg}${CL:-\e[0m}"
printf "\r\033[K\e[?25h\n"
} }
run_container_safe() { run_container_safe() {

View File

@ -368,6 +368,25 @@ function setup_mysql() {
# PHP_MAX_EXECUTION_TIME - (default: 300) # PHP_MAX_EXECUTION_TIME - (default: 300)
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# ------------------------------------------------------------------------------
# Installs PHP with selected modules and configures Apache/FPM support.
#
# Description:
# - Adds Sury PHP repo if needed
# - Installs default and user-defined modules
# - Patches php.ini for CLI, Apache, and FPM as needed
#
# Variables:
# PHP_VERSION - PHP version to install (default: 8.4)
# PHP_MODULE - Additional comma-separated modules
# PHP_APACHE - Set YES to enable PHP with Apache
# PHP_FPM - Set YES to enable PHP-FPM
# PHP_MEMORY_LIMIT - (default: 512M)
# PHP_UPLOAD_MAX_FILESIZE - (default: 128M)
# PHP_POST_MAX_SIZE - (default: 128M)
# PHP_MAX_EXECUTION_TIME - (default: 300)
# ------------------------------------------------------------------------------
function setup_php() { function setup_php() {
local PHP_VERSION="${PHP_VERSION:-8.4}" local PHP_VERSION="${PHP_VERSION:-8.4}"
local PHP_MODULE="${PHP_MODULE:-}" local PHP_MODULE="${PHP_MODULE:-}"
@ -898,7 +917,7 @@ function fetch_and_deploy_gh_release() {
} }
} }
### Prebuild Mode ### ### Prebuild Mode ###
elif [[ "$mode" == "prebuild" ]]; then elif [[ "$mode" == "prebuild" ]]; then
local pattern="${6%\"}" local pattern="${6%\"}"
pattern="${pattern#\"}" pattern="${pattern#\"}"
@ -917,6 +936,7 @@ function fetch_and_deploy_gh_release() {
break break
;; ;;
esac esac
done done
[[ -z "$asset_url" ]] && { [[ -z "$asset_url" ]] && {
@ -932,42 +952,39 @@ function fetch_and_deploy_gh_release() {
return 1 return 1
} }
local unpack_tmp
unpack_tmp=$(mktemp -d)
mkdir -p "$target" mkdir -p "$target"
if [[ "$filename" == *.zip ]]; then if [[ "$filename" == *.zip ]]; then
if ! command -v unzip &>/dev/null; then if ! command -v unzip &>/dev/null; then
$STD apt-get install -y unzip $STD apt-get install -y unzip
fi fi
unzip -q "$tmpdir/$filename" -d "$unpack_tmp"
local top_level_entries
top_level_entries=$(unzip -l "$tmpdir/$filename" | awk '{print $4}' | grep -v '^$' | cut -d/ -f1 | sort -u)
if [[ $(wc -l <<<"$top_level_entries") -eq 1 ]]; then
unzip -q "$tmpdir/$filename" -d "$tmpdir/unzip"
shopt -s dotglob nullglob
cp -r "$tmpdir/unzip/"* "$target/"
shopt -u dotglob nullglob
else
unzip -q "$tmpdir/$filename" -d "$target"
fi
elif [[ "$filename" == *.tar.* ]]; then elif [[ "$filename" == *.tar.* ]]; then
tar -xf "$tmpdir/$filename" -C "$unpack_tmp" local top_level_entries
top_level_entries=$(tar -tf "$tmpdir/$filename" | cut -d/ -f1 | sort -u)
if [[ $(wc -l <<<"$top_level_entries") -eq 1 ]]; then
tar --strip-components=1 -xf "$tmpdir/$filename" -C "$target"
else
tar -xf "$tmpdir/$filename" -C "$target"
fi
else else
msg_error "Unsupported archive format: $filename" msg_error "Unsupported archive format: $filename"
rm -rf "$tmpdir" "$unpack_tmp" rm -rf "$tmpdir"
return 1 return 1
fi fi
local top_dirs
top_dirs=$(find "$unpack_tmp" -mindepth 1 -maxdepth 1 -type d | wc -l)
if [[ "$top_dirs" -eq 1 ]]; then
# Strip leading folder
local inner_dir
inner_dir=$(find "$unpack_tmp" -mindepth 1 -maxdepth 1 -type d)
shopt -s dotglob nullglob
cp -r "$inner_dir"/* "$target/"
shopt -u dotglob nullglob
else
# Copy all contents
shopt -s dotglob nullglob
cp -r "$unpack_tmp"/* "$target/"
shopt -u dotglob nullglob
fi
rm -rf "$unpack_tmp"
### Singlefile Mode ### ### Singlefile Mode ###
elif [[ "$mode" == "singlefile" ]]; then elif [[ "$mode" == "singlefile" ]]; then
local pattern="${6%\"}" local pattern="${6%\"}"