Merge branch 'main' into garmin-grafana
This commit is contained in:
commit
ab19162dc4
@ -10,7 +10,7 @@ indent_style = space
|
|||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
max_line_length = 120
|
max_line_length = 120
|
||||||
tab_width = 2
|
tab_width = 2
|
||||||
; trim_trailing_whitespace = true ; disabled until files are cleaned up
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
[*.md]
|
[*.md]
|
||||||
trim_trailing_whitespace = false
|
trim_trailing_whitespace = false
|
||||||
|
|||||||
0
.github/workflows/script-test.yaml → .github/workflows/bak/script-test.yaml
generated
vendored
0
.github/workflows/script-test.yaml → .github/workflows/bak/script-test.yaml
generated
vendored
@ -25,13 +25,6 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
ref: main
|
ref: main
|
||||||
|
|
||||||
- name: Generate GitHub App Token
|
|
||||||
id: generate-token
|
|
||||||
uses: actions/create-github-app-token@v1
|
|
||||||
with:
|
|
||||||
app-id: ${{ vars.APP_ID }}
|
|
||||||
private-key: ${{ secrets.APP_PRIVATE_KEY }}
|
|
||||||
|
|
||||||
- name: Extract version sources from install scripts
|
- name: Extract version sources from install scripts
|
||||||
run: |
|
run: |
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
@ -330,7 +323,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Fetch versions for all sources
|
- name: Fetch versions for all sources
|
||||||
env:
|
env:
|
||||||
GH_TOKEN: ${{ steps.generate-token.outputs.token }}
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
run: |
|
run: |
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
@ -453,7 +446,7 @@ jobs:
|
|||||||
- name: Create Pull Request
|
- name: Create Pull Request
|
||||||
if: steps.check-changes.outputs.changed == 'true'
|
if: steps.check-changes.outputs.changed == 'true'
|
||||||
env:
|
env:
|
||||||
GH_TOKEN: ${{ steps.generate-token.outputs.token }}
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
run: |
|
run: |
|
||||||
BRANCH_NAME="automated/update-versions-$(date +%Y%m%d)"
|
BRANCH_NAME="automated/update-versions-$(date +%Y%m%d)"
|
||||||
|
|
||||||
0
.github/workflows/update_issue.yml → .github/workflows/bak/update_issue.yml
generated
vendored
0
.github/workflows/update_issue.yml → .github/workflows/bak/update_issue.yml
generated
vendored
218
.github/workflows/update-github-versions.yml
generated
vendored
Normal file
218
.github/workflows/update-github-versions.yml
generated
vendored
Normal file
@ -0,0 +1,218 @@
|
|||||||
|
name: Update GitHub Versions (New)
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
schedule:
|
||||||
|
# Runs 4x daily: 00:00, 06:00, 12:00, 18:00 UTC
|
||||||
|
- cron: "0 0,6,12,18 * * *"
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
env:
|
||||||
|
VERSIONS_FILE: frontend/public/json/github-versions.json
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
update-github-versions:
|
||||||
|
if: github.repository == 'community-scripts/ProxmoxVED'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout Repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: main
|
||||||
|
|
||||||
|
- name: Extract GitHub versions from install scripts
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
echo "========================================="
|
||||||
|
echo " Extracting GitHub versions from scripts"
|
||||||
|
echo "========================================="
|
||||||
|
|
||||||
|
# Initialize versions array
|
||||||
|
versions_json="[]"
|
||||||
|
|
||||||
|
# Function to add a version entry
|
||||||
|
add_version() {
|
||||||
|
local slug="$1"
|
||||||
|
local repo="$2"
|
||||||
|
local version="$3"
|
||||||
|
local pinned="$4"
|
||||||
|
local date="$5"
|
||||||
|
|
||||||
|
versions_json=$(echo "$versions_json" | jq \
|
||||||
|
--arg slug "$slug" \
|
||||||
|
--arg repo "$repo" \
|
||||||
|
--arg version "$version" \
|
||||||
|
--argjson pinned "$pinned" \
|
||||||
|
--arg date "$date" \
|
||||||
|
'. += [{"slug": $slug, "repo": $repo, "version": $version, "pinned": $pinned, "date": $date}]')
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get list of slugs from JSON files
|
||||||
|
echo ""
|
||||||
|
echo "=== Scanning JSON files for slugs ==="
|
||||||
|
|
||||||
|
for json_file in frontend/public/json/*.json; do
|
||||||
|
[[ ! -f "$json_file" ]] && continue
|
||||||
|
|
||||||
|
# Skip non-app JSON files
|
||||||
|
basename_file=$(basename "$json_file")
|
||||||
|
case "$basename_file" in
|
||||||
|
metadata.json|versions.json|github-versions.json|dependency-check.json|update-apps.json)
|
||||||
|
continue
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Extract slug from JSON
|
||||||
|
slug=$(jq -r '.slug // empty' "$json_file" 2>/dev/null)
|
||||||
|
[[ -z "$slug" ]] && continue
|
||||||
|
|
||||||
|
# Find corresponding install script
|
||||||
|
install_script="install/${slug}-install.sh"
|
||||||
|
[[ ! -f "$install_script" ]] && continue
|
||||||
|
|
||||||
|
# Look for fetch_and_deploy_gh_release calls
|
||||||
|
# Pattern: fetch_and_deploy_gh_release "app" "owner/repo" ["mode"] ["version"]
|
||||||
|
while IFS= read -r line; do
|
||||||
|
# Skip commented lines
|
||||||
|
[[ "$line" =~ ^[[:space:]]*# ]] && continue
|
||||||
|
|
||||||
|
# Extract repo and version from fetch_and_deploy_gh_release
|
||||||
|
if [[ "$line" =~ fetch_and_deploy_gh_release[[:space:]]+\"[^\"]*\"[[:space:]]+\"([^\"]+)\"([[:space:]]+\"([^\"]+)\")?([[:space:]]+\"([^\"]+)\")? ]]; then
|
||||||
|
repo="${BASH_REMATCH[1]}"
|
||||||
|
mode="${BASH_REMATCH[3]:-tarball}"
|
||||||
|
pinned_version="${BASH_REMATCH[5]:-latest}"
|
||||||
|
|
||||||
|
# Check if version is pinned (not "latest" and not empty)
|
||||||
|
is_pinned=false
|
||||||
|
target_version=""
|
||||||
|
|
||||||
|
if [[ -n "$pinned_version" && "$pinned_version" != "latest" ]]; then
|
||||||
|
is_pinned=true
|
||||||
|
target_version="$pinned_version"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Fetch version from GitHub
|
||||||
|
if [[ "$is_pinned" == "true" ]]; then
|
||||||
|
# For pinned versions, verify it exists and get date
|
||||||
|
response=$(gh api "repos/${repo}/releases/tags/${target_version}" 2>/dev/null || echo '{}')
|
||||||
|
if echo "$response" | jq -e '.tag_name' > /dev/null 2>&1; then
|
||||||
|
version=$(echo "$response" | jq -r '.tag_name')
|
||||||
|
date=$(echo "$response" | jq -r '.published_at // empty')
|
||||||
|
add_version "$slug" "$repo" "$version" "true" "$date"
|
||||||
|
echo "[$slug] ✓ $version (pinned)"
|
||||||
|
else
|
||||||
|
echo "[$slug] ⚠ pinned version $target_version not found"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# Fetch latest release
|
||||||
|
response=$(gh api "repos/${repo}/releases/latest" 2>/dev/null || echo '{}')
|
||||||
|
if echo "$response" | jq -e '.tag_name' > /dev/null 2>&1; then
|
||||||
|
version=$(echo "$response" | jq -r '.tag_name')
|
||||||
|
date=$(echo "$response" | jq -r '.published_at // empty')
|
||||||
|
add_version "$slug" "$repo" "$version" "false" "$date"
|
||||||
|
echo "[$slug] ✓ $version"
|
||||||
|
else
|
||||||
|
# Try tags as fallback
|
||||||
|
version=$(gh api "repos/${repo}/tags" --jq '.[0].name // empty' 2>/dev/null || echo "")
|
||||||
|
if [[ -n "$version" ]]; then
|
||||||
|
add_version "$slug" "$repo" "$version" "false" ""
|
||||||
|
echo "[$slug] ✓ $version (from tags)"
|
||||||
|
else
|
||||||
|
echo "[$slug] ⚠ no version found"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
break # Only first match per script
|
||||||
|
fi
|
||||||
|
done < <(grep 'fetch_and_deploy_gh_release' "$install_script" 2>/dev/null || true)
|
||||||
|
|
||||||
|
done
|
||||||
|
|
||||||
|
# Save versions file
|
||||||
|
echo "$versions_json" | jq --arg date "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
|
||||||
|
'{generated: $date, versions: (. | sort_by(.slug))}' > "$VERSIONS_FILE"
|
||||||
|
|
||||||
|
total=$(echo "$versions_json" | jq 'length')
|
||||||
|
echo ""
|
||||||
|
echo "========================================="
|
||||||
|
echo " Total versions extracted: $total"
|
||||||
|
echo "========================================="
|
||||||
|
|
||||||
|
- name: Check for changes
|
||||||
|
id: check-changes
|
||||||
|
run: |
|
||||||
|
# Check if file is new (untracked) or has changes
|
||||||
|
if [[ ! -f "$VERSIONS_FILE" ]]; then
|
||||||
|
echo "changed=false" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "Versions file was not created"
|
||||||
|
elif ! git ls-files --error-unmatch "$VERSIONS_FILE" &>/dev/null; then
|
||||||
|
# File exists but is not tracked - it's new
|
||||||
|
echo "changed=true" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "New file created: $VERSIONS_FILE"
|
||||||
|
elif git diff --quiet "$VERSIONS_FILE" 2>/dev/null; then
|
||||||
|
echo "changed=false" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "No changes detected"
|
||||||
|
else
|
||||||
|
echo "changed=true" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "Changes detected:"
|
||||||
|
git diff --stat "$VERSIONS_FILE" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Create Pull Request
|
||||||
|
if: steps.check-changes.outputs.changed == 'true'
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
run: |
|
||||||
|
BRANCH_NAME="automated/update-github-versions-$(date +%Y%m%d)"
|
||||||
|
|
||||||
|
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
||||||
|
git config --global user.name "GitHub Actions[bot]"
|
||||||
|
|
||||||
|
# Check if branch exists and delete it
|
||||||
|
git push origin --delete "$BRANCH_NAME" 2>/dev/null || true
|
||||||
|
|
||||||
|
git checkout -b "$BRANCH_NAME"
|
||||||
|
git add "$VERSIONS_FILE"
|
||||||
|
git commit -m "chore: update github-versions.json
|
||||||
|
|
||||||
|
Total versions: $(jq '.versions | length' "$VERSIONS_FILE")
|
||||||
|
Pinned versions: $(jq '[.versions[] | select(.pinned == true)] | length' "$VERSIONS_FILE")
|
||||||
|
Generated: $(jq -r '.generated' "$VERSIONS_FILE")"
|
||||||
|
|
||||||
|
git push origin "$BRANCH_NAME" --force
|
||||||
|
|
||||||
|
# Check if PR already exists
|
||||||
|
existing_pr=$(gh pr list --head "$BRANCH_NAME" --state open --json number --jq '.[0].number // empty')
|
||||||
|
|
||||||
|
if [[ -n "$existing_pr" ]]; then
|
||||||
|
echo "PR #$existing_pr already exists, updating..."
|
||||||
|
else
|
||||||
|
gh pr create \
|
||||||
|
--title "[Automated] Update GitHub versions" \
|
||||||
|
--body "This PR updates version information from GitHub releases.
|
||||||
|
|
||||||
|
## How it works
|
||||||
|
1. Scans all JSON files in \`frontend/public/json/\` for slugs
|
||||||
|
2. Finds corresponding \`install/{slug}-install.sh\` scripts
|
||||||
|
3. Extracts \`fetch_and_deploy_gh_release\` calls
|
||||||
|
4. Fetches latest (or pinned) version from GitHub
|
||||||
|
|
||||||
|
## Stats
|
||||||
|
- Total versions: $(jq '.versions | length' "$VERSIONS_FILE")
|
||||||
|
- Pinned versions: $(jq '[.versions[] | select(.pinned == true)] | length' "$VERSIONS_FILE")
|
||||||
|
- Latest versions: $(jq '[.versions[] | select(.pinned == false)] | length' "$VERSIONS_FILE")
|
||||||
|
|
||||||
|
---
|
||||||
|
*Automatically generated from install scripts*" \
|
||||||
|
--base main \
|
||||||
|
--head "$BRANCH_NAME" \
|
||||||
|
--label "automated pr"
|
||||||
|
fi
|
||||||
1
.vscode/.shellcheckrc
generated
vendored
1
.vscode/.shellcheckrc
generated
vendored
@ -1 +0,0 @@
|
|||||||
disable=SC2034,SC1091,SC2155,SC2086,SC2317,SC2181,SC2164
|
|
||||||
3
.vscode/extensions.json
generated
vendored
3
.vscode/extensions.json
generated
vendored
@ -1,8 +1,7 @@
|
|||||||
{
|
{
|
||||||
"recommendations": [
|
"recommendations": [
|
||||||
"bmalehorn.shell-syntax",
|
|
||||||
"timonwong.shellcheck",
|
"timonwong.shellcheck",
|
||||||
"foxundermoon.shell-format"
|
"mkhl.shfmt"
|
||||||
],
|
],
|
||||||
"unwantedRecommendations": []
|
"unwantedRecommendations": []
|
||||||
}
|
}
|
||||||
|
|||||||
41
.vscode/settings.json
generated
vendored
41
.vscode/settings.json
generated
vendored
@ -1,33 +1,12 @@
|
|||||||
{
|
{
|
||||||
"files.associations": {
|
"files.associations": {
|
||||||
"*.func": "shellscript"
|
"*.func": "shellscript"
|
||||||
},
|
},
|
||||||
"files.eol": "\n",
|
"[shellscript]": {
|
||||||
"files.encoding": "utf8",
|
"editor.defaultFormatter": "mkhl.shfmt"
|
||||||
"files.trimTrailingWhitespace": true,
|
},
|
||||||
"files.insertFinalNewline": true,
|
"editor.codeActionsOnSave": {
|
||||||
"files.autoSave": "afterDelay",
|
"source.fixAll": "never"
|
||||||
"files.autoGuessEncoding": false,
|
},
|
||||||
"editor.detectIndentation": false,
|
"shellcheck.useWorkspaceRootAsCwd": true,
|
||||||
"editor.tabSize": 4,
|
|
||||||
"editor.insertSpaces": true,
|
|
||||||
"editor.wordWrap": "off",
|
|
||||||
"editor.renderWhitespace": "boundary",
|
|
||||||
"editor.formatOnSave": true,
|
|
||||||
"editor.formatOnPaste": true,
|
|
||||||
"editor.minimap.enabled": false,
|
|
||||||
"terminal.integrated.scrollback": 10000,
|
|
||||||
"[shellscript]": {
|
|
||||||
"editor.defaultFormatter": "foxundermoon.shell-format",
|
|
||||||
"editor.tabSize": 4,
|
|
||||||
"editor.insertSpaces": true,
|
|
||||||
},
|
|
||||||
"shellcheck.customArgs": [
|
|
||||||
"--rcfile",
|
|
||||||
".vscode/.shellcheckrc"
|
|
||||||
],
|
|
||||||
"git.autofetch": true,
|
|
||||||
"git.confirmSync": false,
|
|
||||||
"git.enableSmartCommit": true,
|
|
||||||
"extensions.ignoreRecommendations": false
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,12 +1,12 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
# Author: MickLesk (CanbiZ)
|
# Author: Slaviša Arežina (tremor021)
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||||
# Source: https://github.com/orhun/rustypaste
|
# Source: https://www.powerdns.com/
|
||||||
|
|
||||||
APP="Alpine-RustyPaste"
|
APP="Alpine-PowerDNS"
|
||||||
var_tags="${var_tags:-alpine;pastebin;storage}"
|
var_tags="${var_tags:-os;alpine;dns}"
|
||||||
var_cpu="${var_cpu:-1}"
|
var_cpu="${var_cpu:-1}"
|
||||||
var_ram="${var_ram:-256}"
|
var_ram="${var_ram:-256}"
|
||||||
var_disk="${var_disk:-4}"
|
var_disk="${var_disk:-4}"
|
||||||
@ -24,18 +24,17 @@ function update_script() {
|
|||||||
check_container_storage
|
check_container_storage
|
||||||
check_container_resources
|
check_container_resources
|
||||||
|
|
||||||
if ! apk info -e rustypaste >/dev/null 2>&1; then
|
if ! apk info -e pdns >/dev/null 2>&1; then
|
||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
msg_info "Updating RustyPaste"
|
msg_info "Updating PowerDNS"
|
||||||
$STD apk update
|
$STD apk -U upgrade
|
||||||
$STD apk upgrade rustypaste --repository=https://dl-cdn.alpinelinux.org/alpine/edge/community
|
msg_ok "Updated PowerDNS"
|
||||||
msg_ok "Updated RustyPaste"
|
|
||||||
|
|
||||||
msg_info "Restarting Services"
|
msg_info "Restarting Services"
|
||||||
$STD rc-service rustypaste restart
|
$STD rc-service pdns restart
|
||||||
msg_ok "Restarted Services"
|
msg_ok "Restarted Services"
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
exit
|
exit
|
||||||
@ -48,4 +47,4 @@ description
|
|||||||
msg_ok "Completed successfully!\n"
|
msg_ok "Completed successfully!\n"
|
||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8000${CL}"
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:53${CL}"
|
||||||
@ -1,73 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: pshankinclarke (lazarillo)
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://valkey.io/
|
|
||||||
|
|
||||||
APP="Alpine-Valkey"
|
|
||||||
var_tags="${var_tags:-alpine;database}"
|
|
||||||
var_cpu="${var_cpu:-1}"
|
|
||||||
var_ram="${var_ram:-256}"
|
|
||||||
var_disk="${var_disk:-1}"
|
|
||||||
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() {
|
|
||||||
if ! apk -e info newt >/dev/null 2>&1; then
|
|
||||||
apk add -q newt
|
|
||||||
fi
|
|
||||||
LXCIP=$(ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
|
||||||
while true; do
|
|
||||||
CHOICE=$(
|
|
||||||
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Valkey Management" --menu "Select option" 11 58 3 \
|
|
||||||
"1" "Update Valkey" \
|
|
||||||
"2" "Allow 0.0.0.0 for listening" \
|
|
||||||
"3" "Allow only ${LXCIP} for listening" 3>&2 2>&1 1>&3
|
|
||||||
)
|
|
||||||
exit_status=$?
|
|
||||||
if [ $exit_status == 1 ]; then
|
|
||||||
clear
|
|
||||||
exit-script
|
|
||||||
fi
|
|
||||||
header_info
|
|
||||||
case $CHOICE in
|
|
||||||
1)
|
|
||||||
msg_info "Updating Valkey"
|
|
||||||
apk update && apk upgrade valkey
|
|
||||||
rc-service valkey restart
|
|
||||||
msg_ok "Updated Valkey"
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
exit
|
|
||||||
;;
|
|
||||||
2)
|
|
||||||
msg_info "Setting Valkey to listen on all interfaces"
|
|
||||||
sed -i 's/^bind .*/bind 0.0.0.0/' /etc/valkey/valkey.conf
|
|
||||||
rc-service valkey restart
|
|
||||||
msg_ok "Valkey now listens on all interfaces!"
|
|
||||||
exit
|
|
||||||
;;
|
|
||||||
3)
|
|
||||||
msg_info "Setting Valkey to listen only on ${LXCIP}"
|
|
||||||
sed -i "s/^bind .*/bind ${LXCIP}/" /etc/valkey/valkey.conf
|
|
||||||
rc-service valkey restart
|
|
||||||
msg_ok "Valkey now listens only on ${LXCIP}!"
|
|
||||||
exit
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable on port 6379.
|
|
||||||
${BL}valkey-cli -h ${IP} -p 6379${CL} \n"
|
|
||||||
@ -1,78 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: MickLesk (Canbiz)
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/ampache/ampache
|
|
||||||
|
|
||||||
APP="Ampache"
|
|
||||||
var_tags="${var_tags:-music}"
|
|
||||||
var_disk="${var_disk:-5}"
|
|
||||||
var_cpu="${var_cpu:-4}"
|
|
||||||
var_ram="${var_ram:-2048}"
|
|
||||||
var_os="${var_os:-debian}"
|
|
||||||
var_version="${var_version:-13}"
|
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
|
||||||
|
|
||||||
header_info "$APP"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
check_container_storage
|
|
||||||
check_container_resources
|
|
||||||
|
|
||||||
if [[ ! -d /opt/ampache ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
if check_for_gh_release "Ampache" "ampache/ampache"; then
|
|
||||||
import_local_ip
|
|
||||||
msg_info "Stopping Apache"
|
|
||||||
systemctl stop apache2
|
|
||||||
msg_ok "Stopped Apache"
|
|
||||||
|
|
||||||
msg_info "Backing up Configuration"
|
|
||||||
cp /opt/ampache/config/ampache.cfg.php /tmp/ampache.cfg.php.backup
|
|
||||||
cp /opt/ampache/public/rest/.htaccess /tmp/ampache_rest.htaccess.backup
|
|
||||||
cp /opt/ampache/public/play/.htaccess /tmp/ampache_play.htaccess.backup
|
|
||||||
msg_ok "Backed up Configuration"
|
|
||||||
|
|
||||||
msg_info "Backup Ampache Folder"
|
|
||||||
rm -rf /opt/ampache_backup
|
|
||||||
mv /opt/ampache /opt/ampache_backup
|
|
||||||
msg_ok "Backed up Ampache"
|
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "Ampache" "ampache/ampache" "release" "latest" "/opt/ampache" "ampache-*_all_php8.4.zip"
|
|
||||||
|
|
||||||
msg_info "Restoring Configuration"
|
|
||||||
cp /tmp/ampache.cfg.php.backup /opt/ampache/config/ampache.cfg.php
|
|
||||||
cp /tmp/ampache_rest.htaccess.backup /opt/ampache/public/rest/.htaccess
|
|
||||||
cp /tmp/ampache_play.htaccess.backup /opt/ampache/public/play/.htaccess
|
|
||||||
chmod 664 /opt/ampache/public/rest/.htaccess /opt/ampache/public/play/.htaccess
|
|
||||||
chown -R www-data:www-data /opt/ampache
|
|
||||||
msg_ok "Restored Configuration"
|
|
||||||
|
|
||||||
msg_info "Cleaning up"
|
|
||||||
rm -f /tmp/ampache*.backup
|
|
||||||
msg_ok "Cleaned up"
|
|
||||||
|
|
||||||
msg_info "Starting Apache"
|
|
||||||
systemctl start apache2
|
|
||||||
msg_ok "Started Apache"
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
msg_custom "⚠️" "${YW}" "Complete database update by visiting: http://${LOCAL_IP}/update.php"
|
|
||||||
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}/install.php${CL}"
|
|
||||||
66
ct/anytype.sh
Normal file
66
ct/anytype.sh
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: MickLesk (CanbiZ)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||||
|
# Source: https://anytype.io
|
||||||
|
|
||||||
|
APP="Anytype"
|
||||||
|
var_tags="${var_tags:-notes;productivity;sync}"
|
||||||
|
var_cpu="${var_cpu:-2}"
|
||||||
|
var_ram="${var_ram:-4096}"
|
||||||
|
var_disk="${var_disk:-16}"
|
||||||
|
var_os="${var_os:-ubuntu}"
|
||||||
|
var_version="${var_version:-24.04}"
|
||||||
|
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/anytype/any-sync-bundle ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_release "anytype" "grishy/any-sync-bundle"; then
|
||||||
|
msg_info "Stopping Service"
|
||||||
|
systemctl stop anytype
|
||||||
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
|
msg_info "Backing up Data"
|
||||||
|
cp -r /opt/anytype/data /opt/anytype_data_backup
|
||||||
|
msg_ok "Backed up Data"
|
||||||
|
|
||||||
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "anytype" "grishy/any-sync-bundle" "prebuild" "latest" "/opt/anytype" "any-sync-bundle_*_linux_amd64.tar.gz"
|
||||||
|
chmod +x /opt/anytype/any-sync-bundle
|
||||||
|
|
||||||
|
msg_info "Restoring Data"
|
||||||
|
cp -r /opt/anytype_data_backup/. /opt/anytype/data
|
||||||
|
rm -rf /opt/anytype_data_backup
|
||||||
|
msg_ok "Restored Data"
|
||||||
|
|
||||||
|
msg_info "Starting Service"
|
||||||
|
systemctl start anytype
|
||||||
|
msg_ok "Started Service"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:33010${CL}"
|
||||||
|
echo -e "${INFO}${YW} Client config file:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}/opt/anytype/data/client-config.yml${CL}"
|
||||||
48
ct/authelia.sh
Normal file
48
ct/authelia.sh
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: thost96 (thost96)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://www.authelia.com/
|
||||||
|
|
||||||
|
APP="Authelia"
|
||||||
|
var_tags="${var_tags:-authenticator}"
|
||||||
|
var_cpu="${var_cpu:-1}"
|
||||||
|
var_ram="${var_ram:-512}"
|
||||||
|
var_disk="${var_disk:-2}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
base_settings
|
||||||
|
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
if [[ ! -d /etc/authelia/ ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_release "authelia" "authelia/authelia"; then
|
||||||
|
$STD apt update
|
||||||
|
$STD apt -y upgrade
|
||||||
|
fetch_and_deploy_gh_release "authelia" "authelia/authelia" "binary"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9091 or https://auth.YOURDOMAIN ${CL}"
|
||||||
72
ct/checkmate.sh
Normal file
72
ct/checkmate.sh
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: MickLesk (CanbiZ)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/bluewave-labs/Checkmate
|
||||||
|
|
||||||
|
APP="Checkmate"
|
||||||
|
var_tags="${var_tags:-monitoring;uptime}"
|
||||||
|
var_cpu="${var_cpu:-2}"
|
||||||
|
var_ram="${var_ram:-4096}"
|
||||||
|
var_disk="${var_disk:-10}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
|
||||||
|
if [[ ! -d /opt/checkmate ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_release "checkmate" "bluewave-labs/Checkmate"; then
|
||||||
|
msg_info "Stopping Services"
|
||||||
|
systemctl stop checkmate-server checkmate-client
|
||||||
|
msg_ok "Stopped Services"
|
||||||
|
|
||||||
|
msg_info "Backing up Data"
|
||||||
|
cp /opt/checkmate/server/.env /opt/checkmate_server.env.bak
|
||||||
|
cp /opt/checkmate/client/.env /opt/checkmate_client.env.bak
|
||||||
|
msg_ok "Backed up Data"
|
||||||
|
|
||||||
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "checkmate" "bluewave-labs/Checkmate"
|
||||||
|
|
||||||
|
msg_info "Updating Checkmate"
|
||||||
|
cd /opt/checkmate/server
|
||||||
|
$STD npm install
|
||||||
|
cd /opt/checkmate/client
|
||||||
|
$STD npm install
|
||||||
|
$STD npm run build
|
||||||
|
msg_ok "Updated Checkmate"
|
||||||
|
|
||||||
|
msg_info "Restoring Data"
|
||||||
|
mv /opt/checkmate_server.env.bak /opt/checkmate/server/.env
|
||||||
|
mv /opt/checkmate_client.env.bak /opt/checkmate/client/.env
|
||||||
|
msg_ok "Restored Data"
|
||||||
|
|
||||||
|
msg_info "Starting Services"
|
||||||
|
systemctl start checkmate-server checkmate-client
|
||||||
|
msg_ok "Started Services"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5173${CL}"
|
||||||
58
ct/clawdbot.sh
Normal file
58
ct/clawdbot.sh
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: michelroegl-brunner
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/clawdbot/clawdbot
|
||||||
|
|
||||||
|
APP="Clawdbot"
|
||||||
|
var_tags="${var_tags:-ai;assistant}"
|
||||||
|
var_cpu="${var_cpu:-2}"
|
||||||
|
var_ram="${var_ram:-2048}"
|
||||||
|
var_disk="${var_disk:-8}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
|
||||||
|
if ! command -v clawdbot >/dev/null 2>&1; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Backing up Data"
|
||||||
|
cp -r /opt/clawdbot/data /opt/clawdbot_data_backup 2>/dev/null || true
|
||||||
|
cp -r /root/.clawdbot /root/.clawdbot_backup 2>/dev/null || true
|
||||||
|
msg_ok "Backed up Data"
|
||||||
|
|
||||||
|
msg_info "Updating Clawdbot"
|
||||||
|
$STD npm install -g clawdbot@latest
|
||||||
|
msg_ok "Updated Clawdbot"
|
||||||
|
|
||||||
|
msg_info "Restoring Data"
|
||||||
|
cp -r /opt/clawdbot_data_backup/. /opt/clawdbot/data 2>/dev/null || true
|
||||||
|
cp -r /root/.clawdbot_backup/. /root/.clawdbot 2>/dev/null || true
|
||||||
|
rm -rf /opt/clawdbot_data_backup /root/.clawdbot_backup
|
||||||
|
msg_ok "Restored Data"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:18791${CL}"
|
||||||
|
|
||||||
@ -1,95 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: MickLesk (CanbiZ)
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/Freika/dawarich
|
|
||||||
|
|
||||||
APP="Dawarich"
|
|
||||||
var_tags="${var_tags:-location;tracking;gps}"
|
|
||||||
var_cpu="${var_cpu:-4}"
|
|
||||||
var_ram="${var_ram:-4096}"
|
|
||||||
var_disk="${var_disk:-15}"
|
|
||||||
var_os="${var_os:-debian}"
|
|
||||||
var_version="${var_version:-13}"
|
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
|
||||||
|
|
||||||
header_info "$APP"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
check_container_storage
|
|
||||||
check_container_resources
|
|
||||||
|
|
||||||
if [[ ! -d /opt/dawarich ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "dawarich" "Freika/dawarich"; then
|
|
||||||
msg_info "Stopping Services"
|
|
||||||
systemctl stop dawarich-web dawarich-worker
|
|
||||||
msg_ok "Stopped Services"
|
|
||||||
|
|
||||||
msg_info "Backing up Data"
|
|
||||||
cp -r /opt/dawarich/app/storage /opt/dawarich_storage_backup 2>/dev/null || true
|
|
||||||
cp /opt/dawarich/app/config/master.key /opt/dawarich_master.key 2>/dev/null || true
|
|
||||||
cp /opt/dawarich/app/config/credentials.yml.enc /opt/dawarich_credentials.yml.enc 2>/dev/null || true
|
|
||||||
msg_ok "Backed up Data"
|
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "dawarich" "Freika/dawarich" "tarball" "latest" "/opt/dawarich/app"
|
|
||||||
|
|
||||||
RUBY_VERSION=$(cat /opt/dawarich/app/.ruby-version 2>/dev/null || echo "3.4.6")
|
|
||||||
RUBY_VERSION=${RUBY_VERSION} RUBY_INSTALL_RAILS="false" setup_ruby
|
|
||||||
|
|
||||||
msg_info "Running Migrations"
|
|
||||||
cd /opt/dawarich/app
|
|
||||||
source /root/.profile
|
|
||||||
export PATH="/root/.rbenv/shims:/root/.rbenv/bin:$PATH"
|
|
||||||
eval "$(/root/.rbenv/bin/rbenv init - bash)"
|
|
||||||
|
|
||||||
set -a && source /opt/dawarich/.env && set +a
|
|
||||||
|
|
||||||
$STD bundle config set --local deployment 'true'
|
|
||||||
$STD bundle config set --local without 'development test'
|
|
||||||
$STD bundle install
|
|
||||||
|
|
||||||
if [[ -f /opt/dawarich/package.json ]]; then
|
|
||||||
cd /opt/dawarich
|
|
||||||
$STD npm install
|
|
||||||
cd /opt/dawarich/app
|
|
||||||
elif [[ -f /opt/dawarich/app/package.json ]]; then
|
|
||||||
$STD npm install
|
|
||||||
fi
|
|
||||||
|
|
||||||
$STD bundle exec rake assets:precompile
|
|
||||||
$STD bundle exec rails db:migrate
|
|
||||||
$STD bundle exec rake data:migrate
|
|
||||||
msg_ok "Ran Migrations"
|
|
||||||
|
|
||||||
msg_info "Restoring Data"
|
|
||||||
cp -r /opt/dawarich_storage_backup/. /opt/dawarich/app/storage/ 2>/dev/null || true
|
|
||||||
cp /opt/dawarich_master.key /opt/dawarich/app/config/master.key 2>/dev/null || true
|
|
||||||
cp /opt/dawarich_credentials.yml.enc /opt/dawarich/app/config/credentials.yml.enc 2>/dev/null || true
|
|
||||||
rm -rf /opt/dawarich_storage_backup /opt/dawarich_master.key /opt/dawarich_credentials.yml.enc
|
|
||||||
msg_ok "Restored Data"
|
|
||||||
|
|
||||||
msg_info "Starting Services"
|
|
||||||
systemctl start dawarich-web dawarich-worker
|
|
||||||
msg_ok "Started Services"
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
fi
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
|
||||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
|
|
||||||
44
ct/ebusd.sh
Normal file
44
ct/ebusd.sh
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: Joerg Heinemann (heinemannj)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/john30/ebusd
|
||||||
|
|
||||||
|
APP="ebusd"
|
||||||
|
var_tags="${var_tags:-automation}"
|
||||||
|
var_cpu="${var_cpu:-1}"
|
||||||
|
var_ram="${var_ram:-512}"
|
||||||
|
var_disk="${var_disk:-2}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
if [[ ! -f /etc/apt/sources.list.d/ebusd.sources ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Updating ebusd"
|
||||||
|
$STD apt update
|
||||||
|
$STD apt upgrade -y ebusd
|
||||||
|
msg_ok "Updated ebusd"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
@ -1,12 +1,11 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
# Author: Simon Friedrich
|
# Author: Simon Friedrich
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
# Source: https://forgejo.org/
|
# Source: https://forgejo.org/
|
||||||
|
|
||||||
APP="Forgejo Runner"
|
APP="Forgejo-Runner"
|
||||||
var_tags="${var_tags:-ci}"
|
var_tags="${var_tags:-ci}"
|
||||||
var_cpu="${var_cpu:-2}"
|
var_cpu="${var_cpu:-2}"
|
||||||
var_ram="${var_ram:-2048}"
|
var_ram="${var_ram:-2048}"
|
||||||
|
|||||||
@ -1,8 +1,7 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVED/refs/heads/freepbx/misc/build.func)
|
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVED/refs/heads/freepbx/misc/build.func)
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
# Author: Arian Nasr (arian-nasr)
|
# Author: Arian Nasr (arian-nasr) | Co-Author: Javier Pastor (vsc55)
|
||||||
# Updated by: Javier Pastor (vsc55)
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
# Source: https://www.freepbx.org/
|
# Source: https://www.freepbx.org/
|
||||||
|
|
||||||
|
|||||||
@ -13,6 +13,7 @@ var_disk="${var_disk:-20}"
|
|||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-12}"
|
var_version="${var_version:-12}"
|
||||||
var_unprivileged="${var_unprivileged:-0}"
|
var_unprivileged="${var_unprivileged:-0}"
|
||||||
|
var_gpu="${var_gpu:-yes}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
variables
|
variables
|
||||||
|
|||||||
55
ct/ghost.sh
Normal file
55
ct/ghost.sh
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: fabrice1236
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://ghost.org/
|
||||||
|
|
||||||
|
APP="Ghost"
|
||||||
|
var_tags="${var_tags:-cms;blog}"
|
||||||
|
var_cpu="${var_cpu:-2}"
|
||||||
|
var_ram="${var_ram:-1024}"
|
||||||
|
var_disk="${var_disk:-5}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
|
||||||
|
setup_mariadb
|
||||||
|
NODE_VERSION="22" setup_nodejs
|
||||||
|
|
||||||
|
msg_info "Updating Ghost"
|
||||||
|
if command -v ghost &>/dev/null; then
|
||||||
|
current_version=$(ghost version | grep 'Ghost-CLI version' | awk '{print $3}')
|
||||||
|
latest_version=$(npm show ghost-cli version)
|
||||||
|
if [ "$current_version" != "$latest_version" ]; then
|
||||||
|
msg_info "Updating ${APP} from version v${current_version} to v${latest_version}"
|
||||||
|
$STD npm install -g ghost-cli@latest
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
else
|
||||||
|
msg_ok "${APP} is already at v${current_version}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
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}:2368${CL}"
|
||||||
@ -1,6 +0,0 @@
|
|||||||
___ __
|
|
||||||
/ | ____ ___ ____ ____ ______/ /_ ___
|
|
||||||
/ /| | / __ `__ \/ __ \/ __ `/ ___/ __ \/ _ \
|
|
||||||
/ ___ |/ / / / / / /_/ / /_/ / /__/ / / / __/
|
|
||||||
/_/ |_/_/ /_/ /_/ .___/\__,_/\___/_/ /_/\___/
|
|
||||||
/_/
|
|
||||||
6
ct/headers/ebusd
Normal file
6
ct/headers/ebusd
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
__ __
|
||||||
|
___ / /_ _ ___________/ /
|
||||||
|
/ _ \/ __ \/ / / / ___/ __ /
|
||||||
|
/ __/ /_/ / /_/ (__ ) /_/ /
|
||||||
|
\___/_.___/\__,_/____/\__,_/
|
||||||
|
|
||||||
@ -1,6 +0,0 @@
|
|||||||
__ __ _ __ __ ____ __
|
|
||||||
/ //_/(_) /______/ /_ ___ ____ / __ \_ __/ /
|
|
||||||
/ ,< / / __/ ___/ __ \/ _ \/ __ \/ / / / | /| / / /
|
|
||||||
/ /| |/ / /_/ /__/ / / / __/ / / / /_/ /| |/ |/ / /
|
|
||||||
/_/ |_/_/\__/\___/_/ /_/\___/_/ /_/\____/ |__/|__/_/
|
|
||||||
|
|
||||||
@ -1,6 +0,0 @@
|
|||||||
__ __
|
|
||||||
_______ _______/ /___ ______ ____ ______/ /____
|
|
||||||
/ ___/ / / / ___/ __/ / / / __ \/ __ `/ ___/ __/ _ \
|
|
||||||
/ / / /_/ (__ ) /_/ /_/ / /_/ / /_/ (__ ) /_/ __/
|
|
||||||
/_/ \__,_/____/\__/\__, / .___/\__,_/____/\__/\___/
|
|
||||||
/____/_/
|
|
||||||
407
ct/immich.sh
Normal file
407
ct/immich.sh
Normal file
@ -0,0 +1,407 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: vhsdream
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://immich.app
|
||||||
|
|
||||||
|
APP="immich"
|
||||||
|
var_tags="${var_tags:-photos}"
|
||||||
|
var_disk="${var_disk:-20}"
|
||||||
|
var_cpu="${var_cpu:-4}"
|
||||||
|
var_ram="${var_ram:-6144}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
var_gpu="${var_gpu:-yes}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
if [[ ! -d /opt/immich ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
if [[ -f /etc/apt/sources.list.d/immich.list ]]; then
|
||||||
|
msg_error "Wrong Debian version detected!"
|
||||||
|
msg_error "You must upgrade your LXC to Debian Trixie before updating."
|
||||||
|
msg_error "Please visit https://github.com/community-scripts/ProxmoxVE/discussions/7726 for details."
|
||||||
|
echo "${TAB3} If you have upgraded your LXC to Trixie and you still see this message, please open an Issue in the Community-Scripts repo."
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
setup_uv
|
||||||
|
PNPM_VERSION="$(curl -fsSL "https://raw.githubusercontent.com/immich-app/immich/refs/heads/main/package.json" | jq -r '.packageManager | split("@")[1]')"
|
||||||
|
NODE_VERSION="24" NODE_MODULE="pnpm@${PNPM_VERSION}" setup_nodejs
|
||||||
|
|
||||||
|
if [[ ! -f /etc/apt/preferences.d/preferences ]]; then
|
||||||
|
msg_info "Adding Debian Testing repo"
|
||||||
|
sed -i 's/ trixie-updates/ trixie-updates testing/g' /etc/apt/sources.list.d/debian.sources
|
||||||
|
cat <<EOF >/etc/apt/preferences.d/preferences
|
||||||
|
Package: *
|
||||||
|
Pin: release a=unstable
|
||||||
|
Pin-Priority: 450
|
||||||
|
|
||||||
|
Package: *
|
||||||
|
Pin:release a=testing
|
||||||
|
Pin-Priority: 450
|
||||||
|
EOF
|
||||||
|
if [[ -f /etc/apt/preferences.d/immich ]]; then
|
||||||
|
rm /etc/apt/preferences.d/immich
|
||||||
|
fi
|
||||||
|
$STD apt update
|
||||||
|
msg_ok "Added Debian Testing repo"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! dpkg -l "libmimalloc3" | grep -q '3.1' || ! dpkg -l "libde265-dev" | grep -q '1.0.16'; then
|
||||||
|
msg_info "Installing/upgrading Testing repo packages"
|
||||||
|
$STD apt install -t testing libmimalloc3 libde265-dev -y
|
||||||
|
msg_ok "Installed/upgraded Testing repo packages"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -f /etc/apt/sources.list.d/mise.list ]]; then
|
||||||
|
msg_info "Installing Mise"
|
||||||
|
curl -fSs https://mise.jdx.dev/gpg-key.pub | tee /etc/apt/keyrings/mise-archive-keyring.pub 1>/dev/null
|
||||||
|
echo "deb [signed-by=/etc/apt/keyrings/mise-archive-keyring.pub arch=amd64] https://mise.jdx.dev/deb stable main" >/etc/apt/sources.list.d/mise.list
|
||||||
|
$STD apt update
|
||||||
|
$STD apt install -y mise
|
||||||
|
msg_ok "Installed Mise"
|
||||||
|
fi
|
||||||
|
|
||||||
|
STAGING_DIR=/opt/staging
|
||||||
|
BASE_DIR=${STAGING_DIR}/base-images
|
||||||
|
SOURCE_DIR=${STAGING_DIR}/image-source
|
||||||
|
cd /tmp
|
||||||
|
if [[ -f ~/.intel_version ]]; then
|
||||||
|
curl -fsSLO https://raw.githubusercontent.com/immich-app/base-images/refs/heads/main/server/Dockerfile
|
||||||
|
readarray -t INTEL_URLS < <(
|
||||||
|
sed -n "/intel-[igc|opencl]/p" ./Dockerfile | awk '{print $2}'
|
||||||
|
sed -n "/libigdgmm12/p" ./Dockerfile | awk '{print $3}'
|
||||||
|
)
|
||||||
|
INTEL_RELEASE="$(grep "intel-opencl-icd_" ./Dockerfile | awk -F '_' '{print $2}')"
|
||||||
|
if [[ "$INTEL_RELEASE" != "$(cat ~/.intel_version)" ]]; then
|
||||||
|
msg_info "Updating Intel iGPU dependencies"
|
||||||
|
for url in "${INTEL_URLS[@]}"; do
|
||||||
|
curl -fsSLO "$url"
|
||||||
|
done
|
||||||
|
$STD apt-mark unhold libigdgmm12
|
||||||
|
$STD apt install -y ./libigdgmm12*.deb
|
||||||
|
rm ./libigdgmm12*.deb
|
||||||
|
$STD apt install -y ./*.deb
|
||||||
|
rm ./*.deb
|
||||||
|
$STD apt-mark hold libigdgmm12
|
||||||
|
dpkg-query -W -f='${Version}\n' intel-opencl-icd >~/.intel_version
|
||||||
|
msg_ok "Intel iGPU dependencies updated"
|
||||||
|
fi
|
||||||
|
rm ./Dockerfile
|
||||||
|
fi
|
||||||
|
if [[ -f ~/.immich_library_revisions ]]; then
|
||||||
|
libraries=("libjxl" "libheif" "libraw" "imagemagick" "libvips")
|
||||||
|
cd "$BASE_DIR"
|
||||||
|
msg_info "Checking for updates to custom image-processing libraries"
|
||||||
|
$STD git pull
|
||||||
|
for library in "${libraries[@]}"; do
|
||||||
|
compile_"$library"
|
||||||
|
done
|
||||||
|
msg_ok "Image-processing libraries up to date"
|
||||||
|
fi
|
||||||
|
|
||||||
|
RELEASE="v2.5.2"
|
||||||
|
if check_for_gh_tag "immich" "immich-app/immich" "${RELEASE}"; then
|
||||||
|
msg_info "Stopping Services"
|
||||||
|
systemctl stop immich-web
|
||||||
|
systemctl stop immich-ml
|
||||||
|
msg_ok "Stopped Services"
|
||||||
|
VCHORD_RELEASE="0.5.3"
|
||||||
|
if [[ ! -f ~/.vchord_version ]] || [[ "$VCHORD_RELEASE" != "$(cat ~/.vchord_version)" ]]; then
|
||||||
|
msg_info "Upgrading VectorChord"
|
||||||
|
curl -fsSL "https://github.com/tensorchord/vectorchord/releases/download/${VCHORD_RELEASE}/postgresql-16-vchord_${VCHORD_RELEASE}-1_amd64.deb" -o vchord.deb
|
||||||
|
$STD apt install -y ./vchord.deb
|
||||||
|
systemctl restart postgresql
|
||||||
|
$STD sudo -u postgres psql -d immich -c "ALTER EXTENSION vector UPDATE;"
|
||||||
|
$STD sudo -u postgres psql -d immich -c "ALTER EXTENSION vchord UPDATE;"
|
||||||
|
$STD sudo -u postgres psql -d immich -c "REINDEX INDEX face_index;"
|
||||||
|
$STD sudo -u postgres psql -d immich -c "REINDEX INDEX clip_index;"
|
||||||
|
echo "$VCHORD_RELEASE" >~/.vchord_version
|
||||||
|
rm ./vchord.deb
|
||||||
|
msg_ok "Upgraded VectorChord to v${VCHORD_RELEASE}"
|
||||||
|
fi
|
||||||
|
if ! dpkg -l | grep -q ccache; then
|
||||||
|
$STD apt install -yqq ccache
|
||||||
|
fi
|
||||||
|
|
||||||
|
INSTALL_DIR="/opt/${APP}"
|
||||||
|
UPLOAD_DIR="$(sed -n '/^IMMICH_MEDIA_LOCATION/s/[^=]*=//p' /opt/immich/.env)"
|
||||||
|
SRC_DIR="${INSTALL_DIR}/source"
|
||||||
|
APP_DIR="${INSTALL_DIR}/app"
|
||||||
|
PLUGIN_DIR="${APP_DIR}/corePlugin"
|
||||||
|
ML_DIR="${APP_DIR}/machine-learning"
|
||||||
|
GEO_DIR="${INSTALL_DIR}/geodata"
|
||||||
|
|
||||||
|
cp "$ML_DIR"/ml_start.sh "$INSTALL_DIR"
|
||||||
|
if grep -qs "set -a" "$APP_DIR"/bin/start.sh; then
|
||||||
|
cp "$APP_DIR"/bin/start.sh "$INSTALL_DIR"
|
||||||
|
else
|
||||||
|
cat <<EOF >"$INSTALL_DIR"/start.sh
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -a
|
||||||
|
. ${INSTALL_DIR}/.env
|
||||||
|
set +a
|
||||||
|
|
||||||
|
/usr/bin/node ${APP_DIR}/dist/main.js "\$@"
|
||||||
|
EOF
|
||||||
|
chmod +x "$INSTALL_DIR"/start.sh
|
||||||
|
fi
|
||||||
|
|
||||||
|
(
|
||||||
|
shopt -s dotglob
|
||||||
|
rm -rf "${APP_DIR:?}"/*
|
||||||
|
)
|
||||||
|
|
||||||
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "immich" "immich-app/immich" "tag" "${RELEASE}" "$SRC_DIR"
|
||||||
|
|
||||||
|
msg_info "Updating Immich web and microservices"
|
||||||
|
cd "$SRC_DIR"/server
|
||||||
|
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
|
||||||
|
export CI=1
|
||||||
|
corepack enable
|
||||||
|
|
||||||
|
# server build
|
||||||
|
export SHARP_IGNORE_GLOBAL_LIBVIPS=true
|
||||||
|
$STD pnpm --filter immich --frozen-lockfile build
|
||||||
|
unset SHARP_IGNORE_GLOBAL_LIBVIPS
|
||||||
|
export SHARP_FORCE_GLOBAL_LIBVIPS=true
|
||||||
|
$STD pnpm --filter immich --frozen-lockfile --prod --no-optional deploy "$APP_DIR"
|
||||||
|
cp "$APP_DIR"/package.json "$APP_DIR"/bin
|
||||||
|
sed -i 's|^start|./start|' "$APP_DIR"/bin/immich-admin
|
||||||
|
|
||||||
|
# openapi & web build
|
||||||
|
cd "$SRC_DIR"
|
||||||
|
echo "packageImportMethod: hardlink" >>./pnpm-workspace.yaml
|
||||||
|
$STD pnpm --filter @immich/sdk --filter immich-web --frozen-lockfile --force install
|
||||||
|
unset SHARP_FORCE_GLOBAL_LIBVIPS
|
||||||
|
export SHARP_IGNORE_GLOBAL_LIBVIPS=true
|
||||||
|
$STD pnpm --filter @immich/sdk --filter immich-web build
|
||||||
|
cp -a web/build "$APP_DIR"/www
|
||||||
|
cp LICENSE "$APP_DIR"
|
||||||
|
|
||||||
|
# cli build
|
||||||
|
$STD pnpm --filter @immich/sdk --filter @immich/cli --frozen-lockfile install
|
||||||
|
$STD pnpm --filter @immich/sdk --filter @immich/cli build
|
||||||
|
$STD pnpm --filter @immich/cli --prod --no-optional deploy "$APP_DIR"/cli
|
||||||
|
cd "$APP_DIR"
|
||||||
|
mv "$INSTALL_DIR"/start.sh "$APP_DIR"/bin
|
||||||
|
|
||||||
|
# plugins
|
||||||
|
cd "$SRC_DIR"
|
||||||
|
$STD mise trust --ignore ./mise.toml
|
||||||
|
$STD mise trust ./plugins/mise.toml
|
||||||
|
cd plugins
|
||||||
|
$STD mise install
|
||||||
|
$STD mise run build
|
||||||
|
mkdir -p "$PLUGIN_DIR"
|
||||||
|
cp -r ./dist "$PLUGIN_DIR"/dist
|
||||||
|
cp ./manifest.json "$PLUGIN_DIR"
|
||||||
|
msg_ok "Updated Immich server, web, cli and plugins"
|
||||||
|
|
||||||
|
cd "$SRC_DIR"/machine-learning
|
||||||
|
mkdir -p "$ML_DIR" && chown -R immich:immich "$ML_DIR"
|
||||||
|
chown immich:immich ./uv.lock
|
||||||
|
export VIRTUAL_ENV="${ML_DIR}"/ml-venv
|
||||||
|
if [[ -f ~/.openvino ]]; then
|
||||||
|
msg_info "Updating HW-accelerated machine-learning"
|
||||||
|
# Remove old venv if Python version changed (3.12 -> 3.13)
|
||||||
|
if [[ -d "${VIRTUAL_ENV}" ]] && ! "${VIRTUAL_ENV}/bin/python3" --version 2>/dev/null | grep -q "3.13"; then
|
||||||
|
rm -rf "${VIRTUAL_ENV}"
|
||||||
|
fi
|
||||||
|
$STD sudo --preserve-env=VIRTUAL_ENV -nu immich uv sync --extra openvino --no-dev --active --link-mode copy -n -p python3.13 --managed-python
|
||||||
|
patchelf --clear-execstack "${VIRTUAL_ENV}/lib/python3.13/site-packages/onnxruntime/capi/onnxruntime_pybind11_state.cpython-313-x86_64-linux-gnu.so"
|
||||||
|
# Add workaround for onnxruntime-openvino 1.23.x crash if not present
|
||||||
|
if ! grep -q "MACHINE_LEARNING_OPENVINO_NUM_THREADS" "$INSTALL_DIR/.env" 2>/dev/null; then
|
||||||
|
sed -i '/MACHINE_LEARNING_CACHE_FOLDER/a ## - For OpenVINO only - workaround for onnxruntime-openvino 1.23.x crash\n## - See: https://github.com/immich-app/immich/pull/11240\nMACHINE_LEARNING_OPENVINO_NUM_THREADS=$(nproc)' "$INSTALL_DIR/.env"
|
||||||
|
fi
|
||||||
|
msg_ok "Updated HW-accelerated machine-learning"
|
||||||
|
else
|
||||||
|
msg_info "Updating machine-learning"
|
||||||
|
$STD sudo --preserve-env=VIRTUAL_ENV -nu immich uv sync --extra cpu --no-dev --active --link-mode copy -n -p python3.11 --managed-python
|
||||||
|
msg_ok "Updated machine-learning"
|
||||||
|
fi
|
||||||
|
cd "$SRC_DIR"
|
||||||
|
cp -a machine-learning/{ann,immich_ml} "$ML_DIR"
|
||||||
|
mv "$INSTALL_DIR"/ml_start.sh "$ML_DIR"
|
||||||
|
if [[ -f ~/.openvino ]]; then
|
||||||
|
sed -i "/intra_op/s/int = 0/int = os.cpu_count() or 0/" "$ML_DIR"/immich_ml/config.py
|
||||||
|
fi
|
||||||
|
ln -sf "$APP_DIR"/resources "$INSTALL_DIR"
|
||||||
|
cd "$APP_DIR"
|
||||||
|
grep -rl /usr/src | xargs -n1 sed -i "s|\/usr/src|$INSTALL_DIR|g"
|
||||||
|
grep -rlE "'/build'" | xargs -n1 sed -i "s|'/build'|'$APP_DIR'|g"
|
||||||
|
sed -i "s@\"/cache\"@\"$INSTALL_DIR/cache\"@g" "$ML_DIR"/immich_ml/config.py
|
||||||
|
ln -s "${UPLOAD_DIR:-/opt/immich/upload}" "$APP_DIR"/upload
|
||||||
|
ln -s "${UPLOAD_DIR:-/opt/immich/upload}" "$ML_DIR"/upload
|
||||||
|
ln -s "$GEO_DIR" "$APP_DIR"
|
||||||
|
|
||||||
|
chown -R immich:immich "$INSTALL_DIR"
|
||||||
|
systemctl restart immich-ml immich-web
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function compile_libjxl() {
|
||||||
|
SOURCE=${SOURCE_DIR}/libjxl
|
||||||
|
JPEGLI_LIBJPEG_LIBRARY_SOVERSION="62"
|
||||||
|
JPEGLI_LIBJPEG_LIBRARY_VERSION="62.3.0"
|
||||||
|
: "${LIBJXL_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libjxl.json)}"
|
||||||
|
if [[ "$LIBJXL_REVISION" != "$(grep 'libjxl' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
|
||||||
|
msg_info "Recompiling libjxl"
|
||||||
|
if [[ -d "$SOURCE" ]]; then rm -rf "$SOURCE"; fi
|
||||||
|
$STD git clone https://github.com/libjxl/libjxl.git "$SOURCE"
|
||||||
|
cd "$SOURCE"
|
||||||
|
$STD git reset --hard "$LIBJXL_REVISION"
|
||||||
|
$STD git submodule update --init --recursive --depth 1 --recommend-shallow
|
||||||
|
$STD git apply "$BASE_DIR"/server/sources/libjxl-patches/jpegli-empty-dht-marker.patch
|
||||||
|
$STD git apply "$BASE_DIR"/server/sources/libjxl-patches/jpegli-icc-warning.patch
|
||||||
|
mkdir build
|
||||||
|
cd build
|
||||||
|
$STD cmake \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DBUILD_TESTING=OFF \
|
||||||
|
-DJPEGXL_ENABLE_DOXYGEN=OFF \
|
||||||
|
-DJPEGXL_ENABLE_MANPAGES=OFF \
|
||||||
|
-DJPEGXL_ENABLE_PLUGIN_GIMP210=OFF \
|
||||||
|
-DJPEGXL_ENABLE_BENCHMARK=OFF \
|
||||||
|
-DJPEGXL_ENABLE_EXAMPLES=OFF \
|
||||||
|
-DJPEGXL_FORCE_SYSTEM_BROTLI=ON \
|
||||||
|
-DJPEGXL_FORCE_SYSTEM_HWY=ON \
|
||||||
|
-DJPEGXL_ENABLE_JPEGLI=ON \
|
||||||
|
-DJPEGXL_ENABLE_JPEGLI_LIBJPEG=ON \
|
||||||
|
-DJPEGXL_INSTALL_JPEGLI_LIBJPEG=ON \
|
||||||
|
-DJPEGXL_ENABLE_PLUGINS=ON \
|
||||||
|
-DJPEGLI_LIBJPEG_LIBRARY_SOVERSION="$JPEGLI_LIBJPEG_LIBRARY_SOVERSION" \
|
||||||
|
-DJPEGLI_LIBJPEG_LIBRARY_VERSION="$JPEGLI_LIBJPEG_LIBRARY_VERSION" \
|
||||||
|
-DLIBJPEG_TURBO_VERSION_NUMBER=2001005 \
|
||||||
|
..
|
||||||
|
$STD cmake --build . -- -j"$(nproc)"
|
||||||
|
$STD cmake --install .
|
||||||
|
ldconfig /usr/local/lib
|
||||||
|
$STD make clean
|
||||||
|
cd "$STAGING_DIR"
|
||||||
|
rm -rf "$SOURCE"/{build,third_party}
|
||||||
|
sed -i "s/libjxl: .*$/libjxl: $LIBJXL_REVISION/" ~/.immich_library_revisions
|
||||||
|
msg_ok "Recompiled libjxl"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function compile_libheif() {
|
||||||
|
SOURCE=${SOURCE_DIR}/libheif
|
||||||
|
if ! dpkg -l | grep -q libaom; then
|
||||||
|
$STD apt install -y libaom-dev
|
||||||
|
local update="required"
|
||||||
|
fi
|
||||||
|
: "${LIBHEIF_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libheif.json)}"
|
||||||
|
if [[ "${update:-}" ]] || [[ "$LIBHEIF_REVISION" != "$(grep 'libheif' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
|
||||||
|
msg_info "Recompiling libheif"
|
||||||
|
if [[ -d "$SOURCE" ]]; then rm -rf "$SOURCE"; fi
|
||||||
|
$STD git clone https://github.com/strukturag/libheif.git "$SOURCE"
|
||||||
|
cd "$SOURCE"
|
||||||
|
$STD git reset --hard "$LIBHEIF_REVISION"
|
||||||
|
mkdir build
|
||||||
|
cd build
|
||||||
|
$STD cmake --preset=release-noplugins \
|
||||||
|
-DWITH_DAV1D=ON \
|
||||||
|
-DENABLE_PARALLEL_TILE_DECODING=ON \
|
||||||
|
-DWITH_LIBSHARPYUV=ON \
|
||||||
|
-DWITH_LIBDE265=ON \
|
||||||
|
-DWITH_AOM_DECODER=OFF \
|
||||||
|
-DWITH_AOM_ENCODER=ON \
|
||||||
|
-DWITH_X265=OFF \
|
||||||
|
-DWITH_EXAMPLES=OFF \
|
||||||
|
..
|
||||||
|
$STD make install -j "$(nproc)"
|
||||||
|
ldconfig /usr/local/lib
|
||||||
|
$STD make clean
|
||||||
|
cd "$STAGING_DIR"
|
||||||
|
rm -rf "$SOURCE"/build
|
||||||
|
sed -i "s/libheif: .*$/libheif: $LIBHEIF_REVISION/" ~/.immich_library_revisions
|
||||||
|
msg_ok "Recompiled libheif"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function compile_libraw() {
|
||||||
|
SOURCE=${SOURCE_DIR}/libraw
|
||||||
|
: "${LIBRAW_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libraw.json)}"
|
||||||
|
if [[ "$LIBRAW_REVISION" != "$(grep 'libraw' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
|
||||||
|
msg_info "Recompiling libraw"
|
||||||
|
if [[ -d "$SOURCE" ]]; then rm -rf "$SOURCE"; fi
|
||||||
|
$STD git clone https://github.com/libraw/libraw.git "$SOURCE"
|
||||||
|
cd "$SOURCE"
|
||||||
|
$STD git reset --hard "$LIBRAW_REVISION"
|
||||||
|
$STD autoreconf --install
|
||||||
|
$STD ./configure --disable-examples
|
||||||
|
$STD make -j"$(nproc)"
|
||||||
|
$STD make install
|
||||||
|
ldconfig /usr/local/lib
|
||||||
|
$STD make clean
|
||||||
|
cd "$STAGING_DIR"
|
||||||
|
sed -i "s/libraw: .*$/libraw: $LIBRAW_REVISION/" ~/.immich_library_revisions
|
||||||
|
msg_ok "Recompiled libraw"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function compile_imagemagick() {
|
||||||
|
SOURCE=$SOURCE_DIR/imagemagick
|
||||||
|
: "${IMAGEMAGICK_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/imagemagick.json)}"
|
||||||
|
if [[ "$IMAGEMAGICK_REVISION" != "$(grep 'imagemagick' ~/.immich_library_revisions | awk '{print $2}')" ]] ||
|
||||||
|
! grep -q 'DMAGICK_LIBRAW' /usr/local/lib/ImageMagick-7*/config-Q16HDRI/configure.xml; then
|
||||||
|
msg_info "Recompiling ImageMagick"
|
||||||
|
if [[ -d "$SOURCE" ]]; then rm -rf "$SOURCE"; fi
|
||||||
|
$STD git clone https://github.com/ImageMagick/ImageMagick.git "$SOURCE"
|
||||||
|
cd "$SOURCE"
|
||||||
|
$STD git reset --hard "$IMAGEMAGICK_REVISION"
|
||||||
|
$STD ./configure --with-modules CPPFLAGS="-DMAGICK_LIBRAW_VERSION_TAIL=202502"
|
||||||
|
$STD make -j"$(nproc)"
|
||||||
|
$STD make install
|
||||||
|
ldconfig /usr/local/lib
|
||||||
|
$STD make clean
|
||||||
|
cd "$STAGING_DIR"
|
||||||
|
sed -i "s/imagemagick: .*$/imagemagick: $IMAGEMAGICK_REVISION/" ~/.immich_library_revisions
|
||||||
|
msg_ok "Recompiled ImageMagick"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function compile_libvips() {
|
||||||
|
SOURCE=$SOURCE_DIR/libvips
|
||||||
|
: "${LIBVIPS_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libvips.json)}"
|
||||||
|
if [[ "$LIBVIPS_REVISION" != "$(grep 'libvips' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
|
||||||
|
msg_info "Recompiling libvips"
|
||||||
|
if [[ -d "$SOURCE" ]]; then rm -rf "$SOURCE"; fi
|
||||||
|
$STD git clone https://github.com/libvips/libvips.git "$SOURCE"
|
||||||
|
cd "$SOURCE"
|
||||||
|
$STD git reset --hard "$LIBVIPS_REVISION"
|
||||||
|
$STD meson setup build --buildtype=release --libdir=lib -Dintrospection=disabled -Dtiff=disabled
|
||||||
|
cd build
|
||||||
|
$STD ninja install
|
||||||
|
ldconfig /usr/local/lib
|
||||||
|
cd "$STAGING_DIR"
|
||||||
|
rm -rf "$SOURCE"/build
|
||||||
|
sed -i "s/libvips: .*$/libvips: $LIBVIPS_REVISION/" ~/.immich_library_revisions
|
||||||
|
msg_ok "Recompiled libvips"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
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}:2283${CL}"
|
||||||
74
ct/isponsorblocktv.sh
Normal file
74
ct/isponsorblocktv.sh
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: Matthew Stern (sternma)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/dmunozv04/iSponsorBlockTV
|
||||||
|
|
||||||
|
APP="iSponsorBlockTV"
|
||||||
|
var_tags="${var_tags:-media;automation}"
|
||||||
|
var_cpu="${var_cpu:-1}"
|
||||||
|
var_ram="${var_ram:-1024}"
|
||||||
|
var_disk="${var_disk:-4}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
|
||||||
|
if [[ ! -d /opt/isponsorblocktv ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_release "isponsorblocktv" "dmunozv04/iSponsorBlockTV"; then
|
||||||
|
msg_info "Stopping Service"
|
||||||
|
systemctl stop isponsorblocktv
|
||||||
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
|
if [[ -d /var/lib/isponsorblocktv ]]; then
|
||||||
|
msg_info "Backing up Data"
|
||||||
|
cp -r /var/lib/isponsorblocktv /var/lib/isponsorblocktv_data_backup
|
||||||
|
msg_ok "Backed up Data"
|
||||||
|
fi
|
||||||
|
|
||||||
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "isponsorblocktv" "dmunozv04/iSponsorBlockTV"
|
||||||
|
|
||||||
|
msg_info "Setting up iSponsorBlockTV"
|
||||||
|
$STD python3 -m venv /opt/isponsorblocktv/venv
|
||||||
|
$STD /opt/isponsorblocktv/venv/bin/pip install --upgrade pip
|
||||||
|
$STD /opt/isponsorblocktv/venv/bin/pip install /opt/isponsorblocktv
|
||||||
|
msg_ok "Set up iSponsorBlockTV"
|
||||||
|
|
||||||
|
if [[ -d /var/lib/isponsorblocktv_data_backup ]]; then
|
||||||
|
msg_info "Restoring Data"
|
||||||
|
rm -rf /var/lib/isponsorblocktv
|
||||||
|
cp -r /var/lib/isponsorblocktv_data_backup /var/lib/isponsorblocktv
|
||||||
|
rm -rf /var/lib/isponsorblocktv_data_backup
|
||||||
|
msg_ok "Restored Data"
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Starting Service"
|
||||||
|
systemctl start isponsorblocktv
|
||||||
|
msg_ok "Started Service"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Run the setup wizard inside the container with:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}iSponsorBlockTV setup${CL}"
|
||||||
@ -1,78 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
|
||||||
# Copyright (c) 2021-2025 community-scripts ORG
|
|
||||||
# Author: snazzybean
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/TomBursch/kitchenowl
|
|
||||||
|
|
||||||
APP="KitchenOwl"
|
|
||||||
var_tags="${var_tags:-food;recipes}"
|
|
||||||
var_cpu="${var_cpu:-1}"
|
|
||||||
var_ram="${var_ram:-2048}"
|
|
||||||
var_disk="${var_disk:-6}"
|
|
||||||
var_os="${var_os:-debian}"
|
|
||||||
var_version="${var_version:-13}"
|
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
|
||||||
|
|
||||||
header_info "$APP"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
check_container_storage
|
|
||||||
check_container_resources
|
|
||||||
|
|
||||||
if [[ ! -d /opt/kitchenowl ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "kitchenowl" "TomBursch/kitchenowl"; then
|
|
||||||
msg_info "Stopping Service"
|
|
||||||
systemctl stop kitchenowl
|
|
||||||
msg_ok "Stopped Service"
|
|
||||||
|
|
||||||
msg_info "Backing up KitchenOwl"
|
|
||||||
mkdir -p /opt/kitchenowl_backup
|
|
||||||
cp -r /opt/kitchenowl/data /opt/kitchenowl_backup/
|
|
||||||
cp -f /opt/kitchenowl/kitchenowl.env /opt/kitchenowl_backup/
|
|
||||||
msg_ok "Backed up KitchenOwl"
|
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "kitchenowl" "TomBursch/kitchenowl" "tarball" "latest" "/opt/kitchenowl"
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "kitchenowl-web" "TomBursch/kitchenowl" "prebuild" "latest" "/opt/kitchenowl/web" "kitchenowl_Web.tar.gz"
|
|
||||||
|
|
||||||
msg_info "Restoring KitchenOwl data"
|
|
||||||
sed -i 's/default=True/default=False/' /opt/kitchenowl/backend/wsgi.py
|
|
||||||
cp -r /opt/kitchenowl_backup/data /opt/kitchenowl/
|
|
||||||
cp -f /opt/kitchenowl_backup/kitchenowl.env /opt/kitchenowl/
|
|
||||||
rm -rf /opt/kitchenowl_backup
|
|
||||||
msg_ok "Restored KitchenOwl data"
|
|
||||||
|
|
||||||
msg_info "Updating KitchenOwl"
|
|
||||||
cd /opt/kitchenowl/backend
|
|
||||||
$STD uv sync --frozen
|
|
||||||
cd /opt/kitchenowl/backend
|
|
||||||
set -a
|
|
||||||
source /opt/kitchenowl/kitchenowl.env
|
|
||||||
set +a
|
|
||||||
$STD uv run flask db upgrade
|
|
||||||
msg_ok "Updated KitchenOwl"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
|
||||||
systemctl start kitchenowl
|
|
||||||
msg_ok "Started Service"
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
fi
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
|
||||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:80${CL}"
|
|
||||||
@ -1,67 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: Slaviša Arežina (tremor021)
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
|
||||||
# Source: https://languagetool.org/
|
|
||||||
|
|
||||||
APP="LanguageTool"
|
|
||||||
var_tags="${var_tags:-spellcheck}"
|
|
||||||
var_cpu="${var_cpu:-2}"
|
|
||||||
var_ram="${var_ram:-4096}"
|
|
||||||
var_disk="${var_disk:-8}"
|
|
||||||
var_os="${var_os:-debian}"
|
|
||||||
var_version="${var_version:-13}"
|
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
|
||||||
|
|
||||||
header_info "$APP"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
check_container_storage
|
|
||||||
check_container_resources
|
|
||||||
if [[ ! -d /opt/LanguageTool ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
RELEASE=$(curl -fsSL https://languagetool.org/download/ | grep -oP 'LanguageTool-\K[0-9]+\.[0-9]+(\.[0-9]+)?(?=\.zip)' | sort -V | tail -n1)
|
|
||||||
if [[ "${RELEASE}" != "$(cat ~/.languagetool 2>/dev/null)" ]] || [[ ! -f ~/.languagetool ]]; then
|
|
||||||
msg_info "Stopping LanguageTool"
|
|
||||||
systemctl stop language-tool
|
|
||||||
msg_ok "Stopped LanguageTool"
|
|
||||||
|
|
||||||
msg_info "Creating Backup"
|
|
||||||
cp /opt/LanguageTool/server.properties /opt/server.properties
|
|
||||||
msg_ok "Backup Created"
|
|
||||||
|
|
||||||
msg_info "Updating LanguageTool"
|
|
||||||
rm -rf /opt/LanguageTool
|
|
||||||
download_file "https://languagetool.org/download/LanguageTool-stable.zip" /tmp/LanguageTool-stable.zip
|
|
||||||
unzip -q /tmp/LanguageTool-stable.zip -d /opt
|
|
||||||
mv /opt/LanguageTool-*/ /opt/LanguageTool/
|
|
||||||
mv /opt/server.properties /opt/LanguageTool/server.properties
|
|
||||||
echo "${RELEASE}" >~/.languagetool
|
|
||||||
msg_ok "Updated LanguageTool"
|
|
||||||
|
|
||||||
msg_info "Starting LanguageTool"
|
|
||||||
systemctl start language-tool
|
|
||||||
msg_ok "Started LanguageTool"
|
|
||||||
msg_ok "Updated successfuly!"
|
|
||||||
else
|
|
||||||
msg_ok "No update required. ${APP} is already at v${RELEASE}"
|
|
||||||
fi
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed successfully!"
|
|
||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
|
||||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8081/v2${CL}"
|
|
||||||
@ -1,59 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: luismco
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/technomancer702/nodecast-tv
|
|
||||||
|
|
||||||
APP="nodecast-tv"
|
|
||||||
var_tags="${var_tags:-media}"
|
|
||||||
var_cpu="${var_cpu:-2}"
|
|
||||||
var_ram="${var_ram:-2048}"
|
|
||||||
var_disk="${var_disk:-4}"
|
|
||||||
var_os="${var_os:-debian}"
|
|
||||||
var_version="${var_version:-13}"
|
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
|
||||||
|
|
||||||
header_info "$APP"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
check_container_storage
|
|
||||||
check_container_resources
|
|
||||||
if [[ ! -d /opt/nodecast-tv ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "nodecast-tv" "technomancer702/nodecast-tv"; then
|
|
||||||
msg_info "Stopping Service"
|
|
||||||
systemctl stop nodecast-tv
|
|
||||||
msg_ok "Stopped Service"
|
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "nodecast-tv" "technomancer702/nodecast-tv"
|
|
||||||
|
|
||||||
msg_info "Updating Modules"
|
|
||||||
cd /opt/nodecast-tv
|
|
||||||
$STD npm install
|
|
||||||
msg_ok "Updated Modules"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
|
||||||
systemctl start nodecast-tv
|
|
||||||
msg_ok "Started Service"
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
fi
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed successfully!\n"
|
|
||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
|
||||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
|
|
||||||
|
|
||||||
@ -29,7 +29,7 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
RELEASE="v4.1.0"
|
RELEASE="v5.0.1"
|
||||||
if check_for_gh_release "opencloud" "opencloud-eu/opencloud" "${RELEASE}"; then
|
if check_for_gh_release "opencloud" "opencloud-eu/opencloud" "${RELEASE}"; then
|
||||||
msg_info "Stopping services"
|
msg_info "Stopping services"
|
||||||
systemctl stop opencloud opencloud-wopi
|
systemctl stop opencloud opencloud-wopi
|
||||||
|
|||||||
@ -1,69 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: GoldenSpringness
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/orhun/rustypaste
|
|
||||||
|
|
||||||
APP="rustypaste"
|
|
||||||
var_tags="${var_tags:-pastebin;storage}"
|
|
||||||
var_cpu="${var_cpu:-1}"
|
|
||||||
var_ram="${var_ram:-1024}"
|
|
||||||
var_disk="${var_disk:-20}"
|
|
||||||
var_os="${var_os:-debian}"
|
|
||||||
var_version="${var_version:-13}"
|
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
|
||||||
|
|
||||||
header_info "$APP"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
check_container_storage
|
|
||||||
check_container_resources
|
|
||||||
|
|
||||||
if [[ ! -f /opt/rustypaste/rustypaste ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "rustypaste" "orhun/rustypaste"; then
|
|
||||||
msg_info "Stopping Services"
|
|
||||||
systemctl stop rustypaste
|
|
||||||
msg_ok "Stopped Services"
|
|
||||||
|
|
||||||
msg_info "Creating Backup"
|
|
||||||
tar -czf "/opt/rustypaste_backup_$(date +%F).tar.gz" /opt/rustypaste/upload 2>/dev/null || true
|
|
||||||
cp /opt/rustypaste/config.toml /tmp/rustypaste_config.toml.bak
|
|
||||||
msg_ok "Backup Created"
|
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "rustypaste" "orhun/rustypaste" "prebuild" "latest" "/opt/rustypaste" "*x86_64-unknown-linux-gnu.tar.gz"
|
|
||||||
|
|
||||||
msg_info "Restoring Data"
|
|
||||||
mv /tmp/rustypaste_config.toml.bak /opt/rustypaste/config.toml
|
|
||||||
tar -xzf "/opt/rustypaste_backup_$(date +%F).tar.gz" -C /opt/rustypaste/upload 2>/dev/null || true
|
|
||||||
rm -rf /opt/rustypaste_backup_$(date +%F).tar.gz
|
|
||||||
msg_ok "Restored Data"
|
|
||||||
|
|
||||||
msg_info "Starting Services"
|
|
||||||
systemctl start rustypaste
|
|
||||||
msg_ok "Started Services"
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "rustypaste-cli" "orhun/rustypaste-cli"; then
|
|
||||||
fetch_and_deploy_gh_release "rustypaste-cli" "orhun/rustypaste-cli" "prebuild" "latest" "/usr/local/bin" "*x86_64-unknown-linux-gnu.tar.gz"
|
|
||||||
fi
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed successfully!\n"
|
|
||||||
echo -e "${CREATING}${GN}rustypaste setup has been successfully initialized!${CL}"
|
|
||||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8000${CL}"
|
|
||||||
@ -1,69 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: vhsdream
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/calibrain/shelfmark
|
|
||||||
|
|
||||||
APP="shelfmark"
|
|
||||||
var_tags="${var_tags:-ebooks}"
|
|
||||||
var_cpu="${var_cpu:-2}"
|
|
||||||
var_ram="${var_ram:-2048}"
|
|
||||||
var_disk="${var_disk:-8}"
|
|
||||||
var_os="${var_os:-debian}"
|
|
||||||
var_version="${var_version:-13}"
|
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
|
||||||
|
|
||||||
header_info "$APP"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
check_container_storage
|
|
||||||
check_container_resources
|
|
||||||
|
|
||||||
if [[ ! -d /opt/shelfmark ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
NODE_VERSION="22" setup_nodejs
|
|
||||||
PYTHON_VERSION="3.12" setup_uv
|
|
||||||
|
|
||||||
if check_for_gh_release "shelfmark" "calibrain/shelfmark"; then
|
|
||||||
msg_info "Stopping Service"
|
|
||||||
systemctl stop shelfmark
|
|
||||||
msg_ok "Stopped Service"
|
|
||||||
|
|
||||||
cp /opt/shelfmark/start.sh /opt/start.sh.bak
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "shelfmark" "calibrain/shelfmark" "tarball" "latest" "/opt/shelfmark"
|
|
||||||
|
|
||||||
msg_info "Updating Shelfmark"
|
|
||||||
cd /opt/shelfmark/src/frontend
|
|
||||||
$STD npm ci
|
|
||||||
$STD npm run build
|
|
||||||
mv /opt/shelfmark/src/frontend/dist /opt/shelfmark/frontend-dist
|
|
||||||
cd /opt/shelfmark
|
|
||||||
$STD uv venv -c ./venv
|
|
||||||
$STD uv pip install -r requirements-base.txt
|
|
||||||
mv /opt/start.sh.bak /opt/start.sh
|
|
||||||
msg_ok "Updated Shelfmark"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
|
||||||
systemctl start shelfmark
|
|
||||||
msg_ok "Started Service"
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
fi
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed successfully!\n"
|
|
||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
|
||||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8084${CL}"
|
|
||||||
63
ct/sonobarr.sh
Normal file
63
ct/sonobarr.sh
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: GoldenSpringness
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/Dodelidoo-Labs/sonobarr
|
||||||
|
|
||||||
|
APP="sonobarr"
|
||||||
|
var_tags="${var_tags:-storage}"
|
||||||
|
var_cpu="${var_cpu:-1}"
|
||||||
|
var_ram="${var_ram:-1024}"
|
||||||
|
var_disk="${var_disk:-20}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
|
||||||
|
if [[ ! -d "/opt/sonobarr" ]]; then
|
||||||
|
msg_error "No sonobarr Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
PYTHON_VERSION="3.12" setup_uv
|
||||||
|
|
||||||
|
if check_for_gh_release "sonobarr" "Dodelidoo-Labs/sonobarr"; then
|
||||||
|
msg_info "Stopping Service"
|
||||||
|
systemctl stop sonobarr
|
||||||
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "sonobarr" "Dodelidoo-Labs/sonobarr" "tarball"
|
||||||
|
|
||||||
|
msg_info "Updating sonobarr"
|
||||||
|
$STD uv venv -c /opt/sonobarr/venv
|
||||||
|
$STD source /opt/sonobarr/venv/bin/activate
|
||||||
|
$STD uv pip install --no-cache-dir -r /opt/sonobarr/requirements.txt
|
||||||
|
sed -i "/release_version/s/=.*/=$(cat ~/.sonobarr)/" /etc/sonobarr/.env
|
||||||
|
msg_ok "Updated sonobarr"
|
||||||
|
|
||||||
|
msg_info "Starting Service"
|
||||||
|
systemctl start sonobarr
|
||||||
|
msg_ok "Started Service"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}sonobarr setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5000${CL}"
|
||||||
115
ct/vaultwarden.sh
Normal file
115
ct/vaultwarden.sh
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/dani-garcia/vaultwarden
|
||||||
|
|
||||||
|
APP="Vaultwarden"
|
||||||
|
var_tags="${var_tags:-password-manager}"
|
||||||
|
var_cpu="${var_cpu:-4}"
|
||||||
|
var_ram="${var_ram:-6144}"
|
||||||
|
var_disk="${var_disk:-20}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
if [[ ! -f /etc/systemd/system/vaultwarden.service ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
VAULT=$(get_latest_github_release "dani-garcia/vaultwarden")
|
||||||
|
WVRELEASE=$(get_latest_github_release "dani-garcia/bw_web_builds")
|
||||||
|
|
||||||
|
UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 3 \
|
||||||
|
"1" "VaultWarden $VAULT" ON \
|
||||||
|
"2" "Web-Vault $WVRELEASE" OFF \
|
||||||
|
"3" "Set Admin Token" OFF \
|
||||||
|
3>&1 1>&2 2>&3)
|
||||||
|
|
||||||
|
if [ "$UPD" == "1" ]; then
|
||||||
|
if check_for_gh_release "vaultwarden" "dani-garcia/vaultwarden"; then
|
||||||
|
msg_info "Stopping Service"
|
||||||
|
systemctl stop vaultwarden
|
||||||
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "vaultwarden" "dani-garcia/vaultwarden" "tarball" "latest" "/tmp/vaultwarden-src"
|
||||||
|
|
||||||
|
msg_info "Updating VaultWarden to $VAULT (Patience)"
|
||||||
|
cd /tmp/vaultwarden-src
|
||||||
|
$STD cargo build --features "sqlite,mysql,postgresql" --release
|
||||||
|
if [[ -f /usr/bin/vaultwarden ]]; then
|
||||||
|
cp target/release/vaultwarden /usr/bin/
|
||||||
|
else
|
||||||
|
cp target/release/vaultwarden /opt/vaultwarden/bin/
|
||||||
|
fi
|
||||||
|
cd ~ && rm -rf /tmp/vaultwarden-src
|
||||||
|
msg_ok "Updated VaultWarden to ${VAULT}"
|
||||||
|
|
||||||
|
msg_info "Starting Service"
|
||||||
|
systemctl start vaultwarden
|
||||||
|
msg_ok "Started Service"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
else
|
||||||
|
msg_ok "VaultWarden is already up-to-date"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$UPD" == "2" ]; then
|
||||||
|
if check_for_gh_release "vaultwarden_webvault" "dani-garcia/bw_web_builds"; then
|
||||||
|
msg_info "Stopping Service"
|
||||||
|
systemctl stop vaultwarden
|
||||||
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "vaultwarden_webvault" "dani-garcia/bw_web_builds" "prebuild" "latest" "/opt/vaultwarden" "bw_web_*.tar.gz"
|
||||||
|
|
||||||
|
msg_info "Updating Web-Vault to $WVRELEASE"
|
||||||
|
rm -rf /opt/vaultwarden/web-vault
|
||||||
|
chown -R root:root /opt/vaultwarden/web-vault/
|
||||||
|
msg_ok "Updated Web-Vault to ${WVRELEASE}"
|
||||||
|
|
||||||
|
msg_info "Starting Service"
|
||||||
|
systemctl start vaultwarden
|
||||||
|
msg_ok "Started Service"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
else
|
||||||
|
msg_ok "Web-Vault is already up-to-date"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$UPD" == "3" ]; then
|
||||||
|
if NEWTOKEN=$(whiptail --backtitle "Proxmox VE Helper Scripts" --passwordbox "Set the ADMIN_TOKEN" 10 58 3>&1 1>&2 2>&3); then
|
||||||
|
if [[ -z "$NEWTOKEN" ]]; then exit; fi
|
||||||
|
ensure_dependencies argon2
|
||||||
|
TOKEN=$(echo -n "${NEWTOKEN}" | argon2 "$(openssl rand -base64 32)" -t 2 -m 16 -p 4 -l 64 -e)
|
||||||
|
sed -i "s|ADMIN_TOKEN=.*|ADMIN_TOKEN='${TOKEN}'|" /opt/vaultwarden/.env
|
||||||
|
if [[ -f /opt/vaultwarden/data/config.json ]]; then
|
||||||
|
sed -i "s|\"admin_token\":.*|\"admin_token\": \"${TOKEN}\"|" /opt/vaultwarden/data/config.json
|
||||||
|
fi
|
||||||
|
systemctl restart vaultwarden
|
||||||
|
msg_ok "Admin token updated"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
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}https://${IP}:8000${CL}"
|
||||||
70
ct/vikunja.sh
Normal file
70
ct/vikunja.sh
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: MickLesk (Canbiz) | Co-Author: CrazyWolf13
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://vikunja.io/
|
||||||
|
|
||||||
|
APP="Vikunja"
|
||||||
|
var_tags="${var_tags:-todo-app}"
|
||||||
|
var_cpu="${var_cpu:-1}"
|
||||||
|
var_ram="${var_ram:-1024}"
|
||||||
|
var_disk="${var_disk:-4}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
if [[ ! -d /opt/vikunja ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
RELEASE="$( [[ -f "$HOME/.vikunja" ]] && cat "$HOME/.vikunja" 2>/dev/null || [[ -f /opt/Vikunja_version ]] && cat /opt/Vikunja_version 2>/dev/null || true)"
|
||||||
|
if [[ -z "$RELEASE" ]] || [[ "$RELEASE" == "unstable" ]] || dpkg --compare-versions "${RELEASE:-0.0.0}" lt "1.0.0"; then
|
||||||
|
msg_warn "You are upgrading from Vikunja '$RELEASE'."
|
||||||
|
msg_warn "This requires MANUAL config changes in /etc/vikunja/config.yml."
|
||||||
|
msg_warn "See: https://vikunja.io/changelog/whats-new-in-vikunja-1.0.0/#config-changes"
|
||||||
|
|
||||||
|
read -rp "Continue with update? (y to proceed): " -t 30 CONFIRM1 || exit 1
|
||||||
|
[[ "$CONFIRM1" =~ ^[yY]$ ]] || exit 0
|
||||||
|
|
||||||
|
echo
|
||||||
|
msg_warn "Vikunja may not start after the update until you manually adjust the config."
|
||||||
|
msg_warn "Details: https://vikunja.io/changelog/whats-new-in-vikunja-1.0.0/#config-changes"
|
||||||
|
|
||||||
|
read -rp "Acknowledge and continue? (y): " -t 30 CONFIRM2 || exit 1
|
||||||
|
[[ "$CONFIRM2" =~ ^[yY]$ ]] || exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_release "vikunja" "go-vikunja/vikunja"; then
|
||||||
|
msg_info "Stopping Service"
|
||||||
|
systemctl stop vikunja
|
||||||
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "vikunja" "go-vikunja/vikunja" "binary"
|
||||||
|
|
||||||
|
msg_info "Starting Service"
|
||||||
|
systemctl start vikunja
|
||||||
|
msg_ok "Started Service"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
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 URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3456${CL}"
|
||||||
72
ct/writefreely.sh
Normal file
72
ct/writefreely.sh
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: StellaeAlis
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/writefreely/writefreely
|
||||||
|
|
||||||
|
# App Default Values
|
||||||
|
APP="WriteFreely"
|
||||||
|
var_tags="${var_tags:-writing}"
|
||||||
|
var_cpu="${var_cpu:-2}"
|
||||||
|
var_ram="${var_ram:-1024}"
|
||||||
|
var_disk="${var_disk:-4}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
|
||||||
|
if [[ ! -d /opt/writefreely ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_release "writefreely" "writefreely/writefreely"; then
|
||||||
|
msg_info "Stopping Services"
|
||||||
|
systemctl stop writefreely
|
||||||
|
msg_ok "Stopped Services"
|
||||||
|
|
||||||
|
msg_info "Creating Backup"
|
||||||
|
mkdir -p /tmp/writefreely_backup
|
||||||
|
cp /opt/writefreely/keys /tmp/writefreely_backup/ 2>/dev/null
|
||||||
|
cp /opt/writefreely/config.ini /tmp/writefreely_backup/ 2>/dev/null
|
||||||
|
msg_ok "Created Backup"
|
||||||
|
|
||||||
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "writefreely" "writefreely/writefreely" "prebuild" "latest" "/opt/writefreely" "writefreely_*_linux_amd64.tar.gz"
|
||||||
|
|
||||||
|
msg_info "Restoring Data"
|
||||||
|
cp /tmp/writefreely_backup/config.ini /opt/writefreely/ 2>/dev/null
|
||||||
|
cp /tmp/writefreely_backup/keys/* /opt/writefreely/keys/ 2>/dev/null
|
||||||
|
rm -rf /tmp/writefreely_backup
|
||||||
|
msg_ok "Restored Data"
|
||||||
|
|
||||||
|
msg_info "Running Post-Update Tasks"
|
||||||
|
cd /opt/writefreely
|
||||||
|
$STD ./writefreely db migrate
|
||||||
|
msg_ok "Ran Post-Update Tasks"
|
||||||
|
|
||||||
|
msg_info "Starting Services"
|
||||||
|
systemctl start writefreely
|
||||||
|
msg_ok "Started Services"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
|
||||||
@ -224,9 +224,9 @@ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "appname" "owner/repo"
|
|||||||
|
|
||||||
### Helper Utilities
|
### Helper Utilities
|
||||||
|
|
||||||
| Function | Description | Example |
|
| Function/Variable | Description | Example |
|
||||||
|----------|-------------|----------|
|
|-------------------|-------------|----------|
|
||||||
| `import_local_ip` | Sets `$LOCAL_IP` variable | `import_local_ip` |
|
| `$LOCAL_IP` | Always available - contains the container's IP address | `echo "Access: http://${LOCAL_IP}:3000"` |
|
||||||
| `ensure_dependencies` | Checks/installs dependencies | `ensure_dependencies curl jq` |
|
| `ensure_dependencies` | Checks/installs dependencies | `ensure_dependencies curl jq` |
|
||||||
| `install_packages_with_retry` | APT install with retry | `install_packages_with_retry nginx redis` |
|
| `install_packages_with_retry` | APT install with retry | `install_packages_with_retry nginx redis` |
|
||||||
|
|
||||||
|
|||||||
@ -634,4 +634,224 @@ silent()
|
|||||||
- `SILENT_LOGFILE`: Silent execution log file path
|
- `SILENT_LOGFILE`: Silent execution log file path
|
||||||
- `SPINNER_PID`: Spinner process ID
|
- `SPINNER_PID`: Spinner process ID
|
||||||
- `SPINNER_MSG`: Spinner message text
|
- `SPINNER_MSG`: Spinner message text
|
||||||
- `MSG_INFO_SHOWN`: Tracks shown info messages
|
- `MSG_INFO_SHOWN`: Tracks shown info messages- `PHS_SILENT`: Unattended mode flag (1 = silent)
|
||||||
|
- `var_unattended`: Unattended mode variable (yes/no)
|
||||||
|
- `UNATTENDED`: Alternative unattended mode variable
|
||||||
|
|
||||||
|
## Unattended/Interactive Prompt Functions
|
||||||
|
|
||||||
|
These functions provide a unified way to handle user prompts in both interactive and unattended modes. They automatically detect the execution context and either prompt the user (with timeout) or use default values silently.
|
||||||
|
|
||||||
|
### `is_unattended()`
|
||||||
|
**Purpose**: Detect if script is running in unattended/silent mode
|
||||||
|
**Parameters**: None
|
||||||
|
**Returns**:
|
||||||
|
- `0` (true): Running unattended
|
||||||
|
- `1` (false): Running interactively
|
||||||
|
**Side Effects**: None
|
||||||
|
**Dependencies**: None
|
||||||
|
**Environment Variables Used**: `PHS_SILENT`, `var_unattended`, `UNATTENDED`
|
||||||
|
|
||||||
|
**Usage Example**:
|
||||||
|
```bash
|
||||||
|
if is_unattended; then
|
||||||
|
echo "Running in unattended mode"
|
||||||
|
else
|
||||||
|
echo "Running interactively"
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
### `prompt_confirm()`
|
||||||
|
**Purpose**: Prompt user for yes/no confirmation with timeout and unattended support
|
||||||
|
**Parameters**:
|
||||||
|
- `$1` - Prompt message (required)
|
||||||
|
- `$2` - Default value: "y" or "n" (optional, default: "n")
|
||||||
|
- `$3` - Timeout in seconds (optional, default: 60)
|
||||||
|
**Returns**:
|
||||||
|
- `0`: User confirmed (yes)
|
||||||
|
- `1`: User declined (no) or timeout with default "n"
|
||||||
|
**Side Effects**: Displays prompt to terminal
|
||||||
|
**Dependencies**: `is_unattended()`
|
||||||
|
**Environment Variables Used**: Color variables (`YW`, `CL`)
|
||||||
|
|
||||||
|
**Behavior**:
|
||||||
|
- **Unattended mode**: Immediately returns default value
|
||||||
|
- **Non-TTY**: Immediately returns default value
|
||||||
|
- **Interactive**: Displays prompt with timeout countdown
|
||||||
|
- **Timeout**: Auto-applies default value after specified seconds
|
||||||
|
|
||||||
|
**Usage Examples**:
|
||||||
|
```bash
|
||||||
|
# Basic confirmation (default: no)
|
||||||
|
if prompt_confirm "Proceed with installation?"; then
|
||||||
|
install_package
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Default to yes, 30 second timeout
|
||||||
|
if prompt_confirm "Continue?" "y" 30; then
|
||||||
|
continue_operation
|
||||||
|
fi
|
||||||
|
|
||||||
|
# In unattended mode (will use default immediately)
|
||||||
|
var_unattended=yes
|
||||||
|
prompt_confirm "Delete files?" "n" && echo "Deleting" || echo "Skipped"
|
||||||
|
```
|
||||||
|
|
||||||
|
### `prompt_input()`
|
||||||
|
**Purpose**: Prompt user for text input with timeout and unattended support
|
||||||
|
**Parameters**:
|
||||||
|
- `$1` - Prompt message (required)
|
||||||
|
- `$2` - Default value (optional, default: "")
|
||||||
|
- `$3` - Timeout in seconds (optional, default: 60)
|
||||||
|
**Output**: Prints the user input or default value to stdout
|
||||||
|
**Returns**: `0` always
|
||||||
|
**Side Effects**: Displays prompt to stderr (keeps stdout clean for value)
|
||||||
|
**Dependencies**: `is_unattended()`
|
||||||
|
**Environment Variables Used**: Color variables (`YW`, `CL`)
|
||||||
|
|
||||||
|
**Behavior**:
|
||||||
|
- **Unattended mode**: Returns default value immediately
|
||||||
|
- **Non-TTY**: Returns default value immediately
|
||||||
|
- **Interactive**: Waits for user input with timeout
|
||||||
|
- **Empty input**: Returns default value
|
||||||
|
- **Timeout**: Returns default value
|
||||||
|
|
||||||
|
**Usage Examples**:
|
||||||
|
```bash
|
||||||
|
# Get username with default
|
||||||
|
username=$(prompt_input "Enter username:" "admin" 30)
|
||||||
|
echo "Using username: $username"
|
||||||
|
|
||||||
|
# With validation loop
|
||||||
|
while true; do
|
||||||
|
port=$(prompt_input "Enter port:" "8080" 30)
|
||||||
|
[[ "$port" =~ ^[0-9]+$ ]] && break
|
||||||
|
echo "Invalid port number"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Capture value in unattended mode
|
||||||
|
var_unattended=yes
|
||||||
|
db_name=$(prompt_input "Database name:" "myapp_db")
|
||||||
|
```
|
||||||
|
|
||||||
|
### `prompt_select()`
|
||||||
|
**Purpose**: Prompt user to select from a list of options with timeout support
|
||||||
|
**Parameters**:
|
||||||
|
- `$1` - Prompt message (required)
|
||||||
|
- `$2` - Default option number, 1-based (optional, default: 1)
|
||||||
|
- `$3` - Timeout in seconds (optional, default: 60)
|
||||||
|
- `$4+` - Options to display (required, at least 1)
|
||||||
|
**Output**: Prints the selected option value to stdout
|
||||||
|
**Returns**:
|
||||||
|
- `0`: Success
|
||||||
|
- `1`: No options provided
|
||||||
|
**Side Effects**: Displays numbered menu to stderr
|
||||||
|
**Dependencies**: `is_unattended()`
|
||||||
|
**Environment Variables Used**: Color variables (`YW`, `GN`, `CL`)
|
||||||
|
|
||||||
|
**Behavior**:
|
||||||
|
- **Unattended mode**: Returns default selection immediately
|
||||||
|
- **Non-TTY**: Returns default selection immediately
|
||||||
|
- **Interactive**: Displays numbered menu with timeout
|
||||||
|
- **Invalid selection**: Uses default
|
||||||
|
- **Timeout**: Auto-selects default
|
||||||
|
|
||||||
|
**Usage Examples**:
|
||||||
|
```bash
|
||||||
|
# Simple selection
|
||||||
|
choice=$(prompt_select "Select database:" 1 30 "PostgreSQL" "MySQL" "SQLite")
|
||||||
|
echo "Selected: $choice"
|
||||||
|
|
||||||
|
# Using array
|
||||||
|
options=("Production" "Staging" "Development")
|
||||||
|
env=$(prompt_select "Select environment:" 2 60 "${options[@]}")
|
||||||
|
|
||||||
|
# In automation scripts
|
||||||
|
var_unattended=yes
|
||||||
|
db=$(prompt_select "Database:" 1 30 "postgres" "mysql" "sqlite")
|
||||||
|
# Returns "postgres" immediately without menu
|
||||||
|
```
|
||||||
|
|
||||||
|
### `prompt_password()`
|
||||||
|
**Purpose**: Prompt user for password input with hidden characters and auto-generation
|
||||||
|
**Parameters**:
|
||||||
|
- `$1` - Prompt message (required)
|
||||||
|
- `$2` - Default value or "generate" for auto-generation (optional)
|
||||||
|
- `$3` - Timeout in seconds (optional, default: 60)
|
||||||
|
- `$4` - Minimum length for validation (optional, default: 0)
|
||||||
|
**Output**: Prints the password to stdout
|
||||||
|
**Returns**: `0` always
|
||||||
|
**Side Effects**: Displays prompt to stderr with hidden input
|
||||||
|
**Dependencies**: `is_unattended()`, `openssl` (for generation)
|
||||||
|
**Environment Variables Used**: Color variables (`YW`, `CL`)
|
||||||
|
|
||||||
|
**Behavior**:
|
||||||
|
- **"generate" default**: Creates random 16-character password
|
||||||
|
- **Unattended mode**: Returns default/generated password immediately
|
||||||
|
- **Non-TTY**: Returns default/generated password immediately
|
||||||
|
- **Interactive**: Hidden input with timeout
|
||||||
|
- **Min length validation**: Falls back to default if too short
|
||||||
|
- **Timeout**: Returns default/generated password
|
||||||
|
|
||||||
|
**Usage Examples**:
|
||||||
|
```bash
|
||||||
|
# Auto-generate password if user doesn't provide one
|
||||||
|
password=$(prompt_password "Enter password:" "generate" 30)
|
||||||
|
echo "Password has been set"
|
||||||
|
|
||||||
|
# Require minimum length
|
||||||
|
db_pass=$(prompt_password "Database password:" "" 60 12)
|
||||||
|
|
||||||
|
# With default password
|
||||||
|
admin_pass=$(prompt_password "Admin password:" "changeme123" 30)
|
||||||
|
|
||||||
|
# In unattended mode with auto-generation
|
||||||
|
var_unattended=yes
|
||||||
|
password=$(prompt_password "Password:" "generate")
|
||||||
|
# Returns randomly generated password
|
||||||
|
```
|
||||||
|
|
||||||
|
## Prompt Function Decision Flow
|
||||||
|
|
||||||
|
```
|
||||||
|
prompt_confirm() / prompt_input() / prompt_select() / prompt_password()
|
||||||
|
│
|
||||||
|
├── is_unattended()? ─────────────────────┐
|
||||||
|
│ └── PHS_SILENT=1? │
|
||||||
|
│ └── var_unattended=yes? ├── YES → Return default immediately
|
||||||
|
│ └── UNATTENDED=yes? │
|
||||||
|
│ │
|
||||||
|
├── TTY available? ─────────────── NO ────┘
|
||||||
|
│
|
||||||
|
└── Interactive Mode
|
||||||
|
├── Display prompt with timeout hint
|
||||||
|
├── read -t $timeout
|
||||||
|
│ ├── User input received → Validate and return
|
||||||
|
│ ├── Empty input → Return default
|
||||||
|
│ └── Timeout → Return default with message
|
||||||
|
└── Return value
|
||||||
|
```
|
||||||
|
|
||||||
|
## Migration Guide: Converting read Commands
|
||||||
|
|
||||||
|
To make existing scripts unattended-compatible, replace `read` commands with the appropriate prompt function:
|
||||||
|
|
||||||
|
### Before (blocking):
|
||||||
|
```bash
|
||||||
|
read -rp "Continue? [y/N]: " confirm
|
||||||
|
[[ "$confirm" =~ ^[Yy]$ ]] && do_something
|
||||||
|
|
||||||
|
read -p "Enter port: " port
|
||||||
|
port="${port:-8080}"
|
||||||
|
|
||||||
|
read -p "Select (1-3): " choice
|
||||||
|
```
|
||||||
|
|
||||||
|
### After (unattended-safe):
|
||||||
|
```bash
|
||||||
|
prompt_confirm "Continue?" "n" && do_something
|
||||||
|
|
||||||
|
port=$(prompt_input "Enter port:" "8080")
|
||||||
|
|
||||||
|
choice=$(prompt_select "Select option:" 1 60 "Option 1" "Option 2" "Option 3")
|
||||||
|
```
|
||||||
|
|||||||
@ -1,48 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "Ampache",
|
|
||||||
"slug": "ampache",
|
|
||||||
"categories": [
|
|
||||||
13
|
|
||||||
],
|
|
||||||
"date_created": "2026-01-13",
|
|
||||||
"type": "ct",
|
|
||||||
"updateable": true,
|
|
||||||
"privileged": false,
|
|
||||||
"interface_port": 80,
|
|
||||||
"documentation": "https://github.com/ampache/ampache/wiki",
|
|
||||||
"website": "https://ampache.org/",
|
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/ampache.webp",
|
|
||||||
"config_path": "/opt/ampache/config/ampache.cfg.php",
|
|
||||||
"description": "Ampache is a web-based audio streaming application and file manager that allows you to access your music & videos from anywhere. It features a powerful music catalog, multiple user support, transcoding, streaming, and more.",
|
|
||||||
"install_methods": [
|
|
||||||
{
|
|
||||||
"type": "default",
|
|
||||||
"script": "ct/ampache.sh",
|
|
||||||
"resources": {
|
|
||||||
"cpu": 4,
|
|
||||||
"ram": 2048,
|
|
||||||
"hdd": 5,
|
|
||||||
"os": "debian",
|
|
||||||
"version": "13"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"default_credentials": {
|
|
||||||
"username": null,
|
|
||||||
"password": null
|
|
||||||
},
|
|
||||||
"notes": [
|
|
||||||
{
|
|
||||||
"text": "Complete the web-based setup at http://IP/install.php",
|
|
||||||
"type": "info"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "Database credentials are stored in `~/ampache.creds` - use only the MySQL username and password from this file",
|
|
||||||
"type": "info"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "During installation, only check 'Create Tables' - leave 'Create Database' and 'Create Database User' unchecked",
|
|
||||||
"type": "info"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
48
frontend/public/json/anytype.json
Normal file
48
frontend/public/json/anytype.json
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
"name": "Anytype",
|
||||||
|
"slug": "anytype",
|
||||||
|
"categories": [
|
||||||
|
12
|
||||||
|
],
|
||||||
|
"date_created": "2026-01-29",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": 33010,
|
||||||
|
"documentation": "https://doc.anytype.io/",
|
||||||
|
"website": "https://anytype.io/",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/anytype.webp",
|
||||||
|
"config_path": "/opt/anytype/.env",
|
||||||
|
"description": "Anytype is a local-first, privacy-focused alternative to Notion. This script deploys the any-sync-bundle which provides a self-hosted sync server for Anytype clients with external MongoDB and Redis Stack.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/anytype.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 2,
|
||||||
|
"ram": 4096,
|
||||||
|
"hdd": 16,
|
||||||
|
"os": "Ubuntu",
|
||||||
|
"version": "24.04"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "After installation, import /opt/anytype/data/client-config.yml into your Anytype apps.",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "This uses the community any-sync-bundle by grishy, not the official Anytype deployment.",
|
||||||
|
"type": "warning"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Firewall: Open TCP 33010 (DRPC) and UDP 33020 (QUIC) for external access.",
|
||||||
|
"type": "info"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
48
frontend/public/json/checkmate.json
Normal file
48
frontend/public/json/checkmate.json
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
"name": "Checkmate",
|
||||||
|
"slug": "checkmate",
|
||||||
|
"categories": [
|
||||||
|
9
|
||||||
|
],
|
||||||
|
"date_created": "2026-02-02",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": 5173,
|
||||||
|
"documentation": "https://github.com/bluewave-labs/Checkmate#readme",
|
||||||
|
"website": "https://github.com/bluewave-labs/Checkmate",
|
||||||
|
"logo": "https://raw.githubusercontent.com/bluewave-labs/Checkmate/develop/client/public/checkmate-logo-light.png",
|
||||||
|
"config_path": "/opt/checkmate/server/.env",
|
||||||
|
"description": "Checkmate is an open source uptime and infrastructure monitoring application that helps you track the availability and performance of your services.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/checkmate.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 2,
|
||||||
|
"ram": 4096,
|
||||||
|
"hdd": 10,
|
||||||
|
"os": "Debian",
|
||||||
|
"version": "13"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "Create your admin account on first login via the web interface.",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Server API runs on port 52345, Client UI on port 5173.",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "For PageSpeed monitoring, add a Google PageSpeed API key to the server .env file.",
|
||||||
|
"type": "info"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
40
frontend/public/json/clawdbot.json
Normal file
40
frontend/public/json/clawdbot.json
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"name": "Clawdbot",
|
||||||
|
"slug": "clawdbot",
|
||||||
|
"categories": [
|
||||||
|
20
|
||||||
|
],
|
||||||
|
"date_created": "2026-01-26",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": 18791,
|
||||||
|
"documentation": "https://docs.clawd.bot/",
|
||||||
|
"website": "https://clawd.bot/",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/clawdbot.webp",
|
||||||
|
"config_path": "/opt/clawdbot/.env",
|
||||||
|
"description": "Your own personal AI assistant. Any OS. Any Platform. The lobster way. Clawdbot is a powerful AI agent framework that can be configured to work across multiple platforms and channels.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/clawdbot.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 2,
|
||||||
|
"ram": 2048,
|
||||||
|
"hdd": 8,
|
||||||
|
"os": "debian",
|
||||||
|
"version": "13"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"type": "info",
|
||||||
|
"text": "After install run onboarding: clawdbot onboard --install-daemon"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -1,40 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "Dawarich",
|
|
||||||
"slug": "dawarich",
|
|
||||||
"categories": [
|
|
||||||
9
|
|
||||||
],
|
|
||||||
"date_created": "2026-01-16",
|
|
||||||
"type": "ct",
|
|
||||||
"updateable": true,
|
|
||||||
"privileged": false,
|
|
||||||
"interface_port": 3000,
|
|
||||||
"documentation": "https://dawarich.app/docs",
|
|
||||||
"website": "https://dawarich.app/",
|
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/dawarich.webp",
|
|
||||||
"config_path": "/opt/dawarich/.env",
|
|
||||||
"description": "Dawarich is a self-hosted alternative to Google Timeline (Google Maps Location History). It allows you to import your location history from Google Maps Timeline and Owntracks, view it on a map, and analyze your location data with statistics and visualizations.",
|
|
||||||
"install_methods": [
|
|
||||||
{
|
|
||||||
"type": "default",
|
|
||||||
"script": "ct/dawarich.sh",
|
|
||||||
"resources": {
|
|
||||||
"cpu": 4,
|
|
||||||
"ram": 4096,
|
|
||||||
"hdd": 15,
|
|
||||||
"os": "Debian",
|
|
||||||
"version": "13"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"default_credentials": {
|
|
||||||
"username": "demo@dawarich.app",
|
|
||||||
"password": "password"
|
|
||||||
},
|
|
||||||
"notes": [
|
|
||||||
{
|
|
||||||
"text": "Default credentials: demo@dawarich.app / password - Change after first login!",
|
|
||||||
"type": "warning"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
40
frontend/public/json/ebusd.json
Normal file
40
frontend/public/json/ebusd.json
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"name": "ebusd",
|
||||||
|
"slug": "ebusd",
|
||||||
|
"categories": [
|
||||||
|
16
|
||||||
|
],
|
||||||
|
"date_created": "2026-01-26",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": null,
|
||||||
|
"documentation": "https://github.com/john30/ebusd/wiki",
|
||||||
|
"website": "https://github.com/john30/ebusd",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/proxmox-helper-scripts.webp",
|
||||||
|
"config_path": "/etc/default/ebusd",
|
||||||
|
"description": "ebusd is a daemon for handling communication with eBUS devices connected to a 2-wire `energy bus` used by numerous heating systems.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/ebusd.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 1,
|
||||||
|
"ram": 512,
|
||||||
|
"hdd": 2,
|
||||||
|
"os": "debian",
|
||||||
|
"version": "13"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": "root",
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "For required post installation actions, checkout: `https://github.com/community-scripts/ProxmoxVE/discussions/11352`",
|
||||||
|
"type": "info"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
145
frontend/public/json/github-versions.json
Normal file
145
frontend/public/json/github-versions.json
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
{
|
||||||
|
"generated": "2026-01-31T18:42:49Z",
|
||||||
|
"versions": [
|
||||||
|
{
|
||||||
|
"slug": "affine",
|
||||||
|
"repo": "toeverything/AFFiNE",
|
||||||
|
"version": "v0.25.7",
|
||||||
|
"pinned": false,
|
||||||
|
"date": "2025-12-09T04:34:14Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "anytype",
|
||||||
|
"repo": "grishy/any-sync-bundle",
|
||||||
|
"version": "v1.2.1-2025-12-10",
|
||||||
|
"pinned": false,
|
||||||
|
"date": "2025-12-24T20:40:15Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "databasus",
|
||||||
|
"repo": "databasus/databasus",
|
||||||
|
"version": "v3.7.0",
|
||||||
|
"pinned": false,
|
||||||
|
"date": "2026-01-28T14:46:28Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "ente",
|
||||||
|
"repo": "ente-io/ente",
|
||||||
|
"version": "photos-v1.3.7",
|
||||||
|
"pinned": false,
|
||||||
|
"date": "2026-01-29T17:20:41Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "frigate",
|
||||||
|
"repo": "blakeblackshear/frigate",
|
||||||
|
"version": "v0.16.4",
|
||||||
|
"pinned": false,
|
||||||
|
"date": "2026-01-29T00:42:14Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "hoodik",
|
||||||
|
"repo": "hudikhq/hoodik",
|
||||||
|
"version": "v1.8.1",
|
||||||
|
"pinned": false,
|
||||||
|
"date": "2025-12-22T20:32:27Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "isponsorblocktv",
|
||||||
|
"repo": "dmunozv04/iSponsorBlockTV",
|
||||||
|
"version": "v2.6.1",
|
||||||
|
"pinned": false,
|
||||||
|
"date": "2025-10-19T17:43:10Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "kitchenowl",
|
||||||
|
"repo": "TomBursch/kitchenowl",
|
||||||
|
"version": "v0.7.6",
|
||||||
|
"pinned": false,
|
||||||
|
"date": "2026-01-24T01:21:14Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "minthcm",
|
||||||
|
"repo": "minthcm/minthcm",
|
||||||
|
"version": "4.2.2",
|
||||||
|
"pinned": false,
|
||||||
|
"date": "2025-10-10T09:37:21Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "nextexplorer",
|
||||||
|
"repo": "vikramsoni2/nextExplorer",
|
||||||
|
"version": "v2.1.2a",
|
||||||
|
"pinned": false,
|
||||||
|
"date": "2026-01-31T00:09:18Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "nightscout",
|
||||||
|
"repo": "nightscout/cgm-remote-monitor",
|
||||||
|
"version": "15.0.3",
|
||||||
|
"pinned": false,
|
||||||
|
"date": "2025-05-08T22:12:34Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "opencloud",
|
||||||
|
"repo": "opencloud-eu/opencloud",
|
||||||
|
"version": "v5.0.1",
|
||||||
|
"pinned": true,
|
||||||
|
"date": "2026-01-28T15:08:23Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "piler",
|
||||||
|
"repo": "jsuto/piler",
|
||||||
|
"version": "piler-1.4.8",
|
||||||
|
"pinned": false,
|
||||||
|
"date": "2025-09-24T06:51:38Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "pixelfed",
|
||||||
|
"repo": "pixelfed/pixelfed",
|
||||||
|
"version": "v0.12.6",
|
||||||
|
"pinned": false,
|
||||||
|
"date": "2025-09-03T12:12:04Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "romm",
|
||||||
|
"repo": "RetroAchievements/RALibretro",
|
||||||
|
"version": "1.8.2",
|
||||||
|
"pinned": false,
|
||||||
|
"date": "2026-01-23T17:03:31Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "rustypaste",
|
||||||
|
"repo": "orhun/rustypaste",
|
||||||
|
"version": "v0.16.1",
|
||||||
|
"pinned": false,
|
||||||
|
"date": "2025-03-21T20:44:47Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "seer",
|
||||||
|
"repo": "seerr-team/seerr",
|
||||||
|
"version": "v2.7.3",
|
||||||
|
"pinned": false,
|
||||||
|
"date": "2025-08-14T20:43:46Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "shelfmark",
|
||||||
|
"repo": "FlareSolverr/FlareSolverr",
|
||||||
|
"version": "v3.4.6",
|
||||||
|
"pinned": false,
|
||||||
|
"date": "2025-11-29T02:43:00Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "sonobarr",
|
||||||
|
"repo": "Dodelidoo-Labs/sonobarr",
|
||||||
|
"version": "0.11.0",
|
||||||
|
"pinned": false,
|
||||||
|
"date": "2026-01-21T19:07:21Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "wishlist",
|
||||||
|
"repo": "cmintey/wishlist",
|
||||||
|
"version": "v0.59.0",
|
||||||
|
"pinned": false,
|
||||||
|
"date": "2026-01-19T16:42:14Z"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
44
frontend/public/json/isponsorblocktv.json
Normal file
44
frontend/public/json/isponsorblocktv.json
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
{
|
||||||
|
"name": "iSponsorBlockTV",
|
||||||
|
"slug": "isponsorblocktv",
|
||||||
|
"categories": [
|
||||||
|
13
|
||||||
|
],
|
||||||
|
"date_created": "2026-01-25",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": null,
|
||||||
|
"documentation": "https://github.com/dmunozv04/iSponsorBlockTV/wiki",
|
||||||
|
"website": "https://github.com/dmunozv04/iSponsorBlockTV",
|
||||||
|
"logo": "https://raw.githubusercontent.com/ajayyy/SponsorBlock/master/public/icons/IconSponsorBlocker512px.png",
|
||||||
|
"config_path": "/var/lib/isponsorblocktv/config.json",
|
||||||
|
"description": "iSponsorBlockTV connects to YouTube TV clients and automatically skips SponsorBlock segments, mutes ads, and presses the Skip Ad button when available.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/isponsorblocktv.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 1,
|
||||||
|
"ram": 1024,
|
||||||
|
"hdd": 4,
|
||||||
|
"os": "debian",
|
||||||
|
"version": "13"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "No web UI; run `iSponsorBlockTV setup` inside the container to configure.",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "SSDP auto-discovery requires multicast on your bridge; manual pairing works without it.",
|
||||||
|
"type": "info"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -1,35 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "KitchenOwl",
|
|
||||||
"slug": "kitchenowl",
|
|
||||||
"categories": [
|
|
||||||
13
|
|
||||||
],
|
|
||||||
"date_created": "2025-12-28",
|
|
||||||
"type": "ct",
|
|
||||||
"updateable": true,
|
|
||||||
"privileged": false,
|
|
||||||
"interface_port": 80,
|
|
||||||
"documentation": "https://docs.kitchenowl.org/",
|
|
||||||
"website": "https://kitchenowl.org/",
|
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/kitchenowl.webp",
|
|
||||||
"config_path": "/opt/kitchenowl/kitchenowl.env",
|
|
||||||
"description": "KitchenOwl is a smart self-hosted grocery list and recipe manager with real-time synchronization, recipe management, meal planning, and expense tracking.",
|
|
||||||
"install_methods": [
|
|
||||||
{
|
|
||||||
"type": "default",
|
|
||||||
"script": "ct/kitchenowl.sh",
|
|
||||||
"resources": {
|
|
||||||
"cpu": 1,
|
|
||||||
"ram": 2048,
|
|
||||||
"hdd": 6,
|
|
||||||
"os": "Debian",
|
|
||||||
"version": "13"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"default_credentials": {
|
|
||||||
"username": null,
|
|
||||||
"password": null
|
|
||||||
},
|
|
||||||
"notes": []
|
|
||||||
}
|
|
||||||
@ -1,44 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "LanguageTool",
|
|
||||||
"slug": "languagetool",
|
|
||||||
"categories": [
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"date_created": "2025-12-10",
|
|
||||||
"type": "ct",
|
|
||||||
"updateable": true,
|
|
||||||
"privileged": false,
|
|
||||||
"interface_port": 8081,
|
|
||||||
"documentation": "https://dev.languagetool.org/",
|
|
||||||
"config_path": "/opt/LanguageTool/server.properties",
|
|
||||||
"website": "https://languagetool.org/",
|
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/languagetool.webp",
|
|
||||||
"description": "LanguageTool is an Open Source proofreading software for English, Spanish, French, German, Portuguese, Polish, Dutch, and more than 20 other languages. It finds many errors that a simple spell checker cannot detect.",
|
|
||||||
"install_methods": [
|
|
||||||
{
|
|
||||||
"type": "default",
|
|
||||||
"script": "ct/languagetool.sh",
|
|
||||||
"resources": {
|
|
||||||
"cpu": 2,
|
|
||||||
"ram": 4096,
|
|
||||||
"hdd": 8,
|
|
||||||
"os": "Debian",
|
|
||||||
"version": "13"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"default_credentials": {
|
|
||||||
"username": null,
|
|
||||||
"password": null
|
|
||||||
},
|
|
||||||
"notes": [
|
|
||||||
{
|
|
||||||
"text": "API is available at `http://<LXC_IP>:8081/v2`.",
|
|
||||||
"type": "info"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "Application doesn't come with n-gram data. If you wish to use that feature, please look at `https://dev.languagetool.org/finding-errors-using-n-gram-data.html`.",
|
|
||||||
"type": "info"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -1,35 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "nodecast-tv",
|
|
||||||
"slug": "nodecast-tv",
|
|
||||||
"categories": [
|
|
||||||
13
|
|
||||||
],
|
|
||||||
"date_created": "2026-01-14",
|
|
||||||
"type": "ct",
|
|
||||||
"updateable": true,
|
|
||||||
"privileged": false,
|
|
||||||
"interface_port": 3000,
|
|
||||||
"documentation": "https://github.com/technomancer702/nodecast-tv/blob/main/README.md",
|
|
||||||
"website": "https://github.com/technomancer702/nodecast-tv",
|
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/nodecast-tv.webp",
|
|
||||||
"config_path": "",
|
|
||||||
"description": "nodecast-tv is a modern, web-based IPTV player featuring Live TV, EPG, Movies (VOD), and Series support. Built with performance and user experience in mind.",
|
|
||||||
"install_methods": [
|
|
||||||
{
|
|
||||||
"type": "default",
|
|
||||||
"script": "ct/nodecast-tv.sh",
|
|
||||||
"resources": {
|
|
||||||
"cpu": 2,
|
|
||||||
"ram": 2048,
|
|
||||||
"hdd": 4,
|
|
||||||
"os": "debian",
|
|
||||||
"version": "13"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"default_credentials": {
|
|
||||||
"username": null,
|
|
||||||
"password": null
|
|
||||||
},
|
|
||||||
"notes": []
|
|
||||||
}
|
|
||||||
@ -1,51 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "RustyPaste",
|
|
||||||
"slug": "rustypaste",
|
|
||||||
"categories": [
|
|
||||||
12
|
|
||||||
],
|
|
||||||
"date_created": "2025-12-22",
|
|
||||||
"type": "ct",
|
|
||||||
"updateable": true,
|
|
||||||
"privileged": false,
|
|
||||||
"interface_port": 8000,
|
|
||||||
"documentation": "https://github.com/orhun/rustypaste",
|
|
||||||
"config_path": "/opt/rustypaste/config.toml",
|
|
||||||
"website": "https://github.com/orhun/rustypaste",
|
|
||||||
"logo": "https://github.com/orhun/rustypaste/raw/master/img/rustypaste_logo.png",
|
|
||||||
"description": "Rustypaste is a minimal file upload/pastebin service.",
|
|
||||||
"install_methods": [
|
|
||||||
{
|
|
||||||
"type": "default",
|
|
||||||
"script": "ct/rustypaste.sh",
|
|
||||||
"resources": {
|
|
||||||
"cpu": 1,
|
|
||||||
"ram": 1024,
|
|
||||||
"hdd": 20,
|
|
||||||
"os": "Debian",
|
|
||||||
"version": "13"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "alpine",
|
|
||||||
"script": "ct/alpine-rustypaste.sh",
|
|
||||||
"resources": {
|
|
||||||
"cpu": 1,
|
|
||||||
"ram": 256,
|
|
||||||
"hdd": 4,
|
|
||||||
"os": "Alpine",
|
|
||||||
"version": "3.22"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"default_credentials": {
|
|
||||||
"username": null,
|
|
||||||
"password": null
|
|
||||||
},
|
|
||||||
"notes": [
|
|
||||||
{
|
|
||||||
"text": "When updating the script it will backup the whole project including all the uploaded files, make sure to extract it to a safe location or remove",
|
|
||||||
"type": "info"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -1,40 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "Shelfmark",
|
|
||||||
"slug": "shelfmark",
|
|
||||||
"categories": [
|
|
||||||
13
|
|
||||||
],
|
|
||||||
"date_created": "2026-01-24",
|
|
||||||
"type": "ct",
|
|
||||||
"updateable": true,
|
|
||||||
"privileged": false,
|
|
||||||
"interface_port": 8084,
|
|
||||||
"documentation": "https://github.com/calibrain/shelfmark/tree/main/docs",
|
|
||||||
"website": "https://github.com/calibrain/shelfmark",
|
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/shelfmark.webp",
|
|
||||||
"config_path": "/etc/shelfmark",
|
|
||||||
"description": "Shelfmark is a unified web interface for searching and aggregating books and audiobook downloads from multiple sources - all in one place.",
|
|
||||||
"install_methods": [
|
|
||||||
{
|
|
||||||
"type": "default",
|
|
||||||
"script": "ct/shelfmark.sh",
|
|
||||||
"resources": {
|
|
||||||
"cpu": 2,
|
|
||||||
"ram": 2048,
|
|
||||||
"hdd": 6,
|
|
||||||
"os": "Debian",
|
|
||||||
"version": "13"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"default_credentials": {
|
|
||||||
"username": null,
|
|
||||||
"password": null
|
|
||||||
},
|
|
||||||
"notes": [
|
|
||||||
{
|
|
||||||
"text": "The configuration at `/etc/shelfmark/.env` is for bootstrapping the initial install. Customize the configuration via the Shelfmark UI.",
|
|
||||||
"type": "info"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
40
frontend/public/json/sonobarr.json
Normal file
40
frontend/public/json/sonobarr.json
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"name": "Sonobarr",
|
||||||
|
"slug": "sonobarr",
|
||||||
|
"categories": [
|
||||||
|
14
|
||||||
|
],
|
||||||
|
"date_created": "2026-01-21",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": 5000,
|
||||||
|
"documentation": "https://github.com/Dodelidoo-Labs/sonobarr",
|
||||||
|
"config_path": "/etc/sonobarr/.env",
|
||||||
|
"website": "https://github.com/Dodelidoo-Labs/sonobarr",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/sonobarr.webp",
|
||||||
|
"description": "Sonobarr marries your existing Lidarr library with Last.fm’s discovery graph to surface artists you'll actually like. It runs as a Flask + Socket.IO application, ships with a polished Bootstrap UI, and includes admin tooling so folks can share a single instance safely.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/sonobarr.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 1,
|
||||||
|
"ram": 1024,
|
||||||
|
"hdd": 20,
|
||||||
|
"os": "Debian",
|
||||||
|
"version": "13"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "Default generated admin password is in the env file (sonobarr_superadmin_password)",
|
||||||
|
"type": "info"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
40
frontend/public/json/truenas-vm.json
Normal file
40
frontend/public/json/truenas-vm.json
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"name": "TrueNAS Community Edition",
|
||||||
|
"slug": "truenas-community-edition",
|
||||||
|
"categories": [
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"date_created": "2026-01-16",
|
||||||
|
"type": "vm",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": null,
|
||||||
|
"documentation": "https://www.truenas.com/docs/",
|
||||||
|
"website": "https://www.truenas.com/truenas-community-edition/",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/truenas-core.webp",
|
||||||
|
"config_path": "",
|
||||||
|
"description": "TrueNAS Community Edition is the world's most deployed storage software. Free, flexible and build on OpenZFS with Docker.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "vm/truenas-vm.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 2,
|
||||||
|
"ram": 8192,
|
||||||
|
"hdd": 16,
|
||||||
|
"os": null,
|
||||||
|
"version": null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "Once the script finishes, proceed with the OS installation via the console. For more details, please refer to this discussion: `https://github.com/community-scripts/ProxmoxVE/discussions/11344`",
|
||||||
|
"type": "info"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -51,6 +51,30 @@
|
|||||||
{
|
{
|
||||||
"text": "At the end of the update, containers requiring a reboot will be listed, and you may choose to reboot them directly.",
|
"text": "At the end of the update, containers requiring a reboot will be listed, and you may choose to reboot them directly.",
|
||||||
"type": "info"
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Use `var_backup=yes|no` to enable/disable backup (skip prompt).",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Use `var_backup_storage=<name>` to set backup storage location.",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Use `var_container=all|all_running|all_stopped|101,102,...` to select containers.",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Use `var_unattended=yes|no` to run updates without interaction.",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Use `var_skip_confirm=yes` to skip initial confirmation dialog.",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Use `var_auto_reboot=yes|no` to auto-reboot containers after update.",
|
||||||
|
"type": "info"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
40
frontend/public/json/writefreely.json
Normal file
40
frontend/public/json/writefreely.json
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"name": "WriteFreely",
|
||||||
|
"slug": "writefreely",
|
||||||
|
"categories": [
|
||||||
|
12
|
||||||
|
],
|
||||||
|
"date_created": "2026-01-25",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": 80,
|
||||||
|
"documentation": "https://writefreely.org/docs",
|
||||||
|
"config_path": "/opt/writefreely/config.ini",
|
||||||
|
"website": "https://writefreely.org/",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/writefreely-light.webp",
|
||||||
|
"description": "WriteFreely is free and open source software for easily publishing writing on the web with support for the ActivityPub protocol. Use it to start a personal blog — or an entire community.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/writefreely.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 2,
|
||||||
|
"ram": 1024,
|
||||||
|
"hdd": 4,
|
||||||
|
"os": "Debian",
|
||||||
|
"version": "13"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "After installation execute `./writefreely user create --admin username:password` in the `/opt/writefreely` directory to create your user.",
|
||||||
|
"type": "info"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -7,16 +7,17 @@ console.log('Current directory: ' + process.cwd());
|
|||||||
const jsonDir = "public/json";
|
const jsonDir = "public/json";
|
||||||
const metadataFileName = "metadata.json";
|
const metadataFileName = "metadata.json";
|
||||||
const versionsFileName = "versions.json";
|
const versionsFileName = "versions.json";
|
||||||
|
const githubVersionsFileName = "github-versions.json";
|
||||||
const encoding = "utf-8";
|
const encoding = "utf-8";
|
||||||
|
|
||||||
const fileNames = (await fs.readdir(jsonDir))
|
const fileNames = (await fs.readdir(jsonDir))
|
||||||
.filter((fileName) => fileName !== metadataFileName && fileName !== versionsFileName);
|
.filter((fileName) => fileName !== metadataFileName && fileName !== versionsFileName && fileName !== githubVersionsFileName);
|
||||||
|
|
||||||
describe.each(fileNames)("%s", async (fileName) => {
|
describe.each(fileNames)("%s", async (fileName) => {
|
||||||
let script: Script;
|
let script: Script;
|
||||||
|
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
const filePath = path.resolve(jsonDir, fileName);
|
const filePath = path.resolve(jsonDir, fileName);
|
||||||
const fileContent = await fs.readFile(filePath, encoding)
|
const fileContent = await fs.readFile(filePath, encoding)
|
||||||
script = JSON.parse(fileContent);
|
script = JSON.parse(fileContent);
|
||||||
})
|
})
|
||||||
@ -40,7 +41,7 @@ describe(`${metadataFileName}`, async () => {
|
|||||||
let metadata: Metadata;
|
let metadata: Metadata;
|
||||||
|
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
const filePath = path.resolve(jsonDir, metadataFileName);
|
const filePath = path.resolve(jsonDir, metadataFileName);
|
||||||
const fileContent = await fs.readFile(filePath, encoding)
|
const fileContent = await fs.readFile(filePath, encoding)
|
||||||
metadata = JSON.parse(fileContent);
|
metadata = JSON.parse(fileContent);
|
||||||
})
|
})
|
||||||
@ -48,9 +49,9 @@ describe(`${metadataFileName}`, async () => {
|
|||||||
// TODO: create zod schema for metadata. Move zod schemas to /lib/types.ts
|
// TODO: create zod schema for metadata. Move zod schemas to /lib/types.ts
|
||||||
assert(metadata.categories.length > 0);
|
assert(metadata.categories.length > 0);
|
||||||
metadata.categories.forEach((category) => {
|
metadata.categories.forEach((category) => {
|
||||||
assert.isString(category.name)
|
assert.isString(category.name)
|
||||||
assert.isNumber(category.id)
|
assert.isNumber(category.id)
|
||||||
assert.isNumber(category.sort_order)
|
assert.isNumber(category.sort_order)
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
|
|||||||
@ -29,7 +29,7 @@ PG_VERSION="16" PG_MODULES="pgvector" setup_postgresql
|
|||||||
PG_DB_NAME="affine" PG_DB_USER="affine" setup_postgresql_db
|
PG_DB_NAME="affine" PG_DB_USER="affine" setup_postgresql_db
|
||||||
NODE_VERSION="22" setup_nodejs
|
NODE_VERSION="22" setup_nodejs
|
||||||
setup_rust
|
setup_rust
|
||||||
import_local_ip
|
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "affine_app" "toeverything/AFFiNE" "tarball" "latest" "/opt/affine"
|
fetch_and_deploy_gh_release "affine_app" "toeverything/AFFiNE" "tarball" "latest" "/opt/affine"
|
||||||
|
|
||||||
|
|||||||
34
install/alpine-powerdns-install.sh
Normal file
34
install/alpine-powerdns-install.sh
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: Slaviša Arežina (tremor021)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||||
|
# Source: https://www.powerdns.com/
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing PowerDNS"
|
||||||
|
$STD apk add --no-cache pdns pdns-backend-sqlite3 pdns-doc
|
||||||
|
msg_ok "Installed PowerDNS"
|
||||||
|
|
||||||
|
msg_info "Configuring PowerDNS"
|
||||||
|
sed -i '/^# launch=$/c\launch=gsqlite3\ngsqlite3-database=/var/lib/powerdns/pdns.sqlite3' /etc/pdns/pdns.conf
|
||||||
|
mkdir /var/lib/powerdns
|
||||||
|
sqlite3 /var/lib/powerdns/pdns.sqlite3 < /usr/share/doc/pdns/schema.sqlite3.sql
|
||||||
|
chown -R pdns:pdns /var/lib/powerdns
|
||||||
|
msg_ok "Configured PowerDNS"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
$STD rc-update add pdns default
|
||||||
|
$STD rc-service pdns start
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
@ -1,32 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: MickLesk (CanbiZ)
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/orhun/rustypaste
|
|
||||||
|
|
||||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
|
||||||
color
|
|
||||||
verb_ip6
|
|
||||||
catch_errors
|
|
||||||
setting_up_container
|
|
||||||
network_check
|
|
||||||
update_os
|
|
||||||
|
|
||||||
msg_info "Installing RustyPaste"
|
|
||||||
$STD apk add --no-cache rustypaste --repository=https://dl-cdn.alpinelinux.org/alpine/edge/community
|
|
||||||
msg_ok "Installed RustyPaste"
|
|
||||||
|
|
||||||
msg_info "Configuring RustyPaste"
|
|
||||||
mkdir -p /var/lib/rustypaste
|
|
||||||
sed -i 's|^address = ".*"|address = "0.0.0.0:8000"|' /etc/rustypaste/config.toml
|
|
||||||
msg_ok "Configured RustyPaste"
|
|
||||||
|
|
||||||
msg_info "Creating Service"
|
|
||||||
$STD rc-update add rustypaste default
|
|
||||||
$STD rc-service rustypaste start
|
|
||||||
msg_ok "Created Service"
|
|
||||||
|
|
||||||
motd_ssh
|
|
||||||
customize
|
|
||||||
cleanup_lxc
|
|
||||||
@ -1,24 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: pshankinclarke (lazarillo)
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://valkey.io/
|
|
||||||
|
|
||||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
|
||||||
color
|
|
||||||
verb_ip6
|
|
||||||
catch_errors
|
|
||||||
setting_up_container
|
|
||||||
network_check
|
|
||||||
update_os
|
|
||||||
|
|
||||||
msg_info "Installing Valkey"
|
|
||||||
$STD apk add valkey valkey-openrc valkey-cli
|
|
||||||
$STD sed -i 's/^bind .*/bind 0.0.0.0/' /etc/valkey/valkey.conf
|
|
||||||
$STD rc-update add valkey default
|
|
||||||
$STD rc-service valkey start
|
|
||||||
msg_ok "Installed Valkey"
|
|
||||||
|
|
||||||
motd_ssh
|
|
||||||
customize
|
|
||||||
@ -1,68 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: MickLesk (Canbiz)
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/ampache/ampache
|
|
||||||
|
|
||||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
|
||||||
color
|
|
||||||
verb_ip6
|
|
||||||
catch_errors
|
|
||||||
setting_up_container
|
|
||||||
network_check
|
|
||||||
update_os
|
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
|
||||||
$STD apt install -y \
|
|
||||||
flac \
|
|
||||||
vorbis-tools \
|
|
||||||
lame \
|
|
||||||
ffmpeg \
|
|
||||||
inotify-tools \
|
|
||||||
libavcodec-extra \
|
|
||||||
libmp3lame-dev \
|
|
||||||
libtheora-dev \
|
|
||||||
libvorbis-dev \
|
|
||||||
libvpx-dev
|
|
||||||
msg_ok "Installed Dependencies"
|
|
||||||
|
|
||||||
PHP_VERSION=8.4 PHP_MODULE=bcmath,bz2,curl,gd,imagick,intl,mbstring,mysql,sqlite3,xml,xmlrpc,zip PHP_APACHE=YES setup_php
|
|
||||||
setup_mariadb
|
|
||||||
MARIADB_DB_USER=ampache MARIADB_DB_NAME=ampache setup_mariadb_db
|
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "ampache" "ampache/ampache" "prebuild" "latest" "/opt/ampache" "ampache-*_all_php8.4.zip"
|
|
||||||
|
|
||||||
msg_info "Setup Ampache"
|
|
||||||
rm -rf /var/www/html
|
|
||||||
ln -s /opt/ampache/public /var/www/html
|
|
||||||
mv /opt/ampache/public/rest/.htaccess.dist /opt/ampache/public/rest/.htaccess
|
|
||||||
mv /opt/ampache/public/play/.htaccess.dist /opt/ampache/public/play/.htaccess
|
|
||||||
cp /opt/ampache/config/ampache.cfg.php.dist /opt/ampache/config/ampache.cfg.php
|
|
||||||
chmod 664 /opt/ampache/public/rest/.htaccess /opt/ampache/public/play/.htaccess
|
|
||||||
msg_ok "Set up Ampache"
|
|
||||||
|
|
||||||
msg_info "Configuring Database Connection"
|
|
||||||
sed -i 's|^database_hostname = .*|database_hostname = "localhost"|' /opt/ampache/config/ampache.cfg.php
|
|
||||||
sed -i 's|^database_name = .*|database_name = "ampache"|' /opt/ampache/config/ampache.cfg.php
|
|
||||||
sed -i 's|^database_username = .*|database_username = "ampache"|' /opt/ampache/config/ampache.cfg.php
|
|
||||||
sed -i "s|^database_password = .*|database_password = \"${MARIADB_DB_PASS}\"|" /opt/ampache/config/ampache.cfg.php
|
|
||||||
chown -R www-data:www-data /opt/ampache
|
|
||||||
msg_ok "Configured Database Connection"
|
|
||||||
|
|
||||||
msg_info "Importing Database Schema"
|
|
||||||
mariadb -u ampache -p"${MARIADB_DB_PASS}" ampache </opt/ampache/resources/sql/ampache.sql
|
|
||||||
msg_ok "Imported Database Schema"
|
|
||||||
|
|
||||||
msg_info "Configuring PHP"
|
|
||||||
sed -i 's/upload_max_filesize = .*/upload_max_filesize = 100M/' /etc/php/8.4/apache2/php.ini
|
|
||||||
sed -i 's/post_max_size = .*/post_max_size = 100M/' /etc/php/8.4/apache2/php.ini
|
|
||||||
sed -i 's/max_execution_time = .*/max_execution_time = 600/' /etc/php/8.4/apache2/php.ini
|
|
||||||
sed -i 's/memory_limit = .*/memory_limit = 512M/' /etc/php/8.4/apache2/php.ini
|
|
||||||
$STD a2enmod rewrite
|
|
||||||
$STD systemctl restart apache2
|
|
||||||
msg_ok "Configured PHP"
|
|
||||||
|
|
||||||
motd_ssh
|
|
||||||
customize
|
|
||||||
cleanup_lxc
|
|
||||||
82
install/anytype-install.sh
Normal file
82
install/anytype-install.sh
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: MickLesk (CanbiZ)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||||
|
# Source: https://anytype.io
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
setup_mongodb
|
||||||
|
|
||||||
|
msg_info "Configuring MongoDB Replica Set"
|
||||||
|
cat <<EOF >>/etc/mongod.conf
|
||||||
|
|
||||||
|
replication:
|
||||||
|
replSetName: "rs0"
|
||||||
|
EOF
|
||||||
|
systemctl restart mongod
|
||||||
|
sleep 3
|
||||||
|
$STD mongosh --eval 'rs.initiate({_id: "rs0", members: [{_id: 0, host: "127.0.0.1:27017"}]})'
|
||||||
|
msg_ok "Configured MongoDB Replica Set"
|
||||||
|
|
||||||
|
msg_info "Installing Redis Stack"
|
||||||
|
setup_deb822_repo \
|
||||||
|
"redis-stack" \
|
||||||
|
"https://packages.redis.io/gpg" \
|
||||||
|
"https://packages.redis.io/deb" \
|
||||||
|
"jammy" \
|
||||||
|
"main"
|
||||||
|
$STD apt-get install -y \
|
||||||
|
redis-stack-server
|
||||||
|
systemctl enable -q --now redis-stack-server
|
||||||
|
msg_ok "Installed Redis Stack"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "anytype" "grishy/any-sync-bundle" "prebuild" "latest" "/opt/anytype" "any-sync-bundle_*_linux_amd64.tar.gz"
|
||||||
|
chmod +x /opt/anytype/any-sync-bundle
|
||||||
|
|
||||||
|
msg_info "Configuring Anytype"
|
||||||
|
mkdir -p /opt/anytype/data/storage
|
||||||
|
cat <<EOF >/opt/anytype/.env
|
||||||
|
ANY_SYNC_BUNDLE_CONFIG=/opt/anytype/data/bundle-config.yml
|
||||||
|
ANY_SYNC_BUNDLE_CLIENT_CONFIG=/opt/anytype/data/client-config.yml
|
||||||
|
ANY_SYNC_BUNDLE_INIT_STORAGE=/opt/anytype/data/storage/
|
||||||
|
ANY_SYNC_BUNDLE_INIT_EXTERNAL_ADDRS=${LOCAL_IP}
|
||||||
|
ANY_SYNC_BUNDLE_INIT_MONGO_URI=mongodb://127.0.0.1:27017/
|
||||||
|
ANY_SYNC_BUNDLE_INIT_REDIS_URI=redis://127.0.0.1:6379/
|
||||||
|
ANY_SYNC_BUNDLE_LOG_LEVEL=info
|
||||||
|
EOF
|
||||||
|
msg_ok "Configured Anytype"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/anytype.service
|
||||||
|
[Unit]
|
||||||
|
Description=Anytype Sync Server (any-sync-bundle)
|
||||||
|
After=network-online.target mongod.service redis-stack-server.service
|
||||||
|
Wants=network-online.target
|
||||||
|
Requires=mongod.service redis-stack-server.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=/opt/anytype
|
||||||
|
EnvironmentFile=/opt/anytype/.env
|
||||||
|
ExecStart=/opt/anytype/any-sync-bundle start-bundle
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=10
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now anytype
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
107
install/authelia-install.sh
Normal file
107
install/authelia-install.sh
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: thost96 (thost96)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://www.authelia.com/
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "authelia" "authelia/authelia" "binary"
|
||||||
|
|
||||||
|
MAX_ATTEMPTS=3
|
||||||
|
attempt=0
|
||||||
|
while true; do
|
||||||
|
attempt=$((attempt + 1))
|
||||||
|
read -rp "${TAB3}Enter your domain or IP (ex. example.com or 192.168.1.100): " DOMAIN
|
||||||
|
if [[ -z "$DOMAIN" ]]; then
|
||||||
|
if ((attempt >= MAX_ATTEMPTS)); then
|
||||||
|
DOMAIN="${LOCAL_IP:-localhost}"
|
||||||
|
msg_warn "Using fallback: $DOMAIN"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
msg_warn "Domain cannot be empty! (Attempt $attempt/$MAX_ATTEMPTS)"
|
||||||
|
elif [[ "$DOMAIN" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then
|
||||||
|
valid_ip=true
|
||||||
|
IFS='.' read -ra octets <<< "$DOMAIN"
|
||||||
|
for octet in "${octets[@]}"; do
|
||||||
|
if ((octet > 255)); then
|
||||||
|
valid_ip=false
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if $valid_ip; then
|
||||||
|
break
|
||||||
|
else
|
||||||
|
msg_warn "Invalid IP address!"
|
||||||
|
fi
|
||||||
|
elif [[ "$DOMAIN" =~ ^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*\.[a-zA-Z]{2,}$ ]]; then
|
||||||
|
break
|
||||||
|
else
|
||||||
|
msg_warn "Invalid domain format!"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
msg_info "Setting Authelia up"
|
||||||
|
touch /etc/authelia/emails.txt
|
||||||
|
JWT_SECRET=$(openssl rand -hex 64)
|
||||||
|
SESSION_SECRET=$(openssl rand -hex 64)
|
||||||
|
STORAGE_KEY=$(openssl rand -hex 64)
|
||||||
|
|
||||||
|
if [[ "$DOMAIN" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then
|
||||||
|
AUTHELIA_URL="https://${DOMAIN}:9091"
|
||||||
|
else
|
||||||
|
AUTHELIA_URL="https://auth.${DOMAIN}"
|
||||||
|
fi
|
||||||
|
echo "$AUTHELIA_URL" > /etc/authelia/.authelia_url
|
||||||
|
|
||||||
|
cat <<EOF >/etc/authelia/users.yml
|
||||||
|
users:
|
||||||
|
authelia:
|
||||||
|
disabled: false
|
||||||
|
displayname: "Authelia Admin"
|
||||||
|
password: "\$argon2id\$v=19\$m=65536,t=3,p=4\$ZBopMzXrzhHXPEZxRDVT2w\$SxWm96DwhOsZyn34DLocwQEIb4kCDsk632PuiMdZnig"
|
||||||
|
groups: []
|
||||||
|
EOF
|
||||||
|
cat <<EOF >/etc/authelia/configuration.yml
|
||||||
|
authentication_backend:
|
||||||
|
file:
|
||||||
|
path: /etc/authelia/users.yml
|
||||||
|
access_control:
|
||||||
|
default_policy: one_factor
|
||||||
|
session:
|
||||||
|
secret: "${SESSION_SECRET}"
|
||||||
|
name: 'authelia_session'
|
||||||
|
same_site: 'lax'
|
||||||
|
inactivity: '5m'
|
||||||
|
expiration: '1h'
|
||||||
|
remember_me: '1M'
|
||||||
|
cookies:
|
||||||
|
- domain: "${DOMAIN}"
|
||||||
|
authelia_url: "${AUTHELIA_URL}"
|
||||||
|
storage:
|
||||||
|
encryption_key: "${STORAGE_KEY}"
|
||||||
|
local:
|
||||||
|
path: /etc/authelia/db.sqlite
|
||||||
|
identity_validation:
|
||||||
|
reset_password:
|
||||||
|
jwt_secret: "${JWT_SECRET}"
|
||||||
|
jwt_lifespan: '5 minutes'
|
||||||
|
jwt_algorithm: 'HS256'
|
||||||
|
notifier:
|
||||||
|
filesystem:
|
||||||
|
filename: /etc/authelia/emails.txt
|
||||||
|
EOF
|
||||||
|
touch /etc/authelia/emails.txt
|
||||||
|
chown -R authelia:authelia /etc/authelia
|
||||||
|
systemctl enable -q --now authelia
|
||||||
|
msg_ok "Authelia Setup completed"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
93
install/checkmate-install.sh
Normal file
93
install/checkmate-install.sh
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: MickLesk (CanbiZ)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/bluewave-labs/Checkmate
|
||||||
|
|
||||||
|
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 \
|
||||||
|
build-essential \
|
||||||
|
openssl
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
MONGO_VERSION="8.0" setup_mongodb
|
||||||
|
NODE_VERSION="22" setup_nodejs
|
||||||
|
fetch_and_deploy_gh_release "checkmate" "bluewave-labs/Checkmate"
|
||||||
|
|
||||||
|
msg_info "Installing Checkmate Server"
|
||||||
|
cd /opt/checkmate/server
|
||||||
|
$STD npm install
|
||||||
|
msg_ok "Installed Checkmate Server"
|
||||||
|
|
||||||
|
msg_info "Installing Checkmate Client"
|
||||||
|
cd /opt/checkmate/client
|
||||||
|
$STD npm install
|
||||||
|
$STD npm run build
|
||||||
|
msg_ok "Installed Checkmate Client"
|
||||||
|
|
||||||
|
msg_info "Configuring Checkmate"
|
||||||
|
JWT_SECRET="$(openssl rand -hex 32)"
|
||||||
|
cat <<EOF >/opt/checkmate/server/.env
|
||||||
|
CLIENT_HOST="http://${LOCAL_IP}:5173"
|
||||||
|
JWT_SECRET="${JWT_SECRET}"
|
||||||
|
DB_CONNECTION_STRING="mongodb://localhost:27017/checkmate_db"
|
||||||
|
TOKEN_TTL="99d"
|
||||||
|
ORIGIN="${LOCAL_IP}"
|
||||||
|
LOG_LEVEL="info"
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat <<EOF >/opt/checkmate/client/.env
|
||||||
|
VITE_APP_API_BASE_URL="http://${LOCAL_IP}:52345/api/v1"
|
||||||
|
VITE_APP_LOG_LEVEL="warn"
|
||||||
|
EOF
|
||||||
|
msg_ok "Configured Checkmate"
|
||||||
|
|
||||||
|
msg_info "Creating Services"
|
||||||
|
cat <<EOF >/etc/systemd/system/checkmate-server.service
|
||||||
|
[Unit]
|
||||||
|
Description=Checkmate Server
|
||||||
|
After=network.target mongod.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
WorkingDirectory=/opt/checkmate/server
|
||||||
|
EnvironmentFile=/opt/checkmate/server/.env
|
||||||
|
ExecStart=/usr/bin/npm start
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat <<EOF >/etc/systemd/system/checkmate-client.service
|
||||||
|
[Unit]
|
||||||
|
Description=Checkmate Client
|
||||||
|
After=network.target checkmate-server.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
WorkingDirectory=/opt/checkmate/client
|
||||||
|
EnvironmentFile=/opt/checkmate/client/.env
|
||||||
|
ExecStart=/usr/bin/npm run preview -- --host 0.0.0.0 --port 5173
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now checkmate-server checkmate-client
|
||||||
|
msg_ok "Created Services"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
31
install/clawdbot-install.sh
Normal file
31
install/clawdbot-install.sh
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: michelroegl-brunner
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/clawdbot/clawdbot
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
$STD apt install -y \
|
||||||
|
build-essential \
|
||||||
|
git
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
|
||||||
|
NODE_VERSION="24" NODE_MODULE="pnpm@latest" setup_nodejs
|
||||||
|
|
||||||
|
curl -fsSL https://clawd.bot/install.sh | bash
|
||||||
|
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
|
|
||||||
@ -14,12 +14,12 @@ network_check
|
|||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
msg_info "Installing Dependencies"
|
||||||
$STD apt install -y nginx
|
$STD apt install -y \
|
||||||
|
nginx \
|
||||||
|
valkey
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
import_local_ip
|
|
||||||
PG_VERSION="17" setup_postgresql
|
PG_VERSION="17" setup_postgresql
|
||||||
PG_DB_NAME="databasus" PG_DB_USER="databasus" setup_postgresql_db
|
|
||||||
setup_go
|
setup_go
|
||||||
NODE_VERSION="24" setup_nodejs
|
NODE_VERSION="24" setup_nodejs
|
||||||
|
|
||||||
@ -36,19 +36,17 @@ $STD go install github.com/swaggo/swag/cmd/swag@latest
|
|||||||
$STD /root/go/bin/swag init -g cmd/main.go -o swagger
|
$STD /root/go/bin/swag init -g cmd/main.go -o swagger
|
||||||
$STD env CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o databasus ./cmd/main.go
|
$STD env CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o databasus ./cmd/main.go
|
||||||
mv /opt/databasus/backend/databasus /opt/databasus/databasus
|
mv /opt/databasus/backend/databasus /opt/databasus/databasus
|
||||||
mkdir -p /opt/databasus_data/{data,backups,logs}
|
mkdir -p /databasus-data/{pgdata,temp,backups,data,logs}
|
||||||
mkdir -p /databasus-data/temp
|
|
||||||
mkdir -p /opt/databasus/ui/build
|
mkdir -p /opt/databasus/ui/build
|
||||||
|
mkdir -p /opt/databasus/migrations
|
||||||
cp -r /opt/databasus/frontend/dist/* /opt/databasus/ui/build/
|
cp -r /opt/databasus/frontend/dist/* /opt/databasus/ui/build/
|
||||||
cp -r /opt/databasus/backend/migrations /opt/databasus/
|
cp -r /opt/databasus/backend/migrations/* /opt/databasus/migrations/
|
||||||
chown -R postgres:postgres /opt/databasus
|
|
||||||
chown -R postgres:postgres /opt/databasus_data
|
|
||||||
chown -R postgres:postgres /databasus-data
|
chown -R postgres:postgres /databasus-data
|
||||||
msg_ok "Built Databasus"
|
msg_ok "Built Databasus"
|
||||||
|
|
||||||
msg_info "Configuring Databasus"
|
msg_info "Configuring Databasus"
|
||||||
ADMIN_PASS=$(openssl rand -base64 12)
|
|
||||||
JWT_SECRET=$(openssl rand -hex 32)
|
JWT_SECRET=$(openssl rand -hex 32)
|
||||||
|
ENCRYPTION_KEY=$(openssl rand -hex 32)
|
||||||
|
|
||||||
# Create PostgreSQL version symlinks for compatibility
|
# Create PostgreSQL version symlinks for compatibility
|
||||||
for v in 12 13 14 15 16 18; do
|
for v in 12 13 14 15 16 18; do
|
||||||
@ -67,50 +65,67 @@ ENV_MODE=production
|
|||||||
SERVER_PORT=4005
|
SERVER_PORT=4005
|
||||||
SERVER_HOST=0.0.0.0
|
SERVER_HOST=0.0.0.0
|
||||||
|
|
||||||
# Database (Internal PostgreSQL for app data)
|
# Database
|
||||||
DATABASE_DSN=host=localhost user=${PG_DB_USER} password=${PG_DB_PASS} dbname=${PG_DB_NAME} port=5432 sslmode=disable
|
DATABASE_DSN=host=localhost user=postgres password=postgres dbname=databasus port=5432 sslmode=disable
|
||||||
DATABASE_URL=postgres://${PG_DB_USER}:${PG_DB_PASS}@localhost:5432/${PG_DB_NAME}?sslmode=disable
|
DATABASE_URL=postgres://postgres:postgres@localhost:5432/databasus?sslmode=disable
|
||||||
|
|
||||||
# Migrations
|
# Migrations
|
||||||
GOOSE_DRIVER=postgres
|
GOOSE_DRIVER=postgres
|
||||||
GOOSE_DBSTRING=postgres://${PG_DB_USER}:${PG_DB_PASS}@localhost:5432/${PG_DB_NAME}?sslmode=disable
|
GOOSE_DBSTRING=postgres://postgres:postgres@localhost:5432/databasus?sslmode=disable
|
||||||
GOOSE_MIGRATION_DIR=/opt/databasus/migrations
|
GOOSE_MIGRATION_DIR=/opt/databasus/migrations
|
||||||
|
|
||||||
|
# Valkey (Redis-compatible cache)
|
||||||
|
VALKEY_HOST=localhost
|
||||||
|
VALKEY_PORT=6379
|
||||||
|
|
||||||
# Security
|
# Security
|
||||||
JWT_SECRET=${JWT_SECRET}
|
JWT_SECRET=${JWT_SECRET}
|
||||||
ENCRYPTION_KEY=$(openssl rand -hex 32)
|
ENCRYPTION_KEY=${ENCRYPTION_KEY}
|
||||||
|
|
||||||
# Admin User
|
|
||||||
ADMIN_EMAIL=admin@localhost
|
|
||||||
ADMIN_PASSWORD=${ADMIN_PASS}
|
|
||||||
|
|
||||||
# Paths
|
# Paths
|
||||||
DATA_DIR=/opt/databasus_data/data
|
DATA_DIR=/databasus-data/data
|
||||||
BACKUP_DIR=/opt/databasus_data/backups
|
BACKUP_DIR=/databasus-data/backups
|
||||||
LOG_DIR=/opt/databasus_data/logs
|
LOG_DIR=/databasus-data/logs
|
||||||
|
|
||||||
# PostgreSQL Tools (for creating backups)
|
|
||||||
PG_DUMP_PATH=/usr/lib/postgresql/17/bin/pg_dump
|
|
||||||
PG_RESTORE_PATH=/usr/lib/postgresql/17/bin/pg_restore
|
|
||||||
PSQL_PATH=/usr/lib/postgresql/17/bin/psql
|
|
||||||
EOF
|
EOF
|
||||||
chown postgres:postgres /opt/databasus/.env
|
chown postgres:postgres /opt/databasus/.env
|
||||||
chmod 600 /opt/databasus/.env
|
chmod 600 /opt/databasus/.env
|
||||||
msg_ok "Configured Databasus"
|
msg_ok "Configured Databasus"
|
||||||
|
|
||||||
|
msg_info "Configuring Valkey"
|
||||||
|
cat >/etc/valkey/valkey.conf <<EOF
|
||||||
|
port 6379
|
||||||
|
bind 127.0.0.1
|
||||||
|
protected-mode yes
|
||||||
|
save ""
|
||||||
|
maxmemory 256mb
|
||||||
|
maxmemory-policy allkeys-lru
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now valkey-server
|
||||||
|
systemctl restart valkey-server
|
||||||
|
msg_ok "Configured Valkey"
|
||||||
|
|
||||||
|
msg_info "Creating Database"
|
||||||
|
# Configure PostgreSQL to allow local password auth for databasus
|
||||||
|
PG_HBA="/etc/postgresql/17/main/pg_hba.conf"
|
||||||
|
if ! grep -q "databasus" "$PG_HBA"; then
|
||||||
|
sed -i '/^local\s*all\s*all/i local databasus postgres trust' "$PG_HBA"
|
||||||
|
sed -i '/^host\s*all\s*all\s*127/i host databasus postgres 127.0.0.1/32 trust' "$PG_HBA"
|
||||||
|
systemctl reload postgresql
|
||||||
|
fi
|
||||||
|
$STD sudo -u postgres psql -c "CREATE DATABASE databasus;" 2>/dev/null || true
|
||||||
|
$STD sudo -u postgres psql -c "ALTER USER postgres WITH SUPERUSER CREATEROLE CREATEDB;" 2>/dev/null || true
|
||||||
|
msg_ok "Created Database"
|
||||||
|
|
||||||
msg_info "Creating Databasus Service"
|
msg_info "Creating Databasus Service"
|
||||||
cat <<EOF >/etc/systemd/system/databasus.service
|
cat <<EOF >/etc/systemd/system/databasus.service
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=Databasus - PostgreSQL Backup Management
|
Description=Databasus - Database Backup Management
|
||||||
After=network.target postgresql.service
|
After=network.target postgresql.service valkey.service
|
||||||
Requires=postgresql.service
|
Requires=postgresql.service valkey.service
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
User=postgres
|
|
||||||
Group=postgres
|
|
||||||
WorkingDirectory=/opt/databasus
|
WorkingDirectory=/opt/databasus
|
||||||
Environment="PATH=/usr/local/bin:/usr/bin:/bin"
|
|
||||||
EnvironmentFile=/opt/databasus/.env
|
EnvironmentFile=/opt/databasus/.env
|
||||||
ExecStart=/opt/databasus/databasus
|
ExecStart=/opt/databasus/databasus
|
||||||
Restart=always
|
Restart=always
|
||||||
|
|||||||
@ -1,173 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: MickLesk (CanbiZ)
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/Freika/dawarich
|
|
||||||
|
|
||||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
|
||||||
color
|
|
||||||
verb_ip6
|
|
||||||
catch_errors
|
|
||||||
setting_up_container
|
|
||||||
network_check
|
|
||||||
update_os
|
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
|
||||||
$STD apt install -y \
|
|
||||||
build-essential \
|
|
||||||
git \
|
|
||||||
libpq-dev \
|
|
||||||
libgeos-dev \
|
|
||||||
libyaml-dev \
|
|
||||||
libffi-dev \
|
|
||||||
libssl-dev \
|
|
||||||
libjemalloc2 \
|
|
||||||
imagemagick \
|
|
||||||
libmagickwand-dev \
|
|
||||||
libvips-dev \
|
|
||||||
cmake \
|
|
||||||
redis-server \
|
|
||||||
nginx
|
|
||||||
msg_ok "Installed Dependencies"
|
|
||||||
|
|
||||||
PG_VERSION="17" PG_MODULES="postgis-3" setup_postgresql
|
|
||||||
PG_DB_NAME="dawarich_db" PG_DB_USER="dawarich" PG_DB_EXTENSIONS="postgis" setup_postgresql_db
|
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "dawarich" "Freika/dawarich" "tarball" "latest" "/opt/dawarich/app"
|
|
||||||
|
|
||||||
msg_info "Setting up Directories"
|
|
||||||
mkdir -p /opt/dawarich/app/{storage,log,tmp/pids,tmp/cache,tmp/sockets}
|
|
||||||
msg_ok "Set up Directories"
|
|
||||||
|
|
||||||
msg_info "Configuring Environment"
|
|
||||||
SECRET_KEY_BASE=$(openssl rand -hex 64)
|
|
||||||
RELEASE=$(get_latest_github_release "Freika/dawarich")
|
|
||||||
cat <<EOF >/opt/dawarich/.env
|
|
||||||
RAILS_ENV=production
|
|
||||||
SECRET_KEY_BASE=${SECRET_KEY_BASE}
|
|
||||||
DATABASE_HOST=localhost
|
|
||||||
DATABASE_USERNAME=${PG_DB_USER}
|
|
||||||
DATABASE_PASSWORD=${PG_DB_PASS}
|
|
||||||
DATABASE_NAME=${PG_DB_NAME}
|
|
||||||
REDIS_URL=redis://127.0.0.1:6379/0
|
|
||||||
BACKGROUND_PROCESSING_CONCURRENCY=10
|
|
||||||
APPLICATION_HOST=${LOCAL_IP}
|
|
||||||
APPLICATION_HOSTS=${LOCAL_IP},localhost
|
|
||||||
TIME_ZONE=UTC
|
|
||||||
DISABLE_TELEMETRY=true
|
|
||||||
APP_VERSION=${RELEASE}
|
|
||||||
EOF
|
|
||||||
msg_ok "Configured Environment"
|
|
||||||
|
|
||||||
NODE_VERSION="22" setup_nodejs
|
|
||||||
RUBY_VERSION=$(cat /opt/dawarich/app/.ruby-version 2>/dev/null || echo "3.4.6")
|
|
||||||
RUBY_VERSION=${RUBY_VERSION} RUBY_INSTALL_RAILS="false" setup_ruby
|
|
||||||
|
|
||||||
msg_info "Installing Dawarich"
|
|
||||||
cd /opt/dawarich/app
|
|
||||||
source /root/.profile
|
|
||||||
export PATH="/root/.rbenv/shims:/root/.rbenv/bin:$PATH"
|
|
||||||
eval "$(/root/.rbenv/bin/rbenv init - bash)"
|
|
||||||
set -a && source /opt/dawarich/.env && set +a
|
|
||||||
$STD gem install bundler
|
|
||||||
$STD bundle config set --local deployment 'true'
|
|
||||||
$STD bundle config set --local without 'development test'
|
|
||||||
$STD bundle install
|
|
||||||
if [[ -f /opt/dawarich/package.json ]]; then
|
|
||||||
cd /opt/dawarich
|
|
||||||
$STD npm install
|
|
||||||
cd /opt/dawarich/app
|
|
||||||
elif [[ -f /opt/dawarich/app/package.json ]]; then
|
|
||||||
$STD npm install
|
|
||||||
fi
|
|
||||||
$STD bundle exec rake assets:precompile
|
|
||||||
$STD bundle exec rails db:prepare
|
|
||||||
$STD bundle exec rake data:migrate
|
|
||||||
msg_ok "Installed Dawarich"
|
|
||||||
|
|
||||||
msg_info "Creating Services"
|
|
||||||
cat <<EOF >/etc/systemd/system/dawarich-web.service
|
|
||||||
[Unit]
|
|
||||||
Description=Dawarich Web Server
|
|
||||||
After=network.target postgresql.service redis-server.service
|
|
||||||
Requires=postgresql.service redis-server.service
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
WorkingDirectory=/opt/dawarich/app
|
|
||||||
EnvironmentFile=/opt/dawarich/.env
|
|
||||||
ExecStart=/root/.rbenv/shims/bundle exec puma -C config/puma.rb
|
|
||||||
Restart=always
|
|
||||||
RestartSec=5
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
EOF
|
|
||||||
|
|
||||||
cat <<EOF >/etc/systemd/system/dawarich-worker.service
|
|
||||||
[Unit]
|
|
||||||
Description=Dawarich Sidekiq Worker
|
|
||||||
After=network.target postgresql.service redis-server.service
|
|
||||||
Requires=postgresql.service redis-server.service
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
WorkingDirectory=/opt/dawarich/app
|
|
||||||
EnvironmentFile=/opt/dawarich/.env
|
|
||||||
ExecStart=/root/.rbenv/shims/bundle exec sidekiq -C config/sidekiq.yml
|
|
||||||
Restart=always
|
|
||||||
RestartSec=5
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
EOF
|
|
||||||
|
|
||||||
systemctl enable -q --now redis-server dawarich-web dawarich-worker
|
|
||||||
msg_ok "Created Services"
|
|
||||||
|
|
||||||
msg_info "Configuring Nginx"
|
|
||||||
cat <<EOF >/etc/nginx/sites-available/dawarich.conf
|
|
||||||
upstream dawarich {
|
|
||||||
server 127.0.0.1:3000;
|
|
||||||
}
|
|
||||||
|
|
||||||
server {
|
|
||||||
listen 80;
|
|
||||||
server_name _;
|
|
||||||
|
|
||||||
root /opt/dawarich/app/public;
|
|
||||||
client_max_body_size 100M;
|
|
||||||
|
|
||||||
location ~ ^/(assets|packs)/ {
|
|
||||||
expires max;
|
|
||||||
add_header Cache-Control "public, immutable";
|
|
||||||
try_files \$uri =404;
|
|
||||||
}
|
|
||||||
|
|
||||||
location / {
|
|
||||||
try_files \$uri @rails;
|
|
||||||
}
|
|
||||||
|
|
||||||
location @rails {
|
|
||||||
proxy_pass http://dawarich;
|
|
||||||
proxy_http_version 1.1;
|
|
||||||
proxy_set_header Host \$host;
|
|
||||||
proxy_set_header X-Real-IP \$remote_addr;
|
|
||||||
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
|
|
||||||
proxy_set_header X-Forwarded-Proto \$scheme;
|
|
||||||
proxy_set_header Upgrade \$http_upgrade;
|
|
||||||
proxy_set_header Connection "upgrade";
|
|
||||||
proxy_redirect off;
|
|
||||||
proxy_buffering off;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
ln -sf /etc/nginx/sites-available/dawarich.conf /etc/nginx/sites-enabled/
|
|
||||||
rm -f /etc/nginx/sites-enabled/default
|
|
||||||
systemctl enable -q --now nginx
|
|
||||||
msg_ok "Configured Nginx"
|
|
||||||
|
|
||||||
motd_ssh
|
|
||||||
customize
|
|
||||||
cleanup_lxc
|
|
||||||
@ -14,7 +14,7 @@ update_os
|
|||||||
|
|
||||||
msg_info "Setup Functions"
|
msg_info "Setup Functions"
|
||||||
setup_local_ip_helper
|
setup_local_ip_helper
|
||||||
import_local_ip
|
|
||||||
msg_ok "Setup Functions"
|
msg_ok "Setup Functions"
|
||||||
|
|
||||||
msg_info "Installing Dependencies (Patience)"
|
msg_info "Installing Dependencies (Patience)"
|
||||||
|
|||||||
30
install/ebusd-install.sh
Normal file
30
install/ebusd-install.sh
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: Joerg Heinemann (heinemannj)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/john30/ebusd
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
setup_deb822_repo \
|
||||||
|
"ebusd" \
|
||||||
|
"https://raw.githubusercontent.com/john30/ebusd-debian/master/ebusd.gpg" \
|
||||||
|
"https://repo.ebusd.eu/apt/default/bookworm/" \
|
||||||
|
"bookworm" \
|
||||||
|
"main"
|
||||||
|
|
||||||
|
msg_info "Installing ebusd"
|
||||||
|
$STD apt install -y ebusd
|
||||||
|
systemctl enable -q ebusd
|
||||||
|
msg_ok "Installed ebusd"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
@ -28,7 +28,7 @@ setup_go
|
|||||||
NODE_VERSION="24" NODE_MODULE="yarn" setup_nodejs
|
NODE_VERSION="24" NODE_MODULE="yarn" setup_nodejs
|
||||||
RUST_CRATES="wasm-pack" setup_rust
|
RUST_CRATES="wasm-pack" setup_rust
|
||||||
$STD rustup target add wasm32-unknown-unknown
|
$STD rustup target add wasm32-unknown-unknown
|
||||||
import_local_ip
|
|
||||||
|
|
||||||
ENTE_CLI_VERSION=$(curl -s https://api.github.com/repos/ente-io/ente/releases | jq -r '[.[] | select(.tag_name | startswith("cli-v"))][0].tag_name')
|
ENTE_CLI_VERSION=$(curl -s https://api.github.com/repos/ente-io/ente/releases | jq -r '[.[] | select(.tag_name | startswith("cli-v"))][0].tag_name')
|
||||||
fetch_and_deploy_gh_release "ente-server" "ente-io/ente" "tarball" "latest" "/opt/ente"
|
fetch_and_deploy_gh_release "ente-server" "ente-io/ente" "tarball" "latest" "/opt/ente"
|
||||||
|
|||||||
@ -12,19 +12,19 @@ setting_up_container
|
|||||||
network_check
|
network_check
|
||||||
update_os
|
update_os
|
||||||
|
|
||||||
if [[ -z "$var_forgejo_instance" ]]; then
|
# Get required configuration with sensible fallbacks for unattended mode
|
||||||
read -rp "Forgejo Instance URL (e.g. https://code.forgejo.org): " var_forgejo_instance
|
# These will show a warning if defaults are used
|
||||||
fi
|
var_forgejo_instance=$(prompt_input_required \
|
||||||
|
"Forgejo Instance URL:" \
|
||||||
|
"${var_forgejo_instance:-https://codeberg.org}" \
|
||||||
|
120 \
|
||||||
|
"var_forgejo_instance")
|
||||||
|
|
||||||
if [[ -z "$var_forgejo_runner_token" ]]; then
|
var_forgejo_runner_token=$(prompt_input_required \
|
||||||
read -rp "Forgejo Runner Registration Token: " var_forgejo_runner_token
|
"Forgejo Runner Registration Token:" \
|
||||||
echo
|
"${var_forgejo_runner_token:-REPLACE_WITH_YOUR_TOKEN}" \
|
||||||
fi
|
120 \
|
||||||
|
"var_forgejo_runner_token")
|
||||||
if [[ -z "$var_forgejo_instance" || -z "$var_forgejo_runner_token" ]]; then
|
|
||||||
echo "❌ Forgejo instance URL and runner token are required."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
export FORGEJO_INSTANCE="$var_forgejo_instance"
|
export FORGEJO_INSTANCE="$var_forgejo_instance"
|
||||||
export FORGEJO_RUNNER_TOKEN="$var_forgejo_runner_token"
|
export FORGEJO_RUNNER_TOKEN="$var_forgejo_runner_token"
|
||||||
@ -78,6 +78,9 @@ EOF
|
|||||||
systemctl enable -q --now forgejo-runner
|
systemctl enable -q --now forgejo-runner
|
||||||
msg_ok "Created Services"
|
msg_ok "Created Services"
|
||||||
|
|
||||||
|
# Show warning if any required values used fallbacks
|
||||||
|
show_missing_values_warning
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
customize
|
customize
|
||||||
cleanup_lxc
|
cleanup_lxc
|
||||||
|
|||||||
@ -7,7 +7,6 @@
|
|||||||
# Source: https://frigate.video/
|
# Source: https://frigate.video/
|
||||||
|
|
||||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
set +e
|
|
||||||
color
|
color
|
||||||
verb_ip6
|
verb_ip6
|
||||||
catch_errors
|
catch_errors
|
||||||
@ -15,48 +14,80 @@ setting_up_container
|
|||||||
network_check
|
network_check
|
||||||
update_os
|
update_os
|
||||||
|
|
||||||
cat <<'EOF' >/etc/apt/sources.list.d/debian.sources
|
source /etc/os-release
|
||||||
Types: deb deb-src
|
if [[ "$VERSION_ID" != "12" ]]; then
|
||||||
URIs: http://deb.debian.org/debian
|
msg_error "Frigate requires Debian 12 (Bookworm) due to Python 3.11 dependencies"
|
||||||
Suites: bookworm
|
exit 1
|
||||||
Components: main contrib non-free non-free-firmware
|
|
||||||
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
|
|
||||||
|
|
||||||
Types: deb deb-src
|
|
||||||
URIs: http://deb.debian.org/debian
|
|
||||||
Suites: bookworm-updates
|
|
||||||
Components: main contrib non-free non-free-firmware
|
|
||||||
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
|
|
||||||
|
|
||||||
Types: deb deb-src
|
|
||||||
URIs: http://security.debian.org
|
|
||||||
Suites: bookworm-security
|
|
||||||
Components: main contrib non-free non-free-firmware
|
|
||||||
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
|
|
||||||
EOF
|
|
||||||
rm -f /etc/apt/sources.list
|
|
||||||
|
|
||||||
msg_info "Installing system dependencies"
|
|
||||||
$STD apt-get install -y jq wget xz-utils python3 python3-dev python3-pip gcc pkg-config libhdf5-dev unzip build-essential automake libtool ccache libusb-1.0-0-dev apt-transport-https cmake git libgtk-3-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libjpeg-dev libpng-dev libtiff-dev gfortran openexr libssl-dev libtbbmalloc2 libtbb-dev libdc1394-dev libopenexr-dev libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev tclsh libopenblas-dev liblapack-dev make moreutils
|
|
||||||
msg_ok "System dependencies installed"
|
|
||||||
|
|
||||||
setup_hwaccel
|
|
||||||
|
|
||||||
if [[ "$CTTYPE" == "0" ]]; then
|
|
||||||
msg_info "Configuring render group for privileged container"
|
|
||||||
sed -i -e 's/^kvm:x:104:$/render:x:104:root,frigate/' -e 's/^render:x:105:root$/kvm:x:105:/' /etc/group
|
|
||||||
msg_ok "Privileged container GPU access configured"
|
|
||||||
else
|
|
||||||
msg_info "Configuring render group for unprivileged container"
|
|
||||||
sed -i -e 's/^kvm:x:104:$/render:x:104:frigate/' -e 's/^render:x:105:$/kvm:x:105:/' /etc/group
|
|
||||||
msg_ok "Unprivileged container GPU access configured"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
$STD apt-get install -y \
|
||||||
|
jq \
|
||||||
|
wget \
|
||||||
|
xz-utils \
|
||||||
|
python3 \
|
||||||
|
python3-dev \
|
||||||
|
python3-pip \
|
||||||
|
gcc \
|
||||||
|
pkg-config \
|
||||||
|
libhdf5-dev \
|
||||||
|
unzip \
|
||||||
|
build-essential \
|
||||||
|
automake \
|
||||||
|
libtool \
|
||||||
|
ccache \
|
||||||
|
libusb-1.0-0-dev \
|
||||||
|
apt-transport-https \
|
||||||
|
cmake \
|
||||||
|
git \
|
||||||
|
libgtk-3-dev \
|
||||||
|
libavcodec-dev \
|
||||||
|
libavformat-dev \
|
||||||
|
libswscale-dev \
|
||||||
|
libv4l-dev \
|
||||||
|
libxvidcore-dev \
|
||||||
|
libx264-dev \
|
||||||
|
libjpeg-dev \
|
||||||
|
libpng-dev \
|
||||||
|
libtiff-dev \
|
||||||
|
gfortran \
|
||||||
|
openexr \
|
||||||
|
libssl-dev \
|
||||||
|
libtbbmalloc2 \
|
||||||
|
libtbb-dev \
|
||||||
|
libdc1394-dev \
|
||||||
|
libopenexr-dev \
|
||||||
|
libgstreamer-plugins-base1.0-dev \
|
||||||
|
libgstreamer1.0-dev \
|
||||||
|
tclsh \
|
||||||
|
libopenblas-dev \
|
||||||
|
liblapack-dev \
|
||||||
|
make \
|
||||||
|
moreutils
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
msg_info "Setting Up Hardware Acceleration"
|
||||||
|
# Use Debian 12 native packages instead of setup_hwaccel (Intel Arc latest drivers require Debian 13)
|
||||||
|
$STD apt-get install -y \
|
||||||
|
vainfo \
|
||||||
|
intel-media-va-driver-non-free \
|
||||||
|
intel-gpu-tools \
|
||||||
|
mesa-va-drivers \
|
||||||
|
mesa-vulkan-drivers || true
|
||||||
|
msg_ok "Set Up Hardware Acceleration"
|
||||||
|
|
||||||
|
msg_info "Configuring GPU Access"
|
||||||
|
if [[ "$CTTYPE" == "0" ]]; then
|
||||||
|
sed -i -e 's/^kvm:x:104:$/render:x:104:root,frigate/' -e 's/^render:x:105:root$/kvm:x:105:/' /etc/group
|
||||||
|
else
|
||||||
|
sed -i -e 's/^kvm:x:104:$/render:x:104:frigate/' -e 's/^render:x:105:$/kvm:x:105:/' /etc/group
|
||||||
|
fi
|
||||||
|
msg_ok "Configured GPU Access"
|
||||||
|
|
||||||
export TARGETARCH="amd64"
|
export TARGETARCH="amd64"
|
||||||
export CCACHE_DIR=/root/.ccache
|
export CCACHE_DIR=/root/.ccache
|
||||||
export CCACHE_MAXSIZE=2G
|
export CCACHE_MAXSIZE=2G
|
||||||
export APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=DontWarn
|
export APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=DontWarn
|
||||||
export DEBIAN_FRONTEND=noninteractive
|
|
||||||
export PIP_BREAK_SYSTEM_PACKAGES=1
|
export PIP_BREAK_SYSTEM_PACKAGES=1
|
||||||
export NVIDIA_VISIBLE_DEVICES=all
|
export NVIDIA_VISIBLE_DEVICES=all
|
||||||
export NVIDIA_DRIVER_CAPABILITIES="compute,video,utility"
|
export NVIDIA_DRIVER_CAPABILITIES="compute,video,utility"
|
||||||
@ -67,91 +98,73 @@ export HAILORT_LOGGER_PATH=NONE
|
|||||||
|
|
||||||
fetch_and_deploy_gh_release "frigate" "blakeblackshear/frigate" "tarball" "latest" "/opt/frigate"
|
fetch_and_deploy_gh_release "frigate" "blakeblackshear/frigate" "tarball" "latest" "/opt/frigate"
|
||||||
|
|
||||||
msg_info "Building Nginx with custom modules"
|
msg_info "Building Nginx"
|
||||||
#sed -i 's|if.*"$VERSION_ID" == "12".*|if [[ "$VERSION_ID" =~ ^(12|13)$ ]]; then|g' /opt/frigate/docker/main/build_nginx.sh
|
|
||||||
$STD bash /opt/frigate/docker/main/build_nginx.sh
|
$STD bash /opt/frigate/docker/main/build_nginx.sh
|
||||||
sed -e '/s6-notifyoncheck/ s/^#*/#/' -i /opt/frigate/docker/main/rootfs/etc/s6-overlay/s6-rc.d/nginx/run
|
sed -e '/s6-notifyoncheck/ s/^#*/#/' -i /opt/frigate/docker/main/rootfs/etc/s6-overlay/s6-rc.d/nginx/run
|
||||||
ln -sf /usr/local/nginx/sbin/nginx /usr/local/bin/nginx
|
ln -sf /usr/local/nginx/sbin/nginx /usr/local/bin/nginx
|
||||||
msg_ok "Nginx built successfully"
|
msg_ok "Built Nginx"
|
||||||
|
|
||||||
msg_info "Building SQLite with custom modules"
|
msg_info "Building SQLite Extensions"
|
||||||
#sed -i 's|if.*"$VERSION_ID" == "12".*|if [[ "$VERSION_ID" =~ ^(12|13)$ ]]; then|g' /opt/frigate/docker/main/build_sqlite_vec.sh
|
|
||||||
$STD bash /opt/frigate/docker/main/build_sqlite_vec.sh
|
$STD bash /opt/frigate/docker/main/build_sqlite_vec.sh
|
||||||
msg_ok "SQLite built successfully"
|
msg_ok "Built SQLite Extensions"
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "go2rtc" "AlexxIT/go2rtc" "singlefile" "latest" "/usr/local/go2rtc/bin" "go2rtc_linux_amd64"
|
fetch_and_deploy_gh_release "go2rtc" "AlexxIT/go2rtc" "singlefile" "latest" "/usr/local/go2rtc/bin" "go2rtc_linux_amd64"
|
||||||
|
|
||||||
msg_info "Installing tempio"
|
msg_info "Installing Tempio"
|
||||||
export TARGETARCH=amd64
|
|
||||||
sed -i 's|/rootfs/usr/local|/usr/local|g' /opt/frigate/docker/main/install_tempio.sh
|
sed -i 's|/rootfs/usr/local|/usr/local|g' /opt/frigate/docker/main/install_tempio.sh
|
||||||
$STD bash /opt/frigate/docker/main/install_tempio.sh
|
$STD bash /opt/frigate/docker/main/install_tempio.sh
|
||||||
ln -sf /usr/local/tempio/bin/tempio /usr/local/bin/tempio
|
ln -sf /usr/local/tempio/bin/tempio /usr/local/bin/tempio
|
||||||
msg_ok "tempio installed"
|
msg_ok "Installed Tempio"
|
||||||
|
|
||||||
msg_info "Building libUSB without udev"
|
msg_info "Building libUSB"
|
||||||
cd /opt
|
cd /opt
|
||||||
wget -q https://github.com/libusb/libusb/archive/v1.0.26.zip -O v1.0.26.zip
|
wget -q https://github.com/libusb/libusb/archive/v1.0.26.zip -O libusb.zip
|
||||||
$STD unzip -q v1.0.26.zip
|
$STD unzip -q libusb.zip
|
||||||
cd libusb-1.0.26
|
cd libusb-1.0.26
|
||||||
$STD ./bootstrap.sh
|
$STD ./bootstrap.sh
|
||||||
$STD ./configure CC='ccache gcc' CCX='ccache g++' --disable-udev --enable-shared
|
$STD ./configure CC='ccache gcc' CCX='ccache g++' --disable-udev --enable-shared
|
||||||
$STD make -j $(nproc --all)
|
$STD make -j "$(nproc)"
|
||||||
cd /opt/libusb-1.0.26/libusb
|
cd /opt/libusb-1.0.26/libusb
|
||||||
mkdir -p '/usr/local/lib'
|
mkdir -p /usr/local/lib /usr/local/include/libusb-1.0 /usr/local/lib/pkgconfig
|
||||||
$STD bash ../libtool --mode=install /usr/bin/install -c libusb-1.0.la '/usr/local/lib'
|
$STD bash ../libtool --mode=install /usr/bin/install -c libusb-1.0.la /usr/local/lib
|
||||||
mkdir -p '/usr/local/include/libusb-1.0'
|
install -c -m 644 libusb.h /usr/local/include/libusb-1.0
|
||||||
$STD install -c -m 644 libusb.h '/usr/local/include/libusb-1.0'
|
|
||||||
mkdir -p '/usr/local/lib/pkgconfig'
|
|
||||||
cd /opt/libusb-1.0.26/
|
cd /opt/libusb-1.0.26/
|
||||||
$STD install -c -m 644 libusb-1.0.pc '/usr/local/lib/pkgconfig'
|
install -c -m 644 libusb-1.0.pc /usr/local/lib/pkgconfig
|
||||||
ldconfig
|
ldconfig
|
||||||
msg_ok "libUSB built successfully"
|
msg_ok "Built libUSB"
|
||||||
|
|
||||||
#msg_info "Setting up Python"
|
msg_info "Installing Python Dependencies"
|
||||||
#$STD update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3 1
|
|
||||||
#msg_ok "Python configured"
|
|
||||||
|
|
||||||
#msg_info "Initializing pip"
|
|
||||||
#wget -q https://bootstrap.pypa.io/get-pip.py -O /tmp/get-pip.py
|
|
||||||
#sed -i 's/args.append("setuptools")/args.append("setuptools==77.0.3")/' /tmp/get-pip.py
|
|
||||||
#$STD python3 /tmp/get-pip.py "pip"
|
|
||||||
#msg_ok "Pip initialized"
|
|
||||||
|
|
||||||
msg_info "Installing Python dependencies from requirements"
|
|
||||||
$STD pip3 install -r /opt/frigate/docker/main/requirements.txt
|
$STD pip3 install -r /opt/frigate/docker/main/requirements.txt
|
||||||
msg_ok "Python dependencies installed"
|
msg_ok "Installed Python Dependencies"
|
||||||
|
|
||||||
msg_info "Building pysqlite3"
|
msg_info "Building Python Wheels (Patience)"
|
||||||
|
mkdir -p /wheels
|
||||||
sed -i 's|^SQLITE3_VERSION=.*|SQLITE3_VERSION="version-3.46.0"|g' /opt/frigate/docker/main/build_pysqlite3.sh
|
sed -i 's|^SQLITE3_VERSION=.*|SQLITE3_VERSION="version-3.46.0"|g' /opt/frigate/docker/main/build_pysqlite3.sh
|
||||||
$STD bash /opt/frigate/docker/main/build_pysqlite3.sh
|
$STD bash /opt/frigate/docker/main/build_pysqlite3.sh
|
||||||
mkdir -p /wheels
|
|
||||||
for i in {1..3}; do
|
for i in {1..3}; do
|
||||||
msg_info "Building wheels (attempt $i/3)..."
|
$STD pip3 wheel --wheel-dir=/wheels -r /opt/frigate/docker/main/requirements-wheels.txt --default-timeout=300 --retries=3 && break
|
||||||
pip3 wheel --wheel-dir=/wheels -r /opt/frigate/docker/main/requirements-wheels.txt --default-timeout=300 --retries=3 && break
|
[[ $i -lt 3 ]] && sleep 10
|
||||||
if [[ $i -lt 3 ]]; then sleep 10; fi
|
|
||||||
done
|
done
|
||||||
msg_ok "pysqlite3 built successfully"
|
msg_ok "Built Python Wheels"
|
||||||
|
|
||||||
NODE_VERSION="22" NODE_MODULE="yarn" setup_nodejs
|
NODE_VERSION="22" NODE_MODULE="yarn" setup_nodejs
|
||||||
|
|
||||||
msg_info "Downloading inference models"
|
msg_info "Downloading Inference Models"
|
||||||
mkdir -p /models /openvino-model
|
mkdir -p /models /openvino-model
|
||||||
wget -q -O edgetpu_model.tflite https://github.com/google-coral/test_data/raw/release-frogfish/ssdlite_mobiledet_coco_qat_postprocess_edgetpu.tflite
|
wget -q -O edgetpu_model.tflite https://github.com/google-coral/test_data/raw/release-frogfish/ssdlite_mobiledet_coco_qat_postprocess_edgetpu.tflite
|
||||||
cd /models
|
wget -q -O /models/cpu_model.tflite https://github.com/google-coral/test_data/raw/release-frogfish/ssdlite_mobiledet_coco_qat_postprocess.tflite
|
||||||
wget -q -O cpu_model.tflite https://github.com/google-coral/test_data/raw/release-frogfish/ssdlite_mobiledet_coco_qat_postprocess.tflite
|
|
||||||
cp /opt/frigate/labelmap.txt /labelmap.txt
|
cp /opt/frigate/labelmap.txt /labelmap.txt
|
||||||
msg_ok "Inference models downloaded"
|
msg_ok "Downloaded Inference Models"
|
||||||
|
|
||||||
msg_info "Downloading audio classification model"
|
msg_info "Downloading Audio Model"
|
||||||
cd /
|
wget -q -O /tmp/yamnet.tar.gz https://www.kaggle.com/api/v1/models/google/yamnet/tfLite/classification-tflite/1/download
|
||||||
wget -q -O yamnet-tflite.tar.gz https://www.kaggle.com/api/v1/models/google/yamnet/tfLite/classification-tflite/1/download
|
$STD tar xzf /tmp/yamnet.tar.gz -C /
|
||||||
$STD tar xzf yamnet-tflite.tar.gz
|
mv /1.tflite /cpu_audio_model.tflite
|
||||||
mv 1.tflite cpu_audio_model.tflite
|
|
||||||
cp /opt/frigate/audio-labelmap.txt /audio-labelmap.txt
|
cp /opt/frigate/audio-labelmap.txt /audio-labelmap.txt
|
||||||
rm -f yamnet-tflite.tar.gz
|
rm -f /tmp/yamnet.tar.gz
|
||||||
msg_ok "Audio model prepared"
|
msg_ok "Downloaded Audio Model"
|
||||||
|
|
||||||
msg_info "Building HailoRT runtime"
|
msg_info "Installing HailoRT Runtime"
|
||||||
$STD bash /opt/frigate/docker/main/install_hailort.sh
|
$STD bash /opt/frigate/docker/main/install_hailort.sh
|
||||||
cp -a /opt/frigate/docker/main/rootfs/. /
|
cp -a /opt/frigate/docker/main/rootfs/. /
|
||||||
sed -i '/^.*unset DEBIAN_FRONTEND.*$/d' /opt/frigate/docker/main/install_deps.sh
|
sed -i '/^.*unset DEBIAN_FRONTEND.*$/d' /opt/frigate/docker/main/install_deps.sh
|
||||||
@ -160,25 +173,24 @@ echo "libedgetpu1-max libedgetpu/install-confirm-max boolean true" | debconf-set
|
|||||||
$STD bash /opt/frigate/docker/main/install_deps.sh
|
$STD bash /opt/frigate/docker/main/install_deps.sh
|
||||||
$STD pip3 install -U /wheels/*.whl
|
$STD pip3 install -U /wheels/*.whl
|
||||||
ldconfig
|
ldconfig
|
||||||
$STD pip3 install -U /wheels/*.whl
|
msg_ok "Installed HailoRT Runtime"
|
||||||
msg_ok "HailoRT runtime built"
|
|
||||||
|
|
||||||
msg_info "Installing OpenVino runtime and libraries"
|
msg_info "Installing OpenVino"
|
||||||
$STD pip3 install -r /opt/frigate/docker/main/requirements-ov.txt
|
$STD pip3 install -r /opt/frigate/docker/main/requirements-ov.txt
|
||||||
msg_ok "OpenVino installed"
|
msg_ok "Installed OpenVino"
|
||||||
|
|
||||||
msg_info "Preparing OpenVino inference model"
|
msg_info "Building OpenVino Model"
|
||||||
cd /models
|
cd /models
|
||||||
wget -q http://download.tensorflow.org/models/object_detection/ssdlite_mobilenet_v2_coco_2018_05_09.tar.gz
|
wget -q http://download.tensorflow.org/models/object_detection/ssdlite_mobilenet_v2_coco_2018_05_09.tar.gz
|
||||||
$STD tar -zxf ssdlite_mobilenet_v2_coco_2018_05_09.tar.gz --no-same-owner
|
$STD tar -zxf ssdlite_mobilenet_v2_coco_2018_05_09.tar.gz --no-same-owner
|
||||||
$STD python3 /opt/frigate/docker/main/build_ov_model.py
|
$STD python3 /opt/frigate/docker/main/build_ov_model.py
|
||||||
cp -r /models/ssdlite_mobilenet_v2.xml /openvino-model/
|
cp /models/ssdlite_mobilenet_v2.xml /openvino-model/
|
||||||
cp -r /models/ssdlite_mobilenet_v2.bin /openvino-model/
|
cp /models/ssdlite_mobilenet_v2.bin /openvino-model/
|
||||||
wget -q https://github.com/openvinotoolkit/open_model_zoo/raw/master/data/dataset_classes/coco_91cl_bkgr.txt -O /openvino-model/coco_91cl_bkgr.txt
|
wget -q https://github.com/openvinotoolkit/open_model_zoo/raw/master/data/dataset_classes/coco_91cl_bkgr.txt -O /openvino-model/coco_91cl_bkgr.txt
|
||||||
sed -i 's/truck/car/g' /openvino-model/coco_91cl_bkgr.txt
|
sed -i 's/truck/car/g' /openvino-model/coco_91cl_bkgr.txt
|
||||||
msg_ok "OpenVino model prepared"
|
msg_ok "Built OpenVino Model"
|
||||||
|
|
||||||
msg_info "Building Frigate application"
|
msg_info "Building Frigate Application (Patience)"
|
||||||
cd /opt/frigate
|
cd /opt/frigate
|
||||||
$STD pip3 install -r /opt/frigate/docker/main/requirements-dev.txt
|
$STD pip3 install -r /opt/frigate/docker/main/requirements-dev.txt
|
||||||
$STD bash /opt/frigate/.devcontainer/initialize.sh
|
$STD bash /opt/frigate/.devcontainer/initialize.sh
|
||||||
@ -187,31 +199,22 @@ cd /opt/frigate/web
|
|||||||
$STD npm install
|
$STD npm install
|
||||||
$STD npm run build
|
$STD npm run build
|
||||||
cp -r /opt/frigate/web/dist/* /opt/frigate/web/
|
cp -r /opt/frigate/web/dist/* /opt/frigate/web/
|
||||||
cd /opt/frigate
|
|
||||||
sed -i '/^s6-svc -O \.$/s/^/#/' /opt/frigate/docker/main/rootfs/etc/s6-overlay/s6-rc.d/frigate/run
|
sed -i '/^s6-svc -O \.$/s/^/#/' /opt/frigate/docker/main/rootfs/etc/s6-overlay/s6-rc.d/frigate/run
|
||||||
msg_ok "Frigate application built"
|
msg_ok "Built Frigate Application"
|
||||||
|
|
||||||
msg_info "Preparing configuration directories"
|
msg_info "Configuring Frigate"
|
||||||
mkdir -p /config /media/frigate
|
mkdir -p /config /media/frigate
|
||||||
cp -r /opt/frigate/config/. /config
|
cp -r /opt/frigate/config/. /config
|
||||||
msg_ok "Configuration directories prepared"
|
|
||||||
|
|
||||||
msg_info "Setting up sample video"
|
|
||||||
curl -fsSL "https://github.com/intel-iot-devkit/sample-videos/raw/master/person-bicycle-car-detection.mp4" -o "/media/frigate/person-bicycle-car-detection.mp4"
|
curl -fsSL "https://github.com/intel-iot-devkit/sample-videos/raw/master/person-bicycle-car-detection.mp4" -o "/media/frigate/person-bicycle-car-detection.mp4"
|
||||||
msg_ok "Sample video downloaded"
|
|
||||||
|
|
||||||
msg_info "Configuring tmpfs cache"
|
|
||||||
echo "tmpfs /tmp/cache tmpfs defaults 0 0" >>/etc/fstab
|
echo "tmpfs /tmp/cache tmpfs defaults 0 0" >>/etc/fstab
|
||||||
msg_ok "Cache tmpfs configured"
|
|
||||||
|
|
||||||
msg_info "Creating environment configuration"
|
|
||||||
cat <<EOF >/etc/frigate.env
|
cat <<EOF >/etc/frigate.env
|
||||||
DEFAULT_FFMPEG_VERSION="7.0"
|
DEFAULT_FFMPEG_VERSION="7.0"
|
||||||
INCLUDED_FFMPEG_VERSIONS="7.0:5.0"
|
INCLUDED_FFMPEG_VERSIONS="7.0:5.0"
|
||||||
EOF
|
EOF
|
||||||
msg_ok "Environment file created"
|
|
||||||
|
|
||||||
msg_info "Creating base Frigate configuration"
|
|
||||||
cat <<EOF >/config/config.yml
|
cat <<EOF >/config/config.yml
|
||||||
mqtt:
|
mqtt:
|
||||||
enabled: false
|
enabled: false
|
||||||
@ -233,12 +236,8 @@ auth:
|
|||||||
detect:
|
detect:
|
||||||
enabled: false
|
enabled: false
|
||||||
EOF
|
EOF
|
||||||
msg_ok "Base Frigate configuration created"
|
|
||||||
|
|
||||||
msg_info "Configuring object detection model"
|
if grep -q -o -m1 -E 'avx[^ ]*|sse4_2' /proc/cpuinfo; then
|
||||||
if grep -q -o -m1 -E 'avx[^ ]* | sse4_2' /proc/cpuinfo; then
|
|
||||||
msg_ok "AVX or SSE 4.2 support detected"
|
|
||||||
msg_info "Configuring hardware-accelerated OpenVino model"
|
|
||||||
cat <<EOF >>/config/config.yml
|
cat <<EOF >>/config/config.yml
|
||||||
ffmpeg:
|
ffmpeg:
|
||||||
hwaccel_args: auto
|
hwaccel_args: auto
|
||||||
@ -253,19 +252,17 @@ model:
|
|||||||
path: /openvino-model/ssdlite_mobilenet_v2.xml
|
path: /openvino-model/ssdlite_mobilenet_v2.xml
|
||||||
labelmap_path: /openvino-model/coco_91cl_bkgr.txt
|
labelmap_path: /openvino-model/coco_91cl_bkgr.txt
|
||||||
EOF
|
EOF
|
||||||
msg_ok "OpenVino model configured"
|
|
||||||
else
|
else
|
||||||
msg_info "Configuring CPU-only object detection model"
|
|
||||||
cat <<EOF >>/config/config.yml
|
cat <<EOF >>/config/config.yml
|
||||||
ffmpeg:
|
ffmpeg:
|
||||||
hwaccel_args: auto
|
hwaccel_args: auto
|
||||||
model:
|
model:
|
||||||
path: /cpu_model.tflite
|
path: /cpu_model.tflite
|
||||||
EOF
|
EOF
|
||||||
msg_ok "CPU model configured"
|
|
||||||
fi
|
fi
|
||||||
|
msg_ok "Configured Frigate"
|
||||||
|
|
||||||
msg_info "Creating systemd services"
|
msg_info "Creating Services"
|
||||||
cat <<EOF >/etc/systemd/system/create_directories.service
|
cat <<EOF >/etc/systemd/system/create_directories.service
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=Create necessary directories for Frigate logs
|
Description=Create necessary directories for Frigate logs
|
||||||
@ -291,7 +288,7 @@ Restart=always
|
|||||||
RestartSec=1
|
RestartSec=1
|
||||||
User=root
|
User=root
|
||||||
EnvironmentFile=/etc/frigate.env
|
EnvironmentFile=/etc/frigate.env
|
||||||
ExecStartPre=+rm /dev/shm/logs/go2rtc/current
|
ExecStartPre=+rm -f /dev/shm/logs/go2rtc/current
|
||||||
ExecStart=/bin/bash -c "bash /opt/frigate/docker/main/rootfs/etc/s6-overlay/s6-rc.d/go2rtc/run 2> >(/usr/bin/ts '%%Y-%%m-%%d %%H:%%M:%%.S ' >&2) | /usr/bin/ts '%%Y-%%m-%%d %%H:%%M:%%.S '"
|
ExecStart=/bin/bash -c "bash /opt/frigate/docker/main/rootfs/etc/s6-overlay/s6-rc.d/go2rtc/run 2> >(/usr/bin/ts '%%Y-%%m-%%d %%H:%%M:%%.S ' >&2) | /usr/bin/ts '%%Y-%%m-%%d %%H:%%M:%%.S '"
|
||||||
StandardOutput=file:/dev/shm/logs/go2rtc/current
|
StandardOutput=file:/dev/shm/logs/go2rtc/current
|
||||||
StandardError=file:/dev/shm/logs/go2rtc/current
|
StandardError=file:/dev/shm/logs/go2rtc/current
|
||||||
@ -312,7 +309,7 @@ Restart=always
|
|||||||
RestartSec=1
|
RestartSec=1
|
||||||
User=root
|
User=root
|
||||||
EnvironmentFile=/etc/frigate.env
|
EnvironmentFile=/etc/frigate.env
|
||||||
ExecStartPre=+rm /dev/shm/logs/frigate/current
|
ExecStartPre=+rm -f /dev/shm/logs/frigate/current
|
||||||
ExecStart=/bin/bash -c "bash /opt/frigate/docker/main/rootfs/etc/s6-overlay/s6-rc.d/frigate/run 2> >(/usr/bin/ts '%%Y-%%m-%%d %%H:%%M:%%.S ' >&2) | /usr/bin/ts '%%Y-%%m-%%d %%H:%%M:%%.S '"
|
ExecStart=/bin/bash -c "bash /opt/frigate/docker/main/rootfs/etc/s6-overlay/s6-rc.d/frigate/run 2> >(/usr/bin/ts '%%Y-%%m-%%d %%H:%%M:%%.S ' >&2) | /usr/bin/ts '%%Y-%%m-%%d %%H:%%M:%%.S '"
|
||||||
StandardOutput=file:/dev/shm/logs/frigate/current
|
StandardOutput=file:/dev/shm/logs/frigate/current
|
||||||
StandardError=file:/dev/shm/logs/frigate/current
|
StandardError=file:/dev/shm/logs/frigate/current
|
||||||
@ -332,7 +329,7 @@ Type=simple
|
|||||||
Restart=always
|
Restart=always
|
||||||
RestartSec=1
|
RestartSec=1
|
||||||
User=root
|
User=root
|
||||||
ExecStartPre=+rm /dev/shm/logs/nginx/current
|
ExecStartPre=+rm -f /dev/shm/logs/nginx/current
|
||||||
ExecStart=/bin/bash -c "bash /opt/frigate/docker/main/rootfs/etc/s6-overlay/s6-rc.d/nginx/run 2> >(/usr/bin/ts '%%Y-%%m-%%d %%H:%%M:%%.S ' >&2) | /usr/bin/ts '%%Y-%%m-%%d %%H:%%M:%%.S '"
|
ExecStart=/bin/bash -c "bash /opt/frigate/docker/main/rootfs/etc/s6-overlay/s6-rc.d/nginx/run 2> >(/usr/bin/ts '%%Y-%%m-%%d %%H:%%M:%%.S ' >&2) | /usr/bin/ts '%%Y-%%m-%%d %%H:%%M:%%.S '"
|
||||||
StandardOutput=file:/dev/shm/logs/nginx/current
|
StandardOutput=file:/dev/shm/logs/nginx/current
|
||||||
StandardError=file:/dev/shm/logs/nginx/current
|
StandardError=file:/dev/shm/logs/nginx/current
|
||||||
@ -341,7 +338,7 @@ StandardError=file:/dev/shm/logs/nginx/current
|
|||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
$STD systemctl daemon-reload
|
systemctl daemon-reload
|
||||||
systemctl enable -q --now create_directories
|
systemctl enable -q --now create_directories
|
||||||
sleep 2
|
sleep 2
|
||||||
systemctl enable -q --now go2rtc
|
systemctl enable -q --now go2rtc
|
||||||
@ -349,13 +346,11 @@ sleep 2
|
|||||||
systemctl enable -q --now frigate
|
systemctl enable -q --now frigate
|
||||||
sleep 2
|
sleep 2
|
||||||
systemctl enable -q --now nginx
|
systemctl enable -q --now nginx
|
||||||
msg_ok "Systemd services created and enabled"
|
msg_ok "Created Services"
|
||||||
|
|
||||||
msg_info "Cleaning up temporary files and caches"
|
msg_info "Cleaning Up"
|
||||||
rm -rf /opt/v*.zip /opt/libusb-1.0.26 /tmp/get-pip.py
|
rm -rf /opt/libusb.zip /opt/libusb-1.0.26 /wheels /models/*.tar.gz
|
||||||
$STD apt-get -y autoremove
|
msg_ok "Cleaned Up"
|
||||||
$STD apt-get -y autoclean
|
|
||||||
msg_ok "Cleanup completed"
|
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
customize
|
customize
|
||||||
|
|||||||
45
install/ghost-install.sh
Normal file
45
install/ghost-install.sh
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: fabrice1236
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://ghost.org/
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
$STD apt install -y \
|
||||||
|
nginx \
|
||||||
|
ca-certificates \
|
||||||
|
libjemalloc2 \
|
||||||
|
git
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
setup_mariadb
|
||||||
|
MARIADB_DB_NAME="ghost" MARIADB_DB_USER="ghostuser" setup_mariadb_db
|
||||||
|
NODE_VERSION="22" setup_nodejs
|
||||||
|
|
||||||
|
msg_info "Installing Ghost CLI"
|
||||||
|
$STD npm install ghost-cli@latest -g
|
||||||
|
msg_ok "Installed Ghost CLI"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
$STD adduser --disabled-password --gecos "Ghost user" ghost-user
|
||||||
|
$STD usermod -aG sudo ghost-user
|
||||||
|
echo "ghost-user ALL=(ALL) NOPASSWD:ALL" | tee /etc/sudoers.d/ghost-user
|
||||||
|
mkdir -p /var/www/ghost
|
||||||
|
chown -R ghost-user:ghost-user /var/www/ghost
|
||||||
|
chmod 775 /var/www/ghost
|
||||||
|
$STD sudo -u ghost-user -H sh -c "cd /var/www/ghost && ghost install --db=mysql --dbhost=localhost --dbuser=$MARIADB_DB_USER --dbpass=$MARIADB_DB_PASS --dbname=$MARIADB_DB_NAME --url=http://localhost:2368 --no-prompt --no-setup-nginx --no-setup-ssl --no-setup-mysql --enable --start --ip 0.0.0.0"
|
||||||
|
rm /etc/sudoers.d/ghost-user
|
||||||
|
msg_ok "Creating Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
488
install/immich-install.sh
Normal file
488
install/immich-install.sh
Normal file
@ -0,0 +1,488 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: vhsdream
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://immich.app
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo ""
|
||||||
|
echo -e "🤖 ${BL}Immich Machine Learning Options${CL}"
|
||||||
|
echo "─────────────────────────────────────────"
|
||||||
|
echo "Please choose your machine-learning type:"
|
||||||
|
echo ""
|
||||||
|
echo " 1) CPU only (default)"
|
||||||
|
echo " 2) Intel OpenVINO (requires GPU passthrough)"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
read -r -p "${TAB3}Select machine-learning type [1]: " ML_TYPE
|
||||||
|
ML_TYPE="${ML_TYPE:-1}"
|
||||||
|
if [[ "$ML_TYPE" == "2" ]]; then
|
||||||
|
msg_info "Installing OpenVINO dependencies"
|
||||||
|
touch ~/.openvino
|
||||||
|
$STD apt install -y --no-install-recommends patchelf
|
||||||
|
tmp_dir=$(mktemp -d)
|
||||||
|
$STD pushd "$tmp_dir"
|
||||||
|
curl -fsSLO https://raw.githubusercontent.com/immich-app/base-images/refs/heads/main/server/Dockerfile
|
||||||
|
readarray -t INTEL_URLS < <(
|
||||||
|
sed -n "/intel-[igc|opencl]/p" ./Dockerfile | awk '{print $2}'
|
||||||
|
sed -n "/libigdgmm12/p" ./Dockerfile | awk '{print $3}'
|
||||||
|
)
|
||||||
|
for url in "${INTEL_URLS[@]}"; do
|
||||||
|
curl -fsSLO "$url"
|
||||||
|
done
|
||||||
|
$STD apt install -y ./libigdgmm12*.deb
|
||||||
|
rm ./libigdgmm12*.deb
|
||||||
|
$STD apt install -y ./*.deb
|
||||||
|
$STD apt-mark hold libigdgmm12
|
||||||
|
$STD popd
|
||||||
|
rm -rf "$tmp_dir"
|
||||||
|
dpkg-query -W -f='${Version}\n' intel-opencl-icd >~/.intel_version
|
||||||
|
msg_ok "Installed OpenVINO dependencies"
|
||||||
|
fi
|
||||||
|
|
||||||
|
setup_uv
|
||||||
|
|
||||||
|
msg_info "Installing dependencies"
|
||||||
|
$STD apt install --no-install-recommends -y \
|
||||||
|
git \
|
||||||
|
redis \
|
||||||
|
autoconf \
|
||||||
|
build-essential \
|
||||||
|
python3-dev \
|
||||||
|
automake \
|
||||||
|
cmake \
|
||||||
|
jq \
|
||||||
|
libtool \
|
||||||
|
libltdl-dev \
|
||||||
|
libgdk-pixbuf-2.0-dev \
|
||||||
|
libbrotli-dev \
|
||||||
|
libexif-dev \
|
||||||
|
libexpat1-dev \
|
||||||
|
libglib2.0-dev \
|
||||||
|
libgsf-1-dev \
|
||||||
|
libjpeg62-turbo-dev \
|
||||||
|
libspng-dev \
|
||||||
|
liblcms2-dev \
|
||||||
|
libopenexr-dev \
|
||||||
|
libgif-dev \
|
||||||
|
librsvg2-dev \
|
||||||
|
libexpat1 \
|
||||||
|
libgcc-s1 \
|
||||||
|
libgomp1 \
|
||||||
|
liblqr-1-0 \
|
||||||
|
libltdl7 \
|
||||||
|
libopenjp2-7 \
|
||||||
|
meson \
|
||||||
|
ninja-build \
|
||||||
|
pkg-config \
|
||||||
|
mesa-utils \
|
||||||
|
mesa-va-drivers \
|
||||||
|
mesa-vulkan-drivers \
|
||||||
|
ocl-icd-libopencl1 \
|
||||||
|
tini \
|
||||||
|
zlib1g \
|
||||||
|
libio-compress-brotli-perl \
|
||||||
|
libwebp7 \
|
||||||
|
libwebpdemux2 \
|
||||||
|
libwebpmux3 \
|
||||||
|
libhwy1t64 \
|
||||||
|
libdav1d-dev \
|
||||||
|
libhwy-dev \
|
||||||
|
libwebp-dev \
|
||||||
|
libaom-dev \
|
||||||
|
ccache
|
||||||
|
|
||||||
|
setup_deb822_repo \
|
||||||
|
"jellyfin" \
|
||||||
|
"https://repo.jellyfin.org/jellyfin_team.gpg.key" \
|
||||||
|
"https://repo.jellyfin.org/debian" \
|
||||||
|
"$(get_os_info codename)"
|
||||||
|
$STD apt install -y jellyfin-ffmpeg7
|
||||||
|
ln -sf /usr/lib/jellyfin-ffmpeg/ffmpeg /usr/bin/ffmpeg
|
||||||
|
ln -sf /usr/lib/jellyfin-ffmpeg/ffprobe /usr/bin/ffprobe
|
||||||
|
|
||||||
|
# Set permissions for /dev/dri (only in privileged containers and if /dev/dri exists)
|
||||||
|
if [[ "$CTTYPE" == "0" && -d /dev/dri ]]; then
|
||||||
|
chgrp video /dev/dri 2>/dev/null || true
|
||||||
|
chmod 755 /dev/dri 2>/dev/null || true
|
||||||
|
chmod 660 /dev/dri/* 2>/dev/null || true
|
||||||
|
$STD adduser "$(id -u -n)" video 2>/dev/null || true
|
||||||
|
$STD adduser "$(id -u -n)" render 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
msg_ok "Dependencies Installed"
|
||||||
|
|
||||||
|
msg_info "Installing Mise"
|
||||||
|
curl -fSs https://mise.jdx.dev/gpg-key.pub | tee /etc/apt/keyrings/mise-archive-keyring.pub 1>/dev/null
|
||||||
|
echo "deb [signed-by=/etc/apt/keyrings/mise-archive-keyring.pub arch=amd64] https://mise.jdx.dev/deb stable main" >/etc/apt/sources.list.d/mise.list
|
||||||
|
$STD apt update
|
||||||
|
$STD apt install -y mise
|
||||||
|
msg_ok "Installed Mise"
|
||||||
|
|
||||||
|
msg_info "Configuring Debian Testing Repo"
|
||||||
|
sed -i 's/ trixie-updates/ trixie-updates testing/g' /etc/apt/sources.list.d/debian.sources
|
||||||
|
cat <<EOF >/etc/apt/preferences.d/preferences
|
||||||
|
Package: *
|
||||||
|
Pin: release a=unstable
|
||||||
|
Pin-Priority: 450
|
||||||
|
|
||||||
|
Package: *
|
||||||
|
Pin:release a=testing
|
||||||
|
Pin-Priority: 450
|
||||||
|
EOF
|
||||||
|
$STD apt update
|
||||||
|
msg_ok "Configured Debian Testing repo"
|
||||||
|
msg_info "Installing packages from Debian Testing repo"
|
||||||
|
$STD apt install -t testing --no-install-recommends -yqq libmimalloc3 libde265-dev
|
||||||
|
msg_ok "Installed packages from Debian Testing repo"
|
||||||
|
|
||||||
|
PNPM_VERSION="$(curl -fsSL "https://raw.githubusercontent.com/immich-app/immich/refs/heads/main/package.json" | jq -r '.packageManager | split("@")[1]')"
|
||||||
|
NODE_VERSION="24" NODE_MODULE="pnpm@${PNPM_VERSION}" setup_nodejs
|
||||||
|
PG_VERSION="16" PG_MODULES="pgvector" setup_postgresql
|
||||||
|
|
||||||
|
VCHORD_RELEASE="0.5.3"
|
||||||
|
msg_info "Installing Vectorchord v${VCHORD_RELEASE}"
|
||||||
|
curl -fsSL "https://github.com/tensorchord/VectorChord/releases/download/${VCHORD_RELEASE}/postgresql-16-vchord_${VCHORD_RELEASE}-1_amd64.deb" -o vchord.deb
|
||||||
|
$STD apt install -y ./vchord.deb
|
||||||
|
rm vchord.deb
|
||||||
|
echo "$VCHORD_RELEASE" >~/.vchord_version
|
||||||
|
msg_ok "Installed Vectorchord v${VCHORD_RELEASE}"
|
||||||
|
|
||||||
|
sed -i -e "/^#shared_preload/s/^#//;/^shared_preload/s/''/'vchord.so'/" /etc/postgresql/16/main/postgresql.conf
|
||||||
|
systemctl restart postgresql.service
|
||||||
|
PG_DB_NAME="immich" PG_DB_USER="immich" PG_DB_GRANT_SUPERUSER="true" PG_DB_SKIP_ALTER_ROLE="true" setup_postgresql_db
|
||||||
|
|
||||||
|
msg_info "Compiling Custom Photo-processing Library (extreme patience)"
|
||||||
|
LD_LIBRARY_PATH=/usr/local/lib
|
||||||
|
export LD_RUN_PATH=/usr/local/lib
|
||||||
|
STAGING_DIR=/opt/staging
|
||||||
|
BASE_REPO="https://github.com/immich-app/base-images"
|
||||||
|
BASE_DIR=${STAGING_DIR}/base-images
|
||||||
|
SOURCE_DIR=${STAGING_DIR}/image-source
|
||||||
|
$STD git clone -b main "$BASE_REPO" "$BASE_DIR"
|
||||||
|
mkdir -p "$SOURCE_DIR"
|
||||||
|
|
||||||
|
msg_info "(1/5) Compiling libjxl"
|
||||||
|
cd "$STAGING_DIR"
|
||||||
|
SOURCE=${SOURCE_DIR}/libjxl
|
||||||
|
JPEGLI_LIBJPEG_LIBRARY_SOVERSION="62"
|
||||||
|
JPEGLI_LIBJPEG_LIBRARY_VERSION="62.3.0"
|
||||||
|
: "${LIBJXL_REVISION:=$(jq -cr '.revision' $BASE_DIR/server/sources/libjxl.json)}"
|
||||||
|
$STD git clone https://github.com/libjxl/libjxl.git "$SOURCE"
|
||||||
|
cd "$SOURCE"
|
||||||
|
$STD git reset --hard "$LIBJXL_REVISION"
|
||||||
|
$STD git submodule update --init --recursive --depth 1 --recommend-shallow
|
||||||
|
$STD git apply "$BASE_DIR"/server/sources/libjxl-patches/jpegli-empty-dht-marker.patch
|
||||||
|
$STD git apply "$BASE_DIR"/server/sources/libjxl-patches/jpegli-icc-warning.patch
|
||||||
|
mkdir build
|
||||||
|
cd build
|
||||||
|
$STD cmake \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DBUILD_TESTING=OFF \
|
||||||
|
-DJPEGXL_ENABLE_DOXYGEN=OFF \
|
||||||
|
-DJPEGXL_ENABLE_MANPAGES=OFF \
|
||||||
|
-DJPEGXL_ENABLE_PLUGIN_GIMP210=OFF \
|
||||||
|
-DJPEGXL_ENABLE_BENCHMARK=OFF \
|
||||||
|
-DJPEGXL_ENABLE_EXAMPLES=OFF \
|
||||||
|
-DJPEGXL_FORCE_SYSTEM_BROTLI=ON \
|
||||||
|
-DJPEGXL_FORCE_SYSTEM_HWY=ON \
|
||||||
|
-DJPEGXL_ENABLE_JPEGLI=ON \
|
||||||
|
-DJPEGXL_ENABLE_JPEGLI_LIBJPEG=ON \
|
||||||
|
-DJPEGXL_INSTALL_JPEGLI_LIBJPEG=ON \
|
||||||
|
-DJPEGXL_ENABLE_PLUGINS=ON \
|
||||||
|
-DJPEGLI_LIBJPEG_LIBRARY_SOVERSION="$JPEGLI_LIBJPEG_LIBRARY_SOVERSION" \
|
||||||
|
-DJPEGLI_LIBJPEG_LIBRARY_VERSION="$JPEGLI_LIBJPEG_LIBRARY_VERSION" \
|
||||||
|
-DLIBJPEG_TURBO_VERSION_NUMBER=2001005 \
|
||||||
|
..
|
||||||
|
$STD cmake --build . -- -j"$(nproc)"
|
||||||
|
$STD cmake --install .
|
||||||
|
ldconfig /usr/local/lib
|
||||||
|
$STD make clean
|
||||||
|
cd "$STAGING_DIR"
|
||||||
|
rm -rf "$SOURCE"/{build,third_party}
|
||||||
|
msg_ok "(1/5) Compiled libjxl"
|
||||||
|
|
||||||
|
msg_info "(2/5) Compiling libheif"
|
||||||
|
SOURCE=${SOURCE_DIR}/libheif
|
||||||
|
: "${LIBHEIF_REVISION:=$(jq -cr '.revision' $BASE_DIR/server/sources/libheif.json)}"
|
||||||
|
$STD git clone https://github.com/strukturag/libheif.git "$SOURCE"
|
||||||
|
cd "$SOURCE"
|
||||||
|
$STD git reset --hard "$LIBHEIF_REVISION"
|
||||||
|
mkdir build
|
||||||
|
cd build
|
||||||
|
$STD cmake --preset=release-noplugins \
|
||||||
|
-DWITH_DAV1D=ON \
|
||||||
|
-DENABLE_PARALLEL_TILE_DECODING=ON \
|
||||||
|
-DWITH_LIBSHARPYUV=ON \
|
||||||
|
-DWITH_LIBDE265=ON \
|
||||||
|
-DWITH_AOM_DECODER=OFF \
|
||||||
|
-DWITH_AOM_ENCODER=ON \
|
||||||
|
-DWITH_X265=OFF \
|
||||||
|
-DWITH_EXAMPLES=OFF \
|
||||||
|
..
|
||||||
|
$STD make install -j "$(nproc)"
|
||||||
|
ldconfig /usr/local/lib
|
||||||
|
$STD make clean
|
||||||
|
cd "$STAGING_DIR"
|
||||||
|
rm -rf "$SOURCE"/build
|
||||||
|
msg_ok "(2/5) Compiled libheif"
|
||||||
|
|
||||||
|
msg_info "(3/5) Compiling libraw"
|
||||||
|
SOURCE=${SOURCE_DIR}/libraw
|
||||||
|
: "${LIBRAW_REVISION:=$(jq -cr '.revision' $BASE_DIR/server/sources/libraw.json)}"
|
||||||
|
$STD git clone https://github.com/libraw/libraw.git "$SOURCE"
|
||||||
|
cd "$SOURCE"
|
||||||
|
$STD git reset --hard "$LIBRAW_REVISION"
|
||||||
|
$STD autoreconf --install
|
||||||
|
$STD ./configure --disable-examples
|
||||||
|
$STD make -j"$(nproc)"
|
||||||
|
$STD make install
|
||||||
|
ldconfig /usr/local/lib
|
||||||
|
$STD make clean
|
||||||
|
cd "$STAGING_DIR"
|
||||||
|
msg_ok "(3/5) Compiled libraw"
|
||||||
|
|
||||||
|
msg_info "(4/5) Compiling imagemagick"
|
||||||
|
SOURCE=$SOURCE_DIR/imagemagick
|
||||||
|
: "${IMAGEMAGICK_REVISION:=$(jq -cr '.revision' $BASE_DIR/server/sources/imagemagick.json)}"
|
||||||
|
$STD git clone https://github.com/ImageMagick/ImageMagick.git "$SOURCE"
|
||||||
|
cd "$SOURCE"
|
||||||
|
$STD git reset --hard "$IMAGEMAGICK_REVISION"
|
||||||
|
$STD ./configure --with-modules CPPFLAGS="-DMAGICK_LIBRAW_VERSION_TAIL=202502"
|
||||||
|
$STD make -j"$(nproc)"
|
||||||
|
$STD make install
|
||||||
|
ldconfig /usr/local/lib
|
||||||
|
$STD make clean
|
||||||
|
cd "$STAGING_DIR"
|
||||||
|
msg_ok "(4/5) Compiled imagemagick"
|
||||||
|
|
||||||
|
msg_info "(5/5) Compiling libvips"
|
||||||
|
SOURCE=$SOURCE_DIR/libvips
|
||||||
|
: "${LIBVIPS_REVISION:=$(jq -cr '.revision' $BASE_DIR/server/sources/libvips.json)}"
|
||||||
|
$STD git clone https://github.com/libvips/libvips.git "$SOURCE"
|
||||||
|
cd "$SOURCE"
|
||||||
|
$STD git reset --hard "$LIBVIPS_REVISION"
|
||||||
|
$STD meson setup build --buildtype=release --libdir=lib -Dintrospection=disabled -Dtiff=disabled
|
||||||
|
cd build
|
||||||
|
$STD ninja install
|
||||||
|
ldconfig /usr/local/lib
|
||||||
|
cd "$STAGING_DIR"
|
||||||
|
rm -rf "$SOURCE"/build
|
||||||
|
msg_ok "(5/5) Compiled libvips"
|
||||||
|
{
|
||||||
|
echo "imagemagick: $IMAGEMAGICK_REVISION"
|
||||||
|
echo "libheif: $LIBHEIF_REVISION"
|
||||||
|
echo "libjxl: $LIBJXL_REVISION"
|
||||||
|
echo "libraw: $LIBRAW_REVISION"
|
||||||
|
echo "libvips: $LIBVIPS_REVISION"
|
||||||
|
} >~/.immich_library_revisions
|
||||||
|
msg_ok "Custom Photo-processing Libraries Compiled Successfully"
|
||||||
|
|
||||||
|
INSTALL_DIR="/opt/${APPLICATION}"
|
||||||
|
UPLOAD_DIR="${INSTALL_DIR}/upload"
|
||||||
|
SRC_DIR="${INSTALL_DIR}/source"
|
||||||
|
APP_DIR="${INSTALL_DIR}/app"
|
||||||
|
PLUGIN_DIR="${APP_DIR}/corePlugin"
|
||||||
|
ML_DIR="${APP_DIR}/machine-learning"
|
||||||
|
GEO_DIR="${INSTALL_DIR}/geodata"
|
||||||
|
mkdir -p "$INSTALL_DIR"
|
||||||
|
mkdir -p {"${APP_DIR}","${UPLOAD_DIR}","${GEO_DIR}","${INSTALL_DIR}"/cache}
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "immich" "immich-app/immich" "tag" "v2.5.2" "$SRC_DIR"
|
||||||
|
|
||||||
|
msg_info "Installing Immich (patience)"
|
||||||
|
|
||||||
|
cd "$SRC_DIR"/server
|
||||||
|
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
|
||||||
|
export CI=1
|
||||||
|
corepack enable
|
||||||
|
|
||||||
|
# server build
|
||||||
|
export SHARP_IGNORE_GLOBAL_LIBVIPS=true
|
||||||
|
$STD pnpm --filter immich --frozen-lockfile build
|
||||||
|
unset SHARP_IGNORE_GLOBAL_LIBVIPS
|
||||||
|
export SHARP_FORCE_GLOBAL_LIBVIPS=true
|
||||||
|
$STD pnpm --filter immich --frozen-lockfile --prod --no-optional deploy "$APP_DIR"
|
||||||
|
cp "$APP_DIR"/package.json "$APP_DIR"/bin
|
||||||
|
sed -i 's|^start|./start|' "$APP_DIR"/bin/immich-admin
|
||||||
|
|
||||||
|
# openapi & web build
|
||||||
|
cd "$SRC_DIR"
|
||||||
|
echo "packageImportMethod: hardlink" >>./pnpm-workspace.yaml
|
||||||
|
$STD pnpm --filter @immich/sdk --filter immich-web --frozen-lockfile --force install
|
||||||
|
unset SHARP_FORCE_GLOBAL_LIBVIPS
|
||||||
|
export SHARP_IGNORE_GLOBAL_LIBVIPS=true
|
||||||
|
$STD pnpm --filter @immich/sdk --filter immich-web build
|
||||||
|
cp -a web/build "$APP_DIR"/www
|
||||||
|
cp LICENSE "$APP_DIR"
|
||||||
|
|
||||||
|
# cli build
|
||||||
|
$STD pnpm --filter @immich/sdk --filter @immich/cli --frozen-lockfile install
|
||||||
|
$STD pnpm --filter @immich/sdk --filter @immich/cli build
|
||||||
|
$STD pnpm --filter @immich/cli --prod --no-optional deploy "$APP_DIR"/cli
|
||||||
|
|
||||||
|
# plugins
|
||||||
|
cd "$SRC_DIR"
|
||||||
|
$STD mise trust --ignore ./mise.toml
|
||||||
|
$STD mise trust ./plugins/mise.toml
|
||||||
|
cd plugins
|
||||||
|
$STD mise install
|
||||||
|
$STD mise run build
|
||||||
|
mkdir -p "$PLUGIN_DIR"
|
||||||
|
cp -r ./dist "$PLUGIN_DIR"/dist
|
||||||
|
cp ./manifest.json "$PLUGIN_DIR"
|
||||||
|
msg_ok "Installed Immich Server, Web and Plugin Components"
|
||||||
|
|
||||||
|
cd "$SRC_DIR"/machine-learning
|
||||||
|
$STD useradd -U -s /usr/sbin/nologin -r -M -d "$INSTALL_DIR" immich
|
||||||
|
mkdir -p "$ML_DIR" && chown -R immich:immich "$INSTALL_DIR"
|
||||||
|
export VIRTUAL_ENV="${ML_DIR}/ml-venv"
|
||||||
|
if [[ -f ~/.openvino ]]; then
|
||||||
|
msg_info "Installing HW-accelerated machine-learning"
|
||||||
|
$STD sudo --preserve-env=VIRTUAL_ENV -nu immich uv sync --extra openvino --no-dev --active --link-mode copy -n -p python3.13 --managed-python
|
||||||
|
patchelf --clear-execstack "${VIRTUAL_ENV}/lib/python3.13/site-packages/onnxruntime/capi/onnxruntime_pybind11_state.cpython-313-x86_64-linux-gnu.so"
|
||||||
|
msg_ok "Installed HW-accelerated machine-learning"
|
||||||
|
else
|
||||||
|
msg_info "Installing machine-learning"
|
||||||
|
$STD sudo --preserve-env=VIRTUAL_ENV -nu immich uv sync --extra cpu --no-dev --active --link-mode copy -n -p python3.11 --managed-python
|
||||||
|
msg_ok "Installed machine-learning"
|
||||||
|
fi
|
||||||
|
cd "$SRC_DIR"
|
||||||
|
cp -a machine-learning/{ann,immich_ml} "$ML_DIR"
|
||||||
|
if [[ -f ~/.openvino ]]; then
|
||||||
|
sed -i "/intra_op/s/int = 0/int = os.cpu_count() or 0/" "$ML_DIR"/immich_ml/config.py
|
||||||
|
fi
|
||||||
|
ln -sf "$APP_DIR"/resources "$INSTALL_DIR"
|
||||||
|
|
||||||
|
cd "$APP_DIR"
|
||||||
|
grep -rl /usr/src | xargs -n1 sed -i "s|\/usr/src|$INSTALL_DIR|g"
|
||||||
|
grep -rlE "'/build'" | xargs -n1 sed -i "s|'/build'|'$APP_DIR'|g"
|
||||||
|
sed -i "s@\"/cache\"@\"$INSTALL_DIR/cache\"@g" "$ML_DIR"/immich_ml/config.py
|
||||||
|
ln -s "$UPLOAD_DIR" "$APP_DIR"/upload
|
||||||
|
ln -s "$UPLOAD_DIR" "$ML_DIR"/upload
|
||||||
|
|
||||||
|
msg_info "Installing GeoNames data"
|
||||||
|
cd "$GEO_DIR"
|
||||||
|
curl -fsSLZ -O "https://download.geonames.org/export/dump/admin1CodesASCII.txt" \
|
||||||
|
-O "https://download.geonames.org/export/dump/admin2Codes.txt" \
|
||||||
|
-O "https://download.geonames.org/export/dump/cities500.zip" \
|
||||||
|
-O "https://raw.githubusercontent.com/nvkelso/natural-earth-vector/v5.1.2/geojson/ne_10m_admin_0_countries.geojson"
|
||||||
|
unzip -q cities500.zip
|
||||||
|
date --iso-8601=seconds | tr -d "\n" >geodata-date.txt
|
||||||
|
rm cities500.zip
|
||||||
|
cd "$INSTALL_DIR"
|
||||||
|
ln -s "$GEO_DIR" "$APP_DIR"
|
||||||
|
msg_ok "Installed GeoNames data"
|
||||||
|
|
||||||
|
mkdir -p /var/log/immich
|
||||||
|
touch /var/log/immich/{web.log,ml.log}
|
||||||
|
msg_ok "Installed Immich"
|
||||||
|
|
||||||
|
msg_info "Modifying user, creating env file, scripts & services"
|
||||||
|
usermod -aG video,render immich
|
||||||
|
|
||||||
|
cat <<EOF >"${INSTALL_DIR}"/.env
|
||||||
|
TZ=$(cat /etc/timezone)
|
||||||
|
IMMICH_VERSION=release
|
||||||
|
NODE_ENV=production
|
||||||
|
IMMICH_ALLOW_SETUP=true
|
||||||
|
|
||||||
|
DB_HOSTNAME=127.0.0.1
|
||||||
|
DB_USERNAME=${PG_DB_USER}
|
||||||
|
DB_PASSWORD=${PG_DB_PASS}
|
||||||
|
DB_DATABASE_NAME=${PG_DB_NAME}
|
||||||
|
DB_VECTOR_EXTENSION=vectorchord
|
||||||
|
|
||||||
|
REDIS_HOSTNAME=127.0.0.1
|
||||||
|
IMMICH_MACHINE_LEARNING_URL=http://127.0.0.1:3003
|
||||||
|
MACHINE_LEARNING_CACHE_FOLDER=${INSTALL_DIR}/cache
|
||||||
|
## - For OpenVINO only - workaround for onnxruntime-openvino 1.23.x crash
|
||||||
|
## - See: https://github.com/immich-app/immich/pull/11240
|
||||||
|
MACHINE_LEARNING_OPENVINO_NUM_THREADS=$(nproc)
|
||||||
|
## - Uncomment below to increase inference speed while reducing accuracy
|
||||||
|
# MACHINE_LEARNING_OPENVINO_PRECISION=FP16
|
||||||
|
|
||||||
|
IMMICH_MEDIA_LOCATION=${UPLOAD_DIR}
|
||||||
|
EOF
|
||||||
|
cat <<EOF >"${ML_DIR}"/ml_start.sh
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
cd ${ML_DIR}
|
||||||
|
. ${VIRTUAL_ENV}/bin/activate
|
||||||
|
|
||||||
|
set -a
|
||||||
|
. ${INSTALL_DIR}/.env
|
||||||
|
set +a
|
||||||
|
|
||||||
|
python3 -m immich_ml
|
||||||
|
EOF
|
||||||
|
cat <<EOF >"$APP_DIR"/bin/start.sh
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -a
|
||||||
|
. ${INSTALL_DIR}/.env
|
||||||
|
set +a
|
||||||
|
|
||||||
|
/usr/bin/node ${APP_DIR}/dist/main.js "\$@"
|
||||||
|
EOF
|
||||||
|
chmod +x "$ML_DIR"/ml_start.sh "$APP_DIR"/bin/start.sh
|
||||||
|
cat <<EOF >/etc/systemd/system/"${APPLICATION}"-web.service
|
||||||
|
[Unit]
|
||||||
|
Description=${APPLICATION} Web Service
|
||||||
|
After=network.target
|
||||||
|
Requires=redis-server.service
|
||||||
|
Requires=postgresql.service
|
||||||
|
Requires=immich-ml.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=immich
|
||||||
|
Group=immich
|
||||||
|
UMask=0077
|
||||||
|
WorkingDirectory=${APP_DIR}
|
||||||
|
EnvironmentFile=${INSTALL_DIR}/.env
|
||||||
|
ExecStart=/usr/bin/node ${APP_DIR}/dist/main
|
||||||
|
Restart=on-failure
|
||||||
|
SyslogIdentifier=immich-web
|
||||||
|
StandardOutput=append:/var/log/immich/web.log
|
||||||
|
StandardError=append:/var/log/immich/web.log
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
cat <<EOF >/etc/systemd/system/"${APPLICATION}"-ml.service
|
||||||
|
[Unit]
|
||||||
|
Description=${APPLICATION} Machine-Learning
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
UMask=0077
|
||||||
|
User=immich
|
||||||
|
Group=immich
|
||||||
|
WorkingDirectory=${APP_DIR}
|
||||||
|
EnvironmentFile=${INSTALL_DIR}/.env
|
||||||
|
ExecStart=${ML_DIR}/ml_start.sh
|
||||||
|
Restart=on-failure
|
||||||
|
SyslogIdentifier=immich-machine-learning
|
||||||
|
StandardOutput=append:/var/log/immich/ml.log
|
||||||
|
StandardError=append:/var/log/immich/ml.log
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
chown -R immich:immich "$INSTALL_DIR" /var/log/immich
|
||||||
|
systemctl enable -q --now "$APPLICATION"-ml.service "$APPLICATION"-web.service
|
||||||
|
msg_ok "Modified user, created env file, scripts and services"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
97
install/isponsorblocktv-install.sh
Normal file
97
install/isponsorblocktv-install.sh
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: Matthew Stern (sternma)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/dmunozv04/iSponsorBlockTV
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
INSTALL_DIR="/opt/isponsorblocktv"
|
||||||
|
DATA_DIR="/var/lib/isponsorblocktv"
|
||||||
|
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
$STD apt install -y \
|
||||||
|
python3 \
|
||||||
|
python3-venv \
|
||||||
|
python3-pip
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "isponsorblocktv" "dmunozv04/iSponsorBlockTV"
|
||||||
|
|
||||||
|
msg_info "Setting up iSponsorBlockTV"
|
||||||
|
$STD python3 -m venv "$INSTALL_DIR/venv"
|
||||||
|
$STD "$INSTALL_DIR/venv/bin/pip" install --upgrade pip
|
||||||
|
$STD "$INSTALL_DIR/venv/bin/pip" install "$INSTALL_DIR"
|
||||||
|
msg_ok "Set up iSponsorBlockTV"
|
||||||
|
|
||||||
|
msg_info "Creating data directory"
|
||||||
|
install -d "$DATA_DIR"
|
||||||
|
msg_ok "Created data directory"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOT >/etc/systemd/system/isponsorblocktv.service
|
||||||
|
[Unit]
|
||||||
|
Description=iSponsorBlockTV
|
||||||
|
After=network-online.target
|
||||||
|
Wants=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=root
|
||||||
|
Group=root
|
||||||
|
WorkingDirectory=$INSTALL_DIR
|
||||||
|
Environment=iSPBTV_data_dir=$DATA_DIR
|
||||||
|
ExecStart=$INSTALL_DIR/venv/bin/iSponsorBlockTV
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOT
|
||||||
|
systemctl enable -q --now isponsorblocktv
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
msg_info "Creating CLI wrapper"
|
||||||
|
install -d /usr/local/bin
|
||||||
|
cat <<'EOT' >/usr/local/bin/iSponsorBlockTV
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
export iSPBTV_data_dir="/var/lib/isponsorblocktv"
|
||||||
|
|
||||||
|
set +e
|
||||||
|
/opt/isponsorblocktv/venv/bin/iSponsorBlockTV "$@"
|
||||||
|
status=$?
|
||||||
|
set -e
|
||||||
|
|
||||||
|
case "${1:-}" in
|
||||||
|
setup|setup-cli)
|
||||||
|
systemctl restart isponsorblocktv >/dev/null 2>&1 || true
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit $status
|
||||||
|
EOT
|
||||||
|
chmod +x /usr/local/bin/iSponsorBlockTV
|
||||||
|
ln -sf /usr/local/bin/iSponsorBlockTV /usr/bin/iSponsorBlockTV
|
||||||
|
msg_ok "Created CLI wrapper"
|
||||||
|
|
||||||
|
msg_info "Setting default data dir for shells"
|
||||||
|
cat <<'EOT' >/etc/profile.d/isponsorblocktv.sh
|
||||||
|
export iSPBTV_data_dir="/var/lib/isponsorblocktv"
|
||||||
|
EOT
|
||||||
|
if ! grep -q '^iSPBTV_data_dir=' /etc/environment 2>/dev/null; then
|
||||||
|
cat <<'EOT' >>/etc/environment
|
||||||
|
iSPBTV_data_dir=/var/lib/isponsorblocktv
|
||||||
|
EOT
|
||||||
|
fi
|
||||||
|
msg_ok "Set default data dir for shells"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
# Author: vhsdream
|
# Author: vhsdream | MickLesk
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
# Source: https://github.com/fccview/jotty
|
# Source: https://github.com/fccview/jotty
|
||||||
|
|
||||||
@ -14,37 +14,16 @@ network_check
|
|||||||
update_os
|
update_os
|
||||||
|
|
||||||
NODE_VERSION="22" NODE_MODULE="yarn" setup_nodejs
|
NODE_VERSION="22" NODE_MODULE="yarn" setup_nodejs
|
||||||
#fetch_and_deploy_gh_release "jotty" "fccview/jotty" "tarball" "latest" "/opt/jotty"
|
fetch_and_deploy_gh_release "jotty" "fccview/jotty" "prebuild" "latest" "/opt/jotty" "jotty_*_prebuild.tar.gz"
|
||||||
|
|
||||||
msg_info "Setup jotty"
|
msg_info "Setup jotty"
|
||||||
mkdir -p /opt/jotty
|
|
||||||
wget -q https://github.com/fccview/jotty/releases/download/develop/jotty-prebuild-develop.tar.gz -O /opt/jotty.tar.gz
|
|
||||||
cd /opt
|
|
||||||
tar -xzf jotty.tar.gz
|
|
||||||
|
|
||||||
cd /opt/jotty
|
|
||||||
# unset NODE_OPTIONS
|
|
||||||
# export NODE_OPTIONS="--max-old-space-size=3072"
|
|
||||||
# # $STD yarn --frozen-lockfiled
|
|
||||||
# # $STD yarn next telemetry disable
|
|
||||||
# # $STD yarn build
|
|
||||||
|
|
||||||
# [ -d "public" ] && cp -r public .next/standalone/
|
|
||||||
# [ -d "howto" ] && cp -r howto .next/standalone/
|
|
||||||
# mkdir -p .next/standalone/.next
|
|
||||||
# cp -r .next/static .next/standalone/.next/
|
|
||||||
|
|
||||||
# mv .next/standalone /tmp/jotty_standalone
|
|
||||||
# rm -rf ./* .next .git .gitignore .yarn
|
|
||||||
# mv /tmp/jotty_standalone/* .
|
|
||||||
# mv /tmp/jotty_standalone/.[!.]* . 2>/dev/null || true
|
|
||||||
# rm -rf /tmp/jotty_standalone
|
|
||||||
|
|
||||||
mkdir -p data/{users,checklists,notes}
|
mkdir -p data/{users,checklists,notes}
|
||||||
|
|
||||||
cat <<EOF >/opt/jotty/.env
|
cat <<EOF >/opt/jotty/.env
|
||||||
NODE_ENV=production
|
NODE_ENV=production
|
||||||
|
|
||||||
# --- Uncomment to enable
|
# --- Uncomment to enable
|
||||||
|
# APP_URL=https://your-jotty-domain.com
|
||||||
|
# INTERNAL_API_URL=http://localhost:3000
|
||||||
# HTTPS=true
|
# HTTPS=true
|
||||||
# SERVE_PUBLIC_IMAGES=yes
|
# SERVE_PUBLIC_IMAGES=yes
|
||||||
# SERVE_PUBLIC_FILES=yes
|
# SERVE_PUBLIC_FILES=yes
|
||||||
@ -57,12 +36,11 @@ NODE_ENV=production
|
|||||||
# SSO_MODE=oidc
|
# SSO_MODE=oidc
|
||||||
# OIDC_ISSUER=<your-oidc-issuer-url>
|
# OIDC_ISSUER=<your-oidc-issuer-url>
|
||||||
# OIDC_CLIENT_ID=<oidc-client-id>
|
# OIDC_CLIENT_ID=<oidc-client-id>
|
||||||
# APP_URL=<https://app.domain.tld>
|
|
||||||
# SSO_FALLBACK_LOCAL=yes
|
# SSO_FALLBACK_LOCAL=yes
|
||||||
# OIDC_CLIENT_SECRET=your_client_secret
|
# OIDC_CLIENT_SECRET=your_client_secret
|
||||||
# OIDC_ADMIN_GROUPS=admins
|
# OIDC_ADMIN_GROUPS=admins
|
||||||
EOF
|
EOF
|
||||||
msg_ok "Installed ${APPLICATION}"
|
msg_ok "Setup jotty"
|
||||||
|
|
||||||
msg_info "Creating Service"
|
msg_info "Creating Service"
|
||||||
cat <<EOF >/etc/systemd/system/jotty.service
|
cat <<EOF >/etc/systemd/system/jotty.service
|
||||||
|
|||||||
@ -1,131 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2025 community-scripts ORG
|
|
||||||
# Author: snazzybean
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/TomBursch/kitchenowl
|
|
||||||
|
|
||||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
|
||||||
color
|
|
||||||
verb_ip6
|
|
||||||
catch_errors
|
|
||||||
setting_up_container
|
|
||||||
network_check
|
|
||||||
update_os
|
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
|
||||||
$STD apt install -y \
|
|
||||||
nginx \
|
|
||||||
build-essential \
|
|
||||||
libpq-dev \
|
|
||||||
libffi-dev \
|
|
||||||
libssl-dev
|
|
||||||
msg_ok "Installed Dependencies"
|
|
||||||
|
|
||||||
PYTHON_VERSION="3.14" setup_uv
|
|
||||||
import_local_ip
|
|
||||||
fetch_and_deploy_gh_release "kitchenowl" "TomBursch/kitchenowl" "tarball" "latest" "/opt/kitchenowl"
|
|
||||||
rm -rf /opt/kitchenowl/web
|
|
||||||
fetch_and_deploy_gh_release "kitchenowl-web" "TomBursch/kitchenowl" "prebuild" "latest" "/opt/kitchenowl/web" "kitchenowl_Web.tar.gz"
|
|
||||||
|
|
||||||
msg_info "Setting up KitchenOwl"
|
|
||||||
cd /opt/kitchenowl/backend
|
|
||||||
#rm -f uv.lock
|
|
||||||
$STD uv sync --frozen
|
|
||||||
sed -i 's/default=True/default=False/' /opt/kitchenowl/backend/wsgi.py
|
|
||||||
mkdir -p /nltk_data
|
|
||||||
$STD uv run python -m nltk.downloader -d /nltk_data averaged_perceptron_tagger_eng punkt_tab
|
|
||||||
JWT_SECRET=$(openssl rand -hex 32)
|
|
||||||
mkdir -p /opt/kitchenowl/data
|
|
||||||
cat <<EOF >/opt/kitchenowl/kitchenowl.env
|
|
||||||
STORAGE_PATH=/opt/kitchenowl/data
|
|
||||||
JWT_SECRET_KEY=${JWT_SECRET}
|
|
||||||
NLTK_DATA=/nltk_data
|
|
||||||
FRONT_URL=http://${LOCAL_IP}
|
|
||||||
FLASK_APP=wsgi.py
|
|
||||||
FLASK_ENV=production
|
|
||||||
EOF
|
|
||||||
set -a
|
|
||||||
source /opt/kitchenowl/kitchenowl.env
|
|
||||||
set +a
|
|
||||||
$STD uv run flask db upgrade
|
|
||||||
msg_ok "Set up KitchenOwl"
|
|
||||||
|
|
||||||
msg_info "Creating Systemd Service"
|
|
||||||
cat <<EOF >/etc/systemd/system/kitchenowl.service
|
|
||||||
[Unit]
|
|
||||||
Description=KitchenOwl Backend
|
|
||||||
After=network.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
User=root
|
|
||||||
WorkingDirectory=/opt/kitchenowl/backend
|
|
||||||
EnvironmentFile=/opt/kitchenowl/kitchenowl.env
|
|
||||||
ExecStart=/usr/local/bin/uv run wsgi.py
|
|
||||||
Restart=on-failure
|
|
||||||
RestartSec=5
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
EOF
|
|
||||||
systemctl enable -q --now kitchenowl
|
|
||||||
msg_ok "Created and Started Service"
|
|
||||||
|
|
||||||
msg_info "Configuring Nginx"
|
|
||||||
rm -f /etc/nginx/sites-enabled/default
|
|
||||||
cat <<'EOF' >/etc/nginx/sites-available/kitchenowl.conf
|
|
||||||
server {
|
|
||||||
listen 80;
|
|
||||||
server_name _;
|
|
||||||
|
|
||||||
root /opt/kitchenowl/web;
|
|
||||||
index index.html;
|
|
||||||
|
|
||||||
client_max_body_size 100M;
|
|
||||||
|
|
||||||
# Security Headers
|
|
||||||
add_header X-Frame-Options "SAMEORIGIN" always;
|
|
||||||
add_header X-Content-Type-Options "nosniff" always;
|
|
||||||
add_header X-XSS-Protection "1; mode=block" always;
|
|
||||||
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
|
|
||||||
|
|
||||||
location / {
|
|
||||||
try_files $uri $uri/ /index.html;
|
|
||||||
}
|
|
||||||
|
|
||||||
location /api {
|
|
||||||
proxy_pass http://127.0.0.1:5000;
|
|
||||||
proxy_http_version 1.1;
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
|
||||||
proxy_connect_timeout 60s;
|
|
||||||
proxy_send_timeout 60s;
|
|
||||||
proxy_read_timeout 60s;
|
|
||||||
}
|
|
||||||
|
|
||||||
location /socket.io {
|
|
||||||
proxy_pass http://127.0.0.1:5000;
|
|
||||||
proxy_http_version 1.1;
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
|
||||||
proxy_set_header Upgrade $http_upgrade;
|
|
||||||
proxy_set_header Connection "upgrade";
|
|
||||||
# WebSocket Timeouts - allow long-lived connections
|
|
||||||
proxy_read_timeout 86400s;
|
|
||||||
proxy_send_timeout 86400s;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
ln -sf /etc/nginx/sites-available/kitchenowl.conf /etc/nginx/sites-enabled/
|
|
||||||
rm -f /etc/nginx/sites-enabled/default
|
|
||||||
$STD systemctl reload nginx
|
|
||||||
msg_ok "Configured Nginx"
|
|
||||||
|
|
||||||
motd_ssh
|
|
||||||
customize
|
|
||||||
cleanup_lxc
|
|
||||||
@ -1,84 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: Slaviša Arežina (tremor021)
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
|
||||||
# Source: https://languagetool.org/
|
|
||||||
|
|
||||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
|
||||||
color
|
|
||||||
verb_ip6
|
|
||||||
catch_errors
|
|
||||||
setting_up_container
|
|
||||||
network_check
|
|
||||||
update_os
|
|
||||||
|
|
||||||
msg_info "Installing dependencies"
|
|
||||||
$STD apt install -y fasttext
|
|
||||||
msg_ok "Installed dependencies"
|
|
||||||
|
|
||||||
JAVA_VERSION="21" setup_java
|
|
||||||
|
|
||||||
msg_info "Setting up LanguageTool"
|
|
||||||
RELEASE=$(curl -fsSL https://languagetool.org/download/ | grep -oP 'LanguageTool-\K[0-9]+\.[0-9]+(\.[0-9]+)?(?=\.zip)' | sort -V | tail -n1)
|
|
||||||
download_file "https://languagetool.org/download/LanguageTool-stable.zip" /tmp/LanguageTool-stable.zip
|
|
||||||
unzip -q /tmp/LanguageTool-stable.zip -d /opt
|
|
||||||
mv /opt/LanguageTool-*/ /opt/LanguageTool/
|
|
||||||
download_file "https://dl.fbaipublicfiles.com/fasttext/supervised-models/lid.176.bin" /opt/lid.176.bin
|
|
||||||
|
|
||||||
read -r -p "${TAB3}Enter language code (en, de, es, fr, nl) to download ngrams or press ENTER to skip: " lang_code
|
|
||||||
ngram_dir=""
|
|
||||||
if [[ -n "$lang_code" ]]; then
|
|
||||||
if [[ "$lang_code" =~ ^(en|de|es|fr|nl)$ ]]; then
|
|
||||||
msg_info "Searching for $lang_code ngrams..."
|
|
||||||
filename=$(curl -fsSL https://languagetool.org/download/ngram-data/ | grep -oP "ngrams-${lang_code}-[0-9]+\.zip" | sort -uV | tail -n1)
|
|
||||||
|
|
||||||
if [[ -n "$filename" ]]; then
|
|
||||||
msg_info "Downloading $filename"
|
|
||||||
download_file "https://languagetool.org/download/ngram-data/${filename}" "/tmp/${filename}"
|
|
||||||
|
|
||||||
mkdir -p /opt/ngrams
|
|
||||||
msg_info "Extracting $lang_code ngrams to /opt/ngrams"
|
|
||||||
unzip -q "/tmp/${filename}" -d /opt/ngrams
|
|
||||||
rm "/tmp/${filename}"
|
|
||||||
|
|
||||||
ngram_dir="/opt/ngrams"
|
|
||||||
msg_ok "Installed $lang_code ngrams"
|
|
||||||
else
|
|
||||||
msg_info "No ngram file found for ${lang_code}"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
msg_error "Invalid language code: $lang_code"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
cat <<EOF >/opt/LanguageTool/server.properties
|
|
||||||
fasttextModel=/opt/lid.176.bin
|
|
||||||
fasttextBinary=/usr/bin/fasttext
|
|
||||||
EOF
|
|
||||||
if [[ -n "$ngram_dir" ]]; then
|
|
||||||
echo "languageModel=/opt/ngrams" >> /opt/LanguageTool/server.properties
|
|
||||||
fi
|
|
||||||
echo "${RELEASE}" >~/.languagetool
|
|
||||||
msg_ok "Setup LanguageTool"
|
|
||||||
|
|
||||||
msg_info "Creating Service"
|
|
||||||
cat <<'EOF' >/etc/systemd/system/language-tool.service
|
|
||||||
[Unit]
|
|
||||||
Description=LanguageTool Service
|
|
||||||
After=network.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
WorkingDirectory=/opt/LanguageTool
|
|
||||||
ExecStart=java -cp languagetool-server.jar org.languagetool.server.HTTPServer --config server.properties --public --allow-origin "*"
|
|
||||||
Restart=always
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
EOF
|
|
||||||
systemctl enable -q --now language-tool
|
|
||||||
msg_ok "Created Service"
|
|
||||||
|
|
||||||
motd_ssh
|
|
||||||
customize
|
|
||||||
cleanup_lxc
|
|
||||||
@ -22,7 +22,7 @@ PG_VERSION="16" setup_postgresql
|
|||||||
PG_DB_NAME="linkwardendb" PG_DB_USER="linkwarden" setup_postgresql_db
|
PG_DB_NAME="linkwardendb" PG_DB_USER="linkwarden" setup_postgresql_db
|
||||||
RUST_CRATES="monolith" setup_rust
|
RUST_CRATES="monolith" setup_rust
|
||||||
fetch_and_deploy_gh_release "linkwarden" "linkwarden/linkwarden"
|
fetch_and_deploy_gh_release "linkwarden" "linkwarden/linkwarden"
|
||||||
import_local_ip
|
|
||||||
|
|
||||||
read -r -p "${TAB3}Would you like to add Adminer? <y/N> " prompt
|
read -r -p "${TAB3}Would you like to add Adminer? <y/N> " prompt
|
||||||
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
|
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
|||||||
@ -12,14 +12,12 @@ catch_errors
|
|||||||
setting_up_container
|
setting_up_container
|
||||||
network_check
|
network_check
|
||||||
update_os
|
update_os
|
||||||
PHP_VERSION="8.2"
|
|
||||||
PHP_APACHE="YES" PHP_MODULE="mysql,cli,redis" PHP_FPM="YES" setup_php
|
|
||||||
setup_composer
|
|
||||||
|
|
||||||
msg_info "Enabling Apache modules (rewrite, headers)"
|
PHP_VERSION="8.2"
|
||||||
$STD a2enmod rewrite
|
PHP_APACHE="YES" PHP_MODULE="mysql,redis" PHP_FPM="YES" setup_php
|
||||||
$STD a2enmod headers
|
setup_composer
|
||||||
msg_ok "Enabled Apache modules (rewrite, headers)"
|
setup_mariadb
|
||||||
|
$STD mariadb -u root -e "SET GLOBAL sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'";
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "MintHCM" "minthcm/minthcm" "tarball" "latest" "/var/www/MintHCM"
|
fetch_and_deploy_gh_release "MintHCM" "minthcm/minthcm" "tarball" "latest" "/var/www/MintHCM"
|
||||||
|
|
||||||
@ -37,19 +35,17 @@ mkdir -p /var/www/script
|
|||||||
cp /var/www/MintHCM/docker/script/generate_config.php /var/www/script/generate_config.php
|
cp /var/www/MintHCM/docker/script/generate_config.php /var/www/script/generate_config.php
|
||||||
cp /var/www/MintHCM/docker/.env /var/www/script/.env
|
cp /var/www/MintHCM/docker/.env /var/www/script/.env
|
||||||
chown -R www-data:www-data /var/www/script
|
chown -R www-data:www-data /var/www/script
|
||||||
msg_ok "Configured MintHCM"
|
$STD a2enmod rewrite
|
||||||
|
$STD a2enmod headers
|
||||||
msg_info "Restarting Apache2"
|
|
||||||
$STD systemctl restart apache2
|
$STD systemctl restart apache2
|
||||||
msg_ok "Restarted Apache2"
|
msg_ok "Configured MintHCM"
|
||||||
|
|
||||||
msg_info "Setting up Elasticsearch"
|
msg_info "Setting up Elasticsearch"
|
||||||
setup_deb822_repo \
|
setup_deb822_repo \
|
||||||
"elasticsearch" \
|
"elasticsearch" \
|
||||||
"https://artifacts.elastic.co/GPG-KEY-elasticsearch" \
|
"https://artifacts.elastic.co/GPG-KEY-elasticsearch" \
|
||||||
"https://artifacts.elastic.co/packages/7.x/apt" \
|
"https://artifacts.elastic.co/packages/7.x/apt" \
|
||||||
"stable" \
|
"stable"
|
||||||
"main"
|
|
||||||
$STD apt install -y elasticsearch
|
$STD apt install -y elasticsearch
|
||||||
echo "-Xms2g" >>/etc/elasticsearch/jvm.options
|
echo "-Xms2g" >>/etc/elasticsearch/jvm.options
|
||||||
echo "-Xmx2g" >>/etc/elasticsearch/jvm.options
|
echo "-Xmx2g" >>/etc/elasticsearch/jvm.options
|
||||||
@ -57,35 +53,26 @@ $STD /usr/share/elasticsearch/bin/elasticsearch-plugin install ingest-attachment
|
|||||||
systemctl enable -q --now elasticsearch
|
systemctl enable -q --now elasticsearch
|
||||||
msg_ok "Set up Elasticsearch"
|
msg_ok "Set up Elasticsearch"
|
||||||
|
|
||||||
setup_mariadb
|
|
||||||
msg_info "Setting up MariaDB"
|
|
||||||
$STD mariadb -u root -e "SET GLOBAL sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'";
|
|
||||||
msg_ok "Set up MariaDB"
|
|
||||||
|
|
||||||
msg_info "Configuring Database"
|
msg_info "Configuring Database"
|
||||||
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
||||||
$STD mariadb -u root -e "CREATE USER 'minthcm'@'localhost' IDENTIFIED BY '${DB_PASS}';"
|
$STD mariadb -u root -e "CREATE USER 'minthcm'@'localhost' IDENTIFIED BY '${DB_PASS}';"
|
||||||
$STD mariadb -u root -e "GRANT ALL ON *.* TO 'minthcm'@'localhost'; FLUSH PRIVILEGES;"
|
$STD mariadb -u root -e "GRANT ALL ON *.* TO 'minthcm'@'localhost'; FLUSH PRIVILEGES;"
|
||||||
sed -i 's/^DB_HOST=.*/DB_HOST=localhost/' /var/www/script/.env
|
sed -i "s/^DB_HOST=.*/DB_HOST=localhost/" /var/www/script/.env
|
||||||
sed -i 's/^DB_USER=.*/DB_USER=minthcm/' /var/www/script/.env
|
sed -i "s/^DB_USER=.*/DB_USER=minthcm/" /var/www/script/.env
|
||||||
sed -i "s/^DB_PASS=.*/DB_PASS=${DB_PASS}/" /var/www/script/.env
|
sed -i "s/^DB_PASS=.*/DB_PASS=$DB_PASS/" /var/www/script/.env
|
||||||
sed -i 's/^ELASTICSEARCH_HOST=.*/ELASTICSEARCH_HOST=localhost/' /var/www/script/.env
|
sed -i "s/^ELASTICSEARCH_HOST=.*/ELASTICSEARCH_HOST=localhost/" /var/www/script/.env
|
||||||
msg_ok "Configured MariaDB"
|
msg_ok "Configured Database"
|
||||||
{
|
|
||||||
echo "MintHCM DB Credentials"
|
|
||||||
echo "MariaDB User: minthcm"
|
|
||||||
echo "MariaDB Password: $DB_PASS"
|
|
||||||
} >>~/minthcm.creds
|
|
||||||
|
|
||||||
msg_info "Generating configuration file"
|
msg_info "Generating configuration file"
|
||||||
set -a
|
set -a
|
||||||
source /var/www/script/.env
|
source /var/www/script/.env
|
||||||
set +a
|
set +a
|
||||||
php /var/www/script/generate_config.php
|
$STD php /var/www/script/generate_config.php
|
||||||
msg_ok "Generated configuration file"
|
msg_ok "Generated configuration file"
|
||||||
|
|
||||||
msg_info "Installing MintHCM"
|
msg_info "Installing MintHCM"
|
||||||
cd /var/www/MintHCM && su -s /bin/bash -c 'php /var/www/MintHCM/MintCLI install < /var/www/MintHCM/configMint4' www-data
|
cd /var/www/MintHCM
|
||||||
|
$STD sudo -u www-data php MintCLI install < /var/www/MintHCM/configMint4
|
||||||
printf "* * * * * cd /var/www/MintHCM/legacy; php -f cron.php > /dev/null 2>&1\n" > /var/spool/cron/crontabs/www-data
|
printf "* * * * * cd /var/www/MintHCM/legacy; php -f cron.php > /dev/null 2>&1\n" > /var/spool/cron/crontabs/www-data
|
||||||
service cron start
|
service cron start
|
||||||
rm -f /var/www/MintHCM/configMint4
|
rm -f /var/www/MintHCM/configMint4
|
||||||
|
|||||||
@ -1,46 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: luismco
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/technomancer702/nodecast-tv
|
|
||||||
|
|
||||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
|
||||||
color
|
|
||||||
verb_ip6
|
|
||||||
catch_errors
|
|
||||||
setting_up_container
|
|
||||||
network_check
|
|
||||||
update_os
|
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "nodecast-tv" "technomancer702/nodecast-tv"
|
|
||||||
setup_nodejs
|
|
||||||
|
|
||||||
msg_info "Installing Modules"
|
|
||||||
cd /opt/nodecast-tv
|
|
||||||
$STD npm install
|
|
||||||
msg_ok "Installed Modules"
|
|
||||||
|
|
||||||
msg_info "Creating Service"
|
|
||||||
cat <<EOF >/etc/systemd/system/nodecast-tv.service
|
|
||||||
[Unit]
|
|
||||||
Description=nodecast-tv
|
|
||||||
After=network.target
|
|
||||||
Wants=network.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
WorkingDirectory=/opt/nodecast-tv
|
|
||||||
ExecStart=/bin/npm run dev
|
|
||||||
Restart=on-failure
|
|
||||||
RestartSec=10
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
EOF
|
|
||||||
systemctl enable -q --now nodecast-tv
|
|
||||||
msg_ok "Created Service"
|
|
||||||
|
|
||||||
motd_ssh
|
|
||||||
customize
|
|
||||||
cleanup_lxc
|
|
||||||
@ -57,7 +57,7 @@ echo "$COOLPASS" >~/.coolpass
|
|||||||
msg_ok "Installed Collabora Online"
|
msg_ok "Installed Collabora Online"
|
||||||
|
|
||||||
# OpenCloud
|
# OpenCloud
|
||||||
fetch_and_deploy_gh_release "opencloud" "opencloud-eu/opencloud" "singlefile" "v4.1.0" "/usr/bin" "opencloud-*-linux-amd64"
|
fetch_and_deploy_gh_release "opencloud" "opencloud-eu/opencloud" "singlefile" "v5.0.1" "/usr/bin" "opencloud-*-linux-amd64"
|
||||||
|
|
||||||
msg_info "Configuring OpenCloud"
|
msg_info "Configuring OpenCloud"
|
||||||
DATA_DIR="/var/lib/opencloud/"
|
DATA_DIR="/var/lib/opencloud/"
|
||||||
|
|||||||
@ -48,8 +48,10 @@ AUTH_SECRET=$(cat /opt/papra_data/.secret)
|
|||||||
BETTER_AUTH_SECRET=$(cat /opt/papra_data/.secret)
|
BETTER_AUTH_SECRET=$(cat /opt/papra_data/.secret)
|
||||||
BETTER_AUTH_TELEMETRY=0
|
BETTER_AUTH_TELEMETRY=0
|
||||||
CLIENT_BASE_URL=http://${LOCAL_IP}:1221
|
CLIENT_BASE_URL=http://${LOCAL_IP}:1221
|
||||||
|
SERVER_BASE_URL=http://${LOCAL_IP}:1221
|
||||||
EMAILS_DRY_RUN=true
|
EMAILS_DRY_RUN=true
|
||||||
INGESTION_FOLDER_ROOT=/opt/papra_data/ingestion
|
INGESTION_FOLDER_IS_ENABLED=true
|
||||||
|
INGESTION_FOLDER_ROOT_PATH=/opt/papra_data/ingestion
|
||||||
EOF
|
EOF
|
||||||
msg_ok "Configured Papra"
|
msg_ok "Configured Papra"
|
||||||
|
|
||||||
|
|||||||
@ -30,7 +30,7 @@ $STD apt install -y \
|
|||||||
gnupg
|
gnupg
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
import_local_ip
|
|
||||||
setup_mariadb
|
setup_mariadb
|
||||||
MARIADB_DB_NAME="piler" MARIADB_DB_USER="piler" setup_mariadb_db
|
MARIADB_DB_NAME="piler" MARIADB_DB_USER="piler" setup_mariadb_db
|
||||||
PHP_VERSION="8.3" PHP_FPM="YES" PHP_MODULE="ldap,gd,memcached,pdo,mysql,curl,zip" setup_php
|
PHP_VERSION="8.3" PHP_FPM="YES" PHP_MODULE="ldap,gd,memcached,pdo,mysql,curl,zip" setup_php
|
||||||
@ -179,8 +179,8 @@ msg_ok "Configured PHP-FPM Pool"
|
|||||||
|
|
||||||
msg_info "Configuring Piler Web GUI"
|
msg_info "Configuring Piler Web GUI"
|
||||||
# Check if config-site.php already exists (created by .deb package)
|
# Check if config-site.php already exists (created by .deb package)
|
||||||
if [ ! -f /var/www/piler/config-site.php ]; then
|
if [ ! -f /var/piler/www/config-site.php ]; then
|
||||||
cat <<EOF >/var/www/piler/config-site.php
|
cat <<EOF >/var/piler/www/config-site.php
|
||||||
<?php
|
<?php
|
||||||
\$config['SITE_NAME'] = 'Piler Email Archive';
|
\$config['SITE_NAME'] = 'Piler Email Archive';
|
||||||
\$config['SITE_URL'] = 'http://${LOCAL_IP}';
|
\$config['SITE_URL'] = 'http://${LOCAL_IP}';
|
||||||
@ -208,7 +208,7 @@ if [ ! -f /var/www/piler/config-site.php ]; then
|
|||||||
\$config['MEMCACHED_PREFIX'] = 'piler';
|
\$config['MEMCACHED_PREFIX'] = 'piler';
|
||||||
\$config['MEMCACHED_TTL'] = 3600;
|
\$config['MEMCACHED_TTL'] = 3600;
|
||||||
|
|
||||||
\$config['DIR_BASE'] = '/var/www/piler';
|
\$config['DIR_BASE'] = '/var/piler/www';
|
||||||
\$config['DIR_ATTACHMENT'] = '/var/piler/store';
|
\$config['DIR_ATTACHMENT'] = '/var/piler/store';
|
||||||
|
|
||||||
\$config['ENCRYPTION_KEY'] = '${PILER_KEY}';
|
\$config['ENCRYPTION_KEY'] = '${PILER_KEY}';
|
||||||
@ -227,16 +227,16 @@ if [ ! -f /var/www/piler/config-site.php ]; then
|
|||||||
EOF
|
EOF
|
||||||
fi
|
fi
|
||||||
|
|
||||||
chown -R piler:piler /var/www/piler
|
chown -R piler:piler /var/piler/www
|
||||||
chmod 755 /var/www/piler
|
chmod 755 /var/piler/www
|
||||||
msg_ok "Installed Piler Web GUI"
|
msg_ok "Configured Piler Web GUI"
|
||||||
|
|
||||||
msg_info "Configuring Nginx"
|
msg_info "Configuring Nginx"
|
||||||
cat <<EOF >/etc/nginx/sites-available/piler
|
cat <<EOF >/etc/nginx/sites-available/piler
|
||||||
server {
|
server {
|
||||||
listen 80;
|
listen 80;
|
||||||
server_name _;
|
server_name _;
|
||||||
root /var/www/piler;
|
root /var/piler/www;
|
||||||
index index.php;
|
index index.php;
|
||||||
|
|
||||||
access_log /var/log/nginx/piler-access.log;
|
access_log /var/log/nginx/piler-access.log;
|
||||||
|
|||||||
@ -14,14 +14,15 @@ network_check
|
|||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
msg_info "Installing Dependencies"
|
||||||
$STD apt-get install -y \
|
$STD apt install -y \
|
||||||
nginx \
|
nginx \
|
||||||
redis-server \
|
redis-server \
|
||||||
ffmpeg \
|
ffmpeg \
|
||||||
jpegoptim \
|
jpegoptim \
|
||||||
optipng \
|
optipng \
|
||||||
pngquant \
|
pngquant \
|
||||||
gifsicle
|
gifsicle \
|
||||||
|
libvips42
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
msg_info "Creating Pixelfed User"
|
msg_info "Creating Pixelfed User"
|
||||||
@ -29,10 +30,10 @@ useradd -rU -s /bin/bash pixelfed
|
|||||||
usermod -aG redis pixelfed
|
usermod -aG redis pixelfed
|
||||||
msg_ok "Created Pixelfed User"
|
msg_ok "Created Pixelfed User"
|
||||||
|
|
||||||
import_local_ip
|
|
||||||
PG_VERSION="17" setup_postgresql
|
PG_VERSION="17" setup_postgresql
|
||||||
PG_DB_NAME="pixelfed" PG_DB_USER="pixelfed" setup_postgresql_db
|
PG_DB_NAME="pixelfed" PG_DB_USER="pixelfed" setup_postgresql_db
|
||||||
PHP_VERSION="8.4" PHP_FPM="YES" PHP_MODULE="bcmath,ctype,exif,imagick,pgsql,redis,tokenizer" PHP_UPLOAD_MAX_FILESIZE="500M" PHP_POST_MAX_SIZE="500M" PHP_MAX_EXECUTION_TIME="600" setup_php
|
PHP_VERSION="8.4" PHP_FPM="YES" PHP_MODULE="bcmath,ctype,curl,exif,gd,imagick,intl,mbstring,pgsql,redis,xml,zip" PHP_UPLOAD_MAX_FILESIZE="500M" PHP_POST_MAX_SIZE="500M" PHP_MAX_EXECUTION_TIME="600" setup_php
|
||||||
setup_composer
|
setup_composer
|
||||||
|
|
||||||
msg_info "Configuring Redis"
|
msg_info "Configuring Redis"
|
||||||
@ -40,7 +41,7 @@ REDIS_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
|||||||
sed -i "s/^# requirepass foobared/requirepass $REDIS_PASS/" /etc/redis/redis.conf
|
sed -i "s/^# requirepass foobared/requirepass $REDIS_PASS/" /etc/redis/redis.conf
|
||||||
sed -i "s/^requirepass .*/requirepass $REDIS_PASS/" /etc/redis/redis.conf
|
sed -i "s/^requirepass .*/requirepass $REDIS_PASS/" /etc/redis/redis.conf
|
||||||
systemctl restart redis-server
|
systemctl restart redis-server
|
||||||
msg_ok "Redis configured"
|
msg_ok "Configured Redis"
|
||||||
|
|
||||||
msg_info "Configuring PHP-FPM Pool"
|
msg_info "Configuring PHP-FPM Pool"
|
||||||
cp /etc/php/8.4/fpm/pool.d/www.conf /etc/php/8.4/fpm/pool.d/pixelfed.conf
|
cp /etc/php/8.4/fpm/pool.d/www.conf /etc/php/8.4/fpm/pool.d/pixelfed.conf
|
||||||
@ -51,50 +52,95 @@ sed -i 's|^listen = .*|listen = /run/php/php8.4-fpm-pixelfed.sock|' /etc/php/8.4
|
|||||||
sed -i 's/^listen.owner = .*/listen.owner = www-data/' /etc/php/8.4/fpm/pool.d/pixelfed.conf
|
sed -i 's/^listen.owner = .*/listen.owner = www-data/' /etc/php/8.4/fpm/pool.d/pixelfed.conf
|
||||||
sed -i 's/^listen.group = .*/listen.group = www-data/' /etc/php/8.4/fpm/pool.d/pixelfed.conf
|
sed -i 's/^listen.group = .*/listen.group = www-data/' /etc/php/8.4/fpm/pool.d/pixelfed.conf
|
||||||
systemctl restart php8.4-fpm
|
systemctl restart php8.4-fpm
|
||||||
msg_ok "PHP-FPM Pool configured"
|
msg_ok "Configured PHP-FPM Pool"
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "pixelfed" "pixelfed/pixelfed" "tarball" "latest" "/opt/pixelfed"
|
fetch_and_deploy_gh_release "pixelfed" "pixelfed/pixelfed" "tarball" "latest" "/opt/pixelfed"
|
||||||
|
|
||||||
msg_info "Installing Pixelfed (Patience)"
|
msg_info "Installing Pixelfed (Patience)"
|
||||||
cd /opt/pixelfed
|
cd /opt/pixelfed
|
||||||
cp .env.example .env
|
cat <<EOF >/opt/pixelfed/.env
|
||||||
sed -i "s|APP_URL=.*|APP_URL=http://${LOCAL_IP}|" .env
|
APP_NAME="Pixelfed"
|
||||||
sed -i "s|APP_DOMAIN=.*|APP_DOMAIN=${LOCAL_IP}|" .env
|
APP_ENV="production"
|
||||||
sed -i "s|ADMIN_DOMAIN=.*|ADMIN_DOMAIN=${LOCAL_IP}|" .env
|
APP_KEY=
|
||||||
sed -i "s|SESSION_DOMAIN=.*|SESSION_DOMAIN=${LOCAL_IP}|" .env
|
APP_DEBUG="false"
|
||||||
sed -i "s|DB_CONNECTION=.*|DB_CONNECTION=pgsql|" .env
|
APP_URL=http://${LOCAL_IP}
|
||||||
sed -i "s|DB_HOST=.*|DB_HOST=127.0.0.1|" .env
|
APP_DOMAIN=${LOCAL_IP}
|
||||||
sed -i "s|DB_PORT=.*|DB_PORT=5432|" .env
|
ADMIN_DOMAIN=${LOCAL_IP}
|
||||||
sed -i "s|DB_DATABASE=.*|DB_DATABASE=${PG_DB_NAME}|" .env
|
SESSION_DOMAIN=${LOCAL_IP}
|
||||||
sed -i "s|DB_USERNAME=.*|DB_USERNAME=${PG_DB_USER}|" .env
|
TRUST_PROXIES="*"
|
||||||
sed -i "s|DB_PASSWORD=.*|DB_PASSWORD=${PG_DB_PASS}|" .env
|
FORCE_HTTPS_URLS="false"
|
||||||
sed -i "s|REDIS_HOST=.*|REDIS_HOST=127.0.0.1|" .env
|
|
||||||
sed -i "s|REDIS_PASSWORD=.*|REDIS_PASSWORD=${REDIS_PASS}|" .env
|
|
||||||
sed -i "s|REDIS_PORT=.*|REDIS_PORT=6379|" .env
|
|
||||||
sed -i "s|ACTIVITY_PUB=.*|ACTIVITY_PUB=true|" .env
|
|
||||||
sed -i "s|AP_REMOTE_FOLLOW=.*|AP_REMOTE_FOLLOW=true|" .env
|
|
||||||
sed -i "s|OAUTH_ENABLED=.*|OAUTH_ENABLED=true|" .env
|
|
||||||
echo "SESSION_SECURE_COOKIE=false" >>.env
|
|
||||||
|
|
||||||
chown -R pixelfed:pixelfed /opt/pixelfed
|
OPEN_REGISTRATION="false"
|
||||||
|
ENFORCE_EMAIL_VERIFICATION="false"
|
||||||
|
PF_MAX_USERS="1000"
|
||||||
|
OAUTH_ENABLED="true"
|
||||||
|
ENABLE_CONFIG_CACHE="true"
|
||||||
|
INSTANCE_DISCOVER_PUBLIC="true"
|
||||||
|
|
||||||
|
PF_OPTIMIZE_IMAGES="true"
|
||||||
|
IMAGE_QUALITY="80"
|
||||||
|
MAX_PHOTO_SIZE="15000"
|
||||||
|
MAX_CAPTION_LENGTH="500"
|
||||||
|
MAX_ALBUM_LENGTH="4"
|
||||||
|
|
||||||
|
DB_CONNECTION="pgsql"
|
||||||
|
DB_HOST="127.0.0.1"
|
||||||
|
DB_PORT="5432"
|
||||||
|
DB_DATABASE="${PG_DB_NAME}"
|
||||||
|
DB_USERNAME="${PG_DB_USER}"
|
||||||
|
DB_PASSWORD="${PG_DB_PASS}"
|
||||||
|
|
||||||
|
REDIS_CLIENT="predis"
|
||||||
|
REDIS_SCHEME="tcp"
|
||||||
|
REDIS_HOST="127.0.0.1"
|
||||||
|
REDIS_PASSWORD="${REDIS_PASS}"
|
||||||
|
REDIS_PORT="6379"
|
||||||
|
|
||||||
|
SESSION_DRIVER="database"
|
||||||
|
CACHE_DRIVER="redis"
|
||||||
|
QUEUE_DRIVER="redis"
|
||||||
|
BROADCAST_DRIVER="log"
|
||||||
|
LOG_CHANNEL="stack"
|
||||||
|
HORIZON_PREFIX="horizon-"
|
||||||
|
|
||||||
|
ACTIVITY_PUB="true"
|
||||||
|
AP_REMOTE_FOLLOW="true"
|
||||||
|
AP_INBOX="true"
|
||||||
|
AP_OUTBOX="true"
|
||||||
|
AP_SHAREDINBOX="true"
|
||||||
|
|
||||||
|
EXP_EMC="true"
|
||||||
|
|
||||||
|
MAIL_DRIVER="log"
|
||||||
|
MAIL_HOST="smtp.mailtrap.io"
|
||||||
|
MAIL_PORT="2525"
|
||||||
|
MAIL_USERNAME="null"
|
||||||
|
MAIL_PASSWORD="null"
|
||||||
|
MAIL_ENCRYPTION="null"
|
||||||
|
MAIL_FROM_ADDRESS="pixelfed@example.com"
|
||||||
|
MAIL_FROM_NAME="Pixelfed"
|
||||||
|
|
||||||
|
PF_ENABLE_CLOUD="false"
|
||||||
|
FILESYSTEM_CLOUD="s3"
|
||||||
|
SESSION_SECURE_COOKIE="false"
|
||||||
|
HTTPS="false"
|
||||||
|
EOF
|
||||||
chmod -R 755 /opt/pixelfed
|
chmod -R 755 /opt/pixelfed
|
||||||
chmod -R 775 /opt/pixelfed/storage /opt/pixelfed/bootstrap/cache
|
chmod -R 775 /opt/pixelfed/storage /opt/pixelfed/bootstrap/cache
|
||||||
|
|
||||||
export COMPOSER_ALLOW_SUPERUSER=1
|
export COMPOSER_ALLOW_SUPERUSER=1
|
||||||
cd /opt/pixelfed
|
|
||||||
$STD composer install --no-dev --no-ansi --no-interaction --optimize-autoloader
|
$STD composer install --no-dev --no-ansi --no-interaction --optimize-autoloader
|
||||||
|
$STD php artisan key:generate --force
|
||||||
sudo -u pixelfed php artisan key:generate
|
$STD php artisan storage:link
|
||||||
sudo -u pixelfed php artisan storage:link
|
$STD php artisan migrate --force
|
||||||
$STD sudo -u pixelfed php artisan migrate --force
|
$STD php artisan import:cities
|
||||||
$STD sudo -u pixelfed php artisan import:cities
|
$STD php artisan passport:keys
|
||||||
$STD sudo -u pixelfed php artisan passport:keys
|
$STD php artisan route:cache
|
||||||
$STD sudo -u pixelfed php artisan route:cache
|
$STD php artisan view:cache
|
||||||
$STD sudo -u pixelfed php artisan view:cache
|
$STD php artisan config:cache
|
||||||
$STD sudo -u pixelfed php artisan config:cache
|
$STD php artisan instance:actor
|
||||||
$STD sudo -u pixelfed php artisan instance:actor
|
$STD php artisan horizon:install
|
||||||
$STD sudo -u pixelfed php artisan horizon:install
|
chown -R pixelfed:pixelfed /opt/pixelfed
|
||||||
msg_ok "Pixelfed installed"
|
msg_ok "Installed Pixelfed"
|
||||||
|
|
||||||
msg_info "Configuring Nginx"
|
msg_info "Configuring Nginx"
|
||||||
cat <<'EOF' >/etc/nginx/sites-available/pixelfed
|
cat <<'EOF' >/etc/nginx/sites-available/pixelfed
|
||||||
@ -136,8 +182,8 @@ EOF
|
|||||||
ln -sf /etc/nginx/sites-available/pixelfed /etc/nginx/sites-enabled/pixelfed
|
ln -sf /etc/nginx/sites-available/pixelfed /etc/nginx/sites-enabled/pixelfed
|
||||||
rm -f /etc/nginx/sites-enabled/default
|
rm -f /etc/nginx/sites-enabled/default
|
||||||
$STD nginx -t
|
$STD nginx -t
|
||||||
systemctl enable -q --now nginx
|
systemctl reload nginx
|
||||||
msg_ok "Nginx configured"
|
msg_ok "Configured Nginx"
|
||||||
|
|
||||||
msg_info "Creating Services"
|
msg_info "Creating Services"
|
||||||
cat <<'EOF' >/etc/systemd/system/pixelfed-horizon.service
|
cat <<'EOF' >/etc/systemd/system/pixelfed-horizon.service
|
||||||
@ -181,30 +227,9 @@ Persistent=true
|
|||||||
[Install]
|
[Install]
|
||||||
WantedBy=timers.target
|
WantedBy=timers.target
|
||||||
EOF
|
EOF
|
||||||
|
systemctl enable -q --now pixelfed-horizon pixelfed-scheduler.timer
|
||||||
|
msg_ok "Created Services"
|
||||||
|
|
||||||
systemctl daemon-reload
|
|
||||||
systemctl enable -q --now pixelfed-horizon
|
|
||||||
systemctl enable -q --now pixelfed-scheduler.timer
|
|
||||||
msg_ok "Services created"
|
|
||||||
|
|
||||||
msg_info "Saving Credentials"
|
|
||||||
CREDS_FILE="/root/pixelfed.creds"
|
|
||||||
{
|
|
||||||
echo "Pixelfed Credentials"
|
|
||||||
echo ""
|
|
||||||
echo "PostgreSQL"
|
|
||||||
echo " Database: ${PG_DB_NAME}"
|
|
||||||
echo " User: ${PG_DB_USER}"
|
|
||||||
echo " Password: ${PG_DB_PASS}"
|
|
||||||
echo ""
|
|
||||||
echo "Redis"
|
|
||||||
echo " Host: 127.0.0.1:6379"
|
|
||||||
echo " Password: ${REDIS_PASS}"
|
|
||||||
echo ""
|
|
||||||
echo "Web Interface: http://${LOCAL_IP}"
|
|
||||||
echo "Config: /opt/pixelfed/.env"
|
|
||||||
} >"$CREDS_FILE"
|
|
||||||
msg_ok "Credentials saved to ${CREDS_FILE}"
|
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
customize
|
customize
|
||||||
|
|||||||
@ -1,43 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: GoldenSpringness | MickLesk (CanbiZ)
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/orhun/rustypaste
|
|
||||||
|
|
||||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
|
||||||
color
|
|
||||||
verb_ip6
|
|
||||||
catch_errors
|
|
||||||
setting_up_container
|
|
||||||
network_check
|
|
||||||
update_os
|
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "rustypaste" "orhun/rustypaste" "prebuild" "latest" "/opt/rustypaste" "*x86_64-unknown-linux-gnu.tar.gz"
|
|
||||||
fetch_and_deploy_gh_release "rustypaste-cli" "orhun/rustypaste-cli" "prebuild" "latest" "/usr/local/bin" "*x86_64-unknown-linux-gnu.tar.gz"
|
|
||||||
|
|
||||||
msg_info "Setting up RustyPaste"
|
|
||||||
cd /opt/rustypaste
|
|
||||||
sed -i 's|^address = ".*"|address = "0.0.0.0:8000"|' config.toml
|
|
||||||
msg_ok "Set up RustyPaste"
|
|
||||||
|
|
||||||
msg_info "Creating Service"
|
|
||||||
cat <<EOF >/etc/systemd/system/rustypaste.service
|
|
||||||
[Unit]
|
|
||||||
Description=rustypaste Service
|
|
||||||
After=network.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
WorkingDirectory=/opt/rustypaste
|
|
||||||
ExecStart=/opt/rustypaste/rustypaste
|
|
||||||
Restart=always
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
EOF
|
|
||||||
systemctl enable -q --now rustypaste
|
|
||||||
msg_ok "Created Service"
|
|
||||||
|
|
||||||
motd_ssh
|
|
||||||
customize
|
|
||||||
cleanup_lxc
|
|
||||||
@ -1,90 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: vhsdream
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/calibrain/shelfmark
|
|
||||||
|
|
||||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
|
||||||
color
|
|
||||||
verb_ip6
|
|
||||||
catch_errors
|
|
||||||
setting_up_container
|
|
||||||
network_check
|
|
||||||
update_os
|
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
|
||||||
$STD apt install -y \
|
|
||||||
unrar-free
|
|
||||||
msg_ok "Installed Dependencies"
|
|
||||||
|
|
||||||
NODE_VERSION="22" setup_nodejs
|
|
||||||
PYTHON_VERSION="3.12" setup_uv
|
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "shelfmark" "calibrain/shelfmark" "tarball" "latest" "/opt/shelfmark"
|
|
||||||
|
|
||||||
msg_info "Building Shelfmark frontend"
|
|
||||||
cd /opt/shelfmark/src/frontend
|
|
||||||
$STD npm ci
|
|
||||||
$STD npm run build
|
|
||||||
mv /opt/shelfmark/src/frontend/dist /opt/shelfmark/frontend-dist
|
|
||||||
msg_ok "Built Shelfmark frontend"
|
|
||||||
|
|
||||||
msg_info "Configuring Shelfmark"
|
|
||||||
cd /opt/shelfmark
|
|
||||||
$STD uv venv ./venv
|
|
||||||
$STD source ./venv/bin/activate
|
|
||||||
$STD uv pip install -r requirements-base.txt
|
|
||||||
mkdir -p {/var/log/shelfmark,/tmp/shelfmark,/etc/shelfmark}
|
|
||||||
cat <<EOF >/etc/shelfmark/.env
|
|
||||||
DOCKERMODE=false
|
|
||||||
CONFIG_DIR=/etc/shelfmark
|
|
||||||
TMP_DIR=/tmp/shelfmark
|
|
||||||
ENABLE_LOGGING=true
|
|
||||||
FLASK_HOST=0.0.0.0
|
|
||||||
FLASK_PORT=8084
|
|
||||||
# SESSION_COOKIES_SECURE=true
|
|
||||||
# CWA_DB_PATH=
|
|
||||||
# USE_CF_BYPASS=true
|
|
||||||
# USING_EXTERNAL_BYPASSER=true
|
|
||||||
# EXT_BYPASSER_URL=
|
|
||||||
# EXT_BYPASSER_PATH=
|
|
||||||
EOF
|
|
||||||
msg_ok "Configured Shelfmark"
|
|
||||||
|
|
||||||
msg_info "Creating Service and start script"
|
|
||||||
cat <<EOF >/etc/systemd/system/shelfmark.service
|
|
||||||
[Unit]
|
|
||||||
Description=Shelfmark server
|
|
||||||
After=network.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
WorkingDirectory=/opt/shelfmark
|
|
||||||
EnvironmentFile=/etc/shelfmark/.env
|
|
||||||
ExecStart=/usr/bin/bash /opt/shelfmark/start.sh
|
|
||||||
Restart=always
|
|
||||||
RestartSec=10
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
EOF
|
|
||||||
|
|
||||||
cat <<EOF >/opt/shelfmark/start.sh
|
|
||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
source /opt/shelfmark/venv/bin/activate
|
|
||||||
set -a
|
|
||||||
source /etc/shelfmark/.env
|
|
||||||
set +a
|
|
||||||
|
|
||||||
gunicorn --worker-class geventwebsocket.gunicorn.workers.GeventWebSocketWorker --workers 1 -t 300 -b 0.0.0.0:8084 shelfmark.main:app
|
|
||||||
EOF
|
|
||||||
chmod +x /opt/shelfmark/start.sh
|
|
||||||
|
|
||||||
systemctl enable -q --now shelfmark
|
|
||||||
msg_ok "Created Services and start script"
|
|
||||||
|
|
||||||
motd_ssh
|
|
||||||
customize
|
|
||||||
cleanup_lxc
|
|
||||||
51
install/sonobarr-install.sh
Normal file
51
install/sonobarr-install.sh
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: GoldenSpringness
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/Dodelidoo-Labs/sonobarr
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "sonobarr" "Dodelidoo-Labs/sonobarr" "tarball"
|
||||||
|
PYTHON_VERSION="3.12" setup_uv
|
||||||
|
|
||||||
|
msg_info "Setting up sonobarr"
|
||||||
|
source /opt/sonobarr/venv/bin/activate
|
||||||
|
$STD uv pip install --no-cache-dir -r /opt/sonobarr/requirements.txt
|
||||||
|
mkdir -p /etc/sonobarr
|
||||||
|
mv /opt/sonobarr/.sample-env /etc/sonobarr/.env
|
||||||
|
sed -i "s/^secret_key=.*/secret_key=$(openssl rand -hex 16)/" /etc/sonobarr/.env
|
||||||
|
sed -i "s/^sonobarr_superadmin_password=.*/sonobarr_superadmin_password=$(openssl rand -hex 16)/" /etc/sonobarr/.env
|
||||||
|
echo "release_version=$(cat ~/.sonobarr)" >>/etc/sonobarr/.env
|
||||||
|
echo "sonobarr_config_dir=/etc/sonobarr" >>/etc/sonobarr.env
|
||||||
|
msg_ok "Set up sonobarr"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/sonobarr.service
|
||||||
|
[Unit]
|
||||||
|
Description=sonobarr Service
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
WorkingDirectory=/opt/sonobarr/src
|
||||||
|
EnvironmentFile=/etc/sonobarr/.env
|
||||||
|
Environment="PATH=/opt/sonobarr/venv/bin"
|
||||||
|
ExecStart=/bin/bash -c 'gunicorn Sonobarr:app -c ../gunicorn_config.py'
|
||||||
|
Restart=always
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now sonobarr
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
100
install/vaultwarden-install.sh
Normal file
100
install/vaultwarden-install.sh
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/dani-garcia/vaultwarden
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
$STD apt install -y \
|
||||||
|
build-essential \
|
||||||
|
pkgconf \
|
||||||
|
libssl-dev \
|
||||||
|
libmariadb-dev-compat \
|
||||||
|
libpq-dev \
|
||||||
|
argon2 \
|
||||||
|
ssl-cert
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
setup_rust
|
||||||
|
fetch_and_deploy_gh_release "vaultwarden" "dani-garcia/vaultwarden" "tarball" "latest" "/tmp/vaultwarden-src"
|
||||||
|
|
||||||
|
msg_info "Building Vaultwarden (Patience)"
|
||||||
|
cd /tmp/vaultwarden-src
|
||||||
|
$STD cargo build --features "sqlite,mysql,postgresql" --release
|
||||||
|
msg_ok "Built Vaultwarden"
|
||||||
|
|
||||||
|
$STD addgroup --system vaultwarden
|
||||||
|
$STD adduser --system --home /opt/vaultwarden --shell /usr/sbin/nologin --no-create-home --gecos 'vaultwarden' --ingroup vaultwarden --disabled-login --disabled-password vaultwarden
|
||||||
|
mkdir -p /opt/vaultwarden/{bin,data,web-vault}
|
||||||
|
cp target/release/vaultwarden /opt/vaultwarden/bin/
|
||||||
|
cd ~ && rm -rf /tmp/vaultwarden-src
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "vaultwarden_webvault" "dani-garcia/bw_web_builds" "prebuild" "latest" "/opt/vaultwarden/web-vault" "bw_web_*.tar.gz"
|
||||||
|
|
||||||
|
cat <<EOF >/opt/vaultwarden/.env
|
||||||
|
ADMIN_TOKEN=''
|
||||||
|
ROCKET_ADDRESS=0.0.0.0
|
||||||
|
ROCKET_TLS='{certs="/opt/vaultwarden/ssl-cert-snakeoil.pem",key="/opt/vaultwarden/ssl-cert-snakeoil.key"}'
|
||||||
|
DATA_FOLDER=/opt/vaultwarden/data
|
||||||
|
DATABASE_MAX_CONNS=10
|
||||||
|
WEB_VAULT_FOLDER=/opt/vaultwarden/web-vault
|
||||||
|
WEB_VAULT_ENABLED=true
|
||||||
|
EOF
|
||||||
|
|
||||||
|
mv /etc/ssl/certs/ssl-cert-snakeoil.pem /opt/vaultwarden/
|
||||||
|
mv /etc/ssl/private/ssl-cert-snakeoil.key /opt/vaultwarden/
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
chown -R vaultwarden:vaultwarden /opt/vaultwarden/
|
||||||
|
chown root:root /opt/vaultwarden/bin/vaultwarden
|
||||||
|
chmod +x /opt/vaultwarden/bin/vaultwarden
|
||||||
|
chown -R root:root /opt/vaultwarden/web-vault/
|
||||||
|
chmod +r /opt/vaultwarden/.env
|
||||||
|
|
||||||
|
cat <<'EOF' >/etc/systemd/system/vaultwarden.service
|
||||||
|
[Unit]
|
||||||
|
Description=Bitwarden Server (Powered by Vaultwarden)
|
||||||
|
Documentation=https://github.com/dani-garcia/vaultwarden
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
User=vaultwarden
|
||||||
|
Group=vaultwarden
|
||||||
|
EnvironmentFile=-/opt/vaultwarden/.env
|
||||||
|
ExecStart=/opt/vaultwarden/bin/vaultwarden
|
||||||
|
LimitNOFILE=65535
|
||||||
|
LimitNPROC=4096
|
||||||
|
PrivateTmp=true
|
||||||
|
PrivateDevices=true
|
||||||
|
ProtectHome=true
|
||||||
|
ProtectSystem=strict
|
||||||
|
DevicePolicy=closed
|
||||||
|
ProtectControlGroups=yes
|
||||||
|
ProtectKernelModules=yes
|
||||||
|
ProtectKernelTunables=yes
|
||||||
|
RestrictNamespaces=yes
|
||||||
|
RestrictRealtime=yes
|
||||||
|
MemoryDenyWriteExecute=yes
|
||||||
|
LockPersonality=yes
|
||||||
|
WorkingDirectory=/opt/vaultwarden
|
||||||
|
ReadWriteDirectories=/opt/vaultwarden/data
|
||||||
|
AmbientCapabilities=CAP_NET_BIND_SERVICE
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable --q -now vaultwarden
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
27
install/vikunja-install.sh
Normal file
27
install/vikunja-install.sh
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: MickLesk (Canbiz) | Co-Author: CrazyWolf13
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://vikunja.io/
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "vikunja" "go-vikunja/vikunja" "binary"
|
||||||
|
|
||||||
|
msg_info "Setting up Vikunja"
|
||||||
|
sed -i 's|^# \(service:\)|\1|' /etc/vikunja/config.yml
|
||||||
|
sed -i "s|^ # \(publicurl: \).*| \1\"http://$LOCAL_IP\"|" /etc/vikunja/config.yml
|
||||||
|
sed -i "0,/^ # \(timezone: \).*/s|| \1${tz}|" /etc/vikunja/config.yml
|
||||||
|
systemctl enable -q --now vikunja
|
||||||
|
msg_ok "Set up Vikunja"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
@ -24,7 +24,7 @@ msg_ok "Installed dependencies"
|
|||||||
NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs
|
NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs
|
||||||
fetch_and_deploy_gh_release "wishlist" "cmintey/wishlist" "tarball"
|
fetch_and_deploy_gh_release "wishlist" "cmintey/wishlist" "tarball"
|
||||||
LATEST_APP_VERSION=$(get_latest_github_release "cmintey/wishlist" false)
|
LATEST_APP_VERSION=$(get_latest_github_release "cmintey/wishlist" false)
|
||||||
import_local_ip
|
|
||||||
|
|
||||||
msg_info "Installing Wishlist"
|
msg_info "Installing Wishlist"
|
||||||
cd /opt/wishlist
|
cd /opt/wishlist
|
||||||
|
|||||||
71
install/writefreely-install.sh
Normal file
71
install/writefreely-install.sh
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: StellaeAlis
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/writefreely/writefreely
|
||||||
|
|
||||||
|
# Import Functions and Setup
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
$STD apt install -y crudini
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
setup_mariadb
|
||||||
|
MARIADB_DB_NAME="writefreely" MARIADB_DB_USER="writefreely" setup_mariadb_db
|
||||||
|
|
||||||
|
get_lxc_ip
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "writefreely" "writefreely/writefreely" "prebuild" "latest" "/opt/writefreely" "writefreely_*_linux_amd64.tar.gz"
|
||||||
|
|
||||||
|
msg_info "Setting up WriteFreely"
|
||||||
|
cd /opt/writefreely
|
||||||
|
$STD ./writefreely config generate
|
||||||
|
$STD ./writefreely keys generate
|
||||||
|
msg_ok "Setup WriteFreely"
|
||||||
|
|
||||||
|
msg_info "Configuring WriteFreely"
|
||||||
|
$STD crudini --set config.ini server port 80
|
||||||
|
$STD crudini --set config.ini server bind $LOCAL_IP
|
||||||
|
$STD crudini --set config.ini database username $MARIADB_DB_USER
|
||||||
|
$STD crudini --set config.ini database password $MARIADB_DB_PASS
|
||||||
|
$STD crudini --set config.ini database database $MARIADB_DB_NAME
|
||||||
|
$STD crudini --set config.ini app host http://$LOCAL_IP:80
|
||||||
|
$STD ./writefreely db init
|
||||||
|
msg_ok "Configured WriteFreely"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/writefreely.service
|
||||||
|
[Unit]
|
||||||
|
Description=WriteFreely Service
|
||||||
|
After=syslog.target network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=/opt/writefreely
|
||||||
|
ExecStart=/opt/writefreely/writefreely
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now writefreely
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
msg_info "Cleaning up"
|
||||||
|
$STD rm ~/writefreely.creds
|
||||||
|
msg_ok "Cleaned up"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
|
||||||
|
cleanup_lxc
|
||||||
@ -196,11 +196,17 @@ ensure_usr_local_bin_persist() {
|
|||||||
|
|
||||||
download_with_progress() {
|
download_with_progress() {
|
||||||
# $1 url, $2 dest
|
# $1 url, $2 dest
|
||||||
local url="$1" out="$2" cl
|
local url="$1" out="$2" content_length
|
||||||
need_tool curl pv || return 1
|
need_tool curl pv || return 1
|
||||||
cl=$(curl -fsSLI "$url" 2>/dev/null | awk 'tolower($0) ~ /^content-length:/ {print $2}' | tr -d '\r')
|
|
||||||
if [ -n "$cl" ]; then
|
content_length=$(
|
||||||
curl -fsSL "$url" | pv -s "$cl" >"$out" || {
|
curl -fsSLI "$url" 2>/dev/null |
|
||||||
|
awk '(tolower($1) ~ /^content-length:/) && ($2 + 0 > 0) {print $2+0}' |
|
||||||
|
tail -1 | tr -cd '[:digit:]' || true
|
||||||
|
)
|
||||||
|
|
||||||
|
if [ -n "$content_length" ]; then
|
||||||
|
curl -fsSL "$url" | pv -s "$content_length" >"$out" || {
|
||||||
msg_error "Download failed: $url"
|
msg_error "Download failed: $url"
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
@ -277,7 +283,7 @@ fetch_and_deploy_gh_release() {
|
|||||||
# $1 app, $2 repo, [$3 mode], [$4 version], [$5 target], [$6 asset_pattern
|
# $1 app, $2 repo, [$3 mode], [$4 version], [$5 target], [$6 asset_pattern
|
||||||
local app="$1" repo="$2" mode="${3:-tarball}" version="${4:-latest}" target="${5:-/opt/$1}" pattern="${6:-}"
|
local app="$1" repo="$2" mode="${3:-tarball}" version="${4:-latest}" target="${5:-/opt/$1}" pattern="${6:-}"
|
||||||
local app_lc
|
local app_lc
|
||||||
app_lc="$(lower "$app" | tr -d ' ')"
|
app_lc=$(lower "$app" | tr -d ' ')
|
||||||
local vfile="$HOME/.${app_lc}"
|
local vfile="$HOME/.${app_lc}"
|
||||||
local json url filename tmpd unpack
|
local json url filename tmpd unpack
|
||||||
|
|
||||||
@ -288,7 +294,7 @@ fetch_and_deploy_gh_release() {
|
|||||||
need_tool curl jq tar || return 1
|
need_tool curl jq tar || return 1
|
||||||
[ "$mode" = "prebuild" ] || [ "$mode" = "singlefile" ] && need_tool unzip >/dev/null 2>&1 || true
|
[ "$mode" = "prebuild" ] || [ "$mode" = "singlefile" ] && need_tool unzip >/dev/null 2>&1 || true
|
||||||
|
|
||||||
tmpd="$(mktemp -d)" || return 1
|
tmpd=$(mktemp -d) || return 1
|
||||||
mkdir -p "$target"
|
mkdir -p "$target"
|
||||||
|
|
||||||
# Release JSON (with token/rate-limit handling)
|
# Release JSON (with token/rate-limit handling)
|
||||||
@ -305,10 +311,10 @@ fetch_and_deploy_gh_release() {
|
|||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
fi
|
fi
|
||||||
json="$(cat "$tmpd/release.json")"
|
json=$(cat "$tmpd/release.json")
|
||||||
|
|
||||||
# correct Version
|
# correct Version
|
||||||
version="$(printf '%s' "$json" | jq -r '.tag_name // empty')"
|
version=$(printf '%s' "$json" | jq -r '.tag_name // empty')
|
||||||
version="${version#v}"
|
version="${version#v}"
|
||||||
|
|
||||||
[ -z "$version" ] && {
|
[ -z "$version" ] && {
|
||||||
@ -317,9 +323,15 @@ fetch_and_deploy_gh_release() {
|
|||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get_url() {
|
||||||
|
printf '%s' "$json" | jq -r '.assets[].browser_download_url' |
|
||||||
|
awk -v p="$pattern" 'BEGIN{IGNORECASE=1} $0 ~ p {print; exit}' |
|
||||||
|
tr -d '[:cntrl:]'
|
||||||
|
}
|
||||||
|
|
||||||
case "$mode" in
|
case "$mode" in
|
||||||
tarball | source)
|
tarball | source)
|
||||||
url="$(printf '%s' "$json" | jq -r '.tarball_url // empty')"
|
url=$(printf '%s' "$json" | jq -r '.tarball_url // empty')
|
||||||
[ -z "$url" ] && url="https://github.com/$repo/archive/refs/tags/v$version.tar.gz"
|
[ -z "$url" ] && url="https://github.com/$repo/archive/refs/tags/v$version.tar.gz"
|
||||||
filename="${app_lc}-${version}.tar.gz"
|
filename="${app_lc}-${version}.tar.gz"
|
||||||
download_with_progress "$url" "$tmpd/$filename" || {
|
download_with_progress "$url" "$tmpd/$filename" || {
|
||||||
@ -331,7 +343,7 @@ fetch_and_deploy_gh_release() {
|
|||||||
rm -rf "$tmpd"
|
rm -rf "$tmpd"
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
unpack="$(find "$tmpd" -mindepth 1 -maxdepth 1 -type d | head -n1)"
|
unpack=$(find "$tmpd" -mindepth 1 -maxdepth 1 -type d | head -n1)
|
||||||
[ "${CLEAN_INSTALL:-0}" = "1" ] && rm -rf "${target:?}/"*
|
[ "${CLEAN_INSTALL:-0}" = "1" ] && rm -rf "${target:?}/"*
|
||||||
# copy content of unpack to target
|
# copy content of unpack to target
|
||||||
(cd "$unpack" && tar -cf - .) | (cd "$target" && tar -xf -) || {
|
(cd "$unpack" && tar -cf - .) | (cd "$target" && tar -xf -) || {
|
||||||
@ -342,7 +354,7 @@ fetch_and_deploy_gh_release() {
|
|||||||
;;
|
;;
|
||||||
binary)
|
binary)
|
||||||
[ -n "$pattern" ] || pattern="*.apk"
|
[ -n "$pattern" ] || pattern="*.apk"
|
||||||
url="$(printf '%s' "$json" | jq -r '.assets[].browser_download_url' | awk -v p="$pattern" 'BEGIN{IGNORECASE=1} $0 ~ p {print; exit}')"
|
url=$(get_url)
|
||||||
[ -z "$url" ] && {
|
[ -z "$url" ] && {
|
||||||
msg_error "binary asset not found for pattern: $pattern"
|
msg_error "binary asset not found for pattern: $pattern"
|
||||||
rm -rf "$tmpd"
|
rm -rf "$tmpd"
|
||||||
@ -374,10 +386,7 @@ fetch_and_deploy_gh_release() {
|
|||||||
rm -rf "$tmpd"
|
rm -rf "$tmpd"
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
url="$(printf '%s' "$json" | jq -r '.assets[].browser_download_url' | awk -v p="$pattern" '
|
url=$(get_url)
|
||||||
BEGIN{IGNORECASE=1}
|
|
||||||
$0 ~ p {print; exit}
|
|
||||||
')"
|
|
||||||
[ -z "$url" ] && {
|
[ -z "$url" ] && {
|
||||||
msg_error "asset not found for pattern: $pattern"
|
msg_error "asset not found for pattern: $pattern"
|
||||||
rm -rf "$tmpd"
|
rm -rf "$tmpd"
|
||||||
@ -411,7 +420,7 @@ fetch_and_deploy_gh_release() {
|
|||||||
[ "${CLEAN_INSTALL:-0}" = "1" ] && rm -rf "${target:?}/"*
|
[ "${CLEAN_INSTALL:-0}" = "1" ] && rm -rf "${target:?}/"*
|
||||||
# top-level folder strippen
|
# top-level folder strippen
|
||||||
if [ "$(find "$tmpd/unp" -mindepth 1 -maxdepth 1 -type d | wc -l)" -eq 1 ] && [ -z "$(find "$tmpd/unp" -mindepth 1 -maxdepth 1 -type f | head -n1)" ]; then
|
if [ "$(find "$tmpd/unp" -mindepth 1 -maxdepth 1 -type d | wc -l)" -eq 1 ] && [ -z "$(find "$tmpd/unp" -mindepth 1 -maxdepth 1 -type f | head -n1)" ]; then
|
||||||
unpack="$(find "$tmpd/unp" -mindepth 1 -maxdepth 1 -type d)"
|
unpack=$(find "$tmpd/unp" -mindepth 1 -maxdepth 1 -type d)
|
||||||
(cd "$unpack" && tar -cf - .) | (cd "$target" && tar -xf -) || {
|
(cd "$unpack" && tar -cf - .) | (cd "$target" && tar -xf -) || {
|
||||||
msg_error "copy failed"
|
msg_error "copy failed"
|
||||||
rm -rf "$tmpd"
|
rm -rf "$tmpd"
|
||||||
@ -431,10 +440,7 @@ fetch_and_deploy_gh_release() {
|
|||||||
rm -rf "$tmpd"
|
rm -rf "$tmpd"
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
url="$(printf '%s' "$json" | jq -r '.assets[].browser_download_url' | awk -v p="$pattern" '
|
url=$(get_url)
|
||||||
BEGIN{IGNORECASE=1}
|
|
||||||
$0 ~ p {print; exit}
|
|
||||||
')"
|
|
||||||
[ -z "$url" ] && {
|
[ -z "$url" ] && {
|
||||||
msg_error "asset not found for pattern: $pattern"
|
msg_error "asset not found for pattern: $pattern"
|
||||||
rm -rf "$tmpd"
|
rm -rf "$tmpd"
|
||||||
|
|||||||
155
misc/api.func
155
misc/api.func
@ -1,6 +1,6 @@
|
|||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
# Author: michelroegl-brunner
|
# Author: michelroegl-brunner
|
||||||
# License: MIT | https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/LICENSE
|
# License: MIT | https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/LICENSE
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# API.FUNC - TELEMETRY & DIAGNOSTICS API
|
# API.FUNC - TELEMETRY & DIAGNOSTICS API
|
||||||
@ -36,14 +36,16 @@
|
|||||||
#
|
#
|
||||||
# - Maps numeric exit codes to human-readable error descriptions
|
# - Maps numeric exit codes to human-readable error descriptions
|
||||||
# - Supports:
|
# - Supports:
|
||||||
# * Generic/Shell errors (1, 2, 126, 127, 128, 130, 137, 139, 143)
|
# * Generic/Shell errors (1, 2, 124, 126-130, 134, 137, 139, 141, 143)
|
||||||
# * Package manager errors (APT, DPKG: 100, 101, 255)
|
# * curl/wget errors (6, 7, 22, 28, 35)
|
||||||
# * Node.js/npm errors (243-249, 254)
|
# * Package manager errors (APT, DPKG: 100-102, 255)
|
||||||
# * Python/pip/uv errors (210-212)
|
# * Systemd/Service errors (150-154)
|
||||||
# * PostgreSQL errors (231-234)
|
# * Python/pip/uv errors (160-162)
|
||||||
# * MySQL/MariaDB errors (241-244)
|
# * PostgreSQL errors (170-173)
|
||||||
# * MongoDB errors (251-254)
|
# * MySQL/MariaDB errors (180-183)
|
||||||
|
# * MongoDB errors (190-193)
|
||||||
# * Proxmox custom codes (200-231)
|
# * Proxmox custom codes (200-231)
|
||||||
|
# * Node.js/npm errors (243, 245-249)
|
||||||
# - Returns description string for given exit code
|
# - Returns description string for given exit code
|
||||||
# - Shared function with error_handler.func for consistency
|
# - Shared function with error_handler.func for consistency
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
@ -53,73 +55,98 @@ explain_exit_code() {
|
|||||||
# --- Generic / Shell ---
|
# --- Generic / Shell ---
|
||||||
1) echo "General error / Operation not permitted" ;;
|
1) echo "General error / Operation not permitted" ;;
|
||||||
2) echo "Misuse of shell builtins (e.g. syntax error)" ;;
|
2) echo "Misuse of shell builtins (e.g. syntax error)" ;;
|
||||||
126) echo "Command invoked cannot execute (permission problem?)" ;;
|
|
||||||
127) echo "Command not found" ;;
|
# --- curl / wget errors (commonly seen in downloads) ---
|
||||||
128) echo "Invalid argument to exit" ;;
|
6) echo "curl: DNS resolution failed (could not resolve host)" ;;
|
||||||
130) echo "Terminated by Ctrl+C (SIGINT)" ;;
|
7) echo "curl: Failed to connect (network unreachable / host down)" ;;
|
||||||
137) echo "Killed (SIGKILL / Out of memory?)" ;;
|
22) echo "curl: HTTP error returned (404, 429, 500+)" ;;
|
||||||
139) echo "Segmentation fault (core dumped)" ;;
|
28) echo "curl: Operation timeout (network slow or server not responding)" ;;
|
||||||
143) echo "Terminated (SIGTERM)" ;;
|
35) echo "curl: SSL/TLS handshake failed (certificate error)" ;;
|
||||||
|
|
||||||
# --- Package manager / APT / DPKG ---
|
# --- Package manager / APT / DPKG ---
|
||||||
100) echo "APT: Package manager error (broken packages / dependency problems)" ;;
|
100) echo "APT: Package manager error (broken packages / dependency problems)" ;;
|
||||||
101) echo "APT: Configuration error (bad sources.list, malformed config)" ;;
|
101) echo "APT: Configuration error (bad sources.list, malformed config)" ;;
|
||||||
255) echo "DPKG: Fatal internal error" ;;
|
102) echo "APT: Lock held by another process (dpkg/apt still running)" ;;
|
||||||
|
|
||||||
# --- Node.js / npm / pnpm / yarn ---
|
# --- Common shell/system errors ---
|
||||||
|
124) echo "Command timed out (timeout command)" ;;
|
||||||
|
126) echo "Command invoked cannot execute (permission problem?)" ;;
|
||||||
|
127) echo "Command not found" ;;
|
||||||
|
128) echo "Invalid argument to exit" ;;
|
||||||
|
130) echo "Terminated by Ctrl+C (SIGINT)" ;;
|
||||||
|
134) echo "Process aborted (SIGABRT - possibly Node.js heap overflow)" ;;
|
||||||
|
137) echo "Killed (SIGKILL / Out of memory?)" ;;
|
||||||
|
139) echo "Segmentation fault (core dumped)" ;;
|
||||||
|
141) echo "Broken pipe (SIGPIPE - output closed prematurely)" ;;
|
||||||
|
143) echo "Terminated (SIGTERM)" ;;
|
||||||
|
|
||||||
|
# --- Systemd / Service errors (150-154) ---
|
||||||
|
150) echo "Systemd: Service failed to start" ;;
|
||||||
|
151) echo "Systemd: Service unit not found" ;;
|
||||||
|
152) echo "Permission denied (EACCES)" ;;
|
||||||
|
153) echo "Build/compile failed (make/gcc/cmake)" ;;
|
||||||
|
154) echo "Node.js: Native addon build failed (node-gyp)" ;;
|
||||||
|
|
||||||
|
# --- Python / pip / uv (160-162) ---
|
||||||
|
160) echo "Python: Virtualenv / uv environment missing or broken" ;;
|
||||||
|
161) echo "Python: Dependency resolution failed" ;;
|
||||||
|
162) echo "Python: Installation aborted (permissions or EXTERNALLY-MANAGED)" ;;
|
||||||
|
|
||||||
|
# --- PostgreSQL (170-173) ---
|
||||||
|
170) echo "PostgreSQL: Connection failed (server not running / wrong socket)" ;;
|
||||||
|
171) echo "PostgreSQL: Authentication failed (bad user/password)" ;;
|
||||||
|
172) echo "PostgreSQL: Database does not exist" ;;
|
||||||
|
173) echo "PostgreSQL: Fatal error in query / syntax" ;;
|
||||||
|
|
||||||
|
# --- MySQL / MariaDB (180-183) ---
|
||||||
|
180) echo "MySQL/MariaDB: Connection failed (server not running / wrong socket)" ;;
|
||||||
|
181) echo "MySQL/MariaDB: Authentication failed (bad user/password)" ;;
|
||||||
|
182) echo "MySQL/MariaDB: Database does not exist" ;;
|
||||||
|
183) echo "MySQL/MariaDB: Fatal error in query / syntax" ;;
|
||||||
|
|
||||||
|
# --- MongoDB (190-193) ---
|
||||||
|
190) echo "MongoDB: Connection failed (server not running)" ;;
|
||||||
|
191) echo "MongoDB: Authentication failed (bad user/password)" ;;
|
||||||
|
192) echo "MongoDB: Database not found" ;;
|
||||||
|
193) echo "MongoDB: Fatal query error" ;;
|
||||||
|
|
||||||
|
# --- Proxmox Custom Codes (200-231) ---
|
||||||
|
200) echo "Proxmox: Failed to create lock file" ;;
|
||||||
|
203) echo "Proxmox: Missing CTID variable" ;;
|
||||||
|
204) echo "Proxmox: Missing PCT_OSTYPE variable" ;;
|
||||||
|
205) echo "Proxmox: Invalid CTID (<100)" ;;
|
||||||
|
206) echo "Proxmox: CTID already in use" ;;
|
||||||
|
207) echo "Proxmox: Password contains unescaped special characters" ;;
|
||||||
|
208) echo "Proxmox: Invalid configuration (DNS/MAC/Network format)" ;;
|
||||||
|
209) echo "Proxmox: Container creation failed" ;;
|
||||||
|
210) echo "Proxmox: Cluster not quorate" ;;
|
||||||
|
211) echo "Proxmox: Timeout waiting for template lock" ;;
|
||||||
|
212) echo "Proxmox: Storage type 'iscsidirect' does not support containers (VMs only)" ;;
|
||||||
|
213) echo "Proxmox: Storage type does not support 'rootdir' content" ;;
|
||||||
|
214) echo "Proxmox: Not enough storage space" ;;
|
||||||
|
215) echo "Proxmox: Container created but not listed (ghost state)" ;;
|
||||||
|
216) echo "Proxmox: RootFS entry missing in config" ;;
|
||||||
|
217) echo "Proxmox: Storage not accessible" ;;
|
||||||
|
218) echo "Proxmox: Template file corrupted or incomplete" ;;
|
||||||
|
219) echo "Proxmox: CephFS does not support containers - use RBD" ;;
|
||||||
|
220) echo "Proxmox: Unable to resolve template path" ;;
|
||||||
|
221) echo "Proxmox: Template file not readable" ;;
|
||||||
|
222) echo "Proxmox: Template download failed" ;;
|
||||||
|
223) echo "Proxmox: Template not available after download" ;;
|
||||||
|
224) echo "Proxmox: PBS storage is for backups only" ;;
|
||||||
|
225) echo "Proxmox: No template available for OS/Version" ;;
|
||||||
|
231) echo "Proxmox: LXC stack upgrade failed" ;;
|
||||||
|
|
||||||
|
# --- Node.js / npm / pnpm / yarn (243-249) ---
|
||||||
243) echo "Node.js: Out of memory (JavaScript heap out of memory)" ;;
|
243) echo "Node.js: Out of memory (JavaScript heap out of memory)" ;;
|
||||||
245) echo "Node.js: Invalid command-line option" ;;
|
245) echo "Node.js: Invalid command-line option" ;;
|
||||||
246) echo "Node.js: Internal JavaScript Parse Error" ;;
|
246) echo "Node.js: Internal JavaScript Parse Error" ;;
|
||||||
247) echo "Node.js: Fatal internal error" ;;
|
247) echo "Node.js: Fatal internal error" ;;
|
||||||
248) echo "Node.js: Invalid C++ addon / N-API failure" ;;
|
248) echo "Node.js: Invalid C++ addon / N-API failure" ;;
|
||||||
249) echo "Node.js: Inspector error" ;;
|
249) echo "npm/pnpm/yarn: Unknown fatal error" ;;
|
||||||
254) echo "npm/pnpm/yarn: Unknown fatal error" ;;
|
|
||||||
|
|
||||||
# --- Python / pip / uv ---
|
# --- DPKG ---
|
||||||
210) echo "Python: Virtualenv / uv environment missing or broken" ;;
|
255) echo "DPKG: Fatal internal error" ;;
|
||||||
211) echo "Python: Dependency resolution failed" ;;
|
|
||||||
212) echo "Python: Installation aborted (permissions or EXTERNALLY-MANAGED)" ;;
|
|
||||||
|
|
||||||
# --- PostgreSQL ---
|
|
||||||
231) echo "PostgreSQL: Connection failed (server not running / wrong socket)" ;;
|
|
||||||
232) echo "PostgreSQL: Authentication failed (bad user/password)" ;;
|
|
||||||
233) echo "PostgreSQL: Database does not exist" ;;
|
|
||||||
234) echo "PostgreSQL: Fatal error in query / syntax" ;;
|
|
||||||
|
|
||||||
# --- MySQL / MariaDB ---
|
|
||||||
241) echo "MySQL/MariaDB: Connection failed (server not running / wrong socket)" ;;
|
|
||||||
242) echo "MySQL/MariaDB: Authentication failed (bad user/password)" ;;
|
|
||||||
243) echo "MySQL/MariaDB: Database does not exist" ;;
|
|
||||||
244) echo "MySQL/MariaDB: Fatal error in query / syntax" ;;
|
|
||||||
|
|
||||||
# --- MongoDB ---
|
|
||||||
251) echo "MongoDB: Connection failed (server not running)" ;;
|
|
||||||
252) echo "MongoDB: Authentication failed (bad user/password)" ;;
|
|
||||||
253) echo "MongoDB: Database not found" ;;
|
|
||||||
254) echo "MongoDB: Fatal query error" ;;
|
|
||||||
|
|
||||||
# --- Proxmox Custom Codes ---
|
|
||||||
200) echo "Custom: Failed to create lock file" ;;
|
|
||||||
203) echo "Custom: Missing CTID variable" ;;
|
|
||||||
204) echo "Custom: Missing PCT_OSTYPE variable" ;;
|
|
||||||
205) echo "Custom: Invalid CTID (<100)" ;;
|
|
||||||
206) echo "Custom: CTID already in use (check 'pct list' and /etc/pve/lxc/)" ;;
|
|
||||||
207) echo "Custom: Password contains unescaped special characters (-, /, \\, *, etc.)" ;;
|
|
||||||
208) echo "Custom: Invalid configuration (DNS/MAC/Network format error)" ;;
|
|
||||||
209) echo "Custom: Container creation failed (check logs for pct create output)" ;;
|
|
||||||
210) echo "Custom: Cluster not quorate" ;;
|
|
||||||
211) echo "Custom: Timeout waiting for template lock (concurrent download in progress)" ;;
|
|
||||||
214) echo "Custom: Not enough storage space" ;;
|
|
||||||
215) echo "Custom: Container created but not listed (ghost state - check /etc/pve/lxc/)" ;;
|
|
||||||
216) echo "Custom: RootFS entry missing in config (incomplete creation)" ;;
|
|
||||||
217) echo "Custom: Storage does not support rootdir (check storage capabilities)" ;;
|
|
||||||
218) echo "Custom: Template file corrupted or incomplete download (size <1MB or invalid archive)" ;;
|
|
||||||
220) echo "Custom: Unable to resolve template path" ;;
|
|
||||||
221) echo "Custom: Template file exists but not readable (check file permissions)" ;;
|
|
||||||
222) echo "Custom: Template download failed after 3 attempts (network/storage issue)" ;;
|
|
||||||
223) echo "Custom: Template not available after download (storage sync issue)" ;;
|
|
||||||
225) echo "Custom: No template available for OS/Version (check 'pveam available')" ;;
|
|
||||||
231) echo "Custom: LXC stack upgrade/retry failed (outdated pve-container - check https://github.com/community-scripts/ProxmoxVE/discussions/8126)" ;;
|
|
||||||
|
|
||||||
# --- Default ---
|
# --- Default ---
|
||||||
*) echo "Unknown error" ;;
|
*) echo "Unknown error" ;;
|
||||||
|
|||||||
1387
misc/build.func
1387
misc/build.func
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user