mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2025-11-05 02:42:50 +00:00
Compare commits
164 Commits
2025-07-17
...
2025-07-28
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c8a107e730 | ||
|
|
404b9feef2 | ||
|
|
cc6f56fec8 | ||
|
|
89ab0f162c | ||
|
|
8846915506 | ||
|
|
ecc585ebef | ||
|
|
72dcd61244 | ||
|
|
0955ec4b7f | ||
|
|
4fb5ea4ec2 | ||
|
|
7051dfeea7 | ||
|
|
253c4f4f5b | ||
|
|
69e947246a | ||
|
|
1f1bc5f12d | ||
|
|
15e3958687 | ||
|
|
7b82199a36 | ||
|
|
01631c305a | ||
|
|
bc36a60a49 | ||
|
|
d4c59caf12 | ||
|
|
bd9c778922 | ||
|
|
63d65420a9 | ||
|
|
08e451f8de | ||
|
|
b602a9d50c | ||
|
|
759239bc7c | ||
|
|
9c50105e86 | ||
|
|
7bf69cbd07 | ||
|
|
48c63aaebb | ||
|
|
ba70f9867b | ||
|
|
c4ab8f92d5 | ||
|
|
9fd1a868cb | ||
|
|
a5d540648e | ||
|
|
3676dff24e | ||
|
|
b80ad6655f | ||
|
|
1eb0099f2a | ||
|
|
759f3f8c79 | ||
|
|
33f6d698c7 | ||
|
|
7b4bab66af | ||
|
|
5322ae69c3 | ||
|
|
27426ded94 | ||
|
|
1e035c5c85 | ||
|
|
0db8e39b40 | ||
|
|
2588029d1e | ||
|
|
67973ada07 | ||
|
|
ac6cf2af7b | ||
|
|
8900d12a9d | ||
|
|
3e2d9bdd97 | ||
|
|
07da06cb75 | ||
|
|
e176779d49 | ||
|
|
44cee5f303 | ||
|
|
22ccd36e55 | ||
|
|
c688887f43 | ||
|
|
6afa25b06b | ||
|
|
02ad46585e | ||
|
|
2c57cd815b | ||
|
|
72fc8a1880 | ||
|
|
72cf24fef4 | ||
|
|
a7a6a81596 | ||
|
|
470a2593a2 | ||
|
|
7efdc02bc4 | ||
|
|
c1ebb07416 | ||
|
|
9cf83f0ef4 | ||
|
|
57a299fe03 | ||
|
|
7272c8dd50 | ||
|
|
aa9373402e | ||
|
|
ff429ded15 | ||
|
|
5b6b55d37a | ||
|
|
e8e90ce5b5 | ||
|
|
1ae40a929b | ||
|
|
0484259f39 | ||
|
|
cadd0a53bd | ||
|
|
c82c185e4e | ||
|
|
89b2b21761 | ||
|
|
0a722a242f | ||
|
|
01be7acf10 | ||
|
|
2d66d09de2 | ||
|
|
67069cfb21 | ||
|
|
e78c590772 | ||
|
|
d956763642 | ||
|
|
af4aedf15a | ||
|
|
e25f3dce52 | ||
|
|
eda1b1aea8 | ||
|
|
16e2d2206c | ||
|
|
33a03f4b0e | ||
|
|
5867ef3288 | ||
|
|
8ef59b590a | ||
|
|
72d6fb40dc | ||
|
|
7e9d786202 | ||
|
|
ed934a21ff | ||
|
|
c9015cca20 | ||
|
|
b52e958623 | ||
|
|
1f51e96cb1 | ||
|
|
de1a93bf6d | ||
|
|
8bfb78e001 | ||
|
|
4fa4ed35cc | ||
|
|
4a050f3723 | ||
|
|
9304835775 | ||
|
|
a2fa104176 | ||
|
|
3c0888abdd | ||
|
|
d6af60f0c0 | ||
|
|
0a83090ad2 | ||
|
|
035419b4b9 | ||
|
|
d19130d8f1 | ||
|
|
b36f982fc2 | ||
|
|
d67fa6cf38 | ||
|
|
4201ab58ab | ||
|
|
0f3b95b3ff | ||
|
|
feea82e0ba | ||
|
|
0e0c954f0c | ||
|
|
6b74f6247f | ||
|
|
4159ba3970 | ||
|
|
a53daa3559 | ||
|
|
4b3233d6a8 | ||
|
|
ff51b1e5dc | ||
|
|
1aab127bdf | ||
|
|
baf7dff759 | ||
|
|
b4ec04a54f | ||
|
|
2ee8269684 | ||
|
|
84860a9893 | ||
|
|
ebb7da43c1 | ||
|
|
44c584dced | ||
|
|
2bede5256f | ||
|
|
2848cf6d6b | ||
|
|
bce076161e | ||
|
|
040a15aa3e | ||
|
|
5c0cffce6f | ||
|
|
d552fb86c1 | ||
|
|
42af89dd2d | ||
|
|
003fc3c080 | ||
|
|
a638dc8672 | ||
|
|
d7668531e7 | ||
|
|
30ca65e1d5 | ||
|
|
ae84b7d281 | ||
|
|
202eed7c13 | ||
|
|
e194a36301 | ||
|
|
7b93eed34a | ||
|
|
5a3855566b | ||
|
|
85595871df | ||
|
|
901837b4ae | ||
|
|
9f1273349f | ||
|
|
e6756385ed | ||
|
|
74be3e70b9 | ||
|
|
9060e8f372 | ||
|
|
2adcf04426 | ||
|
|
88d58cd100 | ||
|
|
1046ffb544 | ||
|
|
a011b60a6e | ||
|
|
be6ac828ca | ||
|
|
a196541771 | ||
|
|
ca7564d0e5 | ||
|
|
ccdf6a4aec | ||
|
|
c2c2e4030e | ||
|
|
268d692281 | ||
|
|
3547552c23 | ||
|
|
3579c93d80 | ||
|
|
65e0ed2976 | ||
|
|
2bd9f4a7c6 | ||
|
|
f56489cb07 | ||
|
|
852bfbd71c | ||
|
|
255bd7a803 | ||
|
|
ffe774dc4c | ||
|
|
2f08a8623b | ||
|
|
1af6cc6b54 | ||
|
|
0113c7e7fd | ||
|
|
745533759a | ||
|
|
c62b244569 |
81
.github/workflows/frontend-cicd.yml
generated
vendored
81
.github/workflows/frontend-cicd.yml
generated
vendored
@@ -24,12 +24,87 @@ concurrency:
|
|||||||
cancel-in-progress: false
|
cancel-in-progress: false
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
test-json-files:
|
||||||
if: github.repository == 'community-scripts/ProxmoxVE'
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: frontend # Set default working directory for all run steps
|
working-directory: frontend
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Setup Python
|
||||||
|
uses: actions/setup-python@v4
|
||||||
|
with:
|
||||||
|
python-version: "3.x"
|
||||||
|
|
||||||
|
- name: Test JSON files
|
||||||
|
run: |
|
||||||
|
python3 << 'EOF'
|
||||||
|
import json
|
||||||
|
import glob
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
def test_json_files():
|
||||||
|
# Change to the correct directory
|
||||||
|
json_dir = "public/json"
|
||||||
|
if not os.path.exists(json_dir):
|
||||||
|
print(f"❌ Directory not found: {json_dir}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Find all JSON files
|
||||||
|
pattern = os.path.join(json_dir, "*.json")
|
||||||
|
json_files = glob.glob(pattern)
|
||||||
|
|
||||||
|
if not json_files:
|
||||||
|
print(f"⚠️ No JSON files found in {json_dir}")
|
||||||
|
return True
|
||||||
|
|
||||||
|
print(f"Testing {len(json_files)} JSON files for valid syntax...")
|
||||||
|
|
||||||
|
invalid_files = []
|
||||||
|
|
||||||
|
for file_path in json_files:
|
||||||
|
try:
|
||||||
|
with open(file_path, 'r', encoding='utf-8') as f:
|
||||||
|
json.load(f)
|
||||||
|
print(f"✅ Valid JSON: {file_path}")
|
||||||
|
except json.JSONDecodeError as e:
|
||||||
|
print(f"❌ Invalid JSON syntax in: {file_path}")
|
||||||
|
print(f" Error: {e}")
|
||||||
|
invalid_files.append(file_path)
|
||||||
|
except Exception as e:
|
||||||
|
print(f"⚠️ Error reading: {file_path}")
|
||||||
|
print(f" Error: {e}")
|
||||||
|
invalid_files.append(file_path)
|
||||||
|
|
||||||
|
print("\n=== JSON Validation Summary ===")
|
||||||
|
print(f"Total files tested: {len(json_files)}")
|
||||||
|
print(f"Valid files: {len(json_files) - len(invalid_files)}")
|
||||||
|
print(f"Invalid files: {len(invalid_files)}")
|
||||||
|
|
||||||
|
if invalid_files:
|
||||||
|
print("\n❌ Found invalid JSON file(s):")
|
||||||
|
for file_path in invalid_files:
|
||||||
|
print(f" - {file_path}")
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
print("\n✅ All JSON files have valid syntax!")
|
||||||
|
return True
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
success = test_json_files()
|
||||||
|
sys.exit(0 if success else 1)
|
||||||
|
EOF
|
||||||
|
|
||||||
|
build:
|
||||||
|
if: github.repository == 'community-scripts/ProxmoxVE'
|
||||||
|
needs: test-json-files
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
working-directory: frontend
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|||||||
178
CHANGELOG.md
178
CHANGELOG.md
@@ -10,8 +10,186 @@
|
|||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes.
|
Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes.
|
||||||
|
|
||||||
|
## 2025-07-28
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- Refactor: Cronicle [@tremor021](https://github.com/tremor021) ([#6314](https://github.com/community-scripts/ProxmoxVE/pull/6314))
|
||||||
|
- Refactor: HiveMQ [@tremor021](https://github.com/tremor021) ([#6313](https://github.com/community-scripts/ProxmoxVE/pull/6313))
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- fix: SSH authorized keys not added in Alpine install script [@enihsyou](https://github.com/enihsyou) ([#6316](https://github.com/community-scripts/ProxmoxVE/pull/6316))
|
||||||
|
- fix: removing ",gw=" from GATE var when reading/writing from/to config. [@teohz](https://github.com/teohz) ([#6177](https://github.com/community-scripts/ProxmoxVE/pull/6177))
|
||||||
|
- add 'g++' to actualbudget-install.sh [@saivishnu725](https://github.com/saivishnu725) ([#6293](https://github.com/community-scripts/ProxmoxVE/pull/6293))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- [core]: create_lxc: better handling, fix lock handling, improve template validation & storage selection UX [@MickLesk](https://github.com/MickLesk) ([#6296](https://github.com/community-scripts/ProxmoxVE/pull/6296))
|
||||||
|
- ProxmoxVE 9.0 Beta: add BETA Version as test in pve_check [@MickLesk](https://github.com/MickLesk) ([#6295](https://github.com/community-scripts/ProxmoxVE/pull/6295))
|
||||||
|
- karakeep: Run workers in prod without tsx [@vhsdream](https://github.com/vhsdream) ([#6285](https://github.com/community-scripts/ProxmoxVE/pull/6285))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Refactor: grocy [@tremor021](https://github.com/tremor021) ([#6307](https://github.com/community-scripts/ProxmoxVE/pull/6307))
|
||||||
|
- Refactor: Navidrome [@tremor021](https://github.com/tremor021) ([#6300](https://github.com/community-scripts/ProxmoxVE/pull/6300))
|
||||||
|
- Refactor: Gotify [@tremor021](https://github.com/tremor021) ([#6301](https://github.com/community-scripts/ProxmoxVE/pull/6301))
|
||||||
|
- Refactor: Grafana [@tremor021](https://github.com/tremor021) ([#6306](https://github.com/community-scripts/ProxmoxVE/pull/6306))
|
||||||
|
- Refactor: Argus [@tremor021](https://github.com/tremor021) ([#6305](https://github.com/community-scripts/ProxmoxVE/pull/6305))
|
||||||
|
- n8n: refactor environmentfile [@CrazyWolf13](https://github.com/CrazyWolf13) ([#6297](https://github.com/community-scripts/ProxmoxVE/pull/6297))
|
||||||
|
|
||||||
|
### 🌐 Website
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- temp change the analytics url to one that works untill community one is fixed [@BramSuurdje](https://github.com/BramSuurdje) ([#6319](https://github.com/community-scripts/ProxmoxVE/pull/6319))
|
||||||
|
|
||||||
|
## 2025-07-27
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- karakeep: export DATA_DIR from user config in update [@vhsdream](https://github.com/vhsdream) ([#6283](https://github.com/community-scripts/ProxmoxVE/pull/6283))
|
||||||
|
- go2rtc: Fix release download handling [@tremor021](https://github.com/tremor021) ([#6280](https://github.com/community-scripts/ProxmoxVE/pull/6280))
|
||||||
|
|
||||||
|
## 2025-07-26
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- PiAlert: Update dependencies [@leiweibau](https://github.com/leiweibau) ([#6251](https://github.com/community-scripts/ProxmoxVE/pull/6251))
|
||||||
|
|
||||||
|
## 2025-07-25
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- Cleanuparr ([#6238](https://github.com/community-scripts/ProxmoxVE/pull/6238))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Immich: fix #6236 [@vhsdream](https://github.com/vhsdream) ([#6243](https://github.com/community-scripts/ProxmoxVE/pull/6243))
|
||||||
|
- Wizarr: use absolute path to uv [@vhsdream](https://github.com/vhsdream) ([#6221](https://github.com/community-scripts/ProxmoxVE/pull/6221))
|
||||||
|
- Immich v1.136.0 [@vhsdream](https://github.com/vhsdream) ([#6219](https://github.com/community-scripts/ProxmoxVE/pull/6219))
|
||||||
|
|
||||||
|
## 2025-07-24
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- Alpine TeamSpeak Server [@tremor021](https://github.com/tremor021) ([#6201](https://github.com/community-scripts/ProxmoxVE/pull/6201))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Immich: Pin Version to v1.135.3 [@MickLesk](https://github.com/MickLesk) ([#6212](https://github.com/community-scripts/ProxmoxVE/pull/6212))
|
||||||
|
- Habitica: force npm to 10 [@MickLesk](https://github.com/MickLesk) ([#6192](https://github.com/community-scripts/ProxmoxVE/pull/6192))
|
||||||
|
- sabnzbd: add uv setup in update [@MickLesk](https://github.com/MickLesk) ([#6191](https://github.com/community-scripts/ProxmoxVE/pull/6191))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- SnipeIT - Update dependencies [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#6217](https://github.com/community-scripts/ProxmoxVE/pull/6217))
|
||||||
|
- Refactor: VictoriaMetrics [@tremor021](https://github.com/tremor021) ([#6210](https://github.com/community-scripts/ProxmoxVE/pull/6210))
|
||||||
|
- Headscale: Add headscale-admin UI as option [@tremor021](https://github.com/tremor021) ([#6205](https://github.com/community-scripts/ProxmoxVE/pull/6205))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Refactor: Gokapi [@tremor021](https://github.com/tremor021) ([#6197](https://github.com/community-scripts/ProxmoxVE/pull/6197))
|
||||||
|
- Refactor: duplicati [@tremor021](https://github.com/tremor021) ([#6202](https://github.com/community-scripts/ProxmoxVE/pull/6202))
|
||||||
|
- Refactor: go2rtc [@tremor021](https://github.com/tremor021) ([#6198](https://github.com/community-scripts/ProxmoxVE/pull/6198))
|
||||||
|
- Refactor: Headscale [@tremor021](https://github.com/tremor021) ([#6180](https://github.com/community-scripts/ProxmoxVE/pull/6180))
|
||||||
|
|
||||||
|
## 2025-07-23
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- documenso: remove customerId by creating initial user [@MickLesk](https://github.com/MickLesk) ([#6171](https://github.com/community-scripts/ProxmoxVE/pull/6171))
|
||||||
|
|
||||||
|
## 2025-07-22
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- Salt ([#6116](https://github.com/community-scripts/ProxmoxVE/pull/6116))
|
||||||
|
- LinkStack ([#6137](https://github.com/community-scripts/ProxmoxVE/pull/6137))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- tools.func - fix typo for target_file [@tjcomserv](https://github.com/tjcomserv) ([#6156](https://github.com/community-scripts/ProxmoxVE/pull/6156))
|
||||||
|
- fix(nginxproxymanager.sh): Set the version number before build. [@JMarcosHP](https://github.com/JMarcosHP) ([#6139](https://github.com/community-scripts/ProxmoxVE/pull/6139))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- Fixed the previous fix of the anti-nag hook and propagated fixes everywhere [@imcrazytwkr](https://github.com/imcrazytwkr) ([#6162](https://github.com/community-scripts/ProxmoxVE/pull/6162))
|
||||||
|
- [core]: Improved LXC Container Startup Handling [@MickLesk](https://github.com/MickLesk) ([#6142](https://github.com/community-scripts/ProxmoxVE/pull/6142))
|
||||||
|
- wallos: add cron in installer for yearly cost [@CrazyWolf13](https://github.com/CrazyWolf13) ([#6133](https://github.com/community-scripts/ProxmoxVE/pull/6133))
|
||||||
|
|
||||||
|
- #### 💥 Breaking Changes
|
||||||
|
|
||||||
|
- gitea-mirror: add: migration to 3.0 [@CrazyWolf13](https://github.com/CrazyWolf13) ([#6138](https://github.com/community-scripts/ProxmoxVE/pull/6138))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- [core]: tools.func: increase setup_php function [@MickLesk](https://github.com/MickLesk) ([#6141](https://github.com/community-scripts/ProxmoxVE/pull/6141))
|
||||||
|
|
||||||
|
### 🌐 Website
|
||||||
|
|
||||||
|
- Bump form-data from 4.0.3 to 4.0.4 in /frontend [@dependabot[bot]](https://github.com/dependabot[bot]) ([#6150](https://github.com/community-scripts/ProxmoxVE/pull/6150))
|
||||||
|
|
||||||
|
## 2025-07-21
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- Teamspeak-Server ([#6121](https://github.com/community-scripts/ProxmoxVE/pull/6121))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- pve-post-installer: remove Nag-File if already exist [@luckman212](https://github.com/luckman212) ([#6098](https://github.com/community-scripts/ProxmoxVE/pull/6098))
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- firefly: fix permissions at update [@MickLesk](https://github.com/MickLesk) ([#6119](https://github.com/community-scripts/ProxmoxVE/pull/6119))
|
||||||
|
- nginxproxymanager: remove injected footer link (tteck) [@MickLesk](https://github.com/MickLesk) ([#6117](https://github.com/community-scripts/ProxmoxVE/pull/6117))
|
||||||
|
|
||||||
|
## 2025-07-20
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Fix OpenWebUI install/update scripts [@karamanliev](https://github.com/karamanliev) ([#6093](https://github.com/community-scripts/ProxmoxVE/pull/6093))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- karakeep: add DB_WAL_MODE; suppress test output [@vhsdream](https://github.com/vhsdream) ([#6101](https://github.com/community-scripts/ProxmoxVE/pull/6101))
|
||||||
|
|
||||||
|
## 2025-07-19
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Fixed nag script on ProxMox 8.4.5 [@imcrazytwkr](https://github.com/imcrazytwkr) ([#6084](https://github.com/community-scripts/ProxmoxVE/pull/6084))
|
||||||
|
|
||||||
## 2025-07-18
|
## 2025-07-18
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- AdventureLog: add backup folder before update [@MickLesk](https://github.com/MickLesk) ([#6066](https://github.com/community-scripts/ProxmoxVE/pull/6066))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- Bar-Assistant: add Cocktail database [@MickLesk](https://github.com/MickLesk) ([#6068](https://github.com/community-scripts/ProxmoxVE/pull/6068))
|
||||||
|
- ErsatzTV: use project prebuild ffmpeg version [@MickLesk](https://github.com/MickLesk) ([#6067](https://github.com/community-scripts/ProxmoxVE/pull/6067))
|
||||||
|
|
||||||
## 2025-07-17
|
## 2025-07-17
|
||||||
|
|
||||||
### 🆕 New Scripts
|
### 🆕 New Scripts
|
||||||
|
|||||||
@@ -35,26 +35,29 @@ function update_script() {
|
|||||||
systemctl stop adventurelog-frontend
|
systemctl stop adventurelog-frontend
|
||||||
msg_ok "Services Stopped"
|
msg_ok "Services Stopped"
|
||||||
|
|
||||||
|
msg_info "Backup Old Installation"
|
||||||
|
mkdir -p /opt/adventurelog-backup
|
||||||
|
cp /opt/adventurelog/backend/server/.env /opt/adventurelog-backup/backend/server/.env
|
||||||
|
cp -r /opt/adventurelog/backend/server/media /opt/adventurelog-backup/backend/server/media
|
||||||
|
cp /opt/adventurelog/frontend/.env /opt/adventurelog-backup/frontend/.env
|
||||||
|
msg_ok "Backup done"
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "adventurelog" "seanmorley15/adventurelog"
|
fetch_and_deploy_gh_release "adventurelog" "seanmorley15/adventurelog"
|
||||||
PYTHON_VERSION="3.12" setup_uv
|
PYTHON_VERSION="3.12" setup_uv
|
||||||
|
|
||||||
msg_info "Updating ${APP} to v${RELEASE}"
|
msg_info "Updating ${APP} to v${RELEASE}"
|
||||||
# Backend Migration
|
|
||||||
cp /opt/adventurelog-backup/backend/server/.env /opt/adventurelog/backend/server/.env
|
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
|
cp -r /opt/adventurelog-backup/backend/server/media /opt/adventurelog/backend/server/media
|
||||||
|
|
||||||
cd /opt/adventurelog/backend/server
|
cd /opt/adventurelog/backend/server
|
||||||
if [[ ! -x .venv/bin/python ]]; then
|
if [[ ! -x .venv/bin/python ]]; then
|
||||||
$STD uv venv .venv
|
$STD uv venv .venv
|
||||||
$STD .venv/bin/python -m ensurepip --upgrade
|
$STD .venv/bin/python -m ensurepip --upgrade
|
||||||
fi
|
fi
|
||||||
|
|
||||||
$STD .venv/bin/python -m pip install --upgrade pip
|
$STD .venv/bin/python -m pip install --upgrade pip
|
||||||
$STD .venv/bin/python -m pip install -r requirements.txt
|
$STD .venv/bin/python -m pip install -r requirements.txt
|
||||||
$STD .venv/bin/python -m manage collectstatic --noinput
|
$STD .venv/bin/python -m manage collectstatic --noinput
|
||||||
$STD .venv/bin/python -m manage migrate
|
$STD .venv/bin/python -m manage migrate
|
||||||
|
|
||||||
# Frontend Migration
|
|
||||||
cp /opt/adventurelog-backup/frontend/.env /opt/adventurelog/frontend/.env
|
cp /opt/adventurelog-backup/frontend/.env /opt/adventurelog/frontend/.env
|
||||||
cd /opt/adventurelog/frontend
|
cd /opt/adventurelog/frontend
|
||||||
$STD pnpm i
|
$STD pnpm i
|
||||||
@@ -68,7 +71,6 @@ function update_script() {
|
|||||||
msg_ok "Services Started"
|
msg_ok "Services Started"
|
||||||
|
|
||||||
msg_info "Cleaning Up"
|
msg_info "Cleaning Up"
|
||||||
rm -rf /opt/v${RELEASE}.zip
|
|
||||||
rm -rf /opt/adventurelog-backup
|
rm -rf /opt/adventurelog-backup
|
||||||
msg_ok "Cleaned"
|
msg_ok "Cleaned"
|
||||||
|
|
||||||
|
|||||||
58
ct/alpine-teamspeak-server.sh
Normal file
58
ct/alpine-teamspeak-server.sh
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
#!/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: tremor021 (Slaviša Arežina)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://teamspeak.com/en/
|
||||||
|
|
||||||
|
APP="Alpine-TeamSpeak-Server"
|
||||||
|
var_tags="${var_tags:-alpine;communication}"
|
||||||
|
var_cpu="${var_cpu:-1}"
|
||||||
|
var_ram="${var_ram:-256}"
|
||||||
|
var_disk="${var_disk:-2}"
|
||||||
|
var_os="${var_os:-alpine}"
|
||||||
|
var_version="${var_version:-3.22}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
|
||||||
|
if [[ ! -d /opt/teamspeak-server ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
set +o pipefail && RELEASE=$(curl -fsSL https://teamspeak.com/en/downloads/#server | sed -n 's/.teamspeak3-server_linux_amd64-([0-9]+.[0-9]+.[0-9]+)./\1/p' | head -1) && set -o pipefail
|
||||||
|
|
||||||
|
if [ "${RELEASE}" != "$(cat ~/.teamspeak-server)" ] || [ ! -f ~/.teamspeak-server ]; then
|
||||||
|
msg_info "Updating ${APP} LXC"
|
||||||
|
$STD apk -U upgrade
|
||||||
|
$STD service teamspeak stop
|
||||||
|
curl -fsSL "https://files.teamspeak-services.com/releases/server/${RELEASE}/teamspeak3-server_linux_amd64-${RELEASE}.tar.bz2" -o ts3server.tar.bz2
|
||||||
|
tar -xf ./ts3server.tar.bz2
|
||||||
|
cp -ru teamspeak3-server_linux_amd64/* /opt/teamspeak-server/
|
||||||
|
rm -f ~/ts3server.tar.bz*
|
||||||
|
rm -rf teamspeak3-server_linux_amd64
|
||||||
|
echo "${RELEASE}" >~/.teamspeak-server
|
||||||
|
$STD service teamspeak start
|
||||||
|
msg_ok "Updated Successfully"
|
||||||
|
else
|
||||||
|
msg_ok "No update required. ${APP} is already at ${RELEASE}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
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 IP:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}${IP}:9987${CL}"
|
||||||
19
ct/argus.sh
19
ct/argus.sh
@@ -23,20 +23,23 @@ function update_script() {
|
|||||||
header_info
|
header_info
|
||||||
check_container_storage
|
check_container_storage
|
||||||
check_container_resources
|
check_container_resources
|
||||||
|
|
||||||
if [[ ! -d /opt/argus ]]; then
|
if [[ ! -d /opt/argus ]]; then
|
||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/release-argus/Argus/releases/latest | jq -r .tag_name | sed 's/^v//')
|
RELEASE=$(curl -fsSL https://api.github.com/repos/release-argus/Argus/releases/latest | jq -r .tag_name | sed 's/^v//')
|
||||||
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
|
if [[ "${RELEASE}" != "$(cat ~/.Argus 2>/dev/null)" ]] || [[ ! -f ~/.Argus ]]; then
|
||||||
msg_info "Updating $APP to ${RELEASE}"
|
msg_info "Stopping service"
|
||||||
rm -f /opt/argus/Argus
|
systemctl stop argus
|
||||||
curl -fsSL "https://github.com/release-argus/Argus/releases/download/${RELEASE}/Argus-${RELEASE}.linux-amd64" -o /opt/argus/Argus
|
msg_ok "Service stopped"
|
||||||
chmod +x /opt/argus/Argus
|
|
||||||
systemctl restart argus
|
fetch_and_deploy_gh_release "Argus" "release-argus/Argus" "singlefile" "latest" "/opt/argus" "Argus*linux-amd64"
|
||||||
echo "${RELEASE}" >/opt/${APP}_version.txt
|
|
||||||
|
msg_info "Starting service"
|
||||||
|
systemctl start argus
|
||||||
|
msg_ok "Service started"
|
||||||
|
|
||||||
msg_ok "Updated ${APP} to ${RELEASE}"
|
msg_ok "Updated ${APP} to ${RELEASE}"
|
||||||
else
|
else
|
||||||
msg_ok "${APP} is already up to date (${RELEASE})"
|
msg_ok "${APP} is already up to date (${RELEASE})"
|
||||||
|
|||||||
56
ct/cleanuparr.sh
Executable file
56
ct/cleanuparr.sh
Executable file
@@ -0,0 +1,56 @@
|
|||||||
|
#!/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: Lucas Zampieri (zampierilucas) | MickLesk (CanbiZ)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/Cleanuparr/Cleanuparr
|
||||||
|
|
||||||
|
APP="Cleanuparr"
|
||||||
|
var_tags="${var_tags:-arr}"
|
||||||
|
var_cpu="${var_cpu:-2}"
|
||||||
|
var_ram="${var_ram:-1024}"
|
||||||
|
var_disk="${var_disk:-4}"
|
||||||
|
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 [[ ! -f /opt/cleanuparr/Cleanuparr ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
RELEASE=$(curl -fsSL https://api.github.com/repos/Cleanuparr/Cleanuparr/releases/latest | jq -r '.tag_name' | sed 's/^v//')
|
||||||
|
if [[ "${RELEASE}" != "$(cat ~/.Cleanuparr 2>/dev/null)" ]] || [[ ! -f ~/.Cleanuparr ]]; then
|
||||||
|
msg_info "Stopping ${APP}"
|
||||||
|
systemctl stop cleanuparr
|
||||||
|
msg_ok "Stopped ${APP}"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "Cleanuparr" "Cleanuparr/Cleanuparr" "prebuild" "$RELEASE" "/opt/cleanuparr" "*linux-amd64.zip"
|
||||||
|
|
||||||
|
msg_info "Starting ${APP}"
|
||||||
|
systemctl start cleanuparr
|
||||||
|
msg_ok "Started ${APP}"
|
||||||
|
msg_ok "Updated Successfully"
|
||||||
|
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}:11011${CL}"
|
||||||
@@ -56,30 +56,18 @@ function update_script() {
|
|||||||
LATEST=$(curl -fsSL https://api.github.com/repos/jhuckaby/Cronicle/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
|
LATEST=$(curl -fsSL https://api.github.com/repos/jhuckaby/Cronicle/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
|
||||||
IP=$(hostname -I | awk '{print $1}')
|
IP=$(hostname -I | awk '{print $1}')
|
||||||
msg_info "Installing Dependencies"
|
msg_info "Installing Dependencies"
|
||||||
|
$STD apt-get install -y \
|
||||||
$STD apt-get install -y git
|
git \
|
||||||
$STD apt-get install -y make
|
build-essential \
|
||||||
$STD apt-get install -y g++
|
ca-certificates \
|
||||||
$STD apt-get install -y gcc
|
gnupg2
|
||||||
$STD apt-get install -y ca-certificates
|
|
||||||
$STD apt-get install -y gnupg
|
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
msg_info "Setting up Node.js Repository"
|
NODE_VERSION="22" setup_nodejs
|
||||||
mkdir -p /etc/apt/keyrings
|
fetch_and_deploy_gh_release "cronicle" "jhuckaby/Cronicle"
|
||||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
|
|
||||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
|
|
||||||
msg_ok "Set up Node.js Repository"
|
|
||||||
|
|
||||||
msg_info "Installing Node.js"
|
msg_info "Configuring Cronicle Worker"
|
||||||
$STD apt-get update
|
|
||||||
$STD apt-get install -y nodejs
|
|
||||||
msg_ok "Installed Node.js"
|
|
||||||
|
|
||||||
msg_info "Installing Cronicle Worker"
|
|
||||||
mkdir -p /opt/cronicle
|
|
||||||
cd /opt/cronicle
|
cd /opt/cronicle
|
||||||
$STD tar zxvf <(curl -fsSL https://github.com/jhuckaby/Cronicle/archive/${LATEST}.tar.gz) --strip-components 1
|
|
||||||
$STD npm install
|
$STD npm install
|
||||||
$STD node bin/build.js dist
|
$STD node bin/build.js dist
|
||||||
sed -i "s/localhost:3012/${IP}:3012/g" /opt/cronicle/conf/config.json
|
sed -i "s/localhost:3012/${IP}:3012/g" /opt/cronicle/conf/config.json
|
||||||
@@ -88,6 +76,7 @@ function update_script() {
|
|||||||
chmod 775 /etc/init.d/cronicled
|
chmod 775 /etc/init.d/cronicled
|
||||||
$STD update-rc.d cronicled defaults
|
$STD update-rc.d cronicled defaults
|
||||||
msg_ok "Installed Cronicle Worker"
|
msg_ok "Installed Cronicle Worker"
|
||||||
|
|
||||||
echo -e "\n Add Masters secret key to /opt/cronicle/conf/config.json \n"
|
echo -e "\n Add Masters secret key to /opt/cronicle/conf/config.json \n"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -27,25 +27,19 @@ function update_script() {
|
|||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/duplicati/duplicati/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4)}')
|
RELEASE=$(curl -fsSL https://api.github.com/repos/duplicati/duplicati/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 [[ "${RELEASE}" != "$(cat ~/.duplicati)" ]] || [[ ! -f ~/.duplicati ]]; then
|
||||||
msg_info "Stopping $APP"
|
msg_info "Stopping $APP"
|
||||||
systemctl stop duplicati
|
systemctl stop duplicati
|
||||||
msg_ok "Stopped $APP"
|
msg_ok "Stopped $APP"
|
||||||
msg_info "Updating $APP to v${RELEASE}"
|
|
||||||
curl -fsSL "https://github.com/duplicati/duplicati/releases/download/v${RELEASE}/duplicati-${RELEASE}-linux-x64-gui.deb" -o $(basename "https://github.com/duplicati/duplicati/releases/download/v${RELEASE}/duplicati-${RELEASE}-linux-x64-gui.deb")
|
fetch_and_deploy_gh_release "duplicati" "duplicati/duplicati" "binary" "latest" "/opt/duplicati" "linux-x64-gui.deb"
|
||||||
$STD dpkg -i duplicati-${RELEASE}-linux-x64-gui.deb
|
|
||||||
echo "${RELEASE}" >/opt/${APP}_version.txt
|
|
||||||
msg_ok "Updated $APP to v${RELEASE}"
|
|
||||||
|
|
||||||
msg_info "Starting $APP"
|
msg_info "Starting $APP"
|
||||||
systemctl start duplicati
|
systemctl start duplicati
|
||||||
msg_ok "Started $APP"
|
msg_ok "Started $APP"
|
||||||
|
|
||||||
msg_info "Cleaning Up"
|
|
||||||
rm -rf ~/duplicati-${RELEASE}-linux-x64-gui.deb
|
|
||||||
msg_ok "Cleanup Completed"
|
|
||||||
|
|
||||||
msg_ok "Update Successful"
|
msg_ok "Update Successful"
|
||||||
else
|
else
|
||||||
msg_ok "No update required. ${APP} is already at v${RELEASE}"
|
msg_ok "No update required. ${APP} is already at v${RELEASE}"
|
||||||
|
|||||||
@@ -26,13 +26,14 @@ function update_script() {
|
|||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/ErsatzTV/ErsatzTV/releases | grep -oP '"tag_name": "\K[^"]+' | head -n 1)
|
RELEASE=$(curl -fsSL https://api.github.com/repos/ErsatzTV/ErsatzTV/releases | grep -oP '"tag_name": "\Kv\K[^"]+' | head -n1)
|
||||||
|
RELEASE_FFMPEG=$(curl -fsSL https://api.github.com/repos/ErsatzTV/ErsatzTV-ffmpeg/releases | grep -oP '"tag_name": "\K[^"]+' | head -n 1)
|
||||||
|
|
||||||
if [[ "${RELEASE}" != "$(cat ~/.ersatztv 2>/dev/null)" ]] || [[ ! -f ~/.ersatztv ]]; then
|
if [[ "${RELEASE}" != "$(cat ~/.ersatztv 2>/dev/null)" ]] || [[ ! -f ~/.ersatztv ]]; then
|
||||||
msg_info "Stopping ErsatzTV"
|
msg_info "Stopping ErsatzTV"
|
||||||
systemctl stop ersatzTV
|
systemctl stop ersatzTV
|
||||||
msg_ok "Stopped ErsatzTV"
|
msg_ok "Stopped ErsatzTV"
|
||||||
|
|
||||||
FFMPEG_VERSION="latest" FFMPEG_TYPE="medium" setup_ffmpeg
|
|
||||||
fetch_and_deploy_gh_release "ersatztv" "ErsatzTV/ErsatzTV" "prebuild" "latest" "/opt/ErsatzTV" "*linux-x64.tar.gz"
|
fetch_and_deploy_gh_release "ersatztv" "ErsatzTV/ErsatzTV" "prebuild" "latest" "/opt/ErsatzTV" "*linux-x64.tar.gz"
|
||||||
|
|
||||||
msg_info "Starting ErsatzTV"
|
msg_info "Starting ErsatzTV"
|
||||||
@@ -43,6 +44,29 @@ function update_script() {
|
|||||||
else
|
else
|
||||||
msg_ok "No update required. ${APP} is already at ${RELEASE}"
|
msg_ok "No update required. ${APP} is already at ${RELEASE}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [[ "${RELEASE_FFMPEG}" != "$(cat ~/.ersatztv-ffmpeg 2>/dev/null)" ]] || [[ ! -f ~/.ersatztv-ffmpeg ]]; then
|
||||||
|
msg_info "Stopping ErsatzTV"
|
||||||
|
systemctl stop ersatzTV
|
||||||
|
msg_ok "Stopped ErsatzTV"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "ersatztv-ffmpeg" "ErsatzTV/ErsatzTV-ffmpeg" "prebuild" "latest" "/opt/ErsatzTV-ffmpeg" "*-linux64-gpl-7.1.tar.xz"
|
||||||
|
|
||||||
|
msg_info "Set ErsatzTV-ffmpeg links"
|
||||||
|
chmod +x /opt/ErsatzTV-ffmpeg/bin/*
|
||||||
|
ln -sf /opt/ErsatzTV-ffmpeg/bin/ffmpeg /usr/local/bin/ffmpeg
|
||||||
|
ln -sf /opt/ErsatzTV-ffmpeg/bin/ffplay /usr/local/bin/ffplay
|
||||||
|
ln -sf /opt/ErsatzTV-ffmpeg/bin/ffprobe /usr/local/bin/ffprobe
|
||||||
|
msg_ok "ffmpeg links set"
|
||||||
|
|
||||||
|
msg_info "Starting ErsatzTV"
|
||||||
|
systemctl start ersatzTV
|
||||||
|
msg_ok "Started ErsatzTV"
|
||||||
|
|
||||||
|
msg_ok "Updated Successfully"
|
||||||
|
else
|
||||||
|
msg_ok "No update required. ErsatzTV-ffmpeg is already at ${RELEASE_FFMPEG}"
|
||||||
|
fi
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -46,9 +46,13 @@ function update_script() {
|
|||||||
rm -rf /opt/firefly/storage
|
rm -rf /opt/firefly/storage
|
||||||
cp /opt/.env /opt/firefly/.env
|
cp /opt/.env /opt/firefly/.env
|
||||||
cp -r /opt/storage /opt/firefly/storage
|
cp -r /opt/storage /opt/firefly/storage
|
||||||
cd /opt/firefly
|
|
||||||
chown -R www-data:www-data /opt/firefly
|
chown -R www-data:www-data /opt/firefly
|
||||||
chmod -R 775 /opt/firefly/storage
|
find /opt/firefly/storage -type d -exec chmod 775 {} \;
|
||||||
|
find /opt/firefly/storage -type f -exec chmod 664 {} \;
|
||||||
|
mkdir -p /opt/firefly/storage/framework/{cache/data,sessions,views}
|
||||||
|
$STD sudo -u www-data php /opt/firefly/artisan cache:clear
|
||||||
|
|
||||||
$STD php artisan migrate --seed --force
|
$STD php artisan migrate --seed --force
|
||||||
$STD php artisan cache:clear
|
$STD php artisan cache:clear
|
||||||
$STD php artisan view:clear
|
$STD php artisan view:clear
|
||||||
|
|||||||
@@ -28,6 +28,26 @@ function update_script() {
|
|||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
APP_VERSION=$(grep -o '"version": *"[^"]*"' /opt/gitea-mirror/package.json | cut -d'"' -f4)
|
||||||
|
if [[ $APP_VERSION =~ ^2\. ]]; then
|
||||||
|
if ! whiptail --backtitle "Gitea Mirror Update" --title "⚠️ VERSION 2.x DETECTED" --yesno \
|
||||||
|
"WARNING: Version $APP_VERSION detected!\n\nUpdating from version 2.x will CLEAR ALL CONFIGURATION.\n\nThis includes:\n• API tokens\n• User settings\n• Repository configurations\n• All custom settings\n\nDo you want to continue with the update process?" 15 70 --defaultno
|
||||||
|
then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! whiptail --backtitle "Gitea Mirror Update" --title "⚠️ FINAL CONFIRMATION" --yesno \
|
||||||
|
"FINAL WARNING: This update WILL clear all configuration!\n\nBEFORE PROCEEDING, please:\n\n• Copy API tokens to a safe location\n• Backup any custom configurations\n• Note down repository settings\n\nThis action CANNOT be undone!" 18 70 --defaultno
|
||||||
|
then
|
||||||
|
whiptail --backtitle "Gitea Mirror Update" --title "Update Cancelled" --msgbox "Update process cancelled. Please backup your configuration before proceeding." 8 60
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
whiptail --backtitle "Gitea Mirror Update" --title "Proceeding with Update" --msgbox \
|
||||||
|
"Proceeding with version $APP_VERSION update.\n\nAll configuration will be cleared as warned." 8 50
|
||||||
|
rm -rf /opt/gitea-mirror
|
||||||
|
fi
|
||||||
|
|
||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/RayLabsHQ/gitea-mirror/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
RELEASE=$(curl -fsSL https://api.github.com/repos/RayLabsHQ/gitea-mirror/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||||
if [[ "${RELEASE}" != "$(cat ~/.${APP} 2>/dev/null || cat /opt/${APP}_version.txt 2>/dev/null)" ]]; then
|
if [[ "${RELEASE}" != "$(cat ~/.${APP} 2>/dev/null || cat /opt/${APP}_version.txt 2>/dev/null)" ]]; then
|
||||||
|
|
||||||
|
|||||||
21
ct/go2rtc.sh
21
ct/go2rtc.sh
@@ -27,14 +27,23 @@ function update_script() {
|
|||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
msg_info "Updating $APP"
|
|
||||||
|
RELEASE=$(curl -fsSL https://api.github.com/repos/AlexxIT/go2rtc/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||||
|
if [[ "${RELEASE}" != "$(cat ~/.go2rtc 2>/dev/null)" ]] || [[ ! -f ~/.go2rtc ]]; then
|
||||||
|
msg_info "Stopping service"
|
||||||
systemctl stop go2rtc
|
systemctl stop go2rtc
|
||||||
cd /opt/go2rtc
|
msg_ok "Stopped service"
|
||||||
rm go2rtc_linux_amd64
|
|
||||||
curl -fsSL "https://github.com/AlexxIT/go2rtc/releases/latest/download/go2rtc_linux_amd64" -o $(basename "https://github.com/AlexxIT/go2rtc/releases/latest/download/go2rtc_linux_amd64")
|
fetch_and_deploy_gh_release "go2rtc" "AlexxIT/go2rtc" "singlefile" "latest" "/opt/go2rtc" "go2rtc_linux_amd64"
|
||||||
chmod +x go2rtc_linux_amd64
|
|
||||||
|
msg_info "Starting service"
|
||||||
systemctl start go2rtc
|
systemctl start go2rtc
|
||||||
msg_ok "Updated $APP"
|
msg_ok "Started service"
|
||||||
|
|
||||||
|
msg_ok "Updated Successfully"
|
||||||
|
else
|
||||||
|
msg_ok "No update required. ${APP} is already at ${RELEASE}"
|
||||||
|
fi
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
21
ct/gokapi.sh
21
ct/gokapi.sh
@@ -27,7 +27,26 @@ function update_script() {
|
|||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
msg_error "Currently we don't provide an update function for this ${APP}."
|
if [[ -f /opt/${APP}_version.txt ]]; then
|
||||||
|
mv /opt/${APP}_version ~/.gokapi
|
||||||
|
fi
|
||||||
|
|
||||||
|
RELEASE=$(curl -fsSL https://api.github.com/repos/Forceu/Gokapi/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||||
|
if [[ "${RELEASE}" != "$(cat ~/.gokapi 2>/dev/null)" ]] || [[ ! -f ~/.gokapi ]]; then
|
||||||
|
msg_info "Stopping ${APP}"
|
||||||
|
systemctl stop gokapi
|
||||||
|
msg_ok "Stopped ${APP}"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "gokapi" "Forceu/Gokapi" "prebuild" "latest" "/opt/gokapi" "gokapi-linux_amd64.zip"
|
||||||
|
|
||||||
|
msg_info "Starting ${APP}"
|
||||||
|
systemctl start gokapi
|
||||||
|
msg_ok "Started ${APP}"
|
||||||
|
|
||||||
|
msg_ok "Updated Successfully"
|
||||||
|
else
|
||||||
|
msg_ok "No update required. ${APP} is already at ${RELEASE}"
|
||||||
|
fi
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
13
ct/gotify.sh
13
ct/gotify.sh
@@ -29,23 +29,18 @@ function update_script() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/gotify/server/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
RELEASE=$(curl -fsSL https://api.github.com/repos/gotify/server/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
|
if [[ "${RELEASE}" != "$(cat ~/.gotify 2>/dev/null)" ]] || [[ ! -f ~/.gotify ]]; then
|
||||||
msg_info "Stopping ${APP}"
|
msg_info "Stopping ${APP}"
|
||||||
systemctl stop gotify
|
systemctl stop gotify
|
||||||
msg_ok "Stopped ${APP}"
|
msg_ok "Stopped ${APP}"
|
||||||
|
|
||||||
msg_info "Updating ${APP} to ${RELEASE}"
|
fetch_and_deploy_gh_release "gotify" "gotify/server" "prebuild" "latest" "/opt/gotify" "gotify-linux-amd64.zip"
|
||||||
cd /opt/gotify
|
chmod +x /opt/gotify/gotify-linux-amd64
|
||||||
curl -fsSL "https://github.com/gotify/server/releases/download/v${RELEASE}/gotify-linux-amd64.zip" -o $(basename "https://github.com/gotify/server/releases/download/v${RELEASE}/gotify-linux-amd64.zip")
|
|
||||||
$STD unzip -o gotify-linux-amd64.zip
|
|
||||||
rm -rf gotify-linux-amd64.zip
|
|
||||||
chmod +x gotify-linux-amd64
|
|
||||||
echo "${RELEASE}" >/opt/${APP}_version.txt
|
|
||||||
msg_ok "Updated ${APP} to ${RELEASE}"
|
|
||||||
|
|
||||||
msg_info "Starting ${APP}"
|
msg_info "Starting ${APP}"
|
||||||
systemctl start gotify
|
systemctl start gotify
|
||||||
msg_ok "Started ${APP}"
|
msg_ok "Started ${APP}"
|
||||||
|
|
||||||
msg_ok "Updated Successfully"
|
msg_ok "Updated Successfully"
|
||||||
else
|
else
|
||||||
msg_ok "No update required. ${APP} is already at ${RELEASE}"
|
msg_ok "No update required. ${APP} is already at ${RELEASE}"
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ function update_script() {
|
|||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
msg_info "Updating ${APP}"
|
msg_info "Updating ${APP}"
|
||||||
$STD apt-get update
|
$STD apt-get update
|
||||||
$STD apt-get -y upgrade
|
$STD apt-get -y upgrade
|
||||||
|
|||||||
20
ct/grocy.sh
20
ct/grocy.sh
@@ -27,20 +27,20 @@ function update_script() {
|
|||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
php_version=$(php -v | head -n 1 | awk '{print $2}')
|
|
||||||
if [[ ! $php_version == "8.3"* ]]; then
|
php_ver=$(php -v | head -n 1 | awk '{print $2}')
|
||||||
msg_info "Updating PHP"
|
if [[ ! $php_ver == "8.3"* ]]; then
|
||||||
curl -fsSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg
|
PHP_VERSION="8.3" PHP_MODULE="sqlite3,bz2" PHP_APACHE="yes" setup_php
|
||||||
echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ bookworm main" >/etc/apt/sources.list.d/php.list
|
|
||||||
apt-get update
|
|
||||||
apt-get install -y php8.3 php8.3-cli php8.3-{bz2,curl,mbstring,intl,sqlite3,fpm,gd,zip,xml}
|
|
||||||
systemctl reload apache2
|
|
||||||
apt autoremove
|
|
||||||
msg_ok "Updated PHP"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
RELEASE=$(curl -fsSL https://api.github.com/repos/grocy/grocy/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||||
|
if [[ "${RELEASE}" != "$(cat ~/.grocy 2>/dev/null)" ]] || [[ ! -f ~/.grocy ]]; then
|
||||||
msg_info "Updating ${APP}"
|
msg_info "Updating ${APP}"
|
||||||
bash /var/www/html/update.sh
|
bash /var/www/html/update.sh
|
||||||
msg_ok "Updated Successfully"
|
msg_ok "Updated Successfully"
|
||||||
|
else
|
||||||
|
msg_ok "No update required. ${APP} is already at ${RELEASE}"
|
||||||
|
fi
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
6
ct/headers/alpine-teamspeak-server
Normal file
6
ct/headers/alpine-teamspeak-server
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
___ __ _ ______ _____ __ _____
|
||||||
|
/ | / /___ (_)___ ___ /_ __/__ ____ _____ ___ / ___/____ ___ ____ _/ /__ / ___/___ ______ _____ _____
|
||||||
|
/ /| | / / __ \/ / __ \/ _ \______/ / / _ \/ __ `/ __ `__ \\__ \/ __ \/ _ \/ __ `/ //_/_____\__ \/ _ \/ ___/ | / / _ \/ ___/
|
||||||
|
/ ___ |/ / /_/ / / / / / __/_____/ / / __/ /_/ / / / / / /__/ / /_/ / __/ /_/ / ,< /_____/__/ / __/ / | |/ / __/ /
|
||||||
|
/_/ |_/_/ .___/_/_/ /_/\___/ /_/ \___/\__,_/_/ /_/ /_/____/ .___/\___/\__,_/_/|_| /____/\___/_/ |___/\___/_/
|
||||||
|
/_/ /_/
|
||||||
6
ct/headers/cleanuparr
Normal file
6
ct/headers/cleanuparr
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
________
|
||||||
|
/ ____/ /__ ____ _____ __ ______ ____ ___________
|
||||||
|
/ / / / _ \/ __ `/ __ \/ / / / __ \/ __ `/ ___/ ___/
|
||||||
|
/ /___/ / __/ /_/ / / / / /_/ / /_/ / /_/ / / / /
|
||||||
|
\____/_/\___/\__,_/_/ /_/\__,_/ .___/\__,_/_/ /_/
|
||||||
|
/_/
|
||||||
6
ct/headers/linkstack
Normal file
6
ct/headers/linkstack
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
__ _ __ _____ __ __
|
||||||
|
/ / (_)___ / /__/ ___// /_____ ______/ /__
|
||||||
|
/ / / / __ \/ //_/\__ \/ __/ __ `/ ___/ //_/
|
||||||
|
/ /___/ / / / / ,< ___/ / /_/ /_/ / /__/ ,<
|
||||||
|
/_____/_/_/ /_/_/|_|/____/\__/\__,_/\___/_/|_|
|
||||||
|
|
||||||
6
ct/headers/salt
Normal file
6
ct/headers/salt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
_____ ____
|
||||||
|
/ ___/____ _/ / /_
|
||||||
|
\__ \/ __ `/ / __/
|
||||||
|
___/ / /_/ / / /_
|
||||||
|
/____/\__,_/_/\__/
|
||||||
|
|
||||||
6
ct/headers/teamspeak-server
Normal file
6
ct/headers/teamspeak-server
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
______ __ _____
|
||||||
|
/_ __/__ ____ _____ ___ _________ ___ ____ _/ /__ / ___/___ ______ _____ _____
|
||||||
|
/ / / _ \/ __ `/ __ `__ \/ ___/ __ \/ _ \/ __ `/ //_/_____\__ \/ _ \/ ___/ | / / _ \/ ___/
|
||||||
|
/ / / __/ /_/ / / / / / (__ ) /_/ / __/ /_/ / ,< /_____/__/ / __/ / | |/ / __/ /
|
||||||
|
/_/ \___/\__,_/_/ /_/ /_/____/ .___/\___/\__,_/_/|_| /____/\___/_/ |___/\___/_/
|
||||||
|
/_/
|
||||||
@@ -27,18 +27,18 @@ function update_script() {
|
|||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
if [[ -f /opt/${APP}_version.txt ]]; then
|
||||||
|
mv /opt/"${APP}_version.txt" ~/.headscale
|
||||||
|
fi
|
||||||
|
|
||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/juanfont/headscale/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
RELEASE=$(curl -fsSL https://api.github.com/repos/juanfont/headscale/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 [[ "${RELEASE}" != "$(cat ~/.headscale 2>/dev/null)" ]] || [[ ! -f ~/.headscale ]]; then
|
||||||
msg_info "Stopping ${APP}"
|
msg_info "Stopping ${APP}"
|
||||||
systemctl stop headscale
|
systemctl stop headscale
|
||||||
msg_ok "Stopped ${APP}"
|
msg_ok "Stopped ${APP}"
|
||||||
|
|
||||||
msg_info "Updating $APP to v${RELEASE}"
|
fetch_and_deploy_gh_release "headscale" "juanfont/headscale" "binary"
|
||||||
curl -fsSL "https://github.com/juanfont/headscale/releases/download/v${RELEASE}/headscale_${RELEASE}_linux_amd64.deb" -o $(basename "https://github.com/juanfont/headscale/releases/download/v${RELEASE}/headscale_${RELEASE}_linux_amd64.deb")
|
fetch_and_deploy_gh_release "headscale-admin" "GoodiesHQ/headscale-admin" "prebuild" "latest" "/opt/headscale-admin" "admin.zip"
|
||||||
dpkg -i headscale_${RELEASE}_linux_amd64.deb
|
|
||||||
rm headscale_${RELEASE}_linux_amd64.deb
|
|
||||||
echo "${RELEASE}" >/opt/${APP}_version.txt
|
|
||||||
msg_ok "Updated $APP to ${RELEASE}"
|
|
||||||
|
|
||||||
msg_info "Starting ${APP}"
|
msg_info "Starting ${APP}"
|
||||||
# Temporary fix until headscale project resolves service getting disabled on updates.
|
# Temporary fix until headscale project resolves service getting disabled on updates.
|
||||||
|
|||||||
@@ -58,7 +58,8 @@ function update_script() {
|
|||||||
done
|
done
|
||||||
msg_ok "Image-processing libraries updated"
|
msg_ok "Image-processing libraries updated"
|
||||||
fi
|
fi
|
||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/immich-app/immich/releases?per_page=1 | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
RELEASE="1.136.0"
|
||||||
|
#RELEASE=$(curl -fsSL https://api.github.com/repos/immich-app/immich/releases?per_page=1 | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||||
if [[ -f ~/.immich && "$RELEASE" == "$(cat ~/.immich)" ]]; then
|
if [[ -f ~/.immich && "$RELEASE" == "$(cat ~/.immich)" ]]; then
|
||||||
msg_ok "No update required. ${APP} is already at v${RELEASE}"
|
msg_ok "No update required. ${APP} is already at v${RELEASE}"
|
||||||
exit
|
exit
|
||||||
@@ -102,7 +103,7 @@ function update_script() {
|
|||||||
mkdir -p "$ML_DIR"
|
mkdir -p "$ML_DIR"
|
||||||
rm -rf "$SRC_DIR"
|
rm -rf "$SRC_DIR"
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "latest" "$SRC_DIR"
|
fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v1.136.0" "$SRC_DIR"
|
||||||
|
|
||||||
msg_info "Updating ${APP} web and microservices"
|
msg_info "Updating ${APP} web and microservices"
|
||||||
cd "$SRC_DIR"/server
|
cd "$SRC_DIR"/server
|
||||||
@@ -120,7 +121,7 @@ function update_script() {
|
|||||||
$STD npm ci
|
$STD npm ci
|
||||||
$STD npm run build
|
$STD npm run build
|
||||||
cd "$SRC_DIR"
|
cd "$SRC_DIR"
|
||||||
cp -a server/{node_modules,dist,bin,resources,package.json,package-lock.json,start*.sh} "$APP_DIR"/
|
cp -a server/{node_modules,dist,bin,resources,package.json,package-lock.json,bin/start.sh} "$APP_DIR"/
|
||||||
cp -a web/build "$APP_DIR"/www
|
cp -a web/build "$APP_DIR"/www
|
||||||
cp LICENSE "$APP_DIR"
|
cp LICENSE "$APP_DIR"
|
||||||
cd "$APP_DIR"
|
cd "$APP_DIR"
|
||||||
|
|||||||
@@ -52,14 +52,19 @@ function update_script() {
|
|||||||
rm -rf /opt/karakeep
|
rm -rf /opt/karakeep
|
||||||
msg_ok "Update prepared"
|
msg_ok "Update prepared"
|
||||||
|
|
||||||
|
if grep -q "start:prod" /etc/systemd/system/karakeep-workers.service; then
|
||||||
|
sed -i 's|^ExecStart=.*$|ExecStart=/usr/bin/node dist/index.mjs|' /etc/systemd/system/karakeep-workers.service
|
||||||
|
systemctl daemon-reload
|
||||||
|
fi
|
||||||
fetch_and_deploy_gh_release "karakeep" "karakeep-app/karakeep"
|
fetch_and_deploy_gh_release "karakeep" "karakeep-app/karakeep"
|
||||||
if command -v corepack; then
|
if command -v corepack >/dev/null; then
|
||||||
$STD corepack disable
|
$STD corepack disable
|
||||||
fi
|
fi
|
||||||
MODULE_VERSION="$(jq -r '.packageManager | split("@")[1]' /opt/karakeep/package.json)"
|
MODULE_VERSION="$(jq -r '.packageManager | split("@")[1]' /opt/karakeep/package.json)"
|
||||||
NODE_VERSION="22" NODE_MODULE="pnpm@${MODULE_VERSION}" setup_nodejs
|
NODE_VERSION="22" NODE_MODULE="pnpm@${MODULE_VERSION}" setup_nodejs
|
||||||
|
|
||||||
msg_info "Updating ${APP} to v${RELEASE}"
|
msg_info "Updating ${APP} to v${RELEASE}"
|
||||||
|
corepack enable
|
||||||
export PUPPETEER_SKIP_DOWNLOAD="true"
|
export PUPPETEER_SKIP_DOWNLOAD="true"
|
||||||
export PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD="true"
|
export PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD="true"
|
||||||
export NEXT_TELEMETRY_DISABLED=1
|
export NEXT_TELEMETRY_DISABLED=1
|
||||||
@@ -69,10 +74,12 @@ function update_script() {
|
|||||||
$STD pnpm build
|
$STD pnpm build
|
||||||
cd /opt/karakeep/apps/workers
|
cd /opt/karakeep/apps/workers
|
||||||
$STD pnpm install --frozen-lockfile
|
$STD pnpm install --frozen-lockfile
|
||||||
|
$STD pnpm build
|
||||||
cd /opt/karakeep/apps/cli
|
cd /opt/karakeep/apps/cli
|
||||||
$STD pnpm install --frozen-lockfile
|
$STD pnpm install --frozen-lockfile
|
||||||
$STD pnpm build
|
$STD pnpm build
|
||||||
export DATA_DIR=/opt/karakeep_data
|
DATA_DIR="$(sed -n '/^DATA_DIR/p' /etc/karakeep/karakeep.env | awk -F= '{print $2}')"
|
||||||
|
export DATA_DIR="${DATA_DIR:-/opt/karakeep_data}"
|
||||||
cd /opt/karakeep/packages/db
|
cd /opt/karakeep/packages/db
|
||||||
$STD pnpm migrate
|
$STD pnpm migrate
|
||||||
$STD pnpm store prune
|
$STD pnpm store prune
|
||||||
|
|||||||
43
ct/linkstack.sh
Normal file
43
ct/linkstack.sh
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
#!/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: Omar Minaya | MickLesk (CanbiZ)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://linkstack.org/
|
||||||
|
|
||||||
|
APP="LinkStack"
|
||||||
|
var_tags="${var_tags:-os}"
|
||||||
|
var_cpu="${var_cpu:-1}"
|
||||||
|
var_ram="${var_ram:-1024}"
|
||||||
|
var_disk="${var_disk:-5}"
|
||||||
|
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 [[ ! -f ~/.linkstack ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
PHP_VERSION="8.3" PHP_MODULE="sqlite3" PHP_APACHE="YES" setup_php
|
||||||
|
msg_warn "LinkStack should be updated via the user interface."
|
||||||
|
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}${CL}"
|
||||||
12
ct/n8n.sh
12
ct/n8n.sh
@@ -34,6 +34,18 @@ function update_script() {
|
|||||||
echo "Installed NPM..."
|
echo "Installed NPM..."
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
if [ ! -f /opt/n8n.env ]; then
|
||||||
|
sed -i 's|^Environment="N8N_SECURE_COOKIE=false"$|EnvironmentFile="/opt/n8n.env"|' /etc/systemd/system/n8n.service
|
||||||
|
HOST_IP=$(hostname -I | awk '{print $1}')
|
||||||
|
mkdir -p /opt
|
||||||
|
cat <<EOF >/opt/n8n.env
|
||||||
|
N8N_SECURE_COOKIE=false
|
||||||
|
N8N_PORT=5678
|
||||||
|
N8N_PROTOCOL=http
|
||||||
|
N8N_HOST=$HOST_IP
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
|
||||||
msg_info "Updating ${APP} LXC"
|
msg_info "Updating ${APP} LXC"
|
||||||
$STD npm update -g n8n
|
$STD npm update -g n8n
|
||||||
systemctl restart n8n
|
systemctl restart n8n
|
||||||
|
|||||||
@@ -27,27 +27,19 @@ function update_script() {
|
|||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/navidrome/navidrome/releases/latest | grep "tag_name" | awk -F '"' '{print $4}')
|
|
||||||
if [[ ! -f /opt/${APP}_version.txt ]]; then touch /opt/${APP}_version.txt; fi
|
RELEASE=$(curl -fsSL https://api.github.com/repos/navidrome/navidrome/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||||
if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
|
if [[ "${RELEASE}" != "$(cat ~/.navidrome 2>/dev/null)" ]] || [[ ! -f ~/.navidrome ]]; then
|
||||||
msg_info "Stopping Services"
|
msg_info "Stopping Services"
|
||||||
systemctl stop navidrome
|
systemctl stop navidrome
|
||||||
msg_ok "Services Stopped"
|
msg_ok "Services Stopped"
|
||||||
|
|
||||||
msg_info "Updating ${APP} to ${RELEASE}"
|
fetch_and_deploy_gh_release "navidrome" "navidrome/navidrome" "binary"
|
||||||
TMP_DEB=$(mktemp --suffix=.deb)
|
|
||||||
curl -fsSL -o "${TMP_DEB}" "https://github.com/navidrome/navidrome/releases/download/${RELEASE}/navidrome_${RELEASE#v}_linux_amd64.deb"
|
|
||||||
$STD apt-get install -y "${TMP_DEB}"
|
|
||||||
echo "${RELEASE}" >/opt/"${APP}_version.txt"
|
|
||||||
msg_ok "Updated Navidrome"
|
|
||||||
|
|
||||||
msg_info "Starting Services"
|
msg_info "Starting Services"
|
||||||
systemctl start navidrome
|
systemctl start navidrome
|
||||||
msg_ok "Started Services"
|
msg_ok "Started Services"
|
||||||
|
|
||||||
msg_info "Cleaning Up"
|
|
||||||
rm -f "${TMP_DEB}"
|
|
||||||
msg_ok "Cleaned"
|
|
||||||
msg_ok "Updated Successfully"
|
msg_ok "Updated Successfully"
|
||||||
else
|
else
|
||||||
msg_ok "No update required. ${APP} is already at ${RELEASE}"
|
msg_ok "No update required. ${APP} is already at ${RELEASE}"
|
||||||
|
|||||||
@@ -46,6 +46,8 @@ function update_script() {
|
|||||||
|
|
||||||
msg_info "Building Frontend"
|
msg_info "Building Frontend"
|
||||||
(
|
(
|
||||||
|
sed -i "s|\"version\": \"0.0.0\"|\"version\": \"$RELEASE\"|" backend/package.json
|
||||||
|
sed -i "s|\"version\": \"0.0.0\"|\"version\": \"$RELEASE\"|" frontend/package.json
|
||||||
cd ./frontend || exit
|
cd ./frontend || exit
|
||||||
$STD pnpm install
|
$STD pnpm install
|
||||||
$STD pnpm upgrade
|
$STD pnpm upgrade
|
||||||
@@ -72,8 +74,6 @@ function update_script() {
|
|||||||
ln -sf /usr/bin/certbot /opt/certbot/bin/certbot
|
ln -sf /usr/bin/certbot /opt/certbot/bin/certbot
|
||||||
ln -sf /usr/local/openresty/nginx/sbin/nginx /usr/sbin/nginx
|
ln -sf /usr/local/openresty/nginx/sbin/nginx /usr/sbin/nginx
|
||||||
ln -sf /usr/local/openresty/nginx/ /etc/nginx
|
ln -sf /usr/local/openresty/nginx/ /etc/nginx
|
||||||
sed -i "s|\"version\": \"0.0.0\"|\"version\": \"$RELEASE\"|" backend/package.json
|
|
||||||
sed -i "s|\"version\": \"0.0.0\"|\"version\": \"$RELEASE\"|" frontend/package.json
|
|
||||||
sed -i 's+^daemon+#daemon+g' docker/rootfs/etc/nginx/nginx.conf
|
sed -i 's+^daemon+#daemon+g' docker/rootfs/etc/nginx/nginx.conf
|
||||||
NGINX_CONFS=$(find "$(pwd)" -type f -name "*.conf")
|
NGINX_CONFS=$(find "$(pwd)" -type f -name "*.conf")
|
||||||
for NGINX_CONF in $NGINX_CONFS; do
|
for NGINX_CONF in $NGINX_CONFS; do
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
systemctl stop open-webui.service
|
systemctl stop open-webui.service
|
||||||
$STD npm install
|
$STD npm install --force
|
||||||
export NODE_OPTIONS="--max-old-space-size=3584"
|
export NODE_OPTIONS="--max-old-space-size=3584"
|
||||||
$STD npm run build
|
$STD npm run build
|
||||||
cd ./backend
|
cd ./backend
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ function update_script() {
|
|||||||
msg_ok "No update required. ${APP} is already at ${RELEASE}"
|
msg_ok "No update required. ${APP} is already at ${RELEASE}"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
setup_uv
|
||||||
msg_info "Updating $APP to ${RELEASE}"
|
msg_info "Updating $APP to ${RELEASE}"
|
||||||
systemctl stop sabnzbd
|
systemctl stop sabnzbd
|
||||||
cp -r /opt/sabnzbd /opt/sabnzbd_backup_$(date +%s)
|
cp -r /opt/sabnzbd /opt/sabnzbd_backup_$(date +%s)
|
||||||
|
|||||||
50
ct/salt.sh
Normal file
50
ct/salt.sh
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
#!/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: bvdberg01
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/saltstack/salt
|
||||||
|
|
||||||
|
APP="Salt"
|
||||||
|
var_tags="${var_tags:-automations}"
|
||||||
|
var_cpu="${var_cpu:-1}"
|
||||||
|
var_ram="${var_ram:-1024}"
|
||||||
|
var_disk="${var_disk:-3}"
|
||||||
|
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 /etc/salt ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
RELEASE=$(curl -fsSL https://api.github.com/repos/saltstack/salt/releases/latest | jq -r .tag_name | sed 's/^v//')
|
||||||
|
if [[ ! -f /~.salt ]] || [[ "${RELEASE}" != "$(cat /~.salt)" ]]; then
|
||||||
|
msg_info "Updating $APP to ${RELEASE}"
|
||||||
|
sed -i "s/^\(Pin: version \).*/\1${RELEASE}/" /etc/apt/preferences.d/salt-pin-1001
|
||||||
|
$STD apt-get update
|
||||||
|
$STD apt-get upgrade -y
|
||||||
|
echo "${RELEASE}" >/~.salt
|
||||||
|
msg_ok "Updated ${APP} to ${RELEASE}"
|
||||||
|
else
|
||||||
|
msg_ok "${APP} is already up to date (${RELEASE})"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
63
ct/teamspeak-server.sh
Normal file
63
ct/teamspeak-server.sh
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
#!/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: tremor021 (Slaviša Arežina)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://teamspeak.com/en/
|
||||||
|
|
||||||
|
APP="Teamspeak-Server"
|
||||||
|
var_tags="${var_tags:-voice;communication}"
|
||||||
|
var_cpu="${var_cpu:-1}"
|
||||||
|
var_ram="${var_ram:-512}"
|
||||||
|
var_disk="${var_disk:-2}"
|
||||||
|
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/teamspeak-server ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
RELEASE=$(curl -fsSL https://teamspeak.com/en/downloads/#server | grep -oP 'teamspeak3-server_linux_amd64-\K[0-9]+\.[0-9]+\.[0-9]+' | head -1)
|
||||||
|
if [[ "${RELEASE}" != "$(cat ~/.teamspeak-server 2>/dev/null)" ]] || [[ ! -f ~/.teamspeak-server ]]; then
|
||||||
|
msg_info "Stopping Service"
|
||||||
|
systemctl stop teamspeak-server
|
||||||
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
|
msg_info "Updating ${APP}"
|
||||||
|
curl -fsSL "https://files.teamspeak-services.com/releases/server/${RELEASE}/teamspeak3-server_linux_amd64-${RELEASE}.tar.bz2" -o ts3server.tar.bz2
|
||||||
|
tar -xf ./ts3server.tar.bz2
|
||||||
|
cp -ru teamspeak3-server_linux_amd64/* /opt/teamspeak-server/
|
||||||
|
rm -f ~/ts3server.tar.bz*
|
||||||
|
echo "${RELEASE}" >~/.teamspeak-server
|
||||||
|
msg_ok "Updated $APP"
|
||||||
|
|
||||||
|
msg_info "Starting Service"
|
||||||
|
systemctl start teamspeak-server
|
||||||
|
msg_ok "Started Service"
|
||||||
|
|
||||||
|
msg_ok "Updated Successfully"
|
||||||
|
else
|
||||||
|
msg_ok "Already up to date"
|
||||||
|
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}${IP}:9987${CL}"
|
||||||
@@ -27,31 +27,25 @@ function update_script() {
|
|||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/VictoriaMetrics/VictoriaMetrics/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
RELEASE=$(curl -fsSL https://api.github.com/repos/VictoriaMetrics/VictoriaMetrics/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
|
if [[ ! -f ~/.victoriametrics ]] || [[ "${RELEASE}" != "$(cat ~/.victoriametrics)" ]]; then
|
||||||
msg_info "Stopping $APP"
|
msg_info "Stopping $APP"
|
||||||
systemctl stop victoriametrics
|
systemctl stop victoriametrics
|
||||||
|
[[ -f /etc/systemd/system/victoriametrics-logs.service ]] && systemctl stop victoriametrics-logs
|
||||||
msg_ok "Stopped $APP"
|
msg_ok "Stopped $APP"
|
||||||
|
|
||||||
msg_info "Updating ${APP} to v${RELEASE}"
|
fetch_and_deploy_gh_release "victoriametrics" "VictoriaMetrics/VictoriaMetrics" "prebuild" "latest" "/opt/victoriametrics" "victoria-metrics-linux-amd64-v+([0-9.]).tar.gz"
|
||||||
temp_dir=$(mktemp -d)
|
fetch_and_deploy_gh_release "vmutils" "VictoriaMetrics/VictoriaMetrics" "prebuild" "latest" "/opt/victoriametrics" "vmutils-linux-amd64-v+([0-9.]).tar.gz"
|
||||||
cd $temp_dir
|
fetch_and_deploy_gh_release "victorialogs" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "victoria-logs-linux-amd64*.tar.gz"
|
||||||
curl -fsSL "https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v${RELEASE}/victoria-metrics-linux-amd64-v${RELEASE}.tar.gz" -o $(basename "https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v${RELEASE}/victoria-metrics-linux-amd64-v${RELEASE}.tar.gz")
|
fetch_and_deploy_gh_release "vlutils" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "vlutils-linux-amd64*.tar.gz"
|
||||||
curl -fsSL "https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v${RELEASE}/vmutils-linux-amd64-v${RELEASE}.tar.gz" -o $(basename "https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v${RELEASE}/vmutils-linux-amd64-v${RELEASE}.tar.gz")
|
|
||||||
find /opt/victoriametrics -maxdepth 1 -type f -executable -delete
|
|
||||||
tar -xf victoria-metrics-linux-amd64-v${RELEASE}.tar.gz -C /opt/victoriametrics
|
|
||||||
tar -xf vmutils-linux-amd64-v${RELEASE}.tar.gz -C /opt/victoriametrics
|
|
||||||
chmod +x /opt/victoriametrics/*
|
chmod +x /opt/victoriametrics/*
|
||||||
echo "${RELEASE}" >/opt/${APP}_version.txt
|
|
||||||
msg_ok "Updated $APP to v${RELEASE}"
|
|
||||||
|
|
||||||
msg_info "Starting $APP"
|
msg_info "Starting $APP"
|
||||||
systemctl start victoriametrics
|
systemctl start victoriametrics
|
||||||
|
[[ -f /etc/systemd/system/victoriametrics-logs.service ]] && systemctl start victoriametrics-logs
|
||||||
msg_ok "Started $APP"
|
msg_ok "Started $APP"
|
||||||
|
|
||||||
msg_info "Cleaning Up"
|
|
||||||
rm -rf $temp_dir
|
|
||||||
msg_ok "Cleaned"
|
|
||||||
msg_ok "Updated Successfully"
|
msg_ok "Updated Successfully"
|
||||||
else
|
else
|
||||||
msg_ok "No update required. ${APP} is already at ${RELEASE}"
|
msg_ok "No update required. ${APP} is already at ${RELEASE}"
|
||||||
|
|||||||
@@ -41,6 +41,9 @@ function update_script() {
|
|||||||
rm -rf /opt/wallos/db/wallos.empty.db
|
rm -rf /opt/wallos/db/wallos.empty.db
|
||||||
mv /opt/wallos.db /opt/wallos/db/wallos.db
|
mv /opt/wallos.db /opt/wallos/db/wallos.db
|
||||||
mv /opt/logos/* /opt/wallos/images/uploads/logos
|
mv /opt/logos/* /opt/wallos/images/uploads/logos
|
||||||
|
if ! grep -q "storetotalyearlycost.php" /opt/wallos.cron; then
|
||||||
|
echo "30 1 * * 1 php /opt/wallos/endpoints/cronjobs/storetotalyearlycost.php >> /var/log/cron/storetotalyearlycost.log 2>&1" >> /opt/wallos.cron
|
||||||
|
fi
|
||||||
chown -R www-data:www-data /opt/wallos
|
chown -R www-data:www-data /opt/wallos
|
||||||
chmod -R 755 /opt/wallos
|
chmod -R 755 /opt/wallos
|
||||||
mkdir -p /var/log/cron
|
mkdir -p /var/log/cron
|
||||||
|
|||||||
@@ -45,13 +45,13 @@ function update_script() {
|
|||||||
|
|
||||||
msg_info "Updating $APP to v${RELEASE}"
|
msg_info "Updating $APP to v${RELEASE}"
|
||||||
cd /opt/wizarr
|
cd /opt/wizarr
|
||||||
uv -q sync --locked
|
/usr/local/bin/uv -q sync --locked
|
||||||
$STD uv -q run pybabel compile -d app/translations
|
$STD /usr/local/bin/uv -q run pybabel compile -d app/translations
|
||||||
$STD npm --prefix app/static install
|
$STD npm --prefix app/static install
|
||||||
$STD npm --prefix app/static run build:css
|
$STD npm --prefix app/static run build:css
|
||||||
mkdir -p ./.cache
|
mkdir -p ./.cache
|
||||||
$STD tar -xf "$BACKUP_FILE" --directory=/
|
$STD tar -xf "$BACKUP_FILE" --directory=/
|
||||||
$STD uv -q run flask db upgrade
|
$STD /usr/local/bin/uv -q run flask db upgrade
|
||||||
msg_ok "Updated $APP to v${RELEASE}"
|
msg_ok "Updated $APP to v${RELEASE}"
|
||||||
|
|
||||||
msg_info "Starting $APP"
|
msg_info "Starting $APP"
|
||||||
|
|||||||
6
frontend/package-lock.json
generated
6
frontend/package-lock.json
generated
@@ -7749,9 +7749,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/form-data": {
|
"node_modules/form-data": {
|
||||||
"version": "4.0.3",
|
"version": "4.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
|
||||||
"integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==",
|
"integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "Calibre-Web",
|
|
||||||
"slug": "calibre-web",
|
|
||||||
"categories": [
|
|
||||||
11
|
|
||||||
],
|
|
||||||
"date_created": "2024-05-02",
|
|
||||||
"type": "ct",
|
|
||||||
"updateable": true,
|
|
||||||
"privileged": false,
|
|
||||||
"interface_port": 8083,
|
|
||||||
"documentation": "https://github.com/janeczku/calibre-web/wiki",
|
|
||||||
"website": "https://github.com/janeczku/calibre-web",
|
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/calibre-web.webp",
|
|
||||||
"config_path": "",
|
|
||||||
"description": "Calibre-Web is a web app for browsing, reading and downloading eBooks stored in a Calibre database.",
|
|
||||||
"install_methods": [
|
|
||||||
{
|
|
||||||
"type": "default",
|
|
||||||
"script": "ct/calibre-web.sh",
|
|
||||||
"resources": {
|
|
||||||
"cpu": 2,
|
|
||||||
"ram": 2048,
|
|
||||||
"hdd": 4,
|
|
||||||
"os": "debian",
|
|
||||||
"version": "12"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"default_credentials": {
|
|
||||||
"username": "admin",
|
|
||||||
"password": "admin123"
|
|
||||||
},
|
|
||||||
"notes": [
|
|
||||||
{
|
|
||||||
"text": "Add Calibre-Web Extras via `update`",
|
|
||||||
"type": "info"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
35
frontend/public/json/cleanuparr.json
Normal file
35
frontend/public/json/cleanuparr.json
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
{
|
||||||
|
"name": "Cleanuparr",
|
||||||
|
"slug": "cleanuparr",
|
||||||
|
"categories": [
|
||||||
|
14
|
||||||
|
],
|
||||||
|
"date_created": "2025-07-25",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": 11011,
|
||||||
|
"documentation": "https://cleanuparr.github.io/Cleanuparr/docs/",
|
||||||
|
"website": "https://github.com/Cleanuparr/Cleanuparr",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/cleanuparr.webp",
|
||||||
|
"config_path": "/opt/cleanuparr/config",
|
||||||
|
"description": "Cleanuparr is a tool for automating the cleanup of unwanted or blocked files in Sonarr, Radarr, and supported download clients like qBittorrent, Transmission, and Deluge. It removes incomplete, blocked, or malicious downloads and can trigger replacement searches to ensure your media library stays complete and up-to-date.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/cleanuparr.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 2,
|
||||||
|
"ram": 1024,
|
||||||
|
"hdd": 4,
|
||||||
|
"os": "debian",
|
||||||
|
"version": "12"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": []
|
||||||
|
}
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
"documentation": "https://docs.cloudreve.org/en/",
|
"documentation": "https://docs.cloudreve.org/en/",
|
||||||
"website": "https://cloudreve.org/",
|
"website": "https://cloudreve.org/",
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/cloudreve.webp",
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/cloudreve.webp",
|
||||||
"config_path": "/opt/cloudreve/data/config.ini",
|
"config_path": "/opt/cloudreve/data/conf.ini",
|
||||||
"description": "Cloudreve is an open-source, community-driven cloud storage system that provides file sharing, synchronization, and management features. It supports a wide range of storage backends and integrates with various notification and logging platforms.",
|
"description": "Cloudreve is an open-source, community-driven cloud storage system that provides file sharing, synchronization, and management features. It supports a wide range of storage backends and integrates with various notification and logging platforms.",
|
||||||
"install_methods": [
|
"install_methods": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"updateable": true,
|
"updateable": true,
|
||||||
"privileged": false,
|
"privileged": false,
|
||||||
"interface_port": 3012,
|
"interface_port": 3012,
|
||||||
"documentation": null,
|
"documentation": "https://github.com/jhuckaby/Cronicle/blob/master/README.md",
|
||||||
"website": "https://github.com/jhuckaby/Cronicle",
|
"website": "https://github.com/jhuckaby/Cronicle",
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/chronicle.webp",
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/chronicle.webp",
|
||||||
"config_path": "/opt/cronicle/conf/config.json",
|
"config_path": "/opt/cronicle/conf/config.json",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
],
|
],
|
||||||
"date_created": "2024-05-02",
|
"date_created": "2024-05-02",
|
||||||
"type": "ct",
|
"type": "ct",
|
||||||
"updateable": false,
|
"updateable": true,
|
||||||
"privileged": false,
|
"privileged": false,
|
||||||
"interface_port": 80,
|
"interface_port": 80,
|
||||||
"documentation": "https://gotify.net/docs/index",
|
"documentation": "https://gotify.net/docs/index",
|
||||||
|
|||||||
@@ -35,6 +35,10 @@
|
|||||||
{
|
{
|
||||||
"text": "Configuration settings: `/etc/headscale/config.yaml`",
|
"text": "Configuration settings: `/etc/headscale/config.yaml`",
|
||||||
"type": "info"
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Access headscale-admin UI via `http://<LXC-IP>/admin/`",
|
||||||
|
"type": "info"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"updateable": false,
|
"updateable": false,
|
||||||
"privileged": false,
|
"privileged": false,
|
||||||
"interface_port": 1883,
|
"interface_port": 1883,
|
||||||
"documentation": null,
|
"documentation": "https://github.com/hivemq/hivemq-community-edition/wiki",
|
||||||
"website": "https://www.hivemq.com/",
|
"website": "https://www.hivemq.com/",
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/hivemq.webp",
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/hivemq.webp",
|
||||||
"config_path": "/opt/hivemq/conf/config.xml",
|
"config_path": "/opt/hivemq/conf/config.xml",
|
||||||
|
|||||||
44
frontend/public/json/linkstack.json
Normal file
44
frontend/public/json/linkstack.json
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
{
|
||||||
|
"name": "LinkStack",
|
||||||
|
"slug": "linkstack",
|
||||||
|
"categories": [
|
||||||
|
9
|
||||||
|
],
|
||||||
|
"date_created": "2025-07-22",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"config_path": "/var/www/html/linkstack/.env",
|
||||||
|
"interface_port": 80,
|
||||||
|
"documentation": "https://docs.linkstack.org/",
|
||||||
|
"website": "https://linkstack.org/",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/linkstack.webp",
|
||||||
|
"description": "LinkStack is an open-source, self-hosted alternative to Linktree, allowing users to create a customizable profile page to share multiple links, hosted on their own server.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/linkstack.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 1,
|
||||||
|
"ram": 1024,
|
||||||
|
"hdd": 5,
|
||||||
|
"os": "Debian",
|
||||||
|
"version": "12"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "LinkStack can be updated via the user interface.",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Complete setup via the web interface at http://<container-ip>/. Check installation logs: `cat ~/linkstack-install.log`",
|
||||||
|
"type": "info"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
"documentation": "https://docs.n8n.io/",
|
"documentation": "https://docs.n8n.io/",
|
||||||
"website": "https://n8n.io/",
|
"website": "https://n8n.io/",
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/n8n.webp",
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/n8n.webp",
|
||||||
"config_path": "",
|
"config_path": "/opt/n8n.env",
|
||||||
"description": "n8n is a workflow automation tool that enables users to automate various tasks and processes by connecting various data sources, systems, and services. It provides a visual interface for building workflows, allowing users to easily define and automate complex sequences of actions, such as data processing, conditional branching, and API calls. n8n supports a wide range of integrations, making it a versatile tool for automating a variety of use cases, from simple data processing workflows to complex business processes. With its extendable architecture, n8n is designed to be easily customizable and can be adapted to meet the specific needs of different users and industries.",
|
"description": "n8n is a workflow automation tool that enables users to automate various tasks and processes by connecting various data sources, systems, and services. It provides a visual interface for building workflows, allowing users to easily define and automate complex sequences of actions, such as data processing, conditional branching, and API calls. n8n supports a wide range of integrations, making it a versatile tool for automating a variety of use cases, from simple data processing workflows to complex business processes. With its extendable architecture, n8n is designed to be easily customizable and can be adapted to meet the specific needs of different users and industries.",
|
||||||
"install_methods": [
|
"install_methods": [
|
||||||
{
|
{
|
||||||
@@ -31,5 +31,10 @@
|
|||||||
"username": null,
|
"username": null,
|
||||||
"password": null
|
"password": null
|
||||||
},
|
},
|
||||||
"notes": []
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "You may need to configure the `WEBHOOK_URL` in the config file when using a domain.",
|
||||||
|
"type": "info"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"updateable": true,
|
"updateable": true,
|
||||||
"privileged": false,
|
"privileged": false,
|
||||||
"interface_port": 4533,
|
"interface_port": 4533,
|
||||||
"documentation": null,
|
"documentation": "https://www.navidrome.org/docs/",
|
||||||
"website": "https://www.navidrome.org/",
|
"website": "https://www.navidrome.org/",
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/navidrome.webp",
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/navidrome.webp",
|
||||||
"config_path": "/etc/navidrome/navidrome.toml",
|
"config_path": "/etc/navidrome/navidrome.toml",
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"name": "ONLYOFFICE Docs",
|
"name": "ONLYOFFICE Docs",
|
||||||
"slug": "onlyoffice",
|
"slug": "onlyoffice",
|
||||||
"categories": [
|
"categories": [
|
||||||
9
|
12
|
||||||
],
|
],
|
||||||
"date_created": "2025-06-24",
|
"date_created": "2025-06-24",
|
||||||
"type": "ct",
|
"type": "ct",
|
||||||
|
|||||||
@@ -1,41 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "OPNsense",
|
|
||||||
"slug": "opnsense-vm",
|
|
||||||
"categories": [
|
|
||||||
4,
|
|
||||||
2
|
|
||||||
],
|
|
||||||
"date_created": "2025-02-11",
|
|
||||||
"type": "vm",
|
|
||||||
"updateable": true,
|
|
||||||
"privileged": false,
|
|
||||||
"interface_port": 443,
|
|
||||||
"documentation": "https://docs.opnsense.org/",
|
|
||||||
"website": "https://opnsense.org/",
|
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/opnsense.webp",
|
|
||||||
"config_path": "",
|
|
||||||
"description": "OPNsense is an open-source firewall and routing platform based on FreeBSD. It provides advanced security features, including intrusion detection, VPN support, traffic shaping, and web filtering, with an intuitive web interface for easy management. Known for its reliability and regular updates, OPNsense is a popular choice for both businesses and home networks.",
|
|
||||||
"install_methods": [
|
|
||||||
{
|
|
||||||
"type": "default",
|
|
||||||
"script": "vm/opnsense-vm.sh",
|
|
||||||
"resources": {
|
|
||||||
"cpu": 4,
|
|
||||||
"ram": 8192,
|
|
||||||
"hdd": 10,
|
|
||||||
"os": "FreeBSD",
|
|
||||||
"version": "latest"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"default_credentials": {
|
|
||||||
"username": "root",
|
|
||||||
"password": "opnsense"
|
|
||||||
},
|
|
||||||
"notes": [
|
|
||||||
{
|
|
||||||
"text": "It will fail with default settings if there is no vmbr0 and vmbr1 on your node. Use advanced settings in this case.",
|
|
||||||
"type": "warning"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
},
|
},
|
||||||
"notes": [
|
"notes": [
|
||||||
{
|
{
|
||||||
"text": "Create Proxmox-API-Token first: `https://github.com/rcourtman/Pulse?tab=readme-ov-file#creating-a-proxmox-api-token`",
|
"text": "Create Proxmox-API-Token first: `https://github.com/rcourtman/Pulse?tab=readme-ov-file#creating-api-token`",
|
||||||
"type": "Info"
|
"type": "Info"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
35
frontend/public/json/salt.json
Normal file
35
frontend/public/json/salt.json
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
{
|
||||||
|
"name": "Salt",
|
||||||
|
"slug": "salt",
|
||||||
|
"categories": [
|
||||||
|
19
|
||||||
|
],
|
||||||
|
"date_created": "2025-07-22",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"config_path": "/opt/salt/.env",
|
||||||
|
"interface_port": 3000,
|
||||||
|
"documentation": "https://docs.saltproject.io/salt/install-guide/en/latest/",
|
||||||
|
"website": "https://saltproject.io/",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/salt.webp",
|
||||||
|
"description": "SaltStack Salt is a software for automating the management and configuration of IT infrastructure and applications. It is an event-driven automation tool and framework used to deploy, configure, and manage complex IT systems. Its primary functions include configuration management, where it ensures consistent configurations and manages operating system deployment and software installation. It also automates and orchestrates routine IT processes and can create self-aware, self-healing systems.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/salt.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 1,
|
||||||
|
"ram": 1024,
|
||||||
|
"hdd": 3,
|
||||||
|
"os": "Debian",
|
||||||
|
"version": "12"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": []
|
||||||
|
}
|
||||||
55
frontend/public/json/teamspeak-server.json
Normal file
55
frontend/public/json/teamspeak-server.json
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
{
|
||||||
|
"name": "Teamspeak-Server",
|
||||||
|
"slug": "teamspeak-server",
|
||||||
|
"categories": [
|
||||||
|
24
|
||||||
|
],
|
||||||
|
"date_created": "2025-07-21",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": 9987,
|
||||||
|
"documentation": "https://support.teamspeak.com/hc/en-us/categories/360000302017-TeamSpeak-3",
|
||||||
|
"website": "https://teamspeak.com/",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/teamspeak-light.webp",
|
||||||
|
"config_path": "",
|
||||||
|
"description": "TeamSpeak is a voice over IP (VoIP) application, primarily used by gamers and teams to chat in real time on dedicated servers. It delivers crystal‑clear, low‑latency voice communication.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/teamspeak-server.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 1,
|
||||||
|
"ram": 512,
|
||||||
|
"hdd": 2,
|
||||||
|
"os": "debian",
|
||||||
|
"version": "12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "alpine",
|
||||||
|
"script": "ct/alpine-teamspeak-server.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 1,
|
||||||
|
"ram": 256,
|
||||||
|
"hdd": 2,
|
||||||
|
"os": "alpine",
|
||||||
|
"version": "3.22"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "Use `journalctl -u teamspeak-server.service` inside Debian LXC console to check for admin credentials!",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Use `cat /var/log/teamspeak.err.log` inside Alpine LXC console to check for admin credentials!",
|
||||||
|
"type": "info"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -45,7 +45,7 @@ export const navbarLinks = [
|
|||||||
export const mostPopularScripts = ["post-pve-install", "docker", "homeassistant"];
|
export const mostPopularScripts = ["post-pve-install", "docker", "homeassistant"];
|
||||||
|
|
||||||
export const analytics = {
|
export const analytics = {
|
||||||
url: "analytics.community-scripts.org",
|
url: "analytics.bramsuurd.nl",
|
||||||
token: "aefee1b9-2a12-4ac2-9d82-a63113edc62e",
|
token: "aefee1b9-2a12-4ac2-9d82-a63113edc62e",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,8 @@ update_os
|
|||||||
|
|
||||||
msg_info "Installing Dependencies"
|
msg_info "Installing Dependencies"
|
||||||
$STD apt-get install -y \
|
$STD apt-get install -y \
|
||||||
make
|
make \
|
||||||
|
g++
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
msg_info "Installing Actual Budget"
|
msg_info "Installing Actual Budget"
|
||||||
|
|||||||
68
install/alpine-teamspeak-server-install.sh
Normal file
68
install/alpine-teamspeak-server-install.sh
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2025 community-scripts ORG
|
||||||
|
# Author: tremor021 (Slaviša Arežina)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://teamspeak.com/en/
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing dependencies"
|
||||||
|
$STD apk add --no-cache \
|
||||||
|
ca-certificates \
|
||||||
|
libstdc++ \
|
||||||
|
libc6-compat
|
||||||
|
msg_ok "Installed dependencies"
|
||||||
|
|
||||||
|
RELEASE=$(curl -fsSL https://teamspeak.com/en/downloads/#server | sed -n 's/.*teamspeak3-server_linux_amd64-\([0-9.]\+\).*/\1/p' | head -1)
|
||||||
|
msg_info "Installing Teamspeak Server v${RELEASE}"
|
||||||
|
mkdir -p /opt/teamspeak-server
|
||||||
|
cd /opt/teamspeak-server
|
||||||
|
curl -fsSL "https://files.teamspeak-services.com/releases/server/${RELEASE}/teamspeak3-server_linux_amd64-${RELEASE}.tar.bz2" -o ts3server.tar.bz2
|
||||||
|
tar xf ts3server.tar.bz2 --strip-components=1
|
||||||
|
mkdir -p logs data lib
|
||||||
|
mv *.so lib
|
||||||
|
touch data/ts3server.sqlitedb data/query_ip_blacklist.txt data/query_ip_whitelist.txt .ts3server_license_accepted
|
||||||
|
echo "${RELEASE}" >~/.teamspeak-server
|
||||||
|
msg_ok "Installed TeamSpeak Server v${RELEASE}"
|
||||||
|
|
||||||
|
msg_info "Enabling TeamSpeak Server Service"
|
||||||
|
cat <<EOF >/etc/init.d/teamspeak
|
||||||
|
#!/sbin/openrc-run
|
||||||
|
|
||||||
|
name="TeamSpeak Server"
|
||||||
|
description="TeamSpeak 3 Server"
|
||||||
|
command="/opt/teamspeak-server/ts3server_startscript.sh"
|
||||||
|
command_args="start"
|
||||||
|
output_log="/var/log/teamspeak.out.log"
|
||||||
|
error_log="/var/log/teamspeak.err.log"
|
||||||
|
command_background=true
|
||||||
|
pidfile="/run/teamspeak-server.pid"
|
||||||
|
directory="/opt/teamspeak-server"
|
||||||
|
|
||||||
|
depend() {
|
||||||
|
need net
|
||||||
|
use dns
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
chmod +x /etc/init.d/teamspeak
|
||||||
|
$STD rc-update add teamspeak default
|
||||||
|
msg_ok "Enabled TeamSpeak Server Service"
|
||||||
|
|
||||||
|
msg_info "Starting TeamSpeak Server"
|
||||||
|
$STD service teamspeak start
|
||||||
|
msg_ok "Started TeamSpeak Server"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
|
||||||
|
msg_info "Cleaning up"
|
||||||
|
rm -r ts3server.tar.bz* LICENSE* CHANGELOG doc serverquerydocs tsdns redist
|
||||||
|
$STD apk cache clean
|
||||||
|
msg_ok "Cleaned"
|
||||||
@@ -13,17 +13,7 @@ setting_up_container
|
|||||||
network_check
|
network_check
|
||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
fetch_and_deploy_gh_release "Argus" "release-argus/Argus" "singlefile" "latest" "/opt/argus" "Argus*linux-amd64"
|
||||||
$STD apt-get install -y \
|
|
||||||
jq
|
|
||||||
msg_ok "Installed Dependencies"
|
|
||||||
|
|
||||||
msg_info "Setup Argus"
|
|
||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/release-argus/Argus/releases/latest | jq -r .tag_name | sed 's/^v//')
|
|
||||||
mkdir -p /opt/argus
|
|
||||||
curl -fsSL "https://github.com/release-argus/Argus/releases/download/${RELEASE}/Argus-${RELEASE}.linux-amd64" -o /opt/argus/Argus
|
|
||||||
chmod +x /opt/argus/Argus
|
|
||||||
msg_ok "Setup Argus"
|
|
||||||
|
|
||||||
msg_info "Setup Argus Config"
|
msg_info "Setup Argus Config"
|
||||||
cat <<EOF >/opt/argus/config.yml
|
cat <<EOF >/opt/argus/config.yml
|
||||||
@@ -71,7 +61,6 @@ service:
|
|||||||
icon_link_to: https://helper-scripts.com/
|
icon_link_to: https://helper-scripts.com/
|
||||||
web_url: https://github.com/community-scripts/ProxmoxVE/releases
|
web_url: https://github.com/community-scripts/ProxmoxVE/releases
|
||||||
EOF
|
EOF
|
||||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
|
|
||||||
msg_ok "Setup Config"
|
msg_ok "Setup Config"
|
||||||
|
|
||||||
msg_info "Creating Service"
|
msg_info "Creating Service"
|
||||||
|
|||||||
@@ -71,6 +71,8 @@ msg_ok "Created Service MeiliSearch"
|
|||||||
msg_info "Installing Bar Assistant"
|
msg_info "Installing Bar Assistant"
|
||||||
cd /opt/bar-assistant
|
cd /opt/bar-assistant
|
||||||
cp /opt/bar-assistant/.env.dist /opt/bar-assistant/.env
|
cp /opt/bar-assistant/.env.dist /opt/bar-assistant/.env
|
||||||
|
mkdir -p /opt/bar-assistant/resources/data
|
||||||
|
curl -fsSL https://github.com/bar-assistant/data/archive/refs/heads/v5.tar.gz | tar -xz --strip-components=1 -C /opt/bar-assistant/resources/data
|
||||||
MeiliSearch_API_KEY=$(curl -s -X GET 'http://127.0.0.1:7700/keys' -H "Authorization: Bearer $MASTER_KEY" | grep -o '"key":"[^"]*"' | head -n 1 | sed 's/"key":"//;s/"//')
|
MeiliSearch_API_KEY=$(curl -s -X GET 'http://127.0.0.1:7700/keys' -H "Authorization: Bearer $MASTER_KEY" | grep -o '"key":"[^"]*"' | head -n 1 | sed 's/"key":"//;s/"//')
|
||||||
MeiliSearch_API_KEY_UID=$(curl -s -X GET 'http://127.0.0.1:7700/keys' -H "Authorization: Bearer $MASTER_KEY" | grep -o '"uid":"[^"]*"' | head -n 1 | sed 's/"uid":"//;s/"//')
|
MeiliSearch_API_KEY_UID=$(curl -s -X GET 'http://127.0.0.1:7700/keys' -H "Authorization: Bearer $MASTER_KEY" | grep -o '"uid":"[^"]*"' | head -n 1 | sed 's/"uid":"//;s/"//')
|
||||||
LOCAL_IP=$(hostname -I | awk '{print $1}')
|
LOCAL_IP=$(hostname -I | awk '{print $1}')
|
||||||
|
|||||||
@@ -1,67 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2025 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# Co-Author: remz1337
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/janeczku/calibre-web
|
|
||||||
|
|
||||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
|
||||||
color
|
|
||||||
verb_ip6
|
|
||||||
catch_errors
|
|
||||||
setting_up_container
|
|
||||||
network_check
|
|
||||||
update_os
|
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
|
||||||
$STD apt-get install -y imagemagick
|
|
||||||
msg_ok "Installed Dependencies"
|
|
||||||
|
|
||||||
msg_info "Installing Python Dependencies"
|
|
||||||
$STD apt-get -y install python3-pip
|
|
||||||
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
|
|
||||||
msg_ok "Installed Python Dependencies"
|
|
||||||
|
|
||||||
msg_info "Installing Kepubify"
|
|
||||||
mkdir -p /opt/kepubify
|
|
||||||
cd /opt/kepubify
|
|
||||||
curl -fsSLO https://github.com/pgaskin/kepubify/releases/latest/download/kepubify-linux-64bit &>/dev/null
|
|
||||||
chmod +x kepubify-linux-64bit
|
|
||||||
msg_ok "Installed Kepubify"
|
|
||||||
|
|
||||||
msg_info "Installing Calibre-Web"
|
|
||||||
mkdir -p /opt/calibre-web
|
|
||||||
$STD apt-get install -y calibre
|
|
||||||
$STD curl -fsSL https://github.com/janeczku/calibre-web/raw/master/library/metadata.db -o /opt/calibre-web/metadata.db
|
|
||||||
$STD pip install calibreweb
|
|
||||||
$STD pip install jsonschema
|
|
||||||
msg_ok "Installed Calibre-Web"
|
|
||||||
|
|
||||||
msg_info "Creating Service"
|
|
||||||
cat <<EOF >/etc/systemd/system/cps.service
|
|
||||||
[Unit]
|
|
||||||
Description=Calibre-Web Server
|
|
||||||
After=network.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
WorkingDirectory=/opt/calibre-web
|
|
||||||
ExecStart=/usr/local/bin/cps
|
|
||||||
TimeoutStopSec=20
|
|
||||||
KillMode=process
|
|
||||||
Restart=on-failure
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
EOF
|
|
||||||
systemctl enable -q --now cps
|
|
||||||
msg_ok "Created Service"
|
|
||||||
|
|
||||||
motd_ssh
|
|
||||||
customize
|
|
||||||
|
|
||||||
msg_info "Cleaning up"
|
|
||||||
$STD apt-get -y autoremove
|
|
||||||
$STD apt-get -y autoclean
|
|
||||||
msg_ok "Cleaned"
|
|
||||||
46
install/cleanuparr-install.sh
Executable file
46
install/cleanuparr-install.sh
Executable file
@@ -0,0 +1,46 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2025 community-scripts ORG
|
||||||
|
# Author: Lucas Zampieri (zampierilucas) | MickLesk (CanbiZ)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/Cleanuparr/Cleanuparr
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "Cleanuparr" "Cleanuparr/Cleanuparr" "prebuild" "latest" "/opt/cleanuparr" "*linux-amd64.zip"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/cleanuparr.service
|
||||||
|
[Unit]
|
||||||
|
Description=Cleanuparr Daemon
|
||||||
|
After=syslog.target network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=/opt/cleanuparr
|
||||||
|
ExecStart=/opt/cleanuparr/Cleanuparr
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
Environment="PORT=11011"
|
||||||
|
Environment="CONFIG_DIR=/opt/cleanuparr/config"
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now cleanuparr
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
|
||||||
|
msg_info "Cleaning up"
|
||||||
|
$STD apt-get -y autoremove
|
||||||
|
$STD apt-get -y autoclean
|
||||||
|
msg_ok "Cleaned"
|
||||||
@@ -14,13 +14,11 @@ network_check
|
|||||||
update_os
|
update_os
|
||||||
|
|
||||||
NODE_VERSION="22" setup_nodejs
|
NODE_VERSION="22" setup_nodejs
|
||||||
|
fetch_and_deploy_gh_release "cronicle" "jhuckaby/Cronicle"
|
||||||
|
|
||||||
msg_info "Installing Cronicle Primary Server"
|
msg_info "Configuring Cronicle Primary Server"
|
||||||
LATEST=$(curl -fsSL https://api.github.com/repos/jhuckaby/Cronicle/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
|
|
||||||
IP=$(hostname -I | awk '{print $1}')
|
IP=$(hostname -I | awk '{print $1}')
|
||||||
mkdir -p /opt/cronicle
|
|
||||||
cd /opt/cronicle
|
cd /opt/cronicle
|
||||||
$STD tar zxvf <(curl -fsSL https://github.com/jhuckaby/Cronicle/archive/${LATEST}.tar.gz) --strip-components 1
|
|
||||||
$STD npm install
|
$STD npm install
|
||||||
$STD node bin/build.js dist
|
$STD node bin/build.js dist
|
||||||
sed -i "s/localhost:3012/${IP}:3012/g" /opt/cronicle/conf/config.json
|
sed -i "s/localhost:3012/${IP}:3012/g" /opt/cronicle/conf/config.json
|
||||||
@@ -29,7 +27,7 @@ $STD /opt/cronicle/bin/control.sh start
|
|||||||
$STD cp /opt/cronicle/bin/cronicled.init /etc/init.d/cronicled
|
$STD cp /opt/cronicle/bin/cronicled.init /etc/init.d/cronicled
|
||||||
chmod 775 /etc/init.d/cronicled
|
chmod 775 /etc/init.d/cronicled
|
||||||
$STD update-rc.d cronicled defaults
|
$STD update-rc.d cronicled defaults
|
||||||
msg_ok "Installed Cronicle Primary Server"
|
msg_ok "Configured Cronicle Primary Server"
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
customize
|
customize
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ msg_ok "Installed Documenso"
|
|||||||
|
|
||||||
msg_info "Create User"
|
msg_info "Create User"
|
||||||
PASSWORD_HASH=$(python3 -c "import bcrypt; print(bcrypt.hashpw(b'helper-scripts', bcrypt.gensalt(rounds=12)).decode())")
|
PASSWORD_HASH=$(python3 -c "import bcrypt; print(bcrypt.hashpw(b'helper-scripts', bcrypt.gensalt(rounds=12)).decode())")
|
||||||
$STD sudo -u postgres psql -d documenso_db -c "INSERT INTO \"User\" (name, email, \"emailVerified\", password, \"identityProvider\", roles, \"createdAt\", \"lastSignedIn\", \"updatedAt\", \"customerId\") VALUES ('helper-scripts', 'helper-scripts@local.com', '2025-01-20 17:14:45.058', '$PASSWORD_HASH', 'DOCUMENSO', ARRAY['USER', 'ADMIN']::\"Role\"[], '2025-01-20 16:04:05.543', '2025-01-20 16:14:55.249', '2025-01-20 16:14:55.25', NULL) RETURNING id;"
|
$STD sudo -u postgres psql -d documenso_db -c "INSERT INTO \"User\" (name, email, \"emailVerified\", password, \"identityProvider\", roles, \"createdAt\", \"lastSignedIn\", \"updatedAt\") VALUES ('helper-scripts', 'helper-scripts@local.com', '2025-01-20 17:14:45.058', '$PASSWORD_HASH', 'DOCUMENSO', ARRAY['USER', 'ADMIN']::\"Role\"[], '2025-01-20 16:04:05.543', '2025-01-20 16:14:55.249', '2025-01-20 16:14:55.25') RETURNING id;"
|
||||||
$STD npm run prisma:migrate-deploy
|
$STD npm run prisma:migrate-deploy
|
||||||
msg_ok "User created"
|
msg_ok "User created"
|
||||||
|
|
||||||
|
|||||||
@@ -20,19 +20,16 @@ $STD apt-get install -y \
|
|||||||
libfontconfig1
|
libfontconfig1
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
msg_info "Setting up Duplicati"
|
fetch_and_deploy_gh_release "duplicati" "duplicati/duplicati" "binary" "latest" "/opt/duplicati" "linux-x64-gui.deb"
|
||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/duplicati/duplicati/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4)}')
|
|
||||||
curl -fsSL "https://github.com/duplicati/duplicati/releases/download/v${RELEASE}/duplicati-${RELEASE}-linux-x64-gui.deb" -o "duplicati-${RELEASE}-linux-x64-gui.deb"
|
|
||||||
$STD dpkg -i duplicati-${RELEASE}-linux-x64-gui.deb
|
|
||||||
echo "${RELEASE}" >/opt/Duplicati_version.txt
|
|
||||||
msg_ok "Finished setting up Duplicati"
|
|
||||||
|
|
||||||
|
msg_info "Configuring duplicati"
|
||||||
DECRYPTKEY=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
DECRYPTKEY=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
||||||
ADMINPASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
ADMINPASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
||||||
{
|
{
|
||||||
echo "Admin password = ${ADMINPASS}"
|
echo "Admin password = ${ADMINPASS}"
|
||||||
echo "Database encryption key = ${DECRYPTKEY}"
|
echo "Database encryption key = ${DECRYPTKEY}"
|
||||||
} >>~/duplicati.creds
|
} >>~/duplicati.creds
|
||||||
|
msg_ok "Configured duplicati"
|
||||||
|
|
||||||
msg_info "Creating Service"
|
msg_info "Creating Service"
|
||||||
cat <<EOF >/etc/systemd/system/duplicati.service
|
cat <<EOF >/etc/systemd/system/duplicati.service
|
||||||
@@ -54,10 +51,6 @@ motd_ssh
|
|||||||
customize
|
customize
|
||||||
|
|
||||||
msg_info "Cleaning up"
|
msg_info "Cleaning up"
|
||||||
rm -f duplicati-${RELEASE}-linux-x64-gui.deb
|
|
||||||
$STD apt-get -y autoremove
|
$STD apt-get -y autoremove
|
||||||
$STD apt-get -y autoclean
|
$STD apt-get -y autoclean
|
||||||
msg_ok "Cleaned"
|
msg_ok "Cleaned"
|
||||||
|
|
||||||
motd_ssh
|
|
||||||
customize
|
|
||||||
|
|||||||
@@ -13,8 +13,6 @@ setting_up_container
|
|||||||
network_check
|
network_check
|
||||||
update_os
|
update_os
|
||||||
|
|
||||||
FFMPEG_VERSION="latest" FFMPEG_TYPE="full" setup_ffmpeg
|
|
||||||
|
|
||||||
msg_info "Setting Up Hardware Acceleration"
|
msg_info "Setting Up Hardware Acceleration"
|
||||||
$STD apt-get -y install {va-driver-all,ocl-icd-libopencl1,intel-opencl-icd,vainfo,intel-gpu-tools}
|
$STD apt-get -y install {va-driver-all,ocl-icd-libopencl1,intel-opencl-icd,vainfo,intel-gpu-tools}
|
||||||
if [[ "$CTTYPE" == "0" ]]; then
|
if [[ "$CTTYPE" == "0" ]]; then
|
||||||
@@ -26,7 +24,37 @@ if [[ "$CTTYPE" == "0" ]]; then
|
|||||||
fi
|
fi
|
||||||
msg_ok "Set Up Hardware Acceleration"
|
msg_ok "Set Up Hardware Acceleration"
|
||||||
|
|
||||||
|
read -r -p "${TAB3}Do you need the intel-media-va-driver-non-free driver for HW encoding (Debian 12 only)? <y/N> " prompt
|
||||||
|
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
||||||
|
msg_info "Installing Intel Hardware Acceleration (non-free)"
|
||||||
|
cat <<EOF >/etc/apt/sources.list.d/non-free.list
|
||||||
|
|
||||||
|
deb http://deb.debian.org/debian bookworm non-free non-free-firmware
|
||||||
|
deb-src http://deb.debian.org/debian bookworm non-free non-free-firmware
|
||||||
|
|
||||||
|
deb http://deb.debian.org/debian-security bookworm-security non-free non-free-firmware
|
||||||
|
deb-src http://deb.debian.org/debian-security bookworm-security non-free non-free-firmware
|
||||||
|
|
||||||
|
deb http://deb.debian.org/debian bookworm-updates non-free non-free-firmware
|
||||||
|
deb-src http://deb.debian.org/debian bookworm-updates non-free non-free-firmware
|
||||||
|
EOF
|
||||||
|
$STD apt-get update
|
||||||
|
$STD apt-get -y install {intel-media-va-driver-non-free,ocl-icd-libopencl1,intel-opencl-icd,vainfo,intel-gpu-tools}
|
||||||
|
else
|
||||||
|
msg_info "Installing Intel Hardware Acceleration"
|
||||||
|
$STD apt-get -y install {va-driver-all,ocl-icd-libopencl1,intel-opencl-icd,vainfo,intel-gpu-tools}
|
||||||
|
fi
|
||||||
|
msg_ok "Installed and Set Up Intel Hardware Acceleration"
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "ersatztv" "ErsatzTV/ErsatzTV" "prebuild" "latest" "/opt/ErsatzTV" "*linux-x64.tar.gz"
|
fetch_and_deploy_gh_release "ersatztv" "ErsatzTV/ErsatzTV" "prebuild" "latest" "/opt/ErsatzTV" "*linux-x64.tar.gz"
|
||||||
|
fetch_and_deploy_gh_release "ersatztv-ffmpeg" "ErsatzTV/ErsatzTV-ffmpeg" "prebuild" "latest" "/opt/ErsatzTV-ffmpeg" "*-linux64-gpl-7.1.tar.xz"
|
||||||
|
|
||||||
|
msg_info "Set ErsatzTV-ffmpeg links"
|
||||||
|
chmod +x /opt/ErsatzTV-ffmpeg/bin/*
|
||||||
|
ln -sf /opt/ErsatzTV-ffmpeg/bin/ffmpeg /usr/local/bin/ffmpeg
|
||||||
|
ln -sf /opt/ErsatzTV-ffmpeg/bin/ffplay /usr/local/bin/ffplay
|
||||||
|
ln -sf /opt/ErsatzTV-ffmpeg/bin/ffprobe /usr/local/bin/ffprobe
|
||||||
|
msg_ok "ffmpeg links set"
|
||||||
|
|
||||||
msg_info "Creating Service"
|
msg_info "Creating Service"
|
||||||
cat <<EOF >/etc/systemd/system/ersatzTV.service
|
cat <<EOF >/etc/systemd/system/ersatzTV.service
|
||||||
|
|||||||
@@ -42,10 +42,7 @@ if [[ "$CTTYPE" == "0" ]]; then
|
|||||||
fi
|
fi
|
||||||
msg_ok "Set Up Hardware Acceleration"
|
msg_ok "Set Up Hardware Acceleration"
|
||||||
|
|
||||||
#RELEASE=$(curl -fsSL https://api.github.com/repos/blakeblackshear/frigate/releases/latest | jq -r '.tag_name')
|
|
||||||
msg_ok "Stop spinner to prevent segmentation fault"
|
|
||||||
msg_info "Installing Frigate v0.14.1 (Perseverance)"
|
msg_info "Installing Frigate v0.14.1 (Perseverance)"
|
||||||
if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID >/dev/null; then kill $SPINNER_PID >/dev/null; fi
|
|
||||||
cd ~
|
cd ~
|
||||||
mkdir -p /opt/frigate/models
|
mkdir -p /opt/frigate/models
|
||||||
curl -fsSL "https://github.com/blakeblackshear/frigate/archive/refs/tags/v0.14.1.tar.gz" -o "frigate.tar.gz"
|
curl -fsSL "https://github.com/blakeblackshear/frigate/archive/refs/tags/v0.14.1.tar.gz" -o "frigate.tar.gz"
|
||||||
|
|||||||
@@ -13,15 +13,10 @@ setting_up_container
|
|||||||
network_check
|
network_check
|
||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing go2rtc"
|
USE_ORIGINAL_FILENAME="true" fetch_and_deploy_gh_release "go2rtc" "AlexxIT/go2rtc" "singlefile" "latest" "/opt/go2rtc" "go2rtc_linux_amd64"
|
||||||
mkdir -p /opt/go2rtc
|
|
||||||
cd /opt/go2rtc
|
|
||||||
curl -fsSL "https://github.com/AlexxIT/go2rtc/releases/latest/download/go2rtc_linux_amd64" -o "go2rtc_linux_amd64"
|
|
||||||
chmod +x go2rtc_linux_amd64
|
|
||||||
msg_ok "Installed go2rtc"
|
|
||||||
|
|
||||||
msg_info "Creating Service"
|
msg_info "Creating Service"
|
||||||
service_path="/etc/systemd/system/go2rtc.service"
|
cat <<EOF >/etc/systemd/system/go2rtc.service
|
||||||
echo "[Unit]
|
echo "[Unit]
|
||||||
Description=go2rtc service
|
Description=go2rtc service
|
||||||
After=network.target
|
After=network.target
|
||||||
@@ -32,7 +27,8 @@ User=root
|
|||||||
ExecStart=/opt/go2rtc/go2rtc_linux_amd64
|
ExecStart=/opt/go2rtc/go2rtc_linux_amd64
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target" >$service_path
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
systemctl enable -q --now go2rtc
|
systemctl enable -q --now go2rtc
|
||||||
msg_ok "Created Service"
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
|||||||
@@ -13,14 +13,12 @@ setting_up_container
|
|||||||
network_check
|
network_check
|
||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing Gokapi"
|
fetch_and_deploy_gh_release "gokapi" "Forceu/Gokapi" "prebuild" "latest" "/opt/gokapi" "gokapi-linux_amd64.zip"
|
||||||
LATEST=$(curl -fsSL https://api.github.com/repos/Forceu/Gokapi/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
|
|
||||||
|
msg_info "Configuring Gokapi"
|
||||||
mkdir -p /opt/gokapi/{data,config}
|
mkdir -p /opt/gokapi/{data,config}
|
||||||
curl -fsSL "https://github.com/Forceu/Gokapi/releases/download/$LATEST/gokapi-linux_amd64.zip" -o "gokapi-linux_amd64.zip"
|
|
||||||
$STD unzip gokapi-linux_amd64.zip -d /opt/gokapi
|
|
||||||
rm gokapi-linux_amd64.zip
|
|
||||||
chmod +x /opt/gokapi/gokapi-linux_amd64
|
chmod +x /opt/gokapi/gokapi-linux_amd64
|
||||||
msg_ok "Installed Gokapi"
|
msg_ok "Configured Gokapi"
|
||||||
|
|
||||||
msg_info "Creating Service"
|
msg_info "Creating Service"
|
||||||
cat <<EOF >/etc/systemd/system/gokapi.service
|
cat <<EOF >/etc/systemd/system/gokapi.service
|
||||||
|
|||||||
@@ -13,16 +13,8 @@ setting_up_container
|
|||||||
network_check
|
network_check
|
||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing Gotify"
|
fetch_and_deploy_gh_release "gotify" "gotify/server" "prebuild" "latest" "/opt/gotify" "gotify-linux-amd64.zip"
|
||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/gotify/server/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
chmod +x /opt/gotify/gotify-linux-amd64
|
||||||
mkdir -p /opt/gotify
|
|
||||||
cd /opt/gotify
|
|
||||||
curl -fsSL "https://github.com/gotify/server/releases/download/v${RELEASE}/gotify-linux-amd64.zip" -o "gotify-linux-amd64.zip"
|
|
||||||
$STD unzip gotify-linux-amd64.zip
|
|
||||||
rm -rf gotify-linux-amd64.zip
|
|
||||||
chmod +x gotify-linux-amd64
|
|
||||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
|
|
||||||
msg_ok "Installed Gotify"
|
|
||||||
|
|
||||||
msg_info "Creating Service"
|
msg_info "Creating Service"
|
||||||
cat <<EOF >/etc/systemd/system/gotify.service
|
cat <<EOF >/etc/systemd/system/gotify.service
|
||||||
|
|||||||
@@ -14,20 +14,20 @@ network_check
|
|||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
msg_info "Installing Dependencies"
|
||||||
$STD apt-get install -y apt-transport-https
|
$STD apt-get install -y \
|
||||||
$STD apt-get install -y software-properties-common
|
apt-transport-https \
|
||||||
|
software-properties-common
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
msg_info "Setting up Grafana Repository"
|
msg_info "Setting up Grafana Repository"
|
||||||
curl -fsSL "https://apt.grafana.com/gpg.key" -o "/usr/share/keyrings/grafana.key"
|
curl -fsSL "https://apt.grafana.com/gpg.key" -o "/usr/share/keyrings/grafana.key"
|
||||||
sh -c 'echo "deb [signed-by=/usr/share/keyrings/grafana.key] https://apt.grafana.com stable main" > /etc/apt/sources.list.d/grafana.list'
|
echo "deb [signed-by=/usr/share/keyrings/grafana.key] https://apt.grafana.com stable main" >/etc/apt/sources.list.d/grafana.list
|
||||||
msg_ok "Set up Grafana Repository"
|
msg_ok "Set up Grafana Repository"
|
||||||
|
|
||||||
msg_info "Installing Grafana"
|
msg_info "Installing Grafana"
|
||||||
$STD apt-get update
|
$STD apt-get update
|
||||||
$STD apt-get install -y grafana
|
$STD apt-get install -y grafana
|
||||||
systemctl start grafana-server
|
systemctl enable -q --now grafana-server
|
||||||
systemctl enable --now -q grafana-server.service
|
|
||||||
msg_ok "Installed Grafana"
|
msg_ok "Installed Grafana"
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
|
|||||||
@@ -17,23 +17,10 @@ msg_info "Installing Dependencies"
|
|||||||
$STD apt-get install -y apt-transport-https
|
$STD apt-get install -y apt-transport-https
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
msg_info "Installing PHP8.2"
|
PHP_VERSION="8.3" PHP_MODULE="sqlite3,bz2" PHP_APACHE="yes" setup_php
|
||||||
VERSION="$(awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release)"
|
fetch_and_deploy_gh_release "grocy" "grocy/grocy" "prebuild" "latest" "/var/www/html" "grocy*.zip"
|
||||||
curl -fsSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg
|
|
||||||
echo -e "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $VERSION main" >/etc/apt/sources.list.d/php.list
|
|
||||||
$STD apt-get update
|
|
||||||
$STD apt-get install -y php8.2
|
|
||||||
$STD apt-get install -y libapache2-mod-php8.2
|
|
||||||
$STD apt-get install -y php8.2-sqlite3
|
|
||||||
$STD apt-get install -y php8.2-gd
|
|
||||||
$STD apt-get install -y php8.2-intl
|
|
||||||
$STD apt-get install -y php8.2-mbstring
|
|
||||||
msg_ok "Installed PHP8.2"
|
|
||||||
|
|
||||||
msg_info "Installing grocy"
|
msg_info "Configuring grocy"
|
||||||
latest=$(curl -fsSL https://api.github.com/repos/grocy/grocy/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
|
||||||
curl -fsSL "https://github.com/grocy/grocy/releases/download/v${latest}/grocy_${latest}.zip" -o "grocy_${latest}.zip"
|
|
||||||
$STD unzip grocy_${latest}.zip -d /var/www/html
|
|
||||||
chown -R www-data:www-data /var/www/html
|
chown -R www-data:www-data /var/www/html
|
||||||
cp /var/www/html/config-dist.php /var/www/html/data/config.php
|
cp /var/www/html/config-dist.php /var/www/html/data/config.php
|
||||||
chmod +x /var/www/html/update.sh
|
chmod +x /var/www/html/update.sh
|
||||||
@@ -64,5 +51,4 @@ customize
|
|||||||
msg_info "Cleaning up"
|
msg_info "Cleaning up"
|
||||||
$STD apt-get -y autoremove
|
$STD apt-get -y autoremove
|
||||||
$STD apt-get -y autoclean
|
$STD apt-get -y autoclean
|
||||||
rm -rf /root/grocy_${latest}.zip
|
|
||||||
msg_ok "Cleaned"
|
msg_ok "Cleaned"
|
||||||
|
|||||||
@@ -22,16 +22,17 @@ curl -fsSL "http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1
|
|||||||
$STD dpkg -i libssl1.1_1.1.1f-1ubuntu2_amd64.deb
|
$STD dpkg -i libssl1.1_1.1.1f-1ubuntu2_amd64.deb
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
NODE_VERSION="20" NODE_MODULE="gulp-cli,mocha" setup_nodejs
|
NODE_VERSION="20" NODE_MODULE="gulp-cli,mocha,npm@10" setup_nodejs
|
||||||
fetch_and_deploy_gh_release "habitica" "HabitRPG/habitica" "tarball" "latest" "/opt/habitica"
|
fetch_and_deploy_gh_release "habitica" "HabitRPG/habitica" "tarball" "latest" "/opt/habitica"
|
||||||
|
|
||||||
msg_info "Setup ${APPLICATION}"
|
msg_info "Setup ${APPLICATION}"
|
||||||
cd /opt/habitica
|
cd /opt/habitica
|
||||||
$STD npm i
|
$STD npm i
|
||||||
$STD npm run postinstall
|
$STD npm run postinstall
|
||||||
|
cp config.json.example config.json
|
||||||
$STD npm run client:build
|
$STD npm run client:build
|
||||||
$STD gulp build:prod
|
$STD gulp build:prod
|
||||||
cp config.json.example config.json
|
|
||||||
msg_ok "Setup ${APPLICATION}"
|
msg_ok "Setup ${APPLICATION}"
|
||||||
|
|
||||||
msg_info "Creating Service"
|
msg_info "Creating Service"
|
||||||
|
|||||||
@@ -13,19 +13,53 @@ setting_up_container
|
|||||||
network_check
|
network_check
|
||||||
update_os
|
update_os
|
||||||
|
|
||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/juanfont/headscale/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
fetch_and_deploy_gh_release "headscale" "juanfont/headscale" "binary"
|
||||||
msg_info "Installing ${APPLICATION} v${RELEASE}"
|
|
||||||
curl -fsSL "https://github.com/juanfont/headscale/releases/download/v${RELEASE}/headscale_${RELEASE}_linux_amd64.deb" -o "headscale_${RELEASE}_linux_amd64.deb"
|
read -r -p "${TAB3}Would you like to add headscale-admin UI? <y/N> " prompt
|
||||||
$STD dpkg -i headscale_${RELEASE}_linux_amd64.deb
|
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
||||||
|
fetch_and_deploy_gh_release "headscale-admin" "GoodiesHQ/headscale-admin" "prebuild" "latest" "/opt/headscale-admin" "admin.zip"
|
||||||
|
|
||||||
|
msg_info "Configuring headscale-admin"
|
||||||
|
$STD apt-get install -y caddy
|
||||||
|
$STD caddy stop
|
||||||
|
rm /etc/caddy/Caddyfile
|
||||||
|
cat <<'EOF' >/etc/caddy/Caddyfile
|
||||||
|
:{$PORT:80}
|
||||||
|
|
||||||
|
handle_path /admin* {
|
||||||
|
root * /opt/headscale-admin
|
||||||
|
encode gzip zstd
|
||||||
|
|
||||||
|
# Correct MIME types for JS/WASM
|
||||||
|
header {
|
||||||
|
@js_files path *.js
|
||||||
|
@wasm_files path *.wasm
|
||||||
|
|
||||||
|
Content-Type @js_files application/javascript
|
||||||
|
Content-Type @wasm_files application/wasm
|
||||||
|
|
||||||
|
X-Content-Type-Options nosniff
|
||||||
|
}
|
||||||
|
|
||||||
|
# Fallback for SPA routing
|
||||||
|
try_files {path} {path}/ index.html
|
||||||
|
file_server
|
||||||
|
}
|
||||||
|
|
||||||
|
EOF
|
||||||
|
caddy fmt --overwrite /etc/caddy/Caddyfile
|
||||||
|
systemctl start caddy
|
||||||
|
msg_ok "Configured headscale-admin"
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Starting service"
|
||||||
systemctl enable -q --now headscale
|
systemctl enable -q --now headscale
|
||||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
|
msg_ok "Service started"
|
||||||
msg_ok "Installed ${APPLICATION} v${RELEASE}"
|
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
customize
|
customize
|
||||||
|
|
||||||
msg_info "Cleaning up"
|
msg_info "Cleaning up"
|
||||||
rm headscale_${RELEASE}_linux_amd64.deb
|
|
||||||
$STD apt-get -y autoremove
|
$STD apt-get -y autoremove
|
||||||
$STD apt-get -y autoclean
|
$STD apt-get -y autoclean
|
||||||
msg_ok "Cleaned"
|
msg_ok "Cleaned"
|
||||||
|
|||||||
@@ -13,34 +13,26 @@ setting_up_container
|
|||||||
network_check
|
network_check
|
||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing OpenJDK"
|
JAVA_VERSION="21" setup_java
|
||||||
curl -fsSL "https://packages.adoptium.net/artifactory/api/gpg/key/public" | gpg --dearmor >/etc/apt/trusted.gpg.d/adoptium.gpg
|
fetch_and_deploy_gh_release "hivemq" "hivemq/hivemq-community-edition" "prebuild" "latest" "/opt/hivemq" "hivemq-ce-*.zip"
|
||||||
echo 'deb [arch=amd64 signed-by=/etc/apt/trusted.gpg.d/adoptium.gpg] https://packages.adoptium.net/artifactory/deb bookworm main' >/etc/apt/sources.list.d/adoptium.list
|
|
||||||
$STD apt-get update
|
|
||||||
$STD apt-get install -y temurin-17-jre
|
|
||||||
msg_ok "Installed OpenJDK"
|
|
||||||
|
|
||||||
msg_info "Installing HiveMQ CE"
|
msg_info "Configuring HiveMQ CE"
|
||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/hivemq/hivemq-community-edition/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
|
|
||||||
curl -fsSL "https://github.com/hivemq/hivemq-community-edition/releases/download/${RELEASE}/hivemq-ce-${RELEASE}.zip" -o "hivemq-ce-${RELEASE}.zip"
|
|
||||||
$STD unzip hivemq-ce-${RELEASE}.zip
|
|
||||||
mkdir -p /opt/hivemq
|
|
||||||
mv hivemq-ce-${RELEASE}/* /opt/hivemq
|
|
||||||
useradd -d /opt/hivemq hivemq
|
useradd -d /opt/hivemq hivemq
|
||||||
chown -R hivemq:hivemq /opt/hivemq
|
chown -R hivemq:hivemq /opt/hivemq
|
||||||
chmod +x /opt/hivemq/bin/run.sh
|
chmod +x /opt/hivemq/bin/run.sh
|
||||||
cp /opt/hivemq/bin/init-script/hivemq.service /etc/systemd/system/hivemq.service
|
cp /opt/hivemq/bin/init-script/hivemq.service /etc/systemd/system/hivemq.service
|
||||||
rm /opt/hivemq/conf/config.xml
|
rm /opt/hivemq/conf/config.xml
|
||||||
mv /opt/hivemq/conf/examples/configuration/config-sample-tcp-and-websockets.xml /opt/hivemq/conf/config.xml
|
mv /opt/hivemq/conf/examples/configuration/config-sample-tcp-and-websockets.xml /opt/hivemq/conf/config.xml
|
||||||
|
msg_ok "Configured HiveMQ CE"
|
||||||
|
|
||||||
|
msg_info "Starting service"
|
||||||
systemctl enable -q --now hivemq
|
systemctl enable -q --now hivemq
|
||||||
msg_ok "Installed HiveMQ CE"
|
msg_ok "Service started"
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
customize
|
customize
|
||||||
|
|
||||||
msg_info "Cleaning up"
|
msg_info "Cleaning up"
|
||||||
rm -rf hivemq-ce-${RELEASE}.zip
|
|
||||||
rm -rf ../hivemq-ce-${RELEASE}
|
|
||||||
$STD apt-get -y autoremove
|
$STD apt-get -y autoremove
|
||||||
$STD apt-get -y autoclean
|
$STD apt-get -y autoclean
|
||||||
msg_ok "Cleaned"
|
msg_ok "Cleaned"
|
||||||
|
|||||||
@@ -283,7 +283,7 @@ GEO_DIR="${INSTALL_DIR}/geodata"
|
|||||||
mkdir -p "$INSTALL_DIR"
|
mkdir -p "$INSTALL_DIR"
|
||||||
mkdir -p {"${APP_DIR}","${UPLOAD_DIR}","${GEO_DIR}","${ML_DIR}","${INSTALL_DIR}"/cache}
|
mkdir -p {"${APP_DIR}","${UPLOAD_DIR}","${GEO_DIR}","${ML_DIR}","${INSTALL_DIR}"/cache}
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "latest" "$SRC_DIR"
|
fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v1.136.0" "$SRC_DIR"
|
||||||
|
|
||||||
msg_info "Installing ${APPLICATION} (more patience please)"
|
msg_info "Installing ${APPLICATION} (more patience please)"
|
||||||
|
|
||||||
@@ -299,7 +299,7 @@ cd "$SRC_DIR"/web
|
|||||||
$STD npm ci
|
$STD npm ci
|
||||||
$STD npm run build
|
$STD npm run build
|
||||||
cd "$SRC_DIR"
|
cd "$SRC_DIR"
|
||||||
cp -a server/{node_modules,dist,bin,resources,package.json,package-lock.json,start*.sh} "$APP_DIR"/
|
cp -a server/{node_modules,dist,bin,resources,package.json,package-lock.json,bin/start.sh} "$APP_DIR"/
|
||||||
cp -a web/build "$APP_DIR"/www
|
cp -a web/build "$APP_DIR"/www
|
||||||
cp LICENSE "$APP_DIR"
|
cp LICENSE "$APP_DIR"
|
||||||
cd "$APP_DIR"
|
cd "$APP_DIR"
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ $STD pnpm install --frozen-lockfile
|
|||||||
$STD pnpm build
|
$STD pnpm build
|
||||||
cd /opt/karakeep/apps/workers
|
cd /opt/karakeep/apps/workers
|
||||||
$STD pnpm install --frozen-lockfile
|
$STD pnpm install --frozen-lockfile
|
||||||
|
$STD pnpm build
|
||||||
cd /opt/karakeep/apps/cli
|
cd /opt/karakeep/apps/cli
|
||||||
$STD pnpm install --frozen-lockfile
|
$STD pnpm install --frozen-lockfile
|
||||||
$STD pnpm build
|
$STD pnpm build
|
||||||
@@ -80,6 +81,7 @@ DATA_DIR="$DATA_DIR"
|
|||||||
MEILI_ADDR="http://127.0.0.1:7700"
|
MEILI_ADDR="http://127.0.0.1:7700"
|
||||||
MEILI_MASTER_KEY="$MASTER_KEY"
|
MEILI_MASTER_KEY="$MASTER_KEY"
|
||||||
BROWSER_WEB_URL="http://127.0.0.1:9222"
|
BROWSER_WEB_URL="http://127.0.0.1:9222"
|
||||||
|
DB_WAL_MODE=true
|
||||||
|
|
||||||
# If you're planning to use OpenAI for tagging. Uncomment the following line:
|
# If you're planning to use OpenAI for tagging. Uncomment the following line:
|
||||||
# OPENAI_API_KEY="<API_KEY>"
|
# OPENAI_API_KEY="<API_KEY>"
|
||||||
@@ -166,7 +168,7 @@ Wants=network.target karakeep-browser.service meilisearch.service
|
|||||||
After=network.target karakeep-browser.service meilisearch.service
|
After=network.target karakeep-browser.service meilisearch.service
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
ExecStart=pnpm start:prod
|
ExecStart=/usr/bin/node dist/index.mjs
|
||||||
WorkingDirectory=/opt/karakeep/apps/workers
|
WorkingDirectory=/opt/karakeep/apps/workers
|
||||||
EnvironmentFile=/etc/karakeep/karakeep.env
|
EnvironmentFile=/etc/karakeep/karakeep.env
|
||||||
Restart=always
|
Restart=always
|
||||||
|
|||||||
48
install/linkstack-install.sh
Normal file
48
install/linkstack-install.sh
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2025 community-scripts ORG
|
||||||
|
# Author: Omar Minaya | MickLesk (CanbiZ)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://linkstack.org/
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
PHP_VERSION="8.3" PHP_MODULE="sqlite3" PHP_APACHE="YES" setup_php
|
||||||
|
fetch_and_deploy_gh_release "linkstack" "linkstackorg/linkstack" "prebuild" "latest" "/var/www/html/linkstack" "linkstack.zip"
|
||||||
|
|
||||||
|
msg_info "Configuring LinkStack"
|
||||||
|
$STD a2enmod rewrite
|
||||||
|
chown -R www-data:www-data /var/www/html/linkstack
|
||||||
|
chmod -R 755 /var/www/html/linkstack
|
||||||
|
|
||||||
|
cat <<EOF >/etc/apache2/sites-available/linkstack.conf
|
||||||
|
<VirtualHost *:80>
|
||||||
|
ServerAdmin webmaster@localhost
|
||||||
|
DocumentRoot /var/www/html/linkstack
|
||||||
|
ErrorLog /var/log/apache2/linkstack-error.log
|
||||||
|
CustomLog /var/log/apache2/linkstack-access.log combined
|
||||||
|
<Directory /var/www/html/linkstack/>
|
||||||
|
Options Indexes FollowSymLinks
|
||||||
|
AllowOverride All
|
||||||
|
Require all granted
|
||||||
|
</Directory>
|
||||||
|
</VirtualHost>
|
||||||
|
EOF
|
||||||
|
$STD a2dissite 000-default.conf
|
||||||
|
$STD a2ensite linkstack.conf
|
||||||
|
$STD systemctl restart apache2
|
||||||
|
msg_ok "Configured LinkStack"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
|
||||||
|
msg_info "Cleaning up"
|
||||||
|
$STD apt-get -y autoremove
|
||||||
|
$STD apt-get -y autoclean
|
||||||
|
msg_ok "Cleaned"
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
# Copyright (c) 2021-2025 tteck
|
# Copyright (c) 2021-2025 tteck
|
||||||
# Author: tteck (tteckster)
|
# Author: tteck (tteckster) | Co-Author: CrazyWolf13
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
# Source: https://n8n.io/
|
# Source: https://n8n.io/
|
||||||
|
|
||||||
@@ -26,13 +26,22 @@ $STD npm install --global n8n
|
|||||||
msg_ok "Installed n8n"
|
msg_ok "Installed n8n"
|
||||||
|
|
||||||
msg_info "Creating Service"
|
msg_info "Creating Service"
|
||||||
|
HOST_IP=$(hostname -I | awk '{print $1}')
|
||||||
|
mkdir -p /opt
|
||||||
|
cat <<EOF >/opt/n8n.env
|
||||||
|
N8N_SECURE_COOKIE=false
|
||||||
|
N8N_PORT=5678
|
||||||
|
N8N_PROTOCOL=http
|
||||||
|
N8N_HOST=$HOST_IP
|
||||||
|
EOF
|
||||||
|
|
||||||
cat <<EOF >/etc/systemd/system/n8n.service
|
cat <<EOF >/etc/systemd/system/n8n.service
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=n8n
|
Description=n8n
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
Environment="N8N_SECURE_COOKIE=false"
|
EnvironmentFile="/opt/n8n.env"
|
||||||
ExecStart=n8n start
|
ExecStart=n8n start
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
|
|||||||
@@ -14,18 +14,14 @@ network_check
|
|||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing Dependencies (Patience)"
|
msg_info "Installing Dependencies (Patience)"
|
||||||
$STD apt-get install -y \
|
$STD apt-get install -y ffmpeg
|
||||||
ffmpeg
|
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
msg_info "Installing Navidrome"
|
fetch_and_deploy_gh_release "navidrome" "navidrome/navidrome" "binary"
|
||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/navidrome/navidrome/releases/latest | grep "tag_name" | awk -F '"' '{print $4}')
|
|
||||||
TMP_DEB=$(mktemp --suffix=.deb)
|
msg_info "Starting Navidrome"
|
||||||
curl -fsSL -o "${TMP_DEB}" "https://github.com/navidrome/navidrome/releases/download/${RELEASE}/navidrome_${RELEASE#v}_linux_amd64.deb"
|
|
||||||
$STD apt-get install -y "${TMP_DEB}"
|
|
||||||
systemctl enable -q --now navidrome
|
systemctl enable -q --now navidrome
|
||||||
echo "${RELEASE}" >/opt/Navidrome_version.txt
|
msg_ok "Started Navidrome"
|
||||||
msg_ok "Installed Navidrome"
|
|
||||||
|
|
||||||
read -p "${TAB3}Do you want to install filebrowser addon? (y/n) " -n 1 -r
|
read -p "${TAB3}Do you want to install filebrowser addon? (y/n) " -n 1 -r
|
||||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||||
@@ -36,7 +32,6 @@ motd_ssh
|
|||||||
customize
|
customize
|
||||||
|
|
||||||
msg_info "Cleaning up"
|
msg_info "Cleaning up"
|
||||||
rm -f "${TMP_DEB}"
|
|
||||||
$STD apt-get -y autoremove
|
$STD apt-get -y autoremove
|
||||||
$STD apt-get -y autoclean
|
$STD apt-get -y autoclean
|
||||||
msg_ok "Cleaned"
|
msg_ok "Cleaned"
|
||||||
|
|||||||
@@ -32,9 +32,8 @@ $STD apt-get install -y \
|
|||||||
python3-cffi \
|
python3-cffi \
|
||||||
python3-certbot \
|
python3-certbot \
|
||||||
python3-certbot-dns-cloudflare
|
python3-certbot-dns-cloudflare
|
||||||
$STD pip3 install certbot-dns-multi
|
$STD pip3 install --break-system-packages certbot-dns-multi
|
||||||
$STD python3 -m venv /opt/certbot/
|
$STD python3 -m venv /opt/certbot/
|
||||||
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
|
|
||||||
msg_ok "Installed Python Dependencies"
|
msg_ok "Installed Python Dependencies"
|
||||||
|
|
||||||
VERSION="$(awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release)"
|
VERSION="$(awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release)"
|
||||||
@@ -85,8 +84,6 @@ else
|
|||||||
sed -i "s|\"version\": \"0.0.0\"|\"version\": \"$RELEASE\"|" backend/package.json
|
sed -i "s|\"version\": \"0.0.0\"|\"version\": \"$RELEASE\"|" backend/package.json
|
||||||
sed -i "s|\"version\": \"0.0.0\"|\"version\": \"$RELEASE\"|" frontend/package.json
|
sed -i "s|\"version\": \"0.0.0\"|\"version\": \"$RELEASE\"|" frontend/package.json
|
||||||
fi
|
fi
|
||||||
sed -i 's|"fork-me": ".*"|"fork-me": "Proxmox VE Helper-Scripts"|' frontend/js/i18n/messages.json
|
|
||||||
sed -i "s|https://github.com.*source=nginx-proxy-manager|https://helper-scripts.com|g" frontend/js/app/ui/footer/main.ejs
|
|
||||||
sed -i 's+^daemon+#daemon+g' docker/rootfs/etc/nginx/nginx.conf
|
sed -i 's+^daemon+#daemon+g' docker/rootfs/etc/nginx/nginx.conf
|
||||||
NGINX_CONFS=$(find "$(pwd)" -type f -name "*.conf")
|
NGINX_CONFS=$(find "$(pwd)" -type f -name "*.conf")
|
||||||
for NGINX_CONF in $NGINX_CONFS; do
|
for NGINX_CONF in $NGINX_CONFS; do
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ ENV=prod
|
|||||||
ENABLE_OLLAMA_API=false
|
ENABLE_OLLAMA_API=false
|
||||||
OLLAMA_BASE_URL=http://0.0.0.0:11434
|
OLLAMA_BASE_URL=http://0.0.0.0:11434
|
||||||
EOF
|
EOF
|
||||||
$STD npm install
|
$STD npm install --force
|
||||||
export NODE_OPTIONS="--max-old-space-size=3584"
|
export NODE_OPTIONS="--max-old-space-size=3584"
|
||||||
$STD npm run build
|
$STD npm run build
|
||||||
msg_ok "Installed Open WebUI"
|
msg_ok "Installed Open WebUI"
|
||||||
|
|||||||
@@ -27,7 +27,9 @@ $STD apt-get -y install \
|
|||||||
libwww-perl \
|
libwww-perl \
|
||||||
nmap \
|
nmap \
|
||||||
aria2 \
|
aria2 \
|
||||||
wakeonlan
|
wakeonlan \
|
||||||
|
fping \
|
||||||
|
zip
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
msg_info "Installing PHP Dependencies"
|
msg_info "Installing PHP Dependencies"
|
||||||
@@ -47,12 +49,15 @@ $STD apt-get -y install \
|
|||||||
python3-pip \
|
python3-pip \
|
||||||
python3-requests \
|
python3-requests \
|
||||||
python3-tz \
|
python3-tz \
|
||||||
python3-tzlocal
|
python3-tzlocal \
|
||||||
|
python3-aiohttp
|
||||||
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
|
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
|
||||||
$STD pip3 install mac-vendor-lookup
|
$STD pip3 install mac-vendor-lookup
|
||||||
$STD pip3 install fritzconnection
|
$STD pip3 install fritzconnection
|
||||||
$STD pip3 install cryptography
|
$STD pip3 install cryptography
|
||||||
$STD pip3 install pyunifi
|
$STD pip3 install pyunifi
|
||||||
|
$STD pip3 install openwrt-luci-rpc
|
||||||
|
$STD pip3 install asusrouter
|
||||||
msg_ok "Installed Python Dependencies"
|
msg_ok "Installed Python Dependencies"
|
||||||
|
|
||||||
msg_info "Installing Pi.Alert"
|
msg_info "Installing Pi.Alert"
|
||||||
|
|||||||
44
install/salt-install.sh
Normal file
44
install/salt-install.sh
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2025 community-scripts ORG
|
||||||
|
# Author: bvdberg01
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/saltstack/salt
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
$STD apt-get install -y jq
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
msg_info "Setup Salt Repo"
|
||||||
|
mkdir -p /etc/apt/keyrings
|
||||||
|
curl -fsSL https://packages.broadcom.com/artifactory/api/security/keypair/SaltProjectKey/public -o /etc/apt/keyrings/salt-archive-keyring.pgp
|
||||||
|
curl -fsSL https://github.com/saltstack/salt-install-guide/releases/latest/download/salt.sources -o /etc/apt/sources.list.d/salt.sources
|
||||||
|
$STD apt-get update
|
||||||
|
msg_ok "Setup Salt Repo"
|
||||||
|
|
||||||
|
msg_info "Installing Salt"
|
||||||
|
RELEASE=$(curl -fsSL https://api.github.com/repos/saltstack/salt/releases/latest | jq -r .tag_name | sed 's/^v//')
|
||||||
|
cat <<EOF >/etc/apt/preferences.d/salt-pin-1001
|
||||||
|
Package: salt-*
|
||||||
|
Pin: version ${RELEASE}
|
||||||
|
Pin-Priority: 1001
|
||||||
|
EOF
|
||||||
|
$STD apt-get install -y salt-master
|
||||||
|
echo "${RELEASE}" >/~.salt
|
||||||
|
msg_ok "Installed Salt"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
|
||||||
|
msg_info "Cleaning up"
|
||||||
|
$STD apt-get -y autoremove
|
||||||
|
$STD apt-get -y autoclean
|
||||||
|
msg_ok "Cleaned"
|
||||||
@@ -18,7 +18,7 @@ $STD apt-get install -y \
|
|||||||
composer \
|
composer \
|
||||||
git \
|
git \
|
||||||
nginx \
|
nginx \
|
||||||
php8.2-{bcmath,common,ctype,curl,fileinfo,fpm,gd,iconv,intl,mbstring,mysql,soap,xml,xsl,zip,cli}
|
php8.2-{bcmath,common,ctype,ldap,curl,fileinfo,fpm,gd,iconv,intl,mbstring,mysql,soap,xml,xsl,zip,cli}
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
setup_mariadb
|
setup_mariadb
|
||||||
|
|||||||
56
install/teamspeak-server-install.sh
Normal file
56
install/teamspeak-server-install.sh
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2025 community-scripts ORG
|
||||||
|
# Author: tremor021 (Slaviša Arežina)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://teamspeak.com/en/
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
RELEASE=$(curl -fsSL https://teamspeak.com/en/downloads/#server | grep -oP 'teamspeak3-server_linux_amd64-\K[0-9]+\.[0-9]+\.[0-9]+' | head -1)
|
||||||
|
|
||||||
|
msg_info "Setting up Teamspeak Server"
|
||||||
|
curl -fsSL "https://files.teamspeak-services.com/releases/server/${RELEASE}/teamspeak3-server_linux_amd64-${RELEASE}.tar.bz2" -o ts3server.tar.bz2
|
||||||
|
tar -xf ./ts3server.tar.bz2
|
||||||
|
mv teamspeak3-server_linux_amd64/ /opt/teamspeak-server/
|
||||||
|
touch /opt/teamspeak-server/.ts3server_license_accepted
|
||||||
|
echo "${RELEASE}" >~/.teamspeak-server
|
||||||
|
msg_ok "Setup Teamspeak Server"
|
||||||
|
|
||||||
|
msg_info "Creating service"
|
||||||
|
cat <<EOF >/etc/systemd/system/teamspeak-server.service
|
||||||
|
[Unit]
|
||||||
|
Description=TeamSpeak3 Server
|
||||||
|
Wants=network-online.target
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
WorkingDirectory=/opt/teamspeak-server
|
||||||
|
User=root
|
||||||
|
Type=forking
|
||||||
|
ExecStart=/opt/teamspeak-server/ts3server_startscript.sh start
|
||||||
|
ExecStop=/opt/teamspeak-server/ts3server_startscript.sh stop
|
||||||
|
ExecReload=/opt/teamspeak-server/ts3server_startscript.sh restart
|
||||||
|
Restart=always
|
||||||
|
RestartSec=15
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now teamspeak-server
|
||||||
|
msg_ok "Created service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
|
||||||
|
msg_info "Cleaning up"
|
||||||
|
rm -f ~/ts3server.tar.bz*
|
||||||
|
$STD apt-get -y autoremove
|
||||||
|
$STD apt-get -y autoclean
|
||||||
|
msg_ok "Cleaned"
|
||||||
@@ -13,15 +13,13 @@ setting_up_container
|
|||||||
network_check
|
network_check
|
||||||
update_os
|
update_os
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "victoriametrics" "VictoriaMetrics/VictoriaMetrics" "prebuild" "latest" "/opt/victoriametrics" "victoria-metrics-linux-amd64-v+([0-9.]).tar.gz"
|
||||||
|
fetch_and_deploy_gh_release "vmutils" "VictoriaMetrics/VictoriaMetrics" "prebuild" "latest" "/opt/victoriametrics" "vmutils-linux-amd64-v+([0-9.]).tar.gz"
|
||||||
|
fetch_and_deploy_gh_release "victorialogs" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "victoria-logs-linux-amd64*.tar.gz"
|
||||||
|
fetch_and_deploy_gh_release "vlutils" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "vlutils-linux-amd64*.tar.gz"
|
||||||
|
|
||||||
msg_info "Setup VictoriaMetrics"
|
msg_info "Setup VictoriaMetrics"
|
||||||
temp_dir=$(mktemp -d)
|
|
||||||
cd $temp_dir
|
|
||||||
mkdir -p /opt/victoriametrics/data
|
mkdir -p /opt/victoriametrics/data
|
||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/VictoriaMetrics/VictoriaMetrics/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
|
||||||
curl -fsSL "https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v${RELEASE}/victoria-metrics-linux-amd64-v${RELEASE}.tar.gz" -o "victoria-metrics-linux-amd64-v${RELEASE}.tar.gz"
|
|
||||||
curl -fsSL "https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v${RELEASE}/vmutils-linux-amd64-v${RELEASE}.tar.gz" -o "vmutils-linux-amd64-v${RELEASE}.tar.gz"
|
|
||||||
tar -xf victoria-metrics-linux-amd64-v${RELEASE}.tar.gz -C /opt/victoriametrics
|
|
||||||
tar -xf vmutils-linux-amd64-v${RELEASE}.tar.gz -C /opt/victoriametrics
|
|
||||||
chmod +x /opt/victoriametrics/*
|
chmod +x /opt/victoriametrics/*
|
||||||
msg_ok "Setup VictoriaMetrics"
|
msg_ok "Setup VictoriaMetrics"
|
||||||
|
|
||||||
@@ -37,10 +35,26 @@ User=root
|
|||||||
WorkingDirectory=/opt/victoriametrics
|
WorkingDirectory=/opt/victoriametrics
|
||||||
ExecStart=/opt/victoriametrics/victoria-metrics-prod --storageDataPath="/opt/victoriametrics/data"
|
ExecStart=/opt/victoriametrics/victoria-metrics-prod --storageDataPath="/opt/victoriametrics/data"
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat <<EOF >/etc/systemd/system/victoriametrics-logs.service
|
||||||
|
[Unit]
|
||||||
|
Description=VictoriaMetrics Service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
Restart=always
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=/opt/victoriametrics
|
||||||
|
ExecStart=/opt/victoriametrics/victoria-logs-prod
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
EOF
|
EOF
|
||||||
systemctl enable -q --now victoriametrics
|
systemctl enable -q --now victoriametrics
|
||||||
|
systemctl enable -q --now victoriametrics-logs
|
||||||
msg_ok "Created Service"
|
msg_ok "Created Service"
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ cat <<EOF >/opt/wallos.cron
|
|||||||
*/2 * * * * php /opt/wallos/endpoints/cronjobs/sendverificationemails.php >> /var/log/cron/sendverificationemail.log 2>&1
|
*/2 * * * * php /opt/wallos/endpoints/cronjobs/sendverificationemails.php >> /var/log/cron/sendverificationemail.log 2>&1
|
||||||
*/2 * * * * php /opt/wallos/endpoints/cronjobs/sendresetpasswordemails.php >> /var/log/cron/sendresetpasswordemails.log 2>&1
|
*/2 * * * * php /opt/wallos/endpoints/cronjobs/sendresetpasswordemails.php >> /var/log/cron/sendresetpasswordemails.log 2>&1
|
||||||
0 */6 * * * php /opt/wallos/endpoints/cronjobs/checkforupdates.php >> /var/log/cron/checkforupdates.log 2>&1
|
0 */6 * * * php /opt/wallos/endpoints/cronjobs/checkforupdates.php >> /var/log/cron/checkforupdates.log 2>&1
|
||||||
|
30 1 * * 1 php /opt/wallos/endpoints/cronjobs/storetotalyearlycost.php >> /var/log/cron/storetotalyearlycost.log 2>&1
|
||||||
EOF
|
EOF
|
||||||
crontab /opt/wallos.cron
|
crontab /opt/wallos.cron
|
||||||
msg_ok "Crontabs setup"
|
msg_ok "Crontabs setup"
|
||||||
|
|||||||
@@ -23,12 +23,12 @@ fetch_and_deploy_gh_release "wizarr" "wizarrrr/wizarr"
|
|||||||
|
|
||||||
msg_info "Configure ${APPLICATION}"
|
msg_info "Configure ${APPLICATION}"
|
||||||
cd /opt/wizarr
|
cd /opt/wizarr
|
||||||
uv -q sync --locked
|
/usr/local/bin/uv -q sync --locked
|
||||||
$STD uv -q run pybabel compile -d app/translations
|
$STD /usr/local/bin/uv -q run pybabel compile -d app/translations
|
||||||
$STD npm --prefix app/static install
|
$STD npm --prefix app/static install
|
||||||
$STD npm --prefix app/static run build:css
|
$STD npm --prefix app/static run build:css
|
||||||
mkdir -p ./.cache
|
mkdir -p ./.cache
|
||||||
$STD uv -q run flask db upgrade
|
$STD /usr/local/bin/uv -q run flask db upgrade
|
||||||
msg_ok "Configure ${APPLICATION}"
|
msg_ok "Configure ${APPLICATION}"
|
||||||
|
|
||||||
msg_info "Creating env, start script and service"
|
msg_info "Creating env, start script and service"
|
||||||
|
|||||||
@@ -152,4 +152,11 @@ EOF
|
|||||||
|
|
||||||
echo "bash -c \"\$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/${app}.sh)\"" >/usr/bin/update
|
echo "bash -c \"\$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/${app}.sh)\"" >/usr/bin/update
|
||||||
chmod +x /usr/bin/update
|
chmod +x /usr/bin/update
|
||||||
|
|
||||||
|
if [[ -n "${SSH_AUTHORIZED_KEY}" ]]; then
|
||||||
|
mkdir -p /root/.ssh
|
||||||
|
echo "${SSH_AUTHORIZED_KEY}" >/root/.ssh/authorized_keys
|
||||||
|
chmod 700 /root/.ssh
|
||||||
|
chmod 600 /root/.ssh/authorized_keys
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,13 +66,36 @@ root_check() {
|
|||||||
|
|
||||||
# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported.
|
# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported.
|
||||||
pve_check() {
|
pve_check() {
|
||||||
if ! pveversion | grep -Eq "pve-manager/8\.[0-4](\.[0-9]+)*"; then
|
local PVE_VER
|
||||||
msg_error "${CROSS}${RD}This version of Proxmox Virtual Environment is not supported"
|
PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
|
||||||
echo -e "Requires Proxmox Virtual Environment Version 8.1 or later."
|
|
||||||
echo -e "Exiting..."
|
# Check for Proxmox VE 8.x
|
||||||
sleep 2
|
if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then
|
||||||
exit
|
local MINOR="${BASH_REMATCH[1]}"
|
||||||
|
if ((MINOR < 1 || MINOR > 4)); then
|
||||||
|
msg_error "This version of Proxmox VE is not supported."
|
||||||
|
echo -e "Required: Proxmox VE version 8.1 – 8.4"
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for Proxmox VE 9.x (Beta) — require confirmation
|
||||||
|
if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then
|
||||||
|
if whiptail --title "Proxmox 9.x Detected (Beta)" \
|
||||||
|
--yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then
|
||||||
|
msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
msg_error "Aborted by user: Proxmox VE 9.x was not confirmed."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# All other unsupported versions
|
||||||
|
msg_error "This version of Proxmox VE is not supported."
|
||||||
|
echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)"
|
||||||
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
# When a node is running tens of containers, it's possible to exceed the kernel's cryptographic key storage allocations.
|
# When a node is running tens of containers, it's possible to exceed the kernel's cryptographic key storage allocations.
|
||||||
@@ -226,6 +249,7 @@ write_config() {
|
|||||||
# This function writes the configuration to a file.
|
# This function writes the configuration to a file.
|
||||||
if whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "Write configfile" --yesno "Do you want to write the selections to a config file?" 10 60; then
|
if whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "Write configfile" --yesno "Do you want to write the selections to a config file?" 10 60; then
|
||||||
FILEPATH="/opt/community-scripts/${NSAPP}.conf"
|
FILEPATH="/opt/community-scripts/${NSAPP}.conf"
|
||||||
|
[[ "$GATE" =~ ",gw=" ]] && local GATE="${GATE##,gw=}"
|
||||||
if [[ ! -f $FILEPATH ]]; then
|
if [[ ! -f $FILEPATH ]]; then
|
||||||
cat <<EOF >"$FILEPATH"
|
cat <<EOF >"$FILEPATH"
|
||||||
# ${NSAPP} Configuration File
|
# ${NSAPP} Configuration File
|
||||||
@@ -1201,7 +1225,52 @@ EOF
|
|||||||
# This starts the container and executes <app>-install.sh
|
# This starts the container and executes <app>-install.sh
|
||||||
msg_info "Starting LXC Container"
|
msg_info "Starting LXC Container"
|
||||||
pct start "$CTID"
|
pct start "$CTID"
|
||||||
|
|
||||||
|
# wait for status 'running'
|
||||||
|
for i in {1..10}; do
|
||||||
|
if pct status "$CTID" | grep -q "status: running"; then
|
||||||
msg_ok "Started LXC Container"
|
msg_ok "Started LXC Container"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
sleep 1
|
||||||
|
if [ "$i" -eq 10 ]; then
|
||||||
|
msg_error "LXC Container did not reach running state"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$var_os" != "alpine" ]; then
|
||||||
|
msg_info "Waiting for network in LXC container"
|
||||||
|
for i in {1..10}; do
|
||||||
|
if pct exec "$CTID" -- ping -c1 -W1 deb.debian.org >/dev/null 2>&1; then
|
||||||
|
msg_ok "Network in LXC is reachable"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
if [ "$i" -lt 10 ]; then
|
||||||
|
msg_warn "No network yet in LXC (try $i/10) – waiting..."
|
||||||
|
sleep 3
|
||||||
|
else
|
||||||
|
msg_error "No network in LXC after waiting."
|
||||||
|
read -r -p "Set fallback DNS (1.1.1.1/8.8.8.8)? [y/N]: " choice
|
||||||
|
case "$choice" in
|
||||||
|
[yY]*)
|
||||||
|
pct set "$CTID" --nameserver 1.1.1.1
|
||||||
|
pct set "$CTID" --nameserver 8.8.8.8
|
||||||
|
if pct exec "$CTID" -- ping -c1 -W1 deb.debian.org >/dev/null 2>&1; then
|
||||||
|
msg_ok "Network reachable after DNS fallback"
|
||||||
|
else
|
||||||
|
msg_error "Still no network/DNS in LXC! Aborting customization."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
msg_error "Aborted by user – no DNS fallback set."
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
msg_info "Customizing LXC Container"
|
msg_info "Customizing LXC Container"
|
||||||
: "${tz:=Etc/UTC}"
|
: "${tz:=Etc/UTC}"
|
||||||
@@ -1211,7 +1280,7 @@ EOF
|
|||||||
http://dl-cdn.alpinelinux.org/alpine/latest-stable/main
|
http://dl-cdn.alpinelinux.org/alpine/latest-stable/main
|
||||||
http://dl-cdn.alpinelinux.org/alpine/latest-stable/community
|
http://dl-cdn.alpinelinux.org/alpine/latest-stable/community
|
||||||
EOF'
|
EOF'
|
||||||
pct exec "$CTID" -- ash -c "apk add bash newt curl openssh nano mc ncurses >/dev/null"
|
pct exec "$CTID" -- ash -c "apk add bash newt curl openssh nano mc ncurses jq >/dev/null"
|
||||||
else
|
else
|
||||||
sleep 3
|
sleep 3
|
||||||
pct exec "$CTID" -- bash -c "sed -i '/$LANG/ s/^# //' /etc/locale.gen"
|
pct exec "$CTID" -- bash -c "sed -i '/$LANG/ s/^# //' /etc/locale.gen"
|
||||||
@@ -1229,7 +1298,7 @@ EOF'
|
|||||||
msg_warn "Skipping timezone setup – zone '$tz' not found in container"
|
msg_warn "Skipping timezone setup – zone '$tz' not found in container"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
pct exec "$CTID" -- bash -c "apt-get update >/dev/null && apt-get install -y sudo curl mc gnupg2 >/dev/null"
|
pct exec "$CTID" -- bash -c "apt-get update >/dev/null && apt-get install -y sudo curl mc gnupg2 jq >/dev/null"
|
||||||
fi
|
fi
|
||||||
msg_ok "Customized LXC Container"
|
msg_ok "Customized LXC Container"
|
||||||
|
|
||||||
|
|||||||
@@ -272,7 +272,8 @@ config_file() {
|
|||||||
GATE=""
|
GATE=""
|
||||||
elif [[ "$NET" =~ $ip_cidr_regex ]]; then
|
elif [[ "$NET" =~ $ip_cidr_regex ]]; then
|
||||||
echo -e "${NETWORK}${BOLD}${DGN}IP Address: ${BGN}$NET${CL}"
|
echo -e "${NETWORK}${BOLD}${DGN}IP Address: ${BGN}$NET${CL}"
|
||||||
if [ ! -z "$GATE" ]; then
|
if [[ -n "$GATE" ]]; then
|
||||||
|
[[ "$GATE" =~ ",gw=" ]] && GATE="${GATE##,gw=}"
|
||||||
if [[ "$GATE" =~ $ip_regex ]]; then
|
if [[ "$GATE" =~ $ip_regex ]]; then
|
||||||
echo -e "${GATEWAY}${BOLD}${DGN}Gateway IP Address: ${BGN}$GATE${CL}"
|
echo -e "${GATEWAY}${BOLD}${DGN}Gateway IP Address: ${BGN}$GATE${CL}"
|
||||||
GATE=",gw=$GATE"
|
GATE=",gw=$GATE"
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ function on_exit() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function error_handler() {
|
function error_handler() {
|
||||||
|
|
||||||
local exit_code="$?"
|
local exit_code="$?"
|
||||||
local line_number="$1"
|
local line_number="$1"
|
||||||
local command="$2"
|
local command="$2"
|
||||||
@@ -51,6 +50,14 @@ function on_terminate() {
|
|||||||
exit 143
|
exit 143
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function exit_script() {
|
||||||
|
clear
|
||||||
|
printf "\e[?25h"
|
||||||
|
echo -e "\n${CROSS}${RD}User exited script${CL}\n"
|
||||||
|
kill 0
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
function check_storage_support() {
|
function check_storage_support() {
|
||||||
local CONTENT="$1"
|
local CONTENT="$1"
|
||||||
local -a VALID_STORAGES=()
|
local -a VALID_STORAGES=()
|
||||||
@@ -64,21 +71,7 @@ function check_storage_support() {
|
|||||||
[[ ${#VALID_STORAGES[@]} -gt 0 ]]
|
[[ ${#VALID_STORAGES[@]} -gt 0 ]]
|
||||||
}
|
}
|
||||||
|
|
||||||
# This checks for the presence of valid Container Storage and Template Storage locations
|
# This function selects a storage pool for a given content type (e.g., rootdir, vztmpl).
|
||||||
msg_info "Validating Storage"
|
|
||||||
if ! check_storage_support "rootdir"; then
|
|
||||||
|
|
||||||
msg_error "No valid storage found for 'rootdir' (Container)."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
if ! check_storage_support "vztmpl"; then
|
|
||||||
|
|
||||||
msg_error "No valid storage found for 'vztmpl' (Template)."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
msg_ok "Validated Storage (rootdir / vztmpl)."
|
|
||||||
|
|
||||||
# This function is used to select the storage class and determine the corresponding storage content type and label.
|
|
||||||
function select_storage() {
|
function select_storage() {
|
||||||
local CLASS=$1 CONTENT CONTENT_LABEL
|
local CLASS=$1 CONTENT CONTENT_LABEL
|
||||||
|
|
||||||
@@ -113,8 +106,20 @@ function select_storage() {
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
local -a MENU
|
# Check for preset STORAGE variable
|
||||||
|
if [ "$CONTENT" = "rootdir" ] && [ -n "${STORAGE:-}" ]; then
|
||||||
|
if pvesm status -content "$CONTENT" | awk 'NR>1 {print $1}' | grep -qx "$STORAGE"; then
|
||||||
|
STORAGE_RESULT="$STORAGE"
|
||||||
|
msg_info "Using preset storage: $STORAGE_RESULT for $CONTENT_LABEL"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
msg_error "Preset storage '$STORAGE' is not valid for content type '$CONTENT'."
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
local -A STORAGE_MAP
|
local -A STORAGE_MAP
|
||||||
|
local -a MENU
|
||||||
local COL_WIDTH=0
|
local COL_WIDTH=0
|
||||||
|
|
||||||
while read -r TAG TYPE _ TOTAL USED FREE _; do
|
while read -r TAG TYPE _ TOTAL USED FREE _; do
|
||||||
@@ -135,17 +140,23 @@ local -a MENU
|
|||||||
|
|
||||||
if [ $((${#MENU[@]} / 3)) -eq 1 ]; then
|
if [ $((${#MENU[@]} / 3)) -eq 1 ]; then
|
||||||
STORAGE_RESULT="${STORAGE_MAP[${MENU[0]}]}"
|
STORAGE_RESULT="${STORAGE_MAP[${MENU[0]}]}"
|
||||||
|
STORAGE_INFO="${MENU[1]}"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
local WIDTH=$((COL_WIDTH + 42))
|
local WIDTH=$((COL_WIDTH + 42))
|
||||||
while true; do
|
while true; do
|
||||||
local DISPLAY_SELECTED=$(whiptail --backtitle "Proxmox VE Helper Scripts" \
|
local DISPLAY_SELECTED
|
||||||
|
DISPLAY_SELECTED=$(whiptail --backtitle "Proxmox VE Helper Scripts" \
|
||||||
--title "Storage Pools" \
|
--title "Storage Pools" \
|
||||||
--radiolist "Which storage pool for ${CONTENT_LABEL,,}?\n(Spacebar to select)" \
|
--radiolist "Which storage pool for ${CONTENT_LABEL,,}?\n(Spacebar to select)" \
|
||||||
16 "$WIDTH" 6 "${MENU[@]}" 3>&1 1>&2 2>&3)
|
16 "$WIDTH" 6 "${MENU[@]}" 3>&1 1>&2 2>&3)
|
||||||
|
|
||||||
[[ $? -ne 0 ]] && return 3
|
# Cancel or ESC
|
||||||
|
[[ $? -ne 0 ]] && exit_script
|
||||||
|
|
||||||
|
# Strip trailing whitespace or newline (important for storages like "storage (dir)")
|
||||||
|
DISPLAY_SELECTED=$(sed 's/[[:space:]]*$//' <<<"$DISPLAY_SELECTED")
|
||||||
|
|
||||||
if [[ -z "$DISPLAY_SELECTED" || -z "${STORAGE_MAP[$DISPLAY_SELECTED]+_}" ]]; then
|
if [[ -z "$DISPLAY_SELECTED" || -z "${STORAGE_MAP[$DISPLAY_SELECTED]+_}" ]]; then
|
||||||
whiptail --msgbox "No valid storage selected. Please try again." 8 58
|
whiptail --msgbox "No valid storage selected. Please try again." 8 58
|
||||||
@@ -153,6 +164,12 @@ local -a MENU
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
STORAGE_RESULT="${STORAGE_MAP[$DISPLAY_SELECTED]}"
|
STORAGE_RESULT="${STORAGE_MAP[$DISPLAY_SELECTED]}"
|
||||||
|
for ((i = 0; i < ${#MENU[@]}; i += 3)); do
|
||||||
|
if [[ "${MENU[$i]}" == "$DISPLAY_SELECTED" ]]; then
|
||||||
|
STORAGE_INFO="${MENU[$i + 1]}"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
return 0
|
return 0
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
@@ -181,45 +198,22 @@ if qm status "$CTID" &>/dev/null || pct status "$CTID" &>/dev/null; then
|
|||||||
exit 206
|
exit 206
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# DEFAULT_FILE="/usr/local/community-scripts/default_storage"
|
# This checks for the presence of valid Container Storage and Template Storage locations
|
||||||
# if [[ -f "$DEFAULT_FILE" ]]; then
|
msg_info "Validating Storage"
|
||||||
# source "$DEFAULT_FILE"
|
if ! check_storage_support "rootdir"; then
|
||||||
# if [[ -n "$TEMPLATE_STORAGE" && -n "$CONTAINER_STORAGE" ]]; then
|
msg_error "No valid storage found for 'rootdir' (Container)."
|
||||||
# msg_info "Using default storage configuration from: $DEFAULT_FILE"
|
exit 1
|
||||||
# msg_ok "Template Storage: ${BL}$TEMPLATE_STORAGE${CL} ${GN}|${CL} Container Storage: ${BL}$CONTAINER_STORAGE${CL}"
|
fi
|
||||||
# else
|
if ! check_storage_support "vztmpl"; then
|
||||||
# msg_warn "Default storage file exists but is incomplete – falling back to manual selection"
|
msg_error "No valid storage found for 'vztmpl' (Template)."
|
||||||
# TEMPLATE_STORAGE=$(select_storage template)
|
exit 1
|
||||||
# msg_ok "Using ${BL}$TEMPLATE_STORAGE${CL} ${GN}for Template Storage."
|
fi
|
||||||
# CONTAINER_STORAGE=$(select_storage container)
|
msg_ok "Valid Storage Found"
|
||||||
# msg_ok "Using ${BL}$CONTAINER_STORAGE${CL} ${GN}for Container Storage."
|
|
||||||
# fi
|
|
||||||
# else
|
|
||||||
# # TEMPLATE STORAGE SELECTION
|
|
||||||
# # Template Storage
|
|
||||||
# while true; do
|
|
||||||
# TEMPLATE_STORAGE=$(select_storage template)
|
|
||||||
# if [[ -n "$TEMPLATE_STORAGE" ]]; then
|
|
||||||
# msg_ok "Using ${BL}$TEMPLATE_STORAGE${CL} ${GN}for Template Storage."
|
|
||||||
# break
|
|
||||||
# fi
|
|
||||||
# msg_warn "No valid template storage selected. Please try again."
|
|
||||||
# done
|
|
||||||
|
|
||||||
# while true; do
|
|
||||||
# CONTAINER_STORAGE=$(select_storage container)
|
|
||||||
# if [[ -n "$CONTAINER_STORAGE" ]]; then
|
|
||||||
# msg_ok "Using ${BL}$CONTAINER_STORAGE${CL} ${GN}for Container Storage."
|
|
||||||
# break
|
|
||||||
# fi
|
|
||||||
# msg_warn "No valid container storage selected. Please try again."
|
|
||||||
# done
|
|
||||||
|
|
||||||
# fi
|
|
||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
if select_storage template; then
|
if select_storage template; then
|
||||||
TEMPLATE_STORAGE="$STORAGE_RESULT"
|
TEMPLATE_STORAGE="$STORAGE_RESULT"
|
||||||
|
TEMPLATE_STORAGE_INFO="$STORAGE_INFO"
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
@@ -227,9 +221,11 @@ done
|
|||||||
while true; do
|
while true; do
|
||||||
if select_storage container; then
|
if select_storage container; then
|
||||||
CONTAINER_STORAGE="$STORAGE_RESULT"
|
CONTAINER_STORAGE="$STORAGE_RESULT"
|
||||||
|
CONTAINER_STORAGE_INFO="$STORAGE_INFO"
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
msg_ok "Validated Storage | Container: ${BL}$CONTAINER_STORAGE${CL} ($CONTAINER_STORAGE_INFO)"
|
||||||
|
|
||||||
# Check free space on selected container storage
|
# Check free space on selected container storage
|
||||||
STORAGE_FREE=$(pvesm status | awk -v s="$CONTAINER_STORAGE" '$1 == s { print $6 }')
|
STORAGE_FREE=$(pvesm status | awk -v s="$CONTAINER_STORAGE" '$1 == s { print $6 }')
|
||||||
@@ -276,28 +272,34 @@ fi
|
|||||||
TEMPLATE="${TEMPLATES[-1]}"
|
TEMPLATE="${TEMPLATES[-1]}"
|
||||||
TEMPLATE_PATH="$(pvesm path $TEMPLATE_STORAGE:vztmpl/$TEMPLATE 2>/dev/null || echo "/var/lib/vz/template/cache/$TEMPLATE")"
|
TEMPLATE_PATH="$(pvesm path $TEMPLATE_STORAGE:vztmpl/$TEMPLATE 2>/dev/null || echo "/var/lib/vz/template/cache/$TEMPLATE")"
|
||||||
|
|
||||||
# Check if template exists and is valid
|
TEMPLATE_VALID=1
|
||||||
if ! pveam list "$TEMPLATE_STORAGE" | grep -q "$TEMPLATE" || ! zstdcat "$TEMPLATE_PATH" | tar -tf - >/dev/null 2>&1; then
|
if ! pveam list "$TEMPLATE_STORAGE" | grep -q "$TEMPLATE"; then
|
||||||
msg_warn "Template $TEMPLATE not found or appears to be corrupted. Re-downloading."
|
TEMPLATE_VALID=0
|
||||||
|
elif [ ! -s "$TEMPLATE_PATH" ]; then
|
||||||
|
TEMPLATE_VALID=0
|
||||||
|
elif ! tar --use-compress-program=zstdcat -tf "$TEMPLATE_PATH" >/dev/null 2>&1; then
|
||||||
|
TEMPLATE_VALID=0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$TEMPLATE_VALID" -eq 0 ]; then
|
||||||
|
msg_warn "Template $TEMPLATE not found or appears to be corrupted. Re-downloading."
|
||||||
[[ -f "$TEMPLATE_PATH" ]] && rm -f "$TEMPLATE_PATH"
|
[[ -f "$TEMPLATE_PATH" ]] && rm -f "$TEMPLATE_PATH"
|
||||||
for attempt in {1..3}; do
|
for attempt in {1..3}; do
|
||||||
msg_info "Attempt $attempt: Downloading LXC template..."
|
msg_info "Attempt $attempt: Downloading LXC template..."
|
||||||
|
|
||||||
if pveam download "$TEMPLATE_STORAGE" "$TEMPLATE" >/dev/null 2>&1; then
|
if pveam download "$TEMPLATE_STORAGE" "$TEMPLATE" >/dev/null 2>&1; then
|
||||||
msg_ok "Template download successful."
|
msg_ok "Template download successful."
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ $attempt -eq 3 ]; then
|
if [ $attempt -eq 3 ]; then
|
||||||
msg_error "Failed after 3 attempts. Please check your Proxmox host’s internet access or manually run:\n pveam download $TEMPLATE_STORAGE $TEMPLATE"
|
msg_error "Failed after 3 attempts. Please check network access or manually run:\n pveam download $TEMPLATE_STORAGE $TEMPLATE"
|
||||||
exit 208
|
exit 208
|
||||||
fi
|
fi
|
||||||
|
|
||||||
sleep $((attempt * 5))
|
sleep $((attempt * 5))
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
msg_ok "LXC Template '$TEMPLATE' is ready to use."
|
||||||
|
|
||||||
msg_info "Creating LXC Container"
|
msg_info "Creating LXC Container"
|
||||||
# Check and fix subuid/subgid
|
# Check and fix subuid/subgid
|
||||||
grep -q "root:100000:65536" /etc/subuid || echo "root:100000:65536" >>/etc/subuid
|
grep -q "root:100000:65536" /etc/subuid || echo "root:100000:65536" >>/etc/subuid
|
||||||
@@ -309,7 +311,7 @@ PCT_OPTIONS=(${PCT_OPTIONS[@]:-${DEFAULT_PCT_OPTIONS[@]}})
|
|||||||
|
|
||||||
# Secure creation of the LXC container with lock and template check
|
# Secure creation of the LXC container with lock and template check
|
||||||
lockfile="/tmp/template.${TEMPLATE}.lock"
|
lockfile="/tmp/template.${TEMPLATE}.lock"
|
||||||
exec 9>"$lockfile" >/dev/null 2>&1 || {
|
exec 9>"$lockfile" || {
|
||||||
msg_error "Failed to create lock file '$lockfile'."
|
msg_error "Failed to create lock file '$lockfile'."
|
||||||
exit 200
|
exit 200
|
||||||
}
|
}
|
||||||
@@ -347,7 +349,6 @@ if ! pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" "${PCT_OPTIONS[
|
|||||||
done
|
done
|
||||||
|
|
||||||
sleep 1 # I/O-Sync-Delay
|
sleep 1 # I/O-Sync-Delay
|
||||||
|
|
||||||
msg_ok "Re-downloaded LXC Template"
|
msg_ok "Re-downloaded LXC Template"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
105
misc/tools.func
105
misc/tools.func
@@ -396,9 +396,10 @@ function setup_php() {
|
|||||||
COMBINED_MODULES="${DEFAULT_MODULES}"
|
COMBINED_MODULES="${DEFAULT_MODULES}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Deduplicate modules
|
# Deduplicate
|
||||||
COMBINED_MODULES=$(echo "$COMBINED_MODULES" | tr ',' '\n' | awk '!seen[$0]++' | paste -sd, -)
|
COMBINED_MODULES=$(echo "$COMBINED_MODULES" | tr ',' '\n' | awk '!seen[$0]++' | paste -sd, -)
|
||||||
|
|
||||||
|
# Get current PHP-CLI version
|
||||||
local CURRENT_PHP=""
|
local CURRENT_PHP=""
|
||||||
if command -v php >/dev/null 2>&1; then
|
if command -v php >/dev/null 2>&1; then
|
||||||
CURRENT_PHP=$(php -v 2>/dev/null | awk '/^PHP/{print $2}' | cut -d. -f1,2)
|
CURRENT_PHP=$(php -v 2>/dev/null | awk '/^PHP/{print $2}' | cut -d. -f1,2)
|
||||||
@@ -420,53 +421,44 @@ function setup_php() {
|
|||||||
$STD apt-get update
|
$STD apt-get update
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Build module list
|
||||||
local MODULE_LIST="php${PHP_VERSION}"
|
local MODULE_LIST="php${PHP_VERSION}"
|
||||||
for pkg in $MODULE_LIST; do
|
|
||||||
if ! apt-cache show "$pkg" >/dev/null 2>&1; then
|
|
||||||
msg_error "Package not found: $pkg"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
IFS=',' read -ra MODULES <<<"$COMBINED_MODULES"
|
IFS=',' read -ra MODULES <<<"$COMBINED_MODULES"
|
||||||
for mod in "${MODULES[@]}"; do
|
for mod in "${MODULES[@]}"; do
|
||||||
|
if apt-cache show "php${PHP_VERSION}-${mod}" >/dev/null 2>&1; then
|
||||||
MODULE_LIST+=" php${PHP_VERSION}-${mod}"
|
MODULE_LIST+=" php${PHP_VERSION}-${mod}"
|
||||||
|
else
|
||||||
|
msg_warn "PHP-Module ${mod} for PHP ${PHP_VERSION} not found – skipping"
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
if [[ "$PHP_FPM" == "YES" ]]; then
|
if [[ "$PHP_FPM" == "YES" ]]; then
|
||||||
MODULE_LIST+=" php${PHP_VERSION}-fpm"
|
MODULE_LIST+=" php${PHP_VERSION}-fpm"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# install apache2 with PHP support if requested
|
||||||
if [[ "$PHP_APACHE" == "YES" ]]; then
|
if [[ "$PHP_APACHE" == "YES" ]]; then
|
||||||
|
if ! dpkg -l | grep -q "libapache2-mod-php${PHP_VERSION}"; then
|
||||||
|
msg_info "Installing Apache with PHP${PHP_VERSION} support"
|
||||||
$STD apt-get install -y apache2 libapache2-mod-php${PHP_VERSION}
|
$STD apt-get install -y apache2 libapache2-mod-php${PHP_VERSION}
|
||||||
$STD systemctl restart apache2 || true
|
else
|
||||||
fi
|
msg_info "Apache with PHP${PHP_VERSION} already installed – skipping install"
|
||||||
|
fi
|
||||||
if [[ "$PHP_APACHE" == "YES" ]] && [[ -n "$CURRENT_PHP" ]]; then
|
|
||||||
if [[ -f /etc/apache2/mods-enabled/php${CURRENT_PHP}.load ]]; then
|
|
||||||
$STD a2dismod php${CURRENT_PHP} || true
|
|
||||||
fi
|
|
||||||
$STD a2enmod php${PHP_VERSION}
|
|
||||||
$STD systemctl restart apache2 || true
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$PHP_FPM" == "YES" ]] && [[ -n "$CURRENT_PHP" ]]; then
|
|
||||||
$STD systemctl stop php${CURRENT_PHP}-fpm || true
|
|
||||||
$STD systemctl disable php${CURRENT_PHP}-fpm || true
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# setup / update PHP modules
|
||||||
$STD apt-get install -y $MODULE_LIST
|
$STD apt-get install -y $MODULE_LIST
|
||||||
msg_ok "Setup PHP $PHP_VERSION"
|
msg_ok "Setup PHP $PHP_VERSION"
|
||||||
|
|
||||||
if [[ "$PHP_FPM" == "YES" ]]; then
|
# optional stop old PHP-FPM service
|
||||||
$STD systemctl enable php${PHP_VERSION}-fpm
|
if [[ "$PHP_FPM" == "YES" && -n "$CURRENT_PHP" && "$CURRENT_PHP" != "$PHP_VERSION" ]]; then
|
||||||
$STD systemctl restart php${PHP_VERSION}-fpm
|
$STD systemctl stop php"${CURRENT_PHP}"-fpm || true
|
||||||
|
$STD systemctl disable php"${CURRENT_PHP}"-fpm || true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Patch all relevant php.ini files
|
# Patch all relevant php.ini files
|
||||||
local PHP_INI_PATHS=("/etc/php/${PHP_VERSION}/cli/php.ini")
|
local PHP_INI_PATHS=("/etc/php/${PHP_VERSION}/cli/php.ini")
|
||||||
[[ "$PHP_FPM" == "YES" ]] && PHP_INI_PATHS+=("/etc/php/${PHP_VERSION}/fpm/php.ini")
|
[[ "$PHP_FPM" == "YES" ]] && PHP_INI_PATHS+=("/etc/php/${PHP_VERSION}/fpm/php.ini")
|
||||||
[[ "$PHP_APACHE" == "YES" ]] && PHP_INI_PATHS+=("/etc/php/${PHP_VERSION}/apache2/php.ini")
|
[[ "$PHP_APACHE" == "YES" ]] && PHP_INI_PATHS+=("/etc/php/${PHP_VERSION}/apache2/php.ini")
|
||||||
|
|
||||||
for ini in "${PHP_INI_PATHS[@]}"; do
|
for ini in "${PHP_INI_PATHS[@]}"; do
|
||||||
if [[ -f "$ini" ]]; then
|
if [[ -f "$ini" ]]; then
|
||||||
$STD msg_info "Patching $ini"
|
$STD msg_info "Patching $ini"
|
||||||
@@ -477,8 +469,29 @@ function setup_php() {
|
|||||||
$STD msg_ok "Patched $ini"
|
$STD msg_ok "Patched $ini"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
}
|
|
||||||
|
|
||||||
|
# patch Apache configuration if needed
|
||||||
|
if [[ "$PHP_APACHE" == "YES" ]]; then
|
||||||
|
for mod in $(ls /etc/apache2/mods-enabled/ 2>/dev/null | grep -E '^php[0-9]\.[0-9]\.conf$' | sed 's/\.conf//'); do
|
||||||
|
if [[ "$mod" != "php${PHP_VERSION}" ]]; then
|
||||||
|
$STD a2dismod "$mod" || true
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
$STD a2enmod mpm_prefork
|
||||||
|
$STD a2enmod "php${PHP_VERSION}"
|
||||||
|
$STD systemctl restart apache2 || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
# enable and restart PHP-FPM if requested
|
||||||
|
if [[ "$PHP_FPM" == "YES" ]]; then
|
||||||
|
if systemctl list-unit-files | grep -q "php${PHP_VERSION}-fpm.service"; then
|
||||||
|
$STD systemctl enable php${PHP_VERSION}-fpm
|
||||||
|
$STD systemctl restart php${PHP_VERSION}-fpm
|
||||||
|
else
|
||||||
|
msg_warn "FPM requested but service php${PHP_VERSION}-fpm not found"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
# Installs or updates Composer globally.
|
# Installs or updates Composer globally.
|
||||||
#
|
#
|
||||||
@@ -946,7 +959,7 @@ function fetch_and_deploy_gh_release() {
|
|||||||
$STD apt-get install -y unzip
|
$STD apt-get install -y unzip
|
||||||
fi
|
fi
|
||||||
unzip -q "$tmpdir/$filename" -d "$unpack_tmp"
|
unzip -q "$tmpdir/$filename" -d "$unpack_tmp"
|
||||||
elif [[ "$filename" == *.tar.* ]]; then
|
elif [[ "$filename" == *.tar.* || "$filename" == *.tgz ]]; then
|
||||||
tar -xf "$tmpdir/$filename" -C "$unpack_tmp"
|
tar -xf "$tmpdir/$filename" -C "$unpack_tmp"
|
||||||
else
|
else
|
||||||
msg_error "Unsupported archive format: $filename"
|
msg_error "Unsupported archive format: $filename"
|
||||||
@@ -956,23 +969,41 @@ function fetch_and_deploy_gh_release() {
|
|||||||
|
|
||||||
local top_dirs
|
local top_dirs
|
||||||
top_dirs=$(find "$unpack_tmp" -mindepth 1 -maxdepth 1 -type d | wc -l)
|
top_dirs=$(find "$unpack_tmp" -mindepth 1 -maxdepth 1 -type d | wc -l)
|
||||||
|
local top_entries inner_dir
|
||||||
if [[ "$top_dirs" -eq 1 ]]; then
|
top_entries=$(find "$unpack_tmp" -mindepth 1 -maxdepth 1)
|
||||||
|
if [[ "$(echo "$top_entries" | wc -l)" -eq 1 && -d "$top_entries" ]]; then
|
||||||
# Strip leading folder
|
# Strip leading folder
|
||||||
local inner_dir
|
inner_dir="$top_entries"
|
||||||
inner_dir=$(find "$unpack_tmp" -mindepth 1 -maxdepth 1 -type d)
|
|
||||||
shopt -s dotglob nullglob
|
shopt -s dotglob nullglob
|
||||||
cp -r "$inner_dir"/* "$target/"
|
if compgen -G "$inner_dir/*" >/dev/null; then
|
||||||
|
cp -r "$inner_dir"/* "$target/" || {
|
||||||
|
msg_error "Failed to copy contents from $inner_dir to $target"
|
||||||
|
rm -rf "$tmpdir" "$unpack_tmp"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
else
|
||||||
|
msg_error "Inner directory is empty: $inner_dir"
|
||||||
|
rm -rf "$tmpdir" "$unpack_tmp"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
shopt -u dotglob nullglob
|
shopt -u dotglob nullglob
|
||||||
else
|
else
|
||||||
# Copy all contents
|
# Copy all contents
|
||||||
shopt -s dotglob nullglob
|
shopt -s dotglob nullglob
|
||||||
cp -r "$unpack_tmp"/* "$target/"
|
if compgen -G "$unpack_tmp/*" >/dev/null; then
|
||||||
|
cp -r "$unpack_tmp"/* "$target/" || {
|
||||||
|
msg_error "Failed to copy contents to $target"
|
||||||
|
rm -rf "$tmpdir" "$unpack_tmp"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
else
|
||||||
|
msg_error "Unpacked archive is empty"
|
||||||
|
rm -rf "$tmpdir" "$unpack_tmp"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
shopt -u dotglob nullglob
|
shopt -u dotglob nullglob
|
||||||
fi
|
fi
|
||||||
|
|
||||||
rm -rf "$unpack_tmp"
|
|
||||||
|
|
||||||
### Singlefile Mode ###
|
### Singlefile Mode ###
|
||||||
elif [[ "$mode" == "singlefile" ]]; then
|
elif [[ "$mode" == "singlefile" ]]; then
|
||||||
local pattern="${6%\"}"
|
local pattern="${6%\"}"
|
||||||
|
|||||||
@@ -113,7 +113,6 @@ EOF
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if [[ ! -f /etc/apt/apt.conf.d/no-nag-script ]]; then
|
|
||||||
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUBSCRIPTION NAG" --menu "This will disable the nag message reminding you to purchase a subscription every time you log in to the web interface.\n \nDisable subscription nag?" 14 58 2 \
|
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUBSCRIPTION NAG" --menu "This will disable the nag message reminding you to purchase a subscription every time you log in to the web interface.\n \nDisable subscription nag?" 14 58 2 \
|
||||||
"yes" " " \
|
"yes" " " \
|
||||||
"no" " " 3>&2 2>&1 1>&3)
|
"no" " " 3>&2 2>&1 1>&3)
|
||||||
@@ -121,8 +120,7 @@ EOF
|
|||||||
yes)
|
yes)
|
||||||
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Support Subscriptions" "Supporting the software's development team is essential. Check their official website's Support Subscriptions for pricing. Without their dedicated work, we wouldn't have this exceptional software." 10 58
|
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Support Subscriptions" "Supporting the software's development team is essential. Check their official website's Support Subscriptions for pricing. Without their dedicated work, we wouldn't have this exceptional software." 10 58
|
||||||
msg_info "Disabling subscription nag"
|
msg_info "Disabling subscription nag"
|
||||||
echo "DPkg::Post-Invoke { \"dpkg -V proxmox-widget-toolkit | grep -q '/proxmoxlib\.js$'; if [ \$? -eq 1 ]; then { echo 'Removing subscription nag from UI...'; sed -i '/data\.status.*{/{s/\!//;s/active/NoMoreNagging/}' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; }; fi\"; };" >/etc/apt/apt.conf.d/no-nag-script
|
echo "DPkg::Post-Invoke { \"if [ -s /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js ] && ! grep -q -F 'NoMoreNagging' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; then echo 'Removing subscription nag from UI...'; sed -i '/data\.status/{s/\!//;s/active/NoMoreNagging/}' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; fi\" };" >/etc/apt/apt.conf.d/no-nag-script
|
||||||
apt --reinstall install proxmox-widget-toolkit &>/dev/null
|
|
||||||
msg_ok "Disabled subscription nag (Delete browser cache)"
|
msg_ok "Disabled subscription nag (Delete browser cache)"
|
||||||
;;
|
;;
|
||||||
no)
|
no)
|
||||||
@@ -130,7 +128,7 @@ EOF
|
|||||||
msg_error "Selected no to Disabling subscription nag"
|
msg_error "Selected no to Disabling subscription nag"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
fi
|
apt --reinstall install proxmox-widget-toolkit &>/dev/null
|
||||||
|
|
||||||
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE" --menu "\nUpdate Proxmox Backup Server now?" 11 58 2 \
|
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE" --menu "\nUpdate Proxmox Backup Server now?" 11 58 2 \
|
||||||
"yes" " " \
|
"yes" " " \
|
||||||
|
|||||||
@@ -112,7 +112,6 @@ EOF
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if [[ ! -f /etc/apt/apt.conf.d/no-nag-script ]]; then
|
|
||||||
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUBSCRIPTION NAG" --menu "This will disable the nag message reminding you to purchase a subscription every time you log in to the web interface.\n \nDisable subscription nag?" 14 58 2 \
|
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUBSCRIPTION NAG" --menu "This will disable the nag message reminding you to purchase a subscription every time you log in to the web interface.\n \nDisable subscription nag?" 14 58 2 \
|
||||||
"yes" " " \
|
"yes" " " \
|
||||||
"no" " " 3>&2 2>&1 1>&3)
|
"no" " " 3>&2 2>&1 1>&3)
|
||||||
@@ -120,11 +119,10 @@ EOF
|
|||||||
yes)
|
yes)
|
||||||
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Support Subscriptions" "Supporting the software's development team is essential. Check their official website's Support Subscriptions for pricing. Without their dedicated work, we wouldn't have this exceptional software." 10 58
|
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Support Subscriptions" "Supporting the software's development team is essential. Check their official website's Support Subscriptions for pricing. Without their dedicated work, we wouldn't have this exceptional software." 10 58
|
||||||
msg_info "Disabling subscription nag"
|
msg_info "Disabling subscription nag"
|
||||||
# Normal GUI:
|
# Normal GUI (proxmox-widget-toolkit)
|
||||||
echo "DPkg::Post-Invoke { \"dpkg -V proxmox-widget-toolkit | grep -q '/proxmoxlib\.js$'; if [ \$? -eq 1 ]; then { echo 'Removing subscription nag from UI...'; sed -i '/.*data\.status.*{/{s/\!//;s/active/NoMoreNagging/}' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; }; fi\"; };" >/etc/apt/apt.conf.d/no-nag-script
|
echo "DPkg::Post-Invoke { \"if [ -s /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js ] && ! grep -q -F 'NoMoreNagging' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; then echo 'Removing subscription nag from UI...'; sed -i '/data\.status/{s/\!//;s/active/NoMoreNagging/}' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; fi\" };" >/etc/apt/apt.conf.d/no-nag-script
|
||||||
# JS-Library used when accessing via mobile device browser
|
# JS library used when accessing via mobile device browser
|
||||||
echo "DPkg::Post-Invoke { \"dpkg -V pmg-gui | grep -q '/pmgmanagerlib-mobile\.js$'; if [ \$? -eq 1 ]; then { echo 'Removing subscription nag from Mobile UI...'; sed -i '/data\.status.*{/{s/\!//;s/active/NoMoreNagging/}' /usr/share/javascript/pmg-gui/js/pmgmanagerlib-mobile.js; }; fi\"; };" >>/etc/apt/apt.conf.d/no-nag-script
|
echo "DPkg::Post-Invoke { \"if [ -s /usr/share/javascript/pmg-gui/js/pmgmanagerlib-mobile.js ] && ! grep -q -F 'NoMoreNagging' /usr/share/javascript/pmg-gui/js/pmgmanagerlib-mobile.js; then echo 'Removing subscription nag from mobile UI...'; sed -i '/data\.status/{s/\!//;s/active/NoMoreNagging/}' /usr/share/javascript/pmg-gui/js/pmgmanagerlib-mobile.js; fi\" };" >/etc/apt/apt.conf.d/no-nag-script-pmgmanagerlib-mobile
|
||||||
apt --reinstall install proxmox-widget-toolkit pmg-gui &>/dev/null
|
|
||||||
msg_ok "Disabled subscription nag (Delete browser cache)"
|
msg_ok "Disabled subscription nag (Delete browser cache)"
|
||||||
;;
|
;;
|
||||||
no)
|
no)
|
||||||
@@ -132,7 +130,7 @@ EOF
|
|||||||
msg_error "Selected no to disabling subscription nag"
|
msg_error "Selected no to disabling subscription nag"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
fi
|
apt --reinstall install proxmox-widget-toolkit pmg-gui &>/dev/null
|
||||||
|
|
||||||
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE" --menu "\nUpdate Proxmox Mail Gateway now?" 11 58 2 \
|
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE" --menu "\nUpdate Proxmox Mail Gateway now?" 11 58 2 \
|
||||||
"yes" " " \
|
"yes" " " \
|
||||||
|
|||||||
@@ -133,7 +133,6 @@ EOF
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if [[ ! -f /etc/apt/apt.conf.d/no-nag-script ]]; then
|
|
||||||
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUBSCRIPTION NAG" --menu "This will disable the nag message reminding you to purchase a subscription every time you log in to the web interface.\n \nDisable subscription nag?" 14 58 2 \
|
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUBSCRIPTION NAG" --menu "This will disable the nag message reminding you to purchase a subscription every time you log in to the web interface.\n \nDisable subscription nag?" 14 58 2 \
|
||||||
"yes" " " \
|
"yes" " " \
|
||||||
"no" " " 3>&2 2>&1 1>&3)
|
"no" " " 3>&2 2>&1 1>&3)
|
||||||
@@ -141,16 +140,16 @@ EOF
|
|||||||
yes)
|
yes)
|
||||||
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Support Subscriptions" "Supporting the software's development team is essential. Check their official website's Support Subscriptions for pricing. Without their dedicated work, we wouldn't have this exceptional software." 10 58
|
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Support Subscriptions" "Supporting the software's development team is essential. Check their official website's Support Subscriptions for pricing. Without their dedicated work, we wouldn't have this exceptional software." 10 58
|
||||||
msg_info "Disabling subscription nag"
|
msg_info "Disabling subscription nag"
|
||||||
echo "DPkg::Post-Invoke { \"dpkg -V proxmox-widget-toolkit | grep -q '/proxmoxlib\.js$'; if [ \$? -eq 1 ]; then { echo 'Removing subscription nag from UI...'; sed -i '/.*data\.status.*{/{s/\!//;s/active/NoMoreNagging/}' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; }; fi\"; };" >/etc/apt/apt.conf.d/no-nag-script
|
echo "DPkg::Post-Invoke { \"if [ -s /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js ] && ! grep -q -F 'NoMoreNagging' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; then echo 'Removing subscription nag from UI...'; sed -i '/data\.status/{s/\!//;s/active/NoMoreNagging/}' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; fi\" };" >/etc/apt/apt.conf.d/no-nag-script
|
||||||
apt --reinstall install proxmox-widget-toolkit &>/dev/null
|
|
||||||
msg_ok "Disabled subscription nag (Delete browser cache)"
|
msg_ok "Disabled subscription nag (Delete browser cache)"
|
||||||
;;
|
;;
|
||||||
no)
|
no)
|
||||||
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Support Subscriptions" "Supporting the software's development team is essential. Check their official website's Support Subscriptions for pricing. Without their dedicated work, we wouldn't have this exceptional software." 10 58
|
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Support Subscriptions" "Supporting the software's development team is essential. Check their official website's Support Subscriptions for pricing. Without their dedicated work, we wouldn't have this exceptional software." 10 58
|
||||||
msg_error "Selected no to Disabling subscription nag"
|
msg_error "Selected no to Disabling subscription nag"
|
||||||
|
rm /etc/apt/apt.conf.d/no-nag-script 2>/dev/null
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
fi
|
apt --reinstall install proxmox-widget-toolkit &>/dev/null
|
||||||
|
|
||||||
if ! systemctl is-active --quiet pve-ha-lrm; then
|
if ! systemctl is-active --quiet pve-ha-lrm; then
|
||||||
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "HIGH AVAILABILITY" --menu "Enable high availability?" 10 58 2 \
|
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "HIGH AVAILABILITY" --menu "Enable high availability?" 10 58 2 \
|
||||||
|
|||||||
@@ -138,14 +138,37 @@ function check_root() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function pve_check() {
|
pve_check() {
|
||||||
if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; then
|
local PVE_VER
|
||||||
msg_error "${CROSS}${RD}This version of Proxmox Virtual Environment is not supported"
|
PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
|
||||||
echo -e "Requires Proxmox Virtual Environment Version 8.1 or later."
|
|
||||||
echo -e "Exiting..."
|
# Check for Proxmox VE 8.x
|
||||||
sleep 2
|
if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then
|
||||||
exit
|
local MINOR="${BASH_REMATCH[1]}"
|
||||||
|
if ((MINOR < 1 || MINOR > 4)); then
|
||||||
|
msg_error "This version of Proxmox VE is not supported."
|
||||||
|
echo -e "Required: Proxmox VE version 8.1 – 8.4"
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for Proxmox VE 9.x (Beta) — require confirmation
|
||||||
|
if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then
|
||||||
|
if whiptail --title "Proxmox 9.x Detected (Beta)" \
|
||||||
|
--yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then
|
||||||
|
msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
msg_error "Aborted by user: Proxmox VE 9.x was not confirmed."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# All other unsupported versions
|
||||||
|
msg_error "This version of Proxmox VE is not supported."
|
||||||
|
echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)"
|
||||||
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
function arch_check() {
|
function arch_check() {
|
||||||
|
|||||||
@@ -138,14 +138,37 @@ function check_root() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function pve_check() {
|
pve_check() {
|
||||||
if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; then
|
local PVE_VER
|
||||||
msg_error "${CROSS}${RD}This version of Proxmox Virtual Environment is not supported"
|
PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
|
||||||
echo -e "Requires Proxmox Virtual Environment Version 8.1 or later."
|
|
||||||
echo -e "Exiting..."
|
# Check for Proxmox VE 8.x
|
||||||
sleep 2
|
if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then
|
||||||
exit
|
local MINOR="${BASH_REMATCH[1]}"
|
||||||
|
if ((MINOR < 1 || MINOR > 4)); then
|
||||||
|
msg_error "This version of Proxmox VE is not supported."
|
||||||
|
echo -e "Required: Proxmox VE version 8.1 – 8.4"
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for Proxmox VE 9.x (Beta) — require confirmation
|
||||||
|
if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then
|
||||||
|
if whiptail --title "Proxmox 9.x Detected (Beta)" \
|
||||||
|
--yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then
|
||||||
|
msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
msg_error "Aborted by user: Proxmox VE 9.x was not confirmed."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# All other unsupported versions
|
||||||
|
msg_error "This version of Proxmox VE is not supported."
|
||||||
|
echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)"
|
||||||
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
function arch_check() {
|
function arch_check() {
|
||||||
|
|||||||
@@ -139,14 +139,37 @@ function check_root() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function pve_check() {
|
pve_check() {
|
||||||
if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; then
|
local PVE_VER
|
||||||
msg_error "${CROSS}${RD}This version of Proxmox Virtual Environment is not supported"
|
PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
|
||||||
echo -e "Requires Proxmox Virtual Environment Version 8.1 or later."
|
|
||||||
echo -e "Exiting..."
|
# Check for Proxmox VE 8.x
|
||||||
sleep 2
|
if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then
|
||||||
exit
|
local MINOR="${BASH_REMATCH[1]}"
|
||||||
|
if ((MINOR < 1 || MINOR > 4)); then
|
||||||
|
msg_error "This version of Proxmox VE is not supported."
|
||||||
|
echo -e "Required: Proxmox VE version 8.1 – 8.4"
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for Proxmox VE 9.x (Beta) — require confirmation
|
||||||
|
if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then
|
||||||
|
if whiptail --title "Proxmox 9.x Detected (Beta)" \
|
||||||
|
--yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then
|
||||||
|
msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
msg_error "Aborted by user: Proxmox VE 9.x was not confirmed."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# All other unsupported versions
|
||||||
|
msg_error "This version of Proxmox VE is not supported."
|
||||||
|
echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)"
|
||||||
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
function arch_check() {
|
function arch_check() {
|
||||||
|
|||||||
@@ -142,14 +142,37 @@ function check_root() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function pve_check() {
|
pve_check() {
|
||||||
if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; then
|
local PVE_VER
|
||||||
msg_error "${CROSS}${RD}This version of Proxmox Virtual Environment is not supported"
|
PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
|
||||||
echo -e "Requires Proxmox Virtual Environment Version 8.1 or later."
|
|
||||||
echo -e "Exiting..."
|
# Check for Proxmox VE 8.x
|
||||||
sleep 2
|
if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then
|
||||||
exit
|
local MINOR="${BASH_REMATCH[1]}"
|
||||||
|
if ((MINOR < 1 || MINOR > 4)); then
|
||||||
|
msg_error "This version of Proxmox VE is not supported."
|
||||||
|
echo -e "Required: Proxmox VE version 8.1 – 8.4"
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for Proxmox VE 9.x (Beta) — require confirmation
|
||||||
|
if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then
|
||||||
|
if whiptail --title "Proxmox 9.x Detected (Beta)" \
|
||||||
|
--yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then
|
||||||
|
msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
msg_error "Aborted by user: Proxmox VE 9.x was not confirmed."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# All other unsupported versions
|
||||||
|
msg_error "This version of Proxmox VE is not supported."
|
||||||
|
echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)"
|
||||||
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
function arch_check() {
|
function arch_check() {
|
||||||
|
|||||||
@@ -139,14 +139,37 @@ function check_root() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function pve_check() {
|
pve_check() {
|
||||||
if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; then
|
local PVE_VER
|
||||||
msg_error "${CROSS}${RD}This version of Proxmox Virtual Environment is not supported"
|
PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
|
||||||
echo -e "Requires Proxmox Virtual Environment Version 8.1 or later."
|
|
||||||
echo -e "Exiting..."
|
# Check for Proxmox VE 8.x
|
||||||
sleep 2
|
if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then
|
||||||
exit
|
local MINOR="${BASH_REMATCH[1]}"
|
||||||
|
if ((MINOR < 1 || MINOR > 4)); then
|
||||||
|
msg_error "This version of Proxmox VE is not supported."
|
||||||
|
echo -e "Required: Proxmox VE version 8.1 – 8.4"
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for Proxmox VE 9.x (Beta) — require confirmation
|
||||||
|
if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then
|
||||||
|
if whiptail --title "Proxmox 9.x Detected (Beta)" \
|
||||||
|
--yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then
|
||||||
|
msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
msg_error "Aborted by user: Proxmox VE 9.x was not confirmed."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# All other unsupported versions
|
||||||
|
msg_error "This version of Proxmox VE is not supported."
|
||||||
|
echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)"
|
||||||
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
function arch_check() {
|
function arch_check() {
|
||||||
|
|||||||
@@ -138,14 +138,37 @@ function check_root() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function pve_check() {
|
pve_check() {
|
||||||
if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; then
|
local PVE_VER
|
||||||
msg_error "${CROSS}${RD}This version of Proxmox Virtual Environment is not supported"
|
PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
|
||||||
echo -e "Requires Proxmox Virtual Environment Version 8.1 or later."
|
|
||||||
echo -e "Exiting..."
|
# Check for Proxmox VE 8.x
|
||||||
sleep 2
|
if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then
|
||||||
exit
|
local MINOR="${BASH_REMATCH[1]}"
|
||||||
|
if ((MINOR < 1 || MINOR > 4)); then
|
||||||
|
msg_error "This version of Proxmox VE is not supported."
|
||||||
|
echo -e "Required: Proxmox VE version 8.1 – 8.4"
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for Proxmox VE 9.x (Beta) — require confirmation
|
||||||
|
if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then
|
||||||
|
if whiptail --title "Proxmox 9.x Detected (Beta)" \
|
||||||
|
--yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then
|
||||||
|
msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
msg_error "Aborted by user: Proxmox VE 9.x was not confirmed."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# All other unsupported versions
|
||||||
|
msg_error "This version of Proxmox VE is not supported."
|
||||||
|
echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)"
|
||||||
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
function arch_check() {
|
function arch_check() {
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user