mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2025-12-14 11:13:27 +01:00
Compare commits
83 Commits
2025-12-04
...
feature/ad
| Author | SHA1 | Date | |
|---|---|---|---|
| b83ac2b7a5 | |||
| 6bf6da09c5 | |||
| 8b94082ece | |||
| f95cc5a7ad | |||
| 3fb9d02f36 | |||
| a748be9a1f | |||
| 4d4ced6b63 | |||
| a5d017c83b | |||
| 5378d822f8 | |||
| 243cb34d47 | |||
| 59699425f8 | |||
| 155a8571ba | |||
| 1cae72bdec | |||
| 531ecad4c7 | |||
| 9e8ab9de01 | |||
| 70557798ec | |||
| 4b554900ca | |||
| 9f84eae07f | |||
| ba5bdd94ad | |||
| d18baa2177 | |||
| 779c06f232 | |||
| 9e2b6524c4 | |||
| a328d7b8ba | |||
| dfa4d82951 | |||
| 5e5a8cd104 | |||
| 0da3231d3c | |||
| 5a6a30e594 | |||
| 97ac2520ec | |||
| bd5fe17228 | |||
| f42586c083 | |||
| fab5539c82 | |||
| 1ecb5bbeab | |||
| 64dbd4e9f7 | |||
| 2ba63b28f0 | |||
| 2a3b09b413 | |||
| d6ca5676df | |||
| 478194ba1a | |||
| d241c03b3d | |||
| 8cd037ff88 | |||
| fb15c13833 | |||
| e95541260b | |||
| a37ac14907 | |||
| 74a870bc5c | |||
| e0f65f2db8 | |||
| 01b246f375 | |||
| 53dd0efddd | |||
| f31978a503 | |||
| 4971bc46be | |||
| 28b894db2b | |||
| 6ec4aeb4f0 | |||
| 6409d64b93 | |||
| 08cb3cc76a | |||
| 170d44e2aa | |||
| b436ba548d | |||
| ed435d58d6 | |||
| dd5993d7ab | |||
| 0c2521c05e | |||
| 89595627a6 | |||
| a0e8ee2130 | |||
| e462aba7c2 | |||
| 338762b30b | |||
| bda700a6c3 | |||
| 976b9188a0 | |||
| 2ef2ce0a4b | |||
| 6dc73981d9 | |||
| f64bed06d0 | |||
| ca4de7bbe9 | |||
| 00ccef68bf | |||
| e0dc02a3e7 | |||
| 1c325f6885 | |||
| 64407dfccb | |||
| c7f04f379c | |||
| 86491da8b5 | |||
| 0d6ea7fa59 | |||
| a0c1243c94 | |||
| 2799201cfe | |||
| f971c077d6 | |||
| d2e9997d0d | |||
| 316082eaaa | |||
| a81c074228 | |||
| 33ce3fdbc5 | |||
| e73f35e2c8 | |||
| eb53af44c9 |
14
.github/CONTRIBUTOR_AND_GUIDES/CODE-AUDIT.md
generated
vendored
14
.github/CONTRIBUTOR_AND_GUIDES/CODE-AUDIT.md
generated
vendored
@ -1,14 +0,0 @@
|
||||
<div align="center">
|
||||
<img src="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/images/logo.png" height="100px" />
|
||||
</div>
|
||||
<h2><div align="center">Exploring the Scripts and Steps Involved in an Application LXC Installation</div></h2>
|
||||
|
||||
1) [adguard.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/ct/adguard.sh): This script collects system parameters. (Also holds the function to update the application.)
|
||||
2) [build.func](https://github.com/community-scripts/ProxmoxVE/blob/main/misc/build.func): Adds user settings and integrates collected information.
|
||||
3) [create_lxc.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/misc/create_lxc.sh): Constructs the LXC container.
|
||||
4) [adguard-install.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/install/adguard-install.sh): Executes functions from [install.func](https://github.com/community-scripts/ProxmoxVE/blob/main/misc/install.func), and installs the application.
|
||||
5) [adguard.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/ct/adguard.sh) (again): To display the completion message.
|
||||
|
||||
The installation process uses reusable scripts: [build.func](https://github.com/community-scripts/ProxmoxVE/blob/main/misc/build.func), [create_lxc.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/misc/create_lxc.sh), and [install.func](https://github.com/community-scripts/ProxmoxVE/blob/main/misc/install.func), which are not specific to any particular application.
|
||||
|
||||
To gain a better understanding, focus on reviewing [adguard-install.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/install/adguard-install.sh). This script contains the commands and configurations for installing and configuring AdGuard Home within the LXC container.
|
||||
129
.github/CONTRIBUTOR_AND_GUIDES/CONTRIBUTING.md
generated
vendored
129
.github/CONTRIBUTOR_AND_GUIDES/CONTRIBUTING.md
generated
vendored
@ -1,129 +0,0 @@
|
||||
|
||||
# Community Scripts Contribution Guide
|
||||
|
||||
## **Welcome to the communty-scripts Repository!**
|
||||
|
||||
📜 These documents outline the essential coding standards for all our scripts and JSON files. Adhering to these standards ensures that our codebase remains consistent, readable, and maintainable. By following these guidelines, we can improve collaboration, reduce errors, and enhance the overall quality of our project.
|
||||
|
||||
### Why Coding Standards Matter
|
||||
|
||||
Coding standards are crucial for several reasons:
|
||||
|
||||
1. **Consistency**: Consistent code is easier to read, understand, and maintain. It helps new team members quickly get up to speed and reduces the learning curve.
|
||||
2. **Readability**: Clear and well-structured code is easier to debug and extend. It allows developers to quickly identify and fix issues.
|
||||
3. **Maintainability**: Code that follows a standard structure is easier to refactor and update. It ensures that changes can be made with minimal risk of introducing new bugs.
|
||||
4. **Collaboration**: When everyone follows the same standards, it becomes easier to collaborate on code. It reduces friction and misunderstandings during code reviews and merges.
|
||||
|
||||
### Scope of These Documents
|
||||
|
||||
These documents cover the coding standards for the following types of files in our project:
|
||||
|
||||
- **`install/$AppName-install.sh` Scripts**: These scripts are responsible for the installation of applications.
|
||||
- **`ct/$AppName.sh` Scripts**: These scripts handle the creation and updating of containers.
|
||||
- **`frontend/public/json/$AppName.json`**: These files store structured data and are used for the website.
|
||||
|
||||
Each section provides detailed guidelines on various aspects of coding, including shebang usage, comments, variable naming, function naming, indentation, error handling, command substitution, quoting, script structure, and logging. Additionally, examples are provided to illustrate the application of these standards.
|
||||
|
||||
By following the coding standards outlined in this document, we ensure that our scripts and JSON files are of high quality, making our project more robust and easier to manage. Please refer to this guide whenever you create or update scripts and JSON files to maintain a high standard of code quality across the project. 📚🔍
|
||||
|
||||
Let's work together to keep our codebase clean, efficient, and maintainable! 💪🚀
|
||||
|
||||
|
||||
## Getting Started
|
||||
|
||||
Before contributing, please ensure that you have the following setup:
|
||||
|
||||
1. **Visual Studio Code** (recommended for script development)
|
||||
2. **Recommended VS Code Extensions:**
|
||||
- [Shell Syntax](https://marketplace.visualstudio.com/items?itemName=bmalehorn.shell-syntax)
|
||||
- [ShellCheck](https://marketplace.visualstudio.com/items?itemName=timonwong.shellcheck)
|
||||
- [Shell Format](https://marketplace.visualstudio.com/items?itemName=foxundermoon.shell-format)
|
||||
|
||||
### Important Notes
|
||||
- Use [AppName.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/ct/AppName.sh) and [AppName-install.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.sh) as templates when creating new scripts. Final version of the script (the one you will push for review), must have all comments removed, except the ones in the file header.
|
||||
|
||||
---
|
||||
|
||||
# 🚀 The Application Script (ct/AppName.sh)
|
||||
|
||||
- You can find all coding standards, as well as the structure for this file [here](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/ct/AppName.md).
|
||||
- These scripts are responsible for container creation, setting the necessary variables and handling the update of the application once installed.
|
||||
|
||||
---
|
||||
|
||||
# 🛠 The Installation Script (install/AppName-install.sh)
|
||||
|
||||
- You can find all coding standards, as well as the structure for this file [here](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.md).
|
||||
- These scripts are responsible for the installation of the application.
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Building Your Own Scripts
|
||||
|
||||
Start with the [template script](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.sh)
|
||||
|
||||
---
|
||||
|
||||
## 🤝 Contribution Process
|
||||
|
||||
All PR's related to new scripts should be made against our Dev repository first, where we can test the scripts before they are pushed and merged in the official repository.
|
||||
|
||||
**Our Dev repo is `http://www.github.com/community-scripts/ProxmoxVED`**
|
||||
|
||||
You will need to adjust paths mentioned further down this document to match the repo you're pushing the scripts to.
|
||||
|
||||
### 1. Fork the repository
|
||||
Fork to your GitHub account
|
||||
|
||||
### 2. Clone your fork on your local environment
|
||||
```bash
|
||||
git clone https://github.com/yourUserName/ForkName
|
||||
```
|
||||
|
||||
### 3. Create a new branch
|
||||
```bash
|
||||
git switch -c your-feature-branch
|
||||
```
|
||||
|
||||
### 4. Change paths in build.func install.func and AppName.sh
|
||||
To be able to develop from your own branch you need to change:\
|
||||
`https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main`\
|
||||
to\
|
||||
`https://raw.githubusercontent.com/[USER]/[REPOSITORY]/refs/heads/[BRANCH]`\
|
||||
in following files:
|
||||
|
||||
`misc/build.func`\
|
||||
`misc/install.func`\
|
||||
`ct/AppName.sh`
|
||||
|
||||
Example: `https://raw.githubusercontent.com/tremor021/PromoxVE/refs/heads/testbranch`
|
||||
|
||||
Also you need to change:\
|
||||
`https://raw.githubusercontent.com/community-scripts/ProxmoxVE/raw/main`\
|
||||
to\
|
||||
`https://raw.githubusercontent.com/[USER]/[REPOSITORY]/raw/[BRANCH]`\
|
||||
in `misc/install.func` in order for `update` shell command to work.\
|
||||
These changes are only while writing and testing your scripts. Before opening a Pull Request, you should change all above mentioned paths in `misc/build.func`, `misc/install.func` and `ct/AppName.sh` to point to the original paths.
|
||||
|
||||
### 4. Commit changes (without build.func and install.func!)
|
||||
```bash
|
||||
git commit -m "Your commit message"
|
||||
```
|
||||
|
||||
### 5. Push to your fork
|
||||
```bash
|
||||
git push origin your-feature-branch
|
||||
```
|
||||
|
||||
### 6. Create a Pull Request
|
||||
Open a Pull Request from your feature branch to the main branch on the Dev repository. You must only include your **$AppName.sh**, **$AppName-install.sh** and **$AppName.json** files in the pull request.
|
||||
|
||||
---
|
||||
|
||||
## 📚 Pages
|
||||
|
||||
- [CT Template: AppName.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/ct/AppName.sh)
|
||||
- [Install Template: AppName-install.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.sh)
|
||||
- [JSON Template: AppName.json](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/json/AppName.json)
|
||||
|
||||
|
||||
44
.github/CONTRIBUTOR_AND_GUIDES/USER_SUBMITTED_GUIDES.md
generated
vendored
44
.github/CONTRIBUTOR_AND_GUIDES/USER_SUBMITTED_GUIDES.md
generated
vendored
@ -1,44 +0,0 @@
|
||||
<div align="center">
|
||||
<a href="#">
|
||||
<img src="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/images/logo.png" height="100px" />
|
||||
</a>
|
||||
</div>
|
||||
<h2 align="center">User Submitted Guides </h2>
|
||||
|
||||
<sub> In order to contribute a guide on installing with Proxmox VE Helper Scripts, you should open a pull request that adds the guide to the `USER_SUBMITTED_GUIDES.md` file. </sub>
|
||||
|
||||
[Proxmox Automation with Proxmox Helper Scripts!](https://www.youtube.com/watch?v=kcpu4z5eSEU)
|
||||
|
||||
[Installing Home Assistant OS using Proxmox 8](https://community.home-assistant.io/t/installing-home-assistant-os-using-proxmox-8/201835)
|
||||
|
||||
[How To Separate Zigbee2MQTT From Home Assistant In Proxmox](https://smarthomescene.com/guides/how-to-separate-zigbee2mqtt-from-home-assistant-in-proxmox/)
|
||||
|
||||
[How To Install Home Assistant On Proxmox: The Easy Way](https://smarthomescene.com/guides/how-to-install-home-assistant-on-proxmox-the-easy-way/)
|
||||
|
||||
[Home Assistant: Installing InfluxDB (LXC)](https://www.derekseaman.com/2023/04/home-assistant-installing-influxdb-lxc.html)
|
||||
|
||||
[Home Assistant: Proxmox Quick Start Guide](https://www.derekseaman.com/2023/10/home-assistant-proxmox-ve-8-0-quick-start-guide-2.html)
|
||||
|
||||
[Home Assistant: Installing Grafana (LXC) with Let’s Encrypt SSL](https://www.derekseaman.com/2023/04/home-assistant-installing-grafana-lxc.html)
|
||||
|
||||
[Proxmox: Plex LXC with Alder Lake Transcoding](https://www.derekseaman.com/2023/04/proxmox-plex-lxc-with-alder-lake-transcoding.html)
|
||||
|
||||
[How To Backup Home Assistant In Proxmox](https://smarthomescene.com/guides/how-to-backup-home-assistant-in-proxmox/)
|
||||
|
||||
[Running Frigate on Proxmox](https://www.homeautomationguy.io/blog/running-frigate-on-proxmox)
|
||||
|
||||
[Frigate VM on Proxmox with PCIe Coral TPU](https://www.derekseaman.com/2023/06/home-assistant-frigate-vm-on-proxmox-with-pcie-coral-tpu.html)
|
||||
|
||||
[Moving Home Assistant’s Database To MariaDB On Proxmox](https://smarthomescene.com/guides/moving-home-assistants-database-to-mariadb-on-proxmox/)
|
||||
|
||||
[How-to: Proxmox VE 7.4 to 8.0 Upgrade](https://www.derekseaman.com/2023/06/how-to-proxmox-7-4-to-8-0-upgrade.html)
|
||||
|
||||
[iGPU Transcoding In Proxmox with Jellyfin](https://www.youtube.com/watch?v=XAa_qpNmzZs)
|
||||
|
||||
[Proxmox + NetData](<https://dbt3ch.com/books/proxmox-netdata-for-better-insights-and-notifications/page/proxmox-netdata-for-better-insights-and-notifications>)
|
||||
|
||||
[Proxmox Homelab Series](<https://blog.kye.dev/proxmox-series>)
|
||||
|
||||
[The fastest installation of Docker and Portainer on Proxmox VE](https://lavr.site/en-fastest-install-docker-portainer-proxmox/)
|
||||
|
||||
[How To Setup Proxmox Backuper Server Using Helper Scripts](<https://youtu.be/6C2JOsrZZZw?si=kkrrcL_nLCDBJkOB>)
|
||||
287
.github/CONTRIBUTOR_AND_GUIDES/ct/AppName.md
generated
vendored
287
.github/CONTRIBUTOR_AND_GUIDES/ct/AppName.md
generated
vendored
@ -1,287 +0,0 @@
|
||||
# **AppName<span></span>.sh Scripts**
|
||||
|
||||
`AppName.sh` scripts found in the `/ct` directory. These scripts are responsible for the installation of the desired application. For this guide we take `/ct/snipeit.sh` as example.
|
||||
|
||||
## Table of Contents
|
||||
|
||||
- [**AppName.sh Scripts**](#appnamesh-scripts)
|
||||
- [Table of Contents](#table-of-contents)
|
||||
- [1. **File Header**](#1-file-header)
|
||||
- [1.1 **Shebang**](#11-shebang)
|
||||
- [1.2 **Import Functions**](#12-import-functions)
|
||||
- [1.3 **Metadata**](#13-metadata)
|
||||
- [2 **Variables and function import**](#2-variables-and-function-import)
|
||||
- [2.1 **Default Values**](#21-default-values)
|
||||
- [2.2 **📋 App output \& base settings**](#22--app-output--base-settings)
|
||||
- [2.3 **🛠 Core functions**](#23--core-functions)
|
||||
- [3 **Update function**](#3-update-function)
|
||||
- [3.1 **Function Header**](#31-function-header)
|
||||
- [3.2 **Check APP**](#32-check-app)
|
||||
- [3.3 **Check version**](#33-check-version)
|
||||
- [3.4 **Verbosity**](#34-verbosity)
|
||||
- [3.5 **Backups**](#35-backups)
|
||||
- [3.6 **Cleanup**](#36-cleanup)
|
||||
- [3.7 **No update function**](#37-no-update-function)
|
||||
- [4 **End of the script**](#4-end-of-the-script)
|
||||
- [5. **Contribution checklist**](#5-contribution-checklist)
|
||||
|
||||
## 1. **File Header**
|
||||
|
||||
### 1.1 **Shebang**
|
||||
|
||||
- Use `#!/usr/bin/env bash` as the shebang.
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
```
|
||||
|
||||
### 1.2 **Import Functions**
|
||||
|
||||
- Import the build.func file.
|
||||
- When developing your own script, change the URL to your own repository.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> You also need to change all apperances of this URL in `misc/build.func` and `misc/install.func`
|
||||
|
||||
Example for development:
|
||||
|
||||
```bash
|
||||
source <(curl -s https://raw.githubusercontent.com/[USER]/[REPO]/refs/heads/[BRANCH]/misc/build.func)
|
||||
```
|
||||
|
||||
Final script:
|
||||
|
||||
```bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
```
|
||||
|
||||
> [!CAUTION]
|
||||
> Before opening a Pull Request, change the URLs to point to the community-scripts repo.
|
||||
|
||||
### 1.3 **Metadata**
|
||||
|
||||
- Add clear comments for script metadata, including author, copyright, and license information.
|
||||
|
||||
Example:
|
||||
|
||||
```bash
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: [YourUserName]
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: [SOURCE_URL]
|
||||
```
|
||||
|
||||
> [!NOTE]:
|
||||
>
|
||||
> - Add your username and source URL
|
||||
> - For existing scripts, add "| Co-Author [YourUserName]" after the current author
|
||||
> - Source is a URL of github repo containting source files of the application you're installing (not URL of your homepage or a blog)
|
||||
|
||||
---
|
||||
|
||||
## 2 **Variables and function import**
|
||||
>
|
||||
> [!NOTE]
|
||||
> You need to have all this set in your script, otherwise it will not work!
|
||||
|
||||
### 2.1 **Default Values**
|
||||
|
||||
- This section sets the default values for the container.
|
||||
- `APP` needs to be set to the application name and must be equal to the filenames of your scripts.
|
||||
- `var_tags`: You can set Tags for the CT wich show up in the Proxmox UI. Don´t overdo it!
|
||||
|
||||
>[!NOTE]
|
||||
>Description for all Default Values
|
||||
>
|
||||
>| Variable | Description | Notes |
|
||||
>|----------|-------------|-------|
|
||||
>| `APP` | Application name | Must match ct\AppName.sh |
|
||||
>| `var_tags` | Proxmox display tags without Spaces, only ; | Limit the number to 2 |
|
||||
>| `var_cpu` | CPU cores | Number of cores |
|
||||
>| `var_ram` | RAM | In MB |
|
||||
>| `var_disk` | Disk capacity | In GB |
|
||||
>| `var_os` | Operating system | alpine, debian, ubuntu |
|
||||
>| `var_version` | OS version | e.g., 3.20, 11, 12, 20.04 |
|
||||
>| `var_unprivileged` | Container type | 1 = Unprivileged, 0 = Privileged |
|
||||
|
||||
Example:
|
||||
|
||||
```bash
|
||||
APP="SnipeIT"
|
||||
var_tags="${var_tags:-asset-management;foss}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-4}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-12}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
```
|
||||
|
||||
## 2.2 **📋 App output & base settings**
|
||||
|
||||
```bash
|
||||
header_info "$APP"
|
||||
```
|
||||
- `header_info`: Generates ASCII header for APP
|
||||
|
||||
## 2.3 **🛠 Core functions**
|
||||
|
||||
```bash
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
```
|
||||
|
||||
- `variables`: Processes input and prepares variables
|
||||
- `color`: Sets icons, colors, and formatting
|
||||
- `catch_errors`: Enables error handling
|
||||
|
||||
---
|
||||
|
||||
## 3 **Update function**
|
||||
|
||||
### 3.1 **Function Header**
|
||||
|
||||
- If applicable write a function that updates the application and the OS in the container.
|
||||
- Each update function starts with the same code:
|
||||
|
||||
```bash
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
```
|
||||
|
||||
### 3.2 **Check APP**
|
||||
|
||||
- Before doing anything update-wise, check if the app is installed in the container.
|
||||
|
||||
Example:
|
||||
|
||||
```bash
|
||||
if [[ ! -d /opt/snipe-it ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
```
|
||||
|
||||
### 3.3 **Check version**
|
||||
|
||||
- Before updating, check if a new version exists.
|
||||
- We use the `${APPLICATION}_version.txt` file created in `/opt` during the install to compare new versions against the currently installed version.
|
||||
|
||||
Example with a Github Release:
|
||||
|
||||
```bash
|
||||
RELEASE=$(curl -fsSL https://api.github.com/repos/snipe/snipe-it/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
|
||||
msg_info "Updating ${APP} to v${RELEASE}"
|
||||
#DO UPDATE
|
||||
else
|
||||
msg_ok "No update required. ${APP} is already at v${RELEASE}."
|
||||
fi
|
||||
exit
|
||||
}
|
||||
```
|
||||
|
||||
### 3.4 **Verbosity**
|
||||
|
||||
- Use the appropriate flag (**-q** in the examples) for a command to suppress its output.
|
||||
Example:
|
||||
|
||||
```bash
|
||||
wget -q
|
||||
unzip -q
|
||||
```
|
||||
|
||||
- If a command does not come with this functionality use `$STD` to suppress it's output.
|
||||
|
||||
Example:
|
||||
|
||||
```bash
|
||||
$STD php artisan migrate --force
|
||||
$STD php artisan config:clear
|
||||
```
|
||||
|
||||
### 3.5 **Backups**
|
||||
|
||||
- Backup user data if necessary.
|
||||
- Move all user data back in the directory when the update is finished.
|
||||
|
||||
>[!NOTE]
|
||||
>This is not meant to be a permanent backup
|
||||
|
||||
Example backup:
|
||||
|
||||
```bash
|
||||
mv /opt/snipe-it /opt/snipe-it-backup
|
||||
```
|
||||
|
||||
Example config restore:
|
||||
|
||||
```bash
|
||||
cp /opt/snipe-it-backup/.env /opt/snipe-it/.env
|
||||
cp -r /opt/snipe-it-backup/public/uploads/ /opt/snipe-it/public/uploads/
|
||||
cp -r /opt/snipe-it-backup/storage/private_uploads /opt/snipe-it/storage/private_uploads
|
||||
```
|
||||
|
||||
### 3.6 **Cleanup**
|
||||
|
||||
- Do not forget to remove any temporary files/folders such as zip-files or temporary backups.
|
||||
Example:
|
||||
|
||||
```bash
|
||||
rm -rf /opt/v${RELEASE}.zip
|
||||
rm -rf /opt/snipe-it-backup
|
||||
```
|
||||
|
||||
### 3.7 **No update function**
|
||||
|
||||
- In case you can not provide an update function use the following code to provide user feedback.
|
||||
|
||||
```bash
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
if [[ ! -d /opt/snipeit ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_error "Currently we don't provide an update function for this ${APP}."
|
||||
exit
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4 **End of the script**
|
||||
|
||||
- `start`: Launches Whiptail dialogue
|
||||
- `build_container`: Collects and integrates user settings
|
||||
- `description`: Sets LXC container description
|
||||
- With `echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"` you can point the user to the IP:PORT/folder needed to access the app.
|
||||
|
||||
```bash
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed Successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. **Contribution checklist**
|
||||
|
||||
- [ ] Shebang is correctly set (`#!/usr/bin/env bash`).
|
||||
- [ ] Correct link to *build.func*
|
||||
- [ ] Metadata (author, license) is included at the top.
|
||||
- [ ] Variables follow naming conventions.
|
||||
- [ ] Update function exists.
|
||||
- [ ] Update functions checks if app is installed and for new version.
|
||||
- [ ] Update function cleans up temporary files.
|
||||
- [ ] Script ends with a helpful message for the user to reach the application.
|
||||
86
.github/CONTRIBUTOR_AND_GUIDES/ct/AppName.sh
generated
vendored
86
.github/CONTRIBUTOR_AND_GUIDES/ct/AppName.sh
generated
vendored
@ -1,86 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: [YourUserName]
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: [SOURCE_URL]
|
||||
|
||||
# App Default Values
|
||||
# Name of the app (e.g. Google, Adventurelog, Apache-Guacamole"
|
||||
APP="[APP_NAME]"
|
||||
# Tags for Proxmox VE, maximum 2 pcs., no spaces allowed, separated by a semicolon ; (e.g. database | adblock;dhcp)
|
||||
var_tags="${var_tags:-[TAGS]}"
|
||||
# Number of cores (1-X) (e.g. 4) - default are 2
|
||||
var_cpu="${var_cpu:-[CPU]}"
|
||||
# Amount of used RAM in MB (e.g. 2048 or 4096)
|
||||
var_ram="${var_ram:-[RAM]}"
|
||||
# Amount of used disk space in GB (e.g. 4 or 10)
|
||||
var_disk="${var_disk:-[DISK]}"
|
||||
# Default OS (e.g. debian, ubuntu, alpine)
|
||||
var_os="${var_os:-[OS]}"
|
||||
# Default OS version (e.g. 12 for debian, 24.04 for ubuntu, 3.20 for alpine)
|
||||
var_version="${var_version:-[VERSION]}"
|
||||
# 1 = unprivileged container, 0 = privileged container
|
||||
var_unprivileged="${var_unprivileged:-[UNPRIVILEGED]}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
# Check if installation is present | -f for file, -d for folder
|
||||
if [[ ! -f [INSTALLATION_CHECK_PATH] ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
# Crawling the new version and checking whether an update is required
|
||||
RELEASE=$(curl -fsSL [RELEASE_URL] | [PARSE_RELEASE_COMMAND])
|
||||
if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
|
||||
# Stopping Services
|
||||
msg_info "Stopping $APP"
|
||||
systemctl stop [SERVICE_NAME]
|
||||
msg_ok "Stopped $APP"
|
||||
|
||||
# Creating Backup
|
||||
msg_info "Creating Backup"
|
||||
tar -czf "/opt/${APP}_backup_$(date +%F).tar.gz" [IMPORTANT_PATHS]
|
||||
msg_ok "Backup Created"
|
||||
|
||||
# Execute Update
|
||||
msg_info "Updating $APP to v${RELEASE}"
|
||||
[UPDATE_COMMANDS]
|
||||
msg_ok "Updated $APP to v${RELEASE}"
|
||||
|
||||
# Starting Services
|
||||
msg_info "Starting $APP"
|
||||
systemctl start [SERVICE_NAME]
|
||||
msg_ok "Started $APP"
|
||||
|
||||
# Cleaning up
|
||||
msg_info "Cleaning Up"
|
||||
rm -rf [TEMP_FILES]
|
||||
msg_ok "Cleanup Completed"
|
||||
|
||||
# Last Action
|
||||
echo "${RELEASE}" >/opt/${APP}_version.txt
|
||||
msg_ok "Update Successful"
|
||||
else
|
||||
msg_ok "No update required. ${APP} is already at v${RELEASE}"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed Successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:[PORT]${CL}"
|
||||
354
.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.md
generated
vendored
354
.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.md
generated
vendored
@ -1,354 +0,0 @@
|
||||
|
||||
# **AppName<span></span>-install.sh Scripts**
|
||||
|
||||
`AppName-install.sh` scripts found in the `/install` directory. These scripts are responsible for the installation of the application. For this guide we take `/install/snipeit-install.sh` as example.
|
||||
|
||||
## Table of Contents
|
||||
|
||||
- [**AppName-install.sh Scripts**](#appname-installsh-scripts)
|
||||
- [Table of Contents](#table-of-contents)
|
||||
- [1. **File header**](#1-file-header)
|
||||
- [1.1 **Shebang**](#11-shebang)
|
||||
- [1.2 **Comments**](#12-comments)
|
||||
- [1.3 **Variables and function import**](#13-variables-and-function-import)
|
||||
- [2. **Variable naming and management**](#2-variable-naming-and-management)
|
||||
- [2.1 **Naming conventions**](#21-naming-conventions)
|
||||
- [3. **Dependencies**](#3-dependencies)
|
||||
- [3.1 **Install all at once**](#31-install-all-at-once)
|
||||
- [3.2 **Collapse dependencies**](#32-collapse-dependencies)
|
||||
- [4. **Paths to application files**](#4-paths-to-application-files)
|
||||
- [5. **Version management**](#5-version-management)
|
||||
- [5.1 **Install the latest release**](#51-install-the-latest-release)
|
||||
- [5.2 **Save the version for update checks**](#52-save-the-version-for-update-checks)
|
||||
- [6. **Input and output management**](#6-input-and-output-management)
|
||||
- [6.1 **User feedback**](#61-user-feedback)
|
||||
- [6.2 **Verbosity**](#62-verbosity)
|
||||
- [7. **String/File Manipulation**](#7-stringfile-manipulation)
|
||||
- [7.1 **File Manipulation**](#71-file-manipulation)
|
||||
- [8. **Security practices**](#8-security-practices)
|
||||
- [8.1 **Password generation**](#81-password-generation)
|
||||
- [8.2 **File permissions**](#82-file-permissions)
|
||||
- [9. **Service Configuration**](#9-service-configuration)
|
||||
- [9.1 **Configuration files**](#91-configuration-files)
|
||||
- [9.2 **Credential management**](#92-credential-management)
|
||||
- [9.3 **Enviroment files**](#93-enviroment-files)
|
||||
- [9.4 **Services**](#94-services)
|
||||
- [10. **Cleanup**](#10-cleanup)
|
||||
- [10.1 **Remove temporary files**](#101-remove-temporary-files)
|
||||
- [10.2 **Autoremove and autoclean**](#102-autoremove-and-autoclean)
|
||||
- [11. **Best Practices Checklist**](#11-best-practices-checklist)
|
||||
- [Example: High-Level Script Flow](#example-high-level-script-flow)
|
||||
|
||||
## 1. **File header**
|
||||
|
||||
### 1.1 **Shebang**
|
||||
|
||||
- Use `#!/usr/bin/env bash` as the shebang.
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
```
|
||||
|
||||
### 1.2 **Comments**
|
||||
|
||||
- Add clear comments for script metadata, including author, copyright, and license information.
|
||||
- Use meaningful inline comments to explain complex commands or logic.
|
||||
|
||||
Example:
|
||||
|
||||
```bash
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: [YourUserName]
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: [SOURCE_URL]
|
||||
```
|
||||
|
||||
> [!NOTE]:
|
||||
>
|
||||
> - Add your username
|
||||
> - When updating/reworking scripts, add "| Co-Author [YourUserName]"
|
||||
> - Source is a URL of github repo containting source files of the application you're installing (not URL of your homepage or a blog)
|
||||
|
||||
### 1.3 **Variables and function import**
|
||||
|
||||
- This sections adds the support for all needed functions and variables.
|
||||
|
||||
```bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. **Variable naming and management**
|
||||
|
||||
### 2.1 **Naming conventions**
|
||||
|
||||
- Use uppercase names for constants and environment variables.
|
||||
- Use lowercase names for local script variables.
|
||||
|
||||
Example:
|
||||
|
||||
```bash
|
||||
DB_NAME=snipeit_db # Environment-like variable (constant)
|
||||
db_user="snipeit" # Local variable
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. **Dependencies**
|
||||
|
||||
### 3.1 **Install all at once**
|
||||
|
||||
- Install all dependencies with a single command if possible
|
||||
|
||||
Example:
|
||||
|
||||
```bash
|
||||
$STD apt-get install -y \
|
||||
composer \
|
||||
git \
|
||||
nginx
|
||||
```
|
||||
|
||||
### 3.2 **Collapse dependencies**
|
||||
|
||||
Collapse dependencies to keep the code readable.
|
||||
|
||||
Example:
|
||||
Use
|
||||
|
||||
```bash
|
||||
php8.2-{bcmath,common,ctype}
|
||||
```
|
||||
|
||||
instead of
|
||||
|
||||
```bash
|
||||
php8.2-bcmath php8.2-common php8.2-ctype
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. **Paths to application files**
|
||||
|
||||
If possible install the app and all necessary files in `/opt/`
|
||||
|
||||
---
|
||||
|
||||
## 5. **Version management**
|
||||
|
||||
### 5.1 **Install the latest release**
|
||||
|
||||
- Always try and install the latest release
|
||||
- Do not hardcode any version if not absolutely necessary
|
||||
|
||||
Example for a git release:
|
||||
|
||||
```bash
|
||||
RELEASE=$(curl -fsSL https://api.github.com/repos/snipe/snipe-it/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||
curl -fsSL "https://github.com/snipe/snipe-it/archive/refs/tags/v${RELEASE}.zip" -o "v${RELEASE}.zip"
|
||||
```
|
||||
|
||||
### 5.2 **Save the version for update checks**
|
||||
|
||||
- Write the installed version into a file.
|
||||
- This is used for the update function in **AppName.sh** to check for if a Update is needed.
|
||||
|
||||
Example:
|
||||
|
||||
```bash
|
||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. **Input and output management**
|
||||
|
||||
### 6.1 **User feedback**
|
||||
|
||||
- Use standard functions like `msg_info`, `msg_ok` or `msg_error` to print status messages.
|
||||
- Each `msg_info` must be followed with a `msg_ok` before any other output is made.
|
||||
- Display meaningful progress messages at key stages.
|
||||
- Taking user input with `read -p` must be outside of `msg_info`...`msg_ok` code block
|
||||
|
||||
Example:
|
||||
|
||||
```bash
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt-get install -y ...
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
read -p "${TAB3}Do you wish to enable HTTPS mode? (y/N): " httpschoice
|
||||
```
|
||||
|
||||
### 6.2 **Verbosity**
|
||||
|
||||
- Use the appropiate flag (**-q** in the examples) for a command to suppres its output
|
||||
Example:
|
||||
|
||||
```bash
|
||||
wget -q
|
||||
unzip -q
|
||||
```
|
||||
|
||||
- If a command dose not come with such a functionality use `$STD` (a custom standard redirection variable) for managing output verbosity.
|
||||
|
||||
Example:
|
||||
|
||||
```bash
|
||||
$STD apt-get install -y nginx
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. **String/File Manipulation**
|
||||
|
||||
### 7.1 **File Manipulation**
|
||||
|
||||
- Use `sed` to replace placeholder values in configuration files.
|
||||
|
||||
Example:
|
||||
|
||||
```bash
|
||||
sed -i -e "s|^DB_DATABASE=.*|DB_DATABASE=$DB_NAME|" \
|
||||
-e "s|^DB_USERNAME=.*|DB_USERNAME=$DB_USER|" \
|
||||
-e "s|^DB_PASSWORD=.*|DB_PASSWORD=$DB_PASS|" .env
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 8. **Security practices**
|
||||
|
||||
### 8.1 **Password generation**
|
||||
|
||||
- Use `openssl` to generate random passwords.
|
||||
- Use only alphanumeric values to not introduce unknown behaviour.
|
||||
|
||||
Example:
|
||||
|
||||
```bash
|
||||
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
||||
```
|
||||
|
||||
### 8.2 **File permissions**
|
||||
|
||||
Explicitly set secure ownership and permissions for sensitive files.
|
||||
|
||||
Example:
|
||||
|
||||
```bash
|
||||
chown -R www-data: /opt/snipe-it
|
||||
chmod -R 755 /opt/snipe-it
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 9. **Service Configuration**
|
||||
|
||||
### 9.1 **Configuration files**
|
||||
|
||||
Use `cat <<EOF` to write configuration files in a clean and readable way.
|
||||
|
||||
Example:
|
||||
|
||||
```bash
|
||||
cat <<EOF >/etc/nginx/conf.d/snipeit.conf
|
||||
server {
|
||||
listen 80;
|
||||
root /opt/snipe-it/public;
|
||||
index index.php;
|
||||
}
|
||||
EOF
|
||||
```
|
||||
|
||||
### 9.2 **Credential management**
|
||||
|
||||
Store the generated credentials in a file.
|
||||
|
||||
Example:
|
||||
|
||||
```bash
|
||||
USERNAME=username
|
||||
PASSWORD=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
||||
{
|
||||
echo "Application-Credentials"
|
||||
echo "Username: $USERNAME"
|
||||
echo "Password: $PASSWORD"
|
||||
} >> ~/application.creds
|
||||
```
|
||||
|
||||
### 9.3 **Enviroment files**
|
||||
|
||||
Use `cat <<EOF` to write enviromental files in a clean and readable way.
|
||||
|
||||
Example:
|
||||
|
||||
```bash
|
||||
cat <<EOF >/path/to/.env
|
||||
VARIABLE="value"
|
||||
PORT=3000
|
||||
DB_NAME="${DB_NAME}"
|
||||
EOF
|
||||
```
|
||||
|
||||
### 9.4 **Services**
|
||||
|
||||
Enable affected services after configuration changes and start them right away.
|
||||
|
||||
Example:
|
||||
|
||||
```bash
|
||||
systemctl enable -q --now nginx
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 10. **Cleanup**
|
||||
|
||||
### 10.1 **Remove temporary files**
|
||||
|
||||
Remove temporary files and downloads after use.
|
||||
|
||||
Example:
|
||||
|
||||
```bash
|
||||
rm -rf /opt/v${RELEASE}.zip
|
||||
```
|
||||
|
||||
### 10.2 **Autoremove and autoclean**
|
||||
|
||||
Remove unused dependencies to reduce disk space usage.
|
||||
|
||||
Example:
|
||||
|
||||
```bash
|
||||
apt-get -y autoremove
|
||||
apt-get -y autoclean
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 11. **Best Practices Checklist**
|
||||
|
||||
- [ ] Shebang is correctly set (`#!/usr/bin/env bash`).
|
||||
- [ ] Metadata (author, license) is included at the top.
|
||||
- [ ] Variables follow naming conventions.
|
||||
- [ ] Sensitive values are dynamically generated.
|
||||
- [ ] Files and services have proper permissions.
|
||||
- [ ] Script cleans up temporary files.
|
||||
|
||||
---
|
||||
|
||||
### Example: High-Level Script Flow
|
||||
|
||||
1. Dependencies installation
|
||||
2. Database setup
|
||||
3. Download and configure application
|
||||
4. Service configuration
|
||||
5. Final cleanup
|
||||
78
.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.sh
generated
vendored
78
.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.sh
generated
vendored
@ -1,78 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: [YourUserName]
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: [SOURCE_URL]
|
||||
|
||||
# Import Functions und Setup
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
# Installing Dependencies
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt-get install -y \
|
||||
[PACKAGE_1] \
|
||||
[PACKAGE_2] \
|
||||
[PACKAGE_3]
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
# Template: MySQL Database
|
||||
msg_info "Setting up Database"
|
||||
DB_NAME=[DB_NAME]
|
||||
DB_USER=[DB_USER]
|
||||
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
||||
$STD mysql -u root -e "CREATE DATABASE $DB_NAME;"
|
||||
$STD mysql -u root -e "CREATE USER '$DB_USER'@'localhost' IDENTIFIED WITH mysql_native_password AS PASSWORD('$DB_PASS');"
|
||||
$STD mysql -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH PRIVILEGES;"
|
||||
{
|
||||
echo "${APPLICATION} Credentials"
|
||||
echo "Database User: $DB_USER"
|
||||
echo "Database Password: $DB_PASS"
|
||||
echo "Database Name: $DB_NAME"
|
||||
} >>~/"$APP_NAME".creds
|
||||
msg_ok "Set up Database"
|
||||
|
||||
# Setup App
|
||||
msg_info "Setup ${APPLICATION}"
|
||||
RELEASE=$(curl -fsSL https://api.github.com/repos/[REPO]/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
|
||||
curl -fsSL -o "${RELEASE}.zip" "https://github.com/[REPO]/archive/refs/tags/${RELEASE}.zip"
|
||||
unzip -q "${RELEASE}.zip"
|
||||
mv "${APPLICATION}-${RELEASE}/" "/opt/${APPLICATION}"
|
||||
#
|
||||
#
|
||||
#
|
||||
echo "${RELEASE}" >/opt/"${APPLICATION}"_version.txt
|
||||
msg_ok "Setup ${APPLICATION}"
|
||||
|
||||
# Creating Service (if needed)
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/"${APPLICATION}".service
|
||||
[Unit]
|
||||
Description=${APPLICATION} Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
ExecStart=[START_COMMAND]
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now "${APPLICATION}"
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
|
||||
# Cleanup
|
||||
msg_info "Cleaning up"
|
||||
rm -f "${RELEASE}".zip
|
||||
$STD apt-get -y autoremove
|
||||
$STD apt-get -y autoclean
|
||||
msg_ok "Cleaned"
|
||||
114
.github/autolabeler-config.json
generated
vendored
114
.github/autolabeler-config.json
generated
vendored
@ -4,9 +4,7 @@
|
||||
"fileStatus": "added",
|
||||
"includeGlobs": [
|
||||
"ct/**",
|
||||
"tools/**",
|
||||
"install/**",
|
||||
"misc/**",
|
||||
"turnkey/**",
|
||||
"vm/**"
|
||||
],
|
||||
@ -18,9 +16,7 @@
|
||||
"fileStatus": "modified",
|
||||
"includeGlobs": [
|
||||
"ct/**",
|
||||
"tools/**",
|
||||
"install/**",
|
||||
"misc/**",
|
||||
"turnkey/**",
|
||||
"vm/**"
|
||||
],
|
||||
@ -32,71 +28,27 @@
|
||||
"fileStatus": "removed",
|
||||
"includeGlobs": [
|
||||
"ct/**",
|
||||
"tools/**",
|
||||
"install/**",
|
||||
"misc/**",
|
||||
"turnkey/**",
|
||||
"vm/**"
|
||||
],
|
||||
"excludeGlobs": []
|
||||
}
|
||||
],
|
||||
"maintenance": [
|
||||
"vm": [
|
||||
{
|
||||
"fileStatus": null,
|
||||
"includeGlobs": [
|
||||
"*.md"
|
||||
"vm/**"
|
||||
],
|
||||
"excludeGlobs": []
|
||||
}
|
||||
],
|
||||
"core": [
|
||||
"tools": [
|
||||
{
|
||||
"fileStatus": null,
|
||||
"includeGlobs": [
|
||||
"misc/*.func",
|
||||
"misc/create_lxc.sh"
|
||||
],
|
||||
"excludeGlobs": [
|
||||
"misc/api.func"
|
||||
]
|
||||
}
|
||||
],
|
||||
"website": [
|
||||
{
|
||||
"fileStatus": null,
|
||||
"includeGlobs": [
|
||||
"frontend/**"
|
||||
],
|
||||
"excludeGlobs": [
|
||||
"frontend/public/json/**"
|
||||
]
|
||||
}
|
||||
],
|
||||
"api": [
|
||||
{
|
||||
"fileStatus": null,
|
||||
"includeGlobs": [
|
||||
"api/**",
|
||||
"misc/api.func"
|
||||
],
|
||||
"excludeGlobs": []
|
||||
}
|
||||
],
|
||||
"github": [
|
||||
{
|
||||
"fileStatus": null,
|
||||
"includeGlobs": [
|
||||
".github/**"
|
||||
],
|
||||
"excludeGlobs": []
|
||||
}
|
||||
],
|
||||
"json": [
|
||||
{
|
||||
"fileStatus": "modified",
|
||||
"includeGlobs": [
|
||||
"frontend/public/json/**"
|
||||
"tools/**"
|
||||
],
|
||||
"excludeGlobs": []
|
||||
}
|
||||
@ -119,11 +71,65 @@
|
||||
"excludeGlobs": []
|
||||
}
|
||||
],
|
||||
"vm": [
|
||||
"core": [
|
||||
{
|
||||
"fileStatus": null,
|
||||
"includeGlobs": [
|
||||
"vm/**"
|
||||
"misc/*.func"
|
||||
],
|
||||
"excludeGlobs": [
|
||||
"misc/api.func"
|
||||
]
|
||||
}
|
||||
],
|
||||
"documentation": [
|
||||
{
|
||||
"fileStatus": null,
|
||||
"includeGlobs": [
|
||||
"docs/**"
|
||||
],
|
||||
"excludeGlobs": []
|
||||
}
|
||||
],
|
||||
"github": [
|
||||
{
|
||||
"fileStatus": null,
|
||||
"includeGlobs": [
|
||||
".github/**",
|
||||
"README.md",
|
||||
"SECURITY.md",
|
||||
"LICENSE",
|
||||
"CHANGELOG.md"
|
||||
],
|
||||
"excludeGlobs": []
|
||||
}
|
||||
],
|
||||
"api": [
|
||||
{
|
||||
"fileStatus": null,
|
||||
"includeGlobs": [
|
||||
"api/**",
|
||||
"misc/api.func"
|
||||
],
|
||||
"excludeGlobs": []
|
||||
}
|
||||
],
|
||||
"website": [
|
||||
{
|
||||
"fileStatus": null,
|
||||
"includeGlobs": [
|
||||
"frontend/**"
|
||||
],
|
||||
"excludeGlobs": [
|
||||
"frontend/public/json/**"
|
||||
]
|
||||
}
|
||||
],
|
||||
"json": [
|
||||
{
|
||||
"fileStatus": "modified",
|
||||
"includeGlobs": [
|
||||
"frontend/public/json/**"
|
||||
],
|
||||
"excludeGlobs": []
|
||||
}
|
||||
|
||||
88
.github/changelog-pr-config.json
generated
vendored
88
.github/changelog-pr-config.json
generated
vendored
@ -42,9 +42,15 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "🧰 Maintenance",
|
||||
"title": "🗑️ Deleted Scripts",
|
||||
"labels": [
|
||||
"maintenance"
|
||||
"delete script"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "💾 Core",
|
||||
"labels": [
|
||||
"core"
|
||||
],
|
||||
"subCategories": [
|
||||
{
|
||||
@ -69,30 +75,86 @@
|
||||
"notes": []
|
||||
},
|
||||
{
|
||||
"title": "📡 API",
|
||||
"title": "🔧 Refactor",
|
||||
"labels": [
|
||||
"api"
|
||||
"refactor"
|
||||
],
|
||||
"notes": []
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "🧰 Tools",
|
||||
"labels": [
|
||||
"tools"
|
||||
],
|
||||
"subCategories": [
|
||||
{
|
||||
"title": "🐞 Bug Fixes",
|
||||
"labels": [
|
||||
"bugfix"
|
||||
],
|
||||
"notes": []
|
||||
},
|
||||
{
|
||||
"title": "💾 Core",
|
||||
"title": "✨ New Features",
|
||||
"labels": [
|
||||
"core"
|
||||
"feature"
|
||||
],
|
||||
"notes": []
|
||||
},
|
||||
{
|
||||
"title": "📂 Github",
|
||||
"title": "💥 Breaking Changes",
|
||||
"labels": [
|
||||
"github"
|
||||
"breaking change"
|
||||
],
|
||||
"notes": []
|
||||
},
|
||||
{
|
||||
"title": "📝 Documentation",
|
||||
"title": "🔧 Refactor",
|
||||
"labels": [
|
||||
"maintenance"
|
||||
"refactor"
|
||||
],
|
||||
"notes": []
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "📚 Documentation",
|
||||
"labels": [
|
||||
"documentation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "📂 Github",
|
||||
"labels": [
|
||||
"github"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "📡 API",
|
||||
"labels": [
|
||||
"api"
|
||||
],
|
||||
"subCategories": [
|
||||
{
|
||||
"title": "🐞 Bug Fixes",
|
||||
"labels": [
|
||||
"bugfix"
|
||||
],
|
||||
"notes": []
|
||||
},
|
||||
{
|
||||
"title": "✨ New Features",
|
||||
"labels": [
|
||||
"feature"
|
||||
],
|
||||
"notes": []
|
||||
},
|
||||
{
|
||||
"title": "💥 Breaking Changes",
|
||||
"labels": [
|
||||
"breaking change"
|
||||
],
|
||||
"notes": []
|
||||
},
|
||||
@ -142,7 +204,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "❔ Unlabelled",
|
||||
"labels": []
|
||||
"title": "❔ Uncategorized",
|
||||
"labels": [
|
||||
"needs triage"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
33
.github/pull_request_template.md
generated
vendored
33
.github/pull_request_template.md
generated
vendored
@ -1,27 +1,26 @@
|
||||
<!--🛑 New scripts must be submitted to [ProxmoxVED](https://github.com/community-scripts/ProxmoxVED) for testing.
|
||||
<!--🛑 New scripts must be submitted to [ProxmoxVED](https://github.com/community-scripts/ProxmoxVED) for testing.
|
||||
PRs without prior testing will be closed. -->
|
||||
## ✍️ Description
|
||||
|
||||
## ✍️ Description
|
||||
|
||||
## 🔗 Related Issue
|
||||
|
||||
## 🔗 Related PR / Issue
|
||||
Link: #
|
||||
Fixes #
|
||||
|
||||
## ✅ Prerequisites (**X** in brackets)
|
||||
|
||||
## ✅ Prerequisites (**X** in brackets)
|
||||
|
||||
- [ ] **Self-review completed** – Code follows project standards.
|
||||
- [ ] **Tested thoroughly** – Changes work as expected.
|
||||
- [ ] **No security risks** – No hardcoded secrets, unnecessary privilege escalations, or permission issues.
|
||||
- [ ] **Self-review completed** – Code follows project standards.
|
||||
- [ ] **Tested thoroughly** – Changes work as expected.
|
||||
- [ ] **No security risks** – No hardcoded secrets, unnecessary privilege escalations, or permission issues.
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ Type of Change (**X** in brackets)
|
||||
## 🛠️ Type of Change (**X** in brackets)
|
||||
|
||||
- [ ] 🐞 **Bug fix** – Resolves an issue without breaking functionality.
|
||||
- [ ] ✨ **New feature** – Adds new, non-breaking functionality.
|
||||
- [ ] 💥 **Breaking change** – Alters existing functionality in a way that may require updates.
|
||||
- [ ] 🆕 **New script** – A fully functional and tested script or script set.
|
||||
- [ ] 🌍 **Website update** – Changes to website-related JSON files or metadata.
|
||||
- [ ] 🔧 **Refactoring / Code Cleanup** – Improves readability or maintainability without changing functionality.
|
||||
- [ ] 📝 **Documentation update** – Changes to `README`, `AppName.md`, `CONTRIBUTING.md`, or other docs.
|
||||
- [ ] 🐞 **Bug fix** – Resolves an issue without breaking functionality.
|
||||
- [ ] ✨ **New feature** – Adds new, non-breaking functionality.
|
||||
- [ ] 💥 **Breaking change** – Alters existing functionality in a way that may require updates.
|
||||
- [ ] 🆕 **New script** – A fully functional and tested script or script set.
|
||||
- [ ] 🌍 **Website update** – Changes to website-related JSON files or metadata.
|
||||
- [ ] 🔧 **Refactoring / Code Cleanup** – Improves readability or maintainability without changing functionality.
|
||||
- [ ] 📝 **Documentation update** – Changes to `README`, `AppName.md`, `CONTRIBUTING.md`, or other docs.
|
||||
|
||||
64
.github/workflows/autolabeler.yml
generated
vendored
64
.github/workflows/autolabeler.yml
generated
vendored
@ -57,10 +57,10 @@ jobs:
|
||||
|
||||
if (shouldAddLabel) {
|
||||
labelsToAdd.add(label);
|
||||
if (label === "update script") {
|
||||
// Add specific sub-labels for tools
|
||||
if (label === "tools") {
|
||||
for (const prFile of prFiles) {
|
||||
const filename = prFile.filename;
|
||||
if (filename.startsWith("vm/")) labelsToAdd.add("vm");
|
||||
if (filename.startsWith("tools/addon/")) labelsToAdd.add("addon");
|
||||
if (filename.startsWith("tools/pve/")) labelsToAdd.add("pve-tool");
|
||||
}
|
||||
@ -68,38 +68,42 @@ jobs:
|
||||
}
|
||||
}
|
||||
|
||||
if (labelsToAdd.size < 2) {
|
||||
const templateLabelMappings = {
|
||||
"🐞 **Bug fix**": "bugfix",
|
||||
"✨ **New feature**": "feature",
|
||||
"💥 **Breaking change**": "breaking change",
|
||||
"🆕 **New script**": "new script",
|
||||
"🌍 **Website update**": "website", // handled special
|
||||
"🔧 **Refactoring / Code Cleanup**": "refactor",
|
||||
"📝 **Documentation update**": "documentation" // mapped to maintenance
|
||||
};
|
||||
// Always parse template checkboxes to add content-type labels (bugfix, feature, etc.)
|
||||
const templateLabelMappings = {
|
||||
"🐞 **Bug fix**": "bugfix",
|
||||
"✨ **New feature**": "feature",
|
||||
"💥 **Breaking change**": "breaking change",
|
||||
"🆕 **New script**": "new script",
|
||||
"🔧 **Refactoring / Code Cleanup**": "refactor",
|
||||
"📝 **Documentation update**": "documentation"
|
||||
};
|
||||
|
||||
for (const [checkbox, label] of Object.entries(templateLabelMappings)) {
|
||||
const escapedCheckbox = checkbox.replace(/([.*+?^=!:${}()|[\]\/\\])/g, "\\$1");
|
||||
const regex = new RegExp(`- \\[(x|X)\\]\\s*${escapedCheckbox}`, "i");
|
||||
for (const [checkbox, label] of Object.entries(templateLabelMappings)) {
|
||||
const escapedCheckbox = checkbox.replace(/([.*+?^=!:${}()|[\]\/\\])/g, "\\$1");
|
||||
const regex = new RegExp(`- \\[(x|X)\\]\\s*${escapedCheckbox}`, "i");
|
||||
|
||||
if (regex.test(prBody)) {
|
||||
if (label === "website") {
|
||||
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 (regex.test(prBody)) {
|
||||
labelsToAdd.add(label);
|
||||
}
|
||||
}
|
||||
|
||||
// Handle website checkbox specially - only add if not already an update script with content label
|
||||
const websiteCheckbox = "🌍 **Website update**";
|
||||
const escapedWebsite = websiteCheckbox.replace(/([.*+?^=!:${}()|[\]\/\\])/g, "\\$1");
|
||||
const websiteRegex = new RegExp(`- \\[(x|X)\\]\\s*${escapedWebsite}`, "i");
|
||||
|
||||
if (websiteRegex.test(prBody)) {
|
||||
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 it's an update script PR with json changes and a content label, skip adding website/json
|
||||
// The PR should be categorized as update script with the content label
|
||||
if (!(hasUpdateScript && hasJson && hasContentLabel)) {
|
||||
labelsToAdd.add(hasJson ? "json" : "website");
|
||||
}
|
||||
}
|
||||
|
||||
if (labelsToAdd.size === 0) {
|
||||
labelsToAdd.add("needs triage");
|
||||
}
|
||||
|
||||
33
.github/workflows/changelog-pr.yml
generated
vendored
33
.github/workflows/changelog-pr.yml
generated
vendored
@ -157,13 +157,31 @@ jobs:
|
||||
|
||||
let categorized = false;
|
||||
const priorityCategories = categorizedPRs.slice();
|
||||
|
||||
// Priority order for content-type labels (highest priority first)
|
||||
const subCategoryPriority = ["breaking change", "bugfix", "feature", "refactor"];
|
||||
|
||||
for (const category of priorityCategories) {
|
||||
if (categorized) break;
|
||||
if (category.labels.some(label => prLabels.includes(label))) {
|
||||
if (category.subCategories && category.subCategories.length > 0) {
|
||||
const subCategory = category.subCategories.find(sub =>
|
||||
sub.labels.some(label => prLabels.includes(label))
|
||||
);
|
||||
// Find subcategory by priority order instead of first match
|
||||
let subCategory = null;
|
||||
for (const priorityLabel of subCategoryPriority) {
|
||||
if (prLabels.includes(priorityLabel)) {
|
||||
subCategory = category.subCategories.find(sub =>
|
||||
sub.labels.includes(priorityLabel)
|
||||
);
|
||||
if (subCategory) break;
|
||||
}
|
||||
}
|
||||
|
||||
// Fallback: check for any other subcategory match (api, github, json, etc.)
|
||||
if (!subCategory) {
|
||||
subCategory = category.subCategories.find(sub =>
|
||||
sub.labels.some(label => prLabels.includes(label))
|
||||
);
|
||||
}
|
||||
|
||||
if (subCategory) {
|
||||
subCategory.notes.push(prNote);
|
||||
@ -176,6 +194,15 @@ jobs:
|
||||
categorized = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Fallback: Add to Uncategorized if no category matched
|
||||
if (!categorized) {
|
||||
const uncategorized = categorizedPRs.find(category =>
|
||||
category.title.includes("Uncategorized") || category.labels.includes("needs triage"));
|
||||
if (uncategorized) {
|
||||
uncategorized.notes.push(prNote);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
4
.github/workflows/validate-filenames.yml
generated
vendored
4
.github/workflows/validate-filenames.yml
generated
vendored
@ -51,10 +51,6 @@ jobs:
|
||||
|
||||
NON_COMPLIANT_FILES=""
|
||||
for FILE in $CHANGED_FILES; do
|
||||
# Skip File "misc/create_lxc.sh"
|
||||
if [[ "$FILE" == "misc/create_lxc.sh" ]]; then
|
||||
continue
|
||||
fi
|
||||
BASENAME=$(echo "$(basename "${FILE%.*}")")
|
||||
if [[ ! "$BASENAME" =~ ^[a-z0-9-]+$ ]]; then
|
||||
NON_COMPLIANT_FILES="$NON_COMPLIANT_FILES $FILE"
|
||||
|
||||
98
CHANGELOG.md
98
CHANGELOG.md
@ -10,13 +10,105 @@
|
||||
> [!CAUTION]
|
||||
Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes.
|
||||
|
||||
## 2025-12-05
|
||||
## 2025-12-08
|
||||
|
||||
## 2025-12-04
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- typo: tandoor instead of trandoor [@Neonize](https://github.com/Neonize) ([#9771](https://github.com/community-scripts/ProxmoxVE/pull/9771))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- feat: Add var_gpu flag for GPU passthrough configuration [@MickLesk](https://github.com/MickLesk) ([#9764](https://github.com/community-scripts/ProxmoxVE/pull/9764))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- fix: always show SSH access dialog in advanced settings [@MickLesk](https://github.com/MickLesk) ([#9765](https://github.com/community-scripts/ProxmoxVE/pull/9765))
|
||||
|
||||
## 2025-12-07
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- wanderer: add meilisearch dumpless upgrade for database migration [@MickLesk](https://github.com/MickLesk) ([#9749](https://github.com/community-scripts/ProxmoxVE/pull/9749))
|
||||
|
||||
- #### 💥 Breaking Changes
|
||||
|
||||
- Refactor: Inventree (uses now ubuntu 24.04) [@MickLesk](https://github.com/MickLesk) ([#9752](https://github.com/community-scripts/ProxmoxVE/pull/9752))
|
||||
- Revert Zammad: use Debian 12 and dynamic APT source version [@MickLesk](https://github.com/MickLesk) ([#9750](https://github.com/community-scripts/ProxmoxVE/pull/9750))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- tools.func: handle empty grep results in stop_all_services [@MickLesk](https://github.com/MickLesk) ([#9748](https://github.com/community-scripts/ProxmoxVE/pull/9748))
|
||||
- Remove Debian from GPU passthrough [@MickLesk](https://github.com/MickLesk) ([#9754](https://github.com/community-scripts/ProxmoxVE/pull/9754))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- core: motd - dynamically read OS version on each login [@MickLesk](https://github.com/MickLesk) ([#9751](https://github.com/community-scripts/ProxmoxVE/pull/9751))
|
||||
|
||||
### 🌐 Website
|
||||
|
||||
- FAQ update [@tremor021](https://github.com/tremor021) ([#9742](https://github.com/community-scripts/ProxmoxVE/pull/9742))
|
||||
|
||||
## 2025-12-06
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- Update domain-locker-install.sh to enable auto-start after reboot [@alexindigo](https://github.com/alexindigo) ([#9715](https://github.com/community-scripts/ProxmoxVE/pull/9715))
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- InfluxDB: Remove InfluxData source list post-installation [@tremor021](https://github.com/tremor021) ([#9723](https://github.com/community-scripts/ProxmoxVE/pull/9723))
|
||||
- InfluxDB: Update InfluxDB repository key URL [@tremor021](https://github.com/tremor021) ([#9720](https://github.com/community-scripts/ProxmoxVE/pull/9720))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- pin Portainer Update to CE Version only [@sgaert](https://github.com/sgaert) ([#9710](https://github.com/community-scripts/ProxmoxVE/pull/9710))
|
||||
|
||||
## 2025-12-05
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- Three-tier defaults system | security improvements | error_handler | improved logging | improved container creation | improved architecture [@MickLesk](https://github.com/MickLesk) ([#9540](https://github.com/community-scripts/ProxmoxVE/pull/9540))
|
||||
- Endurain ([#9681](https://github.com/community-scripts/ProxmoxVE/pull/9681))
|
||||
- MeTube ([#9671](https://github.com/community-scripts/ProxmoxVE/pull/9671))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- libretranslate: pin uv python to 3.12 (pytorch fix) [@MickLesk](https://github.com/MickLesk) ([#9699](https://github.com/community-scripts/ProxmoxVE/pull/9699))
|
||||
- alpine: (mariadb/postgresql): correct php-cgi path for php83 (adminer) [@MickLesk](https://github.com/MickLesk) ([#9698](https://github.com/community-scripts/ProxmoxVE/pull/9698))
|
||||
- fix(librespeed-rs): use correct service name [@jniles](https://github.com/jniles) ([#9683](https://github.com/community-scripts/ProxmoxVE/pull/9683))
|
||||
- NetVisor: fix daemon auto-config [@vhsdream](https://github.com/vhsdream) ([#9682](https://github.com/community-scripts/ProxmoxVE/pull/9682))
|
||||
- Improve NVIDIA device detection for container passthrough [@MickLesk](https://github.com/MickLesk) ([#9670](https://github.com/community-scripts/ProxmoxVE/pull/9670))
|
||||
- Fix AdventureLog installation failure: missing postgis extension permissions [@Copilot](https://github.com/Copilot) ([#9674](https://github.com/community-scripts/ProxmoxVE/pull/9674))
|
||||
- paperless: ASGI interface typo [@MickLesk](https://github.com/MickLesk) ([#9668](https://github.com/community-scripts/ProxmoxVE/pull/9668))
|
||||
- var. core fixes (bash to sh in fix_gpu_gids ...) [@MickLesk](https://github.com/MickLesk) ([#9666](https://github.com/community-scripts/ProxmoxVE/pull/9666))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- tools.func: handle GitHub 300 Multiple Choices in tarball mode [@MickLesk](https://github.com/MickLesk) ([#9697](https://github.com/community-scripts/ProxmoxVE/pull/9697))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- Refactor: OneDev [@MickLesk](https://github.com/MickLesk) ([#9597](https://github.com/community-scripts/ProxmoxVE/pull/9597))
|
||||
|
||||
### 📂 Github
|
||||
|
||||
- chore(github): improve PR template and cleanup obsolete references | move contribution guide [@MickLesk](https://github.com/MickLesk) ([#9700](https://github.com/community-scripts/ProxmoxVE/pull/9700))
|
||||
|
||||
## 2025-12-04
|
||||
|
||||
### 🛠️ Core Overhaul
|
||||
|
||||
- Major refactor of the entire `/misc` subsystem introducing a secure, modular and fully extensible foundation for all future scripts.
|
||||
Includes the new three-tier defaults architecture (ENV → App → User), strict variable whitelisting, safe `.vars` parsing without `source/eval`, centralized `error_handler.func`, structured logging, an improved 19-step advanced wizard, unified container creation, dedicated storage selector, updated sysctl handling, IPv6 disable mode, cloud-init library, SSH key auto-discovery, and a complete cleanup of legacy components.
|
||||
Documentation added under `/docs/guides`.
|
||||
[@MickLesk](https://github.com/MickLesk) ([#9540](https://github.com/community-scripts/ProxmoxVE/pull/9540))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
|
||||
10
README.md
10
README.md
@ -17,10 +17,10 @@
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<a href="https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/CONTRIBUTING.md">
|
||||
<a href="https://github.com/community-scripts/ProxmoxVE/blob/main/docs/contribution/README.md">
|
||||
<img src="https://img.shields.io/badge/🤝_Contribute-Guidelines-ff4785?style=for-the-badge&labelColor=2d3748" alt="Contribute" />
|
||||
</a>
|
||||
<a href="https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/USER_SUBMITTED_GUIDES.md">
|
||||
<a href="https://github.com/community-scripts/ProxmoxVE/blob/main/docs/contribution/USER_SUBMITTED_GUIDES.md">
|
||||
<img src="https://img.shields.io/badge/📚_Guides-Read-0077b5?style=for-the-badge&labelColor=2d3748" alt="Guides" />
|
||||
</a>
|
||||
<a href="https://github.com/community-scripts/ProxmoxVE/blob/main/CHANGELOG.md">
|
||||
@ -30,8 +30,8 @@
|
||||
|
||||
<br />
|
||||
|
||||
> **Simplify your Proxmox VE setup with community-driven automation scripts**
|
||||
> Originally created by tteck, now maintained and expanded by the community
|
||||
> **Simplify your Proxmox VE setup with community-driven automation scripts**
|
||||
> Originally created by tteck, now maintained and expanded by the community
|
||||
|
||||
</div>
|
||||
|
||||
@ -214,7 +214,7 @@ This adds a menu to your Proxmox interface for easy script access without visiti
|
||||
<div align="center">
|
||||
<br />
|
||||
|
||||
👉 Check our **[Contributing Guidelines](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/CONTRIBUTING.md)** to get started
|
||||
👉 Check our **[Contributing Guidelines](https://github.com/community-scripts/ProxmoxVE/blob/main/docs/contribution/README.md)** to get started
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
@ -45,6 +45,10 @@ function update_script() {
|
||||
fetch_and_deploy_gh_release "adventurelog" "seanmorley15/adventurelog"
|
||||
PYTHON_VERSION="3.13" setup_uv
|
||||
|
||||
msg_info "Ensuring PostgreSQL Extensions"
|
||||
$STD sudo -u postgres psql -d adventurelog_db -c "CREATE EXTENSION IF NOT EXISTS postgis;"
|
||||
msg_ok "PostgreSQL Extensions Ready"
|
||||
|
||||
msg_info "Updating ${APP}"
|
||||
cp /opt/adventurelog-backup/backend/server/.env /opt/adventurelog/backend/server/.env
|
||||
cp -r /opt/adventurelog-backup/backend/server/media /opt/adventurelog/backend/server/media
|
||||
|
||||
@ -51,7 +51,7 @@ function update_script() {
|
||||
msg_info "Configuring BookStack"
|
||||
cd /opt/bookstack
|
||||
export COMPOSER_ALLOW_SUPERUSER=1
|
||||
$STD composer install --no-dev
|
||||
$STD /usr/local/bin/composer install --no-dev
|
||||
$STD php artisan migrate --force
|
||||
chown www-data:www-data -R /opt/bookstack /opt/bookstack/bootstrap/cache /opt/bookstack/public/uploads /opt/bookstack/storage
|
||||
chmod -R 755 /opt/bookstack /opt/bookstack/bootstrap/cache /opt/bookstack/public/uploads /opt/bookstack/storage
|
||||
|
||||
@ -13,6 +13,7 @@ var_disk="${var_disk:-8}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-12}"
|
||||
var_unprivileged="${var_unprivileged:-0}"
|
||||
var_gpu="${var_gpu:-yes}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
@ -38,4 +39,4 @@ description
|
||||
msg_ok "Completed Successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8089${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8089${CL}"
|
||||
|
||||
@ -24,11 +24,11 @@ function update_script() {
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
if [[ ! -f /opt/${APP} ]]; then
|
||||
if [[ ! -d /opt/ComfyUI ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_error "To update use the ${APP} Manager."
|
||||
msg_error "To update use the ComfyUI Manager."
|
||||
exit
|
||||
}
|
||||
|
||||
|
||||
@ -87,6 +87,11 @@ function update_script() {
|
||||
mv /tmp/start-daphne.sh.backup /opt/dispatcharr/start-daphne.sh
|
||||
fi
|
||||
|
||||
if ! grep -q "DJANGO_SECRET_KEY" /opt/dispatcharr/.env; then
|
||||
DJANGO_SECRET=$(openssl rand -base64 48 | tr -dc 'a-zA-Z0-9' | cut -c1-50)
|
||||
echo "DJANGO_SECRET_KEY=$DJANGO_SECRET" >> /opt/dispatcharr/.env
|
||||
fi
|
||||
|
||||
cd /opt/dispatcharr
|
||||
rm -rf .venv
|
||||
$STD uv venv
|
||||
|
||||
@ -47,7 +47,7 @@ function update_script() {
|
||||
msg_ok "Docker Compose updated"
|
||||
fi
|
||||
|
||||
if docker ps -a --format '{{.Names}}' | grep -q '^portainer$'; then
|
||||
if docker ps -a --format '{{.Image}}' | grep -q '^portainer/portainer-ce:latest$'; then
|
||||
msg_info "Updating Portainer"
|
||||
$STD docker pull portainer/portainer-ce:latest
|
||||
$STD docker stop portainer && docker rm portainer
|
||||
|
||||
@ -13,6 +13,7 @@ var_disk="${var_disk:-8}"
|
||||
var_os="${var_os:-ubuntu}"
|
||||
var_version="${var_version:-24.04}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
var_gpu="${var_gpu:-yes}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
|
||||
83
ct/endurain.sh
Normal file
83
ct/endurain.sh
Normal file
@ -0,0 +1,83 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: johanngrobe
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/joaovitoriasilva/endurain
|
||||
|
||||
APP="Endurain"
|
||||
var_tags="${var_tags:-sport;social-media}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-5}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
if [[ ! -d /opt/endurain ]]; then
|
||||
msg_error "No ${APP} installation found!"
|
||||
exit 1
|
||||
fi
|
||||
if check_for_gh_release "endurain" "joaovitoriasilva/endurain"; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop endurain
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
msg_info "Creating Backup"
|
||||
cp /opt/endurain/.env /opt/endurain.env
|
||||
cp /opt/endurain/frontend/app/dist/env.js /opt/endurain.env.js
|
||||
msg_ok "Created Backup"
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "endurain" "joaovitoriasilva/endurain" "tarball" "latest" "/opt/endurain"
|
||||
|
||||
msg_info "Preparing Update"
|
||||
cd /opt/endurain
|
||||
rm -rf \
|
||||
/opt/endurain/{docs,example.env,screenshot_01.png} \
|
||||
/opt/endurain/docker* \
|
||||
/opt/endurain/*.yml
|
||||
cp /opt/endurain.env /opt/endurain/.env
|
||||
rm /opt/endurain.env
|
||||
msg_ok "Prepared Update"
|
||||
|
||||
msg_info "Updating Frontend"
|
||||
cd /opt/endurain/frontend/app
|
||||
$STD npm ci
|
||||
$STD npm run build
|
||||
cp /opt/endurain.env.js /opt/endurain/frontend/app/dist/env.js
|
||||
rm /opt/endurain.env.js
|
||||
msg_ok "Updated Frontend"
|
||||
|
||||
msg_info "Updating Backend"
|
||||
cd /opt/endurain/backend
|
||||
$STD poetry export -f requirements.txt --output requirements.txt --without-hashes
|
||||
$STD uv venv
|
||||
$STD uv pip install -r requirements.txt
|
||||
msg_ok "Backend Updated"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start endurain
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Update Completed Successfully!"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed Successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"
|
||||
@ -13,6 +13,7 @@ var_disk="${var_disk:-5}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-12}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
var_gpu="${var_gpu:-yes}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
|
||||
@ -13,6 +13,7 @@ var_disk="${var_disk:-8}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-12}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
var_gpu="${var_gpu:-yes}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
|
||||
@ -13,6 +13,7 @@ var_disk="${var_disk:-20}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-11}"
|
||||
var_unprivileged="${var_unprivileged:-0}"
|
||||
var_gpu="${var_gpu:-yes}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
@ -38,4 +39,4 @@ description
|
||||
msg_ok "Completed Successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5000${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5000${CL}"
|
||||
|
||||
6
ct/headers/endurain
Normal file
6
ct/headers/endurain
Normal file
@ -0,0 +1,6 @@
|
||||
______ __ _
|
||||
/ ____/___ ____/ /_ ___________ _(_)___
|
||||
/ __/ / __ \/ __ / / / / ___/ __ `/ / __ \
|
||||
/ /___/ / / / /_/ / /_/ / / / /_/ / / / / /
|
||||
/_____/_/ /_/\__,_/\__,_/_/ \__,_/_/_/ /_/
|
||||
|
||||
6
ct/headers/metube
Normal file
6
ct/headers/metube
Normal file
@ -0,0 +1,6 @@
|
||||
__ ___ ______ __
|
||||
/ |/ /__/_ __/_ __/ /_ ___
|
||||
/ /|_/ / _ \/ / / / / / __ \/ _ \
|
||||
/ / / / __/ / / /_/ / /_/ / __/
|
||||
/_/ /_/\___/_/ \__,_/_.___/\___/
|
||||
|
||||
@ -13,6 +13,7 @@ var_ram="${var_ram:-4096}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
var_gpu="${var_gpu:-yes}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
|
||||
@ -10,8 +10,8 @@ var_tags="${var_tags:-inventory}"
|
||||
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_os="${var_os:-ubuntu}"
|
||||
var_version="${var_version:-24.04}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
@ -28,10 +28,16 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_info "Updating $APP"
|
||||
|
||||
if ! grep -qE "^ID=(ubuntu)$" /etc/os-release; then
|
||||
msg_error "Unsupported OS. InvenTree requires Ubuntu (20.04/22.04/24.04)."
|
||||
exit
|
||||
fi
|
||||
|
||||
msg_info "Updating InvenTree"
|
||||
$STD apt update
|
||||
$STD apt install --only-upgrade inventree -y
|
||||
msg_ok "Updated $APP"
|
||||
msg_ok "Updated InvenTree"
|
||||
msg_ok "Updated successfully!"
|
||||
exit
|
||||
}
|
||||
|
||||
@ -13,6 +13,7 @@ var_disk="${var_disk:-16}"
|
||||
var_os="${var_os:-ubuntu}"
|
||||
var_version="${var_version:-24.04}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
var_gpu="${var_gpu:-yes}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
|
||||
@ -30,13 +30,13 @@ function update_script() {
|
||||
|
||||
if check_for_gh_release "librespeed-rust" "librespeed/speedtest-rust"; then
|
||||
msg_info "Stopping Services"
|
||||
systemctl stop librespeed-rs
|
||||
systemctl stop speedtest_rs
|
||||
msg_ok "Services Stopped"
|
||||
|
||||
fetch_and_deploy_gh_release "librespeed-rust" "librespeed/speedtest-rust" "binary" "latest" "/opt/librespeed-rust" "librespeed-rs-x86_64-unknown-linux-gnu.deb"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start librespeed-rs
|
||||
systemctl start speedtest_rs
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Updated successfully!"
|
||||
fi
|
||||
|
||||
@ -29,7 +29,7 @@ function update_script() {
|
||||
exit
|
||||
fi
|
||||
|
||||
setup_uv
|
||||
PYTHON_VERSION="3.12" setup_uv
|
||||
|
||||
if check_for_gh_release "libretranslate" "LibreTranslate/LibreTranslate"; then
|
||||
msg_info "Stopping Service"
|
||||
@ -39,7 +39,7 @@ function update_script() {
|
||||
msg_info "Updating LibreTranslate"
|
||||
cd /opt/libretranslate
|
||||
source .venv/bin/activate
|
||||
$STD pip install -U libretranslate
|
||||
$STD uv pip install -U libretranslate
|
||||
msg_ok "Updated LibreTranslate"
|
||||
|
||||
msg_info "Starting Service"
|
||||
|
||||
113
ct/metube.sh
Normal file
113
ct/metube.sh
Normal file
@ -0,0 +1,113 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: MickLesk (Canbiz)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/alexta69/metube
|
||||
|
||||
APP="MeTube"
|
||||
var_tags="${var_tags:-media;youtube}"
|
||||
var_cpu="${var_cpu:-1}"
|
||||
var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-10}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
if [[ ! -d /opt/metube ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if [[ $(echo ":$PATH:" != *":/usr/local/bin:"*) ]]; then
|
||||
echo -e "\nexport PATH=\"/usr/local/bin:\$PATH\"" >>~/.bashrc
|
||||
source ~/.bashrc
|
||||
if ! command -v deno &>/dev/null; then
|
||||
export DENO_INSTALL="/usr/local"
|
||||
curl -fsSL https://deno.land/install.sh | $STD sh -s -- -y
|
||||
else
|
||||
$STD deno upgrade
|
||||
fi
|
||||
fi
|
||||
|
||||
if check_for_gh_release "metube" "alexta69/metube"; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop metube
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
msg_info "Backing up Old Installation"
|
||||
if [[ -d /opt/metube_bak ]]; then
|
||||
rm -rf /opt/metube_bak
|
||||
fi
|
||||
mv /opt/metube /opt/metube_bak
|
||||
msg_ok "Backup created"
|
||||
|
||||
fetch_and_deploy_gh_release "metube" "alexta69/metube" "tarball" "latest"
|
||||
|
||||
msg_info "Building Frontend"
|
||||
cd /opt/metube/ui
|
||||
$STD npm install
|
||||
$STD node_modules/.bin/ng build
|
||||
msg_ok "Built Frontend"
|
||||
|
||||
PYTHON_VERSION="3.13" setup_uv
|
||||
|
||||
msg_info "Installing Backend Requirements"
|
||||
cd /opt/metube
|
||||
$STD uv sync
|
||||
msg_ok "Installed Backend"
|
||||
|
||||
msg_info "Restoring .env"
|
||||
if [[ -f /opt/metube_bak/.env ]]; then
|
||||
cp /opt/metube_bak/.env /opt/metube/.env
|
||||
fi
|
||||
rm -rf /opt/metube_bak
|
||||
msg_ok "Restored .env"
|
||||
|
||||
if grep -q 'pipenv' /etc/systemd/system/metube.service; then
|
||||
msg_info "Patching systemd Service"
|
||||
cat <<EOF >/etc/systemd/system/metube.service
|
||||
[Unit]
|
||||
Description=Metube - YouTube Downloader
|
||||
After=network.target
|
||||
[Service]
|
||||
Type=simple
|
||||
WorkingDirectory=/opt/metube
|
||||
EnvironmentFile=/opt/metube/.env
|
||||
ExecStart=/opt/metube/.venv/bin/python3 app/main.py
|
||||
Restart=always
|
||||
User=root
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
msg_ok "Patched systemd Service"
|
||||
fi
|
||||
$STD systemctl daemon-reload
|
||||
msg_ok "Service Updated"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start metube
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Updated successfully!"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed Successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8081${CL}"
|
||||
@ -3,7 +3,7 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: vhsdream
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/maynayza/netvisor
|
||||
# Source: https://github.com/mayanayza/netvisor
|
||||
|
||||
APP="NetVisor"
|
||||
var_tags="${var_tags:-analytics}"
|
||||
@ -99,3 +99,4 @@ msg_ok "Completed Successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:60072${CL}"
|
||||
echo -e "${INFO}${YW} Then create your account, and run the 'configure_daemon.sh' script to setup the daemon.${CL}"
|
||||
|
||||
@ -12,6 +12,7 @@ var_ram="${var_ram:-4096}"
|
||||
var_disk="${var_disk:-35}"
|
||||
var_os="${var_os:-ubuntu}"
|
||||
var_version="${var_version:-24.04}"
|
||||
var_gpu="${var_gpu:-yes}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
|
||||
19
ct/onedev.sh
19
ct/onedev.sh
@ -27,31 +27,30 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
GITHUB_RELEASE=$(curl -fsSL https://api.github.com/repos/theonedev/onedev/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${GITHUB_RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
|
||||
|
||||
if check_for_gh_release "onedev" "theonedev/onedev"; then
|
||||
JAVA_VERSION="21" setup_java
|
||||
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop onedev
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
msg_info "Updating ${APP} to v${GITHUB_RELEASE}"
|
||||
msg_info "Updating OneDev"
|
||||
cd /opt
|
||||
curl -fsSL "https://code.onedev.io/onedev/server/~site/onedev-latest.tar.gz" -o $(basename "https://code.onedev.io/onedev/server/~site/onedev-latest.tar.gz")
|
||||
curl -fsSL "https://code.onedev.io/onedev/server/~site/onedev-latest.tar.gz" -o onedev-latest.tar.gz
|
||||
tar -xzf onedev-latest.tar.gz
|
||||
$STD /opt/onedev-latest/bin/upgrade.sh /opt/onedev
|
||||
RELEASE=$(cat /opt/onedev/release.properties | grep "version" | cut -d'=' -f2)
|
||||
rm -rf /opt/onedev-latest
|
||||
rm -rf /opt/onedev-latest.tar.gz
|
||||
echo "${RELEASE}" >"/opt/${APP}_version.txt"
|
||||
msg_ok "Updated ${APP} to v${RELEASE}"
|
||||
echo "${CHECK_UPDATE_RELEASE}" >~/.onedev
|
||||
msg_ok "Updated OneDev"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start onedev
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Updated successfully!"
|
||||
else
|
||||
msg_ok "No update required. ${APP} is already at v${RELEASE}."
|
||||
exit
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
|
||||
@ -13,6 +13,7 @@ var_disk="${var_disk:-25}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
var_gpu="${var_gpu:-yes}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
|
||||
@ -28,12 +28,12 @@ function update_script() {
|
||||
exit
|
||||
fi
|
||||
|
||||
# Check for old data structure and prompt migration
|
||||
# Check for old data structure and prompt migration (exclude symlinks)
|
||||
if [[ -f /opt/paperless/paperless.conf ]]; then
|
||||
local OLD_DIRS=()
|
||||
[[ -d /opt/paperless/consume ]] && OLD_DIRS+=("consume")
|
||||
[[ -d /opt/paperless/data ]] && OLD_DIRS+=("data")
|
||||
[[ -d /opt/paperless/media ]] && OLD_DIRS+=("media")
|
||||
[[ -d /opt/paperless/consume && ! -L /opt/paperless/consume ]] && OLD_DIRS+=("consume")
|
||||
[[ -d /opt/paperless/data && ! -L /opt/paperless/data ]] && OLD_DIRS+=("data")
|
||||
[[ -d /opt/paperless/media && ! -L /opt/paperless/media ]] && OLD_DIRS+=("media")
|
||||
|
||||
if [[ ${#OLD_DIRS[@]} -gt 0 ]]; then
|
||||
msg_error "Old data structure detected in /opt/paperless/"
|
||||
|
||||
@ -13,6 +13,7 @@ var_disk="${var_disk:-8}"
|
||||
var_os="${var_os:-ubuntu}"
|
||||
var_version="${var_version:-24.04}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
var_gpu="${var_gpu:-yes}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
@ -23,8 +24,8 @@ function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
if [[ ! -f /etc/apt/sources.list.d/plexmediaserver.list ]] \
|
||||
&& [[ ! -f /etc/apt/sources.list.d/plexmediaserver.sources ]]; then
|
||||
if [[ ! -f /etc/apt/sources.list.d/plexmediaserver.list ]] &&
|
||||
[[ ! -f /etc/apt/sources.list.d/plexmediaserver.sources ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
@ -65,7 +65,7 @@ EOF
|
||||
$STD /opt/tandoor/.venv/bin/python manage.py migrate
|
||||
$STD /opt/tandoor/.venv/bin/python manage.py collectstatic --no-input
|
||||
rm -rf /opt/tandoor.bak
|
||||
msg_ok "Updated Trandoor"
|
||||
msg_ok "Updated Tandoor"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start tandoor
|
||||
|
||||
@ -13,6 +13,7 @@ var_disk="${var_disk:-4}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
var_gpu="${var_gpu:-yes}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
|
||||
@ -13,6 +13,7 @@ var_disk="${var_disk:-5}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
var_gpu="${var_gpu:-yes}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
|
||||
@ -13,6 +13,7 @@ var_disk="${var_disk:-4}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_unprivileged="${var_unprivileged:-0}"
|
||||
var_gpu="${var_gpu:-yes}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
|
||||
@ -55,7 +55,8 @@ function update_script() {
|
||||
systemctl stop wanderer-web
|
||||
msg_ok "Stopped service"
|
||||
|
||||
fetch_and_deploy_gh_release "meilisearch" "meilisearch/meilisearch" "binary" "latest" "/opt/wanderer/source/search"
|
||||
fetch_and_deploy_gh_release "meilisearch" "meilisearch/meilisearch" "binary" "latest" "/opt/wanderer/source/search"
|
||||
grep -q -- '--experimental-dumpless-upgrade' /opt/wanderer/start.sh || sed -i 's|meilisearch --master-key|meilisearch --experimental-dumpless-upgrade --master-key|' /opt/wanderer/start.sh
|
||||
|
||||
msg_info "Starting service"
|
||||
systemctl start wanderer-web
|
||||
|
||||
@ -11,7 +11,7 @@ var_disk="${var_disk:-8}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-4096}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_version="${var_version:-12}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
# Technical Reference: Configuration System Architecture
|
||||
|
||||
> **For Developers and Advanced Users**
|
||||
>
|
||||
> *Deep dive into how the defaults and configuration system works*
|
||||
>
|
||||
> _Deep dive into how the defaults and configuration system works_
|
||||
|
||||
---
|
||||
|
||||
@ -123,13 +123,13 @@ VAR_VALUE := [^\n]* # Any printable characters except newline
|
||||
|
||||
**Constraints**:
|
||||
|
||||
| Constraint | Value |
|
||||
|-----------|-------|
|
||||
| Max file size | 64 KB |
|
||||
| Max line length | 1024 bytes |
|
||||
| Max variables | 100 |
|
||||
| Allowed var names | `var_[a-z_]+` |
|
||||
| Value validation | Whitelist + Sanitization |
|
||||
| Constraint | Value |
|
||||
| ----------------- | ------------------------ |
|
||||
| Max file size | 64 KB |
|
||||
| Max line length | 1024 bytes |
|
||||
| Max variables | 100 |
|
||||
| Allowed var names | `var_[a-z_]+` |
|
||||
| Value validation | Whitelist + Sanitization |
|
||||
|
||||
**Example Valid File**:
|
||||
|
||||
@ -206,21 +206,24 @@ var_tags=dns,pihole
|
||||
**Purpose**: Safely load variables from .vars files without using `source` or `eval`
|
||||
|
||||
**Signature**:
|
||||
|
||||
```bash
|
||||
load_vars_file(filepath)
|
||||
```
|
||||
|
||||
**Parameters**:
|
||||
|
||||
| Param | Type | Required | Example |
|
||||
|-------|------|----------|---------|
|
||||
| filepath | String | Yes | `/usr/local/community-scripts/default.vars` |
|
||||
| Param | Type | Required | Example |
|
||||
| -------- | ------ | -------- | ------------------------------------------- |
|
||||
| filepath | String | Yes | `/usr/local/community-scripts/default.vars` |
|
||||
|
||||
**Returns**:
|
||||
|
||||
- `0` on success
|
||||
- `1` on error (file missing, parse error, etc.)
|
||||
|
||||
**Environment Side Effects**:
|
||||
|
||||
- Sets all parsed `var_*` variables as shell variables
|
||||
- Does NOT unset variables if file missing (safe)
|
||||
- Does NOT affect other variables
|
||||
@ -230,25 +233,25 @@ load_vars_file(filepath)
|
||||
```bash
|
||||
load_vars_file() {
|
||||
local file="$1"
|
||||
|
||||
|
||||
# File must exist
|
||||
[ -f "$file" ] || return 0
|
||||
|
||||
|
||||
# Parse line by line (not with source/eval)
|
||||
local line key val
|
||||
while IFS='=' read -r key val || [ -n "$key" ]; do
|
||||
# Skip comments and empty lines
|
||||
[[ "$key" =~ ^[[:space:]]*# ]] && continue
|
||||
[[ -z "$key" ]] && continue
|
||||
|
||||
|
||||
# Validate key is in whitelist
|
||||
_is_whitelisted_key "$key" || continue
|
||||
|
||||
|
||||
# Sanitize and export value
|
||||
val="$(_sanitize_value "$val")"
|
||||
[ $? -eq 0 ] && export "$key=$val"
|
||||
done < "$file"
|
||||
|
||||
|
||||
return 0
|
||||
}
|
||||
```
|
||||
@ -281,6 +284,7 @@ echo "Allocating ${var_ram} MB RAM"
|
||||
**Purpose**: Get the full path for app-specific defaults file
|
||||
|
||||
**Signature**:
|
||||
|
||||
```bash
|
||||
get_app_defaults_path()
|
||||
```
|
||||
@ -288,6 +292,7 @@ get_app_defaults_path()
|
||||
**Parameters**: None
|
||||
|
||||
**Returns**:
|
||||
|
||||
- String: Full path to app defaults file
|
||||
|
||||
**Implementation**:
|
||||
@ -322,6 +327,7 @@ load_vars_file "$(get_app_defaults_path)"
|
||||
**Purpose**: Load and display user global defaults
|
||||
|
||||
**Signature**:
|
||||
|
||||
```bash
|
||||
default_var_settings()
|
||||
```
|
||||
@ -329,6 +335,7 @@ default_var_settings()
|
||||
**Parameters**: None
|
||||
|
||||
**Returns**:
|
||||
|
||||
- `0` on success
|
||||
- `1` on error
|
||||
|
||||
@ -337,15 +344,15 @@ default_var_settings()
|
||||
```
|
||||
1. Find default.vars location
|
||||
(usually /usr/local/community-scripts/default.vars)
|
||||
|
||||
|
||||
2. Create if missing
|
||||
|
||||
|
||||
3. Load variables from file
|
||||
|
||||
|
||||
4. Map var_verbose → VERBOSE variable
|
||||
|
||||
|
||||
5. Call base_settings (apply to container config)
|
||||
|
||||
|
||||
6. Call echo_default (display summary)
|
||||
```
|
||||
|
||||
@ -354,20 +361,20 @@ default_var_settings()
|
||||
```bash
|
||||
default_var_settings() {
|
||||
local VAR_WHITELIST=(
|
||||
var_apt_cacher var_apt_cacher_ip var_brg var_cpu var_disk var_fuse
|
||||
var_apt_cacher var_apt_cacher_ip var_brg var_cpu var_disk var_fuse var_gpu
|
||||
var_gateway var_hostname var_ipv6_method var_mac var_mtu
|
||||
var_net var_ns var_pw var_ram var_tags var_tun var_unprivileged
|
||||
var_verbose var_vlan var_ssh var_ssh_authorized_key
|
||||
var_container_storage var_template_storage
|
||||
)
|
||||
|
||||
|
||||
# Ensure file exists
|
||||
_ensure_default_vars
|
||||
|
||||
|
||||
# Find and load
|
||||
local dv="$(_find_default_vars)"
|
||||
load_vars_file "$dv"
|
||||
|
||||
|
||||
# Map verbose flag
|
||||
if [[ -n "${var_verbose:-}" ]]; then
|
||||
case "${var_verbose,,}" in
|
||||
@ -375,7 +382,7 @@ default_var_settings() {
|
||||
*) VERBOSE="${var_verbose}" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
|
||||
# Apply and display
|
||||
base_settings "$VERBOSE"
|
||||
echo_default
|
||||
@ -389,6 +396,7 @@ default_var_settings() {
|
||||
**Purpose**: Offer to save current settings as app-specific defaults
|
||||
|
||||
**Signature**:
|
||||
|
||||
```bash
|
||||
maybe_offer_save_app_defaults()
|
||||
```
|
||||
@ -413,10 +421,10 @@ maybe_offer_save_app_defaults()
|
||||
```bash
|
||||
maybe_offer_save_app_defaults() {
|
||||
local app_vars_path="$(get_app_defaults_path)"
|
||||
|
||||
|
||||
# Build current settings from memory
|
||||
local new_tmp="$(_build_current_app_vars_tmp)"
|
||||
|
||||
|
||||
# Check if already exists
|
||||
if [ -f "$app_vars_path" ]; then
|
||||
# Show diff and ask: Update? Keep? View Diff?
|
||||
@ -438,29 +446,31 @@ maybe_offer_save_app_defaults() {
|
||||
**Purpose**: Remove dangerous characters/patterns from configuration values
|
||||
|
||||
**Signature**:
|
||||
|
||||
```bash
|
||||
_sanitize_value(value)
|
||||
```
|
||||
|
||||
**Parameters**:
|
||||
|
||||
| Param | Type | Required |
|
||||
|-------|------|----------|
|
||||
| value | String | Yes |
|
||||
| Param | Type | Required |
|
||||
| ----- | ------ | -------- |
|
||||
| value | String | Yes |
|
||||
|
||||
**Returns**:
|
||||
|
||||
- `0` (success) + sanitized value on stdout
|
||||
- `1` (failure) + nothing if dangerous
|
||||
|
||||
**Dangerous Patterns**:
|
||||
|
||||
| Pattern | Threat | Example |
|
||||
|---------|--------|---------|
|
||||
| `$(...)` | Command substitution | `$(rm -rf /)` |
|
||||
| `` ` ` `` | Command substitution | `` `whoami` `` |
|
||||
| `;` | Command separator | `value; rm -rf /` |
|
||||
| `&` | Background execution | `value & malicious` |
|
||||
| `<(` | Process substitution | `<(cat /etc/passwd)` |
|
||||
| Pattern | Threat | Example |
|
||||
| --------- | -------------------- | -------------------- |
|
||||
| `$(...)` | Command substitution | `$(rm -rf /)` |
|
||||
| `` ` ` `` | Command substitution | `` `whoami` `` |
|
||||
| `;` | Command separator | `value; rm -rf /` |
|
||||
| `&` | Background execution | `value & malicious` |
|
||||
| `<(` | Process substitution | `<(cat /etc/passwd)` |
|
||||
|
||||
**Implementation**:
|
||||
|
||||
@ -501,17 +511,19 @@ fi
|
||||
**Purpose**: Check if variable name is in allowed whitelist
|
||||
|
||||
**Signature**:
|
||||
|
||||
```bash
|
||||
_is_whitelisted_key(key)
|
||||
```
|
||||
|
||||
**Parameters**:
|
||||
|
||||
| Param | Type | Required | Example |
|
||||
|-------|------|----------|---------|
|
||||
| key | String | Yes | `var_cpu` |
|
||||
| Param | Type | Required | Example |
|
||||
| ----- | ------ | -------- | --------- |
|
||||
| key | String | Yes | `var_cpu` |
|
||||
|
||||
**Returns**:
|
||||
|
||||
- `0` if key is whitelisted
|
||||
- `1` if key is NOT whitelisted
|
||||
|
||||
@ -573,6 +585,7 @@ Step 4: Use BUILT-IN DEFAULTS
|
||||
### Precedence Examples
|
||||
|
||||
**Example 1: Environment Variable Wins**
|
||||
|
||||
```bash
|
||||
# Shell environment has highest priority
|
||||
$ export var_cpu=16
|
||||
@ -583,6 +596,7 @@ $ bash pihole-install.sh
|
||||
```
|
||||
|
||||
**Example 2: App Defaults Override User Defaults**
|
||||
|
||||
```bash
|
||||
# User Defaults: var_cpu=4
|
||||
# App Defaults: var_cpu=2
|
||||
@ -593,6 +607,7 @@ $ bash pihole-install.sh
|
||||
```
|
||||
|
||||
**Example 3: All Defaults Missing (Built-ins Used)**
|
||||
|
||||
```bash
|
||||
# No environment variables set
|
||||
# No app defaults file
|
||||
@ -611,21 +626,21 @@ $ bash pihole-install.sh
|
||||
base_settings() {
|
||||
# Priority 1: Environment variables (already set if export used)
|
||||
CT_TYPE=${var_unprivileged:-"1"} # Use existing or default
|
||||
|
||||
|
||||
# Priority 2: Load app defaults (may override above)
|
||||
if [ -f "$(get_app_defaults_path)" ]; then
|
||||
load_vars_file "$(get_app_defaults_path)"
|
||||
fi
|
||||
|
||||
|
||||
# Priority 3: Load user defaults
|
||||
if [ -f "/usr/local/community-scripts/default.vars" ]; then
|
||||
load_vars_file "/usr/local/community-scripts/default.vars"
|
||||
fi
|
||||
|
||||
|
||||
# Priority 4: Apply built-in defaults (lowest)
|
||||
CORE_COUNT=${var_cpu:-"${APP_CPU_DEFAULT:-2}"}
|
||||
RAM_SIZE=${var_ram:-"${APP_RAM_DEFAULT:-1024}"}
|
||||
|
||||
|
||||
# Result: var_cpu has been set through precedence chain
|
||||
}
|
||||
```
|
||||
@ -734,14 +749,14 @@ CONTAINER CREATION STARTED
|
||||
|
||||
### Threat Model
|
||||
|
||||
| Threat | Mitigation |
|
||||
|--------|-----------|
|
||||
| **Arbitrary Code Execution** | No `source` or `eval`; manual parsing only |
|
||||
| **Variable Injection** | Whitelist of allowed variable names |
|
||||
| **Command Substitution** | `_sanitize_value()` blocks `$()`, backticks, etc. |
|
||||
| **Path Traversal** | Files locked to `/usr/local/community-scripts/` |
|
||||
| **Permission Escalation** | Files created with restricted permissions |
|
||||
| **Information Disclosure** | Sensitive variables not logged |
|
||||
| Threat | Mitigation |
|
||||
| ---------------------------- | ------------------------------------------------- |
|
||||
| **Arbitrary Code Execution** | No `source` or `eval`; manual parsing only |
|
||||
| **Variable Injection** | Whitelist of allowed variable names |
|
||||
| **Command Substitution** | `_sanitize_value()` blocks `$()`, backticks, etc. |
|
||||
| **Path Traversal** | Files locked to `/usr/local/community-scripts/` |
|
||||
| **Permission Escalation** | Files created with restricted permissions |
|
||||
| **Information Disclosure** | Sensitive variables not logged |
|
||||
|
||||
### Security Controls
|
||||
|
||||
@ -798,6 +813,7 @@ fi
|
||||
### Module: `build.func`
|
||||
|
||||
**Load Order** (in actual scripts):
|
||||
|
||||
1. `#!/usr/bin/env bash` - Shebang
|
||||
2. `source /dev/stdin <<<$(curl ... api.func)` - API functions
|
||||
3. `source /dev/stdin <<<$(curl ... build.func)` - Build functions
|
||||
@ -832,17 +848,17 @@ fi
|
||||
|
||||
# Section 6: Installation Flow
|
||||
- install_script() # Main entry point
|
||||
- advanced_settings() # 19-step wizard
|
||||
- advanced_settings() # 20-step wizard
|
||||
```
|
||||
|
||||
### Regex Patterns Used
|
||||
|
||||
| Pattern | Purpose | Example Match |
|
||||
|---------|---------|---|
|
||||
| `^[0-9]+([.][0-9]+)?$` | Integer validation | `4`, `192.168` |
|
||||
| `^var_[a-z_]+$` | Variable name | `var_cpu`, `var_ssh` |
|
||||
| `*'$('*` | Command substitution | `$(whoami)` |
|
||||
| `*\`*` | Backtick substitution | `` `cat /etc/passwd` `` |
|
||||
| Pattern | Purpose | Example Match |
|
||||
| ---------------------- | --------------------- | ----------------------- |
|
||||
| `^[0-9]+([.][0-9]+)?$` | Integer validation | `4`, `192.168` |
|
||||
| `^var_[a-z_]+$` | Variable name | `var_cpu`, `var_ssh` |
|
||||
| `*'$('*` | Command substitution | `$(whoami)` |
|
||||
| `*\`\*` | Backtick substitution | `` `cat /etc/passwd` `` |
|
||||
|
||||
---
|
||||
|
||||
@ -869,12 +885,12 @@ fi
|
||||
|
||||
### Function Mapping
|
||||
|
||||
| Old | New | Location |
|
||||
|-----|-----|----------|
|
||||
| `read_config()` | `load_vars_file()` | build.func |
|
||||
| `write_config()` | `_build_current_app_vars_tmp()` | build.func |
|
||||
| None | `maybe_offer_save_app_defaults()` | build.func |
|
||||
| None | `get_app_defaults_path()` | build.func |
|
||||
| Old | New | Location |
|
||||
| ---------------- | --------------------------------- | ---------- |
|
||||
| `read_config()` | `load_vars_file()` | build.func |
|
||||
| `write_config()` | `_build_current_app_vars_tmp()` | build.func |
|
||||
| None | `maybe_offer_save_app_defaults()` | build.func |
|
||||
| None | `get_app_defaults_path()` | build.func |
|
||||
|
||||
---
|
||||
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
|
||||
# Community Scripts Contribution Guide
|
||||
|
||||
## **Welcome to the communty-scripts Repository!**
|
||||
## **Welcome to the communty-scripts Repository!**
|
||||
|
||||
📜 These documents outline the essential coding standards for all our scripts and JSON files. Adhering to these standards ensures that our codebase remains consistent, readable, and maintainable. By following these guidelines, we can improve collaboration, reduce errors, and enhance the overall quality of our project.
|
||||
|
||||
@ -28,7 +27,6 @@ By following the coding standards outlined in this document, we ensure that our
|
||||
|
||||
Let's work together to keep our codebase clean, efficient, and maintainable! 💪🚀
|
||||
|
||||
|
||||
## Getting Started
|
||||
|
||||
Before contributing, please ensure that you have the following setup:
|
||||
@ -40,67 +38,73 @@ Before contributing, please ensure that you have the following setup:
|
||||
- [Shell Format](https://marketplace.visualstudio.com/items?itemName=foxundermoon.shell-format)
|
||||
|
||||
### Important Notes
|
||||
- Use [AppName.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/ct/AppName.sh) and [AppName-install.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.sh) as templates when creating new scripts.
|
||||
|
||||
- Use [AppName.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/docs/contribution/templates_ct/AppName.sh) and [AppName-install.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/docs/contribution/templates_install/AppName-install.sh) as templates when creating new scripts.
|
||||
|
||||
---
|
||||
|
||||
# 🚀 The Application Script (ct/AppName.sh)
|
||||
|
||||
- You can find all coding standards, as well as the structure for this file [here](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/ct/AppName.md).
|
||||
- You can find all coding standards, as well as the structure for this file [here](https://github.com/community-scripts/ProxmoxVE/blob/main/docs/contribution/templates_ct/AppName.md).
|
||||
- These scripts are responsible for container creation, setting the necessary variables and handling the update of the application once installed.
|
||||
|
||||
---
|
||||
|
||||
# 🛠 The Installation Script (install/AppName-install.sh)
|
||||
|
||||
- You can find all coding standards, as well as the structure for this file [here](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.md).
|
||||
- You can find all coding standards, as well as the structure for this file [here](https://github.com/community-scripts/ProxmoxVE/blob/main/docs/contribution/templates_install/AppName-install.md).
|
||||
- These scripts are responsible for the installation of the application.
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Building Your Own Scripts
|
||||
|
||||
Start with the [template script](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.sh)
|
||||
Start with the [template script](https://github.com/community-scripts/ProxmoxVE/blob/main/docs/contribution/templates_install/AppName-install.sh)
|
||||
|
||||
---
|
||||
|
||||
## 🤝 Contribution Process
|
||||
|
||||
### 1. Fork the repository
|
||||
|
||||
Fork to your GitHub account
|
||||
|
||||
### 2. Clone your fork on your local environment
|
||||
### 2. Clone your fork on your local environment
|
||||
|
||||
```bash
|
||||
git clone https://github.com/yourUserName/ForkName
|
||||
```
|
||||
|
||||
### 3. Create a new branch
|
||||
|
||||
```bash
|
||||
git switch -c your-feature-branch
|
||||
```
|
||||
|
||||
### 4. Change paths in build.func install.func and AppName.sh
|
||||
|
||||
To be able to develop from your own branch you need to change `https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main` to `https://raw.githubusercontent.com/[USER]/[REPOSITORY]/refs/heads/[BRANCH]`. You need to make this change atleast in misc/build.func misc/install.func and in your ct/AppName.sh. This change is only for testing. Before opening a Pull Request you should change this line change all this back to point to `https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main`.
|
||||
|
||||
### 4. Commit changes (without build.func and install.func!)
|
||||
|
||||
```bash
|
||||
git commit -m "Your commit message"
|
||||
```
|
||||
|
||||
### 5. Push to your fork
|
||||
|
||||
```bash
|
||||
git push origin your-feature-branch
|
||||
```
|
||||
|
||||
### 6. Create a Pull Request
|
||||
|
||||
Open a Pull Request from your feature branch to the main repository branch. You must only include your **$AppName.sh**, **$AppName-install.sh** and **$AppName.json** files in the pull request.
|
||||
|
||||
---
|
||||
|
||||
## 📚 Pages
|
||||
|
||||
- [CT Template: AppName.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/ct/AppName.sh)
|
||||
- [Install Template: AppName-install.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.sh)
|
||||
- [JSON Template: AppName.json](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/json/AppName.json)
|
||||
|
||||
|
||||
- [CT Template: AppName.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/docs/contribution/templates_ct/AppName.sh)
|
||||
- [Install Template: AppName-install.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/docs/contribution/templates_install/AppName-install.sh)
|
||||
- [JSON Template: AppName.json](https://github.com/community-scripts/ProxmoxVE/blob/main/docs/contribution/templates_json/AppName.json)
|
||||
|
||||
164
docs/misc/build.func/BUILD_FUNC_ADVANCED_SETTINGS.md
Normal file
164
docs/misc/build.func/BUILD_FUNC_ADVANCED_SETTINGS.md
Normal file
@ -0,0 +1,164 @@
|
||||
# Advanced Settings Wizard Reference
|
||||
|
||||
## Overview
|
||||
|
||||
The Advanced Settings wizard provides a 28-step interactive configuration for LXC container creation. It allows users to customize every aspect of the container while inheriting sensible defaults from the CT script.
|
||||
|
||||
## Key Features
|
||||
|
||||
- **Inherit App Defaults**: All `var_*` values from CT scripts pre-populate wizard fields
|
||||
- **Back Navigation**: Press Cancel/Back to return to previous step
|
||||
- **App Default Hints**: Each dialog shows `(App default: X)` to indicate script defaults
|
||||
- **Full Customization**: Every configurable option is accessible
|
||||
|
||||
## Wizard Steps
|
||||
|
||||
| Step | Title | Variable(s) | Description |
|
||||
| ---- | ------------------------ | --------------------------------- | ----------------------------------------------------- |
|
||||
| 1 | Container Type | `var_unprivileged` | Privileged (0) or Unprivileged (1) container |
|
||||
| 2 | Root Password | `var_pw` | Set password or use automatic login |
|
||||
| 3 | Container ID | `var_ctid` | Unique container ID (auto-suggested) |
|
||||
| 4 | Hostname | `var_hostname` | Container hostname |
|
||||
| 5 | Disk Size | `var_disk` | Disk size in GB |
|
||||
| 6 | CPU Cores | `var_cpu` | Number of CPU cores |
|
||||
| 7 | RAM Size | `var_ram` | RAM size in MiB |
|
||||
| 8 | Network Bridge | `var_brg` | Network bridge (vmbr0, etc.) |
|
||||
| 9 | IPv4 Configuration | `var_net`, `var_gateway` | DHCP or static IP with gateway |
|
||||
| 10 | IPv6 Configuration | `var_ipv6_method` | Auto, DHCP, Static, or None |
|
||||
| 11 | MTU Size | `var_mtu` | Network MTU (default: 1500) |
|
||||
| 12 | DNS Search Domain | `var_searchdomain` | DNS search domain |
|
||||
| 13 | DNS Server | `var_ns` | Custom DNS server IP |
|
||||
| 14 | MAC Address | `var_mac` | Custom MAC address (auto-generated if empty) |
|
||||
| 15 | VLAN Tag | `var_vlan` | VLAN tag ID |
|
||||
| 16 | Tags | `var_tags` | Container tags (comma/semicolon separated) |
|
||||
| 17 | SSH Settings | `var_ssh` | SSH key selection and root access |
|
||||
| 18 | FUSE Support | `var_fuse` | Enable FUSE for rclone, mergerfs, AppImage |
|
||||
| 19 | TUN/TAP Support | `var_tun` | Enable for VPN apps (WireGuard, OpenVPN, Tailscale) |
|
||||
| 20 | Nesting Support | `var_nesting` | Enable for Docker, LXC in LXC, Podman |
|
||||
| 21 | GPU Passthrough | `var_gpu` | Auto-detect and pass through Intel/AMD/NVIDIA GPUs |
|
||||
| 22 | Keyctl Support | `var_keyctl` | Enable for Docker, systemd-networkd |
|
||||
| 23 | APT Cacher Proxy | `var_apt_cacher`, `var_apt_cacher_ip` | Use apt-cacher-ng for faster downloads |
|
||||
| 24 | Container Timezone | `var_timezone` | Set timezone (e.g., Europe/Berlin) |
|
||||
| 25 | Container Protection | `var_protection` | Prevent accidental deletion |
|
||||
| 26 | Device Node Creation | `var_mknod` | Allow mknod (experimental, kernel 5.3+) |
|
||||
| 27 | Mount Filesystems | `var_mount_fs` | Allow specific mounts: nfs, cifs, fuse, etc. |
|
||||
| 28 | Verbose Mode & Confirm | `var_verbose` | Enable verbose output + final confirmation |
|
||||
|
||||
## Default Value Inheritance
|
||||
|
||||
The wizard inherits defaults from multiple sources:
|
||||
|
||||
```text
|
||||
CT Script (var_*) → default.vars → app.vars → User Input
|
||||
```
|
||||
|
||||
### Example: VPN Container (alpine-wireguard.sh)
|
||||
|
||||
```bash
|
||||
# CT script sets:
|
||||
var_tun="${var_tun:-1}" # TUN enabled by default
|
||||
|
||||
# In Advanced Settings Step 19:
|
||||
# Dialog shows: "(App default: 1)" and pre-selects "Yes"
|
||||
```
|
||||
|
||||
### Example: Media Server (jellyfin.sh)
|
||||
|
||||
```bash
|
||||
# CT script sets:
|
||||
var_gpu="${var_gpu:-yes}" # GPU enabled by default
|
||||
|
||||
# In Advanced Settings Step 21:
|
||||
# Dialog shows: "(App default: yes)" and pre-selects "Yes"
|
||||
```
|
||||
|
||||
## Feature Matrix
|
||||
|
||||
| Feature | Variable | When to Enable |
|
||||
| ----------------- | ---------------- | --------------------------------------------------- |
|
||||
| FUSE | `var_fuse` | rclone, mergerfs, AppImage, SSHFS |
|
||||
| TUN/TAP | `var_tun` | WireGuard, OpenVPN, Tailscale, VPN containers |
|
||||
| Nesting | `var_nesting` | Docker, Podman, LXC-in-LXC, systemd-nspawn |
|
||||
| GPU Passthrough | `var_gpu` | Plex, Jellyfin, Emby, Frigate, Ollama, ComfyUI |
|
||||
| Keyctl | `var_keyctl` | Docker (unprivileged), systemd-networkd |
|
||||
| Protection | `var_protection` | Production containers, prevent accidental deletion |
|
||||
| Mknod | `var_mknod` | Device node creation (experimental) |
|
||||
| Mount FS | `var_mount_fs` | NFS mounts, CIFS shares, custom filesystems |
|
||||
| APT Cacher | `var_apt_cacher` | Speed up downloads with local apt-cacher-ng |
|
||||
|
||||
## Confirmation Summary
|
||||
|
||||
Step 28 displays a comprehensive summary before creation:
|
||||
|
||||
```text
|
||||
Container Type: Unprivileged
|
||||
Container ID: 100
|
||||
Hostname: jellyfin
|
||||
|
||||
Resources:
|
||||
Disk: 8 GB
|
||||
CPU: 2 cores
|
||||
RAM: 2048 MiB
|
||||
|
||||
Network:
|
||||
Bridge: vmbr0
|
||||
IPv4: dhcp
|
||||
IPv6: auto
|
||||
|
||||
Features:
|
||||
FUSE: no | TUN: no
|
||||
Nesting: Enabled | Keyctl: Disabled
|
||||
GPU: yes | Protection: No
|
||||
|
||||
Advanced:
|
||||
Timezone: Europe/Berlin
|
||||
APT Cacher: no
|
||||
Verbose: no
|
||||
```
|
||||
|
||||
## Usage Examples
|
||||
|
||||
### Skip to Advanced Settings
|
||||
|
||||
```bash
|
||||
# Run script, select "Advanced" from menu
|
||||
bash -c "$(curl -fsSL https://...jellyfin.sh)"
|
||||
# Then select option 3 "Advanced"
|
||||
```
|
||||
|
||||
### Pre-set Defaults via Environment
|
||||
|
||||
```bash
|
||||
# Set defaults before running
|
||||
export var_cpu=4
|
||||
export var_ram=4096
|
||||
export var_gpu=yes
|
||||
bash -c "$(curl -fsSL https://...jellyfin.sh)"
|
||||
# Advanced settings will inherit these values
|
||||
```
|
||||
|
||||
### Non-Interactive with All Options
|
||||
|
||||
```bash
|
||||
# Set all variables for fully automated deployment
|
||||
export var_unprivileged=1
|
||||
export var_cpu=2
|
||||
export var_ram=2048
|
||||
export var_disk=8
|
||||
export var_net=dhcp
|
||||
export var_fuse=no
|
||||
export var_tun=no
|
||||
export var_gpu=yes
|
||||
export var_nesting=1
|
||||
export var_protection=no
|
||||
export var_verbose=no
|
||||
bash -c "$(curl -fsSL https://...jellyfin.sh)"
|
||||
```
|
||||
|
||||
## Notes
|
||||
|
||||
- **Cancel at Step 1**: Exits the script entirely
|
||||
- **Cancel at Steps 2-28**: Goes back to previous step
|
||||
- **Empty fields**: Use default value
|
||||
- **Keyctl**: Automatically enabled for unprivileged containers
|
||||
- **Nesting**: Enabled by default (required for many apps)
|
||||
@ -8,103 +8,142 @@ This document provides a comprehensive reference of all environment variables us
|
||||
|
||||
### Core Container Variables
|
||||
|
||||
| Variable | Description | Default | Set In | Used In |
|
||||
|----------|-------------|---------|---------|---------|
|
||||
| `APP` | Application name (e.g., "plex", "nextcloud") | - | Environment | Throughout |
|
||||
| `NSAPP` | Namespace application name | `$APP` | Environment | Throughout |
|
||||
| `CTID` | Container ID | - | Environment | Container creation |
|
||||
| `CT_TYPE` | Container type ("install" or "update") | "install" | Environment | Entry point |
|
||||
| `CT_NAME` | Container name | `$APP` | Environment | Container creation |
|
||||
| Variable | Description | Default | Set In | Used In |
|
||||
| --------- | -------------------------------------------- | --------- | ----------- | ------------------ |
|
||||
| `APP` | Application name (e.g., "plex", "nextcloud") | - | Environment | Throughout |
|
||||
| `NSAPP` | Namespace application name | `$APP` | Environment | Throughout |
|
||||
| `CTID` | Container ID | - | Environment | Container creation |
|
||||
| `CT_TYPE` | Container type ("install" or "update") | "install" | Environment | Entry point |
|
||||
| `CT_NAME` | Container name | `$APP` | Environment | Container creation |
|
||||
|
||||
### Operating System Variables
|
||||
|
||||
| Variable | Description | Default | Set In | Used In |
|
||||
|----------|-------------|---------|---------|---------|
|
||||
| `var_os` | Operating system selection | "debian" | base_settings() | OS selection |
|
||||
| `var_version` | OS version | "12" | base_settings() | Template selection |
|
||||
| `var_template` | Template name | Auto-generated | base_settings() | Template download |
|
||||
| Variable | Description | Default | Set In | Used In |
|
||||
| -------------- | -------------------------- | -------------- | --------------- | ------------------ |
|
||||
| `var_os` | Operating system selection | "debian" | base_settings() | OS selection |
|
||||
| `var_version` | OS version | "12" | base_settings() | Template selection |
|
||||
| `var_template` | Template name | Auto-generated | base_settings() | Template download |
|
||||
|
||||
### Resource Configuration Variables
|
||||
|
||||
| Variable | Description | Default | Set In | Used In |
|
||||
|----------|-------------|---------|---------|---------|
|
||||
| `var_cpu` | CPU cores | "2" | base_settings() | Container creation |
|
||||
| `var_ram` | RAM in MB | "2048" | base_settings() | Container creation |
|
||||
| `var_disk` | Disk size in GB | "8" | base_settings() | Container creation |
|
||||
| `DISK_SIZE` | Disk size (alternative) | `$var_disk` | Environment | Container creation |
|
||||
| `CORE_COUNT` | CPU cores (alternative) | `$var_cpu` | Environment | Container creation |
|
||||
| `RAM_SIZE` | RAM size (alternative) | `$var_ram` | Environment | Container creation |
|
||||
| Variable | Description | Default | Set In | Used In |
|
||||
| ------------ | ----------------------- | ----------- | --------------- | ------------------ |
|
||||
| `var_cpu` | CPU cores | "2" | base_settings() | Container creation |
|
||||
| `var_ram` | RAM in MB | "2048" | base_settings() | Container creation |
|
||||
| `var_disk` | Disk size in GB | "8" | base_settings() | Container creation |
|
||||
| `DISK_SIZE` | Disk size (alternative) | `$var_disk` | Environment | Container creation |
|
||||
| `CORE_COUNT` | CPU cores (alternative) | `$var_cpu` | Environment | Container creation |
|
||||
| `RAM_SIZE` | RAM size (alternative) | `$var_ram` | Environment | Container creation |
|
||||
|
||||
### Network Configuration Variables
|
||||
|
||||
| Variable | Description | Default | Set In | Used In |
|
||||
|----------|-------------|---------|---------|---------|
|
||||
| `var_net` | Network interface | "vmbr0" | base_settings() | Network config |
|
||||
| `var_bridge` | Bridge interface | "vmbr0" | base_settings() | Network config |
|
||||
| `var_gateway` | Gateway IP | "192.168.1.1" | base_settings() | Network config |
|
||||
| `var_ip` | Container IP address | - | User input | Network config |
|
||||
| `var_ipv6` | IPv6 address | - | User input | Network config |
|
||||
| `var_vlan` | VLAN ID | - | User input | Network config |
|
||||
| `var_mtu` | MTU size | "1500" | base_settings() | Network config |
|
||||
| `var_mac` | MAC address | Auto-generated | base_settings() | Network config |
|
||||
| `NET` | Network interface (alternative) | `$var_net` | Environment | Network config |
|
||||
| `BRG` | Bridge interface (alternative) | `$var_bridge` | Environment | Network config |
|
||||
| `GATE` | Gateway IP (alternative) | `$var_gateway` | Environment | Network config |
|
||||
| `IPV6_METHOD` | IPv6 configuration method | "none" | Environment | Network config |
|
||||
| `VLAN` | VLAN ID (alternative) | `$var_vlan` | Environment | Network config |
|
||||
| `MTU` | MTU size (alternative) | `$var_mtu` | Environment | Network config |
|
||||
| `MAC` | MAC address (alternative) | `$var_mac` | Environment | Network config |
|
||||
| Variable | Description | Default | Set In | Used In |
|
||||
| ------------- | ------------------------------- | -------------- | --------------- | -------------- |
|
||||
| `var_net` | Network interface | "vmbr0" | base_settings() | Network config |
|
||||
| `var_bridge` | Bridge interface | "vmbr0" | base_settings() | Network config |
|
||||
| `var_gateway` | Gateway IP | "192.168.1.1" | base_settings() | Network config |
|
||||
| `var_ip` | Container IP address | - | User input | Network config |
|
||||
| `var_ipv6` | IPv6 address | - | User input | Network config |
|
||||
| `var_vlan` | VLAN ID | - | User input | Network config |
|
||||
| `var_mtu` | MTU size | "1500" | base_settings() | Network config |
|
||||
| `var_mac` | MAC address | Auto-generated | base_settings() | Network config |
|
||||
| `NET` | Network interface (alternative) | `$var_net` | Environment | Network config |
|
||||
| `BRG` | Bridge interface (alternative) | `$var_bridge` | Environment | Network config |
|
||||
| `GATE` | Gateway IP (alternative) | `$var_gateway` | Environment | Network config |
|
||||
| `IPV6_METHOD` | IPv6 configuration method | "none" | Environment | Network config |
|
||||
| `VLAN` | VLAN ID (alternative) | `$var_vlan` | Environment | Network config |
|
||||
| `MTU` | MTU size (alternative) | `$var_mtu` | Environment | Network config |
|
||||
| `MAC` | MAC address (alternative) | `$var_mac` | Environment | Network config |
|
||||
|
||||
### Storage Configuration Variables
|
||||
|
||||
| Variable | Description | Default | Set In | Used In |
|
||||
|----------|-------------|---------|---------|---------|
|
||||
| `var_template_storage` | Storage for templates | - | select_storage() | Template storage |
|
||||
| `var_container_storage` | Storage for container disks | - | select_storage() | Container storage |
|
||||
| `TEMPLATE_STORAGE` | Template storage (alternative) | `$var_template_storage` | Environment | Template storage |
|
||||
| `CONTAINER_STORAGE` | Container storage (alternative) | `$var_container_storage` | Environment | Container storage |
|
||||
| Variable | Description | Default | Set In | Used In |
|
||||
| ----------------------- | ------------------------------- | ------------------------ | ---------------- | ----------------- |
|
||||
| `var_template_storage` | Storage for templates | - | select_storage() | Template storage |
|
||||
| `var_container_storage` | Storage for container disks | - | select_storage() | Container storage |
|
||||
| `TEMPLATE_STORAGE` | Template storage (alternative) | `$var_template_storage` | Environment | Template storage |
|
||||
| `CONTAINER_STORAGE` | Container storage (alternative) | `$var_container_storage` | Environment | Container storage |
|
||||
|
||||
### Feature Flags
|
||||
|
||||
| Variable | Description | Default | Set In | Used In |
|
||||
|----------|-------------|---------|---------|---------|
|
||||
| `ENABLE_FUSE` | Enable FUSE support | "true" | base_settings() | Container features |
|
||||
| `ENABLE_TUN` | Enable TUN/TAP support | "true" | base_settings() | Container features |
|
||||
| `ENABLE_KEYCTL` | Enable keyctl support | "true" | base_settings() | Container features |
|
||||
| `ENABLE_MOUNT` | Enable mount support | "true" | base_settings() | Container features |
|
||||
| `ENABLE_NESTING` | Enable nesting support | "false" | base_settings() | Container features |
|
||||
| `ENABLE_PRIVILEGED` | Enable privileged mode | "false" | base_settings() | Container features |
|
||||
| `ENABLE_UNPRIVILEGED` | Enable unprivileged mode | "true" | base_settings() | Container features |
|
||||
| `VERBOSE` | Enable verbose output | "false" | Environment | Logging |
|
||||
| `SSH` | Enable SSH key provisioning | "true" | base_settings() | SSH setup |
|
||||
| Variable | Description | Default | Set In | Used In |
|
||||
| ---------------- | ------------------------------ | ------- | ------------------------------- | ------------------ |
|
||||
| `var_fuse` | Enable FUSE support | "no" | CT script / Advanced Settings | Container features |
|
||||
| `var_tun` | Enable TUN/TAP support | "no" | CT script / Advanced Settings | Container features |
|
||||
| `var_nesting` | Enable nesting support | "1" | CT script / Advanced Settings | Container features |
|
||||
| `var_keyctl` | Enable keyctl support | "0" | CT script / Advanced Settings | Container features |
|
||||
| `var_mknod` | Allow device node creation | "0" | CT script / Advanced Settings | Container features |
|
||||
| `var_mount_fs` | Allowed filesystem mounts | "" | CT script / Advanced Settings | Container features |
|
||||
| `var_protection` | Enable container protection | "no" | CT script / Advanced Settings | Container creation |
|
||||
| `var_timezone` | Container timezone | "" | CT script / Advanced Settings | Container creation |
|
||||
| `var_verbose` | Enable verbose output | "no" | Environment / Advanced Settings | Logging |
|
||||
| `var_ssh` | Enable SSH key provisioning | "no" | CT script / Advanced Settings | SSH setup |
|
||||
| `ENABLE_FUSE` | FUSE flag (internal) | "no" | Advanced Settings | Container creation |
|
||||
| `ENABLE_TUN` | TUN/TAP flag (internal) | "no" | Advanced Settings | Container creation |
|
||||
| `ENABLE_NESTING` | Nesting flag (internal) | "1" | Advanced Settings | Container creation |
|
||||
| `ENABLE_KEYCTL` | Keyctl flag (internal) | "0" | Advanced Settings | Container creation |
|
||||
| `ENABLE_MKNOD` | Mknod flag (internal) | "0" | Advanced Settings | Container creation |
|
||||
| `PROTECT_CT` | Protection flag (internal) | "no" | Advanced Settings | Container creation |
|
||||
| `CT_TIMEZONE` | Timezone setting (internal) | "" | Advanced Settings | Container creation |
|
||||
| `VERBOSE` | Verbose mode flag | "no" | Environment | Logging |
|
||||
| `SSH` | SSH access flag | "no" | Advanced Settings | SSH setup |
|
||||
|
||||
### APT Cacher Configuration
|
||||
|
||||
| Variable | Description | Default | Set In | Used In |
|
||||
| ------------------ | ------------------------ | ------- | ----------------------------- | ------------------- |
|
||||
| `var_apt_cacher` | Enable APT cacher proxy | "no" | CT script / Advanced Settings | Package management |
|
||||
| `var_apt_cacher_ip`| APT cacher server IP | "" | CT script / Advanced Settings | Package management |
|
||||
| `APT_CACHER` | APT cacher flag | "no" | Advanced Settings | Container creation |
|
||||
| `APT_CACHER_IP` | APT cacher IP (internal) | "" | Advanced Settings | Container creation |
|
||||
|
||||
### GPU Passthrough Variables
|
||||
|
||||
| Variable | Description | Default | Set In | Used In |
|
||||
|----------|-------------|---------|---------|---------|
|
||||
| `GPU_APPS` | List of apps that support GPU | - | Environment | GPU detection |
|
||||
| `var_gpu` | GPU selection | - | User input | GPU passthrough |
|
||||
| `var_gpu_type` | GPU type (intel/amd/nvidia) | - | detect_gpu_devices() | GPU passthrough |
|
||||
| `var_gpu_devices` | GPU device list | - | detect_gpu_devices() | GPU passthrough |
|
||||
| Variable | Description | Default | Set In | Used In |
|
||||
| ------------ | ------------------------------- | ------- | ------------------------------------------- | ------------------ |
|
||||
| `var_gpu` | Enable GPU passthrough | "no" | CT script / Environment / Advanced Settings | GPU passthrough |
|
||||
| `ENABLE_GPU` | GPU passthrough flag (internal) | "no" | Advanced Settings | Container creation |
|
||||
|
||||
**Note**: GPU passthrough is controlled via `var_gpu`. Apps that benefit from GPU acceleration (media servers, AI/ML, transcoding) have `var_gpu=yes` as default in their CT scripts.
|
||||
|
||||
**Apps with GPU enabled by default**:
|
||||
|
||||
- Media: jellyfin, plex, emby, channels, ersatztv, tunarr, immich
|
||||
- Transcoding: tdarr, unmanic, fileflows
|
||||
- AI/ML: ollama, openwebui
|
||||
- NVR: frigate
|
||||
|
||||
**Usage Examples**:
|
||||
|
||||
```bash
|
||||
# Disable GPU for a specific installation
|
||||
var_gpu=no bash -c "$(curl -fsSL https://...jellyfin.sh)"
|
||||
|
||||
# Enable GPU for apps without default GPU support
|
||||
var_gpu=yes bash -c "$(curl -fsSL https://...debian.sh)"
|
||||
|
||||
# Set in default.vars for all apps
|
||||
echo "var_gpu=yes" >> /usr/local/community-scripts/default.vars
|
||||
```
|
||||
|
||||
### API and Diagnostics Variables
|
||||
|
||||
| Variable | Description | Default | Set In | Used In |
|
||||
|----------|-------------|---------|---------|---------|
|
||||
| `DIAGNOSTICS` | Enable diagnostics mode | "false" | Environment | Diagnostics |
|
||||
| `METHOD` | Installation method | "install" | Environment | Installation flow |
|
||||
| `RANDOM_UUID` | Random UUID for tracking | - | Environment | Logging |
|
||||
| `API_TOKEN` | Proxmox API token | - | Environment | API calls |
|
||||
| `API_USER` | Proxmox API user | - | Environment | API calls |
|
||||
| Variable | Description | Default | Set In | Used In |
|
||||
| ------------- | ------------------------ | --------- | ----------- | ----------------- |
|
||||
| `DIAGNOSTICS` | Enable diagnostics mode | "false" | Environment | Diagnostics |
|
||||
| `METHOD` | Installation method | "install" | Environment | Installation flow |
|
||||
| `RANDOM_UUID` | Random UUID for tracking | - | Environment | Logging |
|
||||
| `API_TOKEN` | Proxmox API token | - | Environment | API calls |
|
||||
| `API_USER` | Proxmox API user | - | Environment | API calls |
|
||||
|
||||
### Settings Persistence Variables
|
||||
|
||||
| Variable | Description | Default | Set In | Used In |
|
||||
|----------|-------------|---------|---------|---------|
|
||||
| `SAVE_DEFAULTS` | Save settings as defaults | "false" | User input | Settings persistence |
|
||||
| `SAVE_APP_DEFAULTS` | Save app-specific defaults | "false" | User input | Settings persistence |
|
||||
| `DEFAULT_VARS_FILE` | Path to default.vars | "/usr/local/community-scripts/default.vars" | Environment | Settings persistence |
|
||||
| `APP_DEFAULTS_FILE` | Path to app.vars | "/usr/local/community-scripts/defaults/$APP.vars" | Environment | Settings persistence |
|
||||
| Variable | Description | Default | Set In | Used In |
|
||||
| ------------------- | -------------------------- | ------------------------------------------------- | ----------- | -------------------- |
|
||||
| `SAVE_DEFAULTS` | Save settings as defaults | "false" | User input | Settings persistence |
|
||||
| `SAVE_APP_DEFAULTS` | Save app-specific defaults | "false" | User input | Settings persistence |
|
||||
| `DEFAULT_VARS_FILE` | Path to default.vars | "/usr/local/community-scripts/default.vars" | Environment | Settings persistence |
|
||||
| `APP_DEFAULTS_FILE` | Path to app.vars | "/usr/local/community-scripts/defaults/$APP.vars" | Environment | Settings persistence |
|
||||
|
||||
## Variable Precedence Chain
|
||||
|
||||
@ -152,6 +191,7 @@ export SSH="true"
|
||||
## Environment Variable Usage Patterns
|
||||
|
||||
### 1. Container Creation
|
||||
|
||||
```bash
|
||||
# Basic container creation
|
||||
export APP="nextcloud"
|
||||
@ -170,6 +210,7 @@ export var_container_storage="local"
|
||||
```
|
||||
|
||||
### 2. GPU Passthrough
|
||||
|
||||
```bash
|
||||
# Enable GPU passthrough
|
||||
export GPU_APPS="plex,jellyfin,emby"
|
||||
@ -178,6 +219,7 @@ export ENABLE_PRIVILEGED="true"
|
||||
```
|
||||
|
||||
### 3. Advanced Network Configuration
|
||||
|
||||
```bash
|
||||
# VLAN and IPv6 configuration
|
||||
export var_vlan="100"
|
||||
@ -187,6 +229,7 @@ export var_mtu="9000"
|
||||
```
|
||||
|
||||
### 4. Storage Configuration
|
||||
|
||||
```bash
|
||||
# Custom storage locations
|
||||
export var_template_storage="nfs-storage"
|
||||
@ -206,6 +249,7 @@ The script validates variables at several points:
|
||||
## Common Variable Combinations
|
||||
|
||||
### Development Container
|
||||
|
||||
```bash
|
||||
export APP="dev-container"
|
||||
export CTID="200"
|
||||
@ -220,6 +264,7 @@ export ENABLE_PRIVILEGED="true"
|
||||
```
|
||||
|
||||
### Media Server with GPU
|
||||
|
||||
```bash
|
||||
export APP="plex"
|
||||
export CTID="300"
|
||||
@ -235,6 +280,7 @@ export ENABLE_PRIVILEGED="true"
|
||||
```
|
||||
|
||||
### Lightweight Service
|
||||
|
||||
```bash
|
||||
export APP="nginx"
|
||||
export CTID="400"
|
||||
|
||||
@ -9,30 +9,35 @@ This document provides a comprehensive reference of all functions in `build.func
|
||||
### Initialization Functions
|
||||
|
||||
#### `start()`
|
||||
|
||||
**Purpose**: Main entry point when build.func is sourced or executed
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
|
||||
- Detects execution context (Proxmox host vs container)
|
||||
- Captures hard environment variables
|
||||
- Sets CT_TYPE based on context
|
||||
- Routes to appropriate workflow (install_script or update_script)
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: `CT_TYPE`, `APP`, `CTID`
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: `CT_TYPE`, `APP`, `CTID`
|
||||
|
||||
#### `variables()`
|
||||
|
||||
**Purpose**: Load and resolve all configuration variables using precedence chain
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
|
||||
- Loads app-specific .vars file
|
||||
- Loads global default.vars file
|
||||
- Applies variable precedence chain
|
||||
- Sets all configuration variables
|
||||
**Dependencies**: `base_settings()`
|
||||
**Environment Variables Used**: All configuration variables
|
||||
**Dependencies**: `base_settings()`
|
||||
**Environment Variables Used**: All configuration variables
|
||||
|
||||
#### `base_settings()`
|
||||
|
||||
**Purpose**: Set built-in default values for all configuration variables
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
@ -43,28 +48,33 @@ This document provides a comprehensive reference of all functions in `build.func
|
||||
### UI and Menu Functions
|
||||
|
||||
#### `install_script()`
|
||||
|
||||
**Purpose**: Main installation workflow coordinator
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
|
||||
- Displays installation mode selection menu
|
||||
- Coordinates the entire installation process
|
||||
- Handles user interaction and validation
|
||||
**Dependencies**: `variables()`, `build_container()`, `default_var_settings()`
|
||||
**Environment Variables Used**: `APP`, `CTID`, `var_hostname`
|
||||
**Dependencies**: `variables()`, `build_container()`, `default_var_settings()`
|
||||
**Environment Variables Used**: `APP`, `CTID`, `var_hostname`
|
||||
|
||||
#### `advanced_settings()`
|
||||
|
||||
**Purpose**: Provide advanced configuration options via whiptail menus
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
|
||||
- Displays whiptail menus for configuration
|
||||
- Updates configuration variables based on user input
|
||||
- Validates user selections
|
||||
**Dependencies**: `select_storage()`, `detect_gpu_devices()`
|
||||
**Environment Variables Used**: All configuration variables
|
||||
**Dependencies**: `select_storage()`, `detect_gpu_devices()`
|
||||
**Environment Variables Used**: All configuration variables
|
||||
|
||||
#### `settings_menu()`
|
||||
|
||||
**Purpose**: Display and handle settings configuration menu
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
@ -75,58 +85,68 @@ This document provides a comprehensive reference of all functions in `build.func
|
||||
### Storage Functions
|
||||
|
||||
#### `select_storage()`
|
||||
|
||||
**Purpose**: Handle storage selection for templates and containers
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
|
||||
- Resolves storage preselection
|
||||
- Prompts user for storage selection if needed
|
||||
- Validates storage availability
|
||||
- Sets var_template_storage and var_container_storage
|
||||
**Dependencies**: `resolve_storage_preselect()`, `choose_and_set_storage_for_file()`
|
||||
**Environment Variables Used**: `var_template_storage`, `var_container_storage`, `TEMPLATE_STORAGE`, `CONTAINER_STORAGE`
|
||||
**Dependencies**: `resolve_storage_preselect()`, `choose_and_set_storage_for_file()`
|
||||
**Environment Variables Used**: `var_template_storage`, `var_container_storage`, `TEMPLATE_STORAGE`, `CONTAINER_STORAGE`
|
||||
|
||||
#### `resolve_storage_preselect()`
|
||||
|
||||
**Purpose**: Resolve preselected storage options
|
||||
**Parameters**:
|
||||
|
||||
- `storage_type`: Type of storage (template or container)
|
||||
**Returns**: Storage name if valid, empty if invalid
|
||||
**Side Effects**: Validates storage availability
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: `var_template_storage`, `var_container_storage`
|
||||
**Returns**: Storage name if valid, empty if invalid
|
||||
**Side Effects**: Validates storage availability
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: `var_template_storage`, `var_container_storage`
|
||||
|
||||
#### `choose_and_set_storage_for_file()`
|
||||
|
||||
**Purpose**: Interactive storage selection via whiptail
|
||||
**Parameters**:
|
||||
|
||||
- `storage_type`: Type of storage (template or container)
|
||||
- `content_type`: Content type (vztmpl or rootdir)
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- Displays whiptail menu
|
||||
- Updates storage variables
|
||||
- Validates selection
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: `var_template_storage`, `var_container_storage`
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: `var_template_storage`, `var_container_storage`
|
||||
|
||||
### Container Creation Functions
|
||||
|
||||
#### `build_container()`
|
||||
|
||||
**Purpose**: Validate settings and prepare container creation
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
|
||||
- Validates all configuration
|
||||
- Checks for conflicts
|
||||
- Prepares container configuration
|
||||
- Calls create_lxc_container()
|
||||
**Dependencies**: `create_lxc_container()`
|
||||
**Environment Variables Used**: All configuration variables
|
||||
**Dependencies**: `create_lxc_container()`
|
||||
**Environment Variables Used**: All configuration variables
|
||||
|
||||
#### `create_lxc_container()`
|
||||
|
||||
**Purpose**: Create the actual LXC container
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
|
||||
- Creates LXC container with basic configuration
|
||||
- Configures network settings
|
||||
- Sets up storage and mount points
|
||||
@ -134,108 +154,176 @@ This document provides a comprehensive reference of all functions in `build.func
|
||||
- Sets resource limits
|
||||
- Configures startup options
|
||||
- Starts container
|
||||
**Dependencies**: `configure_gpu_passthrough()`, `fix_gpu_gids()`
|
||||
**Environment Variables Used**: All configuration variables
|
||||
**Dependencies**: `configure_gpu_passthrough()`, `fix_gpu_gids()`
|
||||
**Environment Variables Used**: All configuration variables
|
||||
|
||||
### GPU and Hardware Functions
|
||||
|
||||
#### `detect_gpu_devices()`
|
||||
|
||||
**Purpose**: Detect available GPU hardware on the system
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
|
||||
- Scans for Intel, AMD, and NVIDIA GPUs
|
||||
- Updates var_gpu_type and var_gpu_devices
|
||||
- Determines GPU capabilities
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: `var_gpu_type`, `var_gpu_devices`, `GPU_APPS`
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: `var_gpu_type`, `var_gpu_devices`, `GPU_APPS`
|
||||
|
||||
#### `configure_gpu_passthrough()`
|
||||
|
||||
**Purpose**: Configure GPU passthrough for the container
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
|
||||
- Adds GPU device entries to container config
|
||||
- Configures proper device permissions
|
||||
- Sets up device mapping
|
||||
- Updates /etc/pve/lxc/<ctid>.conf
|
||||
**Dependencies**: `detect_gpu_devices()`
|
||||
**Environment Variables Used**: `var_gpu`, `var_gpu_type`, `var_gpu_devices`, `CTID`
|
||||
**Dependencies**: `detect_gpu_devices()`
|
||||
**Environment Variables Used**: `var_gpu`, `var_gpu_type`, `var_gpu_devices`, `CTID`
|
||||
|
||||
#### `fix_gpu_gids()`
|
||||
|
||||
**Purpose**: Fix GPU group IDs after container creation
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
|
||||
- Updates GPU group IDs in container
|
||||
- Ensures proper GPU access permissions
|
||||
- Configures video and render groups
|
||||
**Dependencies**: `configure_gpu_passthrough()`
|
||||
**Environment Variables Used**: `CTID`, `var_gpu_type`
|
||||
**Dependencies**: `configure_gpu_passthrough()`
|
||||
**Environment Variables Used**: `CTID`, `var_gpu_type`
|
||||
|
||||
### SSH Configuration Functions
|
||||
|
||||
#### `configure_ssh_settings()`
|
||||
|
||||
**Purpose**: Interactive SSH key and access configuration wizard
|
||||
**Parameters**:
|
||||
|
||||
- `step_info` (optional): Step indicator string (e.g., "Step 17/19") for consistent dialog headers
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- Creates temporary file for SSH keys
|
||||
- Discovers and presents available SSH keys from host
|
||||
- Allows manual key entry or folder/glob scanning
|
||||
- Sets `SSH` variable to "yes" or "no" based on user selection
|
||||
- Sets `SSH_AUTHORIZED_KEY` if manual key provided
|
||||
- Populates `SSH_KEYS_FILE` with selected keys
|
||||
**Dependencies**: `ssh_discover_default_files()`, `ssh_build_choices_from_files()`
|
||||
**Environment Variables Used**: `SSH`, `SSH_AUTHORIZED_KEY`, `SSH_KEYS_FILE`
|
||||
|
||||
**SSH Key Source Options**:
|
||||
|
||||
1. `found` - Select from auto-detected host keys
|
||||
2. `manual` - Paste a single public key
|
||||
3. `folder` - Scan custom folder or glob pattern
|
||||
4. `none` - No SSH keys
|
||||
|
||||
**Note**: The "Enable root SSH access?" dialog is always shown, regardless of whether SSH keys or password are configured. This ensures users can always enable SSH access even with automatic login.
|
||||
|
||||
#### `ssh_discover_default_files()`
|
||||
|
||||
**Purpose**: Discover SSH public key files on the host system
|
||||
**Parameters**: None
|
||||
**Returns**: Array of discovered key file paths
|
||||
**Side Effects**: Scans common SSH key locations
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: `var_ssh_import_glob`
|
||||
|
||||
#### `ssh_build_choices_from_files()`
|
||||
|
||||
**Purpose**: Build whiptail checklist choices from SSH key files
|
||||
**Parameters**:
|
||||
|
||||
- Array of file paths to process
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- Sets `CHOICES` array for whiptail checklist
|
||||
- Sets `COUNT` variable with number of keys found
|
||||
- Creates `MAPFILE` for key tag to content mapping
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: `CHOICES`, `COUNT`, `MAPFILE`
|
||||
|
||||
### Settings Persistence Functions
|
||||
|
||||
#### `default_var_settings()`
|
||||
|
||||
**Purpose**: Offer to save current settings as defaults
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
|
||||
- Prompts user to save settings
|
||||
- Saves to default.vars file
|
||||
- Saves to app-specific .vars file
|
||||
**Dependencies**: `maybe_offer_save_app_defaults()`
|
||||
**Environment Variables Used**: All configuration variables
|
||||
**Dependencies**: `maybe_offer_save_app_defaults()`
|
||||
**Environment Variables Used**: All configuration variables
|
||||
|
||||
#### `maybe_offer_save_app_defaults()`
|
||||
|
||||
**Purpose**: Offer to save app-specific defaults
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
|
||||
- Prompts user to save app-specific settings
|
||||
- Saves to app.vars file
|
||||
- Updates app-specific configuration
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: `APP`, `SAVE_APP_DEFAULTS`
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: `APP`, `SAVE_APP_DEFAULTS`
|
||||
|
||||
### Utility Functions
|
||||
|
||||
#### `validate_settings()`
|
||||
|
||||
**Purpose**: Validate all configuration settings
|
||||
**Parameters**: None
|
||||
**Returns**: 0 if valid, 1 if invalid
|
||||
**Side Effects**:
|
||||
|
||||
- Checks for configuration conflicts
|
||||
- Validates resource limits
|
||||
- Validates network configuration
|
||||
- Validates storage configuration
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: All configuration variables
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: All configuration variables
|
||||
|
||||
#### `check_conflicts()`
|
||||
|
||||
**Purpose**: Check for configuration conflicts
|
||||
**Parameters**: None
|
||||
**Returns**: 0 if no conflicts, 1 if conflicts found
|
||||
**Side Effects**:
|
||||
|
||||
- Checks for conflicting settings
|
||||
- Validates resource allocation
|
||||
- Checks network configuration
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: All configuration variables
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: All configuration variables
|
||||
|
||||
#### `cleanup_on_error()`
|
||||
|
||||
**Purpose**: Clean up resources on error
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
|
||||
- Removes partially created containers
|
||||
- Cleans up temporary files
|
||||
- Resets configuration
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: `CTID`
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: `CTID`
|
||||
|
||||
## Function Call Flow
|
||||
|
||||
### Main Installation Flow
|
||||
|
||||
```
|
||||
start()
|
||||
├── variables()
|
||||
@ -259,6 +347,7 @@ start()
|
||||
```
|
||||
|
||||
### Error Handling Flow
|
||||
|
||||
```
|
||||
Error Detection
|
||||
├── validate_settings()
|
||||
@ -271,24 +360,29 @@ Error Detection
|
||||
## Function Dependencies
|
||||
|
||||
### Core Dependencies
|
||||
|
||||
- `start()` → `install_script()` → `build_container()` → `create_lxc_container()`
|
||||
- `variables()` → `base_settings()`
|
||||
- `advanced_settings()` → `select_storage()` → `detect_gpu_devices()`
|
||||
|
||||
### Storage Dependencies
|
||||
|
||||
- `select_storage()` → `resolve_storage_preselect()`
|
||||
- `select_storage()` → `choose_and_set_storage_for_file()`
|
||||
|
||||
### GPU Dependencies
|
||||
|
||||
- `configure_gpu_passthrough()` → `detect_gpu_devices()`
|
||||
- `fix_gpu_gids()` → `configure_gpu_passthrough()`
|
||||
|
||||
### Settings Dependencies
|
||||
|
||||
- `default_var_settings()` → `maybe_offer_save_app_defaults()`
|
||||
|
||||
## Function Usage Examples
|
||||
|
||||
### Basic Container Creation
|
||||
|
||||
```bash
|
||||
# Set required variables
|
||||
export APP="plex"
|
||||
@ -304,6 +398,7 @@ start() # Entry point
|
||||
```
|
||||
|
||||
### Advanced Configuration
|
||||
|
||||
```bash
|
||||
# Set advanced variables
|
||||
export var_os="debian"
|
||||
@ -319,6 +414,7 @@ advanced_settings() # Interactive configuration
|
||||
```
|
||||
|
||||
### GPU Passthrough
|
||||
|
||||
```bash
|
||||
# Enable GPU passthrough
|
||||
export GPU_APPS="plex"
|
||||
@ -331,6 +427,7 @@ fix_gpu_gids() # Fix permissions
|
||||
```
|
||||
|
||||
### Settings Persistence
|
||||
|
||||
```bash
|
||||
# Save settings as defaults
|
||||
export SAVE_DEFAULTS="true"
|
||||
@ -344,15 +441,18 @@ maybe_offer_save_app_defaults() # Save app defaults
|
||||
## Function Error Handling
|
||||
|
||||
### Validation Functions
|
||||
|
||||
- `validate_settings()`: Returns 0 for valid, 1 for invalid
|
||||
- `check_conflicts()`: Returns 0 for no conflicts, 1 for conflicts
|
||||
|
||||
### Error Recovery
|
||||
|
||||
- `cleanup_on_error()`: Cleans up on any error
|
||||
- Error codes are propagated up the call stack
|
||||
- Critical errors cause script termination
|
||||
|
||||
### Error Types
|
||||
|
||||
1. **Configuration Errors**: Invalid settings or conflicts
|
||||
2. **Resource Errors**: Insufficient resources or conflicts
|
||||
3. **Network Errors**: Invalid network configuration
|
||||
|
||||
@ -6,6 +6,16 @@ This directory contains comprehensive documentation for the `build.func` script,
|
||||
|
||||
## Documentation Files
|
||||
|
||||
### 🎛️ [BUILD_FUNC_ADVANCED_SETTINGS.md](./BUILD_FUNC_ADVANCED_SETTINGS.md)
|
||||
Complete reference for the 28-step Advanced Settings wizard, including all configurable options and their inheritance behavior.
|
||||
|
||||
**Contents:**
|
||||
- All 28 wizard steps explained
|
||||
- Default value inheritance
|
||||
- Feature matrix (when to enable each feature)
|
||||
- Confirmation summary format
|
||||
- Usage examples
|
||||
|
||||
### 📊 [BUILD_FUNC_FLOWCHART.md](./BUILD_FUNC_FLOWCHART.md)
|
||||
Visual ASCII flowchart showing the main execution flow, decision trees, and key decision points in the build.func script.
|
||||
|
||||
|
||||
40
frontend/public/json/endurain.json
Normal file
40
frontend/public/json/endurain.json
Normal file
@ -0,0 +1,40 @@
|
||||
{
|
||||
"name": "Endurain",
|
||||
"slug": "endurain",
|
||||
"categories": [
|
||||
24
|
||||
],
|
||||
"date_created": "2025-12-05",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 8080,
|
||||
"documentation": "https://docs.endurain.com/",
|
||||
"website": "https://github.com/joaovitoriasilva/endurain",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/endurain.webp",
|
||||
"config_path": "/opt/endurain/.env",
|
||||
"description": "Endurain is a self-hosted fitness tracking service designed to give users full control over their data and hosting environment. It's similar to Strava but focused on privacy and customization",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/endurain.sh",
|
||||
"resources": {
|
||||
"cpu": 2,
|
||||
"ram": 2048,
|
||||
"hdd": 5,
|
||||
"os": "debian",
|
||||
"version": "13"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": "admin",
|
||||
"password": "admin"
|
||||
},
|
||||
"notes": [
|
||||
{
|
||||
"text": "When using a reverse proxy, edit `/opt/endurain/frontend/app/dist/env.js`.",
|
||||
"type": "info"
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -22,8 +22,8 @@
|
||||
"cpu": 2,
|
||||
"ram": 2048,
|
||||
"hdd": 6,
|
||||
"os": "debian",
|
||||
"version": "13"
|
||||
"os": "ubuntu",
|
||||
"version": "24.04"
|
||||
}
|
||||
}
|
||||
],
|
||||
|
||||
35
frontend/public/json/metube.json
Normal file
35
frontend/public/json/metube.json
Normal file
@ -0,0 +1,35 @@
|
||||
{
|
||||
"name": "MeTube",
|
||||
"slug": "metube",
|
||||
"categories": [
|
||||
11
|
||||
],
|
||||
"date_created": "2025-12-05",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 8081,
|
||||
"documentation": "https://github.com/alexta69/metube/blob/master/README.md",
|
||||
"website": "https://github.com/alexta69/metube",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icon@master/webp/metube.webp",
|
||||
"config_path": "/opt/metube/.env",
|
||||
"description": "MeTube allows you to download videos from YouTube and dozens of other sites.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/metube.sh",
|
||||
"resources": {
|
||||
"cpu": 1,
|
||||
"ram": 2048,
|
||||
"hdd": 10,
|
||||
"os": "debian",
|
||||
"version": "13"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": []
|
||||
}
|
||||
@ -33,11 +33,11 @@
|
||||
},
|
||||
"notes": [
|
||||
{
|
||||
"text": "The integrated daemon config is located at `/root/.config/daemon/config.json`",
|
||||
"text": "To configure the integrated daemon after install is complete, either use the `Create Daemon` menu in the UI, or run `/root/configure_daemon.sh` for automatic configuration",
|
||||
"type": "info"
|
||||
},
|
||||
{
|
||||
"text": "When using a reverse proxy, edit `/opt/netvisor/ui/build/_app/env.js`: add 443 to `PUBLIC_SERVER_PORT` and remove 'default' from `PUBLIC_SERVER_HOSTNAME`.",
|
||||
"text": "The integrated daemon config is located at `/root/.config/daemon/config.json`",
|
||||
"type": "info"
|
||||
}
|
||||
]
|
||||
|
||||
@ -1,8 +1,248 @@
|
||||
[
|
||||
{
|
||||
"name": "openobserve/openobserve",
|
||||
"version": "v0.30.0-rc1",
|
||||
"date": "2025-12-08T11:46:24Z"
|
||||
},
|
||||
{
|
||||
"name": "ventoy/Ventoy",
|
||||
"version": "v1.1.08",
|
||||
"date": "2025-12-08T10:13:51Z"
|
||||
},
|
||||
{
|
||||
"name": "zitadel/zitadel",
|
||||
"version": "v4.7.1",
|
||||
"date": "2025-12-08T10:05:21Z"
|
||||
},
|
||||
{
|
||||
"name": "meilisearch/meilisearch",
|
||||
"version": "latest",
|
||||
"date": "2025-12-08T09:36:54Z"
|
||||
},
|
||||
{
|
||||
"name": "WGDashboard/WGDashboard",
|
||||
"version": "v4.3.0.2",
|
||||
"date": "2025-12-08T09:01:37Z"
|
||||
},
|
||||
{
|
||||
"name": "mattermost/mattermost",
|
||||
"version": "v10.11.8",
|
||||
"date": "2025-11-21T17:06:07Z"
|
||||
},
|
||||
{
|
||||
"name": "nzbgetcom/nzbget",
|
||||
"version": "v25.4",
|
||||
"date": "2025-10-09T10:27:01Z"
|
||||
},
|
||||
{
|
||||
"name": "morpheus65535/bazarr",
|
||||
"version": "v1.5.3",
|
||||
"date": "2025-09-20T12:12:33Z"
|
||||
},
|
||||
{
|
||||
"name": "Jackett/Jackett",
|
||||
"version": "v0.24.420",
|
||||
"date": "2025-12-08T05:55:34Z"
|
||||
},
|
||||
{
|
||||
"name": "firefly-iii/firefly-iii",
|
||||
"version": "v6.4.9",
|
||||
"date": "2025-11-28T20:36:20Z"
|
||||
},
|
||||
{
|
||||
"name": "documenso/documenso",
|
||||
"version": "v2.2.3",
|
||||
"date": "2025-12-04T22:53:40Z"
|
||||
"version": "v2.2.0",
|
||||
"date": "2025-12-08T03:33:34Z"
|
||||
},
|
||||
{
|
||||
"name": "chrisbenincasa/tunarr",
|
||||
"version": "v0.23.0-alpha.31",
|
||||
"date": "2025-12-08T02:39:59Z"
|
||||
},
|
||||
{
|
||||
"name": "jeedom/core",
|
||||
"version": "4.5",
|
||||
"date": "2025-12-08T00:27:05Z"
|
||||
},
|
||||
{
|
||||
"name": "steveiliop56/tinyauth",
|
||||
"version": "v4.1.0",
|
||||
"date": "2025-11-23T12:13:34Z"
|
||||
},
|
||||
{
|
||||
"name": "maxdorninger/MediaManager",
|
||||
"version": "v1.10.0",
|
||||
"date": "2025-12-07T23:41:51Z"
|
||||
},
|
||||
{
|
||||
"name": "Part-DB/Part-DB-server",
|
||||
"version": "v2.3.0",
|
||||
"date": "2025-12-07T21:58:43Z"
|
||||
},
|
||||
{
|
||||
"name": "traccar/traccar",
|
||||
"version": "v6.11.1",
|
||||
"date": "2025-12-07T19:19:08Z"
|
||||
},
|
||||
{
|
||||
"name": "keycloak/keycloak",
|
||||
"version": "26.4.7",
|
||||
"date": "2025-12-01T08:14:11Z"
|
||||
},
|
||||
{
|
||||
"name": "seerr-team/seerr",
|
||||
"version": "preview-test-fix-subscriptions",
|
||||
"date": "2025-12-07T14:31:55Z"
|
||||
},
|
||||
{
|
||||
"name": "bluenviron/mediamtx",
|
||||
"version": "v1.15.5",
|
||||
"date": "2025-12-07T12:24:21Z"
|
||||
},
|
||||
{
|
||||
"name": "BerriAI/litellm",
|
||||
"version": "v1.80.8.rc.1",
|
||||
"date": "2025-12-07T01:36:40Z"
|
||||
},
|
||||
{
|
||||
"name": "umami-software/umami",
|
||||
"version": "v2.20.1",
|
||||
"date": "2025-12-07T01:14:23Z"
|
||||
},
|
||||
{
|
||||
"name": "sysadminsmedia/homebox",
|
||||
"version": "v0.22.0-rc.2",
|
||||
"date": "2025-12-06T21:24:28Z"
|
||||
},
|
||||
{
|
||||
"name": "Koenkk/zigbee2mqtt",
|
||||
"version": "2.7.1",
|
||||
"date": "2025-12-06T20:30:34Z"
|
||||
},
|
||||
{
|
||||
"name": "blakeblackshear/frigate",
|
||||
"version": "v0.14.1",
|
||||
"date": "2024-08-29T22:32:51Z"
|
||||
},
|
||||
{
|
||||
"name": "navidrome/navidrome",
|
||||
"version": "v0.59.0",
|
||||
"date": "2025-12-06T18:08:42Z"
|
||||
},
|
||||
{
|
||||
"name": "Brandawg93/PeaNUT",
|
||||
"version": "v5.19.2",
|
||||
"date": "2025-12-06T14:56:53Z"
|
||||
},
|
||||
{
|
||||
"name": "openhab/openhab-core",
|
||||
"version": "4.3.9",
|
||||
"date": "2025-12-06T14:31:36Z"
|
||||
},
|
||||
{
|
||||
"name": "fuma-nama/fumadocs",
|
||||
"version": "fumadocs-openapi@10.1.1",
|
||||
"date": "2025-12-06T11:27:58Z"
|
||||
},
|
||||
{
|
||||
"name": "YunoHost/yunohost",
|
||||
"version": "debian/13.0.2",
|
||||
"date": "2025-12-06T10:46:12Z"
|
||||
},
|
||||
{
|
||||
"name": "toniebox-reverse-engineering/teddycloud",
|
||||
"version": "tc_v0.6.5",
|
||||
"date": "2025-12-06T10:32:07Z"
|
||||
},
|
||||
{
|
||||
"name": "inspircd/inspircd",
|
||||
"version": "v4.9.0",
|
||||
"date": "2025-12-06T08:58:40Z"
|
||||
},
|
||||
{
|
||||
"name": "chrisvel/tududi",
|
||||
"version": "v0.87",
|
||||
"date": "2025-12-06T07:36:26Z"
|
||||
},
|
||||
{
|
||||
"name": "tobychui/zoraxy",
|
||||
"version": "v3.3.0",
|
||||
"date": "2025-12-06T06:18:23Z"
|
||||
},
|
||||
{
|
||||
"name": "theonedev/onedev",
|
||||
"version": "v13.1.3",
|
||||
"date": "2025-12-06T04:40:09Z"
|
||||
},
|
||||
{
|
||||
"name": "ollama/ollama",
|
||||
"version": "v0.13.2-rc1",
|
||||
"date": "2025-12-04T23:19:06Z"
|
||||
},
|
||||
{
|
||||
"name": "Stirling-Tools/Stirling-PDF",
|
||||
"version": "v2.1.1",
|
||||
"date": "2025-12-05T23:48:08Z"
|
||||
},
|
||||
{
|
||||
"name": "home-assistant/core",
|
||||
"version": "2025.12.1",
|
||||
"date": "2025-12-05T21:10:31Z"
|
||||
},
|
||||
{
|
||||
"name": "n8n-io/n8n",
|
||||
"version": "n8n@1.122.5",
|
||||
"date": "2025-12-04T14:09:39Z"
|
||||
},
|
||||
{
|
||||
"name": "homarr-labs/homarr",
|
||||
"version": "v1.45.2",
|
||||
"date": "2025-12-05T19:17:09Z"
|
||||
},
|
||||
{
|
||||
"name": "booklore-app/booklore",
|
||||
"version": "v1.13.2",
|
||||
"date": "2025-12-05T16:03:08Z"
|
||||
},
|
||||
{
|
||||
"name": "tailscale/tailscale",
|
||||
"version": "v1.92.1",
|
||||
"date": "2025-12-05T15:53:22Z"
|
||||
},
|
||||
{
|
||||
"name": "FlowiseAI/Flowise",
|
||||
"version": "flowise@3.0.12",
|
||||
"date": "2025-12-05T15:02:01Z"
|
||||
},
|
||||
{
|
||||
"name": "emqx/emqx",
|
||||
"version": "e6.1.0-streams.1",
|
||||
"date": "2025-12-05T12:27:36Z"
|
||||
},
|
||||
{
|
||||
"name": "Luligu/matterbridge",
|
||||
"version": "3.4.2",
|
||||
"date": "2025-12-05T12:20:54Z"
|
||||
},
|
||||
{
|
||||
"name": "node-red/node-red",
|
||||
"version": "4.1.2",
|
||||
"date": "2025-12-03T16:12:05Z"
|
||||
},
|
||||
{
|
||||
"name": "traefik/traefik",
|
||||
"version": "v3.6.4",
|
||||
"date": "2025-12-05T09:58:17Z"
|
||||
},
|
||||
{
|
||||
"name": "alexta69/metube",
|
||||
"version": "2025.12.05",
|
||||
"date": "2025-12-05T09:45:02Z"
|
||||
},
|
||||
{
|
||||
"name": "esphome/esphome",
|
||||
"version": "2025.11.4",
|
||||
"date": "2025-12-05T03:54:58Z"
|
||||
},
|
||||
{
|
||||
"name": "transmission/transmission",
|
||||
@ -29,31 +269,11 @@
|
||||
"version": "v0.107.70",
|
||||
"date": "2025-12-03T16:12:15Z"
|
||||
},
|
||||
{
|
||||
"name": "chrisvel/tududi",
|
||||
"version": "v0.86.1",
|
||||
"date": "2025-11-14T05:05:44Z"
|
||||
},
|
||||
{
|
||||
"name": "emqx/emqx",
|
||||
"version": "e6.1.0-streams.2",
|
||||
"date": "2025-12-04T16:02:45Z"
|
||||
},
|
||||
{
|
||||
"name": "traefik/traefik",
|
||||
"version": "v3.6.3",
|
||||
"date": "2025-12-04T16:02:05Z"
|
||||
},
|
||||
{
|
||||
"name": "wazuh/wazuh",
|
||||
"version": "coverity-w49-4.14.2",
|
||||
"date": "2025-12-02T14:01:48Z"
|
||||
},
|
||||
{
|
||||
"name": "n8n-io/n8n",
|
||||
"version": "n8n@1.122.5",
|
||||
"date": "2025-12-04T14:09:39Z"
|
||||
},
|
||||
{
|
||||
"name": "crowdsecurity/crowdsec",
|
||||
"version": "v1.7.4",
|
||||
@ -64,11 +284,6 @@
|
||||
"version": "v0.34.2",
|
||||
"date": "2025-12-04T13:08:18Z"
|
||||
},
|
||||
{
|
||||
"name": "fuma-nama/fumadocs",
|
||||
"version": "fumadocs-mdx@14.1.0",
|
||||
"date": "2025-12-04T09:47:35Z"
|
||||
},
|
||||
{
|
||||
"name": "glpi-project/glpi",
|
||||
"version": "11.0.4",
|
||||
@ -79,31 +294,6 @@
|
||||
"version": "v1.6.6",
|
||||
"date": "2025-11-24T15:30:21Z"
|
||||
},
|
||||
{
|
||||
"name": "umami-software/umami",
|
||||
"version": "v3.0.2",
|
||||
"date": "2025-12-04T08:12:43Z"
|
||||
},
|
||||
{
|
||||
"name": "morpheus65535/bazarr",
|
||||
"version": "v1.5.3",
|
||||
"date": "2025-09-20T12:12:33Z"
|
||||
},
|
||||
{
|
||||
"name": "Jackett/Jackett",
|
||||
"version": "v0.24.402",
|
||||
"date": "2025-12-04T05:56:18Z"
|
||||
},
|
||||
{
|
||||
"name": "BerriAI/litellm",
|
||||
"version": "v1.80.7.dev.3",
|
||||
"date": "2025-12-04T05:34:02Z"
|
||||
},
|
||||
{
|
||||
"name": "ollama/ollama",
|
||||
"version": "v0.13.1",
|
||||
"date": "2025-12-02T18:58:08Z"
|
||||
},
|
||||
{
|
||||
"name": "kyantech/Palmr",
|
||||
"version": "v3.3.1-beta",
|
||||
@ -114,16 +304,6 @@
|
||||
"version": "v1.2.0-experimental-sql-indexing",
|
||||
"date": "2025-12-04T01:35:46Z"
|
||||
},
|
||||
{
|
||||
"name": "jeedom/core",
|
||||
"version": "4.5",
|
||||
"date": "2025-12-04T00:27:05Z"
|
||||
},
|
||||
{
|
||||
"name": "steveiliop56/tinyauth",
|
||||
"version": "v4.1.0",
|
||||
"date": "2025-11-23T12:13:34Z"
|
||||
},
|
||||
{
|
||||
"name": "rcourtman/Pulse",
|
||||
"version": "v4.36.2",
|
||||
@ -134,71 +314,31 @@
|
||||
"version": "v5.42.1",
|
||||
"date": "2025-12-03T22:42:22Z"
|
||||
},
|
||||
{
|
||||
"name": "Stirling-Tools/Stirling-PDF",
|
||||
"version": "v2.1.0",
|
||||
"date": "2025-12-03T21:29:10Z"
|
||||
},
|
||||
{
|
||||
"name": "danielbrendel/hortusfox-web",
|
||||
"version": "v5.5",
|
||||
"date": "2025-12-03T21:20:30Z"
|
||||
},
|
||||
{
|
||||
"name": "chrisbenincasa/tunarr",
|
||||
"version": "v0.23.0-alpha.28",
|
||||
"date": "2025-12-03T20:32:43Z"
|
||||
},
|
||||
{
|
||||
"name": "gelbphoenix/autocaliweb",
|
||||
"version": "v0.11.1",
|
||||
"date": "2025-12-03T18:24:51Z"
|
||||
},
|
||||
{
|
||||
"name": "home-assistant/core",
|
||||
"version": "2025.12.0",
|
||||
"date": "2025-12-03T18:07:51Z"
|
||||
},
|
||||
{
|
||||
"name": "actualbudget/actual",
|
||||
"version": "v25.12.0",
|
||||
"date": "2025-12-03T17:45:09Z"
|
||||
},
|
||||
{
|
||||
"name": "homarr-labs/homarr",
|
||||
"version": "v1.45.1",
|
||||
"date": "2025-12-03T17:43:51Z"
|
||||
},
|
||||
{
|
||||
"name": "keycloak/keycloak",
|
||||
"version": "26.4.7",
|
||||
"date": "2025-12-01T08:14:11Z"
|
||||
},
|
||||
{
|
||||
"name": "karakeep-app/karakeep",
|
||||
"version": "v0.29.1",
|
||||
"date": "2025-12-03T16:56:18Z"
|
||||
},
|
||||
{
|
||||
"name": "esphome/esphome",
|
||||
"version": "2025.11.3",
|
||||
"date": "2025-12-03T16:37:01Z"
|
||||
},
|
||||
{
|
||||
"name": "node-red/node-red",
|
||||
"version": "4.1.2",
|
||||
"date": "2025-12-03T16:12:05Z"
|
||||
},
|
||||
{
|
||||
"name": "BookStackApp/BookStack",
|
||||
"version": "v25.11.5",
|
||||
"date": "2025-12-03T14:51:03Z"
|
||||
},
|
||||
{
|
||||
"name": "meilisearch/meilisearch",
|
||||
"version": "latest",
|
||||
"date": "2025-12-03T14:19:01Z"
|
||||
},
|
||||
{
|
||||
"name": "Graylog2/graylog2-server",
|
||||
"version": "6.2.10",
|
||||
@ -214,16 +354,6 @@
|
||||
"version": "v0.104.0",
|
||||
"date": "2025-12-03T06:48:38Z"
|
||||
},
|
||||
{
|
||||
"name": "mattermost/mattermost",
|
||||
"version": "v10.11.8",
|
||||
"date": "2025-11-21T17:06:07Z"
|
||||
},
|
||||
{
|
||||
"name": "openobserve/openobserve",
|
||||
"version": "v0.20.2",
|
||||
"date": "2025-12-03T02:20:57Z"
|
||||
},
|
||||
{
|
||||
"name": "hyperion-project/hyperion.ng",
|
||||
"version": "2.1.1",
|
||||
@ -237,7 +367,7 @@
|
||||
{
|
||||
"name": "mealie-recipes/mealie",
|
||||
"version": "v3.6.1",
|
||||
"date": "2025-12-02T23:08:41Z"
|
||||
"date": "2025-12-02T22:54:10Z"
|
||||
},
|
||||
{
|
||||
"name": "apache/tomcat",
|
||||
@ -284,21 +414,6 @@
|
||||
"version": "jenkins-2.540",
|
||||
"date": "2025-12-02T16:56:49Z"
|
||||
},
|
||||
{
|
||||
"name": "nzbgetcom/nzbget",
|
||||
"version": "v25.4",
|
||||
"date": "2025-10-09T10:27:01Z"
|
||||
},
|
||||
{
|
||||
"name": "Brandawg93/PeaNUT",
|
||||
"version": "v5.19.0",
|
||||
"date": "2025-12-02T14:58:59Z"
|
||||
},
|
||||
{
|
||||
"name": "tobychui/zoraxy",
|
||||
"version": "v3.3.0-rc3",
|
||||
"date": "2025-12-02T13:45:13Z"
|
||||
},
|
||||
{
|
||||
"name": "docker/compose",
|
||||
"version": "v5.0.0",
|
||||
@ -319,11 +434,6 @@
|
||||
"version": "v2.0.12",
|
||||
"date": "2025-12-02T08:11:24Z"
|
||||
},
|
||||
{
|
||||
"name": "booklore-app/booklore",
|
||||
"version": "v1.13.1",
|
||||
"date": "2025-12-02T03:59:00Z"
|
||||
},
|
||||
{
|
||||
"name": "advplyr/audiobookshelf",
|
||||
"version": "v2.31.0",
|
||||
@ -349,11 +459,6 @@
|
||||
"version": "v0.16.0",
|
||||
"date": "2025-12-01T21:35:19Z"
|
||||
},
|
||||
{
|
||||
"name": "Koenkk/zigbee2mqtt",
|
||||
"version": "2.7.0",
|
||||
"date": "2025-12-01T20:26:49Z"
|
||||
},
|
||||
{
|
||||
"name": "slskd/slskd",
|
||||
"version": "0.24.1",
|
||||
@ -379,11 +484,6 @@
|
||||
"version": "0.211.0",
|
||||
"date": "2025-12-01T11:22:11Z"
|
||||
},
|
||||
{
|
||||
"name": "Luligu/matterbridge",
|
||||
"version": "3.4.1",
|
||||
"date": "2025-12-01T11:06:39Z"
|
||||
},
|
||||
{
|
||||
"name": "cockpit-project/cockpit",
|
||||
"version": "310.6",
|
||||
@ -394,11 +494,6 @@
|
||||
"version": "251130-b3068414c",
|
||||
"date": "2025-12-01T05:07:31Z"
|
||||
},
|
||||
{
|
||||
"name": "firefly-iii/firefly-iii",
|
||||
"version": "v6.4.9",
|
||||
"date": "2025-11-28T20:36:20Z"
|
||||
},
|
||||
{
|
||||
"name": "jellyfin/jellyfin",
|
||||
"version": "v10.11.4",
|
||||
@ -434,11 +529,6 @@
|
||||
"version": "0.11.1",
|
||||
"date": "2025-11-30T14:54:03Z"
|
||||
},
|
||||
{
|
||||
"name": "openhab/openhab-core",
|
||||
"version": "5.1.0.M3",
|
||||
"date": "2025-11-30T14:36:37Z"
|
||||
},
|
||||
{
|
||||
"name": "healthchecks/healthchecks",
|
||||
"version": "v3.13",
|
||||
@ -479,11 +569,6 @@
|
||||
"version": "v4.39.15",
|
||||
"date": "2025-11-29T12:13:04Z"
|
||||
},
|
||||
{
|
||||
"name": "alexta69/metube",
|
||||
"version": "2025.11.29",
|
||||
"date": "2025-11-29T07:59:21Z"
|
||||
},
|
||||
{
|
||||
"name": "FlareSolverr/FlareSolverr",
|
||||
"version": "v3.4.6",
|
||||
@ -519,31 +604,16 @@
|
||||
"version": "v6.3",
|
||||
"date": "2025-11-27T18:12:22Z"
|
||||
},
|
||||
{
|
||||
"name": "theonedev/onedev",
|
||||
"version": "v13.1.2",
|
||||
"date": "2025-11-27T12:48:22Z"
|
||||
},
|
||||
{
|
||||
"name": "ipfs/kubo",
|
||||
"version": "v0.39.0",
|
||||
"date": "2025-11-27T03:47:38Z"
|
||||
},
|
||||
{
|
||||
"name": "YunoHost/yunohost",
|
||||
"version": "debian/12.1.36",
|
||||
"date": "2025-11-27T00:33:48Z"
|
||||
},
|
||||
{
|
||||
"name": "gristlabs/grist-core",
|
||||
"version": "v1.7.8",
|
||||
"date": "2025-11-26T22:35:03Z"
|
||||
},
|
||||
{
|
||||
"name": "tailscale/tailscale",
|
||||
"version": "v1.93.0-pre",
|
||||
"date": "2025-11-26T20:50:59Z"
|
||||
},
|
||||
{
|
||||
"name": "jhuckaby/Cronicle",
|
||||
"version": "v0.9.101",
|
||||
@ -574,11 +644,6 @@
|
||||
"version": "release-1.24.2",
|
||||
"date": "2025-11-26T11:22:30Z"
|
||||
},
|
||||
{
|
||||
"name": "seerr-team/seerr",
|
||||
"version": "preview-test-fix-subscriptions",
|
||||
"date": "2025-11-25T22:11:46Z"
|
||||
},
|
||||
{
|
||||
"name": "wizarrrr/wizarr",
|
||||
"version": "v2025.11.3",
|
||||
@ -689,11 +754,6 @@
|
||||
"version": "mariadb-12.1.2",
|
||||
"date": "2025-11-18T15:16:21Z"
|
||||
},
|
||||
{
|
||||
"name": "bluenviron/mediamtx",
|
||||
"version": "v1.15.4",
|
||||
"date": "2025-11-21T01:21:03Z"
|
||||
},
|
||||
{
|
||||
"name": "TasmoAdmin/TasmoAdmin",
|
||||
"version": "v4.3.2",
|
||||
@ -804,11 +864,6 @@
|
||||
"version": "v6.0.4.10291",
|
||||
"date": "2025-11-16T22:39:01Z"
|
||||
},
|
||||
{
|
||||
"name": "sysadminsmedia/homebox",
|
||||
"version": "v0.21.0",
|
||||
"date": "2025-08-23T18:33:53Z"
|
||||
},
|
||||
{
|
||||
"name": "binwiederhier/ntfy",
|
||||
"version": "v2.15.0",
|
||||
@ -829,21 +884,11 @@
|
||||
"version": "v25.11.1",
|
||||
"date": "2025-11-16T13:04:21Z"
|
||||
},
|
||||
{
|
||||
"name": "FlowiseAI/Flowise",
|
||||
"version": "flowise@3.0.11",
|
||||
"date": "2025-11-16T01:29:06Z"
|
||||
},
|
||||
{
|
||||
"name": "cloudreve/cloudreve",
|
||||
"version": "4.10.1",
|
||||
"date": "2025-11-15T04:36:48Z"
|
||||
},
|
||||
{
|
||||
"name": "zitadel/zitadel",
|
||||
"version": "v4.7.0",
|
||||
"date": "2025-11-14T09:45:13Z"
|
||||
},
|
||||
{
|
||||
"name": "runtipi/runtipi",
|
||||
"version": "v4.6.5",
|
||||
@ -879,11 +924,6 @@
|
||||
"version": "REL_13_23",
|
||||
"date": "2025-11-10T21:59:18Z"
|
||||
},
|
||||
{
|
||||
"name": "navidrome/navidrome",
|
||||
"version": "v0.58.5",
|
||||
"date": "2025-11-09T19:12:41Z"
|
||||
},
|
||||
{
|
||||
"name": "pelican-dev/panel",
|
||||
"version": "v1.0.0-beta28",
|
||||
@ -974,11 +1014,6 @@
|
||||
"version": "v3.0.9",
|
||||
"date": "2025-11-04T07:28:45Z"
|
||||
},
|
||||
{
|
||||
"name": "maxdorninger/MediaManager",
|
||||
"version": "v1.9.1",
|
||||
"date": "2025-11-02T21:14:50Z"
|
||||
},
|
||||
{
|
||||
"name": "motioneye-project/motioneye",
|
||||
"version": "0.42.1",
|
||||
@ -1044,11 +1079,6 @@
|
||||
"version": "2.0.2",
|
||||
"date": "2025-10-22T17:03:54Z"
|
||||
},
|
||||
{
|
||||
"name": "Part-DB/Part-DB-server",
|
||||
"version": "v2.2.1",
|
||||
"date": "2025-10-19T14:30:11Z"
|
||||
},
|
||||
{
|
||||
"name": "benzino77/tasmocompiler",
|
||||
"version": "v13.0.0",
|
||||
@ -1074,11 +1104,6 @@
|
||||
"version": "v2.13.1",
|
||||
"date": "2025-10-15T13:29:37Z"
|
||||
},
|
||||
{
|
||||
"name": "blakeblackshear/frigate",
|
||||
"version": "v0.14.1",
|
||||
"date": "2024-08-29T22:32:51Z"
|
||||
},
|
||||
{
|
||||
"name": "rogerfar/rdt-client",
|
||||
"version": "v2.0.119",
|
||||
@ -1144,11 +1169,6 @@
|
||||
"version": "v2.7.3",
|
||||
"date": "2025-09-21T12:07:19Z"
|
||||
},
|
||||
{
|
||||
"name": "traccar/traccar",
|
||||
"version": "v6.10.0",
|
||||
"date": "2025-09-20T15:40:36Z"
|
||||
},
|
||||
{
|
||||
"name": "mmastrac/stylus",
|
||||
"version": "v0.17.0",
|
||||
@ -1169,11 +1189,6 @@
|
||||
"version": "v0.23.0",
|
||||
"date": "2025-09-17T10:15:51Z"
|
||||
},
|
||||
{
|
||||
"name": "WGDashboard/WGDashboard",
|
||||
"version": "v4.3.0.1",
|
||||
"date": "2025-09-17T08:50:39Z"
|
||||
},
|
||||
{
|
||||
"name": "Checkmk/checkmk",
|
||||
"version": "v2.4.0p12",
|
||||
@ -1239,11 +1254,6 @@
|
||||
"version": "0.6.25",
|
||||
"date": "2025-08-24T08:51:55Z"
|
||||
},
|
||||
{
|
||||
"name": "ventoy/Ventoy",
|
||||
"version": "v1.1.07",
|
||||
"date": "2025-08-18T16:13:54Z"
|
||||
},
|
||||
{
|
||||
"name": "lldap/lldap",
|
||||
"version": "v0.6.2",
|
||||
@ -1289,11 +1299,6 @@
|
||||
"version": "v1.28.3",
|
||||
"date": "2025-08-06T12:32:02Z"
|
||||
},
|
||||
{
|
||||
"name": "inspircd/inspircd",
|
||||
"version": "v4.8.0",
|
||||
"date": "2025-08-02T09:12:10Z"
|
||||
},
|
||||
{
|
||||
"name": "Suwayomi/Suwayomi-Server",
|
||||
"version": "v2.1.1867",
|
||||
@ -1454,11 +1459,6 @@
|
||||
"version": "v2.4.2",
|
||||
"date": "2025-03-08T10:49:04Z"
|
||||
},
|
||||
{
|
||||
"name": "toniebox-reverse-engineering/teddycloud",
|
||||
"version": "tc_v0.6.4",
|
||||
"date": "2025-03-05T15:43:40Z"
|
||||
},
|
||||
{
|
||||
"name": "bitmagnet-io/bitmagnet",
|
||||
"version": "v0.10.0",
|
||||
|
||||
@ -23,7 +23,7 @@
|
||||
"ram": 4096,
|
||||
"hdd": 8,
|
||||
"os": "debian",
|
||||
"version": "13"
|
||||
"version": "12"
|
||||
}
|
||||
}
|
||||
],
|
||||
|
||||
@ -34,9 +34,4 @@ export const FAQ_Items = [
|
||||
content:
|
||||
"If an LXC script fails, run it again using Verbose mode. Standard mode hides detailed output for neatness, showing only progress. Verbose mode displays all messages, which helps you (and us) diagnose the error. Include this verbose output if you report the issue.",
|
||||
},
|
||||
{
|
||||
title: "What does \"Updatable\" and \"Not updatable\" mean?",
|
||||
content:
|
||||
"Updatable means that script has a function that is used to update the installed application to the latest version available. Not updatable means that script doesn't have a function that can safely update the application to the latest version available, so only the LXC OS is updated.",
|
||||
},
|
||||
];
|
||||
|
||||
@ -25,7 +25,7 @@ msg_ok "Installed Dependencies"
|
||||
PYTHON_VERSION="3.13" setup_uv
|
||||
NODE_VERSION="22" NODE_MODULE="pnpm@latest" setup_nodejs
|
||||
PG_VERSION="17" PG_MODULES="postgis" setup_postgresql
|
||||
PG_DB_NAME="adventurelog_db" PG_DB_USER="adventurelog_user" setup_postgresql_db
|
||||
PG_DB_NAME="adventurelog_db" PG_DB_USER="adventurelog_user" PG_DB_EXTENSIONS="postgis" setup_postgresql_db
|
||||
fetch_and_deploy_gh_release "adventurelog" "seanmorley15/adventurelog"
|
||||
import_local_ip
|
||||
|
||||
|
||||
@ -43,6 +43,7 @@ if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
||||
jq
|
||||
|
||||
sed -i 's|# *include "mod_fastcgi.conf"|include "mod_fastcgi.conf"|' /etc/lighttpd/lighttpd.conf
|
||||
sed -i 's|/usr/bin/php-cgi|/usr/bin/php-cgi83|g' /etc/lighttpd/mod_fastcgi.conf
|
||||
mkdir -p /var/www/localhost/htdocs
|
||||
ADMINER_VERSION=$(curl -fsSL https://api.github.com/repos/vrana/adminer/releases/latest | jq -r '.tag_name' | sed 's/^v//')
|
||||
curl -fsSL "https://github.com/vrana/adminer/releases/download/v${ADMINER_VERSION}/adminer-${ADMINER_VERSION}.php" -o /var/www/localhost/htdocs/adminer.php
|
||||
|
||||
@ -56,6 +56,7 @@ if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
||||
jq
|
||||
|
||||
sed -i 's|# *include "mod_fastcgi.conf"|include "mod_fastcgi.conf"|' /etc/lighttpd/lighttpd.conf
|
||||
sed -i 's|/usr/bin/php-cgi|/usr/bin/php-cgi83|g' /etc/lighttpd/mod_fastcgi.conf
|
||||
mkdir -p /var/www/localhost/htdocs
|
||||
ADMINER_VERSION=$(curl -fsSL https://api.github.com/repos/vrana/adminer/releases/latest | jq -r '.tag_name' | sed 's/^v//')
|
||||
curl -fsSL "https://github.com/vrana/adminer/releases/download/v${ADMINER_VERSION}/adminer-${ADMINER_VERSION}.php" -o /var/www/localhost/htdocs/adminer.php
|
||||
|
||||
@ -62,11 +62,13 @@ install -d -m 755 \
|
||||
/data/uploads/{m3us,epgs} \
|
||||
/data/{m3us,epgs}
|
||||
chown -R root:root /data
|
||||
DJANGO_SECRET=$(openssl rand -base64 48 | tr -dc 'a-zA-Z0-9' | cut -c1-50)
|
||||
export DATABASE_URL="postgresql://${DB_USER}:${DB_PASS}@localhost:5432/${DB_NAME}"
|
||||
export POSTGRES_DB=$DB_NAME
|
||||
export POSTGRES_USER=$DB_USER
|
||||
export POSTGRES_PASSWORD=$DB_PASS
|
||||
export POSTGRES_HOST=localhost
|
||||
export DJANGO_SECRET_KEY=$DJANGO_SECRET
|
||||
$STD uv run python manage.py migrate --noinput
|
||||
$STD uv run python manage.py collectstatic --noinput
|
||||
cat <<EOF >/opt/dispatcharr/.env
|
||||
@ -76,6 +78,7 @@ POSTGRES_USER=$DB_USER
|
||||
POSTGRES_PASSWORD=$DB_PASS
|
||||
POSTGRES_HOST=localhost
|
||||
CELERY_BROKER_URL=redis://localhost:6379/0
|
||||
DJANGO_SECRET_KEY=$DJANGO_SECRET
|
||||
EOF
|
||||
cd /opt/dispatcharr/frontend
|
||||
$STD npm install --legacy-peer-deps
|
||||
|
||||
@ -64,7 +64,7 @@ Restart=always
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl start --now -q domain-locker
|
||||
systemctl enable -q --now domain-locker
|
||||
msg_info "Created Service"
|
||||
|
||||
motd_ssh
|
||||
|
||||
121
install/endurain-install.sh
Normal file
121
install/endurain-install.sh
Normal file
@ -0,0 +1,121 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: johanngrobe
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/joaovitoriasilva/endurain
|
||||
|
||||
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 \
|
||||
default-libmysqlclient-dev \
|
||||
build-essential \
|
||||
pkg-config
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
PYTHON_VERSION="3.13" setup_uv
|
||||
NODE_VERSION="24" setup_nodejs
|
||||
PG_VERSION="17" PG_MODULES="postgis" setup_postgresql
|
||||
PG_DB_NAME="enduraindb" PG_DB_USER="endurain" setup_postgresql_db
|
||||
import_local_ip
|
||||
fetch_and_deploy_gh_release "endurain" "joaovitoriasilva/endurain" "tarball" "latest" "/opt/endurain"
|
||||
|
||||
msg_info "Setting up Endurain"
|
||||
cd /opt/endurain
|
||||
rm -rf \
|
||||
/opt/endurain/{docs,example.env,screenshot_01.png} \
|
||||
/opt/endurain/docker* \
|
||||
/opt/endurain/*.yml
|
||||
mkdir -p /opt/endurain_data/{data,logs}
|
||||
SECRET_KEY=$(openssl rand -hex 32)
|
||||
FERNET_KEY=$(openssl rand -base64 32)
|
||||
ENDURAIN_HOST=http://${LOCAL_IP}:8080
|
||||
cat <<EOF >/opt/endurain/.env
|
||||
DB_PASSWORD=${PG_DB_PASS}
|
||||
|
||||
SECRET_KEY=${SECRET_KEY}
|
||||
FERNET_KEY=${FERNET_KEY}
|
||||
|
||||
TZ=Europe/Berlin
|
||||
ENDURAIN_HOST=${ENDURAIN_HOST}
|
||||
BEHIND_PROXY=false
|
||||
|
||||
POSTGRES_DB=${PG_DB_NAME}
|
||||
POSTGRES_USER=${PG_DB_USER}
|
||||
PGDATA=/var/lib/postgresql/${PG_DB_NAME}
|
||||
|
||||
DB_DATABASE=${PG_DB_NAME}
|
||||
DB_USER=${PG_DB_USER}
|
||||
DB_PORT=5432
|
||||
DB_HOST=localhost
|
||||
|
||||
DATABASE_URL=postgresql+psycopg://${PG_DB_USER}:${PG_DB_PASS}@localhost:5432/${PG_DB_NAME}
|
||||
|
||||
BACKEND_DIR="/opt/endurain/backend/app"
|
||||
FRONTEND_DIR="/opt/endurain/frontend/app/dist"
|
||||
DATA_DIR="/opt/endurain_data/data"
|
||||
LOGS_DIR="/opt/endurain_data/logs"
|
||||
|
||||
#SMTP_HOST=smtp.protonmail.ch
|
||||
#SMTP_PORT=587
|
||||
#SMTP_USERNAME=your-email@example.com
|
||||
#SMTP_PASSWORD=your-app-password
|
||||
#SMTP_SECURE=true
|
||||
#SMTP_SECURE_TYPE=starttls
|
||||
EOF
|
||||
msg_ok "Setup Endurain"
|
||||
|
||||
msg_info "Building Frontend"
|
||||
cd /opt/endurain/frontend/app
|
||||
$STD npm ci --prefer-offline
|
||||
$STD npm run build
|
||||
cat <<EOF >/opt/endurain/frontend/app/dist/env.js
|
||||
window.env = {
|
||||
ENDURAIN_HOST: "${ENDURAIN_HOST}"
|
||||
}
|
||||
EOF
|
||||
msg_ok "Built Frontend"
|
||||
|
||||
msg_info "Setting up Backend"
|
||||
cd /opt/endurain/backend
|
||||
$STD uv tool install poetry
|
||||
$STD uv tool update-shell
|
||||
export PATH="/root/.local/bin:$PATH"
|
||||
$STD poetry self add poetry-plugin-export
|
||||
$STD poetry export -f requirements.txt --output requirements.txt --without-hashes
|
||||
$STD uv venv
|
||||
$STD uv pip install -r requirements.txt
|
||||
msg_ok "Setup Backend"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/endurain.service
|
||||
[Unit]
|
||||
Description=Endurain FastAPI Backend
|
||||
After=network.target postgresql.service
|
||||
|
||||
[Service]
|
||||
WorkingDirectory=/opt/endurain/backend/app
|
||||
EnvironmentFile=/opt/endurain/.env
|
||||
ExecStart=/opt/endurain/backend/.venv/bin/uvicorn main:app --host 0.0.0.0 --port 8080
|
||||
Restart=always
|
||||
RestartSec=5
|
||||
User=root
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now endurain
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
@ -16,7 +16,7 @@ update_os
|
||||
msg_info "Setting up InfluxDB Repository"
|
||||
setup_deb822_repo \
|
||||
"influxdata" \
|
||||
"https://repos.influxdata.com/influxdata-archive_compat.key" \
|
||||
"https://repos.influxdata.com/influxdata-archive.key" \
|
||||
"https://repos.influxdata.com/$(get_os_info id)" \
|
||||
"stable"
|
||||
msg_ok "Set up InfluxDB Repository"
|
||||
@ -38,6 +38,7 @@ else
|
||||
$STD dpkg -i chronograf_1.10.8_amd64.deb
|
||||
rm -rf /chronograf_1.10.8_amd64.deb
|
||||
fi
|
||||
rm /etc/apt/sources.list.d/influxdata.list
|
||||
$STD systemctl enable --now influxdb
|
||||
msg_ok "Installed InfluxDB"
|
||||
|
||||
|
||||
@ -13,23 +13,27 @@ setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
temp_file=$(mktemp)
|
||||
curl -fsSL "http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2_amd64.deb" -o "$temp_file"
|
||||
$STD dpkg -i $temp_file
|
||||
rm -f $temp_file
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
msg_info "Setting up InvenTree Repository"
|
||||
mkdir -p /etc/apt/keyrings
|
||||
curl -fsSL https://dl.packager.io/srv/inventree/InvenTree/key | gpg --dearmor -o /etc/apt/keyrings/inventree.gpg
|
||||
echo "deb [signed-by=/etc/apt/keyrings/inventree.gpg] https://dl.packager.io/srv/deb/inventree/InvenTree/stable/ubuntu 20.04 main" >/etc/apt/sources.list.d/inventree.list
|
||||
setup_deb822_repo \
|
||||
"inventree" \
|
||||
"https://dl.packager.io/srv/inventree/InvenTree/key" \
|
||||
"https://dl.packager.io/srv/deb/inventree/InvenTree/stable/$(get_os_info id)" \
|
||||
"$(get_os_info version)" \
|
||||
"main"
|
||||
msg_ok "Set up InvenTree Repository"
|
||||
|
||||
msg_info "Setup ${APPLICATION} (Patience)"
|
||||
$STD apt-get update
|
||||
$STD apt-get install -y inventree
|
||||
msg_ok "Setup ${APPLICATION}"
|
||||
msg_info "Installing InvenTree (Patience)"
|
||||
export SETUP_NO_CALLS=true
|
||||
$STD apt install -y inventree
|
||||
msg_ok "Installed InvenTree"
|
||||
|
||||
msg_info "Configuring InvenTree"
|
||||
LOCAL_IP="$(hostname -I | awk '{print $1}')"
|
||||
if [[ -f /etc/inventree/config.yaml ]]; then
|
||||
sed -i "s|site_url:.*|site_url: http://${LOCAL_IP}|" /etc/inventree/config.yaml
|
||||
fi
|
||||
$STD inventree run invoke update
|
||||
msg_ok "Configured InvenTree"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
|
||||
@ -16,7 +16,7 @@ update_os
|
||||
fetch_and_deploy_gh_release "librespeed-rust" "librespeed/speedtest-rust" "binary" "latest" "/opt/librespeed-rust" "librespeed-rs-x86_64-unknown-linux-gnu.deb"
|
||||
|
||||
msg_info "Enabling Service"
|
||||
systemctl enable -q --now librespeed-rs
|
||||
systemctl enable -q --now speedtest_rs
|
||||
msg_ok "Enabled Service"
|
||||
|
||||
motd_ssh
|
||||
|
||||
@ -32,7 +32,7 @@ $STD apt install -y \
|
||||
python3-icu
|
||||
msg_ok "Setup Python3"
|
||||
|
||||
setup_uv
|
||||
PYTHON_VERSION="3.12" setup_uv
|
||||
fetch_and_deploy_gh_release "libretranslate" "LibreTranslate/LibreTranslate"
|
||||
|
||||
msg_info "Setup LibreTranslate (Patience)"
|
||||
@ -42,7 +42,7 @@ if [[ -z "$TORCH_VERSION" ]]; then
|
||||
TORCH_VERSION="2.5.0"
|
||||
fi
|
||||
cd /opt/libretranslate
|
||||
$STD uv venv .venv
|
||||
$STD uv venv .venv --python 3.12
|
||||
$STD source .venv/bin/activate
|
||||
$STD uv pip install --upgrade pip setuptools
|
||||
$STD uv pip install Babel==2.12.1
|
||||
|
||||
96
install/metube-install.sh
Normal file
96
install/metube-install.sh
Normal file
@ -0,0 +1,96 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: MickLesk (Canbiz)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/alexta69/metube
|
||||
|
||||
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 \
|
||||
aria2 \
|
||||
coreutils \
|
||||
musl-dev \
|
||||
ffmpeg
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
PYTHON_VERSION="3.13" setup_uv
|
||||
NODE_VERSION="24" setup_nodejs
|
||||
|
||||
msg_info "Installing Deno"
|
||||
export DENO_INSTALL="/usr/local"
|
||||
curl -fsSL https://deno.land/install.sh | $STD sh -s -- -y
|
||||
[[ ":$PATH:" != *":/usr/local/bin:"* ]] &&
|
||||
echo -e "\nexport PATH=\"/usr/local/bin:\$PATH\"" >>~/.bashrc &&
|
||||
source ~/.bashrc
|
||||
msg_ok "Installed Deno"
|
||||
|
||||
fetch_and_deploy_gh_release "metube" "alexta69/metube" "tarball" "latest"
|
||||
|
||||
msg_info "Installing MeTube"
|
||||
cd /opt/metube/ui
|
||||
$STD npm ci
|
||||
$STD node_modules/.bin/ng build --configuration production
|
||||
cd /opt/metube
|
||||
$STD uv sync
|
||||
mkdir -p /opt/metube_downloads /opt/metube_downloads/.metube /opt/metube_downloads/music /opt/metube_downloads/videos
|
||||
cat <<EOF >/opt/metube/.env
|
||||
# Storage & Directories
|
||||
DOWNLOAD_DIR=/opt/metube_downloads
|
||||
AUDIO_DOWNLOAD_DIR=/opt/metube_downloads/music
|
||||
STATE_DIR=/opt/metube_downloads/.metube
|
||||
TEMP_DIR=/opt/metube_downloads
|
||||
|
||||
# Download Behavior
|
||||
DOWNLOAD_MODE=limited
|
||||
MAX_CONCURRENT_DOWNLOADS=3
|
||||
DELETE_FILE_ON_TRASHCAN=false
|
||||
DEFAULT_OPTION_PLAYLIST_STRICT_MODE=false
|
||||
DEFAULT_OPTION_PLAYLIST_ITEM_LIMIT=0
|
||||
|
||||
# File Naming & yt-dlp
|
||||
OUTPUT_TEMPLATE=%(title)s.%(ext)s
|
||||
OUTPUT_TEMPLATE_CHAPTER=%(title)s - %(section_number)s %(section_title)s.%(ext)s
|
||||
OUTPUT_TEMPLATE_PLAYLIST=%(playlist_title)s/%(title)s.%(ext)s
|
||||
YTDL_OPTIONS={"trim_file_name":200,"extractor_args":{"youtube":{"player_client":["default","-tv_simply"]}}}
|
||||
|
||||
# Custom Directories
|
||||
CUSTOM_DIRS=true
|
||||
CREATE_CUSTOM_DIRS=true
|
||||
|
||||
# Basic Setup
|
||||
DEFAULT_THEME=auto
|
||||
LOGLEVEL=INFO
|
||||
ENABLE_ACCESSLOG=false
|
||||
EOF
|
||||
msg_ok "Installed MeTube"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/metube.service
|
||||
[Unit]
|
||||
Description=Metube - YouTube Downloader
|
||||
After=network.target
|
||||
[Service]
|
||||
Type=simple
|
||||
WorkingDirectory=/opt/metube
|
||||
EnvironmentFile=/opt/metube/.env
|
||||
ExecStart=/opt/metube/.venv/bin/python3 app/main.py
|
||||
Restart=always
|
||||
User=root
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now metube
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
@ -48,7 +48,7 @@ $STD cargo build --release --bin daemon
|
||||
cp ./target/release/daemon /usr/bin/netvisor-daemon
|
||||
msg_ok "Built Netvisor-daemon"
|
||||
|
||||
msg_info "Configuring server & daemon for first-run"
|
||||
msg_info "Configuring server for first-run"
|
||||
LOCAL_IP="$(hostname -I | awk '{print $1}')"
|
||||
cat <<EOF >/opt/netvisor/.env
|
||||
### - SERVER
|
||||
@ -101,19 +101,26 @@ WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
systemctl enable -q --now netvisor-server
|
||||
sleep 5
|
||||
NETWORK_ID="$(sudo -u postgres psql -1 -t -d $PG_DB_NAME -c 'SELECT id FROM networks;')"
|
||||
API_KEY="$(sudo -u postgres psql -1 -t -d $PG_DB_NAME -c 'SELECT key from api_keys;')"
|
||||
|
||||
cat <<EOF >/etc/systemd/system/netvisor-daemon.service
|
||||
# Creating short script to configure netvisor-daemon
|
||||
cat <<EOF >~/configure_daemon.sh
|
||||
#!/usr/bin/env bash
|
||||
|
||||
echo "Auto-configuring integrated daemon..."
|
||||
|
||||
NETWORK_ID="\$(sudo -u postgres psql -1 -t -d "${PG_DB_NAME}" -c 'SELECT id FROM networks;')"
|
||||
API_KEY="\$(sudo -u postgres psql -1 -t -d "${PG_DB_NAME}" -c 'SELECT key FROM api_keys;')"
|
||||
|
||||
cat <<END >/etc/systemd/system/netvisor-daemon.service
|
||||
[Unit]
|
||||
Description=NetVisor Network Discovery Daemon
|
||||
After=network.target netvisor-server.service
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
EnvironmentFile=/opt/netvisor/.env
|
||||
ExecStart=/usr/bin/netvisor-daemon --server-url http://127.0.0.1:60072 --network-id ${NETWORK_ID} --daemon-api-key ${API_KEY}
|
||||
User=root
|
||||
ExecStart=/usr/bin/netvisor-daemon --server-url http://127.0.0.1:60072 --network-id \${NETWORK_ID} --daemon-api-key \${API_KEY} --mode push
|
||||
Restart=always
|
||||
RestartSec=10
|
||||
StandardOutput=journal
|
||||
@ -121,9 +128,14 @@ StandardError=journal
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
END
|
||||
|
||||
systemctl enable -q --now netvisor-daemon
|
||||
msg_ok "Netvisor server & daemon configured and running"
|
||||
echo "NetVisor daemon configured and running"
|
||||
|
||||
EOF
|
||||
chmod +x ~/configure_daemon.sh
|
||||
msg_ok "Netvisor server running - please create an account in the UI to continue."
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
|
||||
@ -15,21 +15,22 @@ update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt install -y \
|
||||
default-jdk \
|
||||
git \
|
||||
git-lfs
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
JAVA_VERSION="21" setup_java
|
||||
|
||||
msg_info "Installing OneDev"
|
||||
RELEASE=$(curl -fsSL https://api.github.com/repos/theonedev/onedev/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
|
||||
cd /opt
|
||||
curl -fsSL "https://code.onedev.io/onedev/server/~site/onedev-latest.tar.gz" -o "/opt/onedev-latest.tar.gz"
|
||||
curl -fsSL "https://code.onedev.io/onedev/server/~site/onedev-latest.tar.gz" -o onedev-latest.tar.gz
|
||||
tar -xzf onedev-latest.tar.gz
|
||||
mv /opt/onedev-latest /opt/onedev
|
||||
$STD /opt/onedev/bin/server.sh install
|
||||
systemctl start onedev
|
||||
RELEASE=$(cat /opt/onedev/release.properties | grep "version" | cut -d'=' -f2)
|
||||
rm -rf /opt/onedev-latest.tar.gz
|
||||
echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt"
|
||||
echo "${RELEASE}" >~/.onedev
|
||||
msg_ok "Installed OneDev"
|
||||
|
||||
motd_ssh
|
||||
|
||||
@ -158,7 +158,7 @@ Requires=redis.service
|
||||
|
||||
[Service]
|
||||
WorkingDirectory=/opt/paperless/src
|
||||
ExecStart=uv run -- granian --interface asginl --ws "paperless.asgi:application"
|
||||
ExecStart=uv run -- granian --interface asgi --ws "paperless.asgi:application"
|
||||
Environment=GRANIAN_HOST=::
|
||||
Environment=GRANIAN_PORT=8000
|
||||
Environment=GRANIAN_WORKERS=1
|
||||
|
||||
@ -52,7 +52,7 @@ cat <<EOF >/opt/wanderer/start.sh
|
||||
|
||||
trap "kill 0" EXIT
|
||||
|
||||
cd /opt/wanderer/source/search && meilisearch --master-key \$MEILI_MASTER_KEY &
|
||||
cd /opt/wanderer/source/search && meilisearch --experimental-dumpless-upgrade --master-key \$MEILI_MASTER_KEY &
|
||||
sleep 1
|
||||
cd /opt/wanderer/source/db && ./pocketbase serve --http=\$PB_URL --dir=\$PB_DB_LOCATION &
|
||||
cd /opt/wanderer/source/web && node build &
|
||||
|
||||
@ -21,15 +21,12 @@ $STD apt install -y \
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
msg_info "Setting up Elasticsearch"
|
||||
curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
|
||||
cat <<EOF | sudo tee /etc/apt/sources.list.d/elasticsearch.sources >/dev/null
|
||||
Types: deb
|
||||
URIs: https://artifacts.elastic.co/packages/7.x/apt
|
||||
Suites: stable
|
||||
Components: main
|
||||
Signed-By: /usr/share/keyrings/elasticsearch-keyring.gpg
|
||||
EOF
|
||||
$STD apt update
|
||||
setup_deb822_repo \
|
||||
"elasticsearch" \
|
||||
"https://artifacts.elastic.co/GPG-KEY-elasticsearch" \
|
||||
"https://artifacts.elastic.co/packages/7.x/apt" \
|
||||
"stable" \
|
||||
"main"
|
||||
$STD apt -y install elasticsearch
|
||||
echo "-Xms2g" >>/etc/elasticsearch/jvm.options
|
||||
echo "-Xmx2g" >>/etc/elasticsearch/jvm.options
|
||||
@ -39,15 +36,12 @@ systemctl restart -q elasticsearch
|
||||
msg_ok "Setup Elasticsearch"
|
||||
|
||||
msg_info "Installing Zammad"
|
||||
curl -fsSL https://dl.packager.io/srv/zammad/zammad/key | gpg --dearmor | sudo tee /etc/apt/keyrings/pkgr-zammad.gpg >/dev/null
|
||||
cat <<EOF | sudo tee /etc/apt/sources.list.d/zammad.sources >/dev/null
|
||||
Types: deb
|
||||
URIs: https://dl.packager.io/srv/deb/zammad/zammad/stable/debian
|
||||
Suites: 12
|
||||
Components: main
|
||||
Signed-By: /etc/apt/keyrings/pkgr-zammad.gpg
|
||||
EOF
|
||||
$STD apt update
|
||||
setup_deb822_repo \
|
||||
"zammad" \
|
||||
"https://dl.packager.io/srv/zammad/zammad/key" \
|
||||
"https://dl.packager.io/srv/deb/zammad/zammad/stable/debian" \
|
||||
"$(get_os_info version_id)" \
|
||||
"main"
|
||||
$STD apt -y install zammad
|
||||
$STD zammad run rails r "Setting.set('es_url', 'http://localhost:9200')"
|
||||
$STD zammad run rake zammad:searchindex:rebuild
|
||||
|
||||
@ -125,22 +125,13 @@ update_os() {
|
||||
# This function modifies the message of the day (motd) and SSH settings
|
||||
motd_ssh() {
|
||||
echo "export TERM='xterm-256color'" >>/root/.bashrc
|
||||
IP=$(ip -4 addr show eth0 | awk '/inet / {print $2}' | cut -d/ -f1 | head -n 1)
|
||||
|
||||
if [ -f "/etc/os-release" ]; then
|
||||
OS_NAME=$(grep ^NAME /etc/os-release | cut -d= -f2 | tr -d '"')
|
||||
OS_VERSION=$(grep ^VERSION_ID /etc/os-release | cut -d= -f2 | tr -d '"')
|
||||
else
|
||||
OS_NAME="Alpine Linux"
|
||||
OS_VERSION="Unknown"
|
||||
fi
|
||||
|
||||
PROFILE_FILE="/etc/profile.d/00_lxc-details.sh"
|
||||
echo "echo -e \"\"" >"$PROFILE_FILE"
|
||||
echo -e "echo -e \"${BOLD}${APPLICATION} LXC Container${CL}"\" >>"$PROFILE_FILE"
|
||||
echo -e "echo -e \"${TAB}${GATEWAY}${YW} Provided by: ${GN}community-scripts ORG ${YW}| GitHub: ${GN}https://github.com/community-scripts/ProxmoxVE${CL}\"" >>"$PROFILE_FILE"
|
||||
echo "echo \"\"" >>"$PROFILE_FILE"
|
||||
echo -e "echo -e \"${TAB}${OS}${YW} OS: ${GN}${OS_NAME} - Version: ${OS_VERSION}${CL}\"" >>"$PROFILE_FILE"
|
||||
echo -e "echo -e \"${TAB}${OS}${YW} OS: ${GN}\$(grep ^NAME /etc/os-release | cut -d= -f2 | tr -d '\"') - Version: \$(grep ^VERSION_ID /etc/os-release | cut -d= -f2 | tr -d '\"')${CL}\"" >>"$PROFILE_FILE"
|
||||
echo -e "echo -e \"${TAB}${HOSTNAME}${YW} Hostname: ${GN}\$(hostname)${CL}\"" >>"$PROFILE_FILE"
|
||||
echo -e "echo -e \"${TAB}${INFO}${YW} IP Address: ${GN}\$(ip -4 addr show eth0 | awk '/inet / {print \$2}' | cut -d/ -f1 | head -n 1)${CL}\"" >>"$PROFILE_FILE"
|
||||
|
||||
|
||||
469
misc/build.func
469
misc/build.func
@ -453,7 +453,7 @@ load_vars_file() {
|
||||
|
||||
# Allowed var_* keys
|
||||
local VAR_WHITELIST=(
|
||||
var_apt_cacher var_apt_cacher_ip var_brg var_cpu var_disk var_fuse var_keyctl
|
||||
var_apt_cacher var_apt_cacher_ip var_brg var_cpu var_disk var_fuse var_gpu var_keyctl
|
||||
var_gateway var_hostname var_ipv6_method var_mac var_mknod var_mount_fs var_mtu
|
||||
var_net var_nesting var_ns var_protection var_pw var_ram var_tags var_timezone var_tun var_unprivileged
|
||||
var_verbose var_vlan var_ssh var_ssh_authorized_key var_container_storage var_template_storage
|
||||
@ -505,7 +505,7 @@ default_var_settings() {
|
||||
# Allowed var_* keys (alphabetically sorted)
|
||||
# Note: Removed var_ctid (can only exist once), var_ipv6_static (static IPs are unique)
|
||||
local VAR_WHITELIST=(
|
||||
var_apt_cacher var_apt_cacher_ip var_brg var_cpu var_disk var_fuse var_keyctl
|
||||
var_apt_cacher var_apt_cacher_ip var_brg var_cpu var_disk var_fuse var_gpu var_keyctl
|
||||
var_gateway var_hostname var_ipv6_method var_mac var_mknod var_mount_fs var_mtu
|
||||
var_net var_nesting var_ns var_protection var_pw var_ram var_tags var_timezone var_tun var_unprivileged
|
||||
var_verbose var_vlan var_ssh var_ssh_authorized_key var_container_storage var_template_storage
|
||||
@ -667,7 +667,7 @@ get_app_defaults_path() {
|
||||
if ! declare -p VAR_WHITELIST >/dev/null 2>&1; then
|
||||
# Note: Removed var_ctid (can only exist once), var_ipv6_static (static IPs are unique)
|
||||
declare -ag VAR_WHITELIST=(
|
||||
var_apt_cacher var_apt_cacher_ip var_brg var_cpu var_disk var_fuse
|
||||
var_apt_cacher var_apt_cacher_ip var_brg var_cpu var_disk var_fuse var_gpu
|
||||
var_gateway var_hostname var_ipv6_method var_mac var_mtu
|
||||
var_net var_ns var_pw var_ram var_tags var_tun var_unprivileged
|
||||
var_verbose var_vlan var_ssh var_ssh_authorized_key var_container_storage var_template_storage
|
||||
@ -816,6 +816,7 @@ _build_current_app_vars_tmp() {
|
||||
_apt_cacher_ip="${APT_CACHER_IP:-}"
|
||||
_fuse="${ENABLE_FUSE:-no}"
|
||||
_tun="${ENABLE_TUN:-no}"
|
||||
_gpu="${ENABLE_GPU:-no}"
|
||||
_nesting="${ENABLE_NESTING:-1}"
|
||||
_keyctl="${ENABLE_KEYCTL:-0}"
|
||||
_mknod="${ENABLE_MKNOD:-0}"
|
||||
@ -865,6 +866,7 @@ _build_current_app_vars_tmp() {
|
||||
|
||||
[ -n "$_fuse" ] && echo "var_fuse=$(_sanitize_value "$_fuse")"
|
||||
[ -n "$_tun" ] && echo "var_tun=$(_sanitize_value "$_tun")"
|
||||
[ -n "$_gpu" ] && echo "var_gpu=$(_sanitize_value "$_gpu")"
|
||||
[ -n "$_nesting" ] && echo "var_nesting=$(_sanitize_value "$_nesting")"
|
||||
[ -n "$_keyctl" ] && echo "var_keyctl=$(_sanitize_value "$_keyctl")"
|
||||
[ -n "$_mknod" ] && echo "var_mknod=$(_sanitize_value "$_mknod")"
|
||||
@ -1011,37 +1013,49 @@ advanced_settings() {
|
||||
# Initialize defaults
|
||||
TAGS="community-script;${var_tags:-}"
|
||||
local STEP=1
|
||||
local MAX_STEP=19
|
||||
local MAX_STEP=28
|
||||
|
||||
# Store values for back navigation
|
||||
local _ct_type="${CT_TYPE:-1}"
|
||||
# Store values for back navigation - inherit from var_* app defaults
|
||||
local _ct_type="${var_unprivileged:-1}"
|
||||
local _pw=""
|
||||
local _pw_display="Automatic Login"
|
||||
local _ct_id="$NEXTID"
|
||||
local _hostname="$NSAPP"
|
||||
local _disk_size="$var_disk"
|
||||
local _core_count="$var_cpu"
|
||||
local _ram_size="$var_ram"
|
||||
local _bridge="vmbr0"
|
||||
local _net="dhcp"
|
||||
local _gate=""
|
||||
local _ipv6_method="auto"
|
||||
local _disk_size="${var_disk:-4}"
|
||||
local _core_count="${var_cpu:-1}"
|
||||
local _ram_size="${var_ram:-1024}"
|
||||
local _bridge="${var_brg:-vmbr0}"
|
||||
local _net="${var_net:-dhcp}"
|
||||
local _gate="${var_gateway:-}"
|
||||
local _ipv6_method="${var_ipv6_method:-auto}"
|
||||
local _ipv6_addr=""
|
||||
local _ipv6_gate=""
|
||||
local _apt_cacher_ip=""
|
||||
local _mtu=""
|
||||
local _sd=""
|
||||
local _ns=""
|
||||
local _mac=""
|
||||
local _vlan=""
|
||||
local _apt_cacher="${var_apt_cacher:-no}"
|
||||
local _apt_cacher_ip="${var_apt_cacher_ip:-}"
|
||||
local _mtu="${var_mtu:-}"
|
||||
local _sd="${var_searchdomain:-}"
|
||||
local _ns="${var_ns:-}"
|
||||
local _mac="${var_mac:-}"
|
||||
local _vlan="${var_vlan:-}"
|
||||
local _tags="$TAGS"
|
||||
local _enable_fuse="no"
|
||||
local _verbose="no"
|
||||
local _enable_keyctl="0"
|
||||
local _enable_mknod="0"
|
||||
local _mount_fs=""
|
||||
local _protect_ct="no"
|
||||
local _ct_timezone=""
|
||||
local _enable_fuse="${var_fuse:-no}"
|
||||
local _enable_tun="${var_tun:-no}"
|
||||
local _enable_gpu="${var_gpu:-no}"
|
||||
local _enable_nesting="${var_nesting:-1}"
|
||||
local _verbose="${var_verbose:-no}"
|
||||
local _enable_keyctl="${var_keyctl:-0}"
|
||||
local _enable_mknod="${var_mknod:-0}"
|
||||
local _mount_fs="${var_mount_fs:-}"
|
||||
local _protect_ct="${var_protection:-no}"
|
||||
|
||||
# Detect host timezone for default (if not set via var_timezone)
|
||||
local _host_timezone=""
|
||||
if command -v timedatectl >/dev/null 2>&1; then
|
||||
_host_timezone=$(timedatectl show --value --property=Timezone 2>/dev/null || echo "")
|
||||
elif [ -f /etc/timezone ]; then
|
||||
_host_timezone=$(cat /etc/timezone 2>/dev/null || echo "")
|
||||
fi
|
||||
local _ct_timezone="${var_timezone:-$_host_timezone}"
|
||||
|
||||
# Helper to show current progress
|
||||
show_progress() {
|
||||
@ -1491,20 +1505,23 @@ advanced_settings() {
|
||||
# STEP 17: SSH Settings
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
17)
|
||||
configure_ssh_settings
|
||||
configure_ssh_settings "Step $STEP/$MAX_STEP"
|
||||
# configure_ssh_settings handles its own flow, always advance
|
||||
((STEP++))
|
||||
;;
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
# STEP 18: FUSE & Verbose Mode
|
||||
# STEP 18: FUSE Support
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
18)
|
||||
local fuse_default_flag="--defaultno"
|
||||
[[ "$_enable_fuse" == "yes" || "$_enable_fuse" == "1" ]] && fuse_default_flag=""
|
||||
|
||||
if whiptail --backtitle "Proxmox VE Helper Scripts [Step $STEP/$MAX_STEP]" \
|
||||
--title "FUSE SUPPORT" \
|
||||
--ok-button "Next" --cancel-button "Back" \
|
||||
--defaultno \
|
||||
--yesno "\nEnable FUSE support?\n\nRequired for: rclone, mergerfs, AppImage, etc." 12 58; then
|
||||
$fuse_default_flag \
|
||||
--yesno "\nEnable FUSE support?\n\nRequired for: rclone, mergerfs, AppImage, etc.\n\n(App default: ${var_fuse:-no})" 14 58; then
|
||||
_enable_fuse="yes"
|
||||
else
|
||||
if [ $? -eq 1 ]; then
|
||||
@ -1514,26 +1531,255 @@ advanced_settings() {
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
((STEP++))
|
||||
;;
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
# STEP 19: TUN/TAP Support
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
19)
|
||||
local tun_default_flag="--defaultno"
|
||||
[[ "$_enable_tun" == "yes" || "$_enable_tun" == "1" ]] && tun_default_flag=""
|
||||
|
||||
if whiptail --backtitle "Proxmox VE Helper Scripts [Step $STEP/$MAX_STEP]" \
|
||||
--title "VERBOSE MODE" \
|
||||
--defaultno \
|
||||
--yesno "\nEnable Verbose Mode?\n\nShows detailed output during installation." 12 58; then
|
||||
_verbose="yes"
|
||||
--title "TUN/TAP SUPPORT" \
|
||||
--ok-button "Next" --cancel-button "Back" \
|
||||
$tun_default_flag \
|
||||
--yesno "\nEnable TUN/TAP device support?\n\nRequired for: VPN apps (WireGuard, OpenVPN, Tailscale),\nnetwork tunneling, and containerized networking.\n\n(App default: ${var_tun:-no})" 14 62; then
|
||||
_enable_tun="yes"
|
||||
else
|
||||
_verbose="no"
|
||||
if [ $? -eq 1 ]; then
|
||||
_enable_tun="no"
|
||||
else
|
||||
((STEP--))
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
((STEP++))
|
||||
;;
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
# STEP 19: Confirmation
|
||||
# STEP 20: Nesting Support
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
19)
|
||||
20)
|
||||
local nesting_default_flag=""
|
||||
[[ "$_enable_nesting" == "0" || "$_enable_nesting" == "no" ]] && nesting_default_flag="--defaultno"
|
||||
|
||||
if whiptail --backtitle "Proxmox VE Helper Scripts [Step $STEP/$MAX_STEP]" \
|
||||
--title "NESTING SUPPORT" \
|
||||
--ok-button "Next" --cancel-button "Back" \
|
||||
$nesting_default_flag \
|
||||
--yesno "\nEnable Nesting?\n\nRequired for: Docker, LXC inside LXC, Podman,\nand other containerization tools.\n\n(App default: ${var_nesting:-1})" 14 58; then
|
||||
_enable_nesting="1"
|
||||
else
|
||||
if [ $? -eq 1 ]; then
|
||||
_enable_nesting="0"
|
||||
else
|
||||
((STEP--))
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
((STEP++))
|
||||
;;
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
# STEP 21: GPU Passthrough
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
21)
|
||||
local gpu_default_flag="--defaultno"
|
||||
[[ "$_enable_gpu" == "yes" ]] && gpu_default_flag=""
|
||||
|
||||
if whiptail --backtitle "Proxmox VE Helper Scripts [Step $STEP/$MAX_STEP]" \
|
||||
--title "GPU PASSTHROUGH" \
|
||||
--ok-button "Next" --cancel-button "Back" \
|
||||
$gpu_default_flag \
|
||||
--yesno "\nEnable GPU Passthrough?\n\nAutomatically detects and passes through available GPUs\n(Intel/AMD/NVIDIA) for hardware acceleration.\n\nRecommended for: Media servers, AI/ML, Transcoding\n\n(App default: ${var_gpu:-no})" 16 62; then
|
||||
_enable_gpu="yes"
|
||||
else
|
||||
if [ $? -eq 1 ]; then
|
||||
_enable_gpu="no"
|
||||
else
|
||||
((STEP--))
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
((STEP++))
|
||||
;;
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
# STEP 22: Keyctl Support (Docker/systemd)
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
22)
|
||||
local keyctl_default_flag="--defaultno"
|
||||
[[ "$_enable_keyctl" == "1" ]] && keyctl_default_flag=""
|
||||
|
||||
if whiptail --backtitle "Proxmox VE Helper Scripts [Step $STEP/$MAX_STEP]" \
|
||||
--title "KEYCTL SUPPORT" \
|
||||
--ok-button "Next" --cancel-button "Back" \
|
||||
$keyctl_default_flag \
|
||||
--yesno "\nEnable Keyctl support?\n\nRequired for: Docker containers, systemd-networkd,\nand kernel keyring operations.\n\nNote: Automatically enabled for unprivileged containers.\n\n(App default: ${var_keyctl:-0})" 16 62; then
|
||||
_enable_keyctl="1"
|
||||
else
|
||||
if [ $? -eq 1 ]; then
|
||||
_enable_keyctl="0"
|
||||
else
|
||||
((STEP--))
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
((STEP++))
|
||||
;;
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
# STEP 23: APT Cacher Proxy
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
23)
|
||||
local apt_cacher_default_flag="--defaultno"
|
||||
[[ "$_apt_cacher" == "yes" ]] && apt_cacher_default_flag=""
|
||||
|
||||
if whiptail --backtitle "Proxmox VE Helper Scripts [Step $STEP/$MAX_STEP]" \
|
||||
--title "APT CACHER PROXY" \
|
||||
--ok-button "Next" --cancel-button "Back" \
|
||||
$apt_cacher_default_flag \
|
||||
--yesno "\nUse APT Cacher-NG proxy?\n\nSpeeds up package downloads by caching them locally.\nRequires apt-cacher-ng running on your network.\n\n(App default: ${var_apt_cacher:-no})" 14 62; then
|
||||
_apt_cacher="yes"
|
||||
# Ask for IP if enabled
|
||||
if result=$(whiptail --backtitle "Proxmox VE Helper Scripts [Step $STEP/$MAX_STEP]" \
|
||||
--title "APT CACHER IP" \
|
||||
--inputbox "\nEnter APT Cacher-NG server IP address:" 10 58 "$_apt_cacher_ip" \
|
||||
3>&1 1>&2 2>&3); then
|
||||
_apt_cacher_ip="$result"
|
||||
fi
|
||||
else
|
||||
if [ $? -eq 1 ]; then
|
||||
_apt_cacher="no"
|
||||
_apt_cacher_ip=""
|
||||
else
|
||||
((STEP--))
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
((STEP++))
|
||||
;;
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
# STEP 24: Container Timezone
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
24)
|
||||
local tz_hint="$_ct_timezone"
|
||||
[[ -z "$tz_hint" ]] && tz_hint="(empty - will use host timezone)"
|
||||
|
||||
if result=$(whiptail --backtitle "Proxmox VE Helper Scripts [Step $STEP/$MAX_STEP]" \
|
||||
--title "CONTAINER TIMEZONE" \
|
||||
--ok-button "Next" --cancel-button "Back" \
|
||||
--inputbox "\nSet container timezone.\n\nExamples: Europe/Berlin, America/New_York, Asia/Tokyo\n\nHost timezone: ${_host_timezone:-unknown}\n\nLeave empty to inherit from host." 16 62 "$_ct_timezone" \
|
||||
3>&1 1>&2 2>&3); then
|
||||
_ct_timezone="$result"
|
||||
((STEP++))
|
||||
else
|
||||
((STEP--))
|
||||
fi
|
||||
;;
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
# STEP 25: Container Protection
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
25)
|
||||
local protect_default_flag="--defaultno"
|
||||
[[ "$_protect_ct" == "yes" || "$_protect_ct" == "1" ]] && protect_default_flag=""
|
||||
|
||||
if whiptail --backtitle "Proxmox VE Helper Scripts [Step $STEP/$MAX_STEP]" \
|
||||
--title "CONTAINER PROTECTION" \
|
||||
--ok-button "Next" --cancel-button "Back" \
|
||||
$protect_default_flag \
|
||||
--yesno "\nEnable Container Protection?\n\nPrevents accidental deletion of this container.\nYou must disable protection before removing.\n\n(App default: ${var_protection:-no})" 14 62; then
|
||||
_protect_ct="yes"
|
||||
else
|
||||
if [ $? -eq 1 ]; then
|
||||
_protect_ct="no"
|
||||
else
|
||||
((STEP--))
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
((STEP++))
|
||||
;;
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
# STEP 26: Device Node Creation (mknod)
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
26)
|
||||
local mknod_default_flag="--defaultno"
|
||||
[[ "$_enable_mknod" == "1" ]] && mknod_default_flag=""
|
||||
|
||||
if whiptail --backtitle "Proxmox VE Helper Scripts [Step $STEP/$MAX_STEP]" \
|
||||
--title "DEVICE NODE CREATION" \
|
||||
--ok-button "Next" --cancel-button "Back" \
|
||||
$mknod_default_flag \
|
||||
--yesno "\nAllow device node creation (mknod)?\n\nRequired for: Creating device files inside container.\nExperimental feature (requires kernel 5.3+).\n\n(App default: ${var_mknod:-0})" 14 62; then
|
||||
_enable_mknod="1"
|
||||
else
|
||||
if [ $? -eq 1 ]; then
|
||||
_enable_mknod="0"
|
||||
else
|
||||
((STEP--))
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
((STEP++))
|
||||
;;
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
# STEP 27: Mount Filesystems
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
27)
|
||||
local mount_hint=""
|
||||
[[ -n "$_mount_fs" ]] && mount_hint="$_mount_fs" || mount_hint="(none)"
|
||||
|
||||
if result=$(whiptail --backtitle "Proxmox VE Helper Scripts [Step $STEP/$MAX_STEP]" \
|
||||
--title "MOUNT FILESYSTEMS" \
|
||||
--ok-button "Next" --cancel-button "Back" \
|
||||
--inputbox "\nAllow specific filesystem mounts.\n\nComma-separated list: nfs, cifs, fuse, ext4, etc.\nLeave empty for defaults (none).\n\nCurrent: $mount_hint" 14 62 "$_mount_fs" \
|
||||
3>&1 1>&2 2>&3); then
|
||||
_mount_fs="$result"
|
||||
((STEP++))
|
||||
else
|
||||
((STEP--))
|
||||
fi
|
||||
;;
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
# STEP 28: Verbose Mode & Confirmation
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
28)
|
||||
local verbose_default_flag="--defaultno"
|
||||
[[ "$_verbose" == "yes" ]] && verbose_default_flag=""
|
||||
|
||||
if whiptail --backtitle "Proxmox VE Helper Scripts [Step $STEP/$MAX_STEP]" \
|
||||
--title "VERBOSE MODE" \
|
||||
$verbose_default_flag \
|
||||
--yesno "\nEnable Verbose Mode?\n\nShows detailed output during installation." 12 58; then
|
||||
_verbose="yes"
|
||||
else
|
||||
_verbose="no"
|
||||
fi
|
||||
# Build summary
|
||||
local ct_type_desc="Unprivileged"
|
||||
[[ "$_ct_type" == "0" ]] && ct_type_desc="Privileged"
|
||||
|
||||
local nesting_desc="Disabled"
|
||||
[[ "$_enable_nesting" == "1" ]] && nesting_desc="Enabled"
|
||||
|
||||
local keyctl_desc="Disabled"
|
||||
[[ "$_enable_keyctl" == "1" ]] && keyctl_desc="Enabled"
|
||||
|
||||
local protect_desc="No"
|
||||
[[ "$_protect_ct" == "yes" || "$_protect_ct" == "1" ]] && protect_desc="Yes"
|
||||
|
||||
local tz_display="${_ct_timezone:-Host TZ}"
|
||||
local apt_display="${_apt_cacher:-no}"
|
||||
[[ "$_apt_cacher" == "yes" && -n "$_apt_cacher_ip" ]] && apt_display="$_apt_cacher_ip"
|
||||
|
||||
local summary="Container Type: $ct_type_desc
|
||||
Container ID: $_ct_id
|
||||
Hostname: $_hostname
|
||||
@ -1548,14 +1794,20 @@ Network:
|
||||
IPv4: $_net
|
||||
IPv6: $_ipv6_method
|
||||
|
||||
Options:
|
||||
FUSE: $_enable_fuse
|
||||
Features:
|
||||
FUSE: $_enable_fuse | TUN: $_enable_tun
|
||||
Nesting: $nesting_desc | Keyctl: $keyctl_desc
|
||||
GPU: $_enable_gpu | Protection: $protect_desc
|
||||
|
||||
Advanced:
|
||||
Timezone: $tz_display
|
||||
APT Cacher: $apt_display
|
||||
Verbose: $_verbose"
|
||||
|
||||
if whiptail --backtitle "Proxmox VE Helper Scripts [Step $STEP/$MAX_STEP]" \
|
||||
--title "CONFIRM SETTINGS" \
|
||||
--ok-button "Create LXC" --cancel-button "Back" \
|
||||
--yesno "$summary\n\nCreate ${APP} LXC with these settings?" 26 58; then
|
||||
--yesno "$summary\n\nCreate ${APP} LXC with these settings?" 32 62; then
|
||||
((STEP++))
|
||||
else
|
||||
((STEP--))
|
||||
@ -1582,8 +1834,31 @@ Options:
|
||||
IPV6_GATE="$_ipv6_gate"
|
||||
TAGS="$_tags"
|
||||
ENABLE_FUSE="$_enable_fuse"
|
||||
ENABLE_TUN="$_enable_tun"
|
||||
ENABLE_GPU="$_enable_gpu"
|
||||
ENABLE_NESTING="$_enable_nesting"
|
||||
ENABLE_KEYCTL="$_enable_keyctl"
|
||||
ENABLE_MKNOD="$_enable_mknod"
|
||||
ALLOW_MOUNT_FS="$_mount_fs"
|
||||
PROTECT_CT="$_protect_ct"
|
||||
CT_TIMEZONE="$_ct_timezone"
|
||||
APT_CACHER="$_apt_cacher"
|
||||
APT_CACHER_IP="$_apt_cacher_ip"
|
||||
VERBOSE="$_verbose"
|
||||
|
||||
# Update var_* based on user choice (for functions that check these)
|
||||
var_gpu="$_enable_gpu"
|
||||
var_fuse="$_enable_fuse"
|
||||
var_tun="$_enable_tun"
|
||||
var_nesting="$_enable_nesting"
|
||||
var_keyctl="$_enable_keyctl"
|
||||
var_mknod="$_enable_mknod"
|
||||
var_mount_fs="$_mount_fs"
|
||||
var_protection="$_protect_ct"
|
||||
var_timezone="$_ct_timezone"
|
||||
var_apt_cacher="$_apt_cacher"
|
||||
var_apt_cacher_ip="$_apt_cacher_ip"
|
||||
|
||||
# Format optional values
|
||||
[[ -n "$_mtu" ]] && MTU=",mtu=$_mtu" || MTU=""
|
||||
[[ -n "$_sd" ]] && SD="-searchdomain=$_sd" || SD=""
|
||||
@ -1600,6 +1875,10 @@ Options:
|
||||
export UDHCPC_FIX
|
||||
export SSH_KEYS_FILE
|
||||
|
||||
# Exit alternate screen buffer before showing summary (so output remains visible)
|
||||
tput rmcup 2>/dev/null || true
|
||||
trap - RETURN
|
||||
|
||||
# Display final summary
|
||||
echo -e "\n${INFO}${BOLD}${DGN}PVE Version ${PVEVERSION} (Kernel: ${KERNEL_VERSION})${CL}"
|
||||
echo -e "${OS}${BOLD}${DGN}Operating System: ${BGN}$var_os${CL}"
|
||||
@ -1614,6 +1893,13 @@ Options:
|
||||
echo -e "${NETWORK}${BOLD}${DGN}IPv4: ${BGN}$NET${CL}"
|
||||
echo -e "${NETWORK}${BOLD}${DGN}IPv6: ${BGN}$IPV6_METHOD${CL}"
|
||||
echo -e "${FUSE}${BOLD}${DGN}FUSE Support: ${BGN}$ENABLE_FUSE${CL}"
|
||||
[[ "$ENABLE_TUN" == "yes" ]] && echo -e "${NETWORK}${BOLD}${DGN}TUN/TAP Support: ${BGN}$ENABLE_TUN${CL}"
|
||||
echo -e "${CONTAINERTYPE}${BOLD}${DGN}Nesting: ${BGN}$([ "$ENABLE_NESTING" == "1" ] && echo "Enabled" || echo "Disabled")${CL}"
|
||||
[[ "$ENABLE_KEYCTL" == "1" ]] && echo -e "${CONTAINERTYPE}${BOLD}${DGN}Keyctl: ${BGN}Enabled${CL}"
|
||||
echo -e "${GPU}${BOLD}${DGN}GPU Passthrough: ${BGN}$ENABLE_GPU${CL}"
|
||||
[[ "$PROTECT_CT" == "yes" || "$PROTECT_CT" == "1" ]] && echo -e "${CONTAINERTYPE}${BOLD}${DGN}Protection: ${BGN}Enabled${CL}"
|
||||
[[ -n "$CT_TIMEZONE" ]] && echo -e "${INFO}${BOLD}${DGN}Timezone: ${BGN}$CT_TIMEZONE${CL}"
|
||||
[[ "$APT_CACHER" == "yes" ]] && echo -e "${INFO}${BOLD}${DGN}APT Cacher: ${BGN}$APT_CACHER_IP${CL}"
|
||||
echo -e "${SEARCH}${BOLD}${DGN}Verbose Mode: ${BGN}$VERBOSE${CL}"
|
||||
echo -e "${CREATING}${BOLD}${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||
}
|
||||
@ -1736,6 +2022,9 @@ echo_default() {
|
||||
echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE} GB${CL}"
|
||||
echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}"
|
||||
echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE} MiB${CL}"
|
||||
if [[ -n "${var_gpu:-}" && "${var_gpu}" == "yes" ]]; then
|
||||
echo -e "${GPU}${BOLD}${DGN}GPU Passthrough: ${BGN}Enabled${CL}"
|
||||
fi
|
||||
if [ "$VERBOSE" == "yes" ]; then
|
||||
echo -e "${SEARCH}${BOLD}${DGN}Verbose Mode: ${BGN}Enabled${CL}"
|
||||
fi
|
||||
@ -2076,6 +2365,10 @@ ssh_discover_default_files() {
|
||||
}
|
||||
|
||||
configure_ssh_settings() {
|
||||
local step_info="${1:-}"
|
||||
local backtitle="Proxmox VE Helper Scripts"
|
||||
[[ -n "$step_info" ]] && backtitle="Proxmox VE Helper Scripts [${step_info}]"
|
||||
|
||||
SSH_KEYS_FILE="$(mktemp)"
|
||||
: >"$SSH_KEYS_FILE"
|
||||
|
||||
@ -2085,14 +2378,14 @@ configure_ssh_settings() {
|
||||
|
||||
local ssh_key_mode
|
||||
if [[ "$default_key_count" -gt 0 ]]; then
|
||||
ssh_key_mode=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SSH KEY SOURCE" --menu \
|
||||
ssh_key_mode=$(whiptail --backtitle "$backtitle" --title "SSH KEY SOURCE" --menu \
|
||||
"Provision SSH keys for root:" 14 72 4 \
|
||||
"found" "Select from detected keys (${default_key_count})" \
|
||||
"manual" "Paste a single public key" \
|
||||
"folder" "Scan another folder (path or glob)" \
|
||||
"none" "No keys" 3>&1 1>&2 2>&3) || exit_script
|
||||
else
|
||||
ssh_key_mode=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SSH KEY SOURCE" --menu \
|
||||
ssh_key_mode=$(whiptail --backtitle "$backtitle" --title "SSH KEY SOURCE" --menu \
|
||||
"No host keys detected; choose manual/none:" 12 72 2 \
|
||||
"manual" "Paste a single public key" \
|
||||
"none" "No keys" 3>&1 1>&2 2>&3) || exit_script
|
||||
@ -2101,7 +2394,7 @@ configure_ssh_settings() {
|
||||
case "$ssh_key_mode" in
|
||||
found)
|
||||
local selection
|
||||
selection=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SELECT HOST KEYS" \
|
||||
selection=$(whiptail --backtitle "$backtitle" --title "SELECT HOST KEYS" \
|
||||
--checklist "Select one or more keys to import:" 20 140 10 "${CHOICES[@]}" 3>&1 1>&2 2>&3) || exit_script
|
||||
for tag in $selection; do
|
||||
tag="${tag%\"}"
|
||||
@ -2112,13 +2405,13 @@ configure_ssh_settings() {
|
||||
done
|
||||
;;
|
||||
manual)
|
||||
SSH_AUTHORIZED_KEY="$(whiptail --backtitle "Proxmox VE Helper Scripts" \
|
||||
SSH_AUTHORIZED_KEY="$(whiptail --backtitle "$backtitle" \
|
||||
--inputbox "Paste one SSH public key line (ssh-ed25519/ssh-rsa/...)" 10 72 --title "SSH Public Key" 3>&1 1>&2 2>&3)"
|
||||
[[ -n "$SSH_AUTHORIZED_KEY" ]] && printf '%s\n' "$SSH_AUTHORIZED_KEY" >>"$SSH_KEYS_FILE"
|
||||
;;
|
||||
folder)
|
||||
local glob_path
|
||||
glob_path=$(whiptail --backtitle "Proxmox VE Helper Scripts" \
|
||||
glob_path=$(whiptail --backtitle "$backtitle" \
|
||||
--inputbox "Enter a folder or glob to scan (e.g. /root/.ssh/*.pub)" 10 72 --title "Scan Folder/Glob" 3>&1 1>&2 2>&3)
|
||||
if [[ -n "$glob_path" ]]; then
|
||||
shopt -s nullglob
|
||||
@ -2128,7 +2421,7 @@ configure_ssh_settings() {
|
||||
ssh_build_choices_from_files "${_scan_files[@]}"
|
||||
if [[ "$COUNT" -gt 0 ]]; then
|
||||
local folder_selection
|
||||
folder_selection=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SELECT FOLDER KEYS" \
|
||||
folder_selection=$(whiptail --backtitle "$backtitle" --title "SELECT FOLDER KEYS" \
|
||||
--checklist "Select key(s) to import:" 20 78 10 "${CHOICES[@]}" 3>&1 1>&2 2>&3) || exit_script
|
||||
for tag in $folder_selection; do
|
||||
tag="${tag%\"}"
|
||||
@ -2138,10 +2431,10 @@ configure_ssh_settings() {
|
||||
[[ -n "$line" ]] && printf '%s\n' "$line" >>"$SSH_KEYS_FILE"
|
||||
done
|
||||
else
|
||||
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox "No keys found in: $glob_path" 8 60
|
||||
whiptail --backtitle "$backtitle" --msgbox "No keys found in: $glob_path" 8 60
|
||||
fi
|
||||
else
|
||||
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox "Path/glob returned no files." 8 60
|
||||
whiptail --backtitle "$backtitle" --msgbox "Path/glob returned no files." 8 60
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
@ -2155,12 +2448,9 @@ configure_ssh_settings() {
|
||||
printf '\n' >>"$SSH_KEYS_FILE"
|
||||
fi
|
||||
|
||||
if [[ -s "$SSH_KEYS_FILE" || "$PW" == -password* ]]; then
|
||||
if (whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SSH ACCESS" --yesno "Enable root SSH access?" 10 58); then
|
||||
SSH="yes"
|
||||
else
|
||||
SSH="no"
|
||||
fi
|
||||
# Always show SSH access dialog - user should be able to enable SSH even without keys
|
||||
if (whiptail --backtitle "$backtitle" --defaultno --title "SSH ACCESS" --yesno "Enable root SSH access?" 10 58); then
|
||||
SSH="yes"
|
||||
else
|
||||
SSH="no"
|
||||
fi
|
||||
@ -2278,15 +2568,23 @@ build_container() {
|
||||
none) ;;
|
||||
esac
|
||||
|
||||
# Build FEATURES string
|
||||
if [ "$CT_TYPE" == "1" ]; then
|
||||
FEATURES="keyctl=1,nesting=1"
|
||||
else
|
||||
# Build FEATURES string based on container type and user choices
|
||||
FEATURES=""
|
||||
|
||||
# Nesting support (user configurable, default enabled)
|
||||
if [ "${ENABLE_NESTING:-1}" == "1" ]; then
|
||||
FEATURES="nesting=1"
|
||||
fi
|
||||
|
||||
# Keyctl for unprivileged containers (needed for Docker)
|
||||
if [ "$CT_TYPE" == "1" ]; then
|
||||
[ -n "$FEATURES" ] && FEATURES="$FEATURES,"
|
||||
FEATURES="${FEATURES}keyctl=1"
|
||||
fi
|
||||
|
||||
if [ "$ENABLE_FUSE" == "yes" ]; then
|
||||
FEATURES="$FEATURES,fuse=1"
|
||||
[ -n "$FEATURES" ] && FEATURES="$FEATURES,"
|
||||
FEATURES="${FEATURES}fuse=1"
|
||||
fi
|
||||
|
||||
# Build PCT_OPTIONS as string for export
|
||||
@ -2387,21 +2685,15 @@ build_container() {
|
||||
# GPU/USB PASSTHROUGH CONFIGURATION
|
||||
# ============================================================================
|
||||
|
||||
# List of applications that benefit from GPU acceleration
|
||||
GPU_APPS=(
|
||||
"immich" "channels" "emby" "ersatztv" "frigate"
|
||||
"jellyfin" "plex" "scrypted" "tdarr" "unmanic"
|
||||
"ollama" "fileflows" "open-webui" "tunarr" "debian"
|
||||
"handbrake" "sunshine" "moonlight" "kodi" "stremio"
|
||||
"viseron"
|
||||
)
|
||||
|
||||
# Check if app needs GPU
|
||||
# Check if GPU passthrough is enabled
|
||||
# Returns true only if var_gpu is explicitly set to "yes"
|
||||
# Can be set via:
|
||||
# - Environment variable: var_gpu=yes bash -c "..."
|
||||
# - CT script default: var_gpu="${var_gpu:-no}"
|
||||
# - Advanced settings wizard
|
||||
# - App defaults file: /usr/local/community-scripts/defaults/<app>.vars
|
||||
is_gpu_app() {
|
||||
local app="${1,,}"
|
||||
for gpu_app in "${GPU_APPS[@]}"; do
|
||||
[[ "$app" == "${gpu_app,,}" ]] && return 0
|
||||
done
|
||||
[[ "${var_gpu:-no}" == "yes" ]] && return 0
|
||||
return 1
|
||||
}
|
||||
|
||||
@ -2442,9 +2734,16 @@ build_container() {
|
||||
msg_custom "🎮" "${GN}" "Detected NVIDIA GPU"
|
||||
|
||||
# Simple passthrough - just bind /dev/nvidia* devices if they exist
|
||||
for d in /dev/nvidia* /dev/nvidiactl /dev/nvidia-modeset /dev/nvidia-uvm /dev/nvidia-uvm-tools; do
|
||||
[[ -e "$d" ]] && NVIDIA_DEVICES+=("$d")
|
||||
# Only include character devices (-c), skip directories like /dev/nvidia-caps
|
||||
for d in /dev/nvidia*; do
|
||||
[[ -c "$d" ]] && NVIDIA_DEVICES+=("$d")
|
||||
done
|
||||
# Also check for devices inside /dev/nvidia-caps/ directory
|
||||
if [[ -d /dev/nvidia-caps ]]; then
|
||||
for d in /dev/nvidia-caps/*; do
|
||||
[[ -c "$d" ]] && NVIDIA_DEVICES+=("$d")
|
||||
done
|
||||
fi
|
||||
|
||||
if [[ ${#NVIDIA_DEVICES[@]} -gt 0 ]]; then
|
||||
msg_custom "🎮" "${GN}" "Found ${#NVIDIA_DEVICES[@]} NVIDIA device(s) for passthrough"
|
||||
@ -2484,8 +2783,13 @@ EOF
|
||||
|
||||
# Configure GPU passthrough
|
||||
configure_gpu_passthrough() {
|
||||
# Skip if not a GPU app and not privileged
|
||||
if [[ "$CT_TYPE" != "0" ]] && ! is_gpu_app "$APP"; then
|
||||
# Skip if:
|
||||
# GPU passthrough is enabled when var_gpu="yes":
|
||||
# - Set via environment variable: var_gpu=yes bash -c "..."
|
||||
# - Set in CT script: var_gpu="${var_gpu:-no}"
|
||||
# - Enabled in advanced_settings wizard
|
||||
# - Configured in app defaults file
|
||||
if ! is_gpu_app "$APP"; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
@ -2954,15 +3258,14 @@ fix_gpu_gids() {
|
||||
|
||||
# For privileged containers: also fix permissions inside container
|
||||
if [[ "$CT_TYPE" == "0" ]]; then
|
||||
pct exec "$CTID" -- bash -c "
|
||||
pct exec "$CTID" -- sh -c "
|
||||
if [ -d /dev/dri ]; then
|
||||
for dev in /dev/dri/*; do
|
||||
if [ -e \"\$dev\" ]; then
|
||||
if [[ \"\$dev\" =~ renderD ]]; then
|
||||
chgrp ${render_gid} \"\$dev\" 2>/dev/null || true
|
||||
else
|
||||
chgrp ${video_gid} \"\$dev\" 2>/dev/null || true
|
||||
fi
|
||||
case \"\$dev\" in
|
||||
*renderD*) chgrp ${render_gid} \"\$dev\" 2>/dev/null || true ;;
|
||||
*) chgrp ${video_gid} \"\$dev\" 2>/dev/null || true ;;
|
||||
esac
|
||||
chmod 660 \"\$dev\" 2>/dev/null || true
|
||||
fi
|
||||
done
|
||||
|
||||
@ -123,6 +123,7 @@ icons() {
|
||||
CREATING="${TAB}🚀${TAB}${CL}"
|
||||
ADVANCED="${TAB}🧩${TAB}${CL}"
|
||||
FUSE="${TAB}🗂️${TAB}${CL}"
|
||||
GPU="${TAB}🎮${TAB}${CL}"
|
||||
HOURGLASS="${TAB}⏳${TAB}"
|
||||
}
|
||||
|
||||
|
||||
@ -222,21 +222,12 @@ motd_ssh() {
|
||||
# Set terminal to 256-color mode
|
||||
grep -qxF "export TERM='xterm-256color'" /root/.bashrc || echo "export TERM='xterm-256color'" >>/root/.bashrc
|
||||
|
||||
# Get OS information (Debian / Ubuntu)
|
||||
if [ -f "/etc/os-release" ]; then
|
||||
OS_NAME=$(grep ^NAME /etc/os-release | cut -d= -f2 | tr -d '"')
|
||||
OS_VERSION=$(grep ^VERSION_ID /etc/os-release | cut -d= -f2 | tr -d '"')
|
||||
elif [ -f "/etc/debian_version" ]; then
|
||||
OS_NAME="Debian"
|
||||
OS_VERSION=$(cat /etc/debian_version)
|
||||
fi
|
||||
|
||||
PROFILE_FILE="/etc/profile.d/00_lxc-details.sh"
|
||||
echo "echo -e \"\"" >"$PROFILE_FILE"
|
||||
echo -e "echo -e \"${BOLD}${APPLICATION} LXC Container${CL}"\" >>"$PROFILE_FILE"
|
||||
echo -e "echo -e \"${TAB}${GATEWAY}${YW} Provided by: ${GN}community-scripts ORG ${YW}| GitHub: ${GN}https://github.com/community-scripts/ProxmoxVE${CL}\"" >>"$PROFILE_FILE"
|
||||
echo "echo \"\"" >>"$PROFILE_FILE"
|
||||
echo -e "echo -e \"${TAB}${OS}${YW} OS: ${GN}${OS_NAME} - Version: ${OS_VERSION}${CL}\"" >>"$PROFILE_FILE"
|
||||
echo -e "echo -e \"${TAB}${OS}${YW} OS: ${GN}\$(grep ^NAME /etc/os-release | cut -d= -f2 | tr -d '\"') - Version: \$(grep ^VERSION_ID /etc/os-release | cut -d= -f2 | tr -d '\"')${CL}\"" >>"$PROFILE_FILE"
|
||||
echo -e "echo -e \"${TAB}${HOSTNAME}${YW} Hostname: ${GN}\$(hostname)${CL}\"" >>"$PROFILE_FILE"
|
||||
echo -e "echo -e \"${TAB}${INFO}${YW} IP Address: ${GN}\$(hostname -I | awk '{print \$1}')${CL}\"" >>"$PROFILE_FILE"
|
||||
|
||||
|
||||
@ -72,17 +72,17 @@ stop_all_services() {
|
||||
local service_patterns=("$@")
|
||||
|
||||
for pattern in "${service_patterns[@]}"; do
|
||||
# Find all matching services
|
||||
# Find all matching services (grep || true to handle no matches)
|
||||
local services
|
||||
services=$(systemctl list-units --type=service --all 2>/dev/null |
|
||||
grep -oE "${pattern}[^ ]*\.service" 2>/dev/null | sort -u) || true
|
||||
|
||||
systemctl list-units --type=service --all 2>/dev/null |
|
||||
grep -oE "${pattern}[^ ]*\.service" |
|
||||
sort -u |
|
||||
if [[ -n "$services" ]]; then
|
||||
while read -r service; do
|
||||
|
||||
$STD systemctl stop "$service" 2>/dev/null || true
|
||||
$STD systemctl disable "$service" 2>/dev/null || true
|
||||
done
|
||||
|
||||
done <<<"$services"
|
||||
fi
|
||||
done
|
||||
|
||||
}
|
||||
@ -192,6 +192,8 @@ install_packages_with_retry() {
|
||||
if [[ $retry -le $max_retries ]]; then
|
||||
msg_warn "Package installation failed, retrying ($retry/$max_retries)..."
|
||||
sleep 2
|
||||
# Fix any interrupted dpkg operations before retry
|
||||
$STD dpkg --configure -a 2>/dev/null || true
|
||||
$STD apt update 2>/dev/null || true
|
||||
fi
|
||||
done
|
||||
@ -217,6 +219,8 @@ upgrade_packages_with_retry() {
|
||||
if [[ $retry -le $max_retries ]]; then
|
||||
msg_warn "Package upgrade failed, retrying ($retry/$max_retries)..."
|
||||
sleep 2
|
||||
# Fix any interrupted dpkg operations before retry
|
||||
$STD dpkg --configure -a 2>/dev/null || true
|
||||
$STD apt update 2>/dev/null || true
|
||||
fi
|
||||
done
|
||||
@ -1182,6 +1186,12 @@ cleanup_orphaned_sources() {
|
||||
# This should be called at the start of any setup function
|
||||
# ------------------------------------------------------------------------------
|
||||
ensure_apt_working() {
|
||||
# Fix interrupted dpkg operations first
|
||||
# This can happen if a previous installation was interrupted (e.g., by script error)
|
||||
if [[ -f /var/lib/dpkg/lock-frontend ]] || dpkg --audit 2>&1 | grep -q "interrupted"; then
|
||||
$STD dpkg --configure -a 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# Clean up orphaned sources first
|
||||
cleanup_orphaned_sources
|
||||
|
||||
@ -1725,12 +1735,13 @@ function fetch_and_deploy_gh_release() {
|
||||
|
||||
### Tarball Mode ###
|
||||
if [[ "$mode" == "tarball" || "$mode" == "source" ]]; then
|
||||
url=$(echo "$json" | jq -r '.tarball_url // empty')
|
||||
[[ -z "$url" ]] && url="https://github.com/$repo/archive/refs/tags/v$version.tar.gz"
|
||||
# GitHub API's tarball_url/zipball_url can return HTTP 300 Multiple Choices
|
||||
# when a branch and tag share the same name. Use explicit refs/tags/ URL instead.
|
||||
local direct_tarball_url="https://github.com/$repo/archive/refs/tags/$tag_name.tar.gz"
|
||||
filename="${app_lc}-${version}.tar.gz"
|
||||
|
||||
curl $download_timeout -fsSL -o "$tmpdir/$filename" "$url" || {
|
||||
msg_error "Download failed: $url"
|
||||
curl $download_timeout -fsSL -o "$tmpdir/$filename" "$direct_tarball_url" || {
|
||||
msg_error "Download failed: $direct_tarball_url"
|
||||
rm -rf "$tmpdir"
|
||||
return 1
|
||||
}
|
||||
|
||||
@ -24,7 +24,7 @@ RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
|
||||
METHOD=""
|
||||
NSAPP="opnsense-vm"
|
||||
var_os="opnsense"
|
||||
var_version="25.1"
|
||||
var_version="25.7"
|
||||
#
|
||||
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
|
||||
GEN_MAC_LAN=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
|
||||
@ -670,7 +670,7 @@ if [ -n "$WAN_BRG" ]; then
|
||||
msg_ok "WAN interface added"
|
||||
sleep 5 # Brief pause after adding network interface
|
||||
fi
|
||||
send_line_to_vm "sh ./opnsense-bootstrap.sh.in -y -f -r 25.1"
|
||||
send_line_to_vm "sh ./opnsense-bootstrap.sh.in -y -f -r 25.7"
|
||||
msg_ok "OPNsense VM is being installed, do not close the terminal, or the installation will fail."
|
||||
#We need to wait for the OPNsense build proccess to finish, this takes a few minutes
|
||||
sleep 1000
|
||||
|
||||
Reference in New Issue
Block a user