mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2025-12-14 19:23:32 +01:00
Compare commits
282 Commits
2025-11-22
...
add-script
| Author | SHA1 | Date | |
|---|---|---|---|
| 29de8ba5f6 | |||
| e5d5615465 | |||
| 31c19bed09 | |||
| bff0650d72 | |||
| d9b05882a3 | |||
| 31dbf2554c | |||
| 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 | |||
| 7ce32cc320 | |||
| 0e263ad54e | |||
| 85c20e3b25 | |||
| 268464781e | |||
| 775caae9c9 | |||
| 0f7c201b57 | |||
| 5780dc1532 | |||
| 5333e9f4b6 | |||
| 513e11569b | |||
| 9ed56051b9 | |||
| 4b496ebf2e | |||
| 530438a721 | |||
| 62201a0872 | |||
| 8e93f5cb1d | |||
| 838e663a6d | |||
| a826769899 | |||
| a5e6810872 | |||
| 7c73dac819 | |||
| cf616cbc9f | |||
| 84057a657a | |||
| fc1389ce8f | |||
| 952c35ecc7 | |||
| d41538e1b1 | |||
| 3b84a80f7a | |||
| cb7fb45edb | |||
| 462b68637d | |||
| fb12b1eea6 | |||
| 41329f919a | |||
| 72efc88a96 | |||
| d29a11acda | |||
| 5fd2a7cade | |||
| 3d4e7ea986 | |||
| 7d40b03359 | |||
| 1c9e03d6b7 | |||
| 056d064584 | |||
| 1603d930ae | |||
| 4801aca8aa | |||
| 5d1c6a7460 | |||
| c34a229f02 | |||
| 6944797213 | |||
| 1b1677ab7c | |||
| 833866d097 | |||
| 277abdf0e4 | |||
| 3ab710472c | |||
| a06cab39a9 | |||
| 0f1db8cc8e | |||
| fc2f72b2ac | |||
| 433aafe365 | |||
| 7978c3176c | |||
| e53bb2d825 | |||
| d079ac7d67 | |||
| f513fd09db | |||
| fb118eb0ca | |||
| dd440be505 | |||
| dcbec67b65 | |||
| 34b17c4b18 | |||
| 3bc2c968ab | |||
| 188e33485b | |||
| b55deb69ac | |||
| 787882db51 | |||
| 3e2c9c997c | |||
| 55fed2209d | |||
| b4feb4331d | |||
| 183dc7ac69 | |||
| d52908bd6e | |||
| 327cb37a55 | |||
| d2f86996db | |||
| 8cf12d7f4d | |||
| a2c31c7eaf | |||
| fa5ccdf3f1 | |||
| bd21c9f8ad | |||
| 6341ca0cf7 | |||
| 2a20c5b22d | |||
| 279427f38d | |||
| 2bd3b8bffa | |||
| c7ecc9cd13 | |||
| 3d99dfd218 | |||
| 11f1fdf2fa | |||
| 3596312f20 | |||
| e5cc0a4726 | |||
| c34659ced2 | |||
| c5eae09b93 | |||
| fd8a305129 | |||
| 64d0070756 | |||
| 5dcada4ef9 | |||
| 452007b654 | |||
| 6cf4eb603a | |||
| 1b40a62959 | |||
| 01cba0213f | |||
| 6f12aa7a5d | |||
| ec182aeaaf | |||
| 4d4095cd7d | |||
| 40ccccb557 | |||
| 59b80031fe | |||
| 1294b89fcb | |||
| 605c11d43f | |||
| b0586e347c | |||
| ce42f9077a | |||
| d0f82d7c23 | |||
| 1ec9a00abf | |||
| 8ab9666368 | |||
| fc559e0e09 | |||
| 380bf26d38 | |||
| c1f7d3d8d7 | |||
| 33489e607b | |||
| 877a25c0cc | |||
| 8c0abc9ffb | |||
| a43e287db2 | |||
| 1cd394a754 | |||
| 04bd9af89c | |||
| 4d8fa37ba0 | |||
| b4fe802d49 | |||
| 9b6c816c6f | |||
| 769e541938 | |||
| af9491d70d | |||
| 38dd38a9e2 | |||
| 5465a5dc58 | |||
| 5c6e73d4b6 | |||
| f3c2ca6f8a | |||
| 64df48c9b5 | |||
| 9f20c898fb | |||
| efdb44bc2e | |||
| 8caec1d13e | |||
| 39388a1b77 | |||
| 91b80caaa5 | |||
| dc3736146a | |||
| 40edc3e908 | |||
| 92bc24d1e5 | |||
| bdef4cbfef | |||
| 7d47eb81e9 | |||
| 276ce230f3 | |||
| 5f911164e3 | |||
| 8c6843f180 | |||
| 5004477246 | |||
| 8e15e0a524 | |||
| 54b634cea4 | |||
| d4e1b8f354 | |||
| 1a4f9ff815 | |||
| ee3d4874d1 | |||
| 01442d08ec | |||
| e1bf05ad69 | |||
| 7d435a1a5e | |||
| 7184755a0f | |||
| f0a23be999 | |||
| 93a764676f | |||
| 21e9030946 | |||
| 01774b1967 | |||
| 63c5b922de | |||
| 789cd3e187 | |||
| 282e8ef186 | |||
| 8a0b1d864b | |||
| d2a103c230 | |||
| 949ecc39ad | |||
| a9c08a611e | |||
| e13119250d | |||
| 87f71f75b1 | |||
| 3b6e5aae5f | |||
| f90fdadbb2 | |||
| 120affbcc5 | |||
| ae81cafa10 | |||
| f60493a862 | |||
| 0cbce2287d | |||
| edfeda61ad | |||
| 1815fee99b | |||
| 4bf830c6bf | |||
| d0cced9a1d | |||
| a56f7cfd45 | |||
| 79f7852777 | |||
| e54f372079 | |||
| cf89b17b0d | |||
| bb40a3fdd3 | |||
| 4ffa571a34 | |||
| 48f1f07892 | |||
| e5e587aa37 | |||
| b4bce4964c | |||
| c8ed59b148 | |||
| ce9323ab17 | |||
| 279ed5325c | |||
| b66fb43fff | |||
| ff7b321065 | |||
| 6a5ad42279 | |||
| 4631f1c09e | |||
| 6bcf8b3097 | |||
| 7ac9023a57 | |||
| 07e46a4585 | |||
| 4003aad7d5 | |||
| b9809d6768 | |||
| 70d59b825c | |||
| 72a39012b6 | |||
| 4134f68fb4 | |||
| c9e7662c5c | |||
| 4d6fa0a73d | |||
| 84412d9d9c | |||
| 581fed294f | |||
| c72a810179 | |||
| a335779c5f |
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}"
|
||||
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"
|
||||
|
||||
366
CHANGELOG.md
366
CHANGELOG.md
@ -10,8 +10,374 @@
|
||||
> [!CAUTION]
|
||||
Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes.
|
||||
|
||||
## 2025-12-09
|
||||
|
||||
## 2025-12-08
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- typo: tandoor instead of trandoor [@Neonize](https://github.com/Neonize) ([#9771](https://github.com/community-scripts/ProxmoxVE/pull/9771))
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Tandoor: Remove postgres17-contrib package [@tremor021](https://github.com/tremor021) ([#9781](https://github.com/community-scripts/ProxmoxVE/pull/9781))
|
||||
|
||||
- #### ✨ 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
|
||||
|
||||
- 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
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Fix kimai.sh update script path typo for local.yaml [@Copilot](https://github.com/Copilot) ([#9645](https://github.com/community-scripts/ProxmoxVE/pull/9645))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- core: extend storage type support (rbd, nfs, cifs) and validation (iscidirect, isci, zfs, cephfs, pbs) [@MickLesk](https://github.com/MickLesk) ([#9646](https://github.com/community-scripts/ProxmoxVE/pull/9646))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- update pdm repo to stable [@CrazyWolf13](https://github.com/CrazyWolf13) ([#9648](https://github.com/community-scripts/ProxmoxVE/pull/9648))
|
||||
|
||||
## 2025-12-03
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- fix(opnsense-vm): improve script and add single-interface mode [@AlphaLawless](https://github.com/AlphaLawless) ([#9614](https://github.com/community-scripts/ProxmoxVE/pull/9614))
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Fix Homebridge update detection for Debian 13 DEB822 format [@Copilot](https://github.com/Copilot) ([#9629](https://github.com/community-scripts/ProxmoxVE/pull/9629))
|
||||
- go2rtc: Add WorkingDirectory to go2rtc service configuration [@tremor021](https://github.com/tremor021) ([#9618](https://github.com/community-scripts/ProxmoxVE/pull/9618))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- explicit node versions [@CrazyWolf13](https://github.com/CrazyWolf13) ([#9594](https://github.com/community-scripts/ProxmoxVE/pull/9594))
|
||||
|
||||
### 🌐 Website
|
||||
|
||||
- Bump next from 15.5.2 to 15.5.7 in /frontend in the npm_and_yarn group across 1 directory [@dependabot[bot]](https://github.com/dependabot[bot]) ([#9632](https://github.com/community-scripts/ProxmoxVE/pull/9632))
|
||||
|
||||
- #### 📝 Script Information
|
||||
|
||||
- Update logo URL in swizzin.json [@MickLesk](https://github.com/MickLesk) ([#9627](https://github.com/community-scripts/ProxmoxVE/pull/9627))
|
||||
|
||||
## 2025-12-02
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- Snowshare ([#9578](https://github.com/community-scripts/ProxmoxVE/pull/9578))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- NetVisor: patch systemd file to fix new OIDC config [@vhsdream](https://github.com/vhsdream) ([#9562](https://github.com/community-scripts/ProxmoxVE/pull/9562))
|
||||
- Refactor: BookStack [@tremor021](https://github.com/tremor021) ([#9567](https://github.com/community-scripts/ProxmoxVE/pull/9567))
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Matterbridge: Fix ExecStart command in service install script to allow childbridge mode [@jonalbr](https://github.com/jonalbr) ([#9603](https://github.com/community-scripts/ProxmoxVE/pull/9603))
|
||||
- Open-webui add .env backup and restore functionality from older versions [@DrDonoso](https://github.com/DrDonoso) ([#9592](https://github.com/community-scripts/ProxmoxVE/pull/9592))
|
||||
- Booklore: Downgrad Java from 25 to 21 [@Pr0mises](https://github.com/Pr0mises) ([#9566](https://github.com/community-scripts/ProxmoxVE/pull/9566))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- Set Valkey memory and eviction defaults [@pshankinclarke](https://github.com/pshankinclarke) ([#9602](https://github.com/community-scripts/ProxmoxVE/pull/9602))
|
||||
- Add auth via requirepass to Valkey [@pshankinclarke](https://github.com/pshankinclarke) ([#9570](https://github.com/community-scripts/ProxmoxVE/pull/9570))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- Refactor: 2FAuth [@tremor021](https://github.com/tremor021) ([#9582](https://github.com/community-scripts/ProxmoxVE/pull/9582))
|
||||
- Refactor: Paperless-AI [@MickLesk](https://github.com/MickLesk) ([#9588](https://github.com/community-scripts/ProxmoxVE/pull/9588))
|
||||
- Refactor: AdventureLog [@tremor021](https://github.com/tremor021) ([#9583](https://github.com/community-scripts/ProxmoxVE/pull/9583))
|
||||
- CommaFeed: Bump Java and service file [@tremor021](https://github.com/tremor021) ([#9564](https://github.com/community-scripts/ProxmoxVE/pull/9564))
|
||||
- Refactor: Docmost [@tremor021](https://github.com/tremor021) ([#9563](https://github.com/community-scripts/ProxmoxVE/pull/9563))
|
||||
- Cloudflared: Add repo via helper function [@tremor021](https://github.com/tremor021) ([#9565](https://github.com/community-scripts/ProxmoxVE/pull/9565))
|
||||
|
||||
### 🧰 Maintenance
|
||||
|
||||
- #### 📝 Documentation
|
||||
|
||||
- add configuration and deployment guides to docs [@MickLesk](https://github.com/MickLesk) ([#9591](https://github.com/community-scripts/ProxmoxVE/pull/9591))
|
||||
|
||||
### 🌐 Website
|
||||
|
||||
- #### 📝 Script Information
|
||||
|
||||
- Update category for "Wanderer" [@Lorondos](https://github.com/Lorondos) ([#9607](https://github.com/community-scripts/ProxmoxVE/pull/9607))
|
||||
|
||||
## 2025-12-01
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- Wanderer ([#9556](https://github.com/community-scripts/ProxmoxVE/pull/9556))
|
||||
- core: add cloud-init.func library for VM configuration [@MickLesk](https://github.com/MickLesk) ([#9538](https://github.com/community-scripts/ProxmoxVE/pull/9538))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- core: sanitize appname for certificate generation [@tremor021](https://github.com/tremor021) ([#9552](https://github.com/community-scripts/ProxmoxVE/pull/9552))
|
||||
- Fix Django superuser creation failing with ImproperlyConfigured error [@Copilot](https://github.com/Copilot) ([#9554](https://github.com/community-scripts/ProxmoxVE/pull/9554))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- Bump Baikal to deb13 [@MickLesk](https://github.com/MickLesk) ([#9544](https://github.com/community-scripts/ProxmoxVE/pull/9544))
|
||||
- Enhance MariaDB version fallback logic [@MickLesk](https://github.com/MickLesk) ([#9545](https://github.com/community-scripts/ProxmoxVE/pull/9545))
|
||||
|
||||
- #### 💥 Breaking Changes
|
||||
|
||||
- Refactor: Healthchecks [@MickLesk](https://github.com/MickLesk) ([#9188](https://github.com/community-scripts/ProxmoxVE/pull/9188))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- Refactor: Mealie [@MickLesk](https://github.com/MickLesk) ([#9308](https://github.com/community-scripts/ProxmoxVE/pull/9308))
|
||||
|
||||
### 🧰 Maintenance
|
||||
|
||||
- #### 📂 Github
|
||||
|
||||
- add comprehensive documentation (core, develop, functions, technical guide, contributor guide) [@MickLesk](https://github.com/MickLesk) ([#9537](https://github.com/community-scripts/ProxmoxVE/pull/9537))
|
||||
|
||||
### 🌐 Website
|
||||
|
||||
- #### 📝 Script Information
|
||||
|
||||
- update selfhst icon-URLs to use @master path [@MickLesk](https://github.com/MickLesk) ([#9543](https://github.com/community-scripts/ProxmoxVE/pull/9543))
|
||||
|
||||
## 2025-11-30
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- fix(recyclarr): remove update script systemctl commands [@vidonnus](https://github.com/vidonnus) ([#9522](https://github.com/community-scripts/ProxmoxVE/pull/9522))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- Refactor: Actual Budget [@tremor021](https://github.com/tremor021) ([#9518](https://github.com/community-scripts/ProxmoxVE/pull/9518))
|
||||
|
||||
## 2025-11-29
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- Valkey ([#9510](https://github.com/community-scripts/ProxmoxVE/pull/9510))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Fix duplicate ORIGIN in .env for OpenArchiver install script [@Copilot](https://github.com/Copilot) ([#9503](https://github.com/community-scripts/ProxmoxVE/pull/9503))
|
||||
|
||||
- #### 💥 Breaking Changes
|
||||
|
||||
- Remove: Documenso [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#9507](https://github.com/community-scripts/ProxmoxVE/pull/9507))
|
||||
|
||||
### 🌐 Website
|
||||
|
||||
- Update Discord link on website [@tremor021](https://github.com/tremor021) ([#9499](https://github.com/community-scripts/ProxmoxVE/pull/9499))
|
||||
|
||||
## 2025-11-28
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Apache-guacamole: fixed to early rm [@mtorazzi](https://github.com/mtorazzi) ([#9492](https://github.com/community-scripts/ProxmoxVE/pull/9492))
|
||||
|
||||
- #### 💥 Breaking Changes
|
||||
|
||||
- Remove: Habitica [@MickLesk](https://github.com/MickLesk) ([#9489](https://github.com/community-scripts/ProxmoxVE/pull/9489))
|
||||
|
||||
## 2025-11-27
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- Qdrant ([#9465](https://github.com/community-scripts/ProxmoxVE/pull/9465))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 💥 Breaking Changes
|
||||
|
||||
- Upgrade pve-scripts-local to node 24 [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#9457](https://github.com/community-scripts/ProxmoxVE/pull/9457))
|
||||
|
||||
### 🌐 Website
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- PBS: fix typo [@joshuaharmsen845](https://github.com/joshuaharmsen845) ([#9482](https://github.com/community-scripts/ProxmoxVE/pull/9482))
|
||||
|
||||
## 2025-11-26
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- Joplin Server: Increase RAM for LXC [@tremor021](https://github.com/tremor021) ([#9460](https://github.com/community-scripts/ProxmoxVE/pull/9460))
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Fix Open WebUI update logic (swap upgrade/install) [@camcop](https://github.com/camcop) ([#9461](https://github.com/community-scripts/ProxmoxVE/pull/9461))
|
||||
|
||||
## 2025-11-25
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Open WebUI: Change install command to upgrade for Open-WebUI [@tremor021](https://github.com/tremor021) ([#9448](https://github.com/community-scripts/ProxmoxVE/pull/9448))
|
||||
- core: set default LANG in locale configuration [@MickLesk](https://github.com/MickLesk) ([#9440](https://github.com/community-scripts/ProxmoxVE/pull/9440))
|
||||
- documenso: switch to npm peer-.deps to get build running [@MickLesk](https://github.com/MickLesk) ([#9441](https://github.com/community-scripts/ProxmoxVE/pull/9441))
|
||||
- Refactor Asterisk installation process [@MickLesk](https://github.com/MickLesk) ([#9429](https://github.com/community-scripts/ProxmoxVE/pull/9429))
|
||||
- Fix the mikrotik VM installer after they reformatted their downloads page [@paul-ridgway](https://github.com/paul-ridgway) ([#9434](https://github.com/community-scripts/ProxmoxVE/pull/9434))
|
||||
- paperless: patch consume to uv [@MickLesk](https://github.com/MickLesk) ([#9425](https://github.com/community-scripts/ProxmoxVE/pull/9425))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- add Zabbix version selection to install and update scripts [@MickLesk](https://github.com/MickLesk) ([#9430](https://github.com/community-scripts/ProxmoxVE/pull/9430))
|
||||
|
||||
### 🧰 Maintenance
|
||||
|
||||
- #### 📂 Github
|
||||
|
||||
- gh: update supported PVE Version [@MickLesk](https://github.com/MickLesk) ([#9422](https://github.com/community-scripts/ProxmoxVE/pull/9422))
|
||||
|
||||
## 2025-11-24
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- core: remove uv cache clean command [@MickLesk](https://github.com/MickLesk) ([#9413](https://github.com/community-scripts/ProxmoxVE/pull/9413))
|
||||
- Joplin-Server: Bump Node.js version from 22 to 24 [@tremor021](https://github.com/tremor021) ([#9405](https://github.com/community-scripts/ProxmoxVE/pull/9405))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- [Fix]: Wizarr DB error during install [@vhsdream](https://github.com/vhsdream) ([#9415](https://github.com/community-scripts/ProxmoxVE/pull/9415))
|
||||
|
||||
### 🌐 Website
|
||||
|
||||
- #### 📝 Script Information
|
||||
|
||||
- Gitea: Update website [@tremor021](https://github.com/tremor021) ([#9406](https://github.com/community-scripts/ProxmoxVE/pull/9406))
|
||||
- huntarr: disable on website during install issues [@MickLesk](https://github.com/MickLesk) ([#9403](https://github.com/community-scripts/ProxmoxVE/pull/9403))
|
||||
|
||||
## 2025-11-23
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- core: remove journal log rotation [@MickLesk](https://github.com/MickLesk) ([#9392](https://github.com/community-scripts/ProxmoxVE/pull/9392))
|
||||
- [LibreNMS] Correcting mariadb sed string for Debian 13 default in install/librenms-install.sh, website config for Debian 13 #9369 [@htmlspinnr](https://github.com/htmlspinnr) ([#9370](https://github.com/community-scripts/ProxmoxVE/pull/9370))
|
||||
- fix: Snipe-IT update check failure [@ruanmed](https://github.com/ruanmed) ([#9371](https://github.com/community-scripts/ProxmoxVE/pull/9371))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- PVE Kernel Clean: Add info about currently running kernel [@tremor021](https://github.com/tremor021) ([#9388](https://github.com/community-scripts/ProxmoxVE/pull/9388))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- Update glpi-install.sh to remove install.php [@CrazyWolf13](https://github.com/CrazyWolf13) ([#9378](https://github.com/community-scripts/ProxmoxVE/pull/9378))
|
||||
|
||||
### 🌐 Website
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- fix: enhance back navigation in NotFoundPage component and remove unused deps [@BramSuurdje](https://github.com/BramSuurdje) ([#9341](https://github.com/community-scripts/ProxmoxVE/pull/9341))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- feat(frontend): add script disable functionality with visual indicators [@AlphaLawless](https://github.com/AlphaLawless) ([#9374](https://github.com/community-scripts/ProxmoxVE/pull/9374))
|
||||
|
||||
## 2025-11-22
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
12
README.md
12
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>
|
||||
|
||||
@ -105,7 +105,7 @@
|
||||
<tr>
|
||||
<td align="center" width="33%">
|
||||
<h3>🖥️ Proxmox VE</h3>
|
||||
<p>Version 8.4.x or 9.0.x</p>
|
||||
<p>Version: 8.4.x | 9.0.x | 9.1.x</p>
|
||||
</td>
|
||||
<td align="center" width="33%">
|
||||
<h3>🐧 Operating System</h3>
|
||||
@ -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>
|
||||
|
||||
|
||||
@ -6,6 +6,7 @@ This project currently supports the following versions of Proxmox VE (PVE):
|
||||
|
||||
| Version | Supported |
|
||||
| ------- | ------------------ |
|
||||
| 9.1.x | :white_check_mark: |
|
||||
| 9.0.x | :white_check_mark: |
|
||||
| 8.4.x | :white_check_mark: |
|
||||
| 8.3.x | Limited support* ❕ |
|
||||
|
||||
@ -40,10 +40,7 @@ function update_script() {
|
||||
msg_ok "Backup Created"
|
||||
|
||||
if ! dpkg -l | grep -q 'php8.3'; then
|
||||
$STD apt-get install -y \
|
||||
lsb-release \
|
||||
gnupg2
|
||||
PHP_VERSION="8.3" PHP_MODULE="common,ctype,fileinfo,mysql,cli" PHP_FPM="YES" setup_php
|
||||
PHP_VERSION="8.3" PHP_MODULE="common,ctype,fileinfo,mysql,cli,tokenizer,dom,redis,session,openssl" PHP_FPM="YES" setup_php
|
||||
sed -i 's/php8.2/php8.3/g' /etc/nginx/conf.d/2fauth.conf
|
||||
fi
|
||||
fetch_and_deploy_gh_release "2fauth" "Bubka/2FAuth"
|
||||
|
||||
@ -24,33 +24,32 @@ function update_script() {
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
if [[ ! -f /opt/actualbudget_version.txt ]]; then
|
||||
if [[ ! -f ~/.actualbudget && ! -f /opt/actualbudget_version.txt ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
RELEASE=$(curl -fsSL https://api.github.com/repos/actualbudget/actual/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||
RELEASE=$(get_latest_github_release "actualbudget/actual")
|
||||
if [[ -f /opt/actualbudget-data/config.json ]]; then
|
||||
if [[ ! -f /opt/actualbudget_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/actualbudget_version.txt)" ]]; then
|
||||
if check_for_gh_release "actualbudget" "actualbudget/actual"; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop actualbudget
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
msg_info "Updating ${APP} to ${RELEASE}"
|
||||
msg_info "Updating Actual Budget to ${RELEASE}"
|
||||
$STD npm update -g @actual-app/sync-server
|
||||
echo "${RELEASE}" >/opt/actualbudget_version.txt
|
||||
msg_ok "Updated ${APP} to ${RELEASE}"
|
||||
echo "${RELEASE}" >~/.actualbudget
|
||||
msg_ok "Updated Actual Budget to ${RELEASE}"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start actualbudget
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Updated successfully!"
|
||||
else
|
||||
msg_info "${APP} is already up to date"
|
||||
fi
|
||||
else
|
||||
msg_info "Old Installation Found, you need to migrate your data and recreate to a new container"
|
||||
msg_info "Please follow the instructions on the ${APP} website to migrate your data"
|
||||
msg_info "Please follow the instructions on the Actual Budget website to migrate your data"
|
||||
msg_info "https://actualbudget.org/docs/backup-restore/backup"
|
||||
exit
|
||||
fi
|
||||
|
||||
@ -45,10 +45,14 @@ 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
|
||||
cd /opt/adventurelog/backend/server || exit
|
||||
cd /opt/adventurelog/backend/server
|
||||
if [[ ! -x .venv/bin/python ]]; then
|
||||
$STD uv venv .venv
|
||||
$STD .venv/bin/python -m ensurepip --upgrade
|
||||
@ -59,7 +63,7 @@ function update_script() {
|
||||
$STD .venv/bin/python -m manage migrate
|
||||
|
||||
cp /opt/adventurelog-backup/frontend/.env /opt/adventurelog/frontend/.env
|
||||
cd /opt/adventurelog/frontend || exit
|
||||
cd /opt/adventurelog/frontend
|
||||
$STD pnpm i
|
||||
$STD pnpm build
|
||||
rm -rf /opt/adventurelog-backup
|
||||
|
||||
@ -11,7 +11,7 @@ var_cpu="${var_cpu:-1}"
|
||||
var_ram="${var_ram:-512}"
|
||||
var_disk="${var_disk:-4}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-12}"
|
||||
var_version="${var_version:-13}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
@ -37,8 +37,9 @@ function update_script() {
|
||||
mv /opt/baikal /opt/baikal-backup
|
||||
msg_ok "Backed up data"
|
||||
|
||||
fetch_and_deploy_gh_release "baikal" "sabre-io/Baikal"
|
||||
PHP_APACHE="YES" PHP_MODULE="pgsql,curl" PHP_VERSION="8.3" setup_php
|
||||
setup_composer
|
||||
fetch_and_deploy_gh_release "baikal" "sabre-io/Baikal"
|
||||
|
||||
msg_info "Configuring Baikal"
|
||||
cp -r /opt/baikal-backup/config/baikal.yaml /opt/baikal/config/
|
||||
|
||||
@ -45,7 +45,7 @@ function update_script() {
|
||||
$STD npm run build --configuration=production
|
||||
msg_ok "Built Frontend"
|
||||
|
||||
JAVA_VERSION="25" setup_java
|
||||
JAVA_VERSION="21" setup_java
|
||||
|
||||
msg_info "Building Backend"
|
||||
cd /opt/booklore/booklore-api
|
||||
|
||||
@ -11,7 +11,7 @@ var_cpu="${var_cpu:-1}"
|
||||
var_ram="${var_ram:-1024}"
|
||||
var_disk="${var_disk:-4}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-12}"
|
||||
var_version="${var_version:-13}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
@ -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
|
||||
}
|
||||
|
||||
|
||||
@ -28,6 +28,9 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
JAVA_VERSION="25" setup_java
|
||||
|
||||
if check_for_gh_release "commafeed" "Athou/commafeed"; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop commafeed
|
||||
|
||||
46
ct/coolify.sh
Normal file
46
ct/coolify.sh
Normal file
@ -0,0 +1,46 @@
|
||||
#!/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://coolify.io/
|
||||
|
||||
APP="Coolify"
|
||||
var_tags="${var_tags:-docker;paas}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-4096}"
|
||||
var_disk="${var_disk:-30}"
|
||||
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 /data/coolify ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
msg_info "Updating Coolify"
|
||||
$STD bash <(curl -fsSL https://cdn.coollabs.io/coolify/install.sh)
|
||||
msg_ok "Updated Coolify"
|
||||
msg_ok "Updated successfully!"
|
||||
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}:8000${CL}"
|
||||
@ -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
|
||||
|
||||
@ -1,74 +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: MickLesk (CanbiZ)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/documenso/documenso
|
||||
|
||||
APP="Documenso"
|
||||
var_tags="${var_tags:-document}"
|
||||
var_disk="${var_disk:-12}"
|
||||
var_cpu="${var_cpu:-6}"
|
||||
var_ram="${var_ram:-6144}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-12}"
|
||||
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/documenso ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
RELEASE=$(curl -fsSL https://api.github.com/repos/documenso/documenso/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 "Stopping Service"
|
||||
systemctl stop documenso
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
msg_info "Updating ${APP} to ${RELEASE}"
|
||||
cp /opt/documenso/.env /opt/
|
||||
rm -rf /opt/documenso
|
||||
cd /opt
|
||||
curl -fsSL "https://github.com/documenso/documenso/archive/refs/tags/v${RELEASE}.zip" -o v${RELEASE}.zip
|
||||
$STD unzip v${RELEASE}.zip
|
||||
mv documenso-${RELEASE} /opt/documenso
|
||||
cd /opt/documenso
|
||||
mv /opt/.env /opt/documenso/.env
|
||||
export TURBO_CACHE=1
|
||||
export NEXT_TELEMETRY_DISABLED=1
|
||||
export CYPRESS_INSTALL_BINARY=0
|
||||
export NODE_OPTIONS="--max-old-space-size=4096"
|
||||
$STD npm ci
|
||||
$STD turbo run build --filter=@documenso/remix
|
||||
$STD npm run prisma:migrate-deploy
|
||||
$STD turbo daemon stop
|
||||
rm -rf /opt/v${RELEASE}.zip
|
||||
echo "${RELEASE}" >/opt/${APP}_version.txt
|
||||
msg_ok "Updated ${APP}"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start documenso
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Updated successfully!"
|
||||
else
|
||||
msg_ok "No update required. ${APP} is already at ${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}:3000${CL}"
|
||||
@ -34,7 +34,7 @@ function update_script() {
|
||||
msg_info "Service stopped"
|
||||
|
||||
PG_VERSION="17" setup_postgresql
|
||||
setup_nodejs
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "domain-locker" "Lissy93/domain-locker"
|
||||
|
||||
msg_info "Installing Modules (patience)"
|
||||
|
||||
@ -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}"
|
||||
|
||||
@ -1,82 +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: Slaviša Arežina (tremor021)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/HabitRPG/habitica
|
||||
|
||||
APP="Habitica"
|
||||
var_tags="${var_tags:-gaming}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-4096}"
|
||||
var_disk="${var_disk:-8}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-12}"
|
||||
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/habitica" ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
NODE_VERSION="20" NODE_MODULE="gulp-cli,mocha" setup_nodejs
|
||||
if check_for_gh_release "habitica" "HabitRPG/habitica"; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop habitica-mongodb
|
||||
systemctl stop habitica
|
||||
systemctl stop habitica-client
|
||||
msg_info "Stopped Service"
|
||||
|
||||
msg_info "Save configuration"
|
||||
if [[ -f /opt/habitica/config.json ]]; then
|
||||
cp /opt/habitica/config.json ~/config.json
|
||||
msg_ok "Saved configuration"
|
||||
else
|
||||
msg_warn "No configuration file found, skipping save"
|
||||
fi
|
||||
|
||||
fetch_and_deploy_gh_release "habitica" "HabitRPG/habitica" "tarball" "latest" "/opt/habitica"
|
||||
|
||||
msg_info "Updating $APP"
|
||||
cd /opt/habitica
|
||||
$STD npm i
|
||||
$STD npm run postinstall
|
||||
$STD npm run client:build
|
||||
$STD gulp build:prod
|
||||
msg_ok "Updated $APP"
|
||||
|
||||
msg_info "Restoring configuration"
|
||||
if [[ -f ~/config.json ]]; then
|
||||
cp ~/config.json /opt/habitica/config.json
|
||||
msg_ok "Restored configuration"
|
||||
else
|
||||
msg_warn "No configuration file found to restore"
|
||||
fi
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start habitica-mongodb
|
||||
systemctl start habitica
|
||||
systemctl start habitica-client
|
||||
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}:3000${CL}"
|
||||
@ -1,6 +0,0 @@
|
||||
____
|
||||
/ __ \____ _______ ______ ___ ___ ____ _________
|
||||
/ / / / __ \/ ___/ / / / __ `__ \/ _ \/ __ \/ ___/ __ \
|
||||
/ /_/ / /_/ / /__/ /_/ / / / / / / __/ / / (__ ) /_/ /
|
||||
/_____/\____/\___/\__,_/_/ /_/ /_/\___/_/ /_/____/\____/
|
||||
|
||||
6
ct/headers/endurain
Normal file
6
ct/headers/endurain
Normal file
@ -0,0 +1,6 @@
|
||||
______ __ _
|
||||
/ ____/___ ____/ /_ ___________ _(_)___
|
||||
/ __/ / __ \/ __ / / / / ___/ __ `/ / __ \
|
||||
/ /___/ / / / /_/ / /_/ / / / /_/ / / / / /
|
||||
/_____/_/ /_/\__,_/\__,_/_/ \__,_/_/_/ /_/
|
||||
|
||||
@ -1,6 +0,0 @@
|
||||
__ __ __ _ __ _
|
||||
/ / / /___ _/ /_ (_) /_(_)________ _
|
||||
/ /_/ / __ `/ __ \/ / __/ / ___/ __ `/
|
||||
/ __ / /_/ / /_/ / / /_/ / /__/ /_/ /
|
||||
/_/ /_/\__,_/_.___/_/\__/_/\___/\__,_/
|
||||
|
||||
6
ct/headers/metube
Normal file
6
ct/headers/metube
Normal file
@ -0,0 +1,6 @@
|
||||
__ ___ ______ __
|
||||
/ |/ /__/_ __/_ __/ /_ ___
|
||||
/ /|_/ / _ \/ / / / / / __ \/ _ \
|
||||
/ / / / __/ / / /_/ / /_/ / __/
|
||||
/_/ /_/\___/_/ \__,_/_.___/\___/
|
||||
|
||||
6
ct/headers/qdrant
Normal file
6
ct/headers/qdrant
Normal file
@ -0,0 +1,6 @@
|
||||
____ __ __
|
||||
/ __ \____/ /________ _____ / /_
|
||||
/ / / / __ / ___/ __ `/ __ \/ __/
|
||||
/ /_/ / /_/ / / / /_/ / / / / /_
|
||||
\___\_\__,_/_/ \__,_/_/ /_/\__/
|
||||
|
||||
6
ct/headers/snowshare
Normal file
6
ct/headers/snowshare
Normal file
@ -0,0 +1,6 @@
|
||||
_____ _____ __
|
||||
/ ___/____ ____ _ __/ ___// /_ ____ _________
|
||||
\__ \/ __ \/ __ \ | /| / /\__ \/ __ \/ __ `/ ___/ _ \
|
||||
___/ / / / / /_/ / |/ |/ /___/ / / / / /_/ / / / __/
|
||||
/____/_/ /_/\____/|__/|__//____/_/ /_/\__,_/_/ \___/
|
||||
|
||||
6
ct/headers/valkey
Normal file
6
ct/headers/valkey
Normal file
@ -0,0 +1,6 @@
|
||||
_ __ ____
|
||||
| | / /___ _/ / /_____ __ __
|
||||
| | / / __ `/ / //_/ _ \/ / / /
|
||||
| |/ / /_/ / / ,< / __/ /_/ /
|
||||
|___/\__,_/_/_/|_|\___/\__, /
|
||||
/____/
|
||||
6
ct/headers/wanderer
Normal file
6
ct/headers/wanderer
Normal file
@ -0,0 +1,6 @@
|
||||
_ __ __
|
||||
| | / /___ _____ ____/ /__ ________ _____
|
||||
| | /| / / __ `/ __ \/ __ / _ \/ ___/ _ \/ ___/
|
||||
| |/ |/ / /_/ / / / / /_/ / __/ / / __/ /
|
||||
|__/|__/\__,_/_/ /_/\__,_/\___/_/ \___/_/
|
||||
|
||||
@ -28,26 +28,42 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if check_for_gh_release "healthchecks" "healthchecks/healthchecks"; then
|
||||
msg_info "Stopping Services"
|
||||
systemctl stop healthchecks
|
||||
msg_ok "Stopped Services"
|
||||
|
||||
PYTHON_VERSION="3.13" setup_uv
|
||||
msg_info "Backing up existing installation"
|
||||
BACKUP="/opt/healthchecks-backup-$(date +%F-%H%M)"
|
||||
cp -a /opt/healthchecks "$BACKUP"
|
||||
msg_ok "Backup created at $BACKUP"
|
||||
|
||||
fetch_and_deploy_gh_release "healthchecks" "healthchecks/healthchecks"
|
||||
|
||||
msg_info "Updating healthchecks"
|
||||
cd /opt/healthchecks
|
||||
mkdir -p /opt/healthchecks/static-collected/
|
||||
$STD uv pip install wheel gunicorn -r requirements.txt --system
|
||||
$STD uv run -- python manage.py makemigrations
|
||||
$STD uv run -- python manage.py migrate --noinput
|
||||
$STD uv run -- python manage.py collectstatic --noinput
|
||||
$STD uv run -- python manage.py compress
|
||||
msg_ok "Updated healthchecks"
|
||||
if [[ -d venv ]]; then
|
||||
rm -rf venv
|
||||
fi
|
||||
msg_info "Recreating Python venv"
|
||||
$STD python3 -m venv venv
|
||||
$STD source venv/bin/activate
|
||||
$STD pip install --upgrade pip wheel
|
||||
msg_ok "Created venv"
|
||||
|
||||
msg_info "Installing requirements"
|
||||
$STD pip install gunicorn -r requirements.txt
|
||||
msg_ok "Installed requirements"
|
||||
|
||||
msg_info "Running Django migrations"
|
||||
$STD python manage.py migrate --noinput
|
||||
$STD python manage.py collectstatic --noinput
|
||||
$STD python manage.py compress
|
||||
msg_ok "Completed Django migrations and static build"
|
||||
|
||||
msg_info "Starting Services"
|
||||
systemctl start healthchecks
|
||||
systemctl restart caddy
|
||||
systemctl reload caddy
|
||||
msg_ok "Started Services"
|
||||
msg_ok "Updated successfully!"
|
||||
fi
|
||||
|
||||
@ -23,7 +23,7 @@ function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
if [[ ! -f /etc/apt/sources.list.d/homebridge.list ]]; then
|
||||
if ! dpkg -s homebridge >/dev/null 2>&1; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
@ -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
|
||||
|
||||
@ -8,7 +8,7 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
|
||||
APP="Joplin-Server"
|
||||
var_tags="${var_tags:-notes}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-4096}"
|
||||
var_ram="${var_ram:-6144}"
|
||||
var_disk="${var_disk:-20}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
@ -28,6 +28,8 @@ function update_script() {
|
||||
exit
|
||||
fi
|
||||
|
||||
NODE_VERSION=24 NODE_MODULE="yarn,npm,pm2" setup_nodejs
|
||||
|
||||
if check_for_gh_release "joplin-server" "laurent22/joplin"; then
|
||||
msg_info "Stopping Services"
|
||||
systemctl stop joplin-server
|
||||
|
||||
@ -56,7 +56,7 @@ function update_script() {
|
||||
[ -f "$BACKUP_DIR/local.yaml" ] && cp "$BACKUP_DIR/local.yaml" /opt/kimai/config/packages/
|
||||
rm -rf "$BACKUP_DIR"
|
||||
cd /opt/kimai
|
||||
sed -i '/^admin_lte:/,/^[^[:space:]]/d' config/local.yaml
|
||||
sed -i '/^admin_lte:/,/^[^[:space:]]/d' config/packages/local.yaml
|
||||
$STD composer install --no-dev --optimize-autoloader
|
||||
$STD bin/console kimai:update
|
||||
msg_ok "Updated Kimai"
|
||||
|
||||
@ -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"
|
||||
|
||||
63
ct/mealie.sh
63
ct/mealie.sh
@ -8,7 +8,7 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
|
||||
APP="Mealie"
|
||||
var_tags="${var_tags:-recipes}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-2048}"
|
||||
var_ram="${var_ram:-3072}"
|
||||
var_disk="${var_disk:-10}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
@ -30,53 +30,61 @@ function update_script() {
|
||||
fi
|
||||
if check_for_gh_release "mealie" "mealie-recipes/mealie"; then
|
||||
PYTHON_VERSION="3.12" setup_uv
|
||||
NODE_MODULE="yarn" NODE_VERSION="20" setup_nodejs
|
||||
NODE_MODULE="yarn" NODE_VERSION="24" setup_nodejs
|
||||
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop mealie
|
||||
msg_info "Stopped Service"
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
msg_info "Backing up .env and start.sh"
|
||||
cp -f /opt/mealie/mealie.env /opt/mealie/mealie.env.bak
|
||||
cp -f /opt/mealie/start.sh /opt/mealie/start.sh.bak
|
||||
msg_info "Backing up Configuration"
|
||||
cp -f /opt/mealie/mealie.env /opt/mealie.env
|
||||
msg_ok "Backup completed"
|
||||
|
||||
fetch_and_deploy_gh_release "mealie" "mealie-recipes/mealie" "tarball" "latest" "/opt/mealie"
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "mealie" "mealie-recipes/mealie" "tarball" "latest" "/opt/mealie"
|
||||
|
||||
msg_info "Rebuilding Frontend"
|
||||
msg_info "Installing Python Dependencies with uv"
|
||||
cd /opt/mealie
|
||||
$STD uv sync --frozen --extra pgsql
|
||||
msg_ok "Installed Python Dependencies"
|
||||
|
||||
msg_info "Building Frontend"
|
||||
MEALIE_VERSION=$(<$HOME/.mealie)
|
||||
$STD sed -i "s|https://github.com/mealie-recipes/mealie/commit/|https://github.com/mealie-recipes/mealie/releases/tag/|g" /opt/mealie/frontend/pages/admin/site-settings.vue
|
||||
$STD sed -i "s|value: data.buildId,|value: \"v${MEALIE_VERSION}\",|g" /opt/mealie/frontend/pages/admin/site-settings.vue
|
||||
$STD sed -i "s|value: data.production ? i18n.t(\"about.production\") : i18n.t(\"about.development\"),|value: \"bare-metal\",|g" /opt/mealie/frontend/pages/admin/site-settings.vue
|
||||
export NUXT_TELEMETRY_DISABLED=1
|
||||
cd /opt/mealie/frontend
|
||||
$STD yarn install --prefer-offline --frozen-lockfile --non-interactive --production=false --network-timeout 1000000
|
||||
$STD yarn generate
|
||||
cp -r /opt/mealie/frontend/dist /opt/mealie/mealie/frontend
|
||||
msg_ok "Frontend rebuilt"
|
||||
msg_ok "Built Frontend"
|
||||
|
||||
msg_info "Rebuilding Backend Environment"
|
||||
msg_info "Copying Built Frontend"
|
||||
mkdir -p /opt/mealie/mealie/frontend
|
||||
cp -r /opt/mealie/frontend/dist/* /opt/mealie/mealie/frontend/
|
||||
msg_ok "Copied Frontend"
|
||||
|
||||
msg_info "Updating NLTK Data"
|
||||
mkdir -p /nltk_data/
|
||||
cd /opt/mealie
|
||||
$STD /opt/mealie/.venv/bin/poetry self add "poetry-plugin-export>=1.9"
|
||||
MEALIE_VERSION=$(/opt/mealie/.venv/bin/poetry version --short)
|
||||
$STD /opt/mealie/.venv/bin/poetry build --output dist
|
||||
$STD /opt/mealie/.venv/bin/poetry export --only=main --extras=pgsql --output=dist/requirements.txt
|
||||
echo "mealie[pgsql]==$MEALIE_VERSION \\" >>dist/requirements.txt
|
||||
/opt/mealie/.venv/bin/poetry run pip hash dist/mealie-$MEALIE_VERSION*.whl | tail -n1 | tr -d '\n' >>dist/requirements.txt
|
||||
echo " \\" >>dist/requirements.txt
|
||||
/opt/mealie/.venv/bin/poetry run pip hash dist/mealie-$MEALIE_VERSION*.tar.gz | tail -n1 >>dist/requirements.txt
|
||||
msg_ok "Backend prepared"
|
||||
|
||||
msg_info "Finalize Installation"
|
||||
$STD /opt/mealie/.venv/bin/uv pip install --require-hashes -r /opt/mealie/dist/requirements.txt --find-links dist
|
||||
msg_ok "Mealie installed"
|
||||
$STD uv run python -m nltk.downloader -d /nltk_data averaged_perceptron_tagger_eng
|
||||
msg_ok "Updated NLTK Data"
|
||||
|
||||
msg_info "Restoring Configuration"
|
||||
mv -f /opt/mealie/mealie.env.bak /opt/mealie/mealie.env
|
||||
mv -f /opt/mealie/start.sh.bak /opt/mealie/start.sh
|
||||
mv -f /opt/mealie.env /opt/mealie/mealie.env
|
||||
cat <<'STARTEOF' >/opt/mealie/start.sh
|
||||
#!/bin/bash
|
||||
set -a
|
||||
source /opt/mealie/mealie.env
|
||||
set +a
|
||||
exec uv run mealie
|
||||
STARTEOF
|
||||
chmod +x /opt/mealie/start.sh
|
||||
msg_ok "Configuration restored"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start mealie
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Update Successful"
|
||||
msg_ok "Updated successfully"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
@ -89,3 +97,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}:9000${CL}"
|
||||
|
||||
|
||||
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}"
|
||||
@ -79,6 +79,9 @@ function update_script() {
|
||||
-e 's| --server-port |:|' \
|
||||
/etc/systemd/system/netvisor-daemon.service
|
||||
sed -i '/^ \"server_target.*$/d' /root/.config/daemon/config.json
|
||||
if ! grep -q "WorkingD" /etc/systemd/system/netvisor-server.service; then
|
||||
sed -i '\|simple$|a\WorkingDirectory=/opt/netvisor/backend' /etc/systemd/system/netvisor-server.service
|
||||
fi
|
||||
systemctl daemon-reload
|
||||
|
||||
msg_info "Starting services"
|
||||
@ -96,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
|
||||
|
||||
@ -30,7 +30,7 @@ function update_script() {
|
||||
|
||||
msg_info "Updating MongoDB"
|
||||
if lscpu | grep -q 'avx'; then
|
||||
MONGO_VERSION="8.0" setup_mongodb
|
||||
MONGO_VERSION="8.0"
|
||||
else
|
||||
msg_error "No AVX detected (CPU-Flag)! We have discontinued support for this. You are welcome to try it manually with a Debian LXC, but due to the many issues with Omada, we currently only support AVX CPUs."
|
||||
exit 10
|
||||
|
||||
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
|
||||
@ -33,6 +34,7 @@ function update_script() {
|
||||
msg_info "Creating Backup"
|
||||
mkdir -p /opt/open-webui-backup
|
||||
cp -a /opt/open-webui/backend/data /opt/open-webui-backup/data || true
|
||||
cp -a /opt/open-webui/.env /opt/open-webui-backup/.env || true
|
||||
msg_ok "Created Backup"
|
||||
|
||||
msg_info "Removing legacy installation"
|
||||
@ -48,6 +50,7 @@ function update_script() {
|
||||
msg_info "Restoring data"
|
||||
mkdir -p /root/.open-webui
|
||||
cp -a /opt/open-webui-backup/data/* /root/.open-webui/ || true
|
||||
cp -a /opt/open-webui-backup/.env /root/.env || true
|
||||
rm -rf /opt/open-webui-backup || true
|
||||
msg_ok "Restored data"
|
||||
|
||||
@ -108,7 +111,7 @@ EOF
|
||||
|
||||
msg_info "Updating Open WebUI via uv"
|
||||
PYTHON_VERSION="3.12" setup_uv
|
||||
$STD uv tool install --python 3.12 open-webui[all]
|
||||
$STD uv tool upgrade --python 3.12 open-webui[all]
|
||||
systemctl restart open-webui
|
||||
msg_ok "Updated Open WebUI"
|
||||
msg_ok "Updated successfully!"
|
||||
|
||||
@ -27,58 +27,33 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
if ! dpkg -s python3-pip >/dev/null 2>&1; then
|
||||
$STD apt install -y python3-pip
|
||||
fi
|
||||
RELEASE=$(curl -fsSL https://api.github.com/repos/clusterzx/paperless-ai/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||
if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
|
||||
|
||||
if check_for_gh_release "paperless-ai" "clusterzx/paperless-ai"; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop paperless-ai
|
||||
msg_info "Stopped Service"
|
||||
systemctl stop paperless-ai paperless-rag
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
msg_info "Updating $APP to v${RELEASE}"
|
||||
cd /opt
|
||||
mv /opt/paperless-ai /opt/paperless-ai_bak
|
||||
curl -fsSL "https://github.com/clusterzx/paperless-ai/archive/refs/tags/v${RELEASE}.zip" -o $(basename "https://github.com/clusterzx/paperless-ai/archive/refs/tags/v${RELEASE}.zip")
|
||||
$STD unzip v${RELEASE}.zip
|
||||
mv paperless-ai-${RELEASE} /opt/paperless-ai
|
||||
mkdir -p /opt/paperless-ai/data
|
||||
cp -a /opt/paperless-ai_bak/data/. /opt/paperless-ai/data/
|
||||
fetch_and_deploy_gh_release "paperless-ai" "clusterzx/paperless-ai"
|
||||
|
||||
msg_info "Updating Paperless-AI"
|
||||
cd /opt/paperless-ai
|
||||
if [[ ! -f /etc/systemd/system/paperless-rag.service ]]; then
|
||||
cat <<EOF >/etc/systemd/system/paperless-rag.service
|
||||
[Unit]
|
||||
Description=PaperlessAI-RAG Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
WorkingDirectory=/opt/paperless-ai
|
||||
ExecStart=/usr/bin/python3 main.py --host 0.0.0.0 --port 8000 --initialize
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
echo "RAG_SERVICE_URL=http://localhost:8000" >>/opt/paperless-ai/data/.env
|
||||
echo "RAG_SERVICE_ENABLED=true" >>/opt/paperless-ai/data/.env
|
||||
fi
|
||||
source /opt/paperless-ai/venv/bin/activate
|
||||
$STD pip install --upgrade pip
|
||||
$STD pip install --no-cache-dir -r requirements.txt
|
||||
mkdir -p data/chromadb
|
||||
$STD npm install
|
||||
rm -rf /opt/v${RELEASE}.zip
|
||||
rm -rf /opt/paperless-ai_bak
|
||||
echo "${RELEASE}" >/opt/${APP}_version.txt
|
||||
msg_ok "Updated $APP to v${RELEASE}"
|
||||
$STD npm ci --only=production
|
||||
msg_ok "Updated Paperless-AI"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start paperless-rag
|
||||
sleep 3
|
||||
systemctl start paperless-ai
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Updated successfully!"
|
||||
else
|
||||
msg_ok "No update required. ${APP} is already at v${RELEASE}"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
@ -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/"
|
||||
@ -105,6 +105,7 @@ function update_script() {
|
||||
msg_ok "Backup completed to $BACKUP_DIR"
|
||||
|
||||
declare -A PATCHES=(
|
||||
["paperless-consumer.service"]="ExecStart=uv run -- python manage.py document_consumer"
|
||||
["paperless-scheduler.service"]="ExecStart=uv run -- celery --app paperless beat --loglevel INFO"
|
||||
["paperless-task-queue.service"]="ExecStart=uv run -- celery --app paperless worker --loglevel INFO"
|
||||
["paperless-webserver.service"]="ExecStart=uv run -- granian --interface asgi --ws \"paperless.asgi:application\""
|
||||
|
||||
@ -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
|
||||
|
||||
@ -37,6 +37,20 @@ function update_script() {
|
||||
msg_ok "Updated old sources"
|
||||
fi
|
||||
|
||||
if grep -q 'Debian GNU/Linux 13' /etc/os-release; then
|
||||
if [ -f "/etc/apt/sources.list.d/pdm-test.sources" ]; then
|
||||
if ! grep -qx "Enabled: false" "/etc/apt/sources.list.d/pdm-test.sources"; then
|
||||
echo "Enabled: false" >> "/etc/apt/sources.list.d/pdm-test.sources"
|
||||
setup_deb822_repo \
|
||||
"pdm" \
|
||||
"https://enterprise.proxmox.com/debian/proxmox-archive-keyring-trixie.gpg" \
|
||||
"http://download.proxmox.com/debian/pdm" \
|
||||
"trixie" \
|
||||
"pdm-no-subscription"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
msg_info "Updating $APP LXC"
|
||||
$STD apt update
|
||||
$STD apt -y upgrade
|
||||
|
||||
@ -27,42 +27,9 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if check_for_gh_release "ProxmoxVE-Local" "community-scripts/ProxmoxVE-Local"; then
|
||||
msg_info "Stopping Services"
|
||||
systemctl stop pvescriptslocal
|
||||
msg_ok "Stopped Services"
|
||||
|
||||
msg_info "Backup Data"
|
||||
cp /opt/ProxmoxVE-Local/.env /opt/.env.bak
|
||||
cp -r /opt/ProxmoxVE-Local/data /opt/data.bak
|
||||
msg_ok "Backed up Data"
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "ProxmoxVE-Local" "community-scripts/ProxmoxVE-Local"
|
||||
|
||||
msg_info "Restoring Data"
|
||||
if [[ -f /opt/.env.bak ]]; then
|
||||
mv /opt/.env.bak /opt/ProxmoxVE-Local/.env
|
||||
fi
|
||||
if [[ -d /opt/data.bak ]]; then
|
||||
rm -rf /opt/ProxmoxVE-Local/data
|
||||
mv /opt/data.bak /opt/ProxmoxVE-Local/data
|
||||
fi
|
||||
msg_ok "Restored Data"
|
||||
|
||||
msg_info "Updating PVE Scripts local"
|
||||
cd /opt/ProxmoxVE-Local
|
||||
chmod 755 data
|
||||
$STD npm install
|
||||
$STD npm run build
|
||||
msg_ok "Updated PVE Scripts local"
|
||||
|
||||
msg_info "Starting Services"
|
||||
systemctl start pvescriptslocal
|
||||
msg_ok "Started Services"
|
||||
msg_ok "Updated successfully!"
|
||||
fi
|
||||
exit
|
||||
|
||||
msg_custom "🚀" "${GN}" "The app offers a built-in updater. Please use it."
|
||||
|
||||
}
|
||||
|
||||
start
|
||||
|
||||
45
ct/qdrant.sh
Normal file
45
ct/qdrant.sh
Normal file
@ -0,0 +1,45 @@
|
||||
#!/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/qdrant/qdrant
|
||||
|
||||
APP="Qdrant"
|
||||
var_tags="${var_tags:-database;vector}"
|
||||
var_cpu="${var_cpu:-1}"
|
||||
var_ram="${var_ram:-1024}"
|
||||
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 /var/lib/qdrant ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
if check_for_gh_release "qdrant" "qdrant/qdrant"; then
|
||||
fetch_and_deploy_gh_release "qdrant" "qdrant/qdrant" "binary" "latest" "/usr/bin/qdrant"
|
||||
chown -R root:root /var/lib/qdrant
|
||||
chmod -R 755 /var/lib/qdrant
|
||||
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}:6333/dashboard${CL}"
|
||||
@ -29,15 +29,10 @@ function update_script() {
|
||||
fi
|
||||
if check_for_gh_release "recyclarr" "recyclarr/recyclarr"; then
|
||||
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop recyclarr
|
||||
msg_ok "Stopped Service"
|
||||
msg_info "Updating ${APP}"
|
||||
|
||||
fetch_and_deploy_gh_release "recyclarr" "recyclarr/recyclarr" "prebuild" "latest" "/usr/local/bin" "recyclarr-linux-x64.tar.xz"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start recyclarr
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Updated successfully!"
|
||||
fi
|
||||
exit
|
||||
|
||||
@ -31,7 +31,7 @@ function update_script() {
|
||||
sed -i '/index index.php;/i \ client_max_body_size 100M;' /etc/nginx/conf.d/snipeit.conf
|
||||
fi
|
||||
|
||||
if check_for_gh_release "snipe-it" "snipe/snipe-it"; then
|
||||
if check_for_gh_release "snipe-it" "grokability/snipe-it"; then
|
||||
msg_info "Stopping Services"
|
||||
systemctl stop nginx
|
||||
msg_ok "Services Stopped"
|
||||
|
||||
60
ct/snowshare.sh
Normal file
60
ct/snowshare.sh
Normal file
@ -0,0 +1,60 @@
|
||||
#!/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: TuroYT
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/TuroYT/snowshare
|
||||
|
||||
APP="SnowShare"
|
||||
var_tags="${var_tags:-file-sharing}"
|
||||
var_cpu="${var_cpu:-1}"
|
||||
var_ram="${var_ram:-1024}"
|
||||
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/snowshare ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if check_for_gh_release "snowshare" "TuroYT/snowshare"; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop snowshare
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
fetch_and_deploy_gh_release "snowshare" "TuroYT/snowshare"
|
||||
|
||||
msg_info "Updating Snowshare"
|
||||
cd /opt/snowshare
|
||||
$STD npm ci
|
||||
$STD npx prisma generate
|
||||
$STD npm run build
|
||||
msg_ok "Updated Snowshare"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start snowshare
|
||||
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}:3000${CL}"
|
||||
@ -55,7 +55,7 @@ function update_script() {
|
||||
cd /opt/tandoor/vue3
|
||||
$STD yarn install
|
||||
$STD yarn build
|
||||
TANDOOR_VERSION="$(curl -fsSL https://api.github.com/repos/TandoorRecipes/recipes/releases/latest | jq -r .tag_name)"
|
||||
TANDOOR_VERSION=$(get_latest_github_release "TandoorRecipes/recipes")
|
||||
cat <<EOF >/opt/tandoor/cookbook/version_info.py
|
||||
TANDOOR_VERSION = "$TANDOOR_VERSION"
|
||||
TANDOOR_REF = "bare-metal"
|
||||
@ -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
|
||||
|
||||
@ -65,7 +65,7 @@ EOF
|
||||
fi
|
||||
msg_ok "Corrected Services"
|
||||
|
||||
setup_nodejs
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "tracktor" "javedh-dev/tracktor" "tarball" "latest" "/opt/tracktor"
|
||||
|
||||
msg_info "Updating tracktor"
|
||||
|
||||
@ -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
|
||||
|
||||
45
ct/valkey.sh
Normal file
45
ct/valkey.sh
Normal file
@ -0,0 +1,45 @@
|
||||
#!/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: pshankinclarke (lazarillo)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://valkey.io/
|
||||
|
||||
APP="Valkey"
|
||||
var_tags="${var_tags:-database}"
|
||||
var_cpu="${var_cpu:-1}"
|
||||
var_ram="${var_ram:-1024}"
|
||||
var_disk="${var_disk:-4}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
if [[ ! -f /lib/systemd/system/valkey-server.service ]]; then
|
||||
msg_error "No Valkey Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_info "Updating Valkey LXC"
|
||||
$STD apt update
|
||||
$STD apt -y upgrade
|
||||
msg_ok "Updated Valkey LXC"
|
||||
msg_ok "Updated successfully!"
|
||||
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}:6379${CL}"
|
||||
76
ct/wanderer.sh
Normal file
76
ct/wanderer.sh
Normal file
@ -0,0 +1,76 @@
|
||||
#!/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: rrole
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://wanderer.to
|
||||
|
||||
APP="Wanderer"
|
||||
var_tags="${var_tags:-travelling;sport}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-4096}"
|
||||
var_disk="${var_disk:-8}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
if [[ ! -f /opt/wanderer/start.sh ]]; then
|
||||
msg_error "No wanderer Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if check_for_gh_release "wanderer" "Flomp/wanderer"; then
|
||||
msg_info "Stopping service"
|
||||
systemctl stop wanderer-web
|
||||
msg_ok "Stopped service"
|
||||
|
||||
fetch_and_deploy_gh_release "wanderer" "Flomp/wanderer" "tarball" "latest" "/opt/wanderer/source"
|
||||
|
||||
msg_info "Updating wanderer"
|
||||
cd /opt/wanderer/source/db
|
||||
$STD go mod tidy
|
||||
$STD go build
|
||||
cd /opt/wanderer/source/web
|
||||
$STD npm ci --omit=dev
|
||||
$STD npm run build
|
||||
msg_ok "Updated wanderer"
|
||||
|
||||
msg_info "Starting service"
|
||||
systemctl start wanderer-web
|
||||
msg_ok "Started service"
|
||||
msg_ok "Update Successful"
|
||||
fi
|
||||
if check_for_gh_release "meilisearch" "meilisearch/meilisearch"; then
|
||||
msg_info "Stopping service"
|
||||
systemctl stop wanderer-web
|
||||
msg_ok "Stopped service"
|
||||
|
||||
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
|
||||
msg_ok "Started service"
|
||||
msg_ok "Update Successful"
|
||||
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}:3000${CL}"
|
||||
16
ct/wizarr.sh
16
ct/wizarr.sh
@ -52,11 +52,21 @@ function update_script() {
|
||||
$STD npm --prefix app/static run build:css
|
||||
mkdir -p ./.cache
|
||||
$STD tar -xf "$BACKUP_FILE" --directory=/
|
||||
$STD /usr/local/bin/uv run --frozen flask db upgrade
|
||||
if ! grep -q 'frozen' /opt/wizarr/start.sh; then
|
||||
sed -i 's/run/& --frozen/' /opt/wizarr/start.sh
|
||||
if grep -q 'workers' /opt/wizarr/start.sh; then
|
||||
sed -i 's/--workers 4//' /opt/wizarr/start.sh
|
||||
fi
|
||||
if ! grep -qE 'FLASK|WORKERS|VERSION' /opt/wizarr/.env; then
|
||||
{
|
||||
echo "FLASK_ENV=production"
|
||||
echo "GUNICORN_WORKERS=4"
|
||||
echo "APP_VERSION=$(sed 's/^20/v&/' ~/.wizarr)"
|
||||
} >>/opt/wizarr/.env
|
||||
else
|
||||
sed -i "s/_VERSION=v.*$/_VERSION=v$(cat ~/.wizarr)/" /opt/wizarr/.env
|
||||
fi
|
||||
rm -rf "$BACKUP_FILE"
|
||||
export FLASK_SKIP_SCHEDULER=true
|
||||
$STD /usr/local/bin/uv run --frozen flask db upgrade
|
||||
msg_ok "Updated Wizarr"
|
||||
|
||||
msg_info "Starting Service"
|
||||
|
||||
21
ct/zabbix.sh
21
ct/zabbix.sh
@ -46,7 +46,20 @@ function update_script() {
|
||||
systemctl stop "$AGENT_SERVICE"
|
||||
msg_ok "Stopped Services"
|
||||
|
||||
msg_info "Updating Zabbix"
|
||||
read -rp "Choose Zabbix version [1] 7.0 LTS [2] 7.4 (Latest Stable) [3] Latest available (default: 2): " ZABBIX_CHOICE
|
||||
ZABBIX_CHOICE=${ZABBIX_CHOICE:-2}
|
||||
case "$ZABBIX_CHOICE" in
|
||||
1) ZABBIX_VERSION="7.0" ;;
|
||||
2) ZABBIX_VERSION="7.4" ;;
|
||||
3) ZABBIX_VERSION=$(curl -fsSL https://repo.zabbix.com/zabbix/ |
|
||||
grep -oP '(?<=href=")[0-9]+\.[0-9]+(?=/")' | sort -V | tail -n1) ;;
|
||||
*)
|
||||
ZABBIX_VERSION="7.4"
|
||||
echo "Invalid choice. Defaulting to 7.4."
|
||||
;;
|
||||
esac
|
||||
|
||||
msg_info "Updating Zabbix to $ZABBIX_VERSION"
|
||||
mkdir -p /opt/zabbix-backup/
|
||||
cp /etc/zabbix/zabbix_server.conf /opt/zabbix-backup/
|
||||
cp /etc/apache2/conf-enabled/zabbix.conf /opt/zabbix-backup/
|
||||
@ -54,10 +67,8 @@ function update_script() {
|
||||
|
||||
rm -Rf /etc/apt/sources.list.d/zabbix.list
|
||||
cd /tmp
|
||||
curl -fsSL "$(curl -fsSL https://repo.zabbix.com/zabbix/ |
|
||||
grep -oP '(?<=href=")[0-9]+\.[0-9]+(?=/")' | sort -V | tail -n1 |
|
||||
xargs -I{} echo "https://repo.zabbix.com/zabbix/{}/release/debian/pool/main/z/zabbix-release/zabbix-release_latest+debian13_all.deb")" \
|
||||
-o /tmp/zabbix-release_latest+debian13_all.deb
|
||||
ZABBIX_DEB_URL="https://repo.zabbix.com/zabbix/${ZABBIX_VERSION}/release/debian/pool/main/z/zabbix-release/zabbix-release_latest+debian13_all.deb"
|
||||
curl -fsSL "$ZABBIX_DEB_URL" -o /tmp/zabbix-release_latest+debian13_all.deb
|
||||
$STD dpkg -i zabbix-release_latest+debian13_all.deb
|
||||
rm -rf /tmp/zabbix-release_latest+debian13_all.deb
|
||||
$STD apt update
|
||||
|
||||
@ -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"
|
||||
|
||||
532
docs/DEV_MODE.md
Normal file
532
docs/DEV_MODE.md
Normal file
@ -0,0 +1,532 @@
|
||||
# Dev Mode - Debugging & Development Guide
|
||||
|
||||
Development modes provide powerful debugging and testing capabilities for container creation and installation processes.
|
||||
|
||||
## Quick Start
|
||||
|
||||
```bash
|
||||
# Single mode
|
||||
export dev_mode="motd"
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/wallabag.sh)"
|
||||
|
||||
# Multiple modes (comma-separated)
|
||||
export dev_mode="motd,keep,trace"
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/wallabag.sh)"
|
||||
|
||||
# Combine with verbose output
|
||||
export var_verbose="yes"
|
||||
export dev_mode="pause,logs"
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/wallabag.sh)"
|
||||
```
|
||||
|
||||
## Available Modes
|
||||
|
||||
### 1. **motd** - Early SSH/MOTD Setup
|
||||
|
||||
Sets up SSH access and MOTD **before** the main application installation.
|
||||
|
||||
**Use Case**:
|
||||
|
||||
- Quick access to container for manual debugging
|
||||
- Continue installation manually if something goes wrong
|
||||
- Verify container networking before main install
|
||||
|
||||
**Behavior**:
|
||||
|
||||
```
|
||||
✔ Container created
|
||||
✔ Network configured
|
||||
[DEV] Setting up MOTD and SSH before installation
|
||||
✔ [DEV] MOTD/SSH ready - container accessible
|
||||
# Container is now accessible via SSH while installation proceeds
|
||||
```
|
||||
|
||||
**Combined with**: `keep`, `breakpoint`, `logs`
|
||||
|
||||
---
|
||||
|
||||
### 2. **keep** - Preserve Container on Failure
|
||||
|
||||
Never delete the container when installation fails. Skips cleanup prompt.
|
||||
|
||||
**Use Case**:
|
||||
|
||||
- Repeated tests of the same installation
|
||||
- Debugging failed installations
|
||||
- Manual fix attempts
|
||||
|
||||
**Behavior**:
|
||||
|
||||
```
|
||||
✖ Installation failed in container 107 (exit code: 1)
|
||||
✔ Container creation log: /tmp/create-lxc-107-abc12345.log
|
||||
✔ Installation log: /tmp/install-lxc-107-abc12345.log
|
||||
|
||||
🔧 [DEV] Keep mode active - container 107 preserved
|
||||
root@proxmox:~#
|
||||
```
|
||||
|
||||
**Container remains**: `pct enter 107` to access and debug
|
||||
|
||||
**Combined with**: `motd`, `trace`, `logs`
|
||||
|
||||
---
|
||||
|
||||
### 3. **trace** - Bash Command Tracing
|
||||
|
||||
Enables `set -x` for complete command-line tracing. Shows every command before execution.
|
||||
|
||||
**Use Case**:
|
||||
|
||||
- Deep debugging of installation logic
|
||||
- Understanding script flow
|
||||
- Identifying where errors occur exactly
|
||||
|
||||
**Behavior**:
|
||||
|
||||
```
|
||||
+(/opt/wallabag/bin/console): /opt/wallabag/bin/console cache:warmup
|
||||
+(/opt/wallabag/bin/console): env APP_ENV=prod /opt/wallabag/bin/console cache:warmup
|
||||
+(/opt/wallabag/bin/console): [[ -d /opt/wallabag/app/cache ]]
|
||||
+(/opt/wallabag/bin/console): rm -rf /opt/wallabag/app/cache/*
|
||||
```
|
||||
|
||||
**⚠️ Warning**: Exposes passwords and secrets in log output! Only use in isolated environments.
|
||||
|
||||
**Log Output**: All trace output saved to logs (see `logs` mode)
|
||||
|
||||
**Combined with**: `keep`, `pause`, `logs`
|
||||
|
||||
---
|
||||
|
||||
### 4. **pause** - Step-by-Step Execution
|
||||
|
||||
Pauses after each major step (`msg_info`). Requires manual Enter press to continue.
|
||||
|
||||
**Use Case**:
|
||||
|
||||
- Inspect container state between steps
|
||||
- Understand what each step does
|
||||
- Identify which step causes problems
|
||||
|
||||
**Behavior**:
|
||||
|
||||
```
|
||||
⏳ Setting up Container OS
|
||||
[PAUSE] Press Enter to continue...
|
||||
⏳ Updating Container OS
|
||||
[PAUSE] Press Enter to continue...
|
||||
⏳ Installing Dependencies
|
||||
[PAUSE] Press Enter to continue...
|
||||
```
|
||||
|
||||
**Between pauses**: You can open another terminal and inspect the container
|
||||
|
||||
```bash
|
||||
# In another terminal while paused
|
||||
pct enter 107
|
||||
root@container:~# df -h # Check disk usage
|
||||
root@container:~# ps aux # Check running processes
|
||||
```
|
||||
|
||||
**Combined with**: `motd`, `keep`, `logs`
|
||||
|
||||
---
|
||||
|
||||
### 5. **breakpoint** - Interactive Shell on Error
|
||||
|
||||
Opens interactive shell inside the container when an error occurs instead of cleanup prompt.
|
||||
|
||||
**Use Case**:
|
||||
|
||||
- Live debugging in the actual container
|
||||
- Manual command testing
|
||||
- Inspect container state at point of failure
|
||||
|
||||
**Behavior**:
|
||||
|
||||
```
|
||||
✖ Installation failed in container 107 (exit code: 1)
|
||||
✔ Container creation log: /tmp/create-lxc-107-abc12345.log
|
||||
✔ Installation log: /tmp/install-lxc-107-abc12345.log
|
||||
|
||||
🐛 [DEV] Breakpoint mode - opening shell in container 107
|
||||
Type 'exit' to return to host
|
||||
root@wallabag:~#
|
||||
|
||||
# Now you can debug:
|
||||
root@wallabag:~# tail -f /root/.install-abc12345.log
|
||||
root@wallabag:~# mysql -u root -p$PASSWORD wallabag
|
||||
root@wallabag:~# apt-get install -y strace
|
||||
root@wallabag:~# exit
|
||||
|
||||
Container 107 still running. Remove now? (y/N): n
|
||||
🔧 Container 107 kept for debugging
|
||||
```
|
||||
|
||||
**Combined with**: `keep`, `logs`, `trace`
|
||||
|
||||
---
|
||||
|
||||
### 6. **logs** - Persistent Logging
|
||||
|
||||
Saves all logs to `/var/log/community-scripts/` with timestamps. Logs persist even on successful installation.
|
||||
|
||||
**Use Case**:
|
||||
|
||||
- Post-mortem analysis
|
||||
- Performance analysis
|
||||
- Automated testing with log collection
|
||||
- CI/CD integration
|
||||
|
||||
**Behavior**:
|
||||
|
||||
```
|
||||
Logs location: /var/log/community-scripts/
|
||||
|
||||
create-lxc-abc12345-20251117_143022.log (host-side creation)
|
||||
install-abc12345-20251117_143022.log (container-side installation)
|
||||
```
|
||||
|
||||
**Access logs**:
|
||||
|
||||
```bash
|
||||
# View creation log
|
||||
tail -f /var/log/community-scripts/create-lxc-*.log
|
||||
|
||||
# Search for errors
|
||||
grep ERROR /var/log/community-scripts/*.log
|
||||
|
||||
# Analyze performance
|
||||
grep "msg_info\|msg_ok" /var/log/community-scripts/create-*.log
|
||||
```
|
||||
|
||||
**With trace mode**: Creates detailed trace of all commands
|
||||
|
||||
```bash
|
||||
grep "^+" /var/log/community-scripts/install-*.log
|
||||
```
|
||||
|
||||
**Combined with**: All other modes (recommended for CI/CD)
|
||||
|
||||
---
|
||||
|
||||
### 7. **dryrun** - Simulation Mode
|
||||
|
||||
Shows all commands that would be executed without actually running them.
|
||||
|
||||
**Use Case**:
|
||||
|
||||
- Test script logic without making changes
|
||||
- Verify command syntax
|
||||
- Understand what will happen
|
||||
- Pre-flight checks
|
||||
|
||||
**Behavior**:
|
||||
|
||||
```
|
||||
[DRYRUN] apt-get update
|
||||
[DRYRUN] apt-get install -y curl
|
||||
[DRYRUN] mkdir -p /opt/wallabag
|
||||
[DRYRUN] cd /opt/wallabag
|
||||
[DRYRUN] git clone https://github.com/wallabag/wallabag.git .
|
||||
```
|
||||
|
||||
**No actual changes made**: Container/system remains unchanged
|
||||
|
||||
**Combined with**: `trace` (shows dryrun trace), `logs` (shows what would run)
|
||||
|
||||
---
|
||||
|
||||
## Mode Combinations
|
||||
|
||||
### Development Workflow
|
||||
|
||||
```bash
|
||||
# First test: See what would happen
|
||||
export dev_mode="dryrun,logs"
|
||||
bash -c "$(curl ...)"
|
||||
|
||||
# Then test with tracing and pauses
|
||||
export dev_mode="pause,trace,logs"
|
||||
bash -c "$(curl ...)"
|
||||
|
||||
# Finally full debug with early SSH access
|
||||
export dev_mode="motd,keep,breakpoint,logs"
|
||||
bash -c "$(curl ...)"
|
||||
```
|
||||
|
||||
### CI/CD Integration
|
||||
|
||||
```bash
|
||||
# Automated testing with full logging
|
||||
export dev_mode="logs"
|
||||
export var_verbose="yes"
|
||||
bash -c "$(curl ...)"
|
||||
|
||||
# Capture logs for analysis
|
||||
tar czf installation-logs-$(date +%s).tar.gz /var/log/community-scripts/
|
||||
```
|
||||
|
||||
### Production-like Testing
|
||||
|
||||
```bash
|
||||
# Keep containers for manual verification
|
||||
export dev_mode="keep,logs"
|
||||
for i in {1..5}; do
|
||||
bash -c "$(curl ...)"
|
||||
done
|
||||
|
||||
# Inspect all created containers
|
||||
pct list
|
||||
pct enter 100
|
||||
```
|
||||
|
||||
### Live Debugging
|
||||
|
||||
```bash
|
||||
# SSH in early, step through installation, debug on error
|
||||
export dev_mode="motd,pause,breakpoint,keep"
|
||||
bash -c "$(curl ...)"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Environment Variables Reference
|
||||
|
||||
### Dev Mode Variables
|
||||
|
||||
- `dev_mode` (string): Comma-separated list of modes
|
||||
- Format: `"motd,keep,trace"`
|
||||
- Default: Empty (no dev modes)
|
||||
|
||||
### Output Control
|
||||
|
||||
- `var_verbose="yes"`: Show all command output (disables silent mode)
|
||||
- Pairs well with: `trace`, `pause`, `logs`
|
||||
|
||||
### Examples with vars
|
||||
|
||||
```bash
|
||||
# Maximum verbosity and debugging
|
||||
export var_verbose="yes"
|
||||
export dev_mode="motd,trace,pause,logs"
|
||||
bash -c "$(curl ...)"
|
||||
|
||||
# Silent debug (logs only)
|
||||
export dev_mode="keep,logs"
|
||||
bash -c "$(curl ...)"
|
||||
|
||||
# Interactive debugging
|
||||
export var_verbose="yes"
|
||||
export dev_mode="motd,breakpoint"
|
||||
bash -c "$(curl ...)"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting with Dev Mode
|
||||
|
||||
### "Installation failed at step X"
|
||||
|
||||
```bash
|
||||
export dev_mode="pause,logs"
|
||||
# Step through until the failure point
|
||||
# Check container state between pauses
|
||||
pct enter 107
|
||||
```
|
||||
|
||||
### "Password/credentials not working"
|
||||
|
||||
```bash
|
||||
export dev_mode="motd,keep,trace"
|
||||
# With trace mode, see exact password handling (be careful with logs!)
|
||||
# Use motd to SSH in and test manually
|
||||
ssh root@container-ip
|
||||
```
|
||||
|
||||
### "Permission denied errors"
|
||||
|
||||
```bash
|
||||
export dev_mode="breakpoint,keep"
|
||||
# Get shell at failure point
|
||||
# Check file permissions, user context, SELinux status
|
||||
ls -la /path/to/file
|
||||
whoami
|
||||
```
|
||||
|
||||
### "Networking issues"
|
||||
|
||||
```bash
|
||||
export dev_mode="motd"
|
||||
# SSH in with motd mode before main install
|
||||
ssh root@container-ip
|
||||
ping 8.8.8.8
|
||||
nslookup example.com
|
||||
```
|
||||
|
||||
### "Need to manually complete installation"
|
||||
|
||||
```bash
|
||||
export dev_mode="motd,keep"
|
||||
# Container accessible via SSH while installation runs
|
||||
# After failure, SSH in and manually continue
|
||||
ssh root@container-ip
|
||||
# ... manual commands ...
|
||||
exit
|
||||
# Then use 'keep' mode to preserve container for inspection
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Log Files Locations
|
||||
|
||||
### Default (without `logs` mode)
|
||||
|
||||
- Host creation: `/tmp/create-lxc-<SESSION_ID>.log`
|
||||
- Container install: Copied to `/tmp/install-lxc-<CTID>-<SESSION_ID>.log` on failure
|
||||
|
||||
### With `logs` mode
|
||||
|
||||
- Host creation: `/var/log/community-scripts/create-lxc-<SESSION_ID>-<TIMESTAMP>.log`
|
||||
- Container install: `/var/log/community-scripts/install-<SESSION_ID>-<TIMESTAMP>.log`
|
||||
|
||||
### View logs
|
||||
|
||||
```bash
|
||||
# Tail in real-time
|
||||
tail -f /var/log/community-scripts/*.log
|
||||
|
||||
# Search for errors
|
||||
grep -r "exit code [1-9]" /var/log/community-scripts/
|
||||
|
||||
# Filter by session
|
||||
grep "ed563b19" /var/log/community-scripts/*.log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Best Practices
|
||||
|
||||
### ✅ DO
|
||||
|
||||
- Use `logs` mode for CI/CD and automated testing
|
||||
- Use `motd` for early SSH access during long installations
|
||||
- Use `pause` when learning the installation flow
|
||||
- Use `trace` when debugging logic issues (watch for secrets!)
|
||||
- Combine modes for comprehensive debugging
|
||||
- Archive logs after successful tests
|
||||
|
||||
### ❌ DON'T
|
||||
|
||||
- Use `trace` in production or with untrusted networks (exposes secrets)
|
||||
- Leave `keep` mode enabled for unattended scripts (containers accumulate)
|
||||
- Use `dryrun` and expect actual changes
|
||||
- Commit `dev_mode` exports to production deployment scripts
|
||||
- Use `breakpoint` in non-interactive environments (will hang)
|
||||
|
||||
---
|
||||
|
||||
## Examples
|
||||
|
||||
### Example 1: Debug a Failed Installation
|
||||
|
||||
```bash
|
||||
# Initial test to see the failure
|
||||
export dev_mode="keep,logs"
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/wallabag.sh)"
|
||||
|
||||
# Container 107 kept, check logs
|
||||
tail /var/log/community-scripts/install-*.log
|
||||
|
||||
# SSH in to debug
|
||||
pct enter 107
|
||||
root@wallabag:~# cat /root/.install-*.log | tail -100
|
||||
root@wallabag:~# apt-get update # Retry the failing command
|
||||
root@wallabag:~# exit
|
||||
|
||||
# Re-run with manual step-through
|
||||
export dev_mode="motd,pause,keep"
|
||||
bash -c "$(curl ...)"
|
||||
```
|
||||
|
||||
### Example 2: Verify Installation Steps
|
||||
|
||||
```bash
|
||||
export dev_mode="pause,logs"
|
||||
export var_verbose="yes"
|
||||
bash -c "$(curl ...)"
|
||||
|
||||
# Press Enter through each step
|
||||
# Monitor container in another terminal
|
||||
# pct enter 107
|
||||
# Review logs in real-time
|
||||
```
|
||||
|
||||
### Example 3: CI/CD Pipeline Integration
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
export dev_mode="logs"
|
||||
export var_verbose="no"
|
||||
|
||||
for app in wallabag nextcloud wordpress; do
|
||||
echo "Testing $app installation..."
|
||||
APP="$app" bash -c "$(curl ...)" || {
|
||||
echo "FAILED: $app"
|
||||
tar czf logs-$app.tar.gz /var/log/community-scripts/
|
||||
exit 1
|
||||
}
|
||||
echo "SUCCESS: $app"
|
||||
done
|
||||
|
||||
echo "All installations successful"
|
||||
tar czf all-logs.tar.gz /var/log/community-scripts/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Advanced Usage
|
||||
|
||||
### Custom Log Analysis
|
||||
|
||||
```bash
|
||||
# Extract all errors
|
||||
grep "ERROR\|exit code [1-9]" /var/log/community-scripts/*.log
|
||||
|
||||
# Performance timeline
|
||||
grep "^$(date +%Y-%m-%d)" /var/log/community-scripts/*.log | grep "msg_"
|
||||
|
||||
# Memory usage during install
|
||||
grep "free\|available" /var/log/community-scripts/*.log
|
||||
```
|
||||
|
||||
### Integration with External Tools
|
||||
|
||||
```bash
|
||||
# Send logs to Elasticsearch
|
||||
curl -X POST "localhost:9200/installation-logs/_doc" \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d @/var/log/community-scripts/install-*.log
|
||||
|
||||
# Archive for compliance
|
||||
tar czf installation-records-$(date +%Y%m).tar.gz \
|
||||
/var/log/community-scripts/
|
||||
gpg --encrypt installation-records-*.tar.gz
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Support & Issues
|
||||
|
||||
When reporting installation issues, always include:
|
||||
|
||||
```bash
|
||||
# Collect all relevant information
|
||||
export dev_mode="logs"
|
||||
# Run the failing installation
|
||||
# Then provide:
|
||||
tar czf debug-logs.tar.gz /var/log/community-scripts/
|
||||
```
|
||||
|
||||
Include the `debug-logs.tar.gz` when reporting issues for better diagnostics.
|
||||
298
docs/EXIT_CODES.md
Normal file
298
docs/EXIT_CODES.md
Normal file
@ -0,0 +1,298 @@
|
||||
# Exit Code Reference
|
||||
|
||||
Comprehensive documentation of all exit codes used in ProxmoxVE scripts.
|
||||
|
||||
## Table of Contents
|
||||
|
||||
- [Generic/Shell Errors (1-255)](#genericshell-errors)
|
||||
- [Package Manager Errors (100-101, 255)](#package-manager-errors)
|
||||
- [Node.js/npm Errors (243-254)](#nodejsnpm-errors)
|
||||
- [Python/pip Errors (210-212)](#pythonpip-errors)
|
||||
- [Database Errors (231-254)](#database-errors)
|
||||
- [Proxmox Custom Codes (200-231)](#proxmox-custom-codes)
|
||||
|
||||
---
|
||||
|
||||
## Generic/Shell Errors
|
||||
|
||||
Standard Unix/Linux exit codes used across all scripts.
|
||||
|
||||
| Code | Description | Common Causes | Solutions |
|
||||
| ------- | --------------------------------------- | ----------------------------------------- | ---------------------------------------------- |
|
||||
| **1** | General error / Operation not permitted | Permission denied, general failure | Check user permissions, run as root if needed |
|
||||
| **2** | Misuse of shell builtins | Syntax error in script | Review script syntax, check bash version |
|
||||
| **126** | Command cannot execute | Permission problem, not executable | `chmod +x script.sh` or check file permissions |
|
||||
| **127** | Command not found | Missing binary, wrong PATH | Install required package, check PATH variable |
|
||||
| **128** | Invalid argument to exit | Invalid exit code passed | Use exit codes 0-255 only |
|
||||
| **130** | Terminated by Ctrl+C (SIGINT) | User interrupted script | Expected behavior, no action needed |
|
||||
| **137** | Killed (SIGKILL) | Out of memory, forced termination | Check memory usage, increase RAM allocation |
|
||||
| **139** | Segmentation fault | Memory access violation, corrupted binary | Reinstall package, check system stability |
|
||||
| **143** | Terminated (SIGTERM) | Graceful shutdown signal | Expected during container stops |
|
||||
|
||||
---
|
||||
|
||||
## Package Manager Errors
|
||||
|
||||
APT, DPKG, and package installation errors.
|
||||
|
||||
| Code | Description | Common Causes | Solutions |
|
||||
| ------- | -------------------------- | --------------------------------------- | ------------------------------------------------- |
|
||||
| **100** | APT: Package manager error | Broken packages, dependency conflicts | `apt --fix-broken install`, `dpkg --configure -a` |
|
||||
| **101** | APT: Configuration error | Malformed sources.list, bad repo config | Check `/etc/apt/sources.list`, run `apt update` |
|
||||
| **255** | DPKG: Fatal internal error | Corrupted package database | `dpkg --configure -a`, restore from backup |
|
||||
|
||||
---
|
||||
|
||||
## Node.js/npm Errors
|
||||
|
||||
Node.js runtime and package manager errors.
|
||||
|
||||
| Code | Description | Common Causes | Solutions |
|
||||
| ------- | ------------------------------------------ | ------------------------------ | ---------------------------------------------- |
|
||||
| **243** | Node.js: Out of memory | JavaScript heap exhausted | Increase `--max-old-space-size`, optimize code |
|
||||
| **245** | Node.js: Invalid command-line option | Wrong Node.js flags | Check Node.js version, verify CLI options |
|
||||
| **246** | Node.js: Internal JavaScript Parse Error | Syntax error in JS code | Review JavaScript syntax, check dependencies |
|
||||
| **247** | Node.js: Fatal internal error | Node.js runtime crash | Update Node.js, check for known bugs |
|
||||
| **248** | Node.js: Invalid C++ addon / N-API failure | Native module incompatibility | Rebuild native modules, update packages |
|
||||
| **249** | Node.js: Inspector error | Debug/inspect protocol failure | Disable inspector, check port conflicts |
|
||||
| **254** | npm/pnpm/yarn: Unknown fatal error | Package manager crash | Clear cache, reinstall package manager |
|
||||
|
||||
---
|
||||
|
||||
## Python/pip Errors
|
||||
|
||||
Python runtime and package installation errors.
|
||||
|
||||
| Code | Description | Common Causes | Solutions |
|
||||
| ------- | ------------------------------------ | --------------------------------------- | -------------------------------------------------------- |
|
||||
| **210** | Python: Virtualenv missing or broken | venv not created, corrupted environment | `python3 -m venv venv`, recreate virtualenv |
|
||||
| **211** | Python: Dependency resolution failed | Conflicting package versions | Use `pip install --upgrade`, check requirements.txt |
|
||||
| **212** | Python: Installation aborted | EXTERNALLY-MANAGED, permission denied | Use `--break-system-packages` or venv, check permissions |
|
||||
|
||||
---
|
||||
|
||||
## Database Errors
|
||||
|
||||
### PostgreSQL (231-234)
|
||||
|
||||
| Code | Description | Common Causes | Solutions |
|
||||
| ------- | ----------------------- | ---------------------------------- | ----------------------------------------------------- |
|
||||
| **231** | Connection failed | Server not running, wrong socket | `systemctl start postgresql`, check connection string |
|
||||
| **232** | Authentication failed | Wrong credentials | Verify username/password, check `pg_hba.conf` |
|
||||
| **233** | Database does not exist | Database not created | `CREATE DATABASE`, restore from backup |
|
||||
| **234** | Fatal error in query | Syntax error, constraint violation | Review SQL syntax, check constraints |
|
||||
|
||||
### MySQL/MariaDB (241-244)
|
||||
|
||||
| Code | Description | Common Causes | Solutions |
|
||||
| ------- | ----------------------- | ---------------------------------- | ---------------------------------------------------- |
|
||||
| **241** | Connection failed | Server not running, wrong socket | `systemctl start mysql`, check connection parameters |
|
||||
| **242** | Authentication failed | Wrong credentials | Verify username/password, grant privileges |
|
||||
| **243** | Database does not exist | Database not created | `CREATE DATABASE`, restore from backup |
|
||||
| **244** | Fatal error in query | Syntax error, constraint violation | Review SQL syntax, check constraints |
|
||||
|
||||
### MongoDB (251-254)
|
||||
|
||||
| Code | Description | Common Causes | Solutions |
|
||||
| ------- | --------------------- | -------------------- | ------------------------------------------ |
|
||||
| **251** | Connection failed | Server not running | `systemctl start mongod`, check port 27017 |
|
||||
| **252** | Authentication failed | Wrong credentials | Verify username/password, create user |
|
||||
| **253** | Database not found | Database not created | Database auto-created on first write |
|
||||
| **254** | Fatal query error | Invalid query syntax | Review MongoDB query syntax |
|
||||
|
||||
---
|
||||
|
||||
## Proxmox Custom Codes
|
||||
|
||||
Custom exit codes specific to ProxmoxVE scripts.
|
||||
|
||||
### Container Creation Errors (200-209)
|
||||
|
||||
| Code | Description | Common Causes | Solutions |
|
||||
| ------- | ---------------------------------------------- | ------------------------------------------------------- | ------------------------------------------------------- |
|
||||
| **200** | Failed to create lock file | Permission denied, disk full | Check `/tmp` permissions, free disk space |
|
||||
| **203** | Missing CTID variable | Script configuration error | Set CTID in script or via prompt |
|
||||
| **204** | Missing PCT_OSTYPE variable | Template selection failed | Verify template availability |
|
||||
| **205** | Invalid CTID (<100) | CTID below minimum value | Use CTID ≥ 100 (1-99 reserved for Proxmox) |
|
||||
| **206** | CTID already in use | Container/VM with same ID exists | Check `pct list` and `/etc/pve/lxc/`, use different ID |
|
||||
| **207** | Password contains unescaped special characters | Special chars like `-`, `/`, `\`, `*` at start/end | Avoid leading special chars, use alphanumeric passwords |
|
||||
| **208** | Invalid configuration | DNS format (`.home` vs `home`), MAC format (`-` vs `:`) | Remove leading dots from DNS, use `:` in MAC addresses |
|
||||
| **209** | Container creation failed | Multiple possible causes | Check logs in `/tmp/pct_create_*.log`, verify template |
|
||||
|
||||
### Cluster & Storage Errors (210, 214, 217)
|
||||
|
||||
| Code | Description | Common Causes | Solutions |
|
||||
| ------- | --------------------------------- | ---------------------------------- | ----------------------------------------------------------- |
|
||||
| **210** | Cluster not quorate | Cluster nodes down, network issues | Check cluster status: `pvecm status`, fix node connectivity |
|
||||
| **211** | Timeout waiting for template lock | Concurrent download in progress | Wait for other download to complete (60s timeout) |
|
||||
| **214** | Not enough storage space | Disk full, quota exceeded | Free disk space, increase storage allocation |
|
||||
| **217** | Storage does not support rootdir | Wrong storage type selected | Use storage supporting containers (dir, zfspool, lvm-thin) |
|
||||
|
||||
### Container Verification Errors (215-216)
|
||||
|
||||
| Code | Description | Common Causes | Solutions |
|
||||
| ------- | -------------------------------- | -------------------------------- | --------------------------------------------------------- |
|
||||
| **215** | Container created but not listed | Ghost state, incomplete creation | Check `/etc/pve/lxc/CTID.conf`, remove manually if needed |
|
||||
| **216** | RootFS entry missing in config | Incomplete container creation | Delete container, retry creation |
|
||||
|
||||
### Template Errors (218, 220-223, 225)
|
||||
|
||||
| Code | Description | Common Causes | Solutions |
|
||||
| ------- | ----------------------------------------- | ------------------------------------------------ | ----------------------------------------------------------- |
|
||||
| **218** | Template file corrupted or incomplete | Download interrupted, file <1MB, invalid archive | Delete template, run `pveam update && pveam download` |
|
||||
| **220** | Unable to resolve template path | Template storage not accessible | Check storage availability, verify permissions |
|
||||
| **221** | Template file exists but not readable | Permission denied | `chmod 644 template.tar.zst`, check storage permissions |
|
||||
| **222** | Template download failed after 3 attempts | Network issues, storage problems | Check internet connectivity, verify storage space |
|
||||
| **223** | Template not available after download | Storage sync issue, I/O delay | Wait a few seconds, verify storage is mounted |
|
||||
| **225** | No template available for OS/Version | Unsupported OS version, catalog outdated | Run `pveam update`, check `pveam available -section system` |
|
||||
|
||||
### LXC Stack Errors (231)
|
||||
|
||||
| Code | Description | Common Causes | Solutions |
|
||||
| ------- | ------------------------------ | ------------------------------------------- | -------------------------------------------- |
|
||||
| **231** | LXC stack upgrade/retry failed | Outdated `pve-container`, Debian 13.1 issue | See [Debian 13.1 Fix Guide](#debian-131-fix) |
|
||||
|
||||
---
|
||||
|
||||
## Special Case: Debian 13.1 "unsupported version" Error
|
||||
|
||||
### Problem
|
||||
|
||||
```
|
||||
TASK ERROR: unable to create CT 129 - unsupported debian version '13.1'
|
||||
```
|
||||
|
||||
### Root Cause
|
||||
|
||||
Outdated `pve-container` package doesn't recognize Debian 13 (Trixie).
|
||||
|
||||
### Solutions
|
||||
|
||||
#### Option 1: Full System Upgrade (Recommended)
|
||||
|
||||
```bash
|
||||
apt update
|
||||
apt full-upgrade -y
|
||||
reboot
|
||||
```
|
||||
|
||||
Verify fix:
|
||||
|
||||
```bash
|
||||
dpkg -l pve-container
|
||||
# PVE 8: Should show 5.3.3+
|
||||
# PVE 9: Should show 6.0.13+
|
||||
```
|
||||
|
||||
#### Option 2: Update Only pve-container
|
||||
|
||||
```bash
|
||||
apt update
|
||||
apt install --only-upgrade pve-container -y
|
||||
```
|
||||
|
||||
**Warning:** If Proxmox fails to boot after this, your system was inconsistent. Perform Option 1 instead.
|
||||
|
||||
#### Option 3: Verify Repository Configuration
|
||||
|
||||
Many users disable Enterprise repos but forget to add no-subscription repos.
|
||||
|
||||
**For PVE 9 (Trixie):**
|
||||
|
||||
```bash
|
||||
cat /etc/apt/sources.list.d/pve-no-subscription.list
|
||||
```
|
||||
|
||||
Should contain:
|
||||
|
||||
```
|
||||
deb http://download.proxmox.com/debian/pve trixie pve-no-subscription
|
||||
deb http://download.proxmox.com/debian/ceph-squid trixie no-subscription
|
||||
```
|
||||
|
||||
**For PVE 8 (Bookworm):**
|
||||
|
||||
```
|
||||
deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription
|
||||
deb http://download.proxmox.com/debian/ceph-quincy bookworm no-subscription
|
||||
```
|
||||
|
||||
Then:
|
||||
|
||||
```bash
|
||||
apt update
|
||||
apt full-upgrade -y
|
||||
```
|
||||
|
||||
### Reference
|
||||
|
||||
Official discussion: [GitHub #8126](https://github.com/community-scripts/ProxmoxVE/discussions/8126)
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting Tips
|
||||
|
||||
### Finding Error Details
|
||||
|
||||
1. **Check logs:**
|
||||
|
||||
```bash
|
||||
tail -n 50 /tmp/pct_create_*.log
|
||||
```
|
||||
|
||||
2. **Enable verbose mode:**
|
||||
|
||||
```bash
|
||||
bash -x script.sh # Shows every command executed
|
||||
```
|
||||
|
||||
3. **Check container status:**
|
||||
|
||||
```bash
|
||||
pct list
|
||||
pct status CTID
|
||||
```
|
||||
|
||||
4. **Verify storage:**
|
||||
```bash
|
||||
pvesm status
|
||||
df -h
|
||||
```
|
||||
|
||||
### Common Patterns
|
||||
|
||||
- **Exit 0 with error message:** Configuration validation failed (check DNS, MAC, password format)
|
||||
- **Exit 206 but container not visible:** Ghost container state - check `/etc/pve/lxc/` manually
|
||||
- **Exit 209 generic error:** Check `/tmp/pct_create_*.log` for specific `pct create` failure reason
|
||||
- **Exit 218 or 222:** Template issues - delete and re-download template
|
||||
|
||||
---
|
||||
|
||||
## Quick Reference Chart
|
||||
|
||||
| Exit Code Range | Category | Typical Issue |
|
||||
| --------------- | ------------------ | ------------------------------------------- |
|
||||
| 1-2, 126-143 | Shell/System | Permissions, signals, missing commands |
|
||||
| 100-101, 255 | Package Manager | APT/DPKG errors, broken packages |
|
||||
| 200-209 | Container Creation | CTID, password, configuration |
|
||||
| 210-217 | Storage/Cluster | Disk space, quorum, storage type |
|
||||
| 218-225 | Templates | Download, corruption, availability |
|
||||
| 231-254 | Databases/Runtime | PostgreSQL, MySQL, MongoDB, Node.js, Python |
|
||||
|
||||
---
|
||||
|
||||
## Contributing
|
||||
|
||||
Found an undocumented exit code or have a solution to share? Please:
|
||||
|
||||
1. Open an issue on [GitHub](https://github.com/community-scripts/ProxmoxVE/issues)
|
||||
2. Include:
|
||||
- Exit code number
|
||||
- Error message
|
||||
- Steps to reproduce
|
||||
- Solution that worked for you
|
||||
|
||||
---
|
||||
|
||||
_Last updated: November 2025_
|
||||
_ProxmoxVE Version: 2.x_
|
||||
298
docs/README.md
Normal file
298
docs/README.md
Normal file
@ -0,0 +1,298 @@
|
||||
# 📚 ProxmoxVE Documentation
|
||||
|
||||
Complete guide to all ProxmoxVE documentation - quickly find what you need.
|
||||
|
||||
---
|
||||
|
||||
## 🎯 **Quick Navigation by Goal**
|
||||
|
||||
### 👤 **I want to...**
|
||||
|
||||
**Contribute a new application**
|
||||
→ Start with: [contribution/README.md](contribution/README.md)
|
||||
→ Then: [ct/DETAILED_GUIDE.md](ct/DETAILED_GUIDE.md) + [install/DETAILED_GUIDE.md](install/DETAILED_GUIDE.md)
|
||||
|
||||
**Understand the architecture**
|
||||
→ Read: [TECHNICAL_REFERENCE.md](TECHNICAL_REFERENCE.md)
|
||||
→ Then: [misc/README.md](misc/README.md)
|
||||
|
||||
**Debug a failed installation**
|
||||
→ Check: [EXIT_CODES.md](EXIT_CODES.md)
|
||||
→ Then: [DEV_MODE.md](DEV_MODE.md)
|
||||
→ See also: [misc/error_handler.func/](misc/error_handler.func/)
|
||||
|
||||
**Configure system defaults**
|
||||
→ Read: [guides/DEFAULTS_SYSTEM_GUIDE.md](guides/DEFAULTS_SYSTEM_GUIDE.md)
|
||||
|
||||
**Deploy containers automatically**
|
||||
→ Read: [guides/UNATTENDED_DEPLOYMENTS.md](guides/UNATTENDED_DEPLOYMENTS.md)
|
||||
|
||||
**Develop a function library**
|
||||
→ Study: [misc/](misc/) documentation
|
||||
|
||||
---
|
||||
|
||||
## 👤 **Quick Start by Role**
|
||||
|
||||
### **I'm a...**
|
||||
|
||||
**New Contributor**
|
||||
→ Start: [contribution/README.md](contribution/README.md)
|
||||
→ Then: Choose your path below
|
||||
|
||||
**Container Creator**
|
||||
→ Read: [ct/README.md](ct/README.md)
|
||||
→ Deep Dive: [ct/DETAILED_GUIDE.md](ct/DETAILED_GUIDE.md)
|
||||
→ Reference: [misc/build.func/](misc/build.func/)
|
||||
|
||||
**Installation Script Developer**
|
||||
→ Read: [install/README.md](install/README.md)
|
||||
→ Deep Dive: [install/DETAILED_GUIDE.md](install/DETAILED_GUIDE.md)
|
||||
→ Reference: [misc/tools.func/](misc/tools.func/)
|
||||
|
||||
**VM Provisioner**
|
||||
→ Read: [vm/README.md](vm/README.md)
|
||||
→ Reference: [misc/cloud-init.func/](misc/cloud-init.func/)
|
||||
|
||||
**Tools Developer**
|
||||
→ Read: [tools/README.md](tools/README.md)
|
||||
→ Reference: [misc/build.func/](misc/build.func/)
|
||||
|
||||
**API Integrator**
|
||||
→ Read: [api/README.md](api/README.md)
|
||||
→ Reference: [misc/api.func/](misc/api.func/)
|
||||
|
||||
**System Operator**
|
||||
→ Start: [EXIT_CODES.md](EXIT_CODES.md)
|
||||
→ Then: [guides/DEFAULTS_SYSTEM_GUIDE.md](guides/DEFAULTS_SYSTEM_GUIDE.md)
|
||||
→ Automate: [guides/UNATTENDED_DEPLOYMENTS.md](guides/UNATTENDED_DEPLOYMENTS.md)
|
||||
→ Debug: [DEV_MODE.md](DEV_MODE.md)
|
||||
|
||||
**Architect**
|
||||
→ Read: [TECHNICAL_REFERENCE.md](TECHNICAL_REFERENCE.md)
|
||||
→ Deep Dive: [misc/README.md](misc/README.md)
|
||||
|
||||
---
|
||||
|
||||
## 📂 **Documentation Structure**
|
||||
|
||||
### Project-Mirrored Directories
|
||||
|
||||
Each major project directory has documentation:
|
||||
|
||||
```
|
||||
ProxmoxVE/
|
||||
├─ ct/ ↔ docs/ct/ (README.md + DETAILED_GUIDE.md)
|
||||
├─ install/ ↔ docs/install/ (README.md + DETAILED_GUIDE.md)
|
||||
├─ vm/ ↔ docs/vm/ (README.md)
|
||||
├─ tools/ ↔ docs/tools/ (README.md)
|
||||
├─ api/ ↔ docs/api/ (README.md)
|
||||
├─ misc/ ↔ docs/misc/ (9 function libraries)
|
||||
└─ [system-wide] ↔ docs/guides/ (configuration & deployment guides)
|
||||
```
|
||||
|
||||
### Core Documentation
|
||||
|
||||
| Document | Purpose | Audience |
|
||||
|----------|---------|----------|
|
||||
| [contribution/README.md](contribution/README.md) | How to contribute | Contributors |
|
||||
| [ct/DETAILED_GUIDE.md](ct/DETAILED_GUIDE.md) | Create ct scripts | Container developers |
|
||||
| [install/DETAILED_GUIDE.md](install/DETAILED_GUIDE.md) | Create install scripts | Installation developers |
|
||||
| [TECHNICAL_REFERENCE.md](TECHNICAL_REFERENCE.md) | Architecture deep-dive | Architects, advanced users |
|
||||
| [guides/DEFAULTS_SYSTEM_GUIDE.md](guides/DEFAULTS_SYSTEM_GUIDE.md) | Configuration system | Operators, power users |
|
||||
| [guides/CONFIGURATION_REFERENCE.md](guides/CONFIGURATION_REFERENCE.md) | Configuration options reference | Advanced users |
|
||||
| [guides/UNATTENDED_DEPLOYMENTS.md](guides/UNATTENDED_DEPLOYMENTS.md) | Automated deployments | DevOps, automation |
|
||||
| [EXIT_CODES.md](EXIT_CODES.md) | Exit code reference | Troubleshooters |
|
||||
| [DEV_MODE.md](DEV_MODE.md) | Debugging tools | Developers |
|
||||
|
||||
---
|
||||
|
||||
## 📂 **Directory Guide**
|
||||
|
||||
### [ct/](ct/) - Container Scripts
|
||||
Documentation for `/ct` - Container creation scripts that run on the Proxmox host.
|
||||
|
||||
**Includes**:
|
||||
- Overview of container creation process
|
||||
- Deep dive: [DETAILED_GUIDE.md](ct/DETAILED_GUIDE.md) - Complete reference with examples
|
||||
- Reference to [misc/build.func/](misc/build.func/)
|
||||
- Quick start for creating new containers
|
||||
|
||||
### [install/](install/) - Installation Scripts
|
||||
Documentation for `/install` - Scripts that run inside containers to install applications.
|
||||
|
||||
**Includes**:
|
||||
- Overview of 10-phase installation pattern
|
||||
- Deep dive: [DETAILED_GUIDE.md](install/DETAILED_GUIDE.md) - Complete reference with examples
|
||||
- Reference to [misc/tools.func/](misc/tools.func/)
|
||||
- Alpine vs Debian differences
|
||||
|
||||
### [vm/](vm/) - Virtual Machine Scripts
|
||||
Documentation for `/vm` - VM creation scripts using cloud-init provisioning.
|
||||
|
||||
**Includes**:
|
||||
- Overview of VM provisioning
|
||||
- Link to [misc/cloud-init.func/](misc/cloud-init.func/)
|
||||
- VM vs Container comparison
|
||||
- Cloud-init examples
|
||||
|
||||
### [tools/](tools/) - Tools & Utilities
|
||||
Documentation for `/tools` - Management tools and add-ons.
|
||||
|
||||
**Includes**:
|
||||
- Overview of tools structure
|
||||
- Integration points
|
||||
- Contributing new tools
|
||||
- Common operations
|
||||
|
||||
### [api/](api/) - API Integration
|
||||
Documentation for `/api` - Telemetry and API backend.
|
||||
|
||||
**Includes**:
|
||||
- API overview
|
||||
- Integration methods
|
||||
- API endpoints
|
||||
- Privacy information
|
||||
|
||||
### [misc/](misc/) - Function Libraries
|
||||
Documentation for `/misc` - 9 core function libraries with complete references.
|
||||
|
||||
**Contains**:
|
||||
- **build.func/** - Container orchestration (7 files)
|
||||
- **core.func/** - Utilities and messaging (5 files)
|
||||
- **error_handler.func/** - Error handling (5 files)
|
||||
- **api.func/** - API integration (5 files)
|
||||
- **install.func/** - Container setup (5 files)
|
||||
- **tools.func/** - Package installation (6 files)
|
||||
- **alpine-install.func/** - Alpine setup (5 files)
|
||||
- **alpine-tools.func/** - Alpine tools (5 files)
|
||||
- **cloud-init.func/** - VM provisioning (5 files)
|
||||
|
||||
---
|
||||
|
||||
## 🎓 **Learning Paths**
|
||||
|
||||
### Path 1: First-Time Contributor (2-3 hours)
|
||||
|
||||
1. [contribution/README.md](contribution/README.md) - Quick Start
|
||||
2. Pick your area:
|
||||
- Containers → [ct/README.md](ct/README.md) + [ct/DETAILED_GUIDE.md](ct/DETAILED_GUIDE.md)
|
||||
- Installation → [install/README.md](install/README.md) + [install/DETAILED_GUIDE.md](install/DETAILED_GUIDE.md)
|
||||
- VMs → [vm/README.md](vm/README.md)
|
||||
3. Study existing similar script
|
||||
4. Create your contribution
|
||||
5. Submit PR
|
||||
|
||||
### Path 2: Intermediate Developer (4-6 hours)
|
||||
|
||||
1. [TECHNICAL_REFERENCE.md](TECHNICAL_REFERENCE.md)
|
||||
2. Dive into function libraries:
|
||||
- [misc/build.func/README.md](misc/build.func/README.md)
|
||||
- [misc/tools.func/README.md](misc/tools.func/README.md)
|
||||
- [misc/install.func/README.md](misc/install.func/README.md)
|
||||
3. Study advanced examples
|
||||
4. Create complex applications
|
||||
|
||||
### Path 3: Advanced Architect (8+ hours)
|
||||
|
||||
1. All of Intermediate Path
|
||||
2. Study all 9 function libraries in depth
|
||||
3. [guides/DEFAULTS_SYSTEM_GUIDE.md](guides/DEFAULTS_SYSTEM_GUIDE.md) - Configuration system
|
||||
4. [DEV_MODE.md](DEV_MODE.md) - Debugging and development
|
||||
5. Design new features or function libraries
|
||||
|
||||
### Path 4: Troubleshooter (30 minutes - 1 hour)
|
||||
|
||||
1. [EXIT_CODES.md](EXIT_CODES.md) - Find error code
|
||||
2. [DEV_MODE.md](DEV_MODE.md) - Run with debugging
|
||||
3. Check relevant function library docs
|
||||
4. Review logs and fix
|
||||
|
||||
---
|
||||
|
||||
## 📊 **By the Numbers**
|
||||
|
||||
| Metric | Count |
|
||||
|--------|:---:|
|
||||
| **Documentation Files** | 63 |
|
||||
| **Total Lines** | 15,000+ |
|
||||
| **Function Libraries** | 9 |
|
||||
| **Functions Documented** | 150+ |
|
||||
| **Code Examples** | 50+ |
|
||||
| **Flowcharts** | 15+ |
|
||||
| **Do/Don't Sections** | 20+ |
|
||||
| **Real-World Examples** | 30+ |
|
||||
|
||||
---
|
||||
|
||||
## 🔍 **Find It Fast**
|
||||
|
||||
### By Feature
|
||||
- **How do I create a container?** → [ct/DETAILED_GUIDE.md](ct/DETAILED_GUIDE.md)
|
||||
- **How do I create an install script?** → [install/DETAILED_GUIDE.md](install/DETAILED_GUIDE.md)
|
||||
- **How do I create a VM?** → [vm/README.md](vm/README.md)
|
||||
- **How do I install Node.js?** → [misc/tools.func/](misc/tools.func/)
|
||||
- **How do I debug?** → [DEV_MODE.md](DEV_MODE.md)
|
||||
|
||||
### By Error
|
||||
- **Exit code 206?** → [EXIT_CODES.md](EXIT_CODES.md)
|
||||
- **Network failed?** → [misc/install.func/](misc/install.func/)
|
||||
- **Package error?** → [misc/tools.func/](misc/tools.func/)
|
||||
|
||||
### By Role
|
||||
- **Contributor** → [contribution/README.md](contribution/README.md)
|
||||
- **Operator** → [guides/DEFAULTS_SYSTEM_GUIDE.md](guides/DEFAULTS_SYSTEM_GUIDE.md)
|
||||
- **Automation** → [guides/UNATTENDED_DEPLOYMENTS.md](guides/UNATTENDED_DEPLOYMENTS.md)
|
||||
- **Developer** → [TECHNICAL_REFERENCE.md](TECHNICAL_REFERENCE.md)
|
||||
- **Architect** → [misc/README.md](misc/README.md)
|
||||
|
||||
---
|
||||
|
||||
## ✅ **Documentation Features**
|
||||
|
||||
- ✅ **Project-mirrored structure** - Organized like the actual project
|
||||
- ✅ **Complete function references** - Every function documented
|
||||
- ✅ **Real-world examples** - Copy-paste ready code
|
||||
- ✅ **Visual flowcharts** - ASCII diagrams of workflows
|
||||
- ✅ **Integration guides** - How components connect
|
||||
- ✅ **Troubleshooting** - Common issues and solutions
|
||||
- ✅ **Best practices** - DO/DON'T sections throughout
|
||||
- ✅ **Learning paths** - Structured curriculum by role
|
||||
- ✅ **Quick references** - Fast lookup by error code
|
||||
- ✅ **Comprehensive navigation** - This page
|
||||
|
||||
---
|
||||
|
||||
## 🚀 **Start Here**
|
||||
|
||||
**New to ProxmoxVE?** → [contribution/README.md](contribution/README.md)
|
||||
|
||||
**Looking for something specific?** → Choose your role above or browse by directory
|
||||
|
||||
**Need to debug?** → [EXIT_CODES.md](EXIT_CODES.md)
|
||||
|
||||
**Want to understand architecture?** → [TECHNICAL_REFERENCE.md](TECHNICAL_REFERENCE.md)
|
||||
|
||||
---
|
||||
|
||||
## 🤝 **Contributing Documentation**
|
||||
|
||||
Found an error? Want to improve docs?
|
||||
|
||||
1. See: [contribution/README.md](contribution/README.md) for full contribution guide
|
||||
2. Open issue: [GitHub Issues](https://github.com/community-scripts/ProxmoxVE/issues)
|
||||
3. Or submit PR with improvements
|
||||
|
||||
---
|
||||
|
||||
## 📝 **Status**
|
||||
|
||||
- **Last Updated**: December 2025
|
||||
- **Version**: 2.3 (Consolidated & Reorganized)
|
||||
- **Completeness**: ✅ 100% - All components documented
|
||||
- **Quality**: ✅ Production-ready
|
||||
- **Structure**: ✅ Clean and organized
|
||||
|
||||
---
|
||||
|
||||
**Welcome to ProxmoxVE! Start with [CONTRIBUTION_GUIDE.md](CONTRIBUTION_GUIDE.md) or choose your role above.** 🚀
|
||||
897
docs/TECHNICAL_REFERENCE.md
Normal file
897
docs/TECHNICAL_REFERENCE.md
Normal file
@ -0,0 +1,897 @@
|
||||
# Technical Reference: Configuration System Architecture
|
||||
|
||||
> **For Developers and Advanced Users**
|
||||
>
|
||||
> _Deep dive into how the defaults and configuration system works_
|
||||
|
||||
---
|
||||
|
||||
## Table of Contents
|
||||
|
||||
1. [System Architecture](#system-architecture)
|
||||
2. [File Format Specifications](#file-format-specifications)
|
||||
3. [Function Reference](#function-reference)
|
||||
4. [Variable Precedence](#variable-precedence)
|
||||
5. [Data Flow Diagrams](#data-flow-diagrams)
|
||||
6. [Security Model](#security-model)
|
||||
7. [Implementation Details](#implementation-details)
|
||||
|
||||
---
|
||||
|
||||
## System Architecture
|
||||
|
||||
### Component Overview
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ Installation Script │
|
||||
│ (pihole-install.sh, docker-install.sh, etc.) │
|
||||
└────────────────────┬────────────────────────────────────────┘
|
||||
│
|
||||
v
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ build.func Library │
|
||||
│ ┌──────────────────────────────────────────────────────┐ │
|
||||
│ │ variables() │ │
|
||||
│ │ - Initialize NSAPP, var_install, etc. │ │
|
||||
│ └──────────────────────────────────────────────────────┘ │
|
||||
│ ┌──────────────────────────────────────────────────────┐ │
|
||||
│ │ install_script() │ │
|
||||
│ │ - Display mode menu │ │
|
||||
│ │ - Route to appropriate workflow │ │
|
||||
│ └──────────────────────────────────────────────────────┘ │
|
||||
│ ┌──────────────────────────────────────────────────────┐ │
|
||||
│ │ base_settings() │ │
|
||||
│ │ - Apply built-in defaults │ │
|
||||
│ │ - Read environment variables (var_*) │ │
|
||||
│ └──────────────────────────────────────────────────────┘ │
|
||||
│ ┌──────────────────────────────────────────────────────┐ │
|
||||
│ │ load_vars_file() │ │
|
||||
│ │ - Safe file parsing (NO source/eval) │ │
|
||||
│ │ - Whitelist validation │ │
|
||||
│ │ - Value sanitization │ │
|
||||
│ └──────────────────────────────────────────────────────┘ │
|
||||
│ ┌──────────────────────────────────────────────────────┐ │
|
||||
│ │ default_var_settings() │ │
|
||||
│ │ - Load user defaults │ │
|
||||
│ │ - Display summary │ │
|
||||
│ └──────────────────────────────────────────────────────┘ │
|
||||
│ ┌──────────────────────────────────────────────────────┐ │
|
||||
│ │ maybe_offer_save_app_defaults() │ │
|
||||
│ │ - Offer to save current settings │ │
|
||||
│ │ - Handle updates vs. new saves │ │
|
||||
│ └──────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
v
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ Configuration Files (on Disk) │
|
||||
│ ┌──────────────────────────────────────────────────────┐ │
|
||||
│ │ /usr/local/community-scripts/default.vars │ │
|
||||
│ │ (User global defaults) │ │
|
||||
│ └──────────────────────────────────────────────────────┘ │
|
||||
│ ┌──────────────────────────────────────────────────────┐ │
|
||||
│ │ /usr/local/community-scripts/defaults/*.vars │ │
|
||||
│ │ (App-specific defaults) │ │
|
||||
│ └──────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## File Format Specifications
|
||||
|
||||
### User Defaults: `default.vars`
|
||||
|
||||
**Location**: `/usr/local/community-scripts/default.vars`
|
||||
|
||||
**MIME Type**: `text/plain`
|
||||
|
||||
**Encoding**: UTF-8 (no BOM)
|
||||
|
||||
**Format Specification**:
|
||||
|
||||
```
|
||||
# File Format: Simple key=value pairs
|
||||
# Purpose: Store global user defaults
|
||||
# Security: Sanitized values, whitelist validation
|
||||
|
||||
# Comments and blank lines are ignored
|
||||
# Line format: var_name=value
|
||||
# No spaces around the equals sign
|
||||
# String values do not need quoting (but may be quoted)
|
||||
|
||||
[CONTENT]
|
||||
var_cpu=4
|
||||
var_ram=2048
|
||||
var_disk=20
|
||||
var_hostname=mydefault
|
||||
var_brg=vmbr0
|
||||
var_gateway=192.168.1.1
|
||||
```
|
||||
|
||||
**Formal Grammar**:
|
||||
|
||||
```
|
||||
FILE := (BLANK_LINE | COMMENT_LINE | VAR_LINE)*
|
||||
BLANK_LINE := \n
|
||||
COMMENT_LINE := '#' [^\n]* \n
|
||||
VAR_LINE := VAR_NAME '=' VAR_VALUE \n
|
||||
VAR_NAME := 'var_' [a-z_]+
|
||||
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 |
|
||||
|
||||
**Example Valid File**:
|
||||
|
||||
```bash
|
||||
# Global User Defaults
|
||||
# Created: 2024-11-28
|
||||
|
||||
# Resource defaults
|
||||
var_cpu=4
|
||||
var_ram=2048
|
||||
var_disk=20
|
||||
|
||||
# Network defaults
|
||||
var_brg=vmbr0
|
||||
var_gateway=192.168.1.1
|
||||
var_mtu=1500
|
||||
var_vlan=100
|
||||
|
||||
# System defaults
|
||||
var_timezone=Europe/Berlin
|
||||
var_hostname=default-container
|
||||
|
||||
# Storage
|
||||
var_container_storage=local
|
||||
var_template_storage=local
|
||||
|
||||
# Security
|
||||
var_ssh=yes
|
||||
var_protection=0
|
||||
var_unprivileged=1
|
||||
```
|
||||
|
||||
### App Defaults: `<app>.vars`
|
||||
|
||||
**Location**: `/usr/local/community-scripts/defaults/<appname>.vars`
|
||||
|
||||
**Format**: Identical to `default.vars`
|
||||
|
||||
**Naming Convention**: `<nsapp>.vars`
|
||||
|
||||
- `nsapp` = lowercase app name with spaces removed
|
||||
- Examples:
|
||||
- `pihole` → `pihole.vars`
|
||||
- `opnsense` → `opnsense.vars`
|
||||
- `docker compose` → `dockercompose.vars`
|
||||
|
||||
**Example App Defaults**:
|
||||
|
||||
```bash
|
||||
# App-specific defaults for PiHole (pihole)
|
||||
# Generated on 2024-11-28T15:32:00Z
|
||||
# These override user defaults when installing pihole
|
||||
|
||||
var_unprivileged=1
|
||||
var_cpu=2
|
||||
var_ram=1024
|
||||
var_disk=10
|
||||
var_brg=vmbr0
|
||||
var_net=veth
|
||||
var_gateway=192.168.1.1
|
||||
var_hostname=pihole
|
||||
var_timezone=Europe/Berlin
|
||||
var_container_storage=local
|
||||
var_template_storage=local
|
||||
var_tags=dns,pihole
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Function Reference
|
||||
|
||||
### `load_vars_file()`
|
||||
|
||||
**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` |
|
||||
|
||||
**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
|
||||
|
||||
**Implementation Pattern**:
|
||||
|
||||
```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
|
||||
}
|
||||
```
|
||||
|
||||
**Usage Examples**:
|
||||
|
||||
```bash
|
||||
# Load user defaults
|
||||
load_vars_file "/usr/local/community-scripts/default.vars"
|
||||
|
||||
# Load app-specific defaults
|
||||
load_vars_file "$(get_app_defaults_path)"
|
||||
|
||||
# Check if successful
|
||||
if load_vars_file "$vars_path"; then
|
||||
echo "Settings loaded successfully"
|
||||
else
|
||||
echo "Failed to load settings"
|
||||
fi
|
||||
|
||||
# Values are now available as variables
|
||||
echo "Using $var_cpu cores"
|
||||
echo "Allocating ${var_ram} MB RAM"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### `get_app_defaults_path()`
|
||||
|
||||
**Purpose**: Get the full path for app-specific defaults file
|
||||
|
||||
**Signature**:
|
||||
|
||||
```bash
|
||||
get_app_defaults_path()
|
||||
```
|
||||
|
||||
**Parameters**: None
|
||||
|
||||
**Returns**:
|
||||
|
||||
- String: Full path to app defaults file
|
||||
|
||||
**Implementation**:
|
||||
|
||||
```bash
|
||||
get_app_defaults_path() {
|
||||
local n="${NSAPP:-${APP,,}}"
|
||||
echo "/usr/local/community-scripts/defaults/${n}.vars"
|
||||
}
|
||||
```
|
||||
|
||||
**Usage Examples**:
|
||||
|
||||
```bash
|
||||
# Get app defaults path
|
||||
app_defaults="$(get_app_defaults_path)"
|
||||
echo "App defaults at: $app_defaults"
|
||||
|
||||
# Check if app defaults exist
|
||||
if [ -f "$(get_app_defaults_path)" ]; then
|
||||
echo "App defaults available"
|
||||
fi
|
||||
|
||||
# Load app defaults
|
||||
load_vars_file "$(get_app_defaults_path)"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### `default_var_settings()`
|
||||
|
||||
**Purpose**: Load and display user global defaults
|
||||
|
||||
**Signature**:
|
||||
|
||||
```bash
|
||||
default_var_settings()
|
||||
```
|
||||
|
||||
**Parameters**: None
|
||||
|
||||
**Returns**:
|
||||
|
||||
- `0` on success
|
||||
- `1` on error
|
||||
|
||||
**Workflow**:
|
||||
|
||||
```
|
||||
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)
|
||||
```
|
||||
|
||||
**Implementation Pattern**:
|
||||
|
||||
```bash
|
||||
default_var_settings() {
|
||||
local VAR_WHITELIST=(
|
||||
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
|
||||
1 | yes | true | on) VERBOSE="yes" ;;
|
||||
*) VERBOSE="${var_verbose}" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Apply and display
|
||||
base_settings "$VERBOSE"
|
||||
echo_default
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### `maybe_offer_save_app_defaults()`
|
||||
|
||||
**Purpose**: Offer to save current settings as app-specific defaults
|
||||
|
||||
**Signature**:
|
||||
|
||||
```bash
|
||||
maybe_offer_save_app_defaults()
|
||||
```
|
||||
|
||||
**Parameters**: None
|
||||
|
||||
**Returns**: None (side effects only)
|
||||
|
||||
**Behavior**:
|
||||
|
||||
1. After advanced installation completes
|
||||
2. Offers user: "Save as App Defaults for <APP>?"
|
||||
3. If yes:
|
||||
- Saves to `/usr/local/community-scripts/defaults/<app>.vars`
|
||||
- Only whitelisted variables included
|
||||
- Previous defaults backed up (if exists)
|
||||
4. If no:
|
||||
- No action taken
|
||||
|
||||
**Flow**:
|
||||
|
||||
```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?
|
||||
_show_app_defaults_diff_menu "$new_tmp" "$app_vars_path"
|
||||
else
|
||||
# New defaults - just save
|
||||
if whiptail --yesno "Save as App Defaults for $APP?" 10 60; then
|
||||
mv "$new_tmp" "$app_vars_path"
|
||||
chmod 644 "$app_vars_path"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### `_sanitize_value()`
|
||||
|
||||
**Purpose**: Remove dangerous characters/patterns from configuration values
|
||||
|
||||
**Signature**:
|
||||
|
||||
```bash
|
||||
_sanitize_value(value)
|
||||
```
|
||||
|
||||
**Parameters**:
|
||||
|
||||
| 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)` |
|
||||
|
||||
**Implementation**:
|
||||
|
||||
```bash
|
||||
_sanitize_value() {
|
||||
case "$1" in
|
||||
*'$('* | *'`'* | *';'* | *'&'* | *'<('*)
|
||||
echo ""
|
||||
return 1 # Reject dangerous value
|
||||
;;
|
||||
esac
|
||||
echo "$1"
|
||||
return 0
|
||||
}
|
||||
```
|
||||
|
||||
**Usage Examples**:
|
||||
|
||||
```bash
|
||||
# Safe value
|
||||
_sanitize_value "192.168.1.1" # Returns: 192.168.1.1 (status: 0)
|
||||
|
||||
# Dangerous value
|
||||
_sanitize_value "$(whoami)" # Returns: (empty) (status: 1)
|
||||
|
||||
# Usage in code
|
||||
if val="$(_sanitize_value "$user_input")"; then
|
||||
export var_hostname="$val"
|
||||
else
|
||||
msg_error "Invalid value: contains dangerous characters"
|
||||
fi
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### `_is_whitelisted_key()`
|
||||
|
||||
**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` |
|
||||
|
||||
**Returns**:
|
||||
|
||||
- `0` if key is whitelisted
|
||||
- `1` if key is NOT whitelisted
|
||||
|
||||
**Implementation**:
|
||||
|
||||
```bash
|
||||
_is_whitelisted_key() {
|
||||
local k="$1"
|
||||
local w
|
||||
for w in "${VAR_WHITELIST[@]}"; do
|
||||
[ "$k" = "$w" ] && return 0
|
||||
done
|
||||
return 1
|
||||
}
|
||||
```
|
||||
|
||||
**Usage Examples**:
|
||||
|
||||
```bash
|
||||
# Check if variable can be saved
|
||||
if _is_whitelisted_key "var_cpu"; then
|
||||
echo "var_cpu can be saved"
|
||||
fi
|
||||
|
||||
# Reject unknown variables
|
||||
if ! _is_whitelisted_key "var_custom"; then
|
||||
msg_error "var_custom is not supported"
|
||||
fi
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Variable Precedence
|
||||
|
||||
### Loading Order
|
||||
|
||||
When a container is being created, variables are resolved in this order:
|
||||
|
||||
```
|
||||
Step 1: Read ENVIRONMENT VARIABLES
|
||||
├─ Check if var_cpu is already set in shell environment
|
||||
├─ Check if var_ram is already set
|
||||
└─ ...all var_* variables
|
||||
|
||||
Step 2: Load APP-SPECIFIC DEFAULTS
|
||||
├─ Check if /usr/local/community-scripts/defaults/pihole.vars exists
|
||||
├─ Load all var_* from that file
|
||||
└─ These override built-ins but NOT environment variables
|
||||
|
||||
Step 3: Load USER GLOBAL DEFAULTS
|
||||
├─ Check if /usr/local/community-scripts/default.vars exists
|
||||
├─ Load all var_* from that file
|
||||
└─ These override built-ins but NOT app-specific
|
||||
|
||||
Step 4: Use BUILT-IN DEFAULTS
|
||||
└─ Hardcoded in script (lowest priority)
|
||||
```
|
||||
|
||||
### Precedence Examples
|
||||
|
||||
**Example 1: Environment Variable Wins**
|
||||
|
||||
```bash
|
||||
# Shell environment has highest priority
|
||||
$ export var_cpu=16
|
||||
$ bash pihole-install.sh
|
||||
|
||||
# Result: Container gets 16 cores
|
||||
# (ignores app defaults, user defaults, built-ins)
|
||||
```
|
||||
|
||||
**Example 2: App Defaults Override User Defaults**
|
||||
|
||||
```bash
|
||||
# User Defaults: var_cpu=4
|
||||
# App Defaults: var_cpu=2
|
||||
$ bash pihole-install.sh
|
||||
|
||||
# Result: Container gets 2 cores
|
||||
# (app-specific setting takes precedence)
|
||||
```
|
||||
|
||||
**Example 3: All Defaults Missing (Built-ins Used)**
|
||||
|
||||
```bash
|
||||
# No environment variables set
|
||||
# No app defaults file
|
||||
# No user defaults file
|
||||
$ bash pihole-install.sh
|
||||
|
||||
# Result: Uses built-in defaults
|
||||
# (var_cpu might be 2 by default)
|
||||
```
|
||||
|
||||
### Implementation in Code
|
||||
|
||||
```bash
|
||||
# Typical pattern in build.func
|
||||
|
||||
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
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Data Flow Diagrams
|
||||
|
||||
### Installation Flow: Advanced Settings
|
||||
|
||||
```
|
||||
┌──────────────┐
|
||||
│ Start Script│
|
||||
└──────┬───────┘
|
||||
│
|
||||
v
|
||||
┌──────────────────────────────┐
|
||||
│ Display Installation Mode │
|
||||
│ Menu (5 options) │
|
||||
└──────┬───────────────────────┘
|
||||
│ User selects "Advanced Settings"
|
||||
v
|
||||
┌──────────────────────────────────┐
|
||||
│ Call: base_settings() │
|
||||
│ (Apply built-in defaults) │
|
||||
└──────┬───────────────────────────┘
|
||||
│
|
||||
v
|
||||
┌──────────────────────────────────┐
|
||||
│ Call: advanced_settings() │
|
||||
│ (Show 19-step wizard) │
|
||||
│ - Ask CPU, RAM, Disk, Network... │
|
||||
└──────┬───────────────────────────┘
|
||||
│
|
||||
v
|
||||
┌──────────────────────────────────┐
|
||||
│ Show Summary │
|
||||
│ Review all chosen values │
|
||||
└──────┬───────────────────────────┘
|
||||
│ User confirms
|
||||
v
|
||||
┌──────────────────────────────────┐
|
||||
│ Create Container │
|
||||
│ Using current variable values │
|
||||
└──────┬───────────────────────────┘
|
||||
│
|
||||
v
|
||||
┌──────────────────────────────────┐
|
||||
│ Installation Complete │
|
||||
└──────┬───────────────────────────┘
|
||||
│
|
||||
v
|
||||
┌──────────────────────────────────────┐
|
||||
│ Offer: Save as App Defaults? │
|
||||
│ (Save current settings) │
|
||||
└──────┬───────────────────────────────┘
|
||||
│
|
||||
├─ YES → Save to defaults/<app>.vars
|
||||
│
|
||||
└─ NO → Exit
|
||||
```
|
||||
|
||||
### Variable Resolution Flow
|
||||
|
||||
```
|
||||
CONTAINER CREATION STARTED
|
||||
│
|
||||
v
|
||||
┌─────────────────────┐
|
||||
│ Check ENVIRONMENT │
|
||||
│ for var_cpu, var_..│
|
||||
└──────┬──────────────┘
|
||||
│ Found? Use them (Priority 1)
|
||||
│ Not found? Continue...
|
||||
v
|
||||
┌──────────────────────────┐
|
||||
│ Load App Defaults │
|
||||
│ /defaults/<app>.vars │
|
||||
└──────┬───────────────────┘
|
||||
│ File exists? Parse & load (Priority 2)
|
||||
│ Not found? Continue...
|
||||
v
|
||||
┌──────────────────────────┐
|
||||
│ Load User Defaults │
|
||||
│ /default.vars │
|
||||
└──────┬───────────────────┘
|
||||
│ File exists? Parse & load (Priority 3)
|
||||
│ Not found? Continue...
|
||||
v
|
||||
┌──────────────────────────┐
|
||||
│ Use Built-in Defaults │
|
||||
│ (Hardcoded values) │
|
||||
└──────┬───────────────────┘
|
||||
│
|
||||
v
|
||||
┌──────────────────────────┐
|
||||
│ All Variables Resolved │
|
||||
│ Ready for container │
|
||||
│ creation │
|
||||
└──────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Security Model
|
||||
|
||||
### 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 |
|
||||
|
||||
### Security Controls
|
||||
|
||||
#### 1. Input Validation
|
||||
|
||||
```bash
|
||||
# Only specific variables allowed
|
||||
if ! _is_whitelisted_key "$key"; then
|
||||
skip_this_variable
|
||||
fi
|
||||
|
||||
# Values sanitized
|
||||
if ! val="$(_sanitize_value "$value")"; then
|
||||
reject_entire_line
|
||||
fi
|
||||
```
|
||||
|
||||
#### 2. Safe File Parsing
|
||||
|
||||
```bash
|
||||
# ❌ DANGEROUS (OLD)
|
||||
source /path/to/config.conf
|
||||
# Could execute: rm -rf / or any code
|
||||
|
||||
# ✅ SAFE (NEW)
|
||||
load_vars_file "/path/to/config.conf"
|
||||
# Only reads var_name=value pairs, no execution
|
||||
```
|
||||
|
||||
#### 3. Whitelisting
|
||||
|
||||
```bash
|
||||
# Only these variables can be configured
|
||||
var_cpu, var_ram, var_disk, var_brg, ...
|
||||
var_hostname, var_pw, var_ssh, ...
|
||||
|
||||
# NOT allowed:
|
||||
var_malicious, var_hack, custom_var, ...
|
||||
```
|
||||
|
||||
#### 4. Value Constraints
|
||||
|
||||
```bash
|
||||
# No command injection patterns
|
||||
if [[ "$value" =~ ($|`|;|&|<\() ]]; then
|
||||
reject_value
|
||||
fi
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Implementation Details
|
||||
|
||||
### 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
|
||||
4. `variables()` - Initialize variables
|
||||
5. `check_root()` - Security check
|
||||
6. `install_script()` - Main flow
|
||||
|
||||
**Key Sections**:
|
||||
|
||||
```bash
|
||||
# Section 1: Initialization & Variables
|
||||
- variables()
|
||||
- NSAPP, var_install, INTEGER pattern, etc.
|
||||
|
||||
# Section 2: Storage Management
|
||||
- storage_selector()
|
||||
- ensure_storage_selection_for_vars_file()
|
||||
|
||||
# Section 3: Base Settings
|
||||
- base_settings() # Apply defaults to all var_*
|
||||
- echo_default() # Display current settings
|
||||
|
||||
# Section 4: Variable Loading
|
||||
- load_vars_file() # Safe parsing
|
||||
- _is_whitelisted_key() # Validation
|
||||
- _sanitize_value() # Threat mitigation
|
||||
|
||||
# Section 5: Defaults Management
|
||||
- default_var_settings() # Load user defaults
|
||||
- get_app_defaults_path() # Get app defaults path
|
||||
- maybe_offer_save_app_defaults() # Save option
|
||||
|
||||
# Section 6: Installation Flow
|
||||
- install_script() # Main entry point
|
||||
- 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` `` |
|
||||
|
||||
---
|
||||
|
||||
## Appendix: Migration Reference
|
||||
|
||||
### Old Pattern (Deprecated)
|
||||
|
||||
```bash
|
||||
# ❌ OLD: config-file.func
|
||||
source config-file.conf # Executes arbitrary code
|
||||
if [ "$USE_DEFAULTS" = "yes" ]; then
|
||||
apply_settings_directly
|
||||
fi
|
||||
```
|
||||
|
||||
### New Pattern (Current)
|
||||
|
||||
```bash
|
||||
# ✅ NEW: load_vars_file()
|
||||
if load_vars_file "$(get_app_defaults_path)"; then
|
||||
echo "Settings loaded securely"
|
||||
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 |
|
||||
|
||||
---
|
||||
|
||||
**End of Technical Reference**
|
||||
146
docs/api/README.md
Normal file
146
docs/api/README.md
Normal file
@ -0,0 +1,146 @@
|
||||
# API Integration Documentation (/api)
|
||||
|
||||
This directory contains comprehensive documentation for API integration and the `/api` directory.
|
||||
|
||||
## Overview
|
||||
|
||||
The `/api` directory contains the Proxmox Community Scripts API backend for diagnostic reporting, telemetry, and analytics integration.
|
||||
|
||||
## Key Components
|
||||
|
||||
### Main API Service
|
||||
Located in `/api/main.go`:
|
||||
- RESTful API for receiving telemetry data
|
||||
- Installation statistics tracking
|
||||
- Error reporting and analytics
|
||||
- Performance monitoring
|
||||
|
||||
### Integration with Scripts
|
||||
The API is integrated into all installation scripts via `api.func`:
|
||||
- Sends installation start/completion events
|
||||
- Reports errors and exit codes
|
||||
- Collects anonymous usage statistics
|
||||
- Enables project analytics
|
||||
|
||||
## Documentation Structure
|
||||
|
||||
API documentation covers:
|
||||
- API endpoint specifications
|
||||
- Integration methods
|
||||
- Data formats and schemas
|
||||
- Error handling
|
||||
- Privacy and data handling
|
||||
|
||||
## Key Resources
|
||||
|
||||
- **[misc/api.func/](../misc/api.func/)** - API function library documentation
|
||||
- **[misc/api.func/README.md](../misc/api.func/README.md)** - Quick reference
|
||||
- **[misc/api.func/API_FUNCTIONS_REFERENCE.md](../misc/api.func/API_FUNCTIONS_REFERENCE.md)** - Complete function reference
|
||||
|
||||
## API Functions
|
||||
|
||||
The `api.func` library provides:
|
||||
|
||||
### `post_to_api()`
|
||||
Send container installation data to API.
|
||||
|
||||
**Usage**:
|
||||
```bash
|
||||
post_to_api CTID STATUS APP_NAME
|
||||
```
|
||||
|
||||
### `post_update_to_api()`
|
||||
Report application update status.
|
||||
|
||||
**Usage**:
|
||||
```bash
|
||||
post_update_to_api CTID APP_NAME VERSION
|
||||
```
|
||||
|
||||
### `get_error_description()`
|
||||
Get human-readable error description from exit code.
|
||||
|
||||
**Usage**:
|
||||
```bash
|
||||
ERROR_DESC=$(get_error_description EXIT_CODE)
|
||||
```
|
||||
|
||||
## API Integration Points
|
||||
|
||||
### In Container Creation (`ct/AppName.sh`)
|
||||
- Called by build.func to report container creation
|
||||
- Sends initial container setup data
|
||||
- Reports success or failure
|
||||
|
||||
### In Installation Scripts (`install/appname-install.sh`)
|
||||
- Called at start of installation
|
||||
- Called on installation completion
|
||||
- Called on error conditions
|
||||
|
||||
### Data Collected
|
||||
- Container/VM ID
|
||||
- Application name and version
|
||||
- Installation duration
|
||||
- Success/failure status
|
||||
- Error codes (if failure)
|
||||
- Anonymous usage metrics
|
||||
|
||||
## Privacy
|
||||
|
||||
All API data:
|
||||
- ✅ Anonymous (no personal data)
|
||||
- ✅ Aggregated for statistics
|
||||
- ✅ Used only for project improvement
|
||||
- ✅ No tracking of user identities
|
||||
- ✅ Can be disabled if desired
|
||||
|
||||
## API Architecture
|
||||
|
||||
```
|
||||
Installation Scripts
|
||||
│
|
||||
├─ Call: api.func functions
|
||||
│
|
||||
└─ POST to: https://api.community-scripts.org
|
||||
│
|
||||
├─ Receives data
|
||||
├─ Validates format
|
||||
├─ Stores metrics
|
||||
└─ Aggregates statistics
|
||||
│
|
||||
└─ Used for:
|
||||
├─ Download tracking
|
||||
├─ Error trending
|
||||
├─ Feature usage stats
|
||||
└─ Project health monitoring
|
||||
```
|
||||
|
||||
## Common API Tasks
|
||||
|
||||
- **Enable API reporting** → Built-in by default, no configuration needed
|
||||
- **Disable API** → Set `api_disable="yes"` before running
|
||||
- **View API data** → Visit https://community-scripts.org/stats
|
||||
- **Report API errors** → [GitHub Issues](https://github.com/community-scripts/ProxmoxVE/issues)
|
||||
|
||||
## Debugging API Issues
|
||||
|
||||
If API calls fail:
|
||||
1. Check internet connectivity
|
||||
2. Verify API endpoint availability
|
||||
3. Review error codes in [EXIT_CODES.md](../EXIT_CODES.md)
|
||||
4. Check API function logs
|
||||
5. Report issues on GitHub
|
||||
|
||||
## API Endpoint
|
||||
|
||||
**Base URL**: `https://api.community-scripts.org`
|
||||
|
||||
**Endpoints**:
|
||||
- `POST /install` - Report container installation
|
||||
- `POST /update` - Report application update
|
||||
- `GET /stats` - Public statistics
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: December 2025
|
||||
**Maintainers**: community-scripts team
|
||||
@ -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.
|
||||
|
||||
@ -20,7 +19,7 @@ These documents cover the coding standards for the following types of files in o
|
||||
|
||||
- **`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.
|
||||
- **`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.
|
||||
|
||||
@ -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,90 +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. Final version of the script (the one you will push for review), must have all comments removed, except the ones in the file header.
|
||||
|
||||
- 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
|
||||
|
||||
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
|
||||
### 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.
|
||||
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 branch on the Dev repository. You must only include your **$AppName.sh**, **$AppName-install.sh** and **$AppName.json** files in the 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)
|
||||
186
docs/contribution/FORK_SETUP.md
Normal file
186
docs/contribution/FORK_SETUP.md
Normal file
@ -0,0 +1,186 @@
|
||||
# 🍴 Fork Setup Guide
|
||||
|
||||
**Just forked ProxmoxVE? Run this first!**
|
||||
|
||||
## Quick Start
|
||||
|
||||
```bash
|
||||
# Clone your fork
|
||||
git clone https://github.com/YOUR_USERNAME/ProxmoxVE.git
|
||||
cd ProxmoxVE
|
||||
|
||||
# Run setup script (auto-detects your username from git)
|
||||
bash setup-fork.sh
|
||||
```
|
||||
|
||||
That's it! ✅
|
||||
|
||||
---
|
||||
|
||||
## What Does It Do?
|
||||
|
||||
The `setup-fork.sh` script automatically:
|
||||
|
||||
1. **Detects** your GitHub username from git config
|
||||
2. **Updates** 22 hardcoded links in documentation to point to your fork
|
||||
3. **Creates** `.git-setup-info` with recommended git workflows
|
||||
4. **Backs up** all modified files (*.backup)
|
||||
|
||||
---
|
||||
|
||||
## Usage
|
||||
|
||||
### Auto-Detect (Recommended)
|
||||
```bash
|
||||
bash setup-fork.sh
|
||||
```
|
||||
Automatically reads your GitHub username from `git remote origin url`
|
||||
|
||||
### Specify Username
|
||||
```bash
|
||||
bash setup-fork.sh john
|
||||
```
|
||||
Updates links to `github.com/john/ProxmoxVE`
|
||||
|
||||
### Custom Repository Name
|
||||
```bash
|
||||
bash setup-fork.sh john my-fork
|
||||
```
|
||||
Updates links to `github.com/john/my-fork`
|
||||
|
||||
---
|
||||
|
||||
## What Gets Updated?
|
||||
|
||||
The script updates these documentation files:
|
||||
- `docs/CONTRIBUTION_GUIDE.md` (4 links)
|
||||
- `docs/README.md` (1 link)
|
||||
- `docs/INDEX.md` (3 links)
|
||||
- `docs/EXIT_CODES.md` (2 links)
|
||||
- `docs/DEFAULTS_SYSTEM_GUIDE.md` (2 links)
|
||||
- `docs/api/README.md` (1 link)
|
||||
- `docs/APP-ct.md` (1 link)
|
||||
- `docs/APP-install.md` (1 link)
|
||||
- `docs/alpine-install.func.md` (2 links)
|
||||
- `docs/install.func.md` (1 link)
|
||||
- And code examples in documentation
|
||||
|
||||
---
|
||||
|
||||
## After Setup
|
||||
|
||||
1. **Review changes**
|
||||
```bash
|
||||
git diff docs/
|
||||
```
|
||||
|
||||
2. **Read git workflow tips**
|
||||
```bash
|
||||
cat .git-setup-info
|
||||
```
|
||||
|
||||
3. **Start contributing**
|
||||
```bash
|
||||
git checkout -b feature/my-app
|
||||
# Make your changes...
|
||||
git commit -m "feat: add my awesome app"
|
||||
```
|
||||
|
||||
4. **Follow the guide**
|
||||
```bash
|
||||
cat docs/CONTRIBUTION_GUIDE.md
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Common Workflows
|
||||
|
||||
### Keep Your Fork Updated
|
||||
```bash
|
||||
# Add upstream if you haven't already
|
||||
git remote add upstream https://github.com/community-scripts/ProxmoxVE.git
|
||||
|
||||
# Get latest from upstream
|
||||
git fetch upstream
|
||||
git rebase upstream/main
|
||||
git push origin main
|
||||
```
|
||||
|
||||
### Create a Feature Branch
|
||||
```bash
|
||||
git checkout -b feature/docker-improvements
|
||||
# Make changes...
|
||||
git push origin feature/docker-improvements
|
||||
# Then create PR on GitHub
|
||||
```
|
||||
|
||||
### Sync Before Contributing
|
||||
```bash
|
||||
git fetch upstream
|
||||
git rebase upstream/main
|
||||
git push -f origin main # Update your fork's main
|
||||
git checkout -b feature/my-feature
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### "Git is not installed" or "not a git repository"
|
||||
```bash
|
||||
# Make sure you cloned the repo first
|
||||
git clone https://github.com/YOUR_USERNAME/ProxmoxVE.git
|
||||
cd ProxmoxVE
|
||||
bash setup-fork.sh
|
||||
```
|
||||
|
||||
### "Could not auto-detect GitHub username"
|
||||
```bash
|
||||
# Your git origin URL isn't set up correctly
|
||||
git remote -v
|
||||
# Should show your fork URL, not community-scripts
|
||||
|
||||
# Fix it:
|
||||
git remote set-url origin https://github.com/YOUR_USERNAME/ProxmoxVE.git
|
||||
bash setup-fork.sh
|
||||
```
|
||||
|
||||
### "Permission denied"
|
||||
```bash
|
||||
# Make script executable
|
||||
chmod +x setup-fork.sh
|
||||
bash setup-fork.sh
|
||||
```
|
||||
|
||||
### Reverted Changes by Accident?
|
||||
```bash
|
||||
# Backups are created automatically
|
||||
git checkout docs/*.backup
|
||||
# Or just re-run setup-fork.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Next Steps
|
||||
|
||||
1. ✅ Run `bash setup-fork.sh`
|
||||
2. 📖 Read [docs/CONTRIBUTION_GUIDE.md](docs/CONTRIBUTION_GUIDE.md)
|
||||
3. 🍴 Choose your contribution path:
|
||||
- **Containers** → [docs/ct/README.md](docs/ct/README.md)
|
||||
- **Installation** → [docs/install/README.md](docs/install/README.md)
|
||||
- **VMs** → [docs/vm/README.md](docs/vm/README.md)
|
||||
- **Tools** → [docs/tools/README.md](docs/tools/README.md)
|
||||
4. 💻 Create your feature branch and contribute!
|
||||
|
||||
---
|
||||
|
||||
## Questions?
|
||||
|
||||
- **Fork Setup Issues?** → See [Troubleshooting](#troubleshooting) above
|
||||
- **How to Contribute?** → [docs/CONTRIBUTION_GUIDE.md](docs/CONTRIBUTION_GUIDE.md)
|
||||
- **Git Workflows?** → `cat .git-setup-info`
|
||||
- **Project Structure?** → [docs/README.md](docs/README.md)
|
||||
|
||||
---
|
||||
|
||||
**Happy Contributing! 🚀**
|
||||
1053
docs/contribution/GUIDE.md
Normal file
1053
docs/contribution/GUIDE.md
Normal file
File diff suppressed because it is too large
Load Diff
341
docs/contribution/README.md
Normal file
341
docs/contribution/README.md
Normal file
@ -0,0 +1,341 @@
|
||||
# 🤝 Contributing to ProxmoxVE
|
||||
|
||||
Complete guide to contributing to the ProxmoxVE project - from your first fork to submitting your pull request.
|
||||
|
||||
---
|
||||
|
||||
## 📋 Table of Contents
|
||||
|
||||
- [Quick Start](#quick-start)
|
||||
- [Setting Up Your Fork](#setting-up-your-fork)
|
||||
- [Coding Standards](#coding-standards)
|
||||
- [Code Audit](#code-audit)
|
||||
- [Guides & Resources](#guides--resources)
|
||||
- [FAQ](#faq)
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Quick Start
|
||||
|
||||
### 60 Seconds to Contributing
|
||||
|
||||
```bash
|
||||
# 1. Fork on GitHub
|
||||
# Visit: https://github.com/community-scripts/ProxmoxVE → Fork (top right)
|
||||
|
||||
# 2. Clone your fork
|
||||
git clone https://github.com/YOUR_USERNAME/ProxmoxVE.git
|
||||
cd ProxmoxVE
|
||||
|
||||
# 3. Auto-configure your fork
|
||||
bash docs/contribution/setup-fork.sh
|
||||
|
||||
# 4. Create a feature branch
|
||||
git checkout -b feature/my-awesome-app
|
||||
|
||||
# 5. Read the guides
|
||||
cat docs/README.md # Documentation overview
|
||||
cat docs/ct/DETAILED_GUIDE.md # For container scripts
|
||||
cat docs/install/DETAILED_GUIDE.md # For install scripts
|
||||
|
||||
# 6. Create your contribution
|
||||
cp ct/example.sh ct/myapp.sh
|
||||
cp install/example-install.sh install/myapp-install.sh
|
||||
# ... edit files ...
|
||||
|
||||
# 7. Test and commit
|
||||
bash ct/myapp.sh
|
||||
git add ct/myapp.sh install/myapp-install.sh
|
||||
git commit -m "feat: add MyApp"
|
||||
git push origin feature/my-awesome-app
|
||||
|
||||
# 8. Create Pull Request on GitHub
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🍴 Setting Up Your Fork
|
||||
|
||||
### Automatic Setup (Recommended)
|
||||
|
||||
When you clone your fork, run the setup script to automatically configure everything:
|
||||
|
||||
```bash
|
||||
bash docs/contribution/setup-fork.sh
|
||||
```
|
||||
|
||||
This will:
|
||||
- Auto-detect your GitHub username
|
||||
- Update all documentation links to point to your fork
|
||||
- Create `.git-setup-info` with recommended git workflows
|
||||
|
||||
**See**: [FORK_SETUP.md](FORK_SETUP.md) for detailed instructions
|
||||
|
||||
### Manual Setup
|
||||
|
||||
If the script doesn't work, manually configure:
|
||||
|
||||
```bash
|
||||
# Set git user
|
||||
git config user.name "Your Name"
|
||||
git config user.email "your.email@example.com"
|
||||
|
||||
# Add upstream remote for syncing
|
||||
git remote add upstream https://github.com/community-scripts/ProxmoxVE.git
|
||||
|
||||
# Verify remotes
|
||||
git remote -v
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📖 Coding Standards
|
||||
|
||||
All scripts and configurations must follow our coding standards to ensure consistency and quality.
|
||||
|
||||
### Available Guides
|
||||
|
||||
- **[CONTRIBUTING.md](CONTRIBUTING.md)** - Essential coding standards and best practices
|
||||
- **[CODE_AUDIT.md](CODE_AUDIT.md)** - Code review checklist and audit procedures
|
||||
- **Container Scripts** - `/ct/` templates and guidelines
|
||||
- **Install Scripts** - `/install/` templates and guidelines
|
||||
- **JSON Configurations** - `/json/` structure and format
|
||||
|
||||
### Quick Checklist
|
||||
|
||||
- ✅ Use `/ct/example.sh` as template for container scripts
|
||||
- ✅ Use `/install/example-install.sh` as template for install scripts
|
||||
- ✅ Follow naming conventions: `appname.sh` and `appname-install.sh`
|
||||
- ✅ Include proper shebang: `#!/usr/bin/env bash`
|
||||
- ✅ Add copyright header with author
|
||||
- ✅ Handle errors properly with `msg_error`, `msg_ok`, etc.
|
||||
- ✅ Test before submitting PR
|
||||
- ✅ Update documentation if needed
|
||||
|
||||
---
|
||||
|
||||
## 🔍 Code Audit
|
||||
|
||||
Before submitting a pull request, ensure your code passes our audit:
|
||||
|
||||
**See**: [CODE_AUDIT.md](CODE_AUDIT.md) for complete audit checklist
|
||||
|
||||
Key points:
|
||||
- Code consistency with existing scripts
|
||||
- Proper error handling
|
||||
- Correct variable naming
|
||||
- Adequate comments and documentation
|
||||
- Security best practices
|
||||
|
||||
---
|
||||
|
||||
## 📚 Guides & Resources
|
||||
|
||||
### Documentation
|
||||
|
||||
- **[docs/README.md](../README.md)** - Main documentation hub
|
||||
- **[docs/ct/README.md](../ct/README.md)** - Container scripts overview
|
||||
- **[docs/install/README.md](../install/README.md)** - Installation scripts overview
|
||||
- **[docs/ct/DETAILED_GUIDE.md](../ct/DETAILED_GUIDE.md)** - Complete ct/ script reference
|
||||
- **[docs/install/DETAILED_GUIDE.md](../install/DETAILED_GUIDE.md)** - Complete install/ script reference
|
||||
- **[docs/TECHNICAL_REFERENCE.md](../TECHNICAL_REFERENCE.md)** - Architecture deep-dive
|
||||
- **[docs/EXIT_CODES.md](../EXIT_CODES.md)** - Exit codes reference
|
||||
- **[docs/DEV_MODE.md](../DEV_MODE.md)** - Debugging guide
|
||||
|
||||
### Community Guides
|
||||
|
||||
See [USER_SUBMITTED_GUIDES.md](USER_SUBMITTED_GUIDES.md) for excellent community-written guides:
|
||||
- Home Assistant installation and configuration
|
||||
- Frigate setup on Proxmox
|
||||
- Docker and Portainer installation
|
||||
- Database setup and optimization
|
||||
- And many more!
|
||||
|
||||
### Templates
|
||||
|
||||
Use these templates when creating new scripts:
|
||||
|
||||
```bash
|
||||
# Container script
|
||||
cp ct/example.sh ct/my-app.sh
|
||||
|
||||
# Installation script
|
||||
cp install/example-install.sh install/my-app-install.sh
|
||||
|
||||
# JSON configuration (if needed)
|
||||
cp json/example.json json/my-app.json
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Git Workflow
|
||||
|
||||
### Keep Your Fork Updated
|
||||
|
||||
```bash
|
||||
# Fetch latest from upstream
|
||||
git fetch upstream
|
||||
|
||||
# Rebase your work on latest main
|
||||
git rebase upstream/main
|
||||
|
||||
# Push to your fork
|
||||
git push -f origin main
|
||||
```
|
||||
|
||||
### Create Feature Branch
|
||||
|
||||
```bash
|
||||
# Create and switch to new branch
|
||||
git checkout -b feature/my-feature
|
||||
|
||||
# Make changes...
|
||||
git add .
|
||||
git commit -m "feat: description of changes"
|
||||
|
||||
# Push to your fork
|
||||
git push origin feature/my-feature
|
||||
|
||||
# Create Pull Request on GitHub
|
||||
```
|
||||
|
||||
### Before Submitting PR
|
||||
|
||||
1. **Sync with upstream**
|
||||
```bash
|
||||
git fetch upstream
|
||||
git rebase upstream/main
|
||||
```
|
||||
|
||||
2. **Test your changes**
|
||||
```bash
|
||||
bash ct/my-app.sh
|
||||
# Follow prompts and test the container
|
||||
```
|
||||
|
||||
3. **Check code standards**
|
||||
- [ ] Follows template structure
|
||||
- [ ] Proper error handling
|
||||
- [ ] Documentation updated (if needed)
|
||||
- [ ] No hardcoded values
|
||||
- [ ] Version tracking implemented
|
||||
|
||||
4. **Push final changes**
|
||||
```bash
|
||||
git push origin feature/my-feature
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📋 Pull Request Checklist
|
||||
|
||||
Before opening a PR:
|
||||
|
||||
- [ ] Code follows coding standards (see CONTRIBUTING.md)
|
||||
- [ ] All templates used correctly
|
||||
- [ ] Tested on Proxmox VE
|
||||
- [ ] Error handling implemented
|
||||
- [ ] Documentation updated (if applicable)
|
||||
- [ ] No merge conflicts
|
||||
- [ ] Synced with upstream/main
|
||||
- [ ] Clear PR title and description
|
||||
|
||||
---
|
||||
|
||||
## ❓ FAQ
|
||||
|
||||
### How do I test my changes?
|
||||
|
||||
```bash
|
||||
# For container scripts
|
||||
bash ct/my-app.sh
|
||||
|
||||
# For install scripts (runs inside container)
|
||||
# The ct script will call it automatically
|
||||
|
||||
# For advanced debugging
|
||||
VERBOSE=yes bash ct/my-app.sh
|
||||
```
|
||||
|
||||
### What if my PR has conflicts?
|
||||
|
||||
```bash
|
||||
# Sync with upstream
|
||||
git fetch upstream
|
||||
git rebase upstream/main
|
||||
|
||||
# Resolve conflicts in your editor
|
||||
git add .
|
||||
git rebase --continue
|
||||
git push -f origin your-branch
|
||||
```
|
||||
|
||||
### How do I keep my fork updated?
|
||||
|
||||
See "Keep Your Fork Updated" section above, or run:
|
||||
|
||||
```bash
|
||||
bash docs/contribution/setup-fork.sh
|
||||
```
|
||||
|
||||
### Where do I ask questions?
|
||||
|
||||
- **GitHub Issues**: For bugs and feature requests
|
||||
- **GitHub Discussions**: For general questions
|
||||
- **Discord**: Community-scripts server
|
||||
|
||||
---
|
||||
|
||||
## 🎓 Learning Resources
|
||||
|
||||
### For First-Time Contributors
|
||||
|
||||
1. Read: [docs/README.md](../README.md) - Documentation overview
|
||||
2. Read: [docs/contribution/FORK_SETUP.md](FORK_SETUP.md) - Fork setup guide
|
||||
3. Choose your path:
|
||||
- Containers → [docs/ct/DETAILED_GUIDE.md](../ct/DETAILED_GUIDE.md)
|
||||
- Installation → [docs/install/DETAILED_GUIDE.md](../install/DETAILED_GUIDE.md)
|
||||
4. Study existing scripts in same category
|
||||
5. Create your contribution
|
||||
|
||||
### For Experienced Developers
|
||||
|
||||
1. Review [CONTRIBUTING.md](CONTRIBUTING.md) - Coding standards
|
||||
2. Review [CODE_AUDIT.md](CODE_AUDIT.md) - Audit checklist
|
||||
3. Check templates in `/ct/` and `/install/`
|
||||
4. Submit PR with confidence
|
||||
|
||||
### For Reviewers/Maintainers
|
||||
|
||||
1. Use [CODE_AUDIT.md](CODE_AUDIT.md) as review guide
|
||||
2. Reference [docs/TECHNICAL_REFERENCE.md](../TECHNICAL_REFERENCE.md) for architecture
|
||||
3. Check [docs/EXIT_CODES.md](../EXIT_CODES.md) for error handling
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Ready to Contribute?
|
||||
|
||||
1. **Fork** the repository
|
||||
2. **Clone** your fork and **setup** with `bash docs/contribution/setup-fork.sh`
|
||||
3. **Choose** your contribution type (container, installation, tools, etc.)
|
||||
4. **Read** the appropriate detailed guide
|
||||
5. **Create** your feature branch
|
||||
6. **Develop** and **test** your changes
|
||||
7. **Commit** with clear messages
|
||||
8. **Push** to your fork
|
||||
9. **Create** Pull Request
|
||||
|
||||
---
|
||||
|
||||
## 📞 Contact & Support
|
||||
|
||||
- **GitHub**: https://github.com/community-scripts/ProxmoxVE
|
||||
- **Issues**: https://github.com/community-scripts/ProxmoxVE/issues
|
||||
- **Discussions**: https://github.com/community-scripts/ProxmoxVE/discussions
|
||||
- **Discord**: [Join Server](https://discord.gg/UHrpNWGwkH)
|
||||
|
||||
---
|
||||
|
||||
**Thank you for contributing to ProxmoxVE!** 🙏
|
||||
|
||||
Your efforts help make Proxmox VE automation accessible to everyone. Happy coding! 🚀
|
||||
313
docs/contribution/setup-fork.sh
Normal file
313
docs/contribution/setup-fork.sh
Normal file
@ -0,0 +1,313 @@
|
||||
#!/bin/bash
|
||||
|
||||
################################################################################
|
||||
# ProxmoxVE Fork Setup Script
|
||||
#
|
||||
# Automatically configures documentation and scripts for your fork
|
||||
# Detects your GitHub username and repository from git config
|
||||
# Updates all hardcoded links to point to your fork
|
||||
#
|
||||
# Usage:
|
||||
# ./setup-fork.sh # Auto-detect from git config
|
||||
# ./setup-fork.sh YOUR_USERNAME # Specify username
|
||||
# ./setup-fork.sh YOUR_USERNAME REPO_NAME # Specify both
|
||||
#
|
||||
# Examples:
|
||||
# ./setup-fork.sh john # Uses john/ProxmoxVE
|
||||
# ./setup-fork.sh john my-fork # Uses john/my-fork
|
||||
################################################################################
|
||||
|
||||
set -e
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Default values
|
||||
REPO_NAME="ProxmoxVE"
|
||||
USERNAME=""
|
||||
AUTO_DETECT=true
|
||||
|
||||
################################################################################
|
||||
# FUNCTIONS
|
||||
################################################################################
|
||||
|
||||
print_header() {
|
||||
echo -e "\n${BLUE}╔════════════════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${BLUE}║${NC} ProxmoxVE Fork Setup Script"
|
||||
echo -e "${BLUE}║${NC} Configuring for your fork..."
|
||||
echo -e "${BLUE}╚════════════════════════════════════════════════════════════╝${NC}\n"
|
||||
}
|
||||
|
||||
print_info() {
|
||||
echo -e "${BLUE}ℹ${NC} $1"
|
||||
}
|
||||
|
||||
print_success() {
|
||||
echo -e "${GREEN}✓${NC} $1"
|
||||
}
|
||||
|
||||
print_warning() {
|
||||
echo -e "${YELLOW}⚠${NC} $1"
|
||||
}
|
||||
|
||||
print_error() {
|
||||
echo -e "${RED}✗${NC} $1"
|
||||
}
|
||||
|
||||
# Detect username from git remote
|
||||
detect_username() {
|
||||
local remote_url
|
||||
|
||||
# Try to get from origin
|
||||
if ! remote_url=$(git config --get remote.origin.url 2>/dev/null); then
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Extract username from SSH or HTTPS URL
|
||||
if [[ $remote_url =~ git@github.com:([^/]+) ]]; then
|
||||
echo "${BASH_REMATCH[1]}"
|
||||
elif [[ $remote_url =~ github.com/([^/]+) ]]; then
|
||||
echo "${BASH_REMATCH[1]}"
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Detect repo name from git remote
|
||||
detect_repo_name() {
|
||||
local remote_url
|
||||
|
||||
if ! remote_url=$(git config --get remote.origin.url 2>/dev/null); then
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Extract repo name (remove .git if present)
|
||||
if [[ $remote_url =~ /([^/]+?)(.git)?$ ]]; then
|
||||
local repo="${BASH_REMATCH[1]}"
|
||||
echo "${repo%.git}"
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Ask user for confirmation
|
||||
confirm() {
|
||||
local prompt="$1"
|
||||
local response
|
||||
|
||||
read -p "$(echo -e ${YELLOW})$prompt (y/n)${NC} " -r response
|
||||
[[ $response =~ ^[Yy]$ ]]
|
||||
}
|
||||
|
||||
# Update links in files
|
||||
update_links() {
|
||||
local old_repo="community-scripts"
|
||||
local old_name="ProxmoxVE"
|
||||
local new_owner="$1"
|
||||
local new_repo="$2"
|
||||
local files_updated=0
|
||||
|
||||
print_info "Scanning for hardcoded links..."
|
||||
|
||||
# Find all markdown and shell files
|
||||
local -a files_to_update=(
|
||||
"docs/DEFAULTS_SYSTEM_GUIDE.md"
|
||||
"docs/alpine-install.func.md"
|
||||
"docs/install.func.md"
|
||||
"docs/APP-install.md"
|
||||
"docs/APP-ct.md"
|
||||
"docs/CONTRIBUTION_GUIDE.md"
|
||||
"docs/INDEX.md"
|
||||
"docs/README.md"
|
||||
"docs/EXIT_CODES.md"
|
||||
"docs/api/README.md"
|
||||
)
|
||||
|
||||
echo ""
|
||||
|
||||
for file in "${files_to_update[@]}"; do
|
||||
if [[ -f "$file" ]]; then
|
||||
# Count occurrences
|
||||
local count=$(grep -c "github.com/$old_repo/$old_name" "$file" 2>/dev/null || echo 0)
|
||||
|
||||
if [[ $count -gt 0 ]]; then
|
||||
# Backup original
|
||||
cp "$file" "$file.backup"
|
||||
|
||||
# Replace links
|
||||
sed -i "s|github.com/$old_repo/$old_name|github.com/$new_owner/$new_repo|g" "$file"
|
||||
|
||||
((files_updated++))
|
||||
print_success "Updated $file ($count links)"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
return $files_updated
|
||||
}
|
||||
|
||||
# Create user git config setup info
|
||||
create_git_setup_info() {
|
||||
local username="$1"
|
||||
|
||||
cat >.git-setup-info <<'EOF'
|
||||
# Git Configuration for ProxmoxVE Development
|
||||
|
||||
## Recommended Git Configuration
|
||||
|
||||
### Set up remotes for easy syncing with upstream:
|
||||
|
||||
```bash
|
||||
# View your current remotes
|
||||
git remote -v
|
||||
|
||||
# If you don't have 'upstream' configured, add it:
|
||||
git remote add upstream https://github.com/community-scripts/ProxmoxVE.git
|
||||
|
||||
# Verify both remotes exist:
|
||||
git remote -v
|
||||
# Should show:
|
||||
# origin https://github.com/YOUR_USERNAME/ProxmoxVE.git (fetch)
|
||||
# origin https://github.com/YOUR_USERNAME/ProxmoxVE.git (push)
|
||||
# upstream https://github.com/community-scripts/ProxmoxVE.git (fetch)
|
||||
# upstream https://github.com/community-scripts/ProxmoxVE.git (push)
|
||||
```
|
||||
|
||||
### Configure Git User (if not done globally)
|
||||
|
||||
```bash
|
||||
git config user.name "Your Name"
|
||||
git config user.email "your.email@example.com"
|
||||
|
||||
# Or configure globally:
|
||||
git config --global user.name "Your Name"
|
||||
git config --global user.email "your.email@example.com"
|
||||
```
|
||||
|
||||
### Useful Git Workflows
|
||||
|
||||
**Keep your fork up-to-date:**
|
||||
```bash
|
||||
git fetch upstream
|
||||
git rebase upstream/main
|
||||
git push origin main
|
||||
```
|
||||
|
||||
**Create feature branch:**
|
||||
```bash
|
||||
git checkout -b feature/my-awesome-app
|
||||
# Make changes...
|
||||
git commit -m "feat: add my awesome app"
|
||||
git push origin feature/my-awesome-app
|
||||
```
|
||||
|
||||
**Pull latest from upstream:**
|
||||
```bash
|
||||
git fetch upstream
|
||||
git merge upstream/main
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
For more help, see: docs/CONTRIBUTION_GUIDE.md
|
||||
EOF
|
||||
|
||||
print_success "Created .git-setup-info file"
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# MAIN LOGIC
|
||||
################################################################################
|
||||
|
||||
print_header
|
||||
|
||||
# Parse command line arguments
|
||||
if [[ $# -gt 0 ]]; then
|
||||
USERNAME="$1"
|
||||
AUTO_DETECT=false
|
||||
|
||||
if [[ $# -gt 1 ]]; then
|
||||
REPO_NAME="$2"
|
||||
fi
|
||||
else
|
||||
# Try auto-detection
|
||||
if username=$(detect_username); then
|
||||
USERNAME="$username"
|
||||
print_success "Detected GitHub username: $USERNAME"
|
||||
else
|
||||
print_error "Could not auto-detect GitHub username from git config"
|
||||
echo -e "${YELLOW}Please run:${NC}"
|
||||
echo " ./setup-fork.sh YOUR_USERNAME"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if repo_name=$(detect_repo_name); then
|
||||
REPO_NAME="$repo_name"
|
||||
if [[ "$REPO_NAME" != "ProxmoxVE" ]]; then
|
||||
print_info "Detected custom repo name: $REPO_NAME"
|
||||
else
|
||||
print_success "Using default repo name: ProxmoxVE"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# Validate inputs
|
||||
if [[ -z "$USERNAME" ]]; then
|
||||
print_error "Username cannot be empty"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ -z "$REPO_NAME" ]]; then
|
||||
print_error "Repository name cannot be empty"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Show what we'll do
|
||||
echo -e "${BLUE}Configuration Summary:${NC}"
|
||||
echo " Repository URL: https://github.com/$USERNAME/$REPO_NAME"
|
||||
echo " Files to update: 10 files with documentation"
|
||||
echo ""
|
||||
|
||||
# Ask for confirmation
|
||||
if ! confirm "Apply these changes?"; then
|
||||
print_warning "Setup cancelled"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# Update all links
|
||||
if update_links "$USERNAME" "$REPO_NAME"; then
|
||||
links_changed=$?
|
||||
print_success "Updated $links_changed files"
|
||||
else
|
||||
print_warning "No links needed updating or some files not found"
|
||||
fi
|
||||
|
||||
# Create git setup info file
|
||||
create_git_setup_info "$USERNAME"
|
||||
|
||||
# Final summary
|
||||
echo ""
|
||||
echo -e "${GREEN}╔════════════════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${GREEN}║${NC} Fork Setup Complete! ${GREEN}║${NC}"
|
||||
echo -e "${GREEN}╚════════════════════════════════════════════════════════════╝${NC}"
|
||||
echo ""
|
||||
|
||||
print_success "All documentation links updated to point to your fork"
|
||||
print_info "Your fork: https://github.com/$USERNAME/$REPO_NAME"
|
||||
print_info "Upstream: https://github.com/community-scripts/ProxmoxVE"
|
||||
echo ""
|
||||
|
||||
echo -e "${BLUE}Next Steps:${NC}"
|
||||
echo " 1. Review the changes: git diff"
|
||||
echo " 2. Check .git-setup-info for recommended git workflow"
|
||||
echo " 3. Start developing: git checkout -b feature/my-app"
|
||||
echo " 4. Read: docs/CONTRIBUTION_GUIDE.md"
|
||||
echo ""
|
||||
|
||||
print_success "Happy contributing! 🚀"
|
||||
@ -40,7 +40,7 @@
|
||||
- Import the build.func file.
|
||||
- When developing your own script, change the URL to your own repository.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> [!IMPORTANT]
|
||||
> You also need to change all apperances of this URL in `misc/build.func` and `misc/install.func`
|
||||
|
||||
Example for development:
|
||||
@ -52,7 +52,7 @@ source <(curl -s https://raw.githubusercontent.com/[USER]/[REPO]/refs/heads/[BRA
|
||||
Final script:
|
||||
|
||||
```bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
```
|
||||
|
||||
> [!CAUTION]
|
||||
@ -75,7 +75,6 @@ Example:
|
||||
>
|
||||
> - 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)
|
||||
|
||||
---
|
||||
|
||||
@ -96,7 +95,7 @@ Example:
|
||||
>| 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_tags` | Proxmox display tags without Spaces, only ; | Limit the number |
|
||||
>| `var_cpu` | CPU cores | Number of cores |
|
||||
>| `var_ram` | RAM | In MB |
|
||||
>| `var_disk` | Disk capacity | In GB |
|
||||
@ -108,13 +107,13 @@ 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}"
|
||||
var_tags="asset-management;foss"
|
||||
var_cpu="2"
|
||||
var_ram="2048"
|
||||
var_disk="4"
|
||||
var_os="debian"
|
||||
var_version="12"
|
||||
var_unprivileged="1"
|
||||
```
|
||||
|
||||
## 2.2 **📋 App output & base settings**
|
||||
@ -190,7 +189,7 @@ Example with a Github Release:
|
||||
Example:
|
||||
|
||||
```bash
|
||||
wget -q
|
||||
curl -fsSL
|
||||
unzip -q
|
||||
```
|
||||
|
||||
@ -199,8 +198,8 @@ unzip -q
|
||||
Example:
|
||||
|
||||
```bash
|
||||
$STD php artisan migrate --force
|
||||
$STD php artisan config:clear
|
||||
$STD php artisan migrate --force
|
||||
$STD php artisan config:clear
|
||||
```
|
||||
|
||||
### 3.5 **Backups**
|
||||
86
docs/contribution/templates_ct/AppName.sh
Normal file
86
docs/contribution/templates_ct/AppName.sh
Normal file
@ -0,0 +1,86 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -s 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
|
||||
APP="[APP_NAME]"
|
||||
# Name of the app (e.g. Google, Adventurelog, Apache-Guacamole"
|
||||
var_tags="[TAGS]"
|
||||
# Tags for Proxmox VE, maximum 2 pcs., no spaces allowed, separated by a semicolon ; (e.g. database | adblock;dhcp)
|
||||
var_cpu="[CPU]"
|
||||
# Number of cores (1-X) (e.g. 4) - default are 2
|
||||
var_ram="[RAM]"
|
||||
# Amount of used RAM in MB (e.g. 2048 or 4096)
|
||||
var_disk="[DISK]"
|
||||
# Amount of used disk space in GB (e.g. 4 or 10)
|
||||
var_os="[OS]"
|
||||
# Default OS (e.g. debian, ubuntu, alpine)
|
||||
var_version="[VERSION]"
|
||||
# Default OS version (e.g. 12 for debian, 24.04 for ubuntu, 3.20 for alpine)
|
||||
var_unprivileged="[UNPRIVILEGED]"
|
||||
# 1 = unprivileged container, 0 = privileged container
|
||||
|
||||
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}"
|
||||
@ -67,7 +67,6 @@ Example:
|
||||
>
|
||||
> - 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**
|
||||
|
||||
@ -111,9 +110,12 @@ Example:
|
||||
|
||||
```bash
|
||||
$STD apt-get install -y \
|
||||
curl \
|
||||
composer \
|
||||
git \
|
||||
nginx
|
||||
sudo \
|
||||
mc \
|
||||
nginx
|
||||
```
|
||||
|
||||
### 3.2 **Collapse dependencies**
|
||||
@ -152,7 +154,7 @@ 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"
|
||||
curl -fsSL "https://github.com/snipe/snipe-it/archive/refs/tags/v${RELEASE}.zip"
|
||||
```
|
||||
|
||||
### 5.2 **Save the version for update checks**
|
||||
@ -163,7 +165,7 @@ curl -fsSL "https://github.com/snipe/snipe-it/archive/refs/tags/v${RELEASE}.zip"
|
||||
Example:
|
||||
|
||||
```bash
|
||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
|
||||
echo "${RELEASE}" >"/opt/AppName_version.txt"
|
||||
```
|
||||
|
||||
---
|
||||
@ -175,7 +177,6 @@ echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
|
||||
- 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:
|
||||
|
||||
@ -183,8 +184,6 @@ Example:
|
||||
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**
|
||||
@ -193,7 +192,7 @@ read -p "${TAB3}Do you wish to enable HTTPS mode? (y/N): " httpschoice
|
||||
Example:
|
||||
|
||||
```bash
|
||||
wget -q
|
||||
curl -fsSL
|
||||
unzip -q
|
||||
```
|
||||
|
||||
@ -14,9 +14,12 @@ setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
# Installing Dependencies
|
||||
# Installing Dependencies with the 3 core dependencies (curl;sudo;mc)
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt-get install -y \
|
||||
curl \
|
||||
sudo \
|
||||
mc \
|
||||
[PACKAGE_1] \
|
||||
[PACKAGE_2] \
|
||||
[PACKAGE_3]
|
||||
@ -35,24 +38,26 @@ $STD mysql -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH
|
||||
echo "Database User: $DB_USER"
|
||||
echo "Database Password: $DB_PASS"
|
||||
echo "Database Name: $DB_NAME"
|
||||
} >>~/"$APP_NAME".creds
|
||||
} >>~/$APP_NAME.creds
|
||||
msg_ok "Set up Database"
|
||||
|
||||
# Temp
|
||||
|
||||
# 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}"
|
||||
RELEASE=$(curl -s https://api.github.com/repos/[REPO]/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
|
||||
curl -fsSL "https://github.com/[REPO]/archive/refs/tags/${RELEASE}.zip"
|
||||
unzip -q ${RELEASE}.zip
|
||||
mv ${APPLICATION}-${RELEASE}/ /opt/${APPLICATION}
|
||||
#
|
||||
#
|
||||
#
|
||||
echo "${RELEASE}" >/opt/"${APPLICATION}"_version.txt
|
||||
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
|
||||
cat <<EOF >/etc/systemd/system/${APPLICATION}.service
|
||||
[Unit]
|
||||
Description=${APPLICATION} Service
|
||||
After=network.target
|
||||
@ -64,7 +69,7 @@ Restart=always
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now "${APPLICATION}"
|
||||
systemctl enable -q --now ${APPLICATION}.service
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
@ -72,7 +77,7 @@ customize
|
||||
|
||||
# Cleanup
|
||||
msg_info "Cleaning up"
|
||||
rm -f "${RELEASE}".zip
|
||||
rm -f ${RELEASE}.zip
|
||||
$STD apt-get -y autoremove
|
||||
$STD apt-get -y autoclean
|
||||
msg_ok "Cleaned"
|
||||
472
docs/ct/DETAILED_GUIDE.md
Normal file
472
docs/ct/DETAILED_GUIDE.md
Normal file
@ -0,0 +1,472 @@
|
||||
# 🚀 **Application Container Scripts (ct/AppName.sh)**
|
||||
|
||||
**Modern Guide to Creating LXC Container Installation Scripts**
|
||||
|
||||
> **Updated**: December 2025
|
||||
> **Context**: Fully integrated with build.func, advanced_settings wizard, and defaults system
|
||||
> **Example Used**: `/ct/pihole.sh`, `/ct/docker.sh`
|
||||
|
||||
---
|
||||
|
||||
## 📋 Table of Contents
|
||||
|
||||
- [Overview](#overview)
|
||||
- [Architecture & Flow](#architecture--flow)
|
||||
- [File Structure](#file-structure)
|
||||
- [Complete Script Template](#complete-script-template)
|
||||
- [Function Reference](#function-reference)
|
||||
- [Advanced Features](#advanced-features)
|
||||
- [Real Examples](#real-examples)
|
||||
- [Troubleshooting](#troubleshooting)
|
||||
- [Contribution Checklist](#contribution-checklist)
|
||||
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
### Purpose
|
||||
|
||||
Container scripts (`ct/AppName.sh`) are **entry points for creating LXC containers** with specific applications pre-installed. They:
|
||||
|
||||
1. Define container defaults (CPU, RAM, disk, OS)
|
||||
2. Call the main build orchestrator (`build.func`)
|
||||
3. Implement application-specific update mechanisms
|
||||
4. Provide user-facing success messages
|
||||
|
||||
### Execution Context
|
||||
|
||||
```
|
||||
Proxmox Host
|
||||
↓
|
||||
ct/AppName.sh sourced (runs as root on host)
|
||||
↓
|
||||
build.func: Creates LXC container + runs install script inside
|
||||
↓
|
||||
install/AppName-install.sh (runs inside container)
|
||||
↓
|
||||
Container ready with app installed
|
||||
```
|
||||
|
||||
### Key Integration Points
|
||||
|
||||
- **build.func** - Main orchestrator (container creation, storage, variable management)
|
||||
- **install.func** - Container-specific setup (OS update, package management)
|
||||
- **tools.func** - Tool installation helpers (repositories, GitHub releases)
|
||||
- **core.func** - UI/messaging functions (colors, spinners, validation)
|
||||
- **error_handler.func** - Error handling and signal management
|
||||
|
||||
---
|
||||
|
||||
## Architecture & Flow
|
||||
|
||||
### Container Creation Flow
|
||||
|
||||
```
|
||||
START: bash ct/pihole.sh
|
||||
↓
|
||||
[1] Set APP, var_*, defaults
|
||||
↓
|
||||
[2] header_info() → Display ASCII art
|
||||
↓
|
||||
[3] variables() → Parse arguments & load build.func
|
||||
↓
|
||||
[4] color() → Setup ANSI codes
|
||||
↓
|
||||
[5] catch_errors() → Setup trap handlers
|
||||
↓
|
||||
[6] install_script() → Show mode menu (5 options)
|
||||
↓
|
||||
├─ INSTALL_MODE="0" (Default)
|
||||
├─ INSTALL_MODE="1" (Advanced - 19-step wizard)
|
||||
├─ INSTALL_MODE="2" (User Defaults)
|
||||
├─ INSTALL_MODE="3" (App Defaults)
|
||||
└─ INSTALL_MODE="4" (Settings Menu)
|
||||
↓
|
||||
[7] advanced_settings() → Collect user configuration (if mode=1)
|
||||
↓
|
||||
[8] start() → Confirm or re-edit settings
|
||||
↓
|
||||
[9] build_container() → Create LXC + execute install script
|
||||
↓
|
||||
[10] description() → Set container description
|
||||
↓
|
||||
[11] SUCCESS → Display access URL
|
||||
↓
|
||||
END
|
||||
```
|
||||
|
||||
### Default Values Precedence
|
||||
|
||||
```
|
||||
Priority 1 (Highest): Environment Variables (var_cpu, var_ram, etc.)
|
||||
Priority 2: App-Specific Defaults (/defaults/AppName.vars)
|
||||
Priority 3: User Global Defaults (/default.vars)
|
||||
Priority 4 (Lowest): Built-in Defaults (in build.func)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## File Structure
|
||||
|
||||
### Minimal ct/AppName.sh Template
|
||||
|
||||
```
|
||||
#!/usr/bin/env bash # [1] Shebang
|
||||
# [2] Copyright/License
|
||||
source <(curl -s .../misc/build.func) # [3] Import functions
|
||||
# [4] APP metadata
|
||||
APP="AppName" # [5] Default values
|
||||
var_tags="tag1;tag2"
|
||||
var_cpu="2"
|
||||
var_ram="2048"
|
||||
...
|
||||
|
||||
header_info "$APP" # [6] Display header
|
||||
variables # [7] Process arguments
|
||||
color # [8] Setup colors
|
||||
catch_errors # [9] Setup error handling
|
||||
|
||||
function update_script() { ... } # [10] Update function (optional)
|
||||
|
||||
start # [11] Launch container creation
|
||||
build_container
|
||||
description
|
||||
msg_ok "Completed Successfully!\n"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Complete Script Template
|
||||
|
||||
### 1. File Header & Imports
|
||||
|
||||
```bash
|
||||
#!/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: https://github.com/example/project
|
||||
|
||||
# Import main orchestrator
|
||||
source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/misc/build.func)
|
||||
```
|
||||
|
||||
> **⚠️ IMPORTANT**: Before opening a PR, change URL to `community-scripts` repo!
|
||||
|
||||
### 2. Application Metadata
|
||||
|
||||
```bash
|
||||
# Application Configuration
|
||||
APP="ApplicationName"
|
||||
var_tags="tag1;tag2;tag3" # Max 3-4 tags, no spaces, semicolon-separated
|
||||
|
||||
# Container Resources
|
||||
var_cpu="2" # CPU cores
|
||||
var_ram="2048" # RAM in MB
|
||||
var_disk="10" # Disk in GB
|
||||
|
||||
# Container Type & OS
|
||||
var_os="debian" # Options: alpine, debian, ubuntu
|
||||
var_version="12" # Alpine: 3.20+, Debian: 11-13, Ubuntu: 20.04+
|
||||
var_unprivileged="1" # 1=unprivileged (secure), 0=privileged (rarely needed)
|
||||
```
|
||||
|
||||
**Variable Naming Convention**:
|
||||
- Variables exposed to user: `var_*` (e.g., `var_cpu`, `var_hostname`, `var_ssh`)
|
||||
- Internal variables: lowercase (e.g., `container_id`, `app_version`)
|
||||
|
||||
### 3. Display & Initialization
|
||||
|
||||
```bash
|
||||
# Display header ASCII art
|
||||
header_info "$APP"
|
||||
|
||||
# Process command-line arguments and load configuration
|
||||
variables
|
||||
|
||||
# Setup ANSI color codes and formatting
|
||||
color
|
||||
|
||||
# Initialize error handling (trap ERR, EXIT, INT, TERM)
|
||||
catch_errors
|
||||
```
|
||||
|
||||
### 4. Update Function (Highly Recommended)
|
||||
|
||||
```bash
|
||||
function update_script() {
|
||||
header_info
|
||||
|
||||
# Always start with these checks
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
# Verify app is installed
|
||||
if [[ ! -d /opt/appname ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
# Get latest version from GitHub
|
||||
RELEASE=$(curl -fsSL https://api.github.com/repos/user/repo/releases/latest | \
|
||||
grep "tag_name" | awk '{print substr($2, 2, length($2)-3)}')
|
||||
|
||||
# Compare with saved version
|
||||
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
|
||||
msg_info "Updating ${APP} to v${RELEASE}"
|
||||
|
||||
# Backup user data
|
||||
cp -r /opt/appname /opt/appname-backup
|
||||
|
||||
# Perform update
|
||||
cd /opt
|
||||
wget -q "https://github.com/user/repo/releases/download/v${RELEASE}/app-${RELEASE}.tar.gz"
|
||||
tar -xzf app-${RELEASE}.tar.gz
|
||||
|
||||
# Restore user data
|
||||
cp /opt/appname-backup/config/* /opt/appname/config/
|
||||
|
||||
# Cleanup
|
||||
rm -rf app-${RELEASE}.tar.gz /opt/appname-backup
|
||||
|
||||
# Save new version
|
||||
echo "${RELEASE}" > /opt/${APP}_version.txt
|
||||
|
||||
msg_ok "Updated ${APP} to v${RELEASE}"
|
||||
else
|
||||
msg_ok "No update required. ${APP} is already at v${RELEASE}."
|
||||
fi
|
||||
|
||||
exit
|
||||
}
|
||||
```
|
||||
|
||||
### 5. Script Launch
|
||||
|
||||
```bash
|
||||
# Start the container creation workflow
|
||||
start
|
||||
|
||||
# Build the container with selected configuration
|
||||
build_container
|
||||
|
||||
# Set container description/notes in Proxmox UI
|
||||
description
|
||||
|
||||
# Display success message
|
||||
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}"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Function Reference
|
||||
|
||||
### Core Functions (From build.func)
|
||||
|
||||
#### `variables()`
|
||||
|
||||
**Purpose**: Initialize container variables, load user arguments, setup orchestration
|
||||
|
||||
**Triggered by**: Called automatically at script start
|
||||
|
||||
**Behavior**:
|
||||
1. Parse command-line arguments (if any)
|
||||
2. Generate random UUID for session tracking
|
||||
3. Load container storage from Proxmox
|
||||
4. Initialize application-specific defaults
|
||||
5. Setup SSH/environment configuration
|
||||
|
||||
#### `start()`
|
||||
|
||||
**Purpose**: Launch the container creation menu with 5 installation modes
|
||||
|
||||
**Menu Options**:
|
||||
```
|
||||
1. Default Installation (Quick setup, predefined settings)
|
||||
2. Advanced Installation (19-step wizard with full control)
|
||||
3. User Defaults (Load ~/.community-scripts/default.vars)
|
||||
4. App Defaults (Load /defaults/AppName.vars)
|
||||
5. Settings Menu (Interactive mode selection)
|
||||
```
|
||||
|
||||
#### `build_container()`
|
||||
|
||||
**Purpose**: Main orchestrator for LXC container creation
|
||||
|
||||
**Operations**:
|
||||
1. Validates all variables
|
||||
2. Creates LXC container via `pct create`
|
||||
3. Executes `install/AppName-install.sh` inside container
|
||||
4. Monitors installation progress
|
||||
5. Handles errors and rollback on failure
|
||||
|
||||
#### `description()`
|
||||
|
||||
**Purpose**: Set container description/notes visible in Proxmox UI
|
||||
|
||||
---
|
||||
|
||||
## Advanced Features
|
||||
|
||||
### 1. Custom Configuration Menus
|
||||
|
||||
If your app has additional setup beyond standard vars:
|
||||
|
||||
```bash
|
||||
custom_app_settings() {
|
||||
CONFIGURE_DB=$(whiptail --title "Database Setup" \
|
||||
--yesno "Would you like to configure a custom database?" 8 60)
|
||||
|
||||
if [[ $? -eq 0 ]]; then
|
||||
DB_HOST=$(whiptail --inputbox "Database Host:" 8 60 3>&1 1>&2 2>&3)
|
||||
DB_PORT=$(whiptail --inputbox "Database Port:" 8 60 "3306" 3>&1 1>&2 2>&3)
|
||||
fi
|
||||
}
|
||||
|
||||
custom_app_settings
|
||||
```
|
||||
|
||||
### 2. Update Function Patterns
|
||||
|
||||
Save installed version for update checks
|
||||
|
||||
### 3. Health Check Functions
|
||||
|
||||
Add custom validation:
|
||||
|
||||
```bash
|
||||
function health_check() {
|
||||
header_info
|
||||
|
||||
if [[ ! -d /opt/appname ]]; then
|
||||
msg_error "Application not found!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! systemctl is-active --quiet appname; then
|
||||
msg_error "Application service not running"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
msg_ok "Health check passed"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Real Examples
|
||||
|
||||
### Example 1: Simple Web App (Debian-based)
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/misc/build.func)
|
||||
|
||||
APP="Homarr"
|
||||
var_tags="dashboard;homepage"
|
||||
var_cpu="2"
|
||||
var_ram="1024"
|
||||
var_disk="5"
|
||||
var_os="debian"
|
||||
var_version="12"
|
||||
var_unprivileged="1"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
# Update logic here
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
msg_ok "Completed Successfully!\n"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Container Creation Fails
|
||||
|
||||
**Symptom**: `pct create` exits with error code 209
|
||||
|
||||
**Solution**:
|
||||
```bash
|
||||
# Check existing containers
|
||||
pct list | grep CTID
|
||||
|
||||
# Remove conflicting container
|
||||
pct destroy CTID
|
||||
|
||||
# Retry ct/AppName.sh
|
||||
```
|
||||
|
||||
### Update Function Doesn't Detect New Version
|
||||
|
||||
**Debug**:
|
||||
```bash
|
||||
# Check version file
|
||||
cat /opt/AppName_version.txt
|
||||
|
||||
# Test GitHub API
|
||||
curl -fsSL https://api.github.com/repos/user/repo/releases/latest | grep tag_name
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Contribution Checklist
|
||||
|
||||
Before submitting a PR:
|
||||
|
||||
### Script Structure
|
||||
- [ ] Shebang is `#!/usr/bin/env bash`
|
||||
- [ ] Imports `build.func` from community-scripts repo
|
||||
- [ ] Copyright header with author and source URL
|
||||
- [ ] APP variable matches filename
|
||||
- [ ] `var_tags` are semicolon-separated (no spaces)
|
||||
|
||||
### Default Values
|
||||
- [ ] `var_cpu` set appropriately (2-4 for most apps)
|
||||
- [ ] `var_ram` set appropriately (1024-4096 MB minimum)
|
||||
- [ ] `var_disk` sufficient for app + data (5-20 GB)
|
||||
- [ ] `var_os` is realistic
|
||||
|
||||
### Functions
|
||||
- [ ] `update_script()` implemented
|
||||
- [ ] Update function checks if app installed
|
||||
- [ ] Proper error handling with `msg_error`
|
||||
|
||||
### Testing
|
||||
- [ ] Script tested with default installation
|
||||
- [ ] Script tested with advanced (19-step) installation
|
||||
- [ ] Update function tested on existing installation
|
||||
|
||||
---
|
||||
|
||||
## Best Practices
|
||||
|
||||
### ✅ DO:
|
||||
|
||||
1. **Use meaningful defaults**
|
||||
2. **Implement version tracking**
|
||||
3. **Handle edge cases**
|
||||
4. **Use proper messaging with msg_info/msg_ok/msg_error**
|
||||
|
||||
### ❌ DON'T:
|
||||
|
||||
1. **Hardcode versions**
|
||||
2. **Use custom color codes** (use built-in variables)
|
||||
3. **Forget error handling**
|
||||
4. **Leave temporary files**
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: December 2025
|
||||
**Compatibility**: ProxmoxVE with build.func v3+
|
||||
72
docs/ct/README.md
Normal file
72
docs/ct/README.md
Normal file
@ -0,0 +1,72 @@
|
||||
# Container Scripts Documentation (/ct)
|
||||
|
||||
This directory contains comprehensive documentation for container creation scripts in the `/ct` directory.
|
||||
|
||||
## Overview
|
||||
|
||||
Container scripts (`ct/*.sh`) are the entry points for creating LXC containers in Proxmox VE. They run on the host and orchestrate the entire container creation process.
|
||||
|
||||
## Documentation Structure
|
||||
|
||||
Each script has standardized documentation following the project pattern.
|
||||
|
||||
## Key Resources
|
||||
|
||||
- **[DETAILED_GUIDE.md](DETAILED_GUIDE.md)** - Complete reference for creating ct scripts
|
||||
- **[../contribution/README.md](../contribution/README.md)** - How to contribute
|
||||
- **[../misc/build.func/](../misc/build.func/)** - Core orchestrator documentation
|
||||
|
||||
## Container Creation Flow
|
||||
|
||||
```
|
||||
ct/AppName.sh (host-side)
|
||||
│
|
||||
├─ Calls: build.func (orchestrator)
|
||||
│
|
||||
├─ Variables: var_cpu, var_ram, var_disk, var_os
|
||||
│
|
||||
└─ Creates: LXC Container
|
||||
│
|
||||
└─ Runs: install/appname-install.sh (inside)
|
||||
```
|
||||
|
||||
## Available Scripts
|
||||
|
||||
See `/ct` directory for all container creation scripts. Common examples:
|
||||
|
||||
- `pihole.sh` - Pi-hole DNS/DHCP server
|
||||
- `docker.sh` - Docker container runtime
|
||||
- `wallabag.sh` - Article reading & archiving
|
||||
- `nextcloud.sh` - Private cloud storage
|
||||
- `debian.sh` - Basic Debian container
|
||||
- And 30+ more...
|
||||
|
||||
## Quick Start
|
||||
|
||||
To understand how to create a container script:
|
||||
|
||||
1. Read: [UPDATED_APP-ct.md](../UPDATED_APP-ct.md)
|
||||
2. Study: A similar existing script in `/ct`
|
||||
3. Copy template and customize
|
||||
4. Test locally
|
||||
5. Submit PR
|
||||
|
||||
## Contributing a New Container
|
||||
|
||||
1. Create `ct/myapp.sh`
|
||||
2. Create `install/myapp-install.sh`
|
||||
3. Follow template in [UPDATED_APP-ct.md](../UPDATED_APP-ct.md)
|
||||
4. Test thoroughly
|
||||
5. Submit PR with both files
|
||||
|
||||
## Common Tasks
|
||||
|
||||
- **Add new container application** → [CONTRIBUTION_GUIDE.md](../CONTRIBUTION_GUIDE.md)
|
||||
- **Debug container creation** → [EXIT_CODES.md](../EXIT_CODES.md)
|
||||
- **Understand build.func** → [misc/build.func/](../misc/build.func/)
|
||||
- **Development mode debugging** → [DEV_MODE.md](../DEV_MODE.md)
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: December 2025
|
||||
**Maintainers**: community-scripts team
|
||||
840
docs/guides/CONFIGURATION_REFERENCE.md
Normal file
840
docs/guides/CONFIGURATION_REFERENCE.md
Normal file
@ -0,0 +1,840 @@
|
||||
# Configuration Reference
|
||||
|
||||
**Complete reference for all configuration variables and options in community-scripts for Proxmox VE.**
|
||||
|
||||
---
|
||||
|
||||
## Table of Contents
|
||||
|
||||
1. [Variable Naming Convention](#variable-naming-convention)
|
||||
2. [Complete Variable Reference](#complete-variable-reference)
|
||||
3. [Resource Configuration](#resource-configuration)
|
||||
4. [Network Configuration](#network-configuration)
|
||||
5. [IPv6 Configuration](#ipv6-configuration)
|
||||
6. [SSH Configuration](#ssh-configuration)
|
||||
7. [Container Features](#container-features)
|
||||
8. [Storage Configuration](#storage-configuration)
|
||||
9. [Security Settings](#security-settings)
|
||||
10. [Advanced Options](#advanced-options)
|
||||
11. [Quick Reference Table](#quick-reference-table)
|
||||
|
||||
---
|
||||
|
||||
## Variable Naming Convention
|
||||
|
||||
All configuration variables follow a consistent pattern:
|
||||
|
||||
```
|
||||
var_<setting>=<value>
|
||||
```
|
||||
|
||||
**Rules:**
|
||||
- ✅ Always starts with `var_`
|
||||
- ✅ Lowercase letters only
|
||||
- ✅ Underscores for word separation
|
||||
- ✅ No spaces around `=`
|
||||
- ✅ Values can be quoted if needed
|
||||
|
||||
**Examples:**
|
||||
```bash
|
||||
# ✓ Correct
|
||||
var_cpu=4
|
||||
var_hostname=myserver
|
||||
var_ssh_authorized_key=ssh-rsa AAAA...
|
||||
|
||||
# ✗ Wrong
|
||||
CPU=4 # Missing var_ prefix
|
||||
var_CPU=4 # Uppercase not allowed
|
||||
var_cpu = 4 # Spaces around =
|
||||
var-cpu=4 # Hyphens not allowed
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Complete Variable Reference
|
||||
|
||||
### var_unprivileged
|
||||
|
||||
**Type:** Boolean (0 or 1)
|
||||
**Default:** `1` (unprivileged)
|
||||
**Description:** Determines if container runs unprivileged (recommended) or privileged.
|
||||
|
||||
```bash
|
||||
var_unprivileged=1 # Unprivileged (safer, recommended)
|
||||
var_unprivileged=0 # Privileged (less secure, more features)
|
||||
```
|
||||
|
||||
**When to use privileged (0):**
|
||||
- Hardware access required
|
||||
- Certain kernel modules needed
|
||||
- Legacy applications
|
||||
- Nested virtualization with full features
|
||||
|
||||
**Security Impact:**
|
||||
- Unprivileged: Container root is mapped to unprivileged user on host
|
||||
- Privileged: Container root = host root (security risk)
|
||||
|
||||
---
|
||||
|
||||
### var_cpu
|
||||
|
||||
**Type:** Integer
|
||||
**Default:** Varies by app (usually 1-4)
|
||||
**Range:** 1 to host CPU count
|
||||
**Description:** Number of CPU cores allocated to container.
|
||||
|
||||
```bash
|
||||
var_cpu=1 # Single core (minimal)
|
||||
var_cpu=2 # Dual core (typical)
|
||||
var_cpu=4 # Quad core (recommended for apps)
|
||||
var_cpu=8 # High performance
|
||||
```
|
||||
|
||||
**Best Practices:**
|
||||
- Start with 2 cores for most applications
|
||||
- Monitor usage with `pct exec <id> -- htop`
|
||||
- Can be changed after creation
|
||||
- Consider host CPU count (don't over-allocate)
|
||||
|
||||
---
|
||||
|
||||
### var_ram
|
||||
|
||||
**Type:** Integer (MB)
|
||||
**Default:** Varies by app (usually 512-2048)
|
||||
**Range:** 512 MB to host RAM
|
||||
**Description:** Amount of RAM in megabytes.
|
||||
|
||||
```bash
|
||||
var_ram=512 # 512 MB (minimal)
|
||||
var_ram=1024 # 1 GB (typical)
|
||||
var_ram=2048 # 2 GB (comfortable)
|
||||
var_ram=4096 # 4 GB (recommended for databases)
|
||||
var_ram=8192 # 8 GB (high memory apps)
|
||||
```
|
||||
|
||||
**Conversion Guide:**
|
||||
```
|
||||
512 MB = 0.5 GB
|
||||
1024 MB = 1 GB
|
||||
2048 MB = 2 GB
|
||||
4096 MB = 4 GB
|
||||
8192 MB = 8 GB
|
||||
16384 MB = 16 GB
|
||||
```
|
||||
|
||||
**Best Practices:**
|
||||
- Minimum 512 MB for basic Linux
|
||||
- 1 GB for typical applications
|
||||
- 2-4 GB for web servers, databases
|
||||
- Monitor with `free -h` inside container
|
||||
|
||||
---
|
||||
|
||||
### var_disk
|
||||
|
||||
**Type:** Integer (GB)
|
||||
**Default:** Varies by app (usually 2-8)
|
||||
**Range:** 0.001 GB to storage capacity
|
||||
**Description:** Root disk size in gigabytes.
|
||||
|
||||
```bash
|
||||
var_disk=2 # 2 GB (minimal OS only)
|
||||
var_disk=4 # 4 GB (typical)
|
||||
var_disk=8 # 8 GB (comfortable)
|
||||
var_disk=20 # 20 GB (recommended for apps)
|
||||
var_disk=50 # 50 GB (large applications)
|
||||
var_disk=100 # 100 GB (databases, media)
|
||||
```
|
||||
|
||||
**Important Notes:**
|
||||
- Can be expanded after creation (not reduced)
|
||||
- Actual space depends on storage type
|
||||
- Thin provisioning supported on most storage
|
||||
- Plan for logs, data, updates
|
||||
|
||||
**Recommended Sizes by Use Case:**
|
||||
```
|
||||
Basic Linux container: 4 GB
|
||||
Web server (Nginx/Apache): 8 GB
|
||||
Application server: 10-20 GB
|
||||
Database server: 20-50 GB
|
||||
Docker host: 30-100 GB
|
||||
Media server: 100+ GB
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### var_hostname
|
||||
|
||||
**Type:** String
|
||||
**Default:** Application name
|
||||
**Max Length:** 63 characters
|
||||
**Description:** Container hostname (FQDN format allowed).
|
||||
|
||||
```bash
|
||||
var_hostname=myserver
|
||||
var_hostname=pihole
|
||||
var_hostname=docker-01
|
||||
var_hostname=web.example.com
|
||||
```
|
||||
|
||||
**Rules:**
|
||||
- Lowercase letters, numbers, hyphens
|
||||
- Cannot start or end with hyphen
|
||||
- No underscores allowed
|
||||
- No spaces
|
||||
|
||||
**Best Practices:**
|
||||
```bash
|
||||
# ✓ Good
|
||||
var_hostname=web-server
|
||||
var_hostname=db-primary
|
||||
var_hostname=app.domain.com
|
||||
|
||||
# ✗ Avoid
|
||||
var_hostname=Web_Server # Uppercase, underscore
|
||||
var_hostname=-server # Starts with hyphen
|
||||
var_hostname=my server # Contains space
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### var_brg
|
||||
|
||||
**Type:** String
|
||||
**Default:** `vmbr0`
|
||||
**Description:** Network bridge interface.
|
||||
|
||||
```bash
|
||||
var_brg=vmbr0 # Default Proxmox bridge
|
||||
var_brg=vmbr1 # Custom bridge
|
||||
var_brg=vmbr2 # Isolated network
|
||||
```
|
||||
|
||||
**Common Setups:**
|
||||
```
|
||||
vmbr0 → Main network (LAN)
|
||||
vmbr1 → Guest network
|
||||
vmbr2 → DMZ
|
||||
vmbr3 → Management
|
||||
vmbr4 → Storage network
|
||||
```
|
||||
|
||||
**Check available bridges:**
|
||||
```bash
|
||||
ip link show | grep vmbr
|
||||
# or
|
||||
brctl show
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### var_net
|
||||
|
||||
**Type:** String
|
||||
**Options:** `dhcp` or `static`
|
||||
**Default:** `dhcp`
|
||||
**Description:** IPv4 network configuration method.
|
||||
|
||||
```bash
|
||||
var_net=dhcp # Automatic IP via DHCP
|
||||
var_net=static # Manual IP configuration
|
||||
```
|
||||
|
||||
**DHCP Mode:**
|
||||
- Automatic IP assignment
|
||||
- Easy setup
|
||||
- Good for development
|
||||
- Requires DHCP server on network
|
||||
|
||||
**Static Mode:**
|
||||
- Fixed IP address
|
||||
- Requires gateway configuration
|
||||
- Better for servers
|
||||
- Configure via advanced settings or after creation
|
||||
|
||||
---
|
||||
|
||||
### var_gateway
|
||||
|
||||
**Type:** IPv4 Address
|
||||
**Default:** Auto-detected from host
|
||||
**Description:** Network gateway IP address.
|
||||
|
||||
```bash
|
||||
var_gateway=192.168.1.1
|
||||
var_gateway=10.0.0.1
|
||||
var_gateway=172.16.0.1
|
||||
```
|
||||
|
||||
**Auto-detection:**
|
||||
If not specified, system detects gateway from host:
|
||||
```bash
|
||||
ip route | grep default
|
||||
```
|
||||
|
||||
**When to specify:**
|
||||
- Multiple gateways available
|
||||
- Custom routing setup
|
||||
- Different network segment
|
||||
|
||||
---
|
||||
|
||||
### var_vlan
|
||||
|
||||
**Type:** Integer
|
||||
**Range:** 1-4094
|
||||
**Default:** None
|
||||
**Description:** VLAN tag for network isolation.
|
||||
|
||||
```bash
|
||||
var_vlan=10 # VLAN 10
|
||||
var_vlan=100 # VLAN 100
|
||||
var_vlan=200 # VLAN 200
|
||||
```
|
||||
|
||||
**Common VLAN Schemes:**
|
||||
```
|
||||
VLAN 10 → Management
|
||||
VLAN 20 → Servers
|
||||
VLAN 30 → Desktops
|
||||
VLAN 40 → Guest WiFi
|
||||
VLAN 50 → IoT devices
|
||||
VLAN 99 → DMZ
|
||||
```
|
||||
|
||||
**Requirements:**
|
||||
- Switch must support VLANs
|
||||
- Proxmox bridge configured for VLAN aware
|
||||
- Gateway on same VLAN
|
||||
|
||||
---
|
||||
|
||||
### var_mtu
|
||||
|
||||
**Type:** Integer
|
||||
**Default:** `1500`
|
||||
**Range:** 68-9000
|
||||
**Description:** Maximum Transmission Unit size.
|
||||
|
||||
```bash
|
||||
var_mtu=1500 # Standard Ethernet
|
||||
var_mtu=1492 # PPPoE
|
||||
var_mtu=9000 # Jumbo frames
|
||||
```
|
||||
|
||||
**Common Values:**
|
||||
```
|
||||
1500 → Standard Ethernet (default)
|
||||
1492 → PPPoE connections
|
||||
1400 → Some VPN setups
|
||||
9000 → Jumbo frames (10GbE networks)
|
||||
```
|
||||
|
||||
**When to change:**
|
||||
- Jumbo frames for performance on 10GbE
|
||||
- PPPoE internet connections
|
||||
- VPN tunnels with overhead
|
||||
- Specific network requirements
|
||||
|
||||
---
|
||||
|
||||
### var_mac
|
||||
|
||||
**Type:** MAC Address
|
||||
**Format:** `XX:XX:XX:XX:XX:XX`
|
||||
**Default:** Auto-generated
|
||||
**Description:** Container MAC address.
|
||||
|
||||
```bash
|
||||
var_mac=02:00:00:00:00:01
|
||||
var_mac=DE:AD:BE:EF:00:01
|
||||
```
|
||||
|
||||
**When to specify:**
|
||||
- MAC-based licensing
|
||||
- Static DHCP reservations
|
||||
- Network access control
|
||||
- Cloning configurations
|
||||
|
||||
**Best Practices:**
|
||||
- Use locally administered addresses (2nd bit set)
|
||||
- Start with `02:`, `06:`, `0A:`, `0E:`
|
||||
- Avoid vendor OUIs
|
||||
- Document custom MACs
|
||||
|
||||
---
|
||||
|
||||
### var_ipv6_method
|
||||
|
||||
**Type:** String
|
||||
**Options:** `auto`, `dhcp`, `static`, `none`, `disable`
|
||||
**Default:** `none`
|
||||
**Description:** IPv6 configuration method.
|
||||
|
||||
```bash
|
||||
var_ipv6_method=auto # SLAAC (auto-configuration)
|
||||
var_ipv6_method=dhcp # DHCPv6
|
||||
var_ipv6_method=static # Manual configuration
|
||||
var_ipv6_method=none # IPv6 enabled but not configured
|
||||
var_ipv6_method=disable # IPv6 completely disabled
|
||||
```
|
||||
|
||||
**Detailed Options:**
|
||||
|
||||
**auto (SLAAC)**
|
||||
- Stateless Address Auto-Configuration
|
||||
- Router advertisements
|
||||
- No DHCPv6 server needed
|
||||
- Recommended for most cases
|
||||
|
||||
**dhcp (DHCPv6)**
|
||||
- Stateful configuration
|
||||
- Requires DHCPv6 server
|
||||
- More control over addressing
|
||||
|
||||
**static**
|
||||
- Manual IPv6 address
|
||||
- Manual gateway
|
||||
- Full control
|
||||
|
||||
**none**
|
||||
- IPv6 stack active
|
||||
- No address configured
|
||||
- Can configure later
|
||||
|
||||
**disable**
|
||||
- IPv6 completely disabled at kernel level
|
||||
- Use when IPv6 causes issues
|
||||
- Sets `net.ipv6.conf.all.disable_ipv6=1`
|
||||
|
||||
---
|
||||
|
||||
### var_ns
|
||||
|
||||
**Type:** IP Address
|
||||
**Default:** Auto (from host)
|
||||
**Description:** DNS nameserver IP.
|
||||
|
||||
```bash
|
||||
var_ns=8.8.8.8 # Google DNS
|
||||
var_ns=1.1.1.1 # Cloudflare DNS
|
||||
var_ns=9.9.9.9 # Quad9 DNS
|
||||
var_ns=192.168.1.1 # Local DNS
|
||||
```
|
||||
|
||||
**Common DNS Servers:**
|
||||
```
|
||||
8.8.8.8, 8.8.4.4 → Google Public DNS
|
||||
1.1.1.1, 1.0.0.1 → Cloudflare DNS
|
||||
9.9.9.9, 149.112.112.112 → Quad9 DNS
|
||||
208.67.222.222 → OpenDNS
|
||||
192.168.1.1 → Local router/Pi-hole
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### var_ssh
|
||||
|
||||
**Type:** Boolean
|
||||
**Options:** `yes` or `no`
|
||||
**Default:** `no`
|
||||
**Description:** Enable SSH server in container.
|
||||
|
||||
```bash
|
||||
var_ssh=yes # SSH server enabled
|
||||
var_ssh=no # SSH server disabled (console only)
|
||||
```
|
||||
|
||||
**When enabled:**
|
||||
- OpenSSH server installed
|
||||
- Started on boot
|
||||
- Port 22 open
|
||||
- Root login allowed
|
||||
|
||||
**Security Considerations:**
|
||||
- Disable if not needed
|
||||
- Use SSH keys instead of passwords
|
||||
- Consider non-standard port
|
||||
- Firewall rules recommended
|
||||
|
||||
---
|
||||
|
||||
### var_ssh_authorized_key
|
||||
|
||||
**Type:** String (SSH public key)
|
||||
**Default:** None
|
||||
**Description:** SSH public key for root user.
|
||||
|
||||
```bash
|
||||
var_ssh_authorized_key=ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC... user@host
|
||||
var_ssh_authorized_key=ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... user@host
|
||||
```
|
||||
|
||||
**Supported Key Types:**
|
||||
- RSA (2048-4096 bits)
|
||||
- Ed25519 (recommended)
|
||||
- ECDSA
|
||||
- DSA (deprecated)
|
||||
|
||||
**How to get your public key:**
|
||||
```bash
|
||||
cat ~/.ssh/id_rsa.pub
|
||||
# or
|
||||
cat ~/.ssh/id_ed25519.pub
|
||||
```
|
||||
|
||||
**Multiple keys:**
|
||||
Separate with newlines (in file) or use multiple deployments.
|
||||
|
||||
---
|
||||
|
||||
### var_pw
|
||||
|
||||
**Type:** String
|
||||
**Default:** Empty (auto-login)
|
||||
**Description:** Root password.
|
||||
|
||||
```bash
|
||||
var_pw=SecurePassword123! # Set password
|
||||
var_pw= # Auto-login (empty)
|
||||
```
|
||||
|
||||
**Auto-login behavior:**
|
||||
- No password required for console
|
||||
- Automatic login on console access
|
||||
- SSH still requires key if enabled
|
||||
- Suitable for development
|
||||
|
||||
**Password best practices:**
|
||||
- Minimum 12 characters
|
||||
- Mix upper/lower/numbers/symbols
|
||||
- Use password manager
|
||||
- Rotate regularly
|
||||
|
||||
---
|
||||
|
||||
### var_nesting
|
||||
|
||||
**Type:** Boolean (0 or 1)
|
||||
**Default:** `1`
|
||||
**Description:** Allow nested containers (required for Docker).
|
||||
|
||||
```bash
|
||||
var_nesting=1 # Nested containers allowed
|
||||
var_nesting=0 # Nested containers disabled
|
||||
```
|
||||
|
||||
**Required for:**
|
||||
- Docker
|
||||
- LXC inside LXC
|
||||
- Systemd features
|
||||
- Container orchestration
|
||||
|
||||
**Security Impact:**
|
||||
- Slightly reduced isolation
|
||||
- Required for container platforms
|
||||
- Generally safe when unprivileged
|
||||
|
||||
---
|
||||
|
||||
### var_keyctl
|
||||
|
||||
**Type:** Boolean (0 or 1)
|
||||
**Default:** `0`
|
||||
**Description:** Enable keyctl system call.
|
||||
|
||||
```bash
|
||||
var_keyctl=1 # Keyctl enabled
|
||||
var_keyctl=0 # Keyctl disabled
|
||||
```
|
||||
|
||||
**Required for:**
|
||||
- Docker in some configurations
|
||||
- Systemd keyring features
|
||||
- Encryption key management
|
||||
- Some authentication systems
|
||||
|
||||
---
|
||||
|
||||
### var_fuse
|
||||
|
||||
**Type:** Boolean (0 or 1)
|
||||
**Default:** `0`
|
||||
**Description:** Enable FUSE filesystem support.
|
||||
|
||||
```bash
|
||||
var_fuse=1 # FUSE enabled
|
||||
var_fuse=0 # FUSE disabled
|
||||
```
|
||||
|
||||
**Required for:**
|
||||
- sshfs
|
||||
- AppImage
|
||||
- Some backup tools
|
||||
- User-space filesystems
|
||||
|
||||
---
|
||||
|
||||
### var_mknod
|
||||
|
||||
**Type:** Boolean (0 or 1)
|
||||
**Default:** `0`
|
||||
**Description:** Allow device node creation.
|
||||
|
||||
```bash
|
||||
var_mknod=1 # Device nodes allowed
|
||||
var_mknod=0 # Device nodes disabled
|
||||
```
|
||||
|
||||
**Requires:**
|
||||
- Kernel 5.3+
|
||||
- Experimental feature
|
||||
- Use with caution
|
||||
|
||||
---
|
||||
|
||||
### var_mount_fs
|
||||
|
||||
**Type:** String (comma-separated)
|
||||
**Default:** Empty
|
||||
**Description:** Allowed mountable filesystems.
|
||||
|
||||
```bash
|
||||
var_mount_fs=nfs
|
||||
var_mount_fs=nfs,cifs
|
||||
var_mount_fs=ext4,xfs,nfs
|
||||
```
|
||||
|
||||
**Common Options:**
|
||||
```
|
||||
nfs → NFS network shares
|
||||
cifs → SMB/CIFS shares
|
||||
ext4 → Ext4 filesystems
|
||||
xfs → XFS filesystems
|
||||
btrfs → Btrfs filesystems
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### var_protection
|
||||
|
||||
**Type:** Boolean
|
||||
**Options:** `yes` or `no`
|
||||
**Default:** `no`
|
||||
**Description:** Prevent accidental deletion.
|
||||
|
||||
```bash
|
||||
var_protection=yes # Protected from deletion
|
||||
var_protection=no # Can be deleted normally
|
||||
```
|
||||
|
||||
**When protected:**
|
||||
- Cannot delete via GUI
|
||||
- Cannot delete via `pct destroy`
|
||||
- Must disable protection first
|
||||
- Good for production containers
|
||||
|
||||
---
|
||||
|
||||
### var_tags
|
||||
|
||||
**Type:** String (comma-separated)
|
||||
**Default:** `community-script`
|
||||
**Description:** Container tags for organization.
|
||||
|
||||
```bash
|
||||
var_tags=production
|
||||
var_tags=production,webserver
|
||||
var_tags=dev,testing,temporary
|
||||
```
|
||||
|
||||
**Best Practices:**
|
||||
```bash
|
||||
# Environment tags
|
||||
var_tags=production
|
||||
var_tags=development
|
||||
var_tags=staging
|
||||
|
||||
# Function tags
|
||||
var_tags=webserver,nginx
|
||||
var_tags=database,postgresql
|
||||
var_tags=cache,redis
|
||||
|
||||
# Project tags
|
||||
var_tags=project-alpha,frontend
|
||||
var_tags=customer-xyz,billing
|
||||
|
||||
# Combined
|
||||
var_tags=production,webserver,project-alpha
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### var_timezone
|
||||
|
||||
**Type:** String (TZ database format)
|
||||
**Default:** Host timezone
|
||||
**Description:** Container timezone.
|
||||
|
||||
```bash
|
||||
var_timezone=Europe/Berlin
|
||||
var_timezone=America/New_York
|
||||
var_timezone=Asia/Tokyo
|
||||
```
|
||||
|
||||
**Common Timezones:**
|
||||
```
|
||||
Europe/London
|
||||
Europe/Berlin
|
||||
Europe/Paris
|
||||
America/New_York
|
||||
America/Chicago
|
||||
America/Los_Angeles
|
||||
Asia/Tokyo
|
||||
Asia/Singapore
|
||||
Australia/Sydney
|
||||
UTC
|
||||
```
|
||||
|
||||
**List all timezones:**
|
||||
```bash
|
||||
timedatectl list-timezones
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### var_verbose
|
||||
|
||||
**Type:** Boolean
|
||||
**Options:** `yes` or `no`
|
||||
**Default:** `no`
|
||||
**Description:** Enable verbose output.
|
||||
|
||||
```bash
|
||||
var_verbose=yes # Show all commands
|
||||
var_verbose=no # Silent mode
|
||||
```
|
||||
|
||||
**When enabled:**
|
||||
- Shows all executed commands
|
||||
- Displays detailed progress
|
||||
- Useful for debugging
|
||||
- More log output
|
||||
|
||||
---
|
||||
|
||||
### var_apt_cacher
|
||||
|
||||
**Type:** Boolean
|
||||
**Options:** `yes` or `no`
|
||||
**Default:** `no`
|
||||
**Description:** Use APT caching proxy.
|
||||
|
||||
```bash
|
||||
var_apt_cacher=yes
|
||||
var_apt_cacher=no
|
||||
```
|
||||
|
||||
**Benefits:**
|
||||
- Faster package installs
|
||||
- Reduced bandwidth
|
||||
- Offline package cache
|
||||
- Speeds up multiple containers
|
||||
|
||||
---
|
||||
|
||||
### var_apt_cacher_ip
|
||||
|
||||
**Type:** IP Address
|
||||
**Default:** None
|
||||
**Description:** APT cacher proxy IP.
|
||||
|
||||
```bash
|
||||
var_apt_cacher=yes
|
||||
var_apt_cacher_ip=192.168.1.100
|
||||
```
|
||||
|
||||
**Setup apt-cacher-ng:**
|
||||
```bash
|
||||
apt install apt-cacher-ng
|
||||
# Runs on port 3142
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### var_container_storage
|
||||
|
||||
**Type:** String
|
||||
**Default:** Auto-detected
|
||||
**Description:** Storage for container.
|
||||
|
||||
```bash
|
||||
var_container_storage=local
|
||||
var_container_storage=local-zfs
|
||||
var_container_storage=pve-storage
|
||||
```
|
||||
|
||||
**List available storage:**
|
||||
```bash
|
||||
pvesm status
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### var_template_storage
|
||||
|
||||
**Type:** String
|
||||
**Default:** Auto-detected
|
||||
**Description:** Storage for templates.
|
||||
|
||||
```bash
|
||||
var_template_storage=local
|
||||
var_template_storage=nfs-templates
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Quick Reference Table
|
||||
|
||||
| Variable | Type | Default | Example |
|
||||
|----------|------|---------|---------|
|
||||
| `var_unprivileged` | 0/1 | 1 | `var_unprivileged=1` |
|
||||
| `var_cpu` | int | varies | `var_cpu=4` |
|
||||
| `var_ram` | int (MB) | varies | `var_ram=4096` |
|
||||
| `var_disk` | int (GB) | varies | `var_disk=20` |
|
||||
| `var_hostname` | string | app name | `var_hostname=server` |
|
||||
| `var_brg` | string | vmbr0 | `var_brg=vmbr1` |
|
||||
| `var_net` | dhcp/static | dhcp | `var_net=dhcp` |
|
||||
| `var_gateway` | IP | auto | `var_gateway=192.168.1.1` |
|
||||
| `var_ipv6_method` | string | none | `var_ipv6_method=disable` |
|
||||
| `var_vlan` | int | - | `var_vlan=100` |
|
||||
| `var_mtu` | int | 1500 | `var_mtu=9000` |
|
||||
| `var_mac` | MAC | auto | `var_mac=02:00:00:00:00:01` |
|
||||
| `var_ns` | IP | auto | `var_ns=8.8.8.8` |
|
||||
| `var_ssh` | yes/no | no | `var_ssh=yes` |
|
||||
| `var_ssh_authorized_key` | string | - | `var_ssh_authorized_key=ssh-rsa...` |
|
||||
| `var_pw` | string | empty | `var_pw=password` |
|
||||
| `var_nesting` | 0/1 | 1 | `var_nesting=1` |
|
||||
| `var_keyctl` | 0/1 | 0 | `var_keyctl=1` |
|
||||
| `var_fuse` | 0/1 | 0 | `var_fuse=1` |
|
||||
| `var_mknod` | 0/1 | 0 | `var_mknod=1` |
|
||||
| `var_mount_fs` | string | - | `var_mount_fs=nfs,cifs` |
|
||||
| `var_protection` | yes/no | no | `var_protection=yes` |
|
||||
| `var_tags` | string | community-script | `var_tags=prod,web` |
|
||||
| `var_timezone` | string | host TZ | `var_timezone=Europe/Berlin` |
|
||||
| `var_verbose` | yes/no | no | `var_verbose=yes` |
|
||||
| `var_apt_cacher` | yes/no | no | `var_apt_cacher=yes` |
|
||||
| `var_apt_cacher_ip` | IP | - | `var_apt_cacher_ip=192.168.1.10` |
|
||||
| `var_container_storage` | string | auto | `var_container_storage=local-zfs` |
|
||||
| `var_template_storage` | string | auto | `var_template_storage=local` |
|
||||
|
||||
---
|
||||
|
||||
## See Also
|
||||
|
||||
- [Defaults System Guide](DEFAULTS_GUIDE.md)
|
||||
- [Unattended Deployments](UNATTENDED_DEPLOYMENTS.md)
|
||||
- [Security Best Practices](SECURITY_GUIDE.md)
|
||||
- [Network Configuration](NETWORK_GUIDE.md)
|
||||
748
docs/guides/DEFAULTS_SYSTEM_GUIDE.md
Normal file
748
docs/guides/DEFAULTS_SYSTEM_GUIDE.md
Normal file
@ -0,0 +1,748 @@
|
||||
# Configuration & Defaults System - User Guide
|
||||
|
||||
> **Complete Guide to App Defaults and User Defaults**
|
||||
>
|
||||
> *Learn how to configure, save, and reuse your installation settings*
|
||||
|
||||
---
|
||||
|
||||
## Table of Contents
|
||||
|
||||
1. [Quick Start](#quick-start)
|
||||
2. [Understanding the Defaults System](#understanding-the-defaults-system)
|
||||
3. [Installation Modes](#installation-modes)
|
||||
4. [How to Save Defaults](#how-to-save-defaults)
|
||||
5. [How to Use Saved Defaults](#how-to-use-saved-defaults)
|
||||
6. [Managing Your Defaults](#managing-your-defaults)
|
||||
7. [Advanced Configuration](#advanced-configuration)
|
||||
8. [Troubleshooting](#troubleshooting)
|
||||
|
||||
---
|
||||
|
||||
## Quick Start
|
||||
|
||||
### 30-Second Setup
|
||||
|
||||
```bash
|
||||
# 1. Run any container installation script
|
||||
bash pihole-install.sh
|
||||
|
||||
# 2. When prompted, select: "Advanced Settings"
|
||||
# (This allows you to customize everything)
|
||||
|
||||
# 3. Answer all configuration questions
|
||||
|
||||
# 4. At the end, when asked "Save as App Defaults?"
|
||||
# Select: YES
|
||||
|
||||
# 5. Done! Your settings are now saved
|
||||
```
|
||||
|
||||
**Next Time**: Run the same script again, select **"App Defaults"** and your settings will be applied automatically!
|
||||
|
||||
---
|
||||
|
||||
## Understanding the Defaults System
|
||||
|
||||
### The Three-Tier System
|
||||
|
||||
Your installation settings are managed through three layers:
|
||||
|
||||
#### 🔷 **Tier 1: Built-in Defaults** (Fallback)
|
||||
```
|
||||
These are hardcoded in the scripts
|
||||
Provide sensible defaults for each application
|
||||
Example: PiHole uses 2 CPU cores by default
|
||||
```
|
||||
|
||||
#### 🔶 **Tier 2: User Defaults** (Global)
|
||||
```
|
||||
Your personal global defaults
|
||||
Applied to ALL container installations
|
||||
Location: /usr/local/community-scripts/default.vars
|
||||
Example: "I always want 4 CPU cores and 2GB RAM"
|
||||
```
|
||||
|
||||
#### 🔴 **Tier 3: App Defaults** (Specific)
|
||||
```
|
||||
Application-specific saved settings
|
||||
Only applied when installing that specific app
|
||||
Location: /usr/local/community-scripts/defaults/<appname>.vars
|
||||
Example: "Whenever I install PiHole, use these exact settings"
|
||||
```
|
||||
|
||||
### Priority System
|
||||
|
||||
When installing a container, settings are applied in this order:
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────┐
|
||||
│ 1. Environment Variables (HIGHEST) │ Set in shell: export var_cpu=8
|
||||
│ (these override everything) │
|
||||
├─────────────────────────────────────┤
|
||||
│ 2. App Defaults │ From: defaults/pihole.vars
|
||||
│ (app-specific saved settings) │
|
||||
├─────────────────────────────────────┤
|
||||
│ 3. User Defaults │ From: default.vars
|
||||
│ (your global defaults) │
|
||||
├─────────────────────────────────────┤
|
||||
│ 4. Built-in Defaults (LOWEST) │ Hardcoded in script
|
||||
│ (failsafe, always available) │
|
||||
└─────────────────────────────────────┘
|
||||
```
|
||||
|
||||
**In Plain English**:
|
||||
- If you set an environment variable → it wins
|
||||
- Otherwise, if you have app-specific defaults → use those
|
||||
- Otherwise, if you have user defaults → use those
|
||||
- Otherwise, use the hardcoded defaults
|
||||
|
||||
---
|
||||
|
||||
## Installation Modes
|
||||
|
||||
When you run any installation script, you'll be presented with a menu:
|
||||
|
||||
### Option 1️⃣ : **Default Settings**
|
||||
|
||||
```
|
||||
Quick installation with standard settings
|
||||
├─ Best for: First-time users, quick deployments
|
||||
├─ What happens:
|
||||
│ 1. Script uses built-in defaults
|
||||
│ 2. Container created immediately
|
||||
│ 3. No questions asked
|
||||
└─ Time: ~2 minutes
|
||||
```
|
||||
|
||||
**When to use**: You want a standard installation, don't need customization
|
||||
|
||||
---
|
||||
|
||||
### Option 2️⃣ : **Advanced Settings**
|
||||
|
||||
```
|
||||
Full customization with 19 configuration steps
|
||||
├─ Best for: Power users, custom requirements
|
||||
├─ What happens:
|
||||
│ 1. Script asks for EVERY setting
|
||||
│ 2. You control: CPU, RAM, Disk, Network, SSH, etc.
|
||||
│ 3. Shows summary before creating
|
||||
│ 4. Offers to save as App Defaults
|
||||
└─ Time: ~5-10 minutes
|
||||
```
|
||||
|
||||
**When to use**: You want full control over the configuration
|
||||
|
||||
**Available Settings**:
|
||||
- CPU cores, RAM amount, Disk size
|
||||
- Container name, network settings
|
||||
- SSH access, API access, Features
|
||||
- Password, SSH keys, Tags
|
||||
|
||||
---
|
||||
|
||||
### Option 3️⃣ : **User Defaults**
|
||||
|
||||
```
|
||||
Use your saved global defaults
|
||||
├─ Best for: Consistent deployments across many containers
|
||||
├─ Requires: You've previously saved User Defaults
|
||||
├─ What happens:
|
||||
│ 1. Loads settings from: /usr/local/community-scripts/default.vars
|
||||
│ 2. Shows you the loaded settings
|
||||
│ 3. Creates container immediately
|
||||
└─ Time: ~2 minutes
|
||||
```
|
||||
|
||||
**When to use**: You have preferred defaults you want to use for every app
|
||||
|
||||
---
|
||||
|
||||
### Option 4️⃣ : **App Defaults** (if available)
|
||||
|
||||
```
|
||||
Use previously saved app-specific defaults
|
||||
├─ Best for: Repeating the same configuration multiple times
|
||||
├─ Requires: You've previously saved App Defaults for this app
|
||||
├─ What happens:
|
||||
│ 1. Loads settings from: /usr/local/community-scripts/defaults/<app>.vars
|
||||
│ 2. Shows you the loaded settings
|
||||
│ 3. Creates container immediately
|
||||
└─ Time: ~2 minutes
|
||||
```
|
||||
|
||||
**When to use**: You've installed this app before and want identical settings
|
||||
|
||||
---
|
||||
|
||||
### Option 5️⃣ : **Settings Menu**
|
||||
|
||||
```
|
||||
Manage your saved configurations
|
||||
├─ Functions:
|
||||
│ • View current settings
|
||||
│ • Edit storage selections
|
||||
│ • Manage defaults location
|
||||
│ • See what's currently configured
|
||||
└─ Time: ~1 minute
|
||||
```
|
||||
|
||||
**When to use**: You want to review or modify saved settings
|
||||
|
||||
---
|
||||
|
||||
## How to Save Defaults
|
||||
|
||||
### Method 1: Save While Installing
|
||||
|
||||
This is the easiest way:
|
||||
|
||||
#### Step-by-Step: Create App Defaults
|
||||
|
||||
```bash
|
||||
# 1. Run the installation script
|
||||
bash pihole-install.sh
|
||||
|
||||
# 2. Choose installation mode
|
||||
# ┌─────────────────────────┐
|
||||
# │ Select installation mode:│
|
||||
# │ 1) Default Settings │
|
||||
# │ 2) Advanced Settings │
|
||||
# │ 3) User Defaults │
|
||||
# │ 4) App Defaults │
|
||||
# │ 5) Settings Menu │
|
||||
# └─────────────────────────┘
|
||||
#
|
||||
# Enter: 2 (Advanced Settings)
|
||||
|
||||
# 3. Answer all configuration questions
|
||||
# • Container name? → my-pihole
|
||||
# • CPU cores? → 4
|
||||
# • RAM amount? → 2048
|
||||
# • Disk size? → 20
|
||||
# • SSH access? → yes
|
||||
# ... (more options)
|
||||
|
||||
# 4. Review summary (shown before creation)
|
||||
# ✓ Confirm to proceed
|
||||
|
||||
# 5. After creation completes, you'll see:
|
||||
# ┌──────────────────────────────────┐
|
||||
# │ Save as App Defaults for PiHole? │
|
||||
# │ (Yes/No) │
|
||||
# └──────────────────────────────────┘
|
||||
#
|
||||
# Select: Yes
|
||||
|
||||
# 6. Done! Settings saved to:
|
||||
# /usr/local/community-scripts/defaults/pihole.vars
|
||||
```
|
||||
|
||||
#### Step-by-Step: Create User Defaults
|
||||
|
||||
```bash
|
||||
# Same as App Defaults, but:
|
||||
# When you select "Advanced Settings"
|
||||
# FIRST app you run with this selection will offer
|
||||
# to save as "User Defaults" additionally
|
||||
|
||||
# This saves to: /usr/local/community-scripts/default.vars
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Method 2: Manual File Creation
|
||||
|
||||
For advanced users who want to create defaults without running installation:
|
||||
|
||||
```bash
|
||||
# Create User Defaults manually
|
||||
sudo tee /usr/local/community-scripts/default.vars > /dev/null << 'EOF'
|
||||
# Global User Defaults
|
||||
var_cpu=4
|
||||
var_ram=2048
|
||||
var_disk=20
|
||||
var_unprivileged=1
|
||||
var_brg=vmbr0
|
||||
var_gateway=192.168.1.1
|
||||
var_timezone=Europe/Berlin
|
||||
var_ssh=yes
|
||||
var_container_storage=local
|
||||
var_template_storage=local
|
||||
EOF
|
||||
|
||||
# Create App Defaults manually
|
||||
sudo tee /usr/local/community-scripts/defaults/pihole.vars > /dev/null << 'EOF'
|
||||
# App-specific defaults for PiHole
|
||||
var_unprivileged=1
|
||||
var_cpu=2
|
||||
var_ram=1024
|
||||
var_disk=10
|
||||
var_brg=vmbr0
|
||||
var_gateway=192.168.1.1
|
||||
var_hostname=pihole
|
||||
var_container_storage=local
|
||||
var_template_storage=local
|
||||
EOF
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Method 3: Using Environment Variables
|
||||
|
||||
Set defaults via environment before running:
|
||||
|
||||
```bash
|
||||
# Set as environment variables
|
||||
export var_cpu=4
|
||||
export var_ram=2048
|
||||
export var_disk=20
|
||||
export var_hostname=my-container
|
||||
|
||||
# Run installation
|
||||
bash pihole-install.sh
|
||||
|
||||
# These settings will be used
|
||||
# (Can still be overridden by saved defaults)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## How to Use Saved Defaults
|
||||
|
||||
### Using User Defaults
|
||||
|
||||
```bash
|
||||
# 1. Run any installation script
|
||||
bash pihole-install.sh
|
||||
|
||||
# 2. When asked for mode, select:
|
||||
# Option: 3 (User Defaults)
|
||||
|
||||
# 3. Your settings from default.vars are applied
|
||||
# 4. Container created with your saved settings
|
||||
```
|
||||
|
||||
### Using App Defaults
|
||||
|
||||
```bash
|
||||
# 1. Run the app you configured before
|
||||
bash pihole-install.sh
|
||||
|
||||
# 2. When asked for mode, select:
|
||||
# Option: 4 (App Defaults)
|
||||
|
||||
# 3. Your settings from defaults/pihole.vars are applied
|
||||
# 4. Container created with exact same settings
|
||||
```
|
||||
|
||||
### Overriding Saved Defaults
|
||||
|
||||
```bash
|
||||
# Even if you have defaults saved,
|
||||
# you can override them with environment variables
|
||||
|
||||
export var_cpu=8 # Override saved defaults
|
||||
export var_hostname=custom-name
|
||||
|
||||
bash pihole-install.sh
|
||||
# Installation will use these values instead of saved defaults
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Managing Your Defaults
|
||||
|
||||
### View Your Settings
|
||||
|
||||
#### View User Defaults
|
||||
```bash
|
||||
cat /usr/local/community-scripts/default.vars
|
||||
```
|
||||
|
||||
#### View App Defaults
|
||||
```bash
|
||||
cat /usr/local/community-scripts/defaults/pihole.vars
|
||||
```
|
||||
|
||||
#### List All Saved App Defaults
|
||||
```bash
|
||||
ls -la /usr/local/community-scripts/defaults/
|
||||
```
|
||||
|
||||
### Edit Your Settings
|
||||
|
||||
#### Edit User Defaults
|
||||
```bash
|
||||
sudo nano /usr/local/community-scripts/default.vars
|
||||
```
|
||||
|
||||
#### Edit App Defaults
|
||||
```bash
|
||||
sudo nano /usr/local/community-scripts/defaults/pihole.vars
|
||||
```
|
||||
|
||||
### Update Existing Defaults
|
||||
|
||||
```bash
|
||||
# Run installation again with your app
|
||||
bash pihole-install.sh
|
||||
|
||||
# Select: Advanced Settings
|
||||
# Make desired changes
|
||||
# At end, when asked to save:
|
||||
# "Defaults already exist, Update?"
|
||||
# Select: Yes
|
||||
|
||||
# Your saved defaults are updated
|
||||
```
|
||||
|
||||
### Delete Defaults
|
||||
|
||||
#### Delete User Defaults
|
||||
```bash
|
||||
sudo rm /usr/local/community-scripts/default.vars
|
||||
```
|
||||
|
||||
#### Delete App Defaults
|
||||
```bash
|
||||
sudo rm /usr/local/community-scripts/defaults/pihole.vars
|
||||
```
|
||||
|
||||
#### Delete All App Defaults
|
||||
```bash
|
||||
sudo rm /usr/local/community-scripts/defaults/*
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Advanced Configuration
|
||||
|
||||
### Available Variables
|
||||
|
||||
All configurable variables start with `var_`:
|
||||
|
||||
#### Resource Allocation
|
||||
```bash
|
||||
var_cpu=4 # CPU cores
|
||||
var_ram=2048 # RAM in MB
|
||||
var_disk=20 # Disk in GB
|
||||
var_unprivileged=1 # 0=privileged, 1=unprivileged
|
||||
```
|
||||
|
||||
#### Network
|
||||
```bash
|
||||
var_brg=vmbr0 # Bridge interface
|
||||
var_net=veth # Network driver
|
||||
var_gateway=192.168.1.1 # Default gateway
|
||||
var_mtu=1500 # MTU size
|
||||
var_vlan=100 # VLAN ID
|
||||
```
|
||||
|
||||
#### System
|
||||
```bash
|
||||
var_hostname=pihole # Container name
|
||||
var_timezone=Europe/Berlin # Timezone
|
||||
var_pw=SecurePass123 # Root password
|
||||
var_tags=dns,pihole # Tags for organization
|
||||
var_verbose=yes # Enable verbose output
|
||||
```
|
||||
|
||||
#### Security & Access
|
||||
```bash
|
||||
var_ssh=yes # Enable SSH
|
||||
var_ssh_authorized_key="ssh-rsa AA..." # SSH public key
|
||||
var_protection=1 # Enable protection flag
|
||||
```
|
||||
|
||||
#### Features
|
||||
```bash
|
||||
var_fuse=1 # FUSE filesystem support
|
||||
var_tun=1 # TUN device support
|
||||
var_nesting=1 # Nesting (Docker in LXC)
|
||||
var_keyctl=1 # Keyctl syscall
|
||||
var_mknod=1 # Device node creation
|
||||
```
|
||||
|
||||
#### Storage
|
||||
```bash
|
||||
var_container_storage=local # Where to store container
|
||||
var_template_storage=local # Where to store templates
|
||||
```
|
||||
|
||||
### Example Configuration Files
|
||||
|
||||
#### Gaming Server Defaults
|
||||
```bash
|
||||
# High performance for gaming containers
|
||||
var_cpu=8
|
||||
var_ram=4096
|
||||
var_disk=50
|
||||
var_unprivileged=0
|
||||
var_fuse=1
|
||||
var_nesting=1
|
||||
var_tags=gaming
|
||||
```
|
||||
|
||||
#### Development Server
|
||||
```bash
|
||||
# Development with Docker support
|
||||
var_cpu=4
|
||||
var_ram=2048
|
||||
var_disk=30
|
||||
var_unprivileged=1
|
||||
var_nesting=1
|
||||
var_ssh=yes
|
||||
var_tags=development
|
||||
```
|
||||
|
||||
#### IoT/Monitoring
|
||||
```bash
|
||||
# Low-resource, always-on containers
|
||||
var_cpu=2
|
||||
var_ram=512
|
||||
var_disk=10
|
||||
var_unprivileged=1
|
||||
var_nesting=0
|
||||
var_fuse=0
|
||||
var_tun=0
|
||||
var_tags=iot,monitoring
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### "App Defaults not available" Message
|
||||
|
||||
**Problem**: You want to use App Defaults, but option says they're not available
|
||||
|
||||
**Solution**:
|
||||
1. You haven't created App Defaults yet for this app
|
||||
2. Run the app with "Advanced Settings"
|
||||
3. When finished, save as App Defaults
|
||||
4. Next time, App Defaults will be available
|
||||
|
||||
---
|
||||
|
||||
### "Settings not being applied"
|
||||
|
||||
**Problem**: You saved defaults, but they're not being used
|
||||
|
||||
**Checklist**:
|
||||
```bash
|
||||
# 1. Verify files exist
|
||||
ls -la /usr/local/community-scripts/default.vars
|
||||
ls -la /usr/local/community-scripts/defaults/<app>.vars
|
||||
|
||||
# 2. Check file permissions (should be readable)
|
||||
stat /usr/local/community-scripts/default.vars
|
||||
|
||||
# 3. Verify correct mode selected
|
||||
# (Make sure you selected "User Defaults" or "App Defaults")
|
||||
|
||||
# 4. Check for environment variable override
|
||||
env | grep var_
|
||||
# If you have var_* set in environment,
|
||||
# those override your saved defaults
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### "Cannot write to defaults location"
|
||||
|
||||
**Problem**: Permission denied when saving defaults
|
||||
|
||||
**Solution**:
|
||||
```bash
|
||||
# Create the defaults directory if missing
|
||||
sudo mkdir -p /usr/local/community-scripts/defaults
|
||||
|
||||
# Fix permissions
|
||||
sudo chmod 755 /usr/local/community-scripts
|
||||
sudo chmod 755 /usr/local/community-scripts/defaults
|
||||
|
||||
# Make sure you're running as root
|
||||
sudo bash pihole-install.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### "Defaults directory doesn't exist"
|
||||
|
||||
**Problem**: Script can't find where to save defaults
|
||||
|
||||
**Solution**:
|
||||
```bash
|
||||
# Create the directory
|
||||
sudo mkdir -p /usr/local/community-scripts/defaults
|
||||
|
||||
# Verify
|
||||
ls -la /usr/local/community-scripts/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Settings seem random or wrong
|
||||
|
||||
**Problem**: Container gets different settings than expected
|
||||
|
||||
**Possible Causes & Solutions**:
|
||||
|
||||
```bash
|
||||
# 1. Check if environment variables are set
|
||||
env | grep var_
|
||||
# If you see var_* entries, those override your defaults
|
||||
# Clear them: unset var_cpu var_ram (etc)
|
||||
|
||||
# 2. Verify correct defaults are in files
|
||||
cat /usr/local/community-scripts/default.vars
|
||||
cat /usr/local/community-scripts/defaults/pihole.vars
|
||||
|
||||
# 3. Check which mode you actually selected
|
||||
# (Script output shows which defaults were applied)
|
||||
|
||||
# 4. Check Proxmox logs for errors
|
||||
sudo journalctl -u pve-daemon -n 50
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### "Variable not recognized"
|
||||
|
||||
**Problem**: You set a variable that doesn't work
|
||||
|
||||
**Solution**:
|
||||
Only certain variables are allowed (security whitelist):
|
||||
|
||||
```
|
||||
Allowed variables (starting with var_):
|
||||
✓ var_cpu, var_ram, var_disk, var_unprivileged
|
||||
✓ var_brg, var_gateway, var_mtu, var_vlan, var_net
|
||||
✓ var_hostname, var_pw, var_timezone
|
||||
✓ var_ssh, var_ssh_authorized_key
|
||||
✓ var_fuse, var_tun, var_nesting, var_keyctl
|
||||
✓ var_container_storage, var_template_storage
|
||||
✓ var_tags, var_verbose
|
||||
✓ var_apt_cacher, var_apt_cacher_ip
|
||||
✓ var_protection, var_mount_fs
|
||||
|
||||
✗ Other variables are NOT supported
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Best Practices
|
||||
|
||||
### ✅ Do's
|
||||
|
||||
✓ Use **App Defaults** when you want app-specific settings
|
||||
✓ Use **User Defaults** for your global preferences
|
||||
✓ Edit defaults files directly with `nano` (safe)
|
||||
✓ Keep separate App Defaults for each app
|
||||
✓ Back up your defaults regularly
|
||||
✓ Use environment variables for temporary overrides
|
||||
|
||||
### ❌ Don'ts
|
||||
|
||||
✗ Don't use `source` on defaults files (security risk)
|
||||
✗ Don't put sensitive passwords in defaults (use SSH keys)
|
||||
✗ Don't modify defaults while installation is running
|
||||
✗ Don't delete defaults.d while containers are being created
|
||||
✗ Don't use special characters without escaping
|
||||
|
||||
---
|
||||
|
||||
## Quick Reference
|
||||
|
||||
### Defaults Locations
|
||||
|
||||
| Type | Location | Example |
|
||||
|------|----------|---------|
|
||||
| User Defaults | `/usr/local/community-scripts/default.vars` | Global settings |
|
||||
| App Defaults | `/usr/local/community-scripts/defaults/<app>.vars` | PiHole-specific |
|
||||
| Backup Dir | `/usr/local/community-scripts/defaults/` | All app defaults |
|
||||
|
||||
### File Format
|
||||
|
||||
```bash
|
||||
# Comments start with #
|
||||
var_name=value
|
||||
|
||||
# No spaces around =
|
||||
✓ var_cpu=4
|
||||
✗ var_cpu = 4
|
||||
|
||||
# String values don't need quotes
|
||||
✓ var_hostname=mycontainer
|
||||
✓ var_hostname='mycontainer'
|
||||
|
||||
# Values with spaces need quotes
|
||||
✓ var_tags="docker,production,testing"
|
||||
✗ var_tags=docker,production,testing
|
||||
```
|
||||
|
||||
### Command Reference
|
||||
|
||||
```bash
|
||||
# View defaults
|
||||
cat /usr/local/community-scripts/default.vars
|
||||
|
||||
# Edit defaults
|
||||
sudo nano /usr/local/community-scripts/default.vars
|
||||
|
||||
# List all app defaults
|
||||
ls /usr/local/community-scripts/defaults/
|
||||
|
||||
# Backup your defaults
|
||||
cp -r /usr/local/community-scripts/defaults/ ~/defaults-backup/
|
||||
|
||||
# Set temporary override
|
||||
export var_cpu=8
|
||||
bash pihole-install.sh
|
||||
|
||||
# Create custom defaults
|
||||
sudo tee /usr/local/community-scripts/defaults/custom.vars << 'EOF'
|
||||
var_cpu=4
|
||||
var_ram=2048
|
||||
EOF
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Getting Help
|
||||
|
||||
### Need More Information?
|
||||
|
||||
- 📖 [Main Documentation](../../docs/)
|
||||
- 🐛 [Report Issues](https://github.com/community-scripts/ProxmoxVE/issues)
|
||||
- 💬 [Discussions](https://github.com/community-scripts/ProxmoxVE/discussions)
|
||||
|
||||
### Useful Commands
|
||||
|
||||
```bash
|
||||
# Check what variables are available
|
||||
grep "var_" /path/to/app-install.sh | head -20
|
||||
|
||||
# Verify defaults syntax
|
||||
cat /usr/local/community-scripts/default.vars
|
||||
|
||||
# Monitor installation with defaults
|
||||
bash pihole-install.sh 2>&1 | tee installation.log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Document Information
|
||||
|
||||
| Field | Value |
|
||||
|-------|-------|
|
||||
| Version | 1.0 |
|
||||
| Last Updated | November 28, 2025 |
|
||||
| Status | Current |
|
||||
| License | MIT |
|
||||
|
||||
---
|
||||
|
||||
**Happy configuring! 🚀**
|
||||
58
docs/guides/README.md
Normal file
58
docs/guides/README.md
Normal file
@ -0,0 +1,58 @@
|
||||
# Configuration & Deployment Guides
|
||||
|
||||
This directory contains comprehensive guides for configuring and deploying Proxmox VE containers using community-scripts.
|
||||
|
||||
## 📚 Available Guides
|
||||
|
||||
### [Configuration Reference](CONFIGURATION_REFERENCE.md)
|
||||
|
||||
Complete reference for all configuration options, environment variables, and advanced settings available in the build system.
|
||||
|
||||
**Topics covered:**
|
||||
|
||||
- Container specifications (CPU, RAM, Disk)
|
||||
- Network configuration (IPv4/IPv6, VLAN, MTU)
|
||||
- Storage selection and management
|
||||
- Privilege modes and features
|
||||
- OS selection and versions
|
||||
|
||||
### [Defaults System Guide](DEFAULTS_SYSTEM_GUIDE.md)
|
||||
|
||||
Understanding and customizing default settings for container deployments.
|
||||
|
||||
**Topics covered:**
|
||||
|
||||
- Default system settings
|
||||
- Per-script overrides
|
||||
- Custom defaults configuration
|
||||
- Environment variable precedence
|
||||
|
||||
### [Unattended Deployments](UNATTENDED_DEPLOYMENTS.md)
|
||||
|
||||
Automating container deployments without user interaction.
|
||||
|
||||
**Topics covered:**
|
||||
|
||||
- Environment variable configuration
|
||||
- Batch deployments
|
||||
- CI/CD integration
|
||||
- Scripted installations
|
||||
- Pre-configured templates
|
||||
|
||||
## 🔗 Related Documentation
|
||||
|
||||
- **[CT Scripts Guide](../ct/)** - Container script structure and usage
|
||||
- **[Install Scripts Guide](../install/)** - Installation script internals
|
||||
- **[API Documentation](../api/)** - API integration and endpoints
|
||||
- **[Build Functions](../misc/build.func/)** - Build system functions reference
|
||||
- **[Tools Functions](../misc/tools.func/)** - Utility functions reference
|
||||
|
||||
## 💡 Quick Start
|
||||
|
||||
For most users, start with the **Unattended Deployments** guide to learn how to automate your container setups.
|
||||
|
||||
For advanced configuration options, refer to the **Configuration Reference**.
|
||||
|
||||
## 🤝 Contributing
|
||||
|
||||
If you'd like to improve these guides or add new ones, please see our [Contribution Guide](../contribution/).
|
||||
963
docs/guides/UNATTENDED_DEPLOYMENTS.md
Normal file
963
docs/guides/UNATTENDED_DEPLOYMENTS.md
Normal file
@ -0,0 +1,963 @@
|
||||
# Unattended Deployments Guide
|
||||
|
||||
Complete guide for automated, zero-interaction container deployments using community-scripts for Proxmox VE.
|
||||
|
||||
---
|
||||
|
||||
## 🎯 What You'll Learn
|
||||
|
||||
This comprehensive guide covers:
|
||||
- ✅ Complete automation of container deployments
|
||||
- ✅ Zero-interaction installations
|
||||
- ✅ Batch deployments (multiple containers)
|
||||
- ✅ Infrastructure as Code (Ansible, Terraform)
|
||||
- ✅ CI/CD pipeline integration
|
||||
- ✅ Error handling and rollback strategies
|
||||
- ✅ Production-ready deployment scripts
|
||||
- ✅ Security best practices
|
||||
|
||||
---
|
||||
|
||||
## Table of Contents
|
||||
|
||||
1. [Overview](#overview)
|
||||
2. [Prerequisites](#prerequisites)
|
||||
3. [Deployment Methods](#deployment-methods)
|
||||
4. [Single Container Deployment](#single-container-deployment)
|
||||
5. [Batch Deployments](#batch-deployments)
|
||||
6. [Infrastructure as Code](#infrastructure-as-code)
|
||||
7. [CI/CD Integration](#cicd-integration)
|
||||
8. [Error Handling](#error-handling)
|
||||
9. [Security Considerations](#security-considerations)
|
||||
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
Unattended deployments allow you to:
|
||||
- ✅ Deploy containers without manual interaction
|
||||
- ✅ Automate infrastructure provisioning
|
||||
- ✅ Integrate with CI/CD pipelines
|
||||
- ✅ Maintain consistent configurations
|
||||
- ✅ Scale deployments across multiple nodes
|
||||
|
||||
---
|
||||
|
||||
## Prerequisites
|
||||
|
||||
### 1. Proxmox VE Access
|
||||
```bash
|
||||
# Verify you have root access
|
||||
whoami # Should return: root
|
||||
|
||||
# Check Proxmox version (8.0+ or 9.0-9.1 required)
|
||||
pveversion
|
||||
```
|
||||
|
||||
### 2. Network Connectivity
|
||||
```bash
|
||||
# Test GitHub access
|
||||
curl -I https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/debian.sh
|
||||
|
||||
# Test internet connectivity
|
||||
ping -c 1 1.1.1.1
|
||||
```
|
||||
|
||||
### 3. Storage Available
|
||||
```bash
|
||||
# List available storage
|
||||
pvesm status
|
||||
|
||||
# Check free space
|
||||
df -h
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Deployment Methods
|
||||
|
||||
### Method Comparison
|
||||
|
||||
| Method | Use Case | Complexity | Flexibility |
|
||||
|--------|----------|------------|-------------|
|
||||
| **Environment Variables** | Quick one-offs | Low | High |
|
||||
| **App Defaults** | Repeat deployments | Low | Medium |
|
||||
| **Shell Scripts** | Batch operations | Medium | High |
|
||||
| **Ansible** | Infrastructure as Code | High | Very High |
|
||||
| **Terraform** | Cloud-native IaC | High | Very High |
|
||||
|
||||
---
|
||||
|
||||
## Single Container Deployment
|
||||
|
||||
### Basic Unattended Deployment
|
||||
|
||||
**Simplest form:**
|
||||
```bash
|
||||
var_hostname=myserver bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/debian.sh)"
|
||||
```
|
||||
|
||||
### Complete Configuration Example
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# deploy-single.sh - Deploy a single container with full configuration
|
||||
|
||||
var_unprivileged=1 \
|
||||
var_cpu=4 \
|
||||
var_ram=4096 \
|
||||
var_disk=30 \
|
||||
var_hostname=production-app \
|
||||
var_brg=vmbr0 \
|
||||
var_net=dhcp \
|
||||
var_ipv6_method=none \
|
||||
var_ssh=yes \
|
||||
var_ssh_authorized_key="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ... admin@workstation" \
|
||||
var_nesting=1 \
|
||||
var_tags=production,automated \
|
||||
var_protection=yes \
|
||||
var_verbose=no \
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/debian.sh)"
|
||||
|
||||
echo "✓ Container deployed successfully"
|
||||
```
|
||||
|
||||
### Using App Defaults
|
||||
|
||||
**Step 1: Create defaults once (interactive)**
|
||||
```bash
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/pihole.sh)"
|
||||
# Select "Advanced Settings" → Configure → Save as "App Defaults"
|
||||
```
|
||||
|
||||
**Step 2: Deploy unattended (uses saved defaults)**
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# deploy-with-defaults.sh
|
||||
|
||||
# App defaults are loaded automatically
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/pihole.sh)"
|
||||
# Script will use /usr/local/community-scripts/defaults/pihole.vars
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Batch Deployments
|
||||
|
||||
### Deploy Multiple Containers
|
||||
|
||||
#### Simple Loop
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# batch-deploy-simple.sh
|
||||
|
||||
apps=("debian" "ubuntu" "alpine")
|
||||
|
||||
for app in "${apps[@]}"; do
|
||||
echo "Deploying $app..."
|
||||
var_hostname="$app-container" \
|
||||
var_cpu=2 \
|
||||
var_ram=2048 \
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/${app}.sh)"
|
||||
|
||||
echo "✓ $app deployed"
|
||||
sleep 5 # Wait between deployments
|
||||
done
|
||||
```
|
||||
|
||||
#### Advanced with Configuration Array
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# batch-deploy-advanced.sh - Deploy multiple containers with individual configs
|
||||
|
||||
declare -A CONTAINERS=(
|
||||
["pihole"]="2:1024:8:vmbr0:dns,network"
|
||||
["homeassistant"]="4:4096:20:vmbr0:automation,ha"
|
||||
["docker"]="6:8192:50:vmbr1:containers,docker"
|
||||
["nginx"]="2:2048:10:vmbr0:webserver,proxy"
|
||||
)
|
||||
|
||||
for app in "${!CONTAINERS[@]}"; do
|
||||
# Parse configuration
|
||||
IFS=':' read -r cpu ram disk bridge tags <<< "${CONTAINERS[$app]}"
|
||||
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "Deploying: $app"
|
||||
echo " CPU: $cpu cores"
|
||||
echo " RAM: $ram MB"
|
||||
echo " Disk: $disk GB"
|
||||
echo " Bridge: $bridge"
|
||||
echo " Tags: $tags"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
|
||||
# Deploy container
|
||||
var_unprivileged=1 \
|
||||
var_cpu="$cpu" \
|
||||
var_ram="$ram" \
|
||||
var_disk="$disk" \
|
||||
var_hostname="$app" \
|
||||
var_brg="$bridge" \
|
||||
var_net=dhcp \
|
||||
var_ipv6_method=none \
|
||||
var_ssh=yes \
|
||||
var_tags="$tags,automated" \
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/${app}.sh)" 2>&1 | tee "deploy-${app}.log"
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "✓ $app deployed successfully"
|
||||
else
|
||||
echo "✗ $app deployment failed - check deploy-${app}.log"
|
||||
fi
|
||||
|
||||
sleep 5
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "Batch deployment complete!"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
```
|
||||
|
||||
#### Parallel Deployment
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# parallel-deploy.sh - Deploy multiple containers in parallel
|
||||
|
||||
deploy_container() {
|
||||
local app="$1"
|
||||
local cpu="$2"
|
||||
local ram="$3"
|
||||
local disk="$4"
|
||||
|
||||
echo "[$app] Starting deployment..."
|
||||
var_cpu="$cpu" \
|
||||
var_ram="$ram" \
|
||||
var_disk="$disk" \
|
||||
var_hostname="$app" \
|
||||
var_net=dhcp \
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/${app}.sh)" \
|
||||
&> "deploy-${app}.log"
|
||||
|
||||
echo "[$app] ✓ Completed"
|
||||
}
|
||||
|
||||
# Export function for parallel execution
|
||||
export -f deploy_container
|
||||
|
||||
# Deploy in parallel (max 3 at a time)
|
||||
parallel -j 3 deploy_container ::: \
|
||||
"debian 2 2048 10" \
|
||||
"ubuntu 2 2048 10" \
|
||||
"alpine 1 1024 5" \
|
||||
"pihole 2 1024 8" \
|
||||
"docker 4 4096 30"
|
||||
|
||||
echo "All deployments complete!"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Infrastructure as Code
|
||||
|
||||
### Ansible Playbook
|
||||
|
||||
#### Basic Playbook
|
||||
|
||||
```yaml
|
||||
---
|
||||
# playbook-proxmox.yml
|
||||
- name: Deploy ProxmoxVED Containers
|
||||
hosts: proxmox_hosts
|
||||
become: yes
|
||||
tasks:
|
||||
- name: Deploy Debian Container
|
||||
shell: |
|
||||
var_unprivileged=1 \
|
||||
var_cpu=2 \
|
||||
var_ram=2048 \
|
||||
var_disk=10 \
|
||||
var_hostname=debian-{{ inventory_hostname }} \
|
||||
var_net=dhcp \
|
||||
var_ssh=yes \
|
||||
var_tags=ansible,automated \
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/debian.sh)"
|
||||
args:
|
||||
executable: /bin/bash
|
||||
register: deploy_result
|
||||
|
||||
- name: Display deployment result
|
||||
debug:
|
||||
var: deploy_result.stdout_lines
|
||||
```
|
||||
|
||||
#### Advanced Playbook with Variables
|
||||
|
||||
```yaml
|
||||
---
|
||||
# advanced-playbook.yml
|
||||
- name: Deploy Multiple Container Types
|
||||
hosts: proxmox
|
||||
vars:
|
||||
containers:
|
||||
- name: pihole
|
||||
cpu: 2
|
||||
ram: 1024
|
||||
disk: 8
|
||||
tags: "dns,network"
|
||||
- name: homeassistant
|
||||
cpu: 4
|
||||
ram: 4096
|
||||
disk: 20
|
||||
tags: "automation,ha"
|
||||
- name: docker
|
||||
cpu: 6
|
||||
ram: 8192
|
||||
disk: 50
|
||||
tags: "containers,docker"
|
||||
|
||||
ssh_key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
|
||||
|
||||
tasks:
|
||||
- name: Ensure community-scripts directory exists
|
||||
file:
|
||||
path: /usr/local/community-scripts/defaults
|
||||
state: directory
|
||||
mode: '0755'
|
||||
|
||||
- name: Deploy containers
|
||||
shell: |
|
||||
var_unprivileged=1 \
|
||||
var_cpu={{ item.cpu }} \
|
||||
var_ram={{ item.ram }} \
|
||||
var_disk={{ item.disk }} \
|
||||
var_hostname={{ item.name }} \
|
||||
var_brg=vmbr0 \
|
||||
var_net=dhcp \
|
||||
var_ipv6_method=none \
|
||||
var_ssh=yes \
|
||||
var_ssh_authorized_key="{{ ssh_key }}" \
|
||||
var_tags="{{ item.tags }},ansible" \
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/{{ item.name }}.sh)"
|
||||
args:
|
||||
executable: /bin/bash
|
||||
loop: "{{ containers }}"
|
||||
register: deployment_results
|
||||
|
||||
- name: Wait for containers to be ready
|
||||
wait_for:
|
||||
timeout: 60
|
||||
|
||||
- name: Report deployment status
|
||||
debug:
|
||||
msg: "Deployed {{ item.item.name }} - Status: {{ 'Success' if item.rc == 0 else 'Failed' }}"
|
||||
loop: "{{ deployment_results.results }}"
|
||||
```
|
||||
|
||||
Run with:
|
||||
```bash
|
||||
ansible-playbook -i inventory.ini advanced-playbook.yml
|
||||
```
|
||||
|
||||
### Terraform Integration
|
||||
|
||||
```hcl
|
||||
# main.tf - Deploy containers via Terraform
|
||||
|
||||
terraform {
|
||||
required_providers {
|
||||
proxmox = {
|
||||
source = "telmate/proxmox"
|
||||
version = "2.9.14"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
provider "proxmox" {
|
||||
pm_api_url = "https://proxmox.example.com:8006/api2/json"
|
||||
pm_api_token_id = "terraform@pam!terraform"
|
||||
pm_api_token_secret = var.proxmox_token
|
||||
}
|
||||
|
||||
resource "null_resource" "deploy_container" {
|
||||
for_each = var.containers
|
||||
|
||||
provisioner "remote-exec" {
|
||||
inline = [
|
||||
"var_unprivileged=1",
|
||||
"var_cpu=${each.value.cpu}",
|
||||
"var_ram=${each.value.ram}",
|
||||
"var_disk=${each.value.disk}",
|
||||
"var_hostname=${each.key}",
|
||||
"var_net=dhcp",
|
||||
"bash -c \"$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/${each.value.template}.sh)\""
|
||||
]
|
||||
|
||||
connection {
|
||||
type = "ssh"
|
||||
host = var.proxmox_host
|
||||
user = "root"
|
||||
private_key = file("~/.ssh/id_rsa")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
variable "containers" {
|
||||
type = map(object({
|
||||
template = string
|
||||
cpu = number
|
||||
ram = number
|
||||
disk = number
|
||||
}))
|
||||
|
||||
default = {
|
||||
"pihole" = {
|
||||
template = "pihole"
|
||||
cpu = 2
|
||||
ram = 1024
|
||||
disk = 8
|
||||
}
|
||||
"homeassistant" = {
|
||||
template = "homeassistant"
|
||||
cpu = 4
|
||||
ram = 4096
|
||||
disk = 20
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## CI/CD Integration
|
||||
|
||||
### GitHub Actions
|
||||
|
||||
```yaml
|
||||
# .github/workflows/deploy-container.yml
|
||||
name: Deploy Container to Proxmox
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
container_type:
|
||||
description: 'Container type to deploy'
|
||||
required: true
|
||||
type: choice
|
||||
options:
|
||||
- debian
|
||||
- ubuntu
|
||||
- docker
|
||||
- pihole
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Deploy to Proxmox
|
||||
uses: appleboy/ssh-action@v0.1.10
|
||||
with:
|
||||
host: ${{ secrets.PROXMOX_HOST }}
|
||||
username: root
|
||||
key: ${{ secrets.SSH_PRIVATE_KEY }}
|
||||
script: |
|
||||
var_unprivileged=1 \
|
||||
var_cpu=4 \
|
||||
var_ram=4096 \
|
||||
var_disk=30 \
|
||||
var_hostname=${{ github.event.inputs.container_type }}-ci \
|
||||
var_net=dhcp \
|
||||
var_ssh=yes \
|
||||
var_tags=ci-cd,automated \
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/${{ github.event.inputs.container_type }}.sh)"
|
||||
|
||||
- name: Notify deployment status
|
||||
if: success()
|
||||
run: echo "✓ Container deployed successfully"
|
||||
```
|
||||
|
||||
### GitLab CI
|
||||
|
||||
```yaml
|
||||
# .gitlab-ci.yml
|
||||
stages:
|
||||
- deploy
|
||||
|
||||
deploy_container:
|
||||
stage: deploy
|
||||
image: alpine:latest
|
||||
before_script:
|
||||
- apk add --no-cache openssh-client curl bash
|
||||
- eval $(ssh-agent -s)
|
||||
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
|
||||
- mkdir -p ~/.ssh
|
||||
- chmod 700 ~/.ssh
|
||||
- ssh-keyscan $PROXMOX_HOST >> ~/.ssh/known_hosts
|
||||
script:
|
||||
- |
|
||||
ssh root@$PROXMOX_HOST << 'EOF'
|
||||
var_unprivileged=1 \
|
||||
var_cpu=4 \
|
||||
var_ram=4096 \
|
||||
var_disk=30 \
|
||||
var_hostname=gitlab-ci-container \
|
||||
var_net=dhcp \
|
||||
var_tags=gitlab-ci,automated \
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/debian.sh)"
|
||||
EOF
|
||||
only:
|
||||
- main
|
||||
when: manual
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Error Handling
|
||||
|
||||
### Deployment Verification Script
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# deploy-with-verification.sh
|
||||
|
||||
APP="debian"
|
||||
HOSTNAME="production-server"
|
||||
MAX_RETRIES=3
|
||||
RETRY_COUNT=0
|
||||
|
||||
deploy_container() {
|
||||
echo "Attempting deployment (Try $((RETRY_COUNT + 1))/$MAX_RETRIES)..."
|
||||
|
||||
var_unprivileged=1 \
|
||||
var_cpu=4 \
|
||||
var_ram=4096 \
|
||||
var_disk=30 \
|
||||
var_hostname="$HOSTNAME" \
|
||||
var_net=dhcp \
|
||||
var_ssh=yes \
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/${APP}.sh)" 2>&1 | tee deploy.log
|
||||
|
||||
return ${PIPESTATUS[0]}
|
||||
}
|
||||
|
||||
verify_deployment() {
|
||||
echo "Verifying deployment..."
|
||||
|
||||
# Check if container exists
|
||||
if ! pct list | grep -q "$HOSTNAME"; then
|
||||
echo "✗ Container not found in pct list"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Check if container is running
|
||||
CTID=$(pct list | grep "$HOSTNAME" | awk '{print $1}')
|
||||
STATUS=$(pct status "$CTID" | awk '{print $2}')
|
||||
|
||||
if [ "$STATUS" != "running" ]; then
|
||||
echo "✗ Container not running (Status: $STATUS)"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Check network connectivity
|
||||
if ! pct exec "$CTID" -- ping -c 1 1.1.1.1 &>/dev/null; then
|
||||
echo "⚠ Warning: No internet connectivity"
|
||||
fi
|
||||
|
||||
echo "✓ Deployment verified successfully"
|
||||
echo " Container ID: $CTID"
|
||||
echo " Status: $STATUS"
|
||||
echo " IP: $(pct exec "$CTID" -- hostname -I)"
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# Main deployment loop with retry
|
||||
while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do
|
||||
if deploy_container; then
|
||||
if verify_deployment; then
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "✓ Deployment successful!"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
exit 0
|
||||
else
|
||||
echo "✗ Deployment verification failed"
|
||||
fi
|
||||
else
|
||||
echo "✗ Deployment failed"
|
||||
fi
|
||||
|
||||
RETRY_COUNT=$((RETRY_COUNT + 1))
|
||||
|
||||
if [ $RETRY_COUNT -lt $MAX_RETRIES ]; then
|
||||
echo "Retrying in 10 seconds..."
|
||||
sleep 10
|
||||
fi
|
||||
done
|
||||
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "✗ Deployment failed after $MAX_RETRIES attempts"
|
||||
echo "Check deploy.log for details"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
exit 1
|
||||
```
|
||||
|
||||
### Rollback on Failure
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# deploy-with-rollback.sh
|
||||
|
||||
APP="debian"
|
||||
HOSTNAME="test-server"
|
||||
SNAPSHOT_NAME="pre-deployment"
|
||||
|
||||
# Take snapshot of existing container (if exists)
|
||||
backup_existing() {
|
||||
EXISTING_CTID=$(pct list | grep "$HOSTNAME" | awk '{print $1}')
|
||||
if [ -n "$EXISTING_CTID" ]; then
|
||||
echo "Creating snapshot of existing container..."
|
||||
pct snapshot "$EXISTING_CTID" "$SNAPSHOT_NAME" --description "Pre-deployment backup"
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
# Deploy new container
|
||||
deploy() {
|
||||
var_hostname="$HOSTNAME" \
|
||||
var_cpu=4 \
|
||||
var_ram=4096 \
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/${APP}.sh)"
|
||||
return $?
|
||||
}
|
||||
|
||||
# Rollback to snapshot
|
||||
rollback() {
|
||||
local ctid="$1"
|
||||
echo "Rolling back to snapshot..."
|
||||
pct rollback "$ctid" "$SNAPSHOT_NAME"
|
||||
pct delsnapshot "$ctid" "$SNAPSHOT_NAME"
|
||||
}
|
||||
|
||||
# Main execution
|
||||
backup_existing
|
||||
HAD_BACKUP=$?
|
||||
|
||||
if deploy; then
|
||||
echo "✓ Deployment successful"
|
||||
[ $HAD_BACKUP -eq 0 ] && echo "You can remove the snapshot with: pct delsnapshot <CTID> $SNAPSHOT_NAME"
|
||||
else
|
||||
echo "✗ Deployment failed"
|
||||
if [ $HAD_BACKUP -eq 0 ]; then
|
||||
read -p "Rollback to previous version? (y/N) " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
rollback "$EXISTING_CTID"
|
||||
echo "✓ Rolled back successfully"
|
||||
fi
|
||||
fi
|
||||
exit 1
|
||||
fi
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Security Considerations
|
||||
|
||||
### Secure Deployment Script
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# secure-deploy.sh - Production-ready secure deployment
|
||||
|
||||
set -euo pipefail # Exit on error, undefined vars, pipe failures
|
||||
|
||||
# Configuration
|
||||
readonly APP="debian"
|
||||
readonly HOSTNAME="secure-server"
|
||||
readonly SSH_KEY_PATH="/root/.ssh/id_rsa.pub"
|
||||
readonly LOG_FILE="/var/log/container-deployments.log"
|
||||
|
||||
# Logging function
|
||||
log() {
|
||||
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"
|
||||
}
|
||||
|
||||
# Validate prerequisites
|
||||
validate_environment() {
|
||||
log "Validating environment..."
|
||||
|
||||
# Check if running as root
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
log "ERROR: Must run as root"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check SSH key exists
|
||||
if [ ! -f "$SSH_KEY_PATH" ]; then
|
||||
log "ERROR: SSH key not found at $SSH_KEY_PATH"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check internet connectivity
|
||||
if ! curl -s --max-time 5 https://github.com &>/dev/null; then
|
||||
log "ERROR: No internet connectivity"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log "✓ Environment validated"
|
||||
}
|
||||
|
||||
# Secure deployment
|
||||
deploy_secure() {
|
||||
log "Starting secure deployment for $HOSTNAME..."
|
||||
|
||||
SSH_KEY=$(cat "$SSH_KEY_PATH")
|
||||
|
||||
var_unprivileged=1 \
|
||||
var_cpu=4 \
|
||||
var_ram=4096 \
|
||||
var_disk=30 \
|
||||
var_hostname="$HOSTNAME" \
|
||||
var_brg=vmbr0 \
|
||||
var_net=dhcp \
|
||||
var_ipv6_method=disable \
|
||||
var_ssh=yes \
|
||||
var_ssh_authorized_key="$SSH_KEY" \
|
||||
var_nesting=0 \
|
||||
var_keyctl=0 \
|
||||
var_fuse=0 \
|
||||
var_protection=yes \
|
||||
var_tags=production,secure,automated \
|
||||
var_verbose=no \
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/${APP}.sh)" 2>&1 | tee -a "$LOG_FILE"
|
||||
|
||||
if [ ${PIPESTATUS[0]} -eq 0 ]; then
|
||||
log "✓ Deployment successful"
|
||||
return 0
|
||||
else
|
||||
log "✗ Deployment failed"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Main execution
|
||||
main() {
|
||||
validate_environment
|
||||
|
||||
if deploy_secure; then
|
||||
log "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
log "Secure deployment completed successfully"
|
||||
log "Container: $HOSTNAME"
|
||||
log "Features: Unprivileged, SSH-only, Protected"
|
||||
log "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
exit 0
|
||||
else
|
||||
log "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
log "Deployment failed - check logs at $LOG_FILE"
|
||||
log "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
main "$@"
|
||||
```
|
||||
|
||||
### SSH Key Management
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# deploy-with-ssh-keys.sh - Secure SSH key deployment
|
||||
|
||||
# Load SSH keys from multiple sources
|
||||
load_ssh_keys() {
|
||||
local keys=()
|
||||
|
||||
# Personal key
|
||||
if [ -f ~/.ssh/id_rsa.pub ]; then
|
||||
keys+=("$(cat ~/.ssh/id_rsa.pub)")
|
||||
fi
|
||||
|
||||
# Team keys
|
||||
if [ -f /etc/ssh/authorized_keys.d/team ]; then
|
||||
while IFS= read -r key; do
|
||||
[ -n "$key" ] && keys+=("$key")
|
||||
done < /etc/ssh/authorized_keys.d/team
|
||||
fi
|
||||
|
||||
# Join keys with newline
|
||||
printf "%s\n" "${keys[@]}"
|
||||
}
|
||||
|
||||
# Deploy with multiple SSH keys
|
||||
SSH_KEYS=$(load_ssh_keys)
|
||||
|
||||
var_ssh=yes \
|
||||
var_ssh_authorized_key="$SSH_KEYS" \
|
||||
var_hostname=multi-key-server \
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/debian.sh)"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Complete Production Example
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# production-deploy.sh - Complete production deployment system
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
# Configuration
|
||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
readonly LOG_DIR="/var/log/proxmox-deployments"
|
||||
readonly CONFIG_FILE="$SCRIPT_DIR/deployment-config.json"
|
||||
|
||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
# Functions
|
||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
setup_logging() {
|
||||
mkdir -p "$LOG_DIR"
|
||||
exec 1> >(tee -a "$LOG_DIR/deployment-$(date +%Y%m%d-%H%M%S).log")
|
||||
exec 2>&1
|
||||
}
|
||||
|
||||
log_info() { echo "[INFO] $(date +'%H:%M:%S') - $*"; }
|
||||
log_error() { echo "[ERROR] $(date +'%H:%M:%S') - $*" >&2; }
|
||||
log_success() { echo "[SUCCESS] $(date +'%H:%M:%S') - $*"; }
|
||||
|
||||
validate_prerequisites() {
|
||||
log_info "Validating prerequisites..."
|
||||
|
||||
[ "$EUID" -eq 0 ] || { log_error "Must run as root"; exit 1; }
|
||||
command -v jq >/dev/null 2>&1 || { log_error "jq not installed"; exit 1; }
|
||||
command -v curl >/dev/null 2>&1 || { log_error "curl not installed"; exit 1; }
|
||||
|
||||
log_success "Prerequisites validated"
|
||||
}
|
||||
|
||||
deploy_from_config() {
|
||||
local config_file="$1"
|
||||
|
||||
if [ ! -f "$config_file" ]; then
|
||||
log_error "Config file not found: $config_file"
|
||||
return 1
|
||||
fi
|
||||
|
||||
local container_count
|
||||
container_count=$(jq '.containers | length' "$config_file")
|
||||
|
||||
log_info "Deploying $container_count containers from config..."
|
||||
|
||||
for i in $(seq 0 $((container_count - 1))); do
|
||||
local name cpu ram disk app tags
|
||||
|
||||
name=$(jq -r ".containers[$i].name" "$config_file")
|
||||
cpu=$(jq -r ".containers[$i].cpu" "$config_file")
|
||||
ram=$(jq -r ".containers[$i].ram" "$config_file")
|
||||
disk=$(jq -r ".containers[$i].disk" "$config_file")
|
||||
app=$(jq -r ".containers[$i].app" "$config_file")
|
||||
tags=$(jq -r ".containers[$i].tags" "$config_file")
|
||||
|
||||
log_info "Deploying container: $name ($app)"
|
||||
|
||||
var_unprivileged=1 \
|
||||
var_cpu="$cpu" \
|
||||
var_ram="$ram" \
|
||||
var_disk="$disk" \
|
||||
var_hostname="$name" \
|
||||
var_net=dhcp \
|
||||
var_ssh=yes \
|
||||
var_tags="$tags,automated" \
|
||||
var_protection=yes \
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/${app}.sh)"
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
log_success "Deployed: $name"
|
||||
else
|
||||
log_error "Failed to deploy: $name"
|
||||
fi
|
||||
|
||||
sleep 5
|
||||
done
|
||||
}
|
||||
|
||||
generate_report() {
|
||||
log_info "Generating deployment report..."
|
||||
|
||||
echo ""
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "DEPLOYMENT REPORT"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "Time: $(date)"
|
||||
echo ""
|
||||
pct list
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
}
|
||||
|
||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
# Main
|
||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
main() {
|
||||
setup_logging
|
||||
log_info "Starting production deployment system"
|
||||
|
||||
validate_prerequisites
|
||||
deploy_from_config "$CONFIG_FILE"
|
||||
generate_report
|
||||
|
||||
log_success "Production deployment complete"
|
||||
}
|
||||
|
||||
main "$@"
|
||||
```
|
||||
|
||||
**Example config file (deployment-config.json):**
|
||||
```json
|
||||
{
|
||||
"containers": [
|
||||
{
|
||||
"name": "pihole",
|
||||
"app": "pihole",
|
||||
"cpu": 2,
|
||||
"ram": 1024,
|
||||
"disk": 8,
|
||||
"tags": "dns,network,production"
|
||||
},
|
||||
{
|
||||
"name": "homeassistant",
|
||||
"app": "homeassistant",
|
||||
"cpu": 4,
|
||||
"ram": 4096,
|
||||
"disk": 20,
|
||||
"tags": "automation,ha,production"
|
||||
},
|
||||
{
|
||||
"name": "docker-host",
|
||||
"app": "docker",
|
||||
"cpu": 8,
|
||||
"ram": 16384,
|
||||
"disk": 100,
|
||||
"tags": "containers,docker,production"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## See Also
|
||||
|
||||
- [Defaults System Guide](DEFAULTS_GUIDE.md)
|
||||
- [Configuration Reference](CONFIGURATION_REFERENCE.md)
|
||||
- [Security Best Practices](SECURITY_GUIDE.md)
|
||||
- [Network Configuration](NETWORK_GUIDE.md)
|
||||
646
docs/install/DETAILED_GUIDE.md
Normal file
646
docs/install/DETAILED_GUIDE.md
Normal file
@ -0,0 +1,646 @@
|
||||
# 🛠️ **Application Installation Scripts (install/AppName-install.sh)**
|
||||
|
||||
**Modern Guide to Writing In-Container Installation Scripts**
|
||||
|
||||
> **Updated**: December 2025
|
||||
> **Context**: Integrated with tools.func, error_handler.func, and install.func
|
||||
> **Examples Used**: `/install/pihole-install.sh`, `/install/mealie-install.sh`
|
||||
|
||||
---
|
||||
|
||||
## 📋 Table of Contents
|
||||
|
||||
- [Overview](#overview)
|
||||
- [Execution Context](#execution-context)
|
||||
- [File Structure](#file-structure)
|
||||
- [Complete Script Template](#complete-script-template)
|
||||
- [Installation Phases](#installation-phases)
|
||||
- [Function Reference](#function-reference)
|
||||
- [Best Practices](#best-practices)
|
||||
- [Real Examples](#real-examples)
|
||||
- [Troubleshooting](#troubleshooting)
|
||||
- [Contribution Checklist](#contribution-checklist)
|
||||
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
### Purpose
|
||||
|
||||
Installation scripts (`install/AppName-install.sh`) **run inside the LXC container** and are responsible for:
|
||||
|
||||
1. Setting up the container OS (updates, packages)
|
||||
2. Installing application dependencies
|
||||
3. Downloading and configuring the application
|
||||
4. Setting up services and systemd units
|
||||
5. Creating version tracking files for updates
|
||||
6. Generating credentials/configurations
|
||||
7. Final cleanup and validation
|
||||
|
||||
### Execution Flow
|
||||
|
||||
```
|
||||
ct/AppName.sh (Proxmox Host)
|
||||
↓
|
||||
build_container()
|
||||
↓
|
||||
pct exec CTID bash -c "$(cat install/AppName-install.sh)"
|
||||
↓
|
||||
install/AppName-install.sh (Inside Container)
|
||||
↓
|
||||
Container Ready with App Installed
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Execution Context
|
||||
|
||||
### Environment Variables Available
|
||||
|
||||
```bash
|
||||
# From Proxmox/Container
|
||||
CTID # Container ID (100, 101, etc.)
|
||||
PCT_OSTYPE # OS type (alpine, debian, ubuntu)
|
||||
HOSTNAME # Container hostname
|
||||
|
||||
# From build.func
|
||||
FUNCTIONS_FILE_PATH # Bash functions library (core.func + tools.func)
|
||||
VERBOSE # Verbose mode (yes/no)
|
||||
STD # Standard redirection variable (silent/empty)
|
||||
|
||||
# From install.func
|
||||
APP # Application name
|
||||
NSAPP # Normalized app name (lowercase, no spaces)
|
||||
METHOD # Installation method (ct/install)
|
||||
RANDOM_UUID # Session UUID for telemetry
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## File Structure
|
||||
|
||||
### Minimal install/AppName-install.sh Template
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash # [1] Shebang
|
||||
|
||||
# [2] Copyright/Metadata
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: YourUsername
|
||||
# License: MIT
|
||||
# Source: https://example.com
|
||||
|
||||
# [3] Load functions
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
# [4] Installation steps
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt-get install -y package1 package2
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
# [5] Final setup
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Complete Script Template
|
||||
|
||||
### Phase 1: Header & Initialization
|
||||
|
||||
```bash
|
||||
#!/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: https://github.com/application/repo
|
||||
|
||||
# Load all available functions (from core.func + tools.func)
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
# Initialize environment
|
||||
color # Setup ANSI colors and icons
|
||||
verb_ip6 # Configure IPv6 (if needed)
|
||||
catch_errors # Setup error traps
|
||||
setting_up_container # Verify OS is ready
|
||||
network_check # Verify internet connectivity
|
||||
update_os # Update packages (apk/apt)
|
||||
```
|
||||
|
||||
### Phase 2: Dependency Installation
|
||||
|
||||
```bash
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt-get install -y \
|
||||
curl \
|
||||
wget \
|
||||
git \
|
||||
nano \
|
||||
build-essential \
|
||||
libssl-dev \
|
||||
python3-dev
|
||||
msg_ok "Installed Dependencies"
|
||||
```
|
||||
|
||||
### Phase 3: Tool Setup (Using tools.func)
|
||||
|
||||
```bash
|
||||
# Setup specific tool versions
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
PHP_VERSION="8.4" setup_php
|
||||
PYTHON_VERSION="3.12" setup_uv
|
||||
```
|
||||
|
||||
### Phase 4: Application Download & Setup
|
||||
|
||||
```bash
|
||||
# Download from GitHub
|
||||
RELEASE=$(curl -fsSL https://api.github.com/repos/user/repo/releases/latest | \
|
||||
grep "tag_name" | awk '{print substr($2, 2, length($2)-3)}')
|
||||
|
||||
wget -q "https://github.com/user/repo/releases/download/v${RELEASE}/app-${RELEASE}.tar.gz"
|
||||
cd /opt
|
||||
tar -xzf app-${RELEASE}.tar.gz
|
||||
rm -f app-${RELEASE}.tar.gz
|
||||
```
|
||||
|
||||
### Phase 5: Configuration Files
|
||||
|
||||
```bash
|
||||
# Using cat << EOF (multiline)
|
||||
cat <<'EOF' >/etc/nginx/sites-available/appname
|
||||
server {
|
||||
listen 80;
|
||||
server_name _;
|
||||
root /opt/appname/public;
|
||||
index index.php index.html;
|
||||
}
|
||||
EOF
|
||||
|
||||
# Using sed for replacements
|
||||
sed -i -e "s|^DB_HOST=.*|DB_HOST=localhost|" \
|
||||
-e "s|^DB_USER=.*|DB_USER=appuser|" \
|
||||
/opt/appname/.env
|
||||
```
|
||||
|
||||
### Phase 6: Database Setup (If Needed)
|
||||
|
||||
```bash
|
||||
msg_info "Setting up Database"
|
||||
|
||||
DB_NAME="appname_db"
|
||||
DB_USER="appuser"
|
||||
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
||||
|
||||
# For MySQL/MariaDB
|
||||
mysql -u root <<EOF
|
||||
CREATE DATABASE ${DB_NAME};
|
||||
CREATE USER '${DB_USER}'@'localhost' IDENTIFIED BY '${DB_PASS}';
|
||||
GRANT ALL PRIVILEGES ON ${DB_NAME}.* TO '${DB_USER}'@'localhost';
|
||||
FLUSH PRIVILEGES;
|
||||
EOF
|
||||
|
||||
msg_ok "Database setup complete"
|
||||
```
|
||||
|
||||
### Phase 7: Permission & Ownership
|
||||
|
||||
```bash
|
||||
msg_info "Setting permissions"
|
||||
|
||||
# Web applications typically run as www-data
|
||||
chown -R www-data:www-data /opt/appname
|
||||
chmod -R 755 /opt/appname
|
||||
chmod -R 644 /opt/appname/*
|
||||
chmod 755 /opt/appname/*/.*
|
||||
|
||||
msg_ok "Permissions set"
|
||||
```
|
||||
|
||||
### Phase 8: Service Configuration
|
||||
|
||||
```bash
|
||||
# Enable systemd service
|
||||
systemctl enable -q --now appname
|
||||
|
||||
# Or for OpenRC (Alpine)
|
||||
rc-service appname start
|
||||
rc-update add appname default
|
||||
|
||||
# Verify service is running
|
||||
if systemctl is-active --quiet appname; then
|
||||
msg_ok "Service running successfully"
|
||||
else
|
||||
msg_error "Service failed to start"
|
||||
journalctl -u appname -n 20
|
||||
exit 1
|
||||
fi
|
||||
```
|
||||
|
||||
### Phase 9: Version Tracking
|
||||
|
||||
```bash
|
||||
# Essential for update detection
|
||||
echo "${RELEASE}" > /opt/${APP}_version.txt
|
||||
|
||||
# Or with additional metadata
|
||||
cat > /opt/${APP}_version.txt <<EOF
|
||||
Version: ${RELEASE}
|
||||
InstallDate: $(date)
|
||||
InstallMethod: ${METHOD}
|
||||
EOF
|
||||
```
|
||||
|
||||
### Phase 10: Final Setup & Cleanup
|
||||
|
||||
```bash
|
||||
# Display MOTD and enable autologin
|
||||
motd_ssh
|
||||
|
||||
# Final customization
|
||||
customize
|
||||
|
||||
# Clean up package manager cache
|
||||
msg_info "Cleaning up"
|
||||
apt-get -y autoremove
|
||||
apt-get -y autoclean
|
||||
msg_ok "Cleaned"
|
||||
|
||||
# Or for Alpine
|
||||
apk cache clean
|
||||
rm -rf /var/cache/apk/*
|
||||
|
||||
# System cleanup
|
||||
cleanup_lxc
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Installation Phases
|
||||
|
||||
### Phase 1: Container OS Setup
|
||||
- Network interface brought up and configured
|
||||
- Internet connectivity verified
|
||||
- Package lists updated
|
||||
- All OS packages upgraded to latest versions
|
||||
|
||||
### Phase 2: Base Dependencies
|
||||
```bash
|
||||
msg_info "Installing Base Dependencies"
|
||||
$STD apt-get install -y \
|
||||
curl wget git nano build-essential
|
||||
msg_ok "Installed Base Dependencies"
|
||||
```
|
||||
|
||||
### Phase 3: Tool Installation
|
||||
```bash
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
PHP_VERSION="8.4" setup_php
|
||||
```
|
||||
|
||||
### Phase 4: Application Setup
|
||||
```bash
|
||||
RELEASE=$(curl -fsSL https://api.github.com/repos/user/repo/releases/latest | \
|
||||
grep "tag_name" | awk '{print substr($2, 2, length($2)-3)}')
|
||||
wget -q "https://github.com/user/repo/releases/download/v${RELEASE}/app.tar.gz"
|
||||
```
|
||||
|
||||
### Phase 5: Configuration
|
||||
Application-specific configuration files and environment setup
|
||||
|
||||
### Phase 6: Service Registration
|
||||
Enable and verify systemd services are running
|
||||
|
||||
---
|
||||
|
||||
## Function Reference
|
||||
|
||||
### Core Messaging Functions
|
||||
|
||||
#### `msg_info(message)`
|
||||
|
||||
Displays an info message with spinner animation
|
||||
|
||||
```bash
|
||||
msg_info "Installing application"
|
||||
# Output: ⏳ Installing application (with spinning animation)
|
||||
```
|
||||
|
||||
#### `msg_ok(message)`
|
||||
|
||||
Displays success message with checkmark
|
||||
|
||||
```bash
|
||||
msg_ok "Installation completed"
|
||||
# Output: ✔️ Installation completed
|
||||
```
|
||||
|
||||
#### `msg_error(message)`
|
||||
|
||||
Displays error message and exits
|
||||
|
||||
```bash
|
||||
msg_error "Installation failed"
|
||||
# Output: ✖️ Installation failed
|
||||
```
|
||||
|
||||
### Package Management
|
||||
|
||||
#### `$STD` Variable
|
||||
|
||||
Controls output verbosity
|
||||
|
||||
```bash
|
||||
# Silent mode (respects VERBOSE setting)
|
||||
$STD apt-get install -y nginx
|
||||
```
|
||||
|
||||
#### `update_os()`
|
||||
|
||||
Updates OS packages
|
||||
|
||||
```bash
|
||||
update_os
|
||||
# Runs: apt update && apt upgrade
|
||||
```
|
||||
|
||||
### Tool Installation Functions
|
||||
|
||||
#### `setup_nodejs()`
|
||||
|
||||
Installs Node.js with optional global modules
|
||||
|
||||
```bash
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
NODE_VERSION="22" NODE_MODULE="yarn,@vue/cli" setup_nodejs
|
||||
```
|
||||
|
||||
#### `setup_php()`
|
||||
|
||||
Installs PHP with optional extensions
|
||||
|
||||
```bash
|
||||
PHP_VERSION="8.4" PHP_MODULE="bcmath,curl,gd,intl,redis" setup_php
|
||||
```
|
||||
|
||||
#### Other Tools
|
||||
|
||||
```bash
|
||||
setup_mariadb # MariaDB database
|
||||
setup_mysql # MySQL database
|
||||
setup_postgresql # PostgreSQL
|
||||
setup_docker # Docker Engine
|
||||
setup_composer # PHP Composer
|
||||
setup_python # Python 3
|
||||
setup_ruby # Ruby
|
||||
setup_rust # Rust
|
||||
```
|
||||
|
||||
### Cleanup Functions
|
||||
|
||||
#### `cleanup_lxc()`
|
||||
|
||||
Comprehensive container cleanup
|
||||
|
||||
- Removes package manager caches
|
||||
- Cleans temporary files
|
||||
- Clears language package caches
|
||||
- Removes systemd journal logs
|
||||
|
||||
```bash
|
||||
cleanup_lxc
|
||||
# Output: ⏳ Cleaning up
|
||||
# ✔️ Cleaned
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Best Practices
|
||||
|
||||
### ✅ DO:
|
||||
|
||||
1. **Always Use $STD for Commands**
|
||||
```bash
|
||||
# ✅ Good: Respects VERBOSE setting
|
||||
$STD apt-get install -y nginx
|
||||
```
|
||||
|
||||
2. **Generate Random Passwords Safely**
|
||||
```bash
|
||||
# ✅ Good: Alphanumeric only
|
||||
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
||||
```
|
||||
|
||||
3. **Check Command Success**
|
||||
```bash
|
||||
# ✅ Good: Verify success
|
||||
if ! wget -q "https://example.com/file.tar.gz"; then
|
||||
msg_error "Download failed"
|
||||
exit 1
|
||||
fi
|
||||
```
|
||||
|
||||
4. **Set Proper Permissions**
|
||||
```bash
|
||||
# ✅ Good: Explicit permissions
|
||||
chown -R www-data:www-data /opt/appname
|
||||
chmod -R 755 /opt/appname
|
||||
```
|
||||
|
||||
5. **Save Version for Update Checks**
|
||||
```bash
|
||||
# ✅ Good: Version tracked
|
||||
echo "${RELEASE}" > /opt/${APP}_version.txt
|
||||
```
|
||||
|
||||
6. **Handle Alpine vs Debian Differences**
|
||||
```bash
|
||||
# ✅ Good: Detect OS
|
||||
if grep -qi 'alpine' /etc/os-release; then
|
||||
apk add package
|
||||
else
|
||||
apt-get install -y package
|
||||
fi
|
||||
```
|
||||
|
||||
### ❌ DON'T:
|
||||
|
||||
1. **Hardcode Versions**
|
||||
```bash
|
||||
# ❌ Bad: Won't auto-update
|
||||
wget https://example.com/app-1.2.3.tar.gz
|
||||
```
|
||||
|
||||
2. **Use Root Without Password**
|
||||
```bash
|
||||
# ❌ Bad: Security risk
|
||||
mysql -u root
|
||||
```
|
||||
|
||||
3. **Forget Error Handling**
|
||||
```bash
|
||||
# ❌ Bad: Silent failures
|
||||
wget https://example.com/file
|
||||
tar -xzf file
|
||||
```
|
||||
|
||||
4. **Leave Temporary Files**
|
||||
```bash
|
||||
# ✅ Always cleanup
|
||||
rm -rf /opt/app-${RELEASE}.tar.gz
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Real Examples
|
||||
|
||||
### Example 1: Node.js Application
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
color
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Node.js"
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
msg_ok "Node.js installed"
|
||||
|
||||
msg_info "Installing Application"
|
||||
cd /opt
|
||||
RELEASE=$(curl -fsSL https://api.github.com/repos/user/repo/releases/latest | \
|
||||
grep "tag_name" | awk '{print substr($2, 2, length($2)-3)}')
|
||||
wget -q "https://github.com/user/repo/releases/download/v${RELEASE}/app.tar.gz"
|
||||
tar -xzf app.tar.gz
|
||||
echo "${RELEASE}" > /opt/app_version.txt
|
||||
msg_ok "Application installed"
|
||||
|
||||
systemctl enable --now app
|
||||
cleanup_lxc
|
||||
```
|
||||
|
||||
### Example 2: PHP Application with Database
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
color
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
PHP_VERSION="8.4" PHP_MODULE="bcmath,curl,pdo_mysql" setup_php
|
||||
MARIADB_VERSION="11.4" setup_mariadb
|
||||
|
||||
# Database setup
|
||||
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
||||
mysql -u root <<EOF
|
||||
CREATE DATABASE appdb;
|
||||
CREATE USER 'appuser'@'localhost' IDENTIFIED BY '${DB_PASS}';
|
||||
GRANT ALL ON appdb.* TO 'appuser'@'localhost';
|
||||
FLUSH PRIVILEGES;
|
||||
EOF
|
||||
|
||||
# App installation
|
||||
cd /opt
|
||||
wget -q https://github.com/user/repo/releases/latest/download/app.tar.gz
|
||||
tar -xzf app.tar.gz
|
||||
|
||||
# Configuration
|
||||
cat > /opt/app/.env <<EOF
|
||||
DB_HOST=localhost
|
||||
DB_NAME=appdb
|
||||
DB_USER=appuser
|
||||
DB_PASS=${DB_PASS}
|
||||
EOF
|
||||
|
||||
chown -R www-data:www-data /opt/app
|
||||
systemctl enable --now php-fpm
|
||||
cleanup_lxc
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Installation Hangs
|
||||
|
||||
**Check internet connectivity**:
|
||||
```bash
|
||||
ping -c 1 8.8.8.8
|
||||
```
|
||||
|
||||
**Enable verbose mode**:
|
||||
```bash
|
||||
# In ct/AppName.sh, before running
|
||||
VERBOSE="yes" bash install/AppName-install.sh
|
||||
```
|
||||
|
||||
### Package Not Found
|
||||
|
||||
**Update package lists**:
|
||||
```bash
|
||||
apt update
|
||||
apt-cache search package_name
|
||||
```
|
||||
|
||||
### Service Won't Start
|
||||
|
||||
**Check logs**:
|
||||
```bash
|
||||
journalctl -u appname -n 50
|
||||
systemctl status appname
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Contribution Checklist
|
||||
|
||||
Before submitting a PR:
|
||||
|
||||
### Structure
|
||||
- [ ] Shebang is `#!/usr/bin/env bash`
|
||||
- [ ] Loads functions from `$FUNCTIONS_FILE_PATH`
|
||||
- [ ] Copyright header with author
|
||||
- [ ] Clear phase comments
|
||||
|
||||
### Installation
|
||||
- [ ] `setting_up_container` called early
|
||||
- [ ] `network_check` before downloads
|
||||
- [ ] `update_os` before package installation
|
||||
- [ ] All errors checked properly
|
||||
|
||||
### Functions
|
||||
- [ ] Uses `msg_info/msg_ok/msg_error` for status
|
||||
- [ ] Uses `$STD` for command output silencing
|
||||
- [ ] Version saved to `/opt/${APP}_version.txt`
|
||||
- [ ] Proper permissions set
|
||||
|
||||
### Cleanup
|
||||
- [ ] `motd_ssh` called for final setup
|
||||
- [ ] `customize` called for options
|
||||
- [ ] `cleanup_lxc` called at end
|
||||
|
||||
### Testing
|
||||
- [ ] Tested with default settings
|
||||
- [ ] Tested with advanced (19-step) mode
|
||||
- [ ] Service starts and runs correctly
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: December 2025
|
||||
**Compatibility**: ProxmoxVE with install.func v3+
|
||||
159
docs/install/README.md
Normal file
159
docs/install/README.md
Normal file
@ -0,0 +1,159 @@
|
||||
# Installation Scripts Documentation (/install)
|
||||
|
||||
This directory contains comprehensive documentation for installation scripts in the `/install` directory.
|
||||
|
||||
## Overview
|
||||
|
||||
Installation scripts (`install/*.sh`) run inside LXC containers and handle application-specific setup, configuration, and deployment.
|
||||
|
||||
## Documentation Structure
|
||||
|
||||
Each installation script category has documentation following the project pattern.
|
||||
|
||||
## Key Resources
|
||||
|
||||
- **[DETAILED_GUIDE.md](DETAILED_GUIDE.md)** - Complete reference for creating install scripts
|
||||
- **[../contribution/README.md](../contribution/README.md)** - How to contribute
|
||||
- **[../misc/install.func/](../misc/install.func/)** - Installation workflow documentation
|
||||
- **[../misc/tools.func/](../misc/tools.func/)** - Package installation documentation
|
||||
|
||||
## Installation Script Flow
|
||||
|
||||
```
|
||||
install/appname-install.sh (container-side)
|
||||
│
|
||||
├─ Sources: $FUNCTIONS_FILE_PATH
|
||||
│ ├─ core.func (messaging)
|
||||
│ ├─ error_handler.func (error handling)
|
||||
│ ├─ install.func (setup)
|
||||
│ └─ tools.func (packages & tools)
|
||||
│
|
||||
├─ 10-Phase Installation:
|
||||
│ 1. OS Setup
|
||||
│ 2. Base Dependencies
|
||||
│ 3. Tool Setup
|
||||
│ 4. Application Download
|
||||
│ 5. Configuration
|
||||
│ 6. Database Setup
|
||||
│ 7. Permissions
|
||||
│ 8. Services
|
||||
│ 9. Version Tracking
|
||||
│ 10. Final Cleanup
|
||||
│
|
||||
└─ Result: Application ready
|
||||
```
|
||||
|
||||
## Available Installation Scripts
|
||||
|
||||
See `/install` directory for all installation scripts. Examples:
|
||||
|
||||
- `pihole-install.sh` - Pi-hole installation
|
||||
- `docker-install.sh` - Docker installation
|
||||
- `wallabag-install.sh` - Wallabag setup
|
||||
- `nextcloud-install.sh` - Nextcloud deployment
|
||||
- `debian-install.sh` - Base Debian setup
|
||||
- And 30+ more...
|
||||
|
||||
## Quick Start
|
||||
|
||||
To understand how to create an installation script:
|
||||
|
||||
1. Read: [UPDATED_APP-install.md](../UPDATED_APP-install.md)
|
||||
2. Study: A similar existing script in `/install`
|
||||
3. Copy template and customize
|
||||
4. Test in container
|
||||
5. Submit PR
|
||||
|
||||
## 10-Phase Installation Pattern
|
||||
|
||||
Every installation script follows this structure:
|
||||
|
||||
### Phase 1: OS Setup
|
||||
```bash
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
```
|
||||
|
||||
### Phase 2: Base Dependencies
|
||||
```bash
|
||||
pkg_update
|
||||
pkg_install curl wget git
|
||||
```
|
||||
|
||||
### Phase 3: Tool Setup
|
||||
```bash
|
||||
setup_nodejs "20"
|
||||
setup_php "8.3"
|
||||
setup_mariadb "11"
|
||||
```
|
||||
|
||||
### Phase 4: Application Download
|
||||
```bash
|
||||
git clone https://github.com/user/app /opt/app
|
||||
cd /opt/app
|
||||
```
|
||||
|
||||
### Phase 5: Configuration
|
||||
```bash
|
||||
# Create .env files, config files, etc.
|
||||
cat > .env <<EOF
|
||||
SETTING=value
|
||||
EOF
|
||||
```
|
||||
|
||||
### Phase 6: Database Setup
|
||||
```bash
|
||||
# Create databases, users, etc.
|
||||
mysql -e "CREATE DATABASE appdb"
|
||||
```
|
||||
|
||||
### Phase 7: Permissions
|
||||
```bash
|
||||
chown -R appuser:appgroup /opt/app
|
||||
chmod -R 755 /opt/app
|
||||
```
|
||||
|
||||
### Phase 8: Services
|
||||
```bash
|
||||
systemctl enable app
|
||||
systemctl start app
|
||||
```
|
||||
|
||||
### Phase 9: Version Tracking
|
||||
```bash
|
||||
echo "1.0.0" > /opt/app_version.txt
|
||||
```
|
||||
|
||||
### Phase 10: Final Cleanup
|
||||
```bash
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
```
|
||||
|
||||
## Contributing an Installation Script
|
||||
|
||||
1. Create `ct/myapp.sh` (host script)
|
||||
2. Create `install/myapp-install.sh` (container script)
|
||||
3. Follow 10-phase pattern in [UPDATED_APP-install.md](../UPDATED_APP-install.md)
|
||||
4. Test in actual container
|
||||
5. Submit PR with both files
|
||||
|
||||
## Common Tasks
|
||||
|
||||
- **Create new installation script** → [UPDATED_APP-install.md](../UPDATED_APP-install.md)
|
||||
- **Install Node.js/PHP/Database** → [misc/tools.func/](../misc/tools.func/)
|
||||
- **Setup Alpine container** → [misc/alpine-install.func/](../misc/alpine-install.func/)
|
||||
- **Debug installation errors** → [EXIT_CODES.md](../EXIT_CODES.md)
|
||||
- **Use dev mode** → [DEV_MODE.md](../DEV_MODE.md)
|
||||
|
||||
## Alpine vs Debian
|
||||
|
||||
- **Debian-based** → Use `tools.func`, `install.func`, `systemctl`
|
||||
- **Alpine-based** → Use `alpine-tools.func`, `alpine-install.func`, `rc-service`
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: December 2025
|
||||
**Maintainers**: community-scripts team
|
||||
283
docs/misc/README.md
Normal file
283
docs/misc/README.md
Normal file
@ -0,0 +1,283 @@
|
||||
# Misc Documentation
|
||||
|
||||
This directory contains comprehensive documentation for all function libraries and components of the Proxmox Community Scripts project. Each section is organized as a dedicated subdirectory with detailed references, examples, and integration guides.
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ **Core Function Libraries**
|
||||
|
||||
### 📁 [build.func/](./build.func/)
|
||||
**Core LXC Container Orchestration** - Main orchestrator for Proxmox LXC container creation
|
||||
|
||||
**Contents:**
|
||||
- BUILD_FUNC_FLOWCHART.md - Visual execution flows and decision trees
|
||||
- BUILD_FUNC_ARCHITECTURE.md - System architecture and design
|
||||
- BUILD_FUNC_ENVIRONMENT_VARIABLES.md - Complete environment variable reference
|
||||
- BUILD_FUNC_FUNCTIONS_REFERENCE.md - Alphabetical function reference
|
||||
- BUILD_FUNC_EXECUTION_FLOWS.md - Detailed execution flows
|
||||
- BUILD_FUNC_USAGE_EXAMPLES.md - Practical usage examples
|
||||
- README.md - Overview and quick reference
|
||||
|
||||
**Key Functions**: `variables()`, `start()`, `build_container()`, `build_defaults()`, `advanced_settings()`
|
||||
|
||||
---
|
||||
|
||||
### 📁 [core.func/](./core.func/)
|
||||
**System Utilities & Foundation** - Essential utility functions and system checks
|
||||
|
||||
**Contents:**
|
||||
- CORE_FLOWCHART.md - Visual execution flows
|
||||
- CORE_FUNCTIONS_REFERENCE.md - Complete function reference
|
||||
- CORE_INTEGRATION.md - Integration points
|
||||
- CORE_USAGE_EXAMPLES.md - Practical examples
|
||||
- README.md - Overview and quick reference
|
||||
|
||||
**Key Functions**: `color()`, `msg_info()`, `msg_ok()`, `msg_error()`, `root_check()`, `pve_check()`, `parse_dev_mode()`
|
||||
|
||||
---
|
||||
|
||||
### 📁 [error_handler.func/](./error_handler.func/)
|
||||
**Error Handling & Signal Management** - Comprehensive error handling and signal trapping
|
||||
|
||||
**Contents:**
|
||||
- ERROR_HANDLER_FLOWCHART.md - Visual error handling flows
|
||||
- ERROR_HANDLER_FUNCTIONS_REFERENCE.md - Function reference
|
||||
- ERROR_HANDLER_INTEGRATION.md - Integration with other components
|
||||
- ERROR_HANDLER_USAGE_EXAMPLES.md - Practical examples
|
||||
- README.md - Overview and quick reference
|
||||
|
||||
**Key Functions**: `catch_errors()`, `error_handler()`, `explain_exit_code()`, `signal_handler()`
|
||||
|
||||
---
|
||||
|
||||
### 📁 [api.func/](./api.func/)
|
||||
**Proxmox API Integration** - API communication and diagnostic reporting
|
||||
|
||||
**Contents:**
|
||||
- API_FLOWCHART.md - API communication flows
|
||||
- API_FUNCTIONS_REFERENCE.md - Function reference
|
||||
- API_INTEGRATION.md - Integration points
|
||||
- API_USAGE_EXAMPLES.md - Practical examples
|
||||
- README.md - Overview and quick reference
|
||||
|
||||
**Key Functions**: `post_to_api()`, `post_update_to_api()`, `get_error_description()`
|
||||
|
||||
---
|
||||
|
||||
## 📦 **Installation & Setup Function Libraries**
|
||||
|
||||
### 📁 [install.func/](./install.func/)
|
||||
**Container Installation Workflow** - Installation orchestration for container-internal setup
|
||||
|
||||
**Contents:**
|
||||
- INSTALL_FUNC_FLOWCHART.md - Installation workflow diagrams
|
||||
- INSTALL_FUNC_FUNCTIONS_REFERENCE.md - Complete function reference
|
||||
- INSTALL_FUNC_INTEGRATION.md - Integration with build and tools
|
||||
- INSTALL_FUNC_USAGE_EXAMPLES.md - Practical examples
|
||||
- README.md - Overview and quick reference
|
||||
|
||||
**Key Functions**: `setting_up_container()`, `network_check()`, `update_os()`, `motd_ssh()`, `cleanup_lxc()`
|
||||
|
||||
---
|
||||
|
||||
### 📁 [tools.func/](./tools.func/)
|
||||
**Package & Tool Installation** - Robust package management and 30+ tool installation functions
|
||||
|
||||
**Contents:**
|
||||
- TOOLS_FUNC_FLOWCHART.md - Package management flows
|
||||
- TOOLS_FUNC_FUNCTIONS_REFERENCE.md - 30+ function reference
|
||||
- TOOLS_FUNC_INTEGRATION.md - Integration with install workflows
|
||||
- TOOLS_FUNC_USAGE_EXAMPLES.md - Practical examples
|
||||
- TOOLS_FUNC_ENVIRONMENT_VARIABLES.md - Configuration reference
|
||||
- README.md - Overview and quick reference
|
||||
|
||||
**Key Functions**: `setup_nodejs()`, `setup_php()`, `setup_mariadb()`, `setup_docker()`, `setup_deb822_repo()`, `pkg_install()`, `pkg_update()`
|
||||
|
||||
---
|
||||
|
||||
### 📁 [alpine-install.func/](./alpine-install.func/)
|
||||
**Alpine Container Setup** - Alpine Linux-specific installation functions
|
||||
|
||||
**Contents:**
|
||||
- ALPINE_INSTALL_FUNC_FLOWCHART.md - Alpine setup flows
|
||||
- ALPINE_INSTALL_FUNC_FUNCTIONS_REFERENCE.md - Function reference
|
||||
- ALPINE_INSTALL_FUNC_INTEGRATION.md - Integration points
|
||||
- ALPINE_INSTALL_FUNC_USAGE_EXAMPLES.md - Practical examples
|
||||
- README.md - Overview and quick reference
|
||||
|
||||
**Key Functions**: `update_os()` (apk version), `verb_ip6()`, `motd_ssh()` (Alpine), `customize()`
|
||||
|
||||
---
|
||||
|
||||
### 📁 [alpine-tools.func/](./alpine-tools.func/)
|
||||
**Alpine Tool Installation** - Alpine-specific package and tool installation
|
||||
|
||||
**Contents:**
|
||||
- ALPINE_TOOLS_FUNC_FLOWCHART.md - Alpine package flows
|
||||
- ALPINE_TOOLS_FUNC_FUNCTIONS_REFERENCE.md - Function reference
|
||||
- ALPINE_TOOLS_FUNC_INTEGRATION.md - Integration with Alpine workflows
|
||||
- ALPINE_TOOLS_FUNC_USAGE_EXAMPLES.md - Practical examples
|
||||
- README.md - Overview and quick reference
|
||||
|
||||
**Key Functions**: `apk_add()`, `apk_update()`, `apk_del()`, `add_community_repo()`, Alpine tool setup functions
|
||||
|
||||
---
|
||||
|
||||
### 📁 [cloud-init.func/](./cloud-init.func/)
|
||||
**VM Cloud-Init Configuration** - Cloud-init and VM provisioning functions
|
||||
|
||||
**Contents:**
|
||||
- CLOUD_INIT_FUNC_FLOWCHART.md - Cloud-init flows
|
||||
- CLOUD_INIT_FUNC_FUNCTIONS_REFERENCE.md - Function reference
|
||||
- CLOUD_INIT_FUNC_INTEGRATION.md - Integration points
|
||||
- CLOUD_INIT_FUNC_USAGE_EXAMPLES.md - Practical examples
|
||||
- README.md - Overview and quick reference
|
||||
|
||||
**Key Functions**: `generate_cloud_init()`, `generate_user_data()`, `setup_ssh_keys()`, `setup_static_ip()`
|
||||
|
||||
---
|
||||
|
||||
## 🔗 **Function Library Relationships**
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────┐
|
||||
│ Container Creation Flow │
|
||||
├─────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ ct/AppName.sh │
|
||||
│ ↓ (sources) │
|
||||
│ build.func │
|
||||
│ ├─ variables() │
|
||||
│ ├─ build_container() │
|
||||
│ └─ advanced_settings() │
|
||||
│ ↓ (calls pct create with) │
|
||||
│ install/appname-install.sh │
|
||||
│ ↓ (sources) │
|
||||
│ ├─ core.func (colors, messaging) │
|
||||
│ ├─ error_handler.func (error trapping) │
|
||||
│ ├─ install.func (setup/network) │
|
||||
│ └─ tools.func (packages/tools) │
|
||||
│ │
|
||||
└─────────────────────────────────────────────┘
|
||||
|
||||
┌─────────────────────────────────────────────┐
|
||||
│ Alpine Container Flow │
|
||||
├─────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ install/appname-install.sh (Alpine) │
|
||||
│ ↓ (sources) │
|
||||
│ ├─ core.func (colors) │
|
||||
│ ├─ error_handler.func (errors) │
|
||||
│ ├─ alpine-install.func (apk setup) │
|
||||
│ └─ alpine-tools.func (apk tools) │
|
||||
│ │
|
||||
└─────────────────────────────────────────────┘
|
||||
|
||||
┌─────────────────────────────────────────────┐
|
||||
│ VM Provisioning Flow │
|
||||
├─────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ vm/OsName-vm.sh │
|
||||
│ ↓ (uses) │
|
||||
│ cloud-init.func │
|
||||
│ ├─ generate_cloud_init() │
|
||||
│ ├─ setup_ssh_keys() │
|
||||
│ └─ configure_network() │
|
||||
│ │
|
||||
└─────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 **Documentation Quick Stats**
|
||||
|
||||
| Library | Files | Functions | Status |
|
||||
|---------|:---:|:---:|:---:|
|
||||
| build.func | 7 | 50+ | ✅ Complete |
|
||||
| core.func | 5 | 20+ | ✅ Complete |
|
||||
| error_handler.func | 5 | 10+ | ✅ Complete |
|
||||
| api.func | 5 | 5+ | ✅ Complete |
|
||||
| install.func | 5 | 8+ | ✅ Complete |
|
||||
| tools.func | 6 | 30+ | ✅ Complete |
|
||||
| alpine-install.func | 5 | 6+ | ✅ Complete |
|
||||
| alpine-tools.func | 5 | 15+ | ✅ Complete |
|
||||
| cloud-init.func | 5 | 12+ | ✅ Complete |
|
||||
|
||||
**Total**: 9 function libraries, 48 documentation files, 150+ functions
|
||||
|
||||
---
|
||||
|
||||
## 🚀 **Getting Started**
|
||||
|
||||
### For Container Creation Scripts
|
||||
Start with: **[build.func/](./build.func/)** → **[tools.func/](./tools.func/)** → **[install.func/](./install.func/)**
|
||||
|
||||
### For Alpine Containers
|
||||
Start with: **[alpine-install.func/](./alpine-install.func/)** → **[alpine-tools.func/](./alpine-tools.func/)**
|
||||
|
||||
### For VM Provisioning
|
||||
Start with: **[cloud-init.func/](./cloud-init.func/)**
|
||||
|
||||
### For Troubleshooting
|
||||
Start with: **[error_handler.func/](./error_handler.func/)** → **[EXIT_CODES.md](../EXIT_CODES.md)**
|
||||
|
||||
---
|
||||
|
||||
## 📚 **Related Top-Level Documentation**
|
||||
|
||||
- **[CONTRIBUTION_GUIDE.md](../CONTRIBUTION_GUIDE.md)** - How to contribute to ProxmoxVE
|
||||
- **[UPDATED_APP-ct.md](../UPDATED_APP-ct.md)** - Container script guide
|
||||
- **[UPDATED_APP-install.md](../UPDATED_APP-install.md)** - Installation script guide
|
||||
- **[DEFAULTS_SYSTEM_GUIDE.md](../DEFAULTS_SYSTEM_GUIDE.md)** - Configuration system
|
||||
- **[TECHNICAL_REFERENCE.md](../TECHNICAL_REFERENCE.md)** - Architecture reference
|
||||
- **[EXIT_CODES.md](../EXIT_CODES.md)** - Complete exit code reference
|
||||
- **[DEV_MODE.md](../DEV_MODE.md)** - Development debugging modes
|
||||
- **[CHANGELOG_MISC.md](../CHANGELOG_MISC.md)** - Change history
|
||||
|
||||
---
|
||||
|
||||
## 🔄 **Standardized Documentation Structure**
|
||||
|
||||
Each function library follows the same documentation pattern:
|
||||
|
||||
```
|
||||
function-library/
|
||||
├── README.md # Quick reference & overview
|
||||
├── FUNCTION_LIBRARY_FLOWCHART.md # Visual execution flows
|
||||
├── FUNCTION_LIBRARY_FUNCTIONS_REFERENCE.md # Alphabetical reference
|
||||
├── FUNCTION_LIBRARY_INTEGRATION.md # Integration points
|
||||
├── FUNCTION_LIBRARY_USAGE_EXAMPLES.md # Practical examples
|
||||
└── [FUNCTION_LIBRARY_ENVIRONMENT_VARIABLES.md] # (if applicable)
|
||||
```
|
||||
|
||||
**Advantages**:
|
||||
- ✅ Consistent navigation across all libraries
|
||||
- ✅ Quick reference sections in each README
|
||||
- ✅ Visual flowcharts for understanding
|
||||
- ✅ Complete function references
|
||||
- ✅ Real-world usage examples
|
||||
- ✅ Integration guides for connecting libraries
|
||||
|
||||
---
|
||||
|
||||
## 📝 **Documentation Standards**
|
||||
|
||||
All documentation follows these standards:
|
||||
|
||||
1. **README.md** - Quick overview, key features, quick reference
|
||||
2. **FLOWCHART.md** - ASCII flowcharts and visual diagrams
|
||||
3. **FUNCTIONS_REFERENCE.md** - Every function with full details
|
||||
4. **INTEGRATION.md** - How this library connects to others
|
||||
5. **USAGE_EXAMPLES.md** - Copy-paste ready examples
|
||||
6. **ENVIRONMENT_VARIABLES.md** - (if applicable) Configuration reference
|
||||
|
||||
---
|
||||
|
||||
## ✅ **Last Updated**: December 2025
|
||||
**Maintainers**: community-scripts team
|
||||
**License**: MIT
|
||||
**Status**: All 9 libraries fully documented and standardized
|
||||
|
||||
---
|
||||
|
||||
*This directory contains specialized documentation for specific components of the Proxmox Community Scripts project.*
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user