Compare commits

..
Author SHA1 Message Date
CanbiZ (MickLesk) f702942f16 Refactor HomeTube installation script
Removed unnecessary installation of pyarrow and adjusted message order.
2026-10-26 08:57:53 +01:00
push-app-to-main[bot] 8c28ae95fe Add hometube (ct) 2026-10-25 12:06:36 +00:00
53 changed files with 318 additions and 1793 deletions

No files matched your search

-49
View File
@@ -568,51 +568,12 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
</details>
## 2026-10-26
### 🆕 New Scripts
- HomeTube ([#18172](https://github.com/community-scripts/ProxmoxVE/pull/18172))
- Honcho ([#18169](https://github.com/community-scripts/ProxmoxVE/pull/18169))
- YTPTube ([#18174](https://github.com/community-scripts/ProxmoxVE/pull/18174))
- Stump ([#18173](https://github.com/community-scripts/ProxmoxVE/pull/18173))
- Casdoor ([#18170](https://github.com/community-scripts/ProxmoxVE/pull/18170))
- Streamystats ([#18171](https://github.com/community-scripts/ProxmoxVE/pull/18171))
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- excalidash: bump Node.js from 20 to 24 [@github-actions[bot]](https://github.com/github-actions[bot]) ([#18213](https://github.com/community-scripts/ProxmoxVE/pull/18213))
- readmeabook: bump Node.js from 20 to 24 [@github-actions[bot]](https://github.com/github-actions[bot]) ([#18217](https://github.com/community-scripts/ProxmoxVE/pull/18217))
- homepage: bump Node.js from 22 to 24 [@github-actions[bot]](https://github.com/github-actions[bot]) ([#18214](https://github.com/community-scripts/ProxmoxVE/pull/18214))
- remove old -install.sh (verdaccio) [@github-actions[bot]](https://github.com/github-actions[bot]) ([#18218](https://github.com/community-scripts/ProxmoxVE/pull/18218))
- meshcentral: bump Node.js from 22 to 24 [@github-actions[bot]](https://github.com/github-actions[bot]) ([#18215](https://github.com/community-scripts/ProxmoxVE/pull/18215))
## 2026-10-25
### 🆕 New Scripts
- Dreeve ([#18167](https://github.com/community-scripts/ProxmoxVE/pull/18167))
- TaskView ([#18166](https://github.com/community-scripts/ProxmoxVE/pull/18166))
- EmDash ([#18165](https://github.com/community-scripts/ProxmoxVE/pull/18165))
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- fix(mealie): install ffmpeg for video recipe import [@clartek](https://github.com/clartek) ([#18210](https://github.com/community-scripts/ProxmoxVE/pull/18210))
- Termix: step through 2.9.2 when updating from 2.8 or older [@MickLesk](https://github.com/MickLesk) ([#18158](https://github.com/community-scripts/ProxmoxVE/pull/18158))
- Element Synapse: remove the registration line by its text, not line 34 [@MickLesk](https://github.com/MickLesk) ([#18201](https://github.com/community-scripts/ProxmoxVE/pull/18201))
- Element Synapse: drop the ::1 listener so a container without IPv6 starts [@MickLesk](https://github.com/MickLesk) ([#18180](https://github.com/community-scripts/ProxmoxVE/pull/18180))
- Heimdall: generate the app key without the production prompt [@MickLesk](https://github.com/MickLesk) ([#18156](https://github.com/community-scripts/ProxmoxVE/pull/18156))
- Frigate: fetch the Intel graphics key with retries before building the media driver [@MickLesk](https://github.com/MickLesk) ([#18192](https://github.com/community-scripts/ProxmoxVE/pull/18192))
- Pterodactyl Panel: default the admin's first and last name when left empty [@MickLesk](https://github.com/MickLesk) ([#18177](https://github.com/community-scripts/ProxmoxVE/pull/18177))
- Jellyseerr: point fresh installs to Seerr instead of a missing install script [@MickLesk](https://github.com/MickLesk) ([#18183](https://github.com/community-scripts/ProxmoxVE/pull/18183))
- Pi-hole: download the installer before running it [@MickLesk](https://github.com/MickLesk) ([#18182](https://github.com/community-scripts/ProxmoxVE/pull/18182))
- OmniTools: give the build a git commit to read [@MickLesk](https://github.com/MickLesk) ([#18181](https://github.com/community-scripts/ProxmoxVE/pull/18181))
- iVentoy: stop early in an unprivileged container [@MickLesk](https://github.com/MickLesk) ([#18179](https://github.com/community-scripts/ProxmoxVE/pull/18179))
- Immich: stop early on Debian 12 instead of failing at apt [@MickLesk](https://github.com/MickLesk) ([#18178](https://github.com/community-scripts/ProxmoxVE/pull/18178))
- paperless-ngx: fix missing index folder [@Segelzwerg](https://github.com/Segelzwerg) ([#18142](https://github.com/community-scripts/ProxmoxVE/pull/18142))
- Anytype Server: keep the .env across updates and recreate a lost one [@MickLesk](https://github.com/MickLesk) ([#18155](https://github.com/community-scripts/ProxmoxVE/pull/18155))
- changedetection: build Browserless from its lockfile on update [@MickLesk](https://github.com/MickLesk) ([#18157](https://github.com/community-scripts/ProxmoxVE/pull/18157))
@@ -623,15 +584,6 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
- Gramps-Web: run the Celery task queue with Redis [@MickLesk](https://github.com/MickLesk) ([#18141](https://github.com/community-scripts/ProxmoxVE/pull/18141))
- #### 💥 Breaking Changes
- Hermes Agent: install, update and run everything as the hermes user [@MickLesk](https://github.com/MickLesk) ([#18203](https://github.com/community-scripts/ProxmoxVE/pull/18203))
- tubearchivist: fix: prepare tubearchivist for v0.6.0 [@CrazyWolf13](https://github.com/CrazyWolf13) ([#17867](https://github.com/community-scripts/ProxmoxVE/pull/17867))
- #### 🔧 Refactor
- TREK: build 5.0 with 4 GB RAM and without dependency install scripts [@MickLesk](https://github.com/MickLesk) ([#18194](https://github.com/community-scripts/ProxmoxVE/pull/18194))
### 💾 Core
- alpine: fix uv release url [@mfelipe](https://github.com/mfelipe) ([core#168](https://github.com/community-scripts/core/pull/168))
@@ -642,7 +594,6 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
- #### ✨ New Features
- post-pmg-install: hide the subscription nag in the PMG 9 mobile quarantine [@MickLesk](https://github.com/MickLesk) ([#18140](https://github.com/community-scripts/ProxmoxVE/pull/18140))
- post-pve-install: hide the mobile subscription nag in every UI language [@MickLesk](https://github.com/MickLesk) ([#18143](https://github.com/community-scripts/ProxmoxVE/pull/18143))
## 2026-10-24
+1
View File
@@ -191,6 +191,7 @@ create` still ran and the container was still built.
## Notes
- **Website metadata** (name, description, logo, tags) is managed via the website — use the "Report Issue" link on any script page to request changes. Do not submit metadata changes via repo files.
- **JSON files** in `json/` define script properties used by the website. See existing files for structure reference.
- Keep PRs small and focused. One fix or feature per PR is ideal.
- PRs with **new scripts** opened against ProxmoxVE will be closed — submit them to [DevScripts](https://github.com/community-scripts/DevScripts) instead.
- PRs that fail CI checks will not be merged.
+71 -129
View File
@@ -1,17 +1,16 @@
<div align="center">
<a href="misc/images/community-scripts.svg"><img src="misc/images/community-scripts.png" width="112" height="112" alt="Community Scripts — Proxmox VE logo" /></a>
<!-- Editable artwork: misc/images/community-scripts.svg; PNG export: 512 × 512. -->
<img src="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/images/logo-81x112.png" height="112px" alt="Proxmox VE Helper-Scripts Logo" />
<h1>Community Scripts — Proxmox VE</h1>
<p><strong>One-command installations for services, containers and VMs on Proxmox VE</strong><br/>
<h1>Proxmox VE Helper-Scripts</h1>
<p><strong>One-command installations for services, containers, and VMs on Proxmox VE</strong><br/>
A community project — built on the foundation of <a href="https://github.com/tteck">@tteck</a>'s original work</p>
<p>
<a href="https://community-scripts.org"><img src="https://img.shields.io/badge/Website-community--scripts.org-4c9b3f?style=flat-square" alt="Website" /></a>
<a href="https://discord.gg/3AnUqsXnmK"><img src="https://img.shields.io/badge/Discord-Join_us-7289da?style=flat-square&logo=discord&logoColor=white" alt="Discord" /></a>
<a href="https://github.com/community-scripts/ProxmoxVE/stargazers"><img src="https://img.shields.io/github/stars/community-scripts/ProxmoxVE?style=flat-square&label=Stars&color=f5a623" alt="Stars" /></a>
<a href="https://github.com/community-scripts/ProxmoxVE/blob/main/CHANGELOG.md"><img src="https://img.shields.io/badge/Changelog-view-6c5ce7?style=flat-square" alt="Changelog" /></a>
<a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue?style=flat-square" alt="License" /></a>
<a href="https://community-scripts.org"><img src="https://img.shields.io/badge/Website-community--scripts.org-4c9b3f?style=flat-square" /></a>
<a href="https://discord.gg/3AnUqsXnmK"><img src="https://img.shields.io/badge/Discord-Join_us-7289da?style=flat-square&logo=discord&logoColor=white" /></a>
<a href="https://github.com/community-scripts/ProxmoxVE/stargazers"><img src="https://img.shields.io/github/stars/community-scripts/ProxmoxVE?style=flat-square&label=Stars&color=f5a623" /></a>
<a href="https://github.com/community-scripts/ProxmoxVE/blob/main/CHANGELOG.md"><img src="https://img.shields.io/badge/Changelog-view-6c5ce7?style=flat-square" /></a>
<a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue?style=flat-square" /></a>
</p>
</div>
@@ -19,147 +18,94 @@
## What is this?
**The canonical application scripts.** More than 700 of them, covering home
automation, media, networking, databases, monitoring, security and developer
tooling. Paste one command into your Proxmox shell and the container or VM is
built, configured and running.
**Simplify your Proxmox VE setup with community-driven automation scripts.**
A script only describes *what* to install. Creating the container, asking the
questions and handling the errors is the job of the shared engine in
[core](https://github.com/community-scripts/core), which every script loads at
start-up. The same scripts run unchanged on an Incus host through
[the Incus repository](https://github.com/community-scripts/Incus).
Install and configure popular self-hosted services with a single command — no manual package hunting, no config file archaeology. Paste a command into your Proxmox shell, answer a few prompts, and your container or VM is up and running.
Ready-made commands for every application are on
[community-scripts.org](https://community-scripts.org).
---
## Getting started
1. Go to **[community-scripts.org](https://community-scripts.org)**
2. Search for the service you want — Home Assistant, Nginx Proxy Manager, Jellyfin
3. Copy the one-line install command from the script page
4. Open your **Proxmox shell** and paste it
5. Choose **Default** or **Advanced** and follow the prompts
Each script page lists what the container includes, the default resources and
the post-install notes.
> These commands run as root on your host. Every script is readable in this
> repository, and each script page links to its source — read it before you
> paste it, as you would with any installer.
---
## How scripts work
**Default** picks sensible resources and asks only what it has to. Most installs
finish in a few minutes.
**Advanced** hands you container settings, networking, storage backend and
application options before anything is created.
Every container gets an `update` command. Type it in the container console:
```bash
update
```
It updates the installed application and reaches settings that would otherwise
mean editing config files by hand. VM scripts have no built-in updater — use the
guest's own package manager.
The collection covers hundreds of services across categories like home automation, media servers, networking tools, databases, monitoring stacks, and more.
---
## Requirements
| Component | Details |
| --------- | ------- |
| **Proxmox VE** | 8.0 – 8.4, or 9.0 – 9.2 |
| **Access** | Root shell on the Proxmox host |
| **Network** | Internet access during installation |
Virtual machine scripts need the same versions as containers.
| Component | Details |
| -------------- | ------------------------------------------------ |
| **Proxmox VE** | Version 8.4, 9.0, 9.1, or 9.2 |
| **Host OS** | Proxmox VE (Debian-based) |
| **Access** | Root shell access on the Proxmox host |
| **Network** | Internet connection required during installation |
---
## Repository map
## Getting Started
| Repository | Contains |
| ---------- | -------- |
| [core](https://github.com/community-scripts/core) | The engine — container and VM creation, the wizard, error handling |
| **ProxmoxVE** (this repo) | Canonical application scripts, plus `tools/pve/`, `vm/` and `turnkey/` |
| [Incus](https://github.com/community-scripts/Incus) | The same scripts on an Incus host, plus Incus VMs and host tooling |
| [DevScripts](https://github.com/community-scripts/DevScripts) | Where new scripts are tested before they land here |
The fastest way to find and run scripts:
1. Go to **[community-scripts.org](https://community-scripts.org)**
2. Search for the service you want (e.g. "Home Assistant", "Nginx Proxy Manager", "Jellyfin")
3. Copy the one-line install command from the script page
4. Open your **Proxmox Shell** and paste it
5. Choose between **Default** or **Advanced** setup and follow the prompts
Each script page documents what the container includes, default resource allocation, and post-install notes.
---
## Layout
## How Scripts Work
| Folder | Contents |
| ------ | -------- |
| `ct/` | Application scripts — the command you paste |
| `install/` | What each script installs inside the container |
| `vm/` | Virtual machine scripts |
| `tools/pve/` | Host tooling: post-install, hardware passthrough, maintenance |
| `turnkey/` | TurnKey Linux appliance helper |
| `misc/` | Legacy engine copies — current scripts load [core](https://github.com/community-scripts/core) at runtime, so changes here never reach a running install |
Every script follows the same pattern:
Application metadata — name, description, logo, tags — is managed on the website,
not in this repository. Use the **Report Issue** link on any script page to
request a change.
**Default mode** — Picks sensible resource defaults (CPU, RAM, storage) and asks only the minimum required questions. Most installs finish in under five minutes.
**Advanced mode** — Gives you full control over container settings, networking, storage backends, and application-level configuration before anything is installed.
After installation, each container ships with a **post-install helper** accessible from the Proxmox shell. It handles common tasks like:
- Applying updates to the installed service
- Changing application settings without manually editing config files
- Basic troubleshooting and log access
---
## Testing a fork or branch
## What's Included
Engine and scripts resolve independently, so either can point somewhere else.
Put the variable on the command itself — nothing needs exporting.
The repository covers a wide range of categories. A few examples:
To run your own copy of the scripts:
| Category | Examples |
| --------------- | --------------------------------------------------- |
| Home Automation | Home Assistant, Zigbee2MQTT, ESPHome, Node-RED |
| Media | Jellyfin, Plex, Radarr, Sonarr, Immich |
| Networking | AdGuard Home, Nginx Proxy Manager, Pi-hole, Traefik |
| Monitoring | Grafana, Prometheus, Uptime Kuma, Netdata |
| Databases | PostgreSQL, MariaDB, Redis, InfluxDB |
| Security | Vaultwarden, CrowdSec, Authentik |
| Dev & Tools | Gitea, Portainer, VS Code Server, n8n |
```bash
COMMUNITY_SCRIPTS_URL=https://raw.githubusercontent.com/YOU/ProxmoxVE/my-branch \
bash -c "$(curl -fsSL https://raw.githubusercontent.com/YOU/ProxmoxVE/my-branch/ct/debian.sh)"
```
A `ct/` script fetched with `curl` cannot tell the engine where it came from, so
without that variable it would look for its `install/` half upstream.
Only when you are changing the engine itself:
```bash
COMMUNITY_SCRIPTS_CORE_URL=https://raw.githubusercontent.com/YOU/core/my-branch \
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/debian.sh)"
```
A local checkout of core wins over both — point at it with
`COMMUNITY_SCRIPTS_CORE_DIR`.
> Browse the full list at **[community-scripts.org/categories](https://community-scripts.org/categories)** — new scripts are added regularly.
---
## Contributing
This project runs on community contributions. New scripts, fixes, bug reports —
all of it helps.
This project runs on community contributions. Whether you want to write new scripts, improve existing ones, or just report a bug — every bit helps.
| I want to… | Go here |
| ---------- | ------- |
| Add a **new** script | [DevScripts](https://github.com/community-scripts/DevScripts) — new scripts are tested there first |
| Fix or improve an **existing** script | [Contributing Guidelines](CONTRIBUTING.md) — open a PR here |
| Change how containers are built | [core](https://github.com/community-scripts/core) |
| Report a bug or a broken script | [Issues](https://github.com/community-scripts/ProxmoxVE/issues) |
| Request a script or a feature | [Discussions](https://github.com/community-scripts/ProxmoxVE/discussions) |
| Report a security vulnerability | [Security Policy](SECURITY.md) |
| Ask a question | [Discord](https://discord.gg/3AnUqsXnmK) |
### Where to start
| I want to… | Go here |
| ------------------------------------- | ------------------------------------------------------------------------------------------------- |
| Add a **new** script | [DevScripts](https://github.com/community-scripts/DevScripts) — new scripts are tested here first |
| Fix or improve an **existing** script | [Contributing Guidelines](CONTRIBUTING.md) — open a PR in this repo |
| Report a bug or broken script | [Issues](https://github.com/community-scripts/ProxmoxVE/issues) |
| Request a new script or feature | [Discussions](https://github.com/community-scripts/ProxmoxVE/discussions) |
| Report a security vulnerability | [Security Policy](SECURITY.md) |
| Get help or chat with other users | [Discord](https://discord.gg/3AnUqsXnmK) |
### Before you open a PR
- **New scripts go to [DevScripts](https://github.com/community-scripts/DevScripts), not here.** PRs adding new scripts to this repository will be closed.
- Keep a PR to one fix or one feature.
- A bug that also happens on Incus is an application or engine bug — say so in the report.
- Read the [Contributing Guidelines](CONTRIBUTING.md) before your first PR.
- **New scripts go to [DevScripts](https://github.com/community-scripts/DevScripts), not here.** PRs with new scripts opened directly against this repo will be closed.
- Bug fixes and improvements to existing scripts belong in this repo — read the [Contributing Guidelines](CONTRIBUTING.md) first.
- Keep PRs focused. One fix or feature per PR.
- Document what your script installs and any non-obvious decisions in the corresponding JSON metadata file.
---
@@ -191,8 +137,6 @@ all of it helps.
<sub><b>CrazyWolf13</b></sub>
</a>
</td>
</tr>
<tr>
<td align="center">
<a href="https://github.com/tremor021">
<img src="https://github.com/tremor021.png" width="80" height="80" style="border-radius:50%" alt="tremor021" /><br/>
@@ -211,7 +155,6 @@ all of it helps.
<sub><b>asylumexp</b></sub>
</a>
</td>
<td></td>
</tr>
</table>
@@ -251,11 +194,9 @@ all of it helps.
## Support the Project
This project is maintained by volunteers. Infrastructure costs come out of
pocket and the work happens in people's spare time.
This project is maintained by volunteers. All infrastructure costs come out of pocket, and the work is done in people's spare time.
**30% of all donations are forwarded directly to cancer research and hospice
care** — a cause that was important to tteck.
**30% of all donations are forwarded directly to cancer research and hospice care** — a cause that was important to tteck.
<div align="center">
<a href="https://ko-fi.com/community_scripts">
@@ -271,13 +212,14 @@ care** — a cause that was important to tteck.
## License
MIT — free to use, modify and redistribute, for personal and commercial
purposes. See [LICENSE](LICENSE).
This project is licensed under the [MIT License](LICENSE) — free to use, modify, and redistribute for personal and commercial purposes.
See the full license text in [LICENSE](LICENSE).
---
<div align="center">
<sub>Built on the foundation of <a href="https://github.com/tteck">tteck</a>'s original work · <a href="https://github.com/tteck/Proxmox">Original Repository</a></sub><br/>
<sub>Maintained and expanded by the community · In memory of tteck</sub><br/>
<sub><i>This is an independent community project. <b>Proxmox</b>® is a registered trademark of <a href="https://www.proxmox.com/en/about/company">Proxmox Server Solutions GmbH</a>.</i></sub>
<sub><i>Proxmox® is a registered trademark of <a href="https://www.proxmox.com/en/about/company">Proxmox Server Solutions GmbH</a></i></sub>
</div>
-56
View File
@@ -1,56 +0,0 @@
#!/usr/bin/env bash
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/build.func")
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/casdoor/casdoor
APP="Casdoor"
var_tags="${var_tags:-auth;sso;iam}"
var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-1024}"
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}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /opt/casdoor ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "casdoor" "casdoor/casdoor"; then
msg_info "Stopping Casdoor"
systemctl stop casdoor
msg_ok "Stopped Casdoor"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "casdoor" "casdoor/casdoor" "prebuild" "latest" "/opt/casdoor" "casdoor_Linux_$(arch_resolve "x86_64" "arm64").tar.gz"
msg_info "Starting Casdoor"
systemctl start casdoor
msg_ok "Started Casdoor"
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 "${GATEWAY}${BGN}http://${IP}:8000${CL}"
-80
View File
@@ -1,80 +0,0 @@
#!/usr/bin/env bash
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/build.func")
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/dreeveapp/dreeve
APP="Dreeve"
var_tags="${var_tags:-fitness;dashboard}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-2048}"
var_disk="${var_disk:-10}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
#var_arm64="${var_arm64:-no}" # unset = ask the user; set yes/no only when verified
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/dreeve ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "dreeve" "dreeveapp/dreeve"; then
msg_info "Stopping Service"
systemctl stop dreeve
msg_ok "Stopped Service"
create_backup /opt/dreeve/.env.local /opt/dreeve/Caddyfile
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "dreeve" "dreeveapp/dreeve" "tarball"
restore_backup
msg_info "Installing PHP Dependencies (Patience)"
cd /opt/dreeve
export COMPOSER_ALLOW_SUPERUSER=1
export APP_ENV=prod
$STD /opt/frankenphp/frankenphp php-cli /usr/local/bin/composer install --no-dev --optimize-autoloader --no-interaction --no-scripts
msg_ok "Installed PHP Dependencies"
msg_info "Running Migrations"
mkdir -p /opt/dreeve/var/{cache,log}
set -a
source /opt/dreeve/.env.local
set +a
$STD /opt/frankenphp/frankenphp php-cli bin/console app:db:migrate --no-interaction
$STD /opt/frankenphp/frankenphp php-cli bin/console assets:install public --no-interaction
rm -rf /opt/dreeve/var/cache/prod
$STD /opt/frankenphp/frankenphp php-cli bin/console cache:warmup --env=prod
msg_ok "Ran Migrations"
msg_info "Starting Service"
systemctl start dreeve
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 "${GATEWAY}${BGN}http://${IP}:8080${CL}"
echo -e "${INFO}${YW}Admin credentials: ~/dreeve.creds (inside the container)${CL}"
echo -e "${INFO}${YW}Add your Strava API credentials to /opt/dreeve/.env.local first${CL}"
-72
View File
@@ -1,72 +0,0 @@
#!/usr/bin/env bash
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/build.func")
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/emdash-cms/emdash
APP="EmDash"
var_tags="${var_tags:-cms;blog}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-3072}"
var_disk="${var_disk:-6}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
export var_emdash_url="${var_emdash_url:-}"
export var_emdash_template="${var_emdash_template:-}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /opt/emdash ]]; then
msg_error "No EmDash Installation Found!"
exit
fi
if check_for_gh_release "emdash" "emdash-cms/emdash" "" "" "emdash@"; then
msg_info "Stopping EmDash"
systemctl stop emdash
msg_ok "Stopped EmDash"
NODE_VERSION="24" NODE_MODULE="pnpm@11" setup_nodejs
msg_info "Updating EmDash"
cd /opt/emdash
set -a && source /opt/emdash_data/.env && set +a
$STD pnpm add "${CHECK_UPDATE_RELEASE}"
$STD pnpm build
$STD pnpm store prune
cat <<EOF >~/.emdash
${CHECK_UPDATE_RELEASE}
EOF
msg_ok "Updated EmDash"
msg_info "Starting EmDash"
systemctl start emdash
msg_ok "Started EmDash"
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 "${GATEWAY}${BGN}http://${IP}:4321${CL}"
echo -e "${INFO}${YW}The admin at /_emdash/admin signs in with passkeys only, and browsers allow those on HTTPS with a domain or on localhost, never on an IP address.${CL}"
echo -e "${INFO}${YW}Put EmDash behind a reverse proxy with a trusted certificate, set EMDASH_SITE_URL in /opt/emdash_data/.env to that address and rebuild (see the notes), then create the admin there.${CL}"
+1 -2
View File
@@ -35,8 +35,7 @@ function update_script() {
msg_info "Stopping Service"
systemctl stop excalidash
msg_ok "Stopped Service"
NODE_VERSION="24" setup_nodejs
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "excalidash" "ZimengXiong/ExcaliDash" "tarball"
ln -sf /opt/excalidash_data/.env /opt/excalidash/backend/.env
set -a && source /opt/excalidash_data/.env && set +a
+20 -44
View File
@@ -33,60 +33,36 @@ function update_script() {
confirm_external_installer "https://hermes-agent.nousresearch.com/" "hermes update (https://hermes-agent.nousresearch.com/)"
if [[ -f /etc/systemd/system/hermes-dashboard.service ]]; then
msg_info "Moving Hermes to its own user"
systemctl disable -q --now hermes-dashboard
rm -f /etc/systemd/system/hermes-dashboard.service
systemctl daemon-reload
mapfile -t root_hermes_pids < <(ps -eo user=,pid=,args= | awk '$1 == "root" && /\/home\/hermes\/\.hermes\// && /hermes_cli[.]main/ { print $2 }')
if ((${#root_hermes_pids[@]})); then
kill -TERM "${root_hermes_pids[@]}" 2>/dev/null || true
for pid in "${root_hermes_pids[@]}"; do
while kill -0 "$pid" 2>/dev/null; do
sleep 0.1
done
msg_info "Stopping Services"
systemctl stop hermes-dashboard
msg_ok "Stopped Services"
msg_info "Updating Hermes Agent"
$STD setsid --wait bash -c '
set -a; source /etc/default/hermes; set +a
/home/hermes/.local/bin/hermes update --yes
'
mapfile -t root_gateway_pids < <(ps -eo user=,pid=,args= | awk '$1 == "root" && /\/home\/hermes\/\.hermes\// && /hermes_cli[.]main/ && / gateway run --replace$/ { print $2 }')
if ((${#root_gateway_pids[@]})); then
kill -TERM "${root_gateway_pids[@]}"
for pid in "${root_gateway_pids[@]}"; do
while kill -0 "$pid" 2>/dev/null; do
sleep 0.1
done
fi
ensure_dependencies libatomic1
sed -i '/^HOME=/d' /etc/default/hermes
grep -q '^GATEWAY_HEALTH_URL=' /etc/default/hermes || echo "GATEWAY_HEALTH_URL=http://127.0.0.1:8642/health" >>/etc/default/hermes
mkdir -p /home/hermes/.config/systemd/user
cat <<EOF >/home/hermes/.config/systemd/user/hermes-dashboard.service
[Unit]
Description=Hermes Agent Web Dashboard
After=network-online.target
[Service]
Type=simple
UMask=0077
WorkingDirectory=%h
EnvironmentFile=/etc/default/hermes
ExecStart=%h/.local/bin/hermes dashboard --host 127.0.0.1 --port 9119 --no-open
Restart=on-failure
RestartSec=5
[Install]
WantedBy=default.target
EOF
msg_ok "Moved Hermes to its own user"
done
fi
if ps -eo user=,args= | awk '$1 == "root" && /\/home\/hermes\/\.hermes\// { found = 1 } END { exit !found }'; then
msg_warn "A root-owned Hermes process is still running; it may keep writing root-owned files"
fi
# A writer racing chown makes files vanish between readdir and chown; one retry covers it.
if ! chown -R hermes:hermes /home/hermes 2>/dev/null; then
sleep 1
chown -R hermes:hermes /home/hermes || msg_warn "Could not take ownership of everything under /home/hermes"
fi
$STD runuser -l hermes -c 'systemctl --user daemon-reload && systemctl --user enable hermes-dashboard'
msg_info "Updating Hermes Agent"
$STD setsid --wait runuser -l hermes -c '
set -a; source /etc/default/hermes; set +a
hermes update --yes
'
msg_ok "Updated Hermes Agent"
msg_info "Starting Services"
$STD runuser -l hermes -c 'systemctl --user start hermes-dashboard'
systemctl start hermes-dashboard
msg_ok "Started Services"
msg_ok "Updated successfully!"
exit
+1 -1
View File
@@ -30,7 +30,7 @@ function update_script() {
exit
fi
NODE_VERSION="24" NODE_MODULE="pnpm@latest" setup_nodejs
NODE_VERSION="22" NODE_MODULE="pnpm@latest" setup_nodejs
ensure_dependencies jq
if check_for_gh_release "homepage" "gethomepage/homepage"; then
-80
View File
@@ -1,80 +0,0 @@
#!/usr/bin/env bash
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/build.func")
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/plastic-labs/honcho
APP="Honcho"
var_tags="${var_tags:-ai;memory;agents}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-2048}"
var_disk="${var_disk:-6}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
export var_honcho_provider="${var_honcho_provider:-}"
export var_honcho_api_key="${var_honcho_api_key:-}"
export var_honcho_base_url="${var_honcho_base_url:-}"
export var_honcho_model="${var_honcho_model:-}"
export var_honcho_embedding_key="${var_honcho_embedding_key:-}"
export var_honcho_embedding_model="${var_honcho_embedding_model:-}"
export var_honcho_embedding_dims="${var_honcho_embedding_dims:-}"
header_info "$APP"
variables
color
catch_errors
if [[ -n "${var_honcho_provider}" && ! "${var_honcho_provider}" =~ ^(openai|anthropic|gemini)$ ]]; then
msg_error "var_honcho_provider must be openai, anthropic or gemini"
exit 1
fi
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /opt/honcho ]]; then
msg_error "No Honcho Installation Found!"
exit
fi
if check_for_gh_release "honcho" "plastic-labs/honcho" "" "" "v"; then
msg_info "Stopping Honcho"
systemctl stop honcho-deriver honcho
msg_ok "Stopped Honcho"
PYTHON_VERSION="3.13" setup_uv
CLEAN_INSTALL=1 CLEAN_INSTALL_KEEP=".env" fetch_and_deploy_gh_release "honcho" "plastic-labs/honcho" "tarball" "latest" "/opt/honcho" "" "v"
msg_info "Updating Honcho"
cd /opt/honcho
$STD uv sync --frozen --no-dev
$STD .venv/bin/python scripts/provision_db.py
msg_ok "Updated Honcho"
if systemctl is-enabled -q honcho; then
msg_info "Starting Honcho"
systemctl start honcho honcho-deriver
msg_ok "Started Honcho"
fi
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 the API (interactive docs at /docs) using the following URL:${CL}"
echo -e "${GATEWAY}${BGN}http://${IP}:8000${CL}"
echo -e "${INFO}${YW}Admin key, sent as Authorization: Bearer <key> (more with: cd /opt/honcho && .venv/bin/python scripts/generate_jwt.py --admin):${CL}"
echo -e "${INFO}${YW}Without an LLM provider key Honcho stays stopped: set one in /opt/honcho_data/.env, then run: systemctl enable --now honcho honcho-deriver${CL}"
-6
View File
@@ -96,12 +96,6 @@ EOF
exit
}
if [[ ! -d /opt/jellyseerr ]]; then
msg_error "Jellyseerr is now Seerr and can no longer be installed with this script."
msg_warn "Install Seerr instead: https://community-scripts.org/scripts/seerr"
exit 1
fi
start
build_container
description
-3
View File
@@ -30,9 +30,6 @@ function update_script() {
msg_error "No ${APP} Installation Found!"
exit
fi
ensure_dependencies ffmpeg
if check_for_gh_release "mealie" "mealie-recipes/mealie"; then
msg_info "Stopping Service"
-3
View File
@@ -34,15 +34,12 @@ function update_script() {
NODE_VERSION="24" setup_nodejs
if check_for_gh_release "omnitools" "iib0011/omni-tools"; then
ensure_dependencies git
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "omnitools" "iib0011/omni-tools" "tarball"
msg_info "Building OmniTools"
cd /opt/omnitools
export HUSKY=0
$STD npm ci --allow-remote=all
$STD git init -q
$STD git -c user.name=build -c user.email=build@localhost commit -q --allow-empty -m build
$STD npm run build
msg_ok "Built OmniTools"
-70
View File
@@ -1,70 +0,0 @@
#!/usr/bin/env bash
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/build.func")
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/fredrikburmester/streamystats
APP="Streamystats"
var_tags="${var_tags:-analytics;jellyfin}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-3072}"
var_disk="${var_disk:-10}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_arm64="${var_arm64:-yes}"
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/streamystats ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "streamystats" "fredrikburmester/streamystats"; then
msg_info "Stopping Streamystats"
systemctl stop streamystats-nextjs-app streamystats-job-server
msg_ok "Stopped Streamystats"
msg_info "Updating Bun"
$STD bun upgrade
msg_ok "Updated Bun"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "streamystats" "fredrikburmester/streamystats" "tarball"
msg_info "Building Streamystats"
cd /opt/streamystats
$STD bun install --frozen-lockfile
NEXT_TELEMETRY_DISABLED=1 NEXT_PUBLIC_VERSION="v$(cat ~/.streamystats)" $STD bun run build
msg_ok "Built Streamystats"
msg_info "Migrating Streamystats Database"
$STD bun --env-file=/opt/streamystats_data/.env run db:migrate
msg_ok "Migrated Streamystats Database"
msg_info "Starting Streamystats"
systemctl start streamystats-job-server streamystats-nextjs-app
msg_ok "Started Streamystats"
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 "${GATEWAY}${BGN}http://${IP}:3000${CL}"
-58
View File
@@ -1,58 +0,0 @@
#!/usr/bin/env bash
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/build.func")
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/stumpapp/stump
APP="Stump"
var_tags="${var_tags:-comics;manga;ebook}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-1024}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_arm64="${var_arm64:-no}"
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/stump ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "stump" "stumpapp/stump"; then
msg_info "Stopping Stump"
systemctl stop stump
msg_ok "Stopped Stump"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "stump" "stumpapp/stump" "prebuild" "latest" "/opt/stump" "linux-build-results.zip"
chmod +x /opt/stump/stump_server
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "pdfium" "bblanchon/pdfium-binaries" "prebuild" "latest" "/opt/pdfium" "pdfium-linux-x64.tgz"
msg_info "Starting Stump"
systemctl start stump
msg_ok "Started Stump"
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 "${GATEWAY}${BGN}http://${IP}:10801${CL}"
-74
View File
@@ -1,74 +0,0 @@
#!/usr/bin/env bash
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/build.func")
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/Gimanh/taskview-community
APP="TaskView"
var_tags="${var_tags:-project-management;tasks;kanban}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-6144}"
var_disk="${var_disk:-10}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_arm64="${var_arm64:-yes}"
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/taskview ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "taskview" "Gimanh/taskview-community"; then
msg_info "Stopping TaskView"
systemctl stop taskview
msg_ok "Stopped TaskView"
NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "taskview" "Gimanh/taskview-community" "tarball"
msg_info "Building TaskView"
cd /opt/taskview
$STD pnpm install --frozen-lockfile
cd /opt/taskview/api
$STD pnpm run build:docker
$STD pnpm run build:migration
cp -r src/migrations/taskview dist-migration/
cd /opt/taskview/web
$STD pnpm run build:packages
$STD pnpm run build-only
msg_ok "Built TaskView"
msg_info "Migrating TaskView Database"
cd /opt/taskview_data
$STD node /opt/taskview/api/dist-migration/taskview-db-migration.js
msg_ok "Migrated TaskView Database"
msg_info "Starting TaskView"
systemctl start taskview
msg_ok "Started TaskView"
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 "${GATEWAY}${BGN}http://${IP}${CL}"
+1 -19
View File
@@ -108,12 +108,6 @@ EOF
fi
if check_for_gh_release "termix" "Termix-SSH/Termix"; then
TERMIX_RELEASE="latest"
if [[ "$CS_PREVIOUS_VERSION" =~ ^(release-)?([0-9]+)\.([0-9]+)\. ]] && ((BASH_REMATCH[2] * 100 + BASH_REMATCH[3] < 209)); then
TERMIX_RELEASE="release-2.9.2-tag"
msg_warn "Termix ${CS_PREVIOUS_VERSION} has to run 2.9.2 once before newer releases accept its database"
fi
msg_info "Stopping Termix"
systemctl stop termix
msg_ok "Stopped Termix"
@@ -171,7 +165,7 @@ EOF
create_backup /opt/termix/.env
CLEAN_INSTALL=1 CLEAN_INSTALL_KEEP="db/data data uploads" fetch_and_deploy_gh_release "termix" "Termix-SSH/Termix" "tarball" "$TERMIX_RELEASE"
CLEAN_INSTALL=1 CLEAN_INSTALL_KEEP="db/data data uploads" fetch_and_deploy_gh_release "termix" "Termix-SSH/Termix" "tarball"
restore_backup
@@ -264,24 +258,12 @@ EOF
msg_info "Starting Termix"
systemctl daemon-reload
TERMIX_START=$(date +%s)
if ! systemctl start termix; then
msg_error "Termix failed to start"
journalctl -u termix -n 30 --no-pager || true
exit 1
fi
msg_ok "Started Termix"
if [[ "$TERMIX_RELEASE" != "latest" ]]; then
msg_info "Waiting for Termix 2.9.2 to migrate the database"
if ! timeout 300 bash -c "until journalctl -u termix --since @${TERMIX_START} --no-pager | grep -q 'Termix backend started successfully'; do sleep 2; done"; then
msg_error "Termix 2.9.2 did not finish starting, so the database was not migrated"
journalctl -u termix -n 30 --no-pager || true
exit 1
fi
msg_ok "Migrated the database with Termix 2.9.2"
msg_warn "Run update again to continue to the current Termix release"
exit
fi
msg_ok "Updated successfully!"
fi
exit
+3 -4
View File
@@ -9,7 +9,7 @@ source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_
APP="TREK"
var_tags="${var_tags:-travel;planning;collaboration}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-4096}"
var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
@@ -43,7 +43,6 @@ function update_script() {
msg_ok "Stopped Service"
ensure_dependencies "libkitinerary-bin"
ln -sf "$(find /usr/lib -name kitinerary-extractor -type f | head -1)" /usr/local/bin/kitinerary-extractor
create_backup /opt/trek/server/.env \
/opt/trek/data \
@@ -53,7 +52,7 @@ function update_script() {
msg_info "Building TREK"
cd /opt/trek
$STD npm ci --ignore-scripts
$STD npm ci
$STD npm run build --workspace=shared
$STD npm run build --workspace=client
$STD npm run build --workspace=server
@@ -73,7 +72,7 @@ function update_script() {
rm -rf /opt/trek/node_modules
cd /opt/trek
$STD npm ci --workspace=server --omit=dev --ignore-scripts
$STD npm ci --workspace=server --omit=dev
msg_ok "Set up TREK Workspace"
if [[ "$MIGRATION" == "1" ]]; then
+1 -37
View File
@@ -71,41 +71,6 @@ EOF
restore_backup
if grep -q '^TA_BACKEND_PORT=' /opt/tubearchivist/.env 2>/dev/null; then
msg_info "Migrating to v0.6.0 (dropping Nginx)"
systemctl disable -q --now nginx
$STD apt autoremove --purge -y nginx
sed -i 's/^TA_BACKEND_PORT=.*/TA_PORT=8000/' /opt/tubearchivist/.env
cat <<'RUNEOF' >/opt/tubearchivist/backend/run.sh
#!/bin/bash
set -e
cd /opt/tubearchivist/backend
set -a
source /opt/tubearchivist/.env
set +a
PYTHON=/opt/tubearchivist/.venv/bin/python
echo "Waiting for ElasticSearch..."
for i in $(seq 1 30); do
if curl -sf http://localhost:9200/_cluster/health >/dev/null 2>&1; then
break
fi
sleep 2
done
$PYTHON manage.py ta_stop_on_error
$PYTHON manage.py migrate
$PYTHON manage.py collectstatic --noinput -c
$PYTHON manage.py ta_envcheck
$PYTHON manage.py ta_connection
$PYTHON manage.py ta_startup
exec $PYTHON backend_start.py
RUNEOF
chmod +x /opt/tubearchivist/backend/run.sh
msg_ok "Migrated to v0.6.0 (dropping Nginx)"
fi
msg_info "Rebuilding Tube Archivist"
cd /opt/tubearchivist/frontend
$STD npm install
@@ -148,6 +113,7 @@ RUNEOF
msg_info "Starting Services"
systemctl start bgutil-provider tubearchivist tubearchivist-celery tubearchivist-beat
systemctl reload nginx
msg_ok "Started Services"
msg_ok "Updated successfully!"
fi
@@ -162,5 +128,3 @@ 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}:8000${CL}"
echo -e "${INFO}${YW}Admin credentials saved to ~/tubearchivist.creds${CL}"
echo -e "${INFO}${YW}The WebUI may take a couple of minutes to become available on first start, while Elasticsearch and the backend initialize.${CL}"
-73
View File
@@ -1,73 +0,0 @@
#!/usr/bin/env bash
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/build.func")
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/arabcoders/ytptube
APP="YTPTube"
var_tags="${var_tags:-media;youtube;downloader}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-3072}"
var_disk="${var_disk:-20}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_gpu="${var_gpu:-yes}"
var_arm64="${var_arm64:-yes}"
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/ytptube ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
fetch_and_deploy_gh_release "deno" "denoland/deno" "prebuild" "latest" "/usr/local/bin" "deno-$(arch_resolve "x86_64" "aarch64")-unknown-linux-gnu.zip"
if check_for_gh_release "ytptube" "arabcoders/ytptube"; then
msg_info "Stopping YTPTube"
systemctl stop ytptube
msg_ok "Stopped YTPTube"
NODE_VERSION="24" NODE_MODULE="bun" setup_nodejs
PYTHON_VERSION="3.13" setup_uv
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "ytptube" "arabcoders/ytptube" "tarball"
msg_info "Building YTPTube"
cd /opt/ytptube/ui
$STD bun install --frozen-lockfile --production
NODE_ENV=production $STD bun run generate
rm -rf /opt/ytptube/ui/node_modules
cd /opt/ytptube
sed -i "s/^APP_VERSION = .*/APP_VERSION = \"v$(cat ~/.ytptube)\"/" app/library/version.py
$STD uv sync --locked --no-dev
$STD uv pip install --python .venv/bin/python pip
msg_ok "Built YTPTube"
msg_info "Starting YTPTube"
systemctl start ytptube
msg_ok "Started YTPTube"
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 "${GATEWAY}${BGN}http://${IP}:8081${CL}"
echo -e "${INFO}${YW}The first visitor creates the admin account - open the URL right away${CL}"
-93
View File
@@ -1,93 +0,0 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/casdoor/casdoor
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
PG_VERSION="17" setup_postgresql
PG_DB_NAME="casdoor" PG_DB_USER="casdoor" setup_postgresql_db
fetch_and_deploy_gh_release "casdoor" "casdoor/casdoor" "prebuild" "latest" "/opt/casdoor" "casdoor_Linux_$(arch_resolve "x86_64" "arm64").tar.gz"
msg_info "Configuring Casdoor"
mkdir -p /opt/casdoor_data/conf
cat <<EOF >/opt/casdoor_data/conf/app.conf
appname = casdoor
httpport = 8000
runmode = prod
copyrequestbody = true
driverName = postgres
dataSourceName = user=casdoor password=${PG_DB_PASS} host=localhost port=5432 sslmode=disable dbname=casdoor
dbName = casdoor
tableNamePrefix =
showSql = false
redisEndpoint =
defaultStorageProvider =
isCloudIntranet = false
authState = "casdoor"
socks5Proxy =
verificationCodeTimeout = 10
initScore = 0
logPostOnly = true
isUsernameLowered = false
origin = http://${LOCAL_IP}:8000
originFrontend =
staticBaseUrl = "https://cdn.casbin.org"
isDemoMode = false
batchSize = 100
showGithubCorner = false
forceLanguage = ""
defaultLanguage = "en"
defaultApplication = "app-built-in"
maxItemsForFlatMenu = 7
enableErrorMask = false
enableGzip = true
inactiveTimeoutMinutes =
ldapServerPort = 389
ldapsCertId = ""
ldapsServerPort = 636
radiusServerPort = 1812
radiusDefaultOrganization = "built-in"
radiusSecret = "$(random_password)"
quota = {"organization": -1, "user": -1, "application": -1, "provider": -1}
logConfig = {"adapter":"console", "color":false}
initDataNewOnly = false
initDataFile = "./init_data.json"
frontendBaseDir = "/opt/casdoor/web/build"
EOF
chmod 600 /opt/casdoor_data/conf/app.conf
msg_ok "Configured Casdoor"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/casdoor.service
[Unit]
Description=Casdoor
After=network.target postgresql.service
Requires=postgresql.service
[Service]
Type=simple
User=root
WorkingDirectory=/opt/casdoor_data
ExecStart=/opt/casdoor/casdoor
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now casdoor
msg_ok "Created Service"
motd_ssh
customize
cleanup_lxc
-136
View File
@@ -1,136 +0,0 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/dreeveapp/dreeve
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
msg_info "Installing Dependencies"
$STD apt install -y \
libsqlite3-0 \
libcap2-bin \
ca-certificates
msg_ok "Installed Dependencies"
# 1.13.0's php-cli shifts the script into argv[1], which breaks composer and bin/console (php/frankenphp#2690); unpin once 1.13.1 is out
fetch_and_deploy_gh_release "frankenphp" "php/frankenphp" "singlefile" "v1.12.7" "/opt/frankenphp" "frankenphp-linux-$(arch_resolve x86_64 aarch64)-gnu"
fetch_and_deploy_gh_release "dreeve" "dreeveapp/dreeve" "tarball"
msg_info "Providing php CLI"
cat <<'EOF' >/usr/local/bin/php
#!/usr/bin/env bash
exec /opt/frankenphp/frankenphp php-cli "$@"
EOF
chmod +x /usr/local/bin/php
msg_ok "Provided php CLI"
msg_info "Installing Composer"
curl -fsSL https://getcomposer.org/installer -o /tmp/composer-setup.php
$STD /opt/frankenphp/frankenphp php-cli /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer
rm -f /tmp/composer-setup.php
msg_ok "Installed Composer"
msg_info "Installing PHP Dependencies (Patience)"
cd /opt/dreeve
export COMPOSER_ALLOW_SUPERUSER=1
export APP_ENV=prod
$STD /opt/frankenphp/frankenphp php-cli /usr/local/bin/composer install --no-dev --optimize-autoloader --no-interaction --no-scripts
msg_ok "Installed PHP Dependencies"
msg_info "Configuring Dreeve"
mkdir -p /opt/dreeve_data /opt/dreeve/var/{cache,log}
DREEVE_PASSWORD=$(openssl rand -base64 18)
DREEVE_HASH=$(DREEVE_PASSWORD="$DREEVE_PASSWORD" /opt/frankenphp/frankenphp php-cli -r 'echo password_hash(getenv("DREEVE_PASSWORD"), PASSWORD_BCRYPT, ["cost" => 13]);')
[[ "$DREEVE_HASH" =~ ^\$2y\$ ]] || {
msg_error "Could not generate the admin password hash"
exit 1
}
cat <<EOF >/opt/dreeve/.env.local
APP_ENV=prod
APP_DEBUG=0
APP_SECRET=$(openssl rand -hex 32)
APP_URL=http://${LOCAL_IP}:8080
DATABASE_DIRECTORY=/opt/dreeve_data
ADMIN_USERNAME=admin
ADMIN_PASSWORD_HASH='${DREEVE_HASH}'
TZ=UTC
# Create an API application at https://www.strava.com/settings/api
STRAVA_CLIENT_ID=replace-me
STRAVA_CLIENT_SECRET=replace-me
STRAVA_REFRESH_TOKEN=replace-me
EOF
chmod 600 /opt/dreeve/.env.local
cat <<EOF >~/dreeve.creds
Dreeve Admin
Username: admin
Password: ${DREEVE_PASSWORD}
EOF
chmod 600 ~/dreeve.creds
cat <<EOF >/opt/dreeve/Caddyfile
{
http_port 8080
auto_https off
frankenphp {
num_threads 3
worker {
num 2
file /opt/dreeve/public/index.php
}
}
}
:8080 {
root /opt/dreeve/public
encode zstd br gzip
php_server
}
EOF
msg_ok "Configured Dreeve"
msg_info "Initializing Database"
cd /opt/dreeve
set -a
source /opt/dreeve/.env.local
set +a
$STD /opt/frankenphp/frankenphp php-cli bin/console app:db:migrate --no-interaction
$STD /opt/frankenphp/frankenphp php-cli bin/console assets:install public --no-interaction
$STD /opt/frankenphp/frankenphp php-cli bin/console cache:warmup --env=prod
msg_ok "Initialized Database"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/dreeve.service
[Unit]
Description=Dreeve
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/dreeve
EnvironmentFile=/opt/dreeve/.env.local
ExecStart=/opt/frankenphp/frankenphp run --config /opt/dreeve/Caddyfile
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now dreeve
msg_ok "Created Service"
motd_ssh
customize
cleanup_lxc
+2 -2
View File
@@ -40,7 +40,7 @@ chmod +x /usr/sbin/policy-rc.d
$STD apt install matrix-synapse-py3 -y
rm -f /usr/sbin/policy-rc.d
sed -i 's/127.0.0.1/0.0.0.0/g' /etc/matrix-synapse/homeserver.yaml
sed -i '/^ *- ::1$/d' /etc/matrix-synapse/homeserver.yaml
sed -i 's/'\''::1'\'', //g' /etc/matrix-synapse/homeserver.yaml
SECRET=$(openssl rand -hex 32)
ADMIN_PASS="$(random_password 13)"
echo "enable_registration_without_verification: true" >>/etc/matrix-synapse/homeserver.yaml
@@ -71,7 +71,7 @@ Admin username: admin
Admin password: $ADMIN_PASS
EOF
systemctl stop matrix-synapse
sed -i '/^enable_registration_without_verification: true$/d' /etc/matrix-synapse/homeserver.yaml
sed -i '34d' /etc/matrix-synapse/homeserver.yaml
systemctl start matrix-synapse
msg_ok "Installed Element Synapse"
-70
View File
@@ -1,70 +0,0 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/emdash-cms/emdash
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
NODE_VERSION="24" NODE_MODULE="pnpm@11" setup_nodejs
msg_info "Creating EmDash Site"
cd /opt
$STD pnpm dlx create-emdash@latest emdash --platform node --template "${var_emdash_template:-blog}" --pm pnpm --no-install --yes
mkdir -p /opt/emdash_data/uploads
mv /opt/emdash/.env /opt/emdash_data/.env
sed -i -e 's|file:./data.db|file:/opt/emdash_data/data.db|' -e 's|"./uploads"|"/opt/emdash_data/uploads"|' /opt/emdash/astro.config.mjs
cat <<EOF >>/opt/emdash_data/.env
HOST=0.0.0.0
PORT=4321
# The address in the browser bar. Passkeys are bound to its hostname, and the build bakes it in for image optimization:
# after a change run cd /opt/emdash && set -a && . /opt/emdash_data/.env && set +a && pnpm build && systemctl restart emdash
EMDASH_SITE_URL=${var_emdash_url:-http://${LOCAL_IP}:4321}
EOF
chmod 600 /opt/emdash_data/.env
msg_ok "Created EmDash Site"
msg_info "Building EmDash"
cd /opt/emdash
# pnpm keeps Astro's sharp out of the site's reach, and every /_image request then fails with MissingSharp
$STD pnpm add sharp
set -a && source /opt/emdash_data/.env && set +a
$STD pnpm build
cat <<EOF >~/.emdash
emdash@$(node -p 'require("/opt/emdash/node_modules/emdash/package.json").version')
EOF
msg_ok "Built EmDash"
msg_info "Creating EmDash Service"
cat <<EOF >/etc/systemd/system/emdash.service
[Unit]
Description=EmDash
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/emdash
EnvironmentFile=/opt/emdash_data/.env
Environment=NODE_ENV=production
ExecStart=/usr/bin/node /opt/emdash/dist/server/entry.mjs
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now emdash
msg_ok "Created EmDash Service"
motd_ssh
customize
cleanup_lxc
+1 -1
View File
@@ -19,7 +19,7 @@ $STD apt install -y \
nginx
msg_ok "Installed Dependencies"
NODE_VERSION="24" setup_nodejs
NODE_VERSION="20" setup_nodejs
PG_VERSION="18" setup_postgresql
PG_DB_NAME="excalidash" PG_DB_USER="excalidash" setup_postgresql_db
-2
View File
@@ -124,8 +124,6 @@ msg_ok "Built SQLite Extensions"
if [[ "$(arch_resolve)" == "amd64" ]]; then
msg_info "Building Intel Media Driver (Patience)"
download_gpg_key "https://repositories.intel.com/gpu/intel-graphics.key" "/usr/share/keyrings/intel-graphics.gpg" "dearmor"
sed -i '/intel-graphics.key/d' /opt/frigate/docker/main/build_intel_media_driver.sh
$STD bash /opt/frigate/docker/main/build_intel_media_driver.sh
cp -a /rootfs/. /
rm -rf /rootfs
+1 -1
View File
@@ -25,7 +25,7 @@ msg_info "Setting up Heimdall-Dashboard"
cd /opt/Heimdall
cp .env.example .env
sed -i 's/^APP_ENV=.*/APP_ENV=production/' .env
$STD php artisan key:generate --force
$STD php artisan key:generate
msg_ok "Setup Heimdall-Dashboard"
msg_info "Creating Service"
+23 -17
View File
@@ -14,9 +14,7 @@ network_check
update_os
msg_info "Installing Dependencies"
$STD apt install -y \
git \
libatomic1
$STD apt install -y git
msg_ok "Installed Dependencies"
NODE_VERSION="22" setup_nodejs
@@ -29,9 +27,9 @@ msg_ok "Created Hermes User"
msg_info "Configuring Service Environment"
cat <<EOF >/etc/default/hermes
HOME=/home/hermes
PATH=/home/hermes/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NODE_OPTIONS=${NODE_OPTIONS}
GATEWAY_HEALTH_URL=http://127.0.0.1:8642/health
EOF
msg_ok "Configured Service Environment"
@@ -40,60 +38,68 @@ confirm_external_installer "https://hermes-agent.nousresearch.com/" "https://her
msg_info "Installing Hermes Agent"
curl_with_retry "https://hermes-agent.nousresearch.com/install.sh" /tmp/hermes-install.sh ||
curl_with_retry "https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh" /tmp/hermes-install.sh
chmod 644 /tmp/hermes-install.sh
$STD setsid --wait runuser -l hermes -c '
$STD setsid --wait bash -c '
set -a; source /etc/default/hermes; set +a
export npm_config_yes=true
bash /tmp/hermes-install.sh --skip-setup --hermes-home ~/.hermes --dir ~/.hermes/hermes-agent
bash /tmp/hermes-install.sh --skip-setup --hermes-home /home/hermes/.hermes --dir /home/hermes/.hermes/hermes-agent
'
rm -f /tmp/hermes-install.sh
chown -R hermes:hermes /home/hermes
chmod 750 /home/hermes
chmod 700 /home/hermes/.hermes
git config --system --add safe.directory /home/hermes/.hermes/hermes-agent 2>/dev/null || true
msg_ok "Installed Hermes Agent"
msg_info "Configuring API Server"
API_SERVER_KEY=$(random_password 32)
mkdir -p /home/hermes/.hermes
cat <<EOF >/home/hermes/.hermes/.env
API_SERVER_ENABLED=true
API_SERVER_HOST=0.0.0.0
API_SERVER_PORT=8642
API_SERVER_KEY=${API_SERVER_KEY}
EOF
chown hermes:hermes /home/hermes/.hermes/.env
chmod 600 /home/hermes/.hermes/.env
msg_ok "Configured API Server"
msg_info "Creating Dashboard Service"
mkdir -p /home/hermes/.config/systemd/user
cat <<EOF >/home/hermes/.config/systemd/user/hermes-dashboard.service
cat <<EOF >/etc/systemd/system/hermes-dashboard.service
[Unit]
Description=Hermes Agent Web Dashboard
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=hermes
Group=hermes
UMask=0077
WorkingDirectory=%h
WorkingDirectory=/home/hermes
ExecStart=/home/hermes/.local/bin/hermes dashboard --host 127.0.0.1 --port 9119 --no-open
EnvironmentFile=/etc/default/hermes
ExecStart=%h/.local/bin/hermes dashboard --host 127.0.0.1 --port 9119 --no-open
Restart=on-failure
RestartSec=5
ProtectProc=invisible
ProcSubset=pid
[Install]
WantedBy=default.target
WantedBy=multi-user.target
EOF
chown -R hermes:hermes /home/hermes/.config
$STD runuser -l hermes -c 'systemctl --user daemon-reload && systemctl --user enable --now hermes-dashboard'
systemctl enable -q --now hermes-dashboard
msg_ok "Created Dashboard Service"
msg_info "Creating Setup Helper"
cat <<'SETUP' >/usr/bin/hermes-setup
#!/usr/bin/env bash
su - hermes -c 'set -a; source /etc/default/hermes; set +a; hermes setup'
set -a; source /etc/default/hermes; set +a
/home/hermes/.local/bin/hermes setup
chown -R hermes:hermes /home/hermes
chmod 750 /home/hermes
chmod 700 /home/hermes/.hermes
if [[ -f /home/hermes/.config/systemd/user/hermes-gateway.service ]]; then
su - hermes -c 'systemctl --user enable --now hermes-gateway'
fi
echo "Hermes setup complete."
echo "Hermes setup complete. File permissions restored."
SETUP
chmod +x /usr/bin/hermes-setup
msg_ok "Created Setup Helper"
+1 -1
View File
@@ -17,7 +17,7 @@ msg_info "Installing Dependencies"
$STD apt install -y jq
msg_ok "Installed Dependencies"
NODE_VERSION="24" NODE_MODULE="pnpm@latest" setup_nodejs
NODE_VERSION="22" NODE_MODULE="pnpm@latest" setup_nodejs
fetch_and_deploy_gh_release "homepage" "gethomepage/homepage" "tarball"
RELEASE=$(get_latest_github_release "gethomepage/homepage")
-168
View File
@@ -1,168 +0,0 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/plastic-labs/honcho
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
msg_info "Installing Dependencies"
$STD apt install -y redis-server
msg_ok "Installed Dependencies"
PG_VERSION="17" PG_MODULES="pgvector" setup_postgresql
PG_DB_NAME="honcho" PG_DB_USER="honcho" PG_DB_EXTENSIONS="vector,pg_trgm" setup_postgresql_db
PYTHON_VERSION="3.13" setup_uv
fetch_and_deploy_gh_release "honcho" "plastic-labs/honcho" "tarball" "latest" "/opt/honcho" "" "v"
msg_info "Installing Honcho"
cd /opt/honcho
$STD uv sync --frozen --no-dev
msg_ok "Installed Honcho"
if [[ -t 0 && -z "${var_honcho_provider:-}${var_honcho_api_key:-}${var_honcho_base_url:-}" ]]; then
echo -e "${INFO}${YW} Honcho needs an LLM provider for memory, embeddings and chat; without a key it is installed but not started.${CL}"
read -t 300 -rsp "${TAB3}OpenAI API key (Enter to set up a provider later): " var_honcho_api_key || true
echo
fi
declare -A HONCHO_KEY=([openai]="" [anthropic]="" [gemini]="")
case "${var_honcho_provider:-openai}" in
anthropic)
HONCHO_TRANSPORT="anthropic" HONCHO_MODEL="${var_honcho_model:-claude-haiku-4-5}"
HONCHO_EMBEDDING="openai" HONCHO_EMBEDDING_MODEL="${var_honcho_embedding_model:-text-embedding-3-small}"
HONCHO_KEY[anthropic]="${var_honcho_api_key:-}"
HONCHO_KEY[openai]="${var_honcho_embedding_key:-}"
;;
gemini)
HONCHO_TRANSPORT="gemini" HONCHO_MODEL="${var_honcho_model:-gemini-2.5-flash}"
HONCHO_EMBEDDING="gemini" HONCHO_EMBEDDING_MODEL="${var_honcho_embedding_model:-gemini-embedding-001}"
HONCHO_KEY[gemini]="${var_honcho_api_key:-}"
;;
*)
HONCHO_TRANSPORT="openai" HONCHO_MODEL="${var_honcho_model:-gpt-5.4-mini}"
HONCHO_EMBEDDING="openai" HONCHO_EMBEDDING_MODEL="${var_honcho_embedding_model:-text-embedding-3-small}"
HONCHO_KEY[openai]="${var_honcho_api_key:-${var_honcho_base_url:+not-needed}}"
;;
esac
msg_info "Configuring Honcho"
mkdir -p /opt/honcho_data
cat <<EOF >/opt/honcho_data/.env
DB_CONNECTION_URI=postgresql+psycopg://honcho:${PG_DB_PASS}@localhost:5432/honcho
CACHE_ENABLED=true
CACHE_URL=redis://localhost:6379/0?suppress=true
# Every /v3 API request needs a JWT signed with this secret. Mint one with:
# cd /opt/honcho && .venv/bin/python scripts/generate_jwt.py --admin
AUTH_USE_AUTH=true
AUTH_JWT_SECRET=$(openssl rand -hex 32)
WEBHOOK_SECRET=$(openssl rand -hex 32)
# Transports: openai (OpenAI or any OpenAI-compatible endpoint), anthropic, gemini.
# Embeddings run on openai or gemini only. Apply changes with: systemctl restart honcho honcho-deriver
LLM_OPENAI_API_KEY=${HONCHO_KEY[openai]}
LLM_ANTHROPIC_API_KEY=${HONCHO_KEY[anthropic]}
LLM_GEMINI_API_KEY=${HONCHO_KEY[gemini]}
# An OpenAI-compatible endpoint (OpenRouter, Ollama, vLLM, LiteLLM) replaces api.openai.com through both lines:
#LLM_OPENAI_BASE_URL=http://192.168.1.50:11434/v1
#EMBEDDING_MODEL_CONFIG__OVERRIDES__BASE_URL=http://192.168.1.50:11434/v1
# Endpoints without OpenAI Structured Outputs need:
#DERIVER_MODEL_CONFIG__STRUCTURED_OUTPUT_MODE=json_object
EMBEDDING_MODEL_CONFIG__TRANSPORT=${HONCHO_EMBEDDING}
EMBEDDING_MODEL_CONFIG__MODEL=${HONCHO_EMBEDDING_MODEL}
# A model with another vector size works only while nothing is embedded yet: set it here, then run
# cd /opt/honcho && .venv/bin/python scripts/configure_embeddings.py --yes
#EMBEDDING_VECTOR_DIMENSIONS=1536
# The deriver waits for about 512 new tokens per peer, or 30 minutes, before it calls the LLM
#DERIVER_FLUSH_ENABLED=true
# Models for the deriver, summaries, dreams and dialectic chat; they must support tool calling
EOF
for prefix in DERIVER SUMMARY DREAM_DEDUCTION DREAM_INDUCTION DIALECTIC_LEVELS__{minimal,low,medium,high,max}_; do
cat <<EOF >>/opt/honcho_data/.env
${prefix}_MODEL_CONFIG__TRANSPORT=${HONCHO_TRANSPORT}
${prefix}_MODEL_CONFIG__MODEL=${HONCHO_MODEL}
EOF
done
if [[ -n "${var_honcho_base_url:-}" ]]; then
cat <<EOF >>/opt/honcho_data/.env
LLM_OPENAI_BASE_URL=${var_honcho_base_url}
EMBEDDING_MODEL_CONFIG__OVERRIDES__BASE_URL=${var_honcho_base_url}
EOF
fi
if [[ -n "${var_honcho_embedding_dims:-}" ]]; then
cat <<EOF >>/opt/honcho_data/.env
EMBEDDING_VECTOR_DIMENSIONS=${var_honcho_embedding_dims}
EOF
fi
chmod 600 /opt/honcho_data/.env
ln -sf /opt/honcho_data/.env /opt/honcho/.env
msg_ok "Configured Honcho"
msg_info "Migrating Honcho Database"
$STD .venv/bin/python scripts/provision_db.py
$STD .venv/bin/python scripts/configure_embeddings.py --yes
msg_ok "Migrated Honcho Database"
msg_info "Creating Honcho Services"
cat <<EOF >/etc/systemd/system/honcho.service
[Unit]
Description=Honcho API
After=network.target postgresql.service redis-server.service
Requires=postgresql.service
[Service]
Type=simple
User=root
WorkingDirectory=/opt/honcho
Environment=PYTHONUNBUFFERED=1
ExecStart=/opt/honcho/.venv/bin/fastapi run --host 0.0.0.0 --port 8000 src/main.py
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
cat <<EOF >/etc/systemd/system/honcho-deriver.service
[Unit]
Description=Honcho Deriver
After=network.target postgresql.service redis-server.service honcho.service
Requires=postgresql.service
[Service]
Type=simple
User=root
WorkingDirectory=/opt/honcho
Environment=PYTHONUNBUFFERED=1
ExecStart=/opt/honcho/.venv/bin/python -m src.deriver
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
msg_ok "Created Honcho Services"
if [[ -n "${HONCHO_KEY[$HONCHO_TRANSPORT]}" && -n "${HONCHO_KEY[$HONCHO_EMBEDDING]}" ]]; then
msg_info "Starting Honcho"
systemctl enable -q --now honcho honcho-deriver
msg_ok "Started Honcho"
else
msg_warn "No LLM provider key (with Anthropic also an OpenAI key for embeddings): Honcho stays stopped until it is set in /opt/honcho_data/.env"
fi
motd_ssh
customize
cleanup_lxc
-5
View File
@@ -13,11 +13,6 @@ setting_up_container
network_check
update_os
if is_debian && [[ "$(get_os_version_major)" -lt 13 ]]; then
msg_error "Immich needs Debian 13: its build dependencies and Intel runtime packages are not available on Debian 12."
exit 238
fi
RELEASE="v3.3.5"
if lscpu | grep -q 'GenuineIntel'; then
echo ""
-6
View File
@@ -13,12 +13,6 @@ setting_up_container
network_check
update_os
if [[ "${CTTYPE:-1}" != "0" ]]; then
msg_error "iVentoy requires a privileged LXC container."
msg_error "Recreate the container with unprivileged=0."
exit 10
fi
fetch_and_deploy_gh_release "iventoy" "ventoy/PXE" "prebuild" "latest" "/opt/iventoy" "iventoy-*-linux-$(arch_resolve x86_64-free arm64-trial).tar.gz"
mkdir -p /opt/iventoy/{data,iso}
-1
View File
@@ -23,7 +23,6 @@ $STD apt install -y \
libldap-common \
libssl-dev \
libldap2 \
ffmpeg \
gosu \
iproute2
msg_ok "Installed Dependencies"
+1 -1
View File
@@ -17,7 +17,7 @@ msg_info "Installing Dependencies"
$STD apt install -y ca-certificates
msg_ok "Installed Dependencies"
NODE_VERSION="24" setup_nodejs
NODE_VERSION="22" setup_nodejs
msg_info "Installing MeshCentral"
mkdir /opt/meshcentral
+1 -5
View File
@@ -14,9 +14,7 @@ network_check
update_os
msg_info "Installing Dependencies"
$STD apt install -y \
git \
nginx
$STD apt install -y nginx
msg_ok "Installed Dependencies"
NODE_VERSION="24" setup_nodejs
@@ -26,8 +24,6 @@ msg_info "Building OmniTools"
cd /opt/omnitools
export HUSKY=0
$STD npm ci --allow-remote=all
$STD git init -q
$STD git -c user.name=build -c user.email=build@localhost commit -q --allow-empty -m build
$STD npm run build
msg_ok "Built OmniTools"
+1
View File
@@ -80,6 +80,7 @@ set -a
. /opt/paperless/paperless.conf
set +a
$STD uv run -- python manage.py migrate
$STD uv run -- python manage.py reindex
msg_ok "Setup Paperless-ngx"
msg_info "Setting up admin Paperless-ngx User & Password"
+1 -3
View File
@@ -22,9 +22,7 @@ msg_ok "Installed Dependencies"
msg_info "Installing Pi-hole"
mkdir -p /etc/pihole
touch /etc/pihole/pihole.toml
curl_with_retry "https://install.pi-hole.net" /tmp/pihole-install.sh
$STD bash /tmp/pihole-install.sh --unattended
rm -f /tmp/pihole-install.sh
$STD bash <(curl -fsSL https://install.pi-hole.net) --unattended
sed -i -E '
/^\s*upstreams =/ s|=.*|= ["8.8.8.8", "8.8.4.4"]|
/^\s*interface =/ s|=.*|= "eth0"|
+4 -4
View File
@@ -51,11 +51,11 @@ ADMIN_EMAIL="${var_pterodactyl_panel_admin_email:-}"
[[ -n "$ADMIN_EMAIL" ]] || read -r -p "${TAB3}Provide an email address for admin login, this should be a valid email address: " ADMIN_EMAIL || true
[[ -n "$ADMIN_EMAIL" ]] || { msg_error "No admin email given; set var_pterodactyl_panel_admin_email or answer the prompt"; exit 64; }
NAME_FIRST="${var_pterodactyl_panel_first_name:-}"
[[ -n "$NAME_FIRST" ]] || read -r -p "${TAB3}Enter your First Name [Admin]: " NAME_FIRST || true
NAME_FIRST="${NAME_FIRST:-Admin}"
[[ -n "$NAME_FIRST" ]] || read -r -p "${TAB3}Enter your First Name: " NAME_FIRST || true
[[ -n "$NAME_FIRST" ]] || { msg_error "No first name given; set var_pterodactyl_panel_first_name or answer the prompt"; exit 64; }
NAME_LAST="${var_pterodactyl_panel_last_name:-}"
[[ -n "$NAME_LAST" ]] || read -r -p "${TAB3}Enter your Last Name [User]: " NAME_LAST || true
NAME_LAST="${NAME_LAST:-User}"
[[ -n "$NAME_LAST" ]] || read -r -p "${TAB3}Enter your Last Name: " NAME_LAST || true
[[ -n "$NAME_LAST" ]] || { msg_error "No last name given; set var_pterodactyl_panel_last_name or answer the prompt"; exit 64; }
fetch_and_deploy_gh_release "pterodactyl-panel" "pterodactyl/panel" "prebuild" "latest" "/opt/pterodactyl-panel" "panel.tar.gz"
+1 -1
View File
@@ -24,7 +24,7 @@ msg_ok "Installed Dependencies"
setup_ffmpeg
PG_VERSION="17" setup_postgresql
PG_DB_NAME="readmeabook" PG_DB_USER="readmeabook" setup_postgresql_db
NODE_VERSION="24" setup_nodejs
NODE_VERSION="20" setup_nodejs
fetch_and_deploy_gh_release "readmeabook" "kikootwo/ReadMeABook" "tarball"
-100
View File
@@ -1,100 +0,0 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/fredrikburmester/streamystats
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
msg_info "Installing Dependencies"
$STD apt install -y unzip
msg_ok "Installed Dependencies"
PG_VERSION="17" PG_MODULES="pgvector" setup_postgresql
PG_DB_NAME="streamystats" PG_DB_USER="streamystats" PG_DB_EXTENSIONS="vector,pg_trgm,uuid-ossp" setup_postgresql_db
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 "streamystats" "fredrikburmester/streamystats" "tarball"
msg_info "Building Streamystats"
cd /opt/streamystats
$STD bun install --frozen-lockfile
NEXT_TELEMETRY_DISABLED=1 NEXT_PUBLIC_VERSION="v$(cat ~/.streamystats)" $STD bun run build
msg_ok "Built Streamystats"
msg_info "Configuring Streamystats"
mkdir -p /opt/streamystats_data
cat <<EOF >/opt/streamystats_data/.env
NODE_ENV=production
NEXT_TELEMETRY_DISABLED=1
DATABASE_URL=postgresql://streamystats:${PG_DB_PASS}@127.0.0.1:5432/streamystats
JOB_SERVER_URL=http://127.0.0.1:3005
NEXTJS_URL=http://127.0.0.1:3000
SESSION_SECRET=$(openssl rand -hex 64)
NEXT_SERVER_ACTIONS_ENCRYPTION_KEY=$(openssl rand -base64 32)
EOF
chmod 600 /opt/streamystats_data/.env
msg_ok "Configured Streamystats"
msg_info "Migrating Streamystats Database"
$STD bun --env-file=/opt/streamystats_data/.env run db:migrate
msg_ok "Migrated Streamystats Database"
msg_info "Creating Services"
cat <<EOF >/etc/systemd/system/streamystats-job-server.service
[Unit]
Description=Streamystats Job Server
After=network.target postgresql.service
[Service]
Type=simple
User=root
WorkingDirectory=/opt/streamystats/apps/job-server
EnvironmentFile=/opt/streamystats_data/.env
Environment=HOST=127.0.0.1
Environment=PORT=3005
ExecStart=/usr/local/bin/bun run start
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
cat <<EOF >/etc/systemd/system/streamystats-nextjs-app.service
[Unit]
Description=Streamystats Web
After=network.target streamystats-job-server.service
Wants=streamystats-job-server.service
[Service]
Type=simple
User=root
WorkingDirectory=/opt/streamystats/apps/nextjs-app
EnvironmentFile=/opt/streamystats_data/.env
Environment=PORT=3000
ExecStart=/usr/local/bin/bun run start
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now streamystats-job-server streamystats-nextjs-app
msg_ok "Created Services"
motd_ssh
customize
cleanup_lxc
-45
View File
@@ -1,45 +0,0 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/stumpapp/stump
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
fetch_and_deploy_gh_release "stump" "stumpapp/stump" "prebuild" "latest" "/opt/stump" "linux-build-results.zip"
chmod +x /opt/stump/stump_server
fetch_and_deploy_gh_release "pdfium" "bblanchon/pdfium-binaries" "prebuild" "latest" "/opt/pdfium" "pdfium-linux-x64.tgz"
msg_info "Creating Stump Service"
mkdir -p /opt/stump_data/{config,library}
cat <<EOF >/etc/systemd/system/stump.service
[Unit]
Description=Stump
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/stump
Environment=STUMP_CONFIG_DIR=/opt/stump_data/config
Environment=STUMP_CLIENT_DIR=/opt/stump/client
Environment=PDFIUM_PATH=/opt/pdfium/lib/libpdfium.so
ExecStart=/opt/stump/stump_server
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now stump
msg_ok "Created Stump Service"
motd_ssh
customize
cleanup_lxc
-135
View File
@@ -1,135 +0,0 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/Gimanh/taskview-community
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
msg_info "Installing Dependencies"
$STD apt install -y nginx
msg_ok "Installed Dependencies"
NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs
PG_VERSION="18" setup_postgresql
PG_DB_NAME="taskview" PG_DB_USER="taskview" setup_postgresql_db
msg_info "Configuring PostgreSQL for TaskView"
# Every migration run terminates all other sessions on the database, autovacuum workers included
$STD sudo -u postgres psql -c "GRANT pg_signal_autovacuum_worker TO taskview;"
msg_ok "Configured PostgreSQL for TaskView"
fetch_and_deploy_gh_release "taskview" "Gimanh/taskview-community" "tarball"
msg_info "Building TaskView"
cd /opt/taskview
$STD pnpm install --frozen-lockfile
cd /opt/taskview/api
$STD pnpm run build:docker
$STD pnpm run build:migration
cp -r src/migrations/taskview dist-migration/
cd /opt/taskview/web
# upstream's build script type-checks before Vite has generated the auto-import types, which fails on a fresh checkout
$STD pnpm run build:packages
$STD pnpm run build-only
msg_ok "Built TaskView"
msg_info "Configuring TaskView"
mkdir -p /opt/taskview_data
cat <<EOF >/opt/taskview_data/.env
NODE_ENV=production
DB_HOST=localhost
DB_PORT=5432
DB_NAME=taskview
DB_USER=taskview
DB_PASSWORD=${PG_DB_PASS}
APP_PORT=1401
APP_URL=http://${LOCAL_IP}
CORS_ALLOWED_ORIGINS=http://${LOCAL_IP}
TRUST_PROXY=1
JWT_ALG=HS256
JWT_SIGN=$(openssl rand -hex 64)
ACCESS_LIFE_TIME=3d
REFRESH_LIFE_TIME=9d
ENCRYPTION_KEY=$(openssl rand -hex 32)
PASSWORD_CHANGE_CONFIRMATION=password
EOF
chmod 600 /opt/taskview_data/.env
msg_ok "Configured TaskView"
msg_info "Creating TaskView Database Schema"
# The migration reads DB_* from the .env in its working directory
cd /opt/taskview_data
$STD node /opt/taskview/api/dist-migration/taskview-db-migration.js --create
msg_ok "Created TaskView Database Schema"
msg_info "Configuring Nginx"
cat <<'EOF' >/etc/nginx/sites-available/taskview
server {
listen 80;
server_name _;
root /opt/taskview/web/dist;
index index.html;
gzip_types text/css application/javascript application/json image/svg+xml;
location ~ ^/(module|scim|\.well-known)/ {
proxy_pass http://127.0.0.1:1401;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# Pins the web client to the API behind this same origin and hides the server selector
location = /config.js {
default_type application/javascript;
add_header Cache-Control "no-cache, no-store, must-revalidate";
return 200 'window.__TASKVIEW_CONFIG__ = { apiUrl: window.location.origin };';
}
location = /index.html {
add_header Cache-Control "no-cache, no-store, must-revalidate";
}
location / {
try_files $uri $uri/ /index.html;
}
}
EOF
nginx_enable_site "taskview"
msg_ok "Configured Nginx"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/taskview.service
[Unit]
Description=TaskView API
After=network.target postgresql.service
Requires=postgresql.service
[Service]
Type=simple
User=root
WorkingDirectory=/opt/taskview_data
EnvironmentFile=/opt/taskview_data/.env
ExecStart=/usr/bin/node /opt/taskview/api/dist/taskview-server.js
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now taskview
msg_ok "Created Service"
motd_ssh
customize
cleanup_lxc
+3 -7
View File
@@ -17,7 +17,6 @@ msg_info "Installing Dependencies"
$STD apt install -y \
build-essential \
libkitinerary-bin
ln -sf "$(find /usr/lib -name kitinerary-extractor -type f | head -1)" /usr/local/bin/kitinerary-extractor
msg_ok "Installed Dependencies"
NODE_VERSION="24" setup_nodejs
@@ -25,7 +24,7 @@ fetch_and_deploy_gh_release "trek" "liketrek/TREK" "tarball"
msg_info "Setup TREK"
cd /opt/trek
$STD npm ci --ignore-scripts
$STD npm ci
$STD npm run build --workspace=shared
$STD npm run build --workspace=client
$STD npm run build --workspace=server
@@ -44,16 +43,13 @@ mkdir -p \
/opt/trek/uploads/files \
/opt/trek/uploads/covers \
/opt/trek/uploads/avatars \
/opt/trek/uploads/photos \
/opt/trek/uploads/journey \
/opt/trek/uploads/places
/opt/trek/uploads/photos
rm -rf /opt/trek/server/data
rm -rf /opt/trek/server/uploads
ln -s /opt/trek/data /opt/trek/server/data
ln -s /opt/trek/uploads /opt/trek/server/uploads
rm -rf /opt/trek/node_modules
cd /opt/trek
$STD npm ci --workspace=server --omit=dev --ignore-scripts
$STD npm prune --omit=dev
msg_ok "Set up TREK Workspace"
msg_info "Configuring TREK"
+88 -2
View File
@@ -17,6 +17,7 @@ msg_info "Installing Dependencies"
$STD apt install -y \
build-essential \
git \
nginx \
redis-server \
atomicparsley \
python3-dev \
@@ -106,7 +107,7 @@ cat <<EOF >/opt/tubearchivist/.env
TA_HOST=http://${LOCAL_IP}:8000
TA_USERNAME=admin
TA_PASSWORD=${TA_PASSWORD}
TA_PORT=8000
TA_BACKEND_PORT=8080
TA_APP_DIR=/opt/tubearchivist/backend
TA_CACHE_DIR=/cache
TA_MEDIA_DIR=/youtube
@@ -132,6 +133,92 @@ msg_info "Installing yt-dlp Nightly"
$STD uv pip install --python /opt/tubearchivist/.venv/bin/python -U --prerelease allow "yt-dlp[default]"
msg_ok "Installed yt-dlp Nightly"
msg_info "Configuring Nginx"
sed -i 's/^user www-data;$/user root;/' /etc/nginx/nginx.conf
cat <<'EOF' >/etc/nginx/sites-available/default
server {
listen 8000;
location = /_auth {
internal;
proxy_pass http://localhost:8080/api/ping/;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header Host $http_host;
proxy_set_header Cookie $http_cookie;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /cache/videos/ {
auth_request /_auth;
alias /cache/videos/;
}
location /cache/channels/ {
auth_request /_auth;
alias /cache/channels/;
}
location /cache/playlists/ {
auth_request /_auth;
alias /cache/playlists/;
}
location /media/ {
auth_request /_auth;
alias /youtube/;
types {
text/vtt vtt;
}
}
location /youtube/ {
auth_request /_auth;
alias /youtube/;
types {
video/mp4 mp4;
}
}
location /api {
include proxy_params;
proxy_pass http://localhost:8080;
}
location /admin {
include proxy_params;
proxy_pass http://localhost:8080;
}
location /static/ {
alias /opt/tubearchivist/backend/staticfiles/;
}
root /opt/tubearchivist/backend/static;
index index.html;
location ~* ^/(?!static/|cache/).*\.(?:css|js|png|jpg|jpeg|gif|ico|svg|woff2?)$ {
try_files $uri $uri/ /index.html =404;
}
location = /index.html {
add_header Cache-Control "no-store, no-cache, must-revalidate";
add_header Pragma "no-cache";
expires 0;
}
location / {
add_header Cache-Control "no-store, no-cache, must-revalidate";
add_header Pragma "no-cache";
expires 0;
try_files $uri $uri/ /index.html =404;
}
}
EOF
systemctl enable -q nginx
systemctl restart nginx
msg_ok "Configured Nginx"
msg_info "Creating Services"
cat <<'RUNEOF' >/opt/tubearchivist/backend/run.sh
#!/bin/bash
@@ -150,7 +237,6 @@ for i in $(seq 1 30); do
sleep 2
done
$PYTHON manage.py ta_stop_on_error
$PYTHON manage.py migrate
$PYTHON manage.py collectstatic --noinput -c
$PYTHON manage.py ta_envcheck
+85
View File
@@ -0,0 +1,85 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: BrynnJKnight
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://verdaccio.org/ | Github: https://github.com/verdaccio/verdaccio
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
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" NODE_MODULE="verdaccio" setup_nodejs
msg_info "Configuring Verdaccio"
mkdir -p /opt/verdaccio/config
mkdir -p /opt/verdaccio/storage
cat <<EOF >/opt/verdaccio/config/config.yaml
# Verdaccio configuration
storage: /opt/verdaccio/storage
auth:
htpasswd:
file: /opt/verdaccio/storage/htpasswd
max_users: 1000
uplinks:
npmjs:
url: https://registry.npmjs.org/
packages:
'@*/*':
access: \$all
publish: \$authenticated
proxy: npmjs
'**':
access: \$all
publish: \$authenticated
proxy: npmjs
middlewares:
audit:
enabled: true
logs:
- {type: stdout, format: pretty, level: http}
listen:
- 0.0.0.0:4873
web:
enable: true
title: Verdaccio
gravatar: true
sort_packages: asc
login: true
EOF
chown -R root:root /opt/verdaccio
chmod -R 755 /opt/verdaccio
msg_ok "Configured Verdaccio"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/verdaccio.service
[Unit]
Description=Verdaccio lightweight private npm proxy registry
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/verdaccio --config /opt/verdaccio/config/config.yaml
Restart=on-failure
StandardOutput=journal
StandardError=journal
SyslogIdentifier=verdaccio
KillMode=control-group
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now verdaccio
msg_ok "Created Service"
motd_ssh
customize
cleanup_lxc
-73
View File
@@ -1,73 +0,0 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/arabcoders/ytptube
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
msg_info "Installing Dependencies"
$STD apt install -y libmagic1
msg_ok "Installed Dependencies"
setup_ffmpeg
setup_hwaccel
NODE_VERSION="24" NODE_MODULE="bun" setup_nodejs
PYTHON_VERSION="3.13" setup_uv
fetch_and_deploy_gh_release "deno" "denoland/deno" "prebuild" "latest" "/usr/local/bin" "deno-$(arch_resolve "x86_64" "aarch64")-unknown-linux-gnu.zip"
fetch_and_deploy_gh_release "ytptube" "arabcoders/ytptube" "tarball"
msg_info "Building YTPTube"
cd /opt/ytptube/ui
$STD bun install --frozen-lockfile --production
NODE_ENV=production $STD bun run generate
rm -rf /opt/ytptube/ui/node_modules
cd /opt/ytptube
sed -i "s/^APP_VERSION = .*/APP_VERSION = \"v$(cat ~/.ytptube)\"/" app/library/version.py
$STD uv sync --locked --no-dev
$STD uv pip install --python .venv/bin/python pip
msg_ok "Built YTPTube"
msg_info "Configuring YTPTube"
mkdir -p /opt/ytptube_data/{config,downloads,tmp}
cat <<EOF >/opt/ytptube_data/config/.env
YTP_PORT=8081
YTP_CONFIG_PATH=/opt/ytptube_data/config
YTP_DOWNLOAD_PATH=/opt/ytptube_data/downloads
YTP_TEMP_PATH=/opt/ytptube_data/tmp
EOF
msg_ok "Configured YTPTube"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/ytptube.service
[Unit]
Description=YTPTube
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/ytptube
EnvironmentFile=/opt/ytptube_data/config/.env
Environment=PATH=/opt/ytptube/.venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
ExecStartPre=-/opt/ytptube/.venv/bin/python /opt/ytptube/app/upgrader.py
ExecStart=/opt/ytptube/.venv/bin/python /opt/ytptube/app/main.py
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now ytptube
msg_ok "Created Service"
motd_ssh
customize
cleanup_lxc
Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

-15
View File
@@ -1,15 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" role="img" aria-labelledby="title desc">
<title id="title">Community Scripts - CS Amber</title>
<desc id="desc">A continuous ivory C interlocks with a warm orange S on charcoal. Both letterforms use rounded, folded geometry.</desc>
<rect width="512" height="512" rx="112" fill="#29262b"/>
<defs>
<mask id="weave-clearance" maskUnits="userSpaceOnUse" x="0" y="0" width="512" height="512">
<rect width="512" height="512" fill="white"/>
<path d="M390 142H322L270 172V220L322 250H348L392 276V338L338 370H284" fill="none" stroke="black" stroke-width="72" stroke-linecap="round" stroke-linejoin="round"/>
</mask>
</defs>
<g fill="none" stroke-width="56" stroke-linecap="round" stroke-linejoin="round">
<path d="M254 142H186L118 182V330L186 370H254" stroke="#f5f4eb" mask="url(#weave-clearance)"/>
<path d="M390 142H322L270 172V220L322 250H348L392 276V338L338 370H284" stroke="#f29a67"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 997 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

+6 -39
View File
@@ -314,54 +314,21 @@ EOF
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Support Subscriptions" \
"Supporting the software's development team is essential.\nPlease consider buying a subscription." 10 58
msg_info "Disabling subscription nag"
mkdir -p /usr/local/bin
cat >/usr/local/bin/pmg-remove-nag.sh <<'EOF'
#!/bin/sh
WEB_JS=/usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
if [ -s "$WEB_JS" ] && ! grep -q NoMoreNagging "$WEB_JS"; then
sed -i '/data\.status/{s/\!//;s/active/NoMoreNagging/}' "$WEB_JS"
fi
MOBILE_JS=/usr/share/javascript/pmg-gui/js/pmgmanagerlib-mobile.js
if [ -s "$MOBILE_JS" ] && ! grep -q NoMoreNagging "$MOBILE_JS"; then
sed -i '/data\.status/{s/\!//;s/active/NoMoreNagging/}' "$MOBILE_JS"
fi
MOBILE_TPL=/usr/share/pmg-mobile-quarantine-ui/pmg-mobile-index.html.tt
if [ -s "$MOBILE_TPL" ] && ! grep -q NoMoreNagging "$MOBILE_TPL"; then
sed -i '/<head>/r /dev/stdin' "$MOBILE_TPL" <<'HTML'
<script>
// NoMoreNagging
const nativeFetch = window.fetch.bind(window);
window.fetch = async (...args) => {
const res = await nativeFetch(...args);
if (!String(args[0]?.url ?? args[0]).includes('/nodes/localhost/subscription')) return res;
const body = await res.clone().json().catch(() => null);
if (!body?.data) return res;
body.data.status = 'active';
return new Response(JSON.stringify(body), { status: res.status, headers: res.headers });
};
</script>
HTML
fi
EOF
chmod 755 /usr/local/bin/pmg-remove-nag.sh
cat >/etc/apt/apt.conf.d/no-nag-script <<'EOF'
DPkg::Post-Invoke { "/usr/local/bin/pmg-remove-nag.sh"; };
DPkg::Post-Invoke { "if [ -s /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js ] && ! grep -q -F 'NoMoreNagging' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; then sed -i '/data\.status/{s/\!//;s/active/NoMoreNagging/}' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; fi"; };
EOF
cat >/etc/apt/apt.conf.d/no-nag-script-pmgmanagerlib-mobile <<'EOF'
DPkg::Post-Invoke { "if [ -s /usr/share/javascript/pmg-gui/js/pmgmanagerlib-mobile.js ] && ! grep -q -F 'NoMoreNagging' /usr/share/javascript/pmg-gui/js/pmgmanagerlib-mobile.js; then sed -i '/data\.status/{s/\!//;s/active/NoMoreNagging/}' /usr/share/javascript/pmg-gui/js/pmgmanagerlib-mobile.js; fi"; };
EOF
rm -f /etc/apt/apt.conf.d/no-nag-script-pmgmanagerlib-mobile
msg_ok "Disabled subscription nag (clear browser cache!)"
;;
no)
msg_error "Selected no to Disabling subscription nag"
rm -f /etc/apt/apt.conf.d/no-nag-script /etc/apt/apt.conf.d/no-nag-script-pmgmanagerlib-mobile /usr/local/bin/pmg-remove-nag.sh
rm -f /etc/apt/apt.conf.d/no-nag-script 2>/dev/null
;;
esac
apt --reinstall install proxmox-widget-toolkit pmg-gui &>/dev/null || msg_error "Widget toolkit reinstall failed"
if dpkg -s pmg-mobile-quarantine-ui &>/dev/null; then
apt --reinstall install pmg-mobile-quarantine-ui &>/dev/null || msg_error "Mobile quarantine UI reinstall failed"
fi
# ---- UPDATE ----
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE" --menu \