mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-02-25 22:45:56 +01:00
Compare commits
9 Commits
fix/error-
...
refactor/d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9a2ada4336 | ||
|
|
ef83fb6049 | ||
|
|
fa766d22bf | ||
|
|
881eb5bd04 | ||
|
|
9f3f719ed6 | ||
|
|
f6b8edb7df | ||
|
|
a14b0a942e | ||
|
|
49348b9b75 | ||
|
|
10ec52e9cb |
341
.github/workflows/check-node-versions.yml
generated
vendored
341
.github/workflows/check-node-versions.yml
generated
vendored
@@ -1,341 +0,0 @@
|
|||||||
name: Check Node.js Version Drift
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
schedule:
|
|
||||||
# Runs weekly on Monday at 06:00 UTC
|
|
||||||
- cron: "0 6 * * 1"
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
issues: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
check-node-versions:
|
|
||||||
if: github.repository == 'community-scripts/ProxmoxVE'
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout Repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
ref: main
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt-get update -qq
|
|
||||||
sudo apt-get install -y -qq jq curl > /dev/null 2>&1
|
|
||||||
|
|
||||||
- name: Check upstream Node.js versions
|
|
||||||
id: check
|
|
||||||
env:
|
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
run: |
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
echo "================================================"
|
|
||||||
echo " Checking Node.js version drift in install scripts"
|
|
||||||
echo "================================================"
|
|
||||||
|
|
||||||
# Alpine version -> Node major cache (populated on demand)
|
|
||||||
declare -A ALPINE_NODE_CACHE
|
|
||||||
|
|
||||||
# Resolve Node.js major version from Alpine package registry
|
|
||||||
# Usage: resolve_alpine_node "3.21" => sets REPLY to major version (e.g. "22")
|
|
||||||
resolve_alpine_node() {
|
|
||||||
local alpine_ver="$1"
|
|
||||||
if [[ -n "${ALPINE_NODE_CACHE[$alpine_ver]+x}" ]]; then
|
|
||||||
REPLY="${ALPINE_NODE_CACHE[$alpine_ver]}"
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
local url="https://pkgs.alpinelinux.org/package/v${alpine_ver}/main/x86_64/nodejs"
|
|
||||||
local page
|
|
||||||
page=$(curl -sf "$url" 2>/dev/null || echo "")
|
|
||||||
local full_ver=""
|
|
||||||
if [[ -n "$page" ]]; then
|
|
||||||
# Parse: "Version | 24.13.0-r1" or similar table row
|
|
||||||
full_ver=$(echo "$page" | grep -oP 'Version\s*\|\s*\K[0-9]+\.[0-9]+\.[0-9]+' | head -1 || echo "")
|
|
||||||
if [[ -z "$full_ver" ]]; then
|
|
||||||
# Fallback: look for version pattern after "Version"
|
|
||||||
full_ver=$(echo "$page" | grep -oP '(?<=Version</td><td>)[0-9]+\.[0-9]+\.[0-9]+' | head -1 || echo "")
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
local major=""
|
|
||||||
if [[ -n "$full_ver" ]]; then
|
|
||||||
major="${full_ver%%.*}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
ALPINE_NODE_CACHE[$alpine_ver]="$major"
|
|
||||||
REPLY="$major"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Extract Node major from a Dockerfile content
|
|
||||||
# Sets: DF_NODE_MAJOR, DF_SOURCE (description of where we found it)
|
|
||||||
extract_dockerfile_node() {
|
|
||||||
local content="$1"
|
|
||||||
DF_NODE_MAJOR=""
|
|
||||||
DF_SOURCE=""
|
|
||||||
|
|
||||||
# 1) FROM node:XX (e.g. node:24-alpine, node:22.9.0-bookworm-slim, node:20)
|
|
||||||
local node_from
|
|
||||||
node_from=$(echo "$content" | grep -oP '(?i)FROM\s+(--platform=[^\s]+\s+)?node:\K[0-9]+' | head -1 || echo "")
|
|
||||||
if [[ -n "$node_from" ]]; then
|
|
||||||
DF_NODE_MAJOR="$node_from"
|
|
||||||
DF_SOURCE="FROM node:${node_from}"
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 2) nodesource/setup_XX.x
|
|
||||||
local nodesource
|
|
||||||
nodesource=$(echo "$content" | grep -oP 'nodesource/setup_\K[0-9]+' | head -1 || echo "")
|
|
||||||
if [[ -n "$nodesource" ]]; then
|
|
||||||
DF_NODE_MAJOR="$nodesource"
|
|
||||||
DF_SOURCE="nodesource/setup_${nodesource}.x"
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 3) FROM alpine:X.Y — resolve via Alpine packages
|
|
||||||
local alpine_ver
|
|
||||||
alpine_ver=$(echo "$content" | grep -oP '(?i)FROM\s+(--platform=[^\s]+\s+)?alpine:\K[0-9]+\.[0-9]+' | head -1 || echo "")
|
|
||||||
if [[ -n "$alpine_ver" ]]; then
|
|
||||||
resolve_alpine_node "$alpine_ver"
|
|
||||||
if [[ -n "$REPLY" ]]; then
|
|
||||||
DF_NODE_MAJOR="$REPLY"
|
|
||||||
DF_SOURCE="alpine:${alpine_ver} (pkg: nodejs ${DF_NODE_MAJOR})"
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Extract Node major from engines.node in package.json
|
|
||||||
# Sets: ENGINES_NODE_RAW (raw string), ENGINES_MIN_MAJOR
|
|
||||||
extract_engines_node() {
|
|
||||||
local content="$1"
|
|
||||||
ENGINES_NODE_RAW=""
|
|
||||||
ENGINES_MIN_MAJOR=""
|
|
||||||
|
|
||||||
ENGINES_NODE_RAW=$(echo "$content" | jq -r '.engines.node // empty' 2>/dev/null || echo "")
|
|
||||||
if [[ -z "$ENGINES_NODE_RAW" ]]; then
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Extract the first number (major) from the constraint
|
|
||||||
# Handles: ">=24.13.1", "^22", ">=18.0.0", ">=18.15.0 <19 || ^20", etc.
|
|
||||||
ENGINES_MIN_MAJOR=$(echo "$ENGINES_NODE_RAW" | grep -oP '\d+' | head -1 || echo "")
|
|
||||||
}
|
|
||||||
|
|
||||||
# Collect results
|
|
||||||
declare -a issue_scripts=()
|
|
||||||
declare -a report_lines=()
|
|
||||||
total=0
|
|
||||||
checked=0
|
|
||||||
drift_count=0
|
|
||||||
|
|
||||||
for script in install/*-install.sh; do
|
|
||||||
[[ ! -f "$script" ]] && continue
|
|
||||||
if ! grep -q 'setup_nodejs' "$script"; then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
total=$((total + 1))
|
|
||||||
slug=$(basename "$script" | sed 's/-install\.sh$//')
|
|
||||||
|
|
||||||
# Extract Source URL (GitHub only)
|
|
||||||
source_url=$(head -20 "$script" | grep -oP '(?<=# Source: )https://github\.com/[^\s]+' | head -1 || echo "")
|
|
||||||
if [[ -z "$source_url" ]]; then
|
|
||||||
report_lines+=("| \`$slug\` | — | — | — | — | ⏭️ No GitHub source |")
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
repo=$(echo "$source_url" | sed -E 's|https://github\.com/||; s|/$||; s|\.git$||')
|
|
||||||
if [[ -z "$repo" || "$repo" != */* ]]; then
|
|
||||||
report_lines+=("| \`$slug\` | — | — | — | — | ⏭️ Invalid repo |")
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
checked=$((checked + 1))
|
|
||||||
|
|
||||||
# Extract our NODE_VERSION
|
|
||||||
our_version=$(grep -oP 'NODE_VERSION="(\d+)"' "$script" | head -1 | grep -oP '\d+' || echo "")
|
|
||||||
if [[ -z "$our_version" ]]; then
|
|
||||||
if grep -q 'NODE_VERSION=\$(' "$script"; then
|
|
||||||
our_version="dynamic"
|
|
||||||
else
|
|
||||||
our_version="unset"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Fetch upstream Dockerfile
|
|
||||||
df_content=""
|
|
||||||
for branch in main master dev; do
|
|
||||||
df_content=$(curl -sf "https://raw.githubusercontent.com/${repo}/${branch}/Dockerfile" 2>/dev/null || echo "")
|
|
||||||
[[ -n "$df_content" ]] && break
|
|
||||||
done
|
|
||||||
|
|
||||||
DF_NODE_MAJOR=""
|
|
||||||
DF_SOURCE=""
|
|
||||||
if [[ -n "$df_content" ]]; then
|
|
||||||
extract_dockerfile_node "$df_content"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Fetch upstream package.json
|
|
||||||
pkg_content=""
|
|
||||||
for branch in main master dev; do
|
|
||||||
pkg_content=$(curl -sf "https://raw.githubusercontent.com/${repo}/${branch}/package.json" 2>/dev/null || echo "")
|
|
||||||
[[ -n "$pkg_content" ]] && break
|
|
||||||
done
|
|
||||||
|
|
||||||
ENGINES_NODE_RAW=""
|
|
||||||
ENGINES_MIN_MAJOR=""
|
|
||||||
if [[ -n "$pkg_content" ]]; then
|
|
||||||
extract_engines_node "$pkg_content"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Determine upstream recommended major version
|
|
||||||
upstream_major=""
|
|
||||||
upstream_hint=""
|
|
||||||
|
|
||||||
if [[ -n "$DF_NODE_MAJOR" ]]; then
|
|
||||||
upstream_major="$DF_NODE_MAJOR"
|
|
||||||
upstream_hint="$DF_SOURCE"
|
|
||||||
elif [[ -n "$ENGINES_MIN_MAJOR" ]]; then
|
|
||||||
upstream_major="$ENGINES_MIN_MAJOR"
|
|
||||||
upstream_hint="engines: $ENGINES_NODE_RAW"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Build display values
|
|
||||||
engines_display="${ENGINES_NODE_RAW:-—}"
|
|
||||||
dockerfile_display="${DF_SOURCE:-—}"
|
|
||||||
|
|
||||||
# Compare
|
|
||||||
status="✅"
|
|
||||||
if [[ "$our_version" == "dynamic" ]]; then
|
|
||||||
status="🔄 Dynamic"
|
|
||||||
elif [[ "$our_version" == "unset" ]]; then
|
|
||||||
status="⚠️ NODE_VERSION not set"
|
|
||||||
issue_scripts+=("$slug|$our_version|$upstream_major|$upstream_hint|$repo")
|
|
||||||
drift_count=$((drift_count + 1))
|
|
||||||
elif [[ -n "$upstream_major" && "$our_version" != "$upstream_major" ]]; then
|
|
||||||
status="🔸 Drift → upstream=$upstream_major ($upstream_hint)"
|
|
||||||
issue_scripts+=("$slug|$our_version|$upstream_major|$upstream_hint|$repo")
|
|
||||||
drift_count=$((drift_count + 1))
|
|
||||||
fi
|
|
||||||
|
|
||||||
report_lines+=("| \`$slug\` | $our_version | $engines_display | $dockerfile_display | [$repo](https://github.com/$repo) | $status |")
|
|
||||||
|
|
||||||
# Rate-limit to avoid GitHub secondary rate limits
|
|
||||||
sleep 0.3
|
|
||||||
|
|
||||||
done
|
|
||||||
|
|
||||||
# Print summary
|
|
||||||
echo ""
|
|
||||||
echo "========================================="
|
|
||||||
echo " Total scripts with setup_nodejs: $total"
|
|
||||||
echo " Checked (with GitHub source): $checked"
|
|
||||||
echo " Version drift detected: $drift_count"
|
|
||||||
echo "========================================="
|
|
||||||
|
|
||||||
# Export
|
|
||||||
{
|
|
||||||
echo "drift_count=$drift_count"
|
|
||||||
echo "total=$total"
|
|
||||||
echo "checked=$checked"
|
|
||||||
} >> "$GITHUB_OUTPUT"
|
|
||||||
|
|
||||||
# Save issue details for next step
|
|
||||||
printf '%s\n' "${issue_scripts[@]}" > /tmp/drift_scripts.txt 2>/dev/null || touch /tmp/drift_scripts.txt
|
|
||||||
|
|
||||||
# Save full report
|
|
||||||
{
|
|
||||||
echo "## Node.js Version Drift Report"
|
|
||||||
echo ""
|
|
||||||
echo "**Generated:** $(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
|
||||||
echo "**Scripts checked:** $total | **With GitHub source:** $checked | **Drift detected:** $drift_count"
|
|
||||||
echo ""
|
|
||||||
echo "| Script | Our Version | engines.node | Dockerfile | Upstream Repo | Status |"
|
|
||||||
echo "|--------|-------------|-------------|------------|---------------|--------|"
|
|
||||||
printf '%s\n' "${report_lines[@]}" | sort
|
|
||||||
} > /tmp/drift_report.md
|
|
||||||
|
|
||||||
cat /tmp/drift_report.md
|
|
||||||
|
|
||||||
- name: Create or update summary issue
|
|
||||||
if: steps.check.outputs.drift_count != '0'
|
|
||||||
env:
|
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
run: |
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
TITLE="[Automated] Node.js Version Drift Report"
|
|
||||||
DATE=$(date -u +%Y-%m-%d)
|
|
||||||
DRIFT_COUNT="${{ steps.check.outputs.drift_count }}"
|
|
||||||
TOTAL="${{ steps.check.outputs.total }}"
|
|
||||||
CHECKED="${{ steps.check.outputs.checked }}"
|
|
||||||
|
|
||||||
# Build checklist from drift data
|
|
||||||
CHECKLIST=""
|
|
||||||
while IFS='|' read -r slug our_version upstream_major upstream_hint repo; do
|
|
||||||
[[ -z "$slug" ]] && continue
|
|
||||||
CHECKLIST+="- [ ] **\`${slug}\`** — ours: \`${our_version}\` → upstream: \`${upstream_major}\` (${upstream_hint}) — [repo](https://github.com/${repo})"$'\n'
|
|
||||||
done < /tmp/drift_scripts.txt
|
|
||||||
|
|
||||||
# Build full report table
|
|
||||||
REPORT=$(cat /tmp/drift_report.md)
|
|
||||||
|
|
||||||
BODY=$(cat <<ISSUE_EOF
|
|
||||||
## Node.js Version Drift Report — ${DATE}
|
|
||||||
|
|
||||||
**${DRIFT_COUNT}** script(s) with version drift detected (out of ${CHECKED} checked / ${TOTAL} total).
|
|
||||||
|
|
||||||
### Scripts requiring investigation
|
|
||||||
|
|
||||||
${CHECKLIST}
|
|
||||||
|
|
||||||
### How to resolve
|
|
||||||
|
|
||||||
1. Check upstream Dockerfile / package.json to confirm the required Node.js version
|
|
||||||
2. Test the script with the new Node version
|
|
||||||
3. Update \`NODE_VERSION\` in \`install/<slug>-install.sh\`
|
|
||||||
4. Update \`NODE_VERSION\` in \`ct/<slug>.sh\` (update section) if applicable
|
|
||||||
5. Check off the item above once done
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Full report</summary>
|
|
||||||
|
|
||||||
${REPORT}
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
---
|
|
||||||
*This issue is automatically created/updated weekly by the Node.js version drift check workflow.*
|
|
||||||
*Last updated: ${DATE}*
|
|
||||||
ISSUE_EOF
|
|
||||||
)
|
|
||||||
|
|
||||||
# Check if a matching open issue already exists
|
|
||||||
EXISTING=$(gh issue list --state open --label "automated,dependencies" --search "\"[Automated] Node.js Version Drift Report\"" --json number --jq '.[0].number // empty' 2>/dev/null || echo "")
|
|
||||||
|
|
||||||
if [[ -n "$EXISTING" ]]; then
|
|
||||||
gh issue edit "$EXISTING" --body "$BODY"
|
|
||||||
echo "Updated existing issue #$EXISTING"
|
|
||||||
else
|
|
||||||
gh issue create \
|
|
||||||
--title "$TITLE" \
|
|
||||||
--body "$BODY" \
|
|
||||||
--label "automated,dependencies"
|
|
||||||
echo "Created new summary issue"
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Close issue if no drift
|
|
||||||
if: steps.check.outputs.drift_count == '0'
|
|
||||||
env:
|
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
run: |
|
|
||||||
EXISTING=$(gh issue list --state open --label "automated,dependencies" --search "\"[Automated] Node.js Version Drift Report\"" --json number --jq '.[0].number // empty' 2>/dev/null || echo "")
|
|
||||||
if [[ -n "$EXISTING" ]]; then
|
|
||||||
gh issue close "$EXISTING" --comment "All Node.js versions are in sync with upstream. Closing automatically."
|
|
||||||
echo "Closed issue #$EXISTING"
|
|
||||||
fi
|
|
||||||
@@ -438,8 +438,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
### 📂 Github
|
### 📂 Github
|
||||||
|
|
||||||
- github: add weekly Node.js version drift check workflow [@MickLesk](https://github.com/MickLesk) ([#12267](https://github.com/community-scripts/ProxmoxVE/pull/12267))
|
- add: workflow to close stale PRs [@CrazyWolf13](https://github.com/CrazyWolf13) ([#12243](https://github.com/community-scripts/ProxmoxVE/pull/12243))
|
||||||
- add: workflow to close stale PRs [@CrazyWolf13](https://github.com/CrazyWolf13) ([#12243](https://github.com/community-scripts/ProxmoxVE/pull/12243))
|
|
||||||
|
|
||||||
## 2026-02-23
|
## 2026-02-23
|
||||||
|
|
||||||
|
|||||||
@@ -19,44 +19,46 @@ variables
|
|||||||
color
|
color
|
||||||
catch_errors
|
catch_errors
|
||||||
|
|
||||||
|
ADDON_SCRIPT="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/komodo.sh"
|
||||||
|
|
||||||
function update_script() {
|
function update_script() {
|
||||||
[[ -d /opt/komodo ]] || {
|
if [[ ! -d /opt/komodo ]]; then
|
||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
}
|
|
||||||
|
|
||||||
msg_info "Updating ${APP}"
|
|
||||||
COMPOSE_FILE=$(find /opt/komodo -maxdepth 1 -type f -name '*.compose.yaml' ! -name 'compose.env' | head -n1)
|
|
||||||
if [[ -z "$COMPOSE_FILE" ]]; then
|
|
||||||
msg_error "No valid compose file found in /opt/komodo!"
|
|
||||||
exit
|
|
||||||
fi
|
fi
|
||||||
COMPOSE_BASENAME=$(basename "$COMPOSE_FILE")
|
|
||||||
|
|
||||||
if [[ "$COMPOSE_BASENAME" == "sqlite.compose.yaml" || "$COMPOSE_BASENAME" == "postgres.compose.yaml" ]]; then
|
msg_warn "⚠️ ${APP} has been migrated to an addon script."
|
||||||
msg_error "❌ Detected outdated Komodo setup using SQLite or PostgreSQL (FerretDB v1)."
|
echo ""
|
||||||
echo -e "${YW}This configuration is no longer supported since Komodo v1.18.0.${CL}"
|
msg_info "This is a one-time migration. After this, you can update ${APP} anytime with:"
|
||||||
echo -e "${YW}Please follow the migration guide:${CL}"
|
echo -e "${TAB}${TAB}${GN}update_komodo${CL} or ${GN}bash <(curl -fsSL ${ADDON_SCRIPT})${CL}"
|
||||||
echo -e "${BGN}https://github.com/community-scripts/ProxmoxVE/discussions/5689${CL}\n"
|
echo ""
|
||||||
|
read -r -p "${TAB}Migrate update function now? [y/N]: " CONFIRM
|
||||||
|
if [[ ! "${CONFIRM,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
msg_warn "Migration skipped. The old update will continue to work for now."
|
||||||
|
msg_info "Updating ${APP} (legacy)"
|
||||||
|
COMPOSE_FILE=$(find /opt/komodo -maxdepth 1 -type f -name '*.compose.yaml' ! -name 'compose.env' | head -n1)
|
||||||
|
if [[ -z "$COMPOSE_FILE" ]]; then
|
||||||
|
msg_error "No valid compose file found in /opt/komodo!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
$STD docker compose -p komodo -f "$COMPOSE_FILE" --env-file /opt/komodo/compose.env pull
|
||||||
|
$STD docker compose -p komodo -f "$COMPOSE_FILE" --env-file /opt/komodo/compose.env up -d
|
||||||
|
msg_ok "Updated ${APP}"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
BACKUP_FILE="/opt/komodo/${COMPOSE_BASENAME}.bak_$(date +%Y%m%d_%H%M%S)"
|
msg_info "Migrating update function"
|
||||||
cp "$COMPOSE_FILE" "$BACKUP_FILE" || {
|
cat <<'MIGRATION_EOF' >/usr/bin/update
|
||||||
msg_error "Failed to create backup of ${COMPOSE_BASENAME}!"
|
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/komodo.sh)"
|
||||||
exit
|
MIGRATION_EOF
|
||||||
}
|
chmod +x /usr/bin/update
|
||||||
GITHUB_URL="https://raw.githubusercontent.com/moghtech/komodo/main/compose/${COMPOSE_BASENAME}"
|
|
||||||
if ! curl -fsSL "$GITHUB_URL" -o "$COMPOSE_FILE"; then
|
ln -sf /usr/bin/update /usr/bin/update_komodo 2>/dev/null || true
|
||||||
msg_error "Failed to download ${COMPOSE_BASENAME} from GitHub!"
|
msg_ok "Migration complete"
|
||||||
mv "$BACKUP_FILE" "$COMPOSE_FILE"
|
|
||||||
exit
|
msg_info "Running addon update"
|
||||||
fi
|
type=update bash <(curl -fsSL "${ADDON_SCRIPT}")
|
||||||
$STD docker compose -p komodo -f "$COMPOSE_FILE" --env-file /opt/komodo/compose.env pull
|
exit
|
||||||
$STD docker compose -p komodo -f "$COMPOSE_FILE" --env-file /opt/komodo/compose.env up -d
|
|
||||||
msg_ok "Updated Alpine-Komodo"
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
exit 0
|
|
||||||
}
|
}
|
||||||
|
|
||||||
start
|
start
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ variables
|
|||||||
color
|
color
|
||||||
catch_errors
|
catch_errors
|
||||||
|
|
||||||
|
ADDON_SCRIPT="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/coolify.sh"
|
||||||
|
|
||||||
function update_script() {
|
function update_script() {
|
||||||
header_info
|
header_info
|
||||||
check_container_storage
|
check_container_storage
|
||||||
@@ -29,10 +31,31 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
msg_info "Updating Coolify"
|
msg_warn "⚠️ ${APP} has been migrated to an addon script."
|
||||||
$STD bash <(curl -fsSL https://cdn.coollabs.io/coolify/install.sh)
|
echo ""
|
||||||
msg_ok "Updated Coolify"
|
msg_info "This is a one-time migration. After this, you can update ${APP} anytime with:"
|
||||||
msg_ok "Updated successfully!"
|
echo -e "${TAB}${TAB}${GN}update_coolify${CL} or ${GN}bash <(curl -fsSL ${ADDON_SCRIPT})${CL}"
|
||||||
|
echo ""
|
||||||
|
read -r -p "${TAB}Migrate update function now? [y/N]: " CONFIRM
|
||||||
|
if [[ ! "${CONFIRM,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
msg_warn "Migration skipped. The old update will continue to work for now."
|
||||||
|
msg_info "Updating ${APP} (legacy)"
|
||||||
|
$STD bash <(curl -fsSL https://cdn.coollabs.io/coolify/install.sh)
|
||||||
|
msg_ok "Updated ${APP}"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Migrating update function"
|
||||||
|
cat <<'MIGRATION_EOF' >/usr/bin/update
|
||||||
|
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/coolify.sh)"
|
||||||
|
MIGRATION_EOF
|
||||||
|
chmod +x /usr/bin/update
|
||||||
|
|
||||||
|
ln -sf /usr/bin/update /usr/bin/update_coolify 2>/dev/null || true
|
||||||
|
msg_ok "Migration complete"
|
||||||
|
|
||||||
|
msg_info "Running addon update"
|
||||||
|
type=update bash <(curl -fsSL "${ADDON_SCRIPT}")
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
41
ct/dockge.sh
41
ct/dockge.sh
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
# Copyright (c) 2021-2026 tteck
|
# Copyright (c) 2021-2026 tteck
|
||||||
# Author: tteck (tteckster)
|
# Author: tteck (tteckster) | Migration: MickLesk (CanbiZ)
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
# Source: https://dockge.kuma.pet/
|
# Source: https://dockge.kuma.pet/
|
||||||
|
|
||||||
@@ -19,26 +19,45 @@ variables
|
|||||||
color
|
color
|
||||||
catch_errors
|
catch_errors
|
||||||
|
|
||||||
|
ADDON_SCRIPT="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/dockge.sh"
|
||||||
|
|
||||||
function update_script() {
|
function update_script() {
|
||||||
header_info
|
header_info
|
||||||
check_container_storage
|
check_container_storage
|
||||||
check_container_resources
|
check_container_resources
|
||||||
|
|
||||||
if [[ ! -d /opt/dockge ]]; then
|
if [[ ! -d /opt/dockge ]]; then
|
||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
msg_info "Updating base system"
|
msg_warn "⚠️ ${APP} has been migrated to an addon script."
|
||||||
$STD apt update
|
echo ""
|
||||||
$STD apt upgrade -y
|
msg_info "This is a one-time migration. After this, you can update ${APP} anytime with:"
|
||||||
msg_ok "Base system updated"
|
echo -e "${TAB}${TAB}${GN}update_dockge${CL} or ${GN}bash <(curl -fsSL ${ADDON_SCRIPT})${CL}"
|
||||||
|
echo ""
|
||||||
|
read -r -p "${TAB}Migrate update function now? [y/N]: " CONFIRM
|
||||||
|
if [[ ! "${CONFIRM,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
msg_warn "Migration skipped. The old update will continue to work for now."
|
||||||
|
msg_info "Updating ${APP} (legacy)"
|
||||||
|
cd /opt/dockge
|
||||||
|
$STD docker compose pull
|
||||||
|
$STD docker compose up -d
|
||||||
|
msg_ok "Updated ${APP}"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
msg_info "Updating Dockge"
|
msg_info "Migrating update function"
|
||||||
cd /opt/dockge
|
cat <<'MIGRATION_EOF' >/usr/bin/update
|
||||||
$STD docker compose pull
|
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/dockge.sh)"
|
||||||
$STD docker compose up -d
|
MIGRATION_EOF
|
||||||
msg_ok "Updated Dockge"
|
chmod +x /usr/bin/update
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
|
ln -sf /usr/bin/update /usr/bin/update_dockge 2>/dev/null || true
|
||||||
|
msg_ok "Migration complete"
|
||||||
|
|
||||||
|
msg_info "Running addon update"
|
||||||
|
type=update bash <(curl -fsSL "${ADDON_SCRIPT}")
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ variables
|
|||||||
color
|
color
|
||||||
catch_errors
|
catch_errors
|
||||||
|
|
||||||
|
ADDON_SCRIPT="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/dokploy.sh"
|
||||||
|
|
||||||
function update_script() {
|
function update_script() {
|
||||||
header_info
|
header_info
|
||||||
check_container_storage
|
check_container_storage
|
||||||
@@ -29,10 +31,31 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
msg_info "Updating Dokploy"
|
msg_warn "⚠️ ${APP} has been migrated to an addon script."
|
||||||
curl -sSL https://dokploy.com/install.sh | $STD bash -s update
|
echo ""
|
||||||
msg_ok "Updated Dokploy"
|
msg_info "This is a one-time migration. After this, you can update ${APP} anytime with:"
|
||||||
msg_ok "Updated successfully!"
|
echo -e "${TAB}${TAB}${GN}update_dokploy${CL} or ${GN}bash <(curl -fsSL ${ADDON_SCRIPT})${CL}"
|
||||||
|
echo ""
|
||||||
|
read -r -p "${TAB}Migrate update function now? [y/N]: " CONFIRM
|
||||||
|
if [[ ! "${CONFIRM,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
msg_warn "Migration skipped. The old update will continue to work for now."
|
||||||
|
msg_info "Updating ${APP} (legacy)"
|
||||||
|
curl -sSL https://dokploy.com/install.sh | $STD bash -s update
|
||||||
|
msg_ok "Updated ${APP}"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Migrating update function"
|
||||||
|
cat <<'MIGRATION_EOF' >/usr/bin/update
|
||||||
|
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/dokploy.sh)"
|
||||||
|
MIGRATION_EOF
|
||||||
|
chmod +x /usr/bin/update
|
||||||
|
|
||||||
|
ln -sf /usr/bin/update /usr/bin/update_dokploy 2>/dev/null || true
|
||||||
|
msg_ok "Migration complete"
|
||||||
|
|
||||||
|
msg_info "Running addon update"
|
||||||
|
type=update bash <(curl -fsSL "${ADDON_SCRIPT}")
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
70
ct/komodo.sh
70
ct/komodo.sh
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
# Author: MickLesk
|
# Author: MickLesk (CanbiZ)
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
# Source: https://komo.do
|
# Source: https://komo.do
|
||||||
|
|
||||||
@@ -19,49 +19,49 @@ variables
|
|||||||
color
|
color
|
||||||
catch_errors
|
catch_errors
|
||||||
|
|
||||||
|
ADDON_SCRIPT="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/komodo.sh"
|
||||||
|
|
||||||
function update_script() {
|
function update_script() {
|
||||||
header_info
|
header_info
|
||||||
check_container_storage
|
check_container_storage
|
||||||
check_container_resources
|
check_container_resources
|
||||||
|
|
||||||
[[ -d /opt/komodo ]] || {
|
if [[ ! -d /opt/komodo ]]; then
|
||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit 1
|
exit
|
||||||
}
|
|
||||||
|
|
||||||
msg_info "Updating Komodo"
|
|
||||||
COMPOSE_FILE=$(find /opt/komodo -maxdepth 1 -type f -name '*.compose.yaml' ! -name 'compose.env' | head -n1)
|
|
||||||
if [[ -z "$COMPOSE_FILE" ]]; then
|
|
||||||
msg_error "No valid compose file found in /opt/komodo!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
COMPOSE_BASENAME=$(basename "$COMPOSE_FILE")
|
|
||||||
|
|
||||||
if [[ "$COMPOSE_BASENAME" == "sqlite.compose.yaml" || "$COMPOSE_BASENAME" == "postgres.compose.yaml" ]]; then
|
|
||||||
msg_error "❌ Detected outdated Komodo setup using SQLite or PostgreSQL (FerretDB v1)."
|
|
||||||
echo -e "${YW}This configuration is no longer supported since Komodo v1.18.0.${CL}"
|
|
||||||
echo -e "${YW}Please follow the migration guide:${CL}"
|
|
||||||
echo -e "${BGN}https://github.com/community-scripts/ProxmoxVE/discussions/5689${CL}\n"
|
|
||||||
exit 1
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
BACKUP_FILE="/opt/komodo/${COMPOSE_BASENAME}.bak_$(date +%Y%m%d_%H%M%S)"
|
msg_warn "⚠️ ${APP} has been migrated to an addon script."
|
||||||
cp "$COMPOSE_FILE" "$BACKUP_FILE" || {
|
echo ""
|
||||||
msg_error "Failed to create backup of ${COMPOSE_BASENAME}!"
|
msg_info "This is a one-time migration. After this, you can update ${APP} anytime with:"
|
||||||
exit 1
|
echo -e "${TAB}${TAB}${GN}update_komodo${CL} or ${GN}bash <(curl -fsSL ${ADDON_SCRIPT})${CL}"
|
||||||
}
|
echo ""
|
||||||
GITHUB_URL="https://raw.githubusercontent.com/moghtech/komodo/main/compose/${COMPOSE_BASENAME}"
|
read -r -p "${TAB}Migrate update function now? [y/N]: " CONFIRM
|
||||||
if ! curl -fsSL "$GITHUB_URL" -o "$COMPOSE_FILE"; then
|
if [[ ! "${CONFIRM,,}" =~ ^(y|yes)$ ]]; then
|
||||||
msg_error "Failed to download ${COMPOSE_BASENAME} from GitHub!"
|
msg_warn "Migration skipped. The old update will continue to work for now."
|
||||||
mv "$BACKUP_FILE" "$COMPOSE_FILE"
|
msg_info "Updating ${APP} (legacy)"
|
||||||
exit 1
|
COMPOSE_FILE=$(find /opt/komodo -maxdepth 1 -type f -name '*.compose.yaml' ! -name 'compose.env' | head -n1)
|
||||||
|
if [[ -z "$COMPOSE_FILE" ]]; then
|
||||||
|
msg_error "No valid compose file found in /opt/komodo!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
$STD docker compose -p komodo -f "$COMPOSE_FILE" --env-file /opt/komodo/compose.env pull
|
||||||
|
$STD docker compose -p komodo -f "$COMPOSE_FILE" --env-file /opt/komodo/compose.env up -d
|
||||||
|
msg_ok "Updated ${APP}"
|
||||||
|
exit
|
||||||
fi
|
fi
|
||||||
if ! grep -qxF 'COMPOSE_KOMODO_BACKUPS_PATH=/etc/komodo/backups' /opt/komodo/compose.env; then
|
|
||||||
sed -i '/^COMPOSE_KOMODO_IMAGE_TAG=latest$/a COMPOSE_KOMODO_BACKUPS_PATH=/etc/komodo/backups' /opt/komodo/compose.env
|
msg_info "Migrating update function"
|
||||||
fi
|
cat <<'MIGRATION_EOF' >/usr/bin/update
|
||||||
$STD docker compose -p komodo -f "$COMPOSE_FILE" --env-file /opt/komodo/compose.env pull
|
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/komodo.sh)"
|
||||||
$STD docker compose -p komodo -f "$COMPOSE_FILE" --env-file /opt/komodo/compose.env up -d
|
MIGRATION_EOF
|
||||||
msg_ok "Updated Komodo"
|
chmod +x /usr/bin/update
|
||||||
|
|
||||||
|
ln -sf /usr/bin/update /usr/bin/update_komodo 2>/dev/null || true
|
||||||
|
msg_ok "Migration complete"
|
||||||
|
|
||||||
|
msg_info "Running addon update"
|
||||||
|
type=update bash <(curl -fsSL "${ADDON_SCRIPT}")
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
# Copyright (c) 2021-2026 tteck
|
# Copyright (c) 2021-2026 tteck
|
||||||
# Author: tteck (tteckster)
|
# Author: tteck (tteckster) | Migration: MickLesk (CanbiZ)
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
# Source: https://runtipi.io/
|
# Source: https://runtipi.io/
|
||||||
|
|
||||||
@@ -19,16 +19,43 @@ variables
|
|||||||
color
|
color
|
||||||
catch_errors
|
catch_errors
|
||||||
|
|
||||||
|
ADDON_SCRIPT="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/runtipi.sh"
|
||||||
|
|
||||||
function update_script() {
|
function update_script() {
|
||||||
header_info
|
header_info
|
||||||
check_container_storage
|
check_container_storage
|
||||||
check_container_resources
|
check_container_resources
|
||||||
|
|
||||||
if [[ ! -d /opt/runtipi ]]; then
|
if [[ ! -d /opt/runtipi ]]; then
|
||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
cd /opt/runtipi && ./runtipi-cli update latest
|
|
||||||
msg_ok "Updated successfully!"
|
msg_warn "⚠️ ${APP} has been migrated to an addon script."
|
||||||
|
echo ""
|
||||||
|
msg_info "This is a one-time migration. After this, you can update ${APP} anytime with:"
|
||||||
|
echo -e "${TAB}${TAB}${GN}update_runtipi${CL} or ${GN}bash <(curl -fsSL ${ADDON_SCRIPT})${CL}"
|
||||||
|
echo ""
|
||||||
|
read -r -p "${TAB}Migrate update function now? [y/N]: " CONFIRM
|
||||||
|
if [[ ! "${CONFIRM,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
msg_warn "Migration skipped. The old update will continue to work for now."
|
||||||
|
msg_info "Updating ${APP} (legacy)"
|
||||||
|
cd /opt/runtipi && ./runtipi-cli update latest
|
||||||
|
msg_ok "Updated ${APP}"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Migrating update function"
|
||||||
|
cat <<'MIGRATION_EOF' >/usr/bin/update
|
||||||
|
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/runtipi.sh)"
|
||||||
|
MIGRATION_EOF
|
||||||
|
chmod +x /usr/bin/update
|
||||||
|
|
||||||
|
ln -sf /usr/bin/update /usr/bin/update_runtipi 2>/dev/null || true
|
||||||
|
msg_ok "Migration complete"
|
||||||
|
|
||||||
|
msg_info "Running addon update"
|
||||||
|
type=update bash <(curl -fsSL "${ADDON_SCRIPT}")
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,52 +1,56 @@
|
|||||||
{
|
{
|
||||||
"name": "Coolify",
|
"name": "Coolify",
|
||||||
"slug": "coolify",
|
"slug": "coolify",
|
||||||
"categories": [
|
"categories": [
|
||||||
3
|
3
|
||||||
],
|
],
|
||||||
"date_created": "2025-12-09",
|
"date_created": "2025-12-09",
|
||||||
"type": "ct",
|
"type": "addon",
|
||||||
"updateable": true,
|
"updateable": true,
|
||||||
"privileged": false,
|
"privileged": false,
|
||||||
"interface_port": 8000,
|
"interface_port": 8000,
|
||||||
"documentation": "https://coolify.io/docs",
|
"documentation": "https://coolify.io/docs",
|
||||||
"config_path": "/data/coolify",
|
"website": "https://coolify.io/",
|
||||||
"website": "https://coolify.io/",
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/coolify.webp",
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/coolify.webp",
|
"config_path": "/data/coolify",
|
||||||
"description": "Coolify is an open-source & self-hostable alternative to Heroku, Netlify, and Vercel. It helps you manage your servers, applications, and databases on your own hardware with Docker. Deploy any application from Git repositories, Docker images, or use pre-built templates.",
|
"description": "Coolify is an open-source & self-hostable alternative to Heroku, Netlify, and Vercel. It helps you manage your servers, applications, and databases on your own hardware with Docker. Deploy any application from Git repositories, Docker images, or use pre-built templates.",
|
||||||
"install_methods": [
|
"install_methods": [
|
||||||
{
|
{
|
||||||
"type": "default",
|
"type": "default",
|
||||||
"script": "ct/coolify.sh",
|
"script": "tools/addon/coolify.sh",
|
||||||
"resources": {
|
"resources": {
|
||||||
"cpu": 2,
|
"cpu": null,
|
||||||
"ram": 4096,
|
"ram": null,
|
||||||
"hdd": 30,
|
"hdd": null,
|
||||||
"os": "Debian",
|
"os": null,
|
||||||
"version": "13"
|
"version": null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"default_credentials": {
|
"default_credentials": {
|
||||||
"username": null,
|
"username": null,
|
||||||
"password": null
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "This is an addon script intended to be used on top of an existing Docker container.",
|
||||||
|
"type": "info"
|
||||||
},
|
},
|
||||||
"notes": [
|
{
|
||||||
{
|
"text": "Execute within an existing LXC console (Debian / Ubuntu / Alpine supported)",
|
||||||
"text": "Initial setup will be done via the web interface on first access.",
|
"type": "info"
|
||||||
"type": "info"
|
},
|
||||||
},
|
{
|
||||||
{
|
"text": "Initial setup will be done via the web interface on first access.",
|
||||||
"text": "Coolify has built-in auto-updates. You can configure update frequency in Settings.",
|
"type": "info"
|
||||||
"type": "info"
|
},
|
||||||
},
|
{
|
||||||
{
|
"text": "Coolify has built-in auto-updates. You can configure update frequency in Settings.",
|
||||||
"text": "Coolify requires SSH access to manage deployments. SSH is enabled automatically.",
|
"type": "info"
|
||||||
"type": "info"
|
},
|
||||||
},
|
{
|
||||||
{
|
"text": "To update via CLI, run the addon script again and select Update, or use: bash <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/coolify.sh)",
|
||||||
"text": "This container uses Docker-in-Docker (nesting) for application deployments.",
|
"type": "info"
|
||||||
"type": "warning"
|
}
|
||||||
}
|
]
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,25 +5,25 @@
|
|||||||
3
|
3
|
||||||
],
|
],
|
||||||
"date_created": "2024-05-02",
|
"date_created": "2024-05-02",
|
||||||
"type": "ct",
|
"type": "addon",
|
||||||
"updateable": true,
|
"updateable": true,
|
||||||
"privileged": false,
|
"privileged": false,
|
||||||
"interface_port": 5001,
|
"interface_port": 5001,
|
||||||
"documentation": null,
|
"documentation": null,
|
||||||
"website": "https://github.com/louislam/dockge",
|
"website": "https://github.com/louislam/dockge",
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/dockge.webp",
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/dockge.webp",
|
||||||
"config_path": "",
|
"config_path": "/opt/dockge/compose.yaml",
|
||||||
"description": "Dockge is a fancy, easy-to-use and reactive self-hosted docker compose.yaml stack-oriented manager.",
|
"description": "Dockge is a fancy, easy-to-use and reactive self-hosted docker compose.yaml stack-oriented manager.",
|
||||||
"install_methods": [
|
"install_methods": [
|
||||||
{
|
{
|
||||||
"type": "default",
|
"type": "default",
|
||||||
"script": "ct/dockge.sh",
|
"script": "tools/addon/dockge.sh",
|
||||||
"resources": {
|
"resources": {
|
||||||
"cpu": 2,
|
"cpu": null,
|
||||||
"ram": 2048,
|
"ram": null,
|
||||||
"hdd": 18,
|
"hdd": null,
|
||||||
"os": "debian",
|
"os": null,
|
||||||
"version": "13"
|
"version": null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -33,12 +33,16 @@
|
|||||||
},
|
},
|
||||||
"notes": [
|
"notes": [
|
||||||
{
|
{
|
||||||
"text": "Options to add Immich and/or Home Assistant",
|
"text": "This is an addon script intended to be used on top of an existing Docker container.",
|
||||||
"type": "info"
|
"type": "info"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"text": "If the LXC is created Privileged, the script will automatically set up USB passthrough.",
|
"text": "Execute within an existing LXC console (Debian / Ubuntu / Alpine supported)",
|
||||||
"type": "warning"
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "To update, run the addon script again and select Update, or use: bash <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/dockge.sh)",
|
||||||
|
"type": "info"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,48 +1,56 @@
|
|||||||
{
|
{
|
||||||
"name": "Dokploy",
|
"name": "Dokploy",
|
||||||
"slug": "dokploy",
|
"slug": "dokploy",
|
||||||
"categories": [
|
"categories": [
|
||||||
3
|
3
|
||||||
],
|
],
|
||||||
"date_created": "2025-12-09",
|
"date_created": "2025-12-09",
|
||||||
"type": "ct",
|
"type": "addon",
|
||||||
"updateable": true,
|
"updateable": true,
|
||||||
"privileged": true,
|
"privileged": true,
|
||||||
"interface_port": 3000,
|
"interface_port": 3000,
|
||||||
"documentation": "https://docs.dokploy.com/",
|
"documentation": "https://docs.dokploy.com/",
|
||||||
"config_path": "/etc/dokploy",
|
"website": "https://dokploy.com/",
|
||||||
"website": "https://dokploy.com/",
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/png/dokploy.png",
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/png/dokploy.png",
|
"config_path": "/etc/dokploy",
|
||||||
"description": "Dokploy is a free, self-hostable Platform as a Service (PaaS) that simplifies the deployment and management of applications and databases. Built with Docker and Traefik, it offers features like automatic SSL, Docker Compose support, database backups, and a real-time monitoring dashboard.",
|
"description": "Dokploy is a free, self-hostable Platform as a Service (PaaS) that simplifies the deployment and management of applications and databases. Built with Docker and Traefik, it offers features like automatic SSL, Docker Compose support, database backups, and a real-time monitoring dashboard.",
|
||||||
"install_methods": [
|
"install_methods": [
|
||||||
{
|
{
|
||||||
"type": "default",
|
"type": "default",
|
||||||
"script": "ct/dokploy.sh",
|
"script": "tools/addon/dokploy.sh",
|
||||||
"resources": {
|
"resources": {
|
||||||
"cpu": 2,
|
"cpu": null,
|
||||||
"ram": 2048,
|
"ram": null,
|
||||||
"hdd": 10,
|
"hdd": null,
|
||||||
"os": "Debian",
|
"os": null,
|
||||||
"version": "13"
|
"version": null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"default_credentials": {
|
"default_credentials": {
|
||||||
"username": null,
|
"username": null,
|
||||||
"password": null
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "This is an addon script intended to be used on top of an existing Docker container.",
|
||||||
|
"type": "info"
|
||||||
},
|
},
|
||||||
"notes": [
|
{
|
||||||
{
|
"text": "Execute within an existing LXC console (Debian / Ubuntu / Alpine supported)",
|
||||||
"text": "Initial setup will be done via the web interface on first access.",
|
"type": "info"
|
||||||
"type": "info"
|
},
|
||||||
},
|
{
|
||||||
{
|
"text": "Initial setup will be done via the web interface on first access.",
|
||||||
"text": "Dokploy has built-in auto-updates via the web interface.",
|
"type": "info"
|
||||||
"type": "info"
|
},
|
||||||
},
|
{
|
||||||
{
|
"text": "Dokploy has built-in auto-updates via the web interface.",
|
||||||
"text": "This container uses Docker-in-Docker (nesting) for application deployments.",
|
"type": "info"
|
||||||
"type": "warning"
|
},
|
||||||
}
|
{
|
||||||
]
|
"text": "To update via CLI, run the addon script again and select Update, or use: bash <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/dokploy.sh)",
|
||||||
|
"type": "info"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"generated": "2026-02-24T12:15:44Z",
|
"generated": "2026-02-24T06:23:39Z",
|
||||||
"versions": [
|
"versions": [
|
||||||
{
|
{
|
||||||
"slug": "2fauth",
|
"slug": "2fauth",
|
||||||
@@ -606,9 +606,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "invoiceninja",
|
"slug": "invoiceninja",
|
||||||
"repo": "invoiceninja/invoiceninja",
|
"repo": "invoiceninja/invoiceninja",
|
||||||
"version": "v5.12.66",
|
"version": "v5.12.65",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-24T09:12:50Z"
|
"date": "2026-02-21T01:03:52Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "jackett",
|
"slug": "jackett",
|
||||||
@@ -1679,7 +1679,7 @@
|
|||||||
"repo": "meilisearch/meilisearch",
|
"repo": "meilisearch/meilisearch",
|
||||||
"version": "v1.36.0",
|
"version": "v1.36.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": ""
|
"date": "2026-02-23T08:13:32Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "warracker",
|
"slug": "warracker",
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
3
|
3
|
||||||
],
|
],
|
||||||
"date_created": "2025-01-01",
|
"date_created": "2025-01-01",
|
||||||
"type": "ct",
|
"type": "addon",
|
||||||
"updateable": true,
|
"updateable": true,
|
||||||
"privileged": false,
|
"privileged": false,
|
||||||
"interface_port": 9120,
|
"interface_port": 9120,
|
||||||
@@ -17,24 +17,13 @@
|
|||||||
"install_methods": [
|
"install_methods": [
|
||||||
{
|
{
|
||||||
"type": "default",
|
"type": "default",
|
||||||
"script": "ct/komodo.sh",
|
"script": "tools/addon/komodo.sh",
|
||||||
"resources": {
|
"resources": {
|
||||||
"cpu": 2,
|
"cpu": null,
|
||||||
"ram": 2048,
|
"ram": null,
|
||||||
"hdd": 10,
|
"hdd": null,
|
||||||
"os": "debian",
|
"os": null,
|
||||||
"version": "13"
|
"version": null
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "alpine",
|
|
||||||
"script": "ct/alpine-komodo.sh",
|
|
||||||
"resources": {
|
|
||||||
"cpu": 1,
|
|
||||||
"ram": 1024,
|
|
||||||
"hdd": 10,
|
|
||||||
"os": "alpine",
|
|
||||||
"version": "3.23"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -44,7 +33,19 @@
|
|||||||
},
|
},
|
||||||
"notes": [
|
"notes": [
|
||||||
{
|
{
|
||||||
"text": "For admin username and password type `cat ~/komodo.creds` inside LXC.",
|
"text": "This is an addon script intended to be used on top of an existing Docker container.",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Execute within an existing LXC console (Debian / Ubuntu / Alpine supported)",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "For admin username and password, run: cat ~/komodo.creds",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "To update, run the addon script again and select Update, or use: bash <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/komodo.sh)",
|
||||||
"type": "info"
|
"type": "info"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -5,25 +5,25 @@
|
|||||||
2
|
2
|
||||||
],
|
],
|
||||||
"date_created": "2024-05-02",
|
"date_created": "2024-05-02",
|
||||||
"type": "ct",
|
"type": "addon",
|
||||||
"updateable": true,
|
"updateable": true,
|
||||||
"privileged": false,
|
"privileged": false,
|
||||||
"interface_port": 80,
|
"interface_port": 80,
|
||||||
"documentation": "https://runtipi.io/docs/introduction",
|
"documentation": "https://runtipi.io/docs/introduction",
|
||||||
"website": "https://runtipi.io/",
|
"website": "https://runtipi.io/",
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/runtipi.webp",
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/runtipi.webp",
|
||||||
"config_path": "opt/runtipi/state/settings.json",
|
"config_path": "/opt/runtipi/state/settings.json",
|
||||||
"description": "Runtipi lets you install all your favorite self-hosted apps without the hassle of configuring and managing each service. One-click installs and updates for more than 180 popular apps.",
|
"description": "Runtipi lets you install all your favorite self-hosted apps without the hassle of configuring and managing each service. One-click installs and updates for more than 180 popular apps.",
|
||||||
"install_methods": [
|
"install_methods": [
|
||||||
{
|
{
|
||||||
"type": "default",
|
"type": "default",
|
||||||
"script": "ct/runtipi.sh",
|
"script": "tools/addon/runtipi.sh",
|
||||||
"resources": {
|
"resources": {
|
||||||
"cpu": 2,
|
"cpu": null,
|
||||||
"ram": 2048,
|
"ram": null,
|
||||||
"hdd": 8,
|
"hdd": null,
|
||||||
"os": "debian",
|
"os": null,
|
||||||
"version": "13"
|
"version": null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -32,9 +32,21 @@
|
|||||||
"password": null
|
"password": null
|
||||||
},
|
},
|
||||||
"notes": [
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "This is an addon script intended to be used on top of an existing Docker container.",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Execute within an existing LXC console (Debian / Ubuntu only)",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.",
|
"text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.",
|
||||||
"type": "warning"
|
"type": "warning"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "To update via CLI, run the addon script again and select Update, or use: bash <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/runtipi.sh)",
|
||||||
|
"type": "info"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,75 +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://komo.do/
|
|
||||||
|
|
||||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
|
||||||
color
|
|
||||||
verb_ip6
|
|
||||||
catch_errors
|
|
||||||
setting_up_container
|
|
||||||
network_check
|
|
||||||
update_os
|
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
|
||||||
$STD apk add --no-cache ca-certificates openssl
|
|
||||||
msg_ok "Installed Dependencies"
|
|
||||||
|
|
||||||
msg_info "Setup Docker Repository"
|
|
||||||
$STD apk add --no-cache docker docker-cli docker-compose openrc
|
|
||||||
msg_ok "Setup Docker Repository"
|
|
||||||
|
|
||||||
msg_info "Enabling Docker Service"
|
|
||||||
$STD rc-update add docker boot
|
|
||||||
$STD service docker start
|
|
||||||
msg_ok "Enabled Docker Service"
|
|
||||||
|
|
||||||
echo "${TAB3}Choose the database for Komodo installation:"
|
|
||||||
echo "${TAB3}1) MongoDB (recommended)"
|
|
||||||
echo "${TAB3}2) FerretDB"
|
|
||||||
read -rp "${TAB3}Enter your choice (default: 1): " DB_CHOICE
|
|
||||||
DB_CHOICE=${DB_CHOICE:-1}
|
|
||||||
|
|
||||||
case $DB_CHOICE in
|
|
||||||
1)
|
|
||||||
DB_COMPOSE_FILE="mongo.compose.yaml"
|
|
||||||
;;
|
|
||||||
2)
|
|
||||||
DB_COMPOSE_FILE="ferretdb.compose.yaml"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "Invalid choice. Defaulting to MongoDB."
|
|
||||||
DB_COMPOSE_FILE="mongo.compose.yaml"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
mkdir -p /opt/komodo
|
|
||||||
cd /opt/komodo
|
|
||||||
curl -fsSL "https://raw.githubusercontent.com/moghtech/komodo/main/compose/$DB_COMPOSE_FILE" -o "$(basename "$DB_COMPOSE_FILE")"
|
|
||||||
|
|
||||||
msg_info "Setup Komodo Environment"
|
|
||||||
curl -fsSL "https://raw.githubusercontent.com/moghtech/komodo/main/compose/compose.env" -o "/opt/komodo/compose.env"
|
|
||||||
DB_PASSWORD=$(openssl rand -base64 16 | tr -d '/+=')
|
|
||||||
PASSKEY=$(openssl rand -base64 24 | tr -d '/+=')
|
|
||||||
WEBHOOK_SECRET=$(openssl rand -base64 24 | tr -d '/+=')
|
|
||||||
JWT_SECRET=$(openssl rand -base64 24 | tr -d '/+=')
|
|
||||||
|
|
||||||
sed -i "s/^KOMODO_DB_USERNAME=.*/KOMODO_DB_USERNAME=komodo_admin/" /opt/komodo/compose.env
|
|
||||||
sed -i "s/^KOMODO_DB_PASSWORD=.*/KOMODO_DB_PASSWORD=${DB_PASSWORD}/" /opt/komodo/compose.env
|
|
||||||
sed -i "s/^KOMODO_PASSKEY=.*/KOMODO_PASSKEY=${PASSKEY}/" /opt/komodo/compose.env
|
|
||||||
sed -i "s/^KOMODO_WEBHOOK_SECRET=.*/KOMODO_WEBHOOK_SECRET=${WEBHOOK_SECRET}/" /opt/komodo/compose.env
|
|
||||||
sed -i "s/^KOMODO_JWT_SECRET=.*/KOMODO_JWT_SECRET=${JWT_SECRET}/" /opt/komodo/compose.env
|
|
||||||
msg_ok "Setup Komodo Environment"
|
|
||||||
|
|
||||||
msg_info "Initialize Komodo"
|
|
||||||
$STD docker compose -p komodo -f "/opt/komodo/$DB_COMPOSE_FILE" --env-file /opt/komodo/compose.env up -d
|
|
||||||
msg_ok "Initialized Komodo"
|
|
||||||
|
|
||||||
motd_ssh
|
|
||||||
customize
|
|
||||||
|
|
||||||
msg_info "Cleaning up"
|
|
||||||
$STD apk cache clean
|
|
||||||
msg_ok "Cleaned"
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: MickLesk (CanbiZ)
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://coolify.io/
|
|
||||||
|
|
||||||
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 \
|
|
||||||
git \
|
|
||||||
openssl
|
|
||||||
msg_ok "Installed Dependencies"
|
|
||||||
|
|
||||||
msg_warn "WARNING: This script will run an external installer from a third-party source (https://coolify.io/)."
|
|
||||||
msg_warn "The following code is NOT maintained or audited by our repository."
|
|
||||||
msg_warn "If you have any doubts or concerns, please review the installer code before proceeding:"
|
|
||||||
msg_custom "${TAB3}${GATEWAY}${BGN}${CL}" "\e[1;34m" "→ https://cdn.coollabs.io/coolify/install.sh"
|
|
||||||
echo
|
|
||||||
read -r -p "${TAB3}Do you want to continue? [y/N]: " CONFIRM
|
|
||||||
if [[ ! "$CONFIRM" =~ ^([yY][eE][sS]|[yY])$ ]]; then
|
|
||||||
msg_error "Aborted by user. No changes have been made."
|
|
||||||
exit 10
|
|
||||||
fi
|
|
||||||
|
|
||||||
msg_info "Installing Coolify (Patience - this installs Docker and pulls containers)"
|
|
||||||
$STD bash <(curl -fsSL https://cdn.coollabs.io/coolify/install.sh)
|
|
||||||
msg_ok "Installed Coolify"
|
|
||||||
|
|
||||||
motd_ssh
|
|
||||||
customize
|
|
||||||
cleanup_lxc
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
#!/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://dockge.kuma.pet/
|
|
||||||
|
|
||||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
|
||||||
color
|
|
||||||
verb_ip6
|
|
||||||
catch_errors
|
|
||||||
setting_up_container
|
|
||||||
network_check
|
|
||||||
update_os
|
|
||||||
|
|
||||||
DOCKER_LATEST_VERSION=$(get_latest_github_release "moby/moby")
|
|
||||||
|
|
||||||
msg_info "Installing Docker $DOCKER_LATEST_VERSION (with Compose, Buildx)"
|
|
||||||
DOCKER_CONFIG_PATH='/etc/docker/daemon.json'
|
|
||||||
mkdir -p $(dirname $DOCKER_CONFIG_PATH)
|
|
||||||
echo -e '{\n "log-driver": "journald"\n}' >/etc/docker/daemon.json
|
|
||||||
$STD sh <(curl -fsSL https://get.docker.com)
|
|
||||||
msg_ok "Installed Docker $DOCKER_LATEST_VERSION"
|
|
||||||
|
|
||||||
msg_info "Installing Dockge"
|
|
||||||
mkdir -p /opt/{dockge,stacks}
|
|
||||||
curl -fsSL "https://raw.githubusercontent.com/louislam/dockge/master/compose.yaml" -o "/opt/dockge/compose.yaml"
|
|
||||||
cd /opt/dockge
|
|
||||||
$STD docker compose up -d
|
|
||||||
msg_ok "Installed Dockge"
|
|
||||||
|
|
||||||
read -r -p "${TAB3}Would you like to add Immich? <y/N> " prompt
|
|
||||||
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
|
||||||
msg_info "Adding Immich compose.yaml"
|
|
||||||
mkdir -p /opt/stacks/immich
|
|
||||||
curl -fsSL "https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml" -o "/opt/stacks/immich/compose.yaml"
|
|
||||||
curl -fsSL "https://github.com/immich-app/immich/releases/latest/download/example.env" -o "/opt/stacks/immich/.env"
|
|
||||||
msg_ok "Added Immich compose.yaml"
|
|
||||||
fi
|
|
||||||
|
|
||||||
read -r -p "${TAB3}Would you like to add Home Assistant? <y/N> " prompt
|
|
||||||
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
|
||||||
msg_info "Adding Home Assistant compose.yaml"
|
|
||||||
mkdir -p /opt/stacks/homeassistant
|
|
||||||
cat <<EOF >/opt/stacks/homeassistant/compose.yaml
|
|
||||||
version: "3"
|
|
||||||
services:
|
|
||||||
homeassistant:
|
|
||||||
container_name: homeassistant
|
|
||||||
image: ghcr.io/home-assistant/home-assistant:stable
|
|
||||||
volumes:
|
|
||||||
- ./config:/config
|
|
||||||
- /etc/localtime:/etc/localtime:ro
|
|
||||||
- /run/dbus:/run/dbus:ro
|
|
||||||
restart: unless-stopped
|
|
||||||
privileged: true
|
|
||||||
network_mode: host
|
|
||||||
EOF
|
|
||||||
msg_ok "Added Home Assistant compose.yaml"
|
|
||||||
fi
|
|
||||||
|
|
||||||
motd_ssh
|
|
||||||
customize
|
|
||||||
cleanup_lxc
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: MickLesk (CanbiZ)
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://dokploy.com/
|
|
||||||
|
|
||||||
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 \
|
|
||||||
git \
|
|
||||||
openssl \
|
|
||||||
redis
|
|
||||||
msg_ok "Installed Dependencies"
|
|
||||||
|
|
||||||
msg_warn "WARNING: This script will run an external installer from a third-party source (https://dokploy.com/)."
|
|
||||||
msg_warn "The following code is NOT maintained or audited by our repository."
|
|
||||||
msg_warn "If you have any doubts or concerns, please review the installer code before proceeding:"
|
|
||||||
msg_custom "${TAB3}${GATEWAY}${BGN}${CL}" "\e[1;34m" "→ https://dokploy.com/install.sh"
|
|
||||||
echo
|
|
||||||
read -r -p "${TAB3}Do you want to continue? [y/N]: " CONFIRM
|
|
||||||
if [[ ! "$CONFIRM" =~ ^([yY][eE][sS]|[yY])$ ]]; then
|
|
||||||
msg_error "Aborted by user. No changes have been made."
|
|
||||||
exit 10
|
|
||||||
fi
|
|
||||||
|
|
||||||
msg_info "Installing Dokploy (Patience - this installs Docker and pulls containers)"
|
|
||||||
$STD bash <(curl -sSL https://dokploy.com/install.sh)
|
|
||||||
msg_ok "Installed Dokploy"
|
|
||||||
|
|
||||||
motd_ssh
|
|
||||||
customize
|
|
||||||
cleanup_lxc
|
|
||||||
@@ -1,85 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: MickLesk
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://komo.do/
|
|
||||||
|
|
||||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
|
||||||
color
|
|
||||||
verb_ip6
|
|
||||||
catch_errors
|
|
||||||
setting_up_container
|
|
||||||
network_check
|
|
||||||
update_os
|
|
||||||
|
|
||||||
msg_info "Setup Docker Repository"
|
|
||||||
setup_deb822_repo \
|
|
||||||
"docker" \
|
|
||||||
"https://download.docker.com/linux/$(get_os_info id)/gpg" \
|
|
||||||
"https://download.docker.com/linux/$(get_os_info id)" \
|
|
||||||
"$(get_os_info codename)" \
|
|
||||||
"stable" \
|
|
||||||
"$(dpkg --print-architecture)"
|
|
||||||
msg_ok "Setup Docker Repository"
|
|
||||||
|
|
||||||
msg_info "Installing Docker"
|
|
||||||
$STD apt install -y \
|
|
||||||
docker-ce \
|
|
||||||
docker-ce-cli \
|
|
||||||
containerd.io \
|
|
||||||
docker-buildx-plugin \
|
|
||||||
docker-compose-plugin
|
|
||||||
msg_ok "Installed Docker"
|
|
||||||
|
|
||||||
echo "${TAB3}Choose the database for Komodo installation:"
|
|
||||||
echo "${TAB3}1) MongoDB (recommended)"
|
|
||||||
echo "${TAB3}2) FerretDB"
|
|
||||||
read -rp "${TAB3}Enter your choice (default: 1): " DB_CHOICE
|
|
||||||
DB_CHOICE=${DB_CHOICE:-1}
|
|
||||||
|
|
||||||
case $DB_CHOICE in
|
|
||||||
1)
|
|
||||||
DB_COMPOSE_FILE="mongo.compose.yaml"
|
|
||||||
;;
|
|
||||||
2)
|
|
||||||
DB_COMPOSE_FILE="ferretdb.compose.yaml"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "Invalid choice. Defaulting to MongoDB."
|
|
||||||
DB_COMPOSE_FILE="mongo.compose.yaml"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
mkdir -p /opt/komodo
|
|
||||||
cd /opt/komodo
|
|
||||||
curl -fsSL "https://raw.githubusercontent.com/moghtech/komodo/main/compose/$DB_COMPOSE_FILE" -o "/opt/komodo/$DB_COMPOSE_FILE"
|
|
||||||
|
|
||||||
msg_info "Setup Komodo Environment"
|
|
||||||
curl -fsSL "https://raw.githubusercontent.com/moghtech/komodo/main/compose/compose.env" -o "/opt/komodo/compose.env"
|
|
||||||
DB_PASSWORD=$(openssl rand -base64 16 | tr -d '/+=')
|
|
||||||
ADMIN_PASSWORD=$(openssl rand -base64 8 | tr -d '/+=')
|
|
||||||
PASSKEY=$(openssl rand -base64 24 | tr -d '/+=')
|
|
||||||
WEBHOOK_SECRET=$(openssl rand -base64 24 | tr -d '/+=')
|
|
||||||
JWT_SECRET=$(openssl rand -base64 24 | tr -d '/+=')
|
|
||||||
|
|
||||||
sed -i "s/^KOMODO_DB_USERNAME=.*/KOMODO_DB_USERNAME=komodo_admin/" /opt/komodo/compose.env
|
|
||||||
sed -i "s/^KOMODO_DB_PASSWORD=.*/KOMODO_DB_PASSWORD=${DB_PASSWORD}/" /opt/komodo/compose.env
|
|
||||||
sed -i "s/^KOMODO_INIT_ADMIN_PASSWORD=changeme/KOMODO_INIT_ADMIN_PASSWORD=${ADMIN_PASSWORD}/" /opt/komodo/compose.env
|
|
||||||
sed -i "s/^KOMODO_PASSKEY=.*/KOMODO_PASSKEY=${PASSKEY}/" /opt/komodo/compose.env
|
|
||||||
sed -i "s/^KOMODO_WEBHOOK_SECRET=.*/KOMODO_WEBHOOK_SECRET=${WEBHOOK_SECRET}/" /opt/komodo/compose.env
|
|
||||||
sed -i "s/^KOMODO_JWT_SECRET=.*/KOMODO_JWT_SECRET=${JWT_SECRET}/" /opt/komodo/compose.env
|
|
||||||
{
|
|
||||||
echo "Komodo Credentials"
|
|
||||||
echo ""
|
|
||||||
echo "Admin User : admin"
|
|
||||||
echo "Admin Password: $ADMIN_PASSWORD"
|
|
||||||
} >>~/komodo.creds
|
|
||||||
msg_ok "Setup Komodo Environment"
|
|
||||||
|
|
||||||
msg_info "Initialize Komodo"
|
|
||||||
$STD docker compose -p komodo -f /opt/komodo/$DB_COMPOSE_FILE --env-file /opt/komodo/compose.env up -d
|
|
||||||
msg_ok "Initialized Komodo"
|
|
||||||
|
|
||||||
motd_ssh
|
|
||||||
customize
|
|
||||||
cleanup_lxc
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
#!/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://runtipi.io/
|
|
||||||
|
|
||||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
|
||||||
color
|
|
||||||
verb_ip6
|
|
||||||
catch_errors
|
|
||||||
setting_up_container
|
|
||||||
network_check
|
|
||||||
update_os
|
|
||||||
|
|
||||||
msg_warn "WARNING: This script will run an external installer from a third-party source (https://runtipi.io/)."
|
|
||||||
msg_warn "The following code is NOT maintained or audited by our repository."
|
|
||||||
msg_warn "If you have any doubts or concerns, please review the installer code before proceeding:"
|
|
||||||
msg_custom "${TAB3}${GATEWAY}${BGN}${CL}" "\e[1;34m" "→ https://raw.githubusercontent.com/runtipi/runtipi/master/scripts/install.sh"
|
|
||||||
echo
|
|
||||||
read -r -p "${TAB3}Do you want to continue? [y/N]: " CONFIRM
|
|
||||||
if [[ ! "$CONFIRM" =~ ^([yY][eE][sS]|[yY])$ ]]; then
|
|
||||||
msg_error "Aborted by user. No changes have been made."
|
|
||||||
exit 10
|
|
||||||
fi
|
|
||||||
|
|
||||||
msg_info "Installing Runtipi (Patience)"
|
|
||||||
DOCKER_CONFIG_PATH='/etc/docker/daemon.json'
|
|
||||||
mkdir -p "$(dirname "$DOCKER_CONFIG_PATH")"
|
|
||||||
echo -e '{\n "log-driver": "journald"\n}' >"$DOCKER_CONFIG_PATH"
|
|
||||||
cd /opt
|
|
||||||
curl -fsSL "https://raw.githubusercontent.com/runtipi/runtipi/master/scripts/install.sh" -o "install.sh"
|
|
||||||
chmod +x install.sh
|
|
||||||
$STD ./install.sh
|
|
||||||
chmod 666 /opt/runtipi/state/settings.json
|
|
||||||
rm -f /opt/install.sh
|
|
||||||
msg_ok "Installed Runtipi"
|
|
||||||
|
|
||||||
motd_ssh
|
|
||||||
customize
|
|
||||||
cleanup_lxc
|
|
||||||
@@ -38,18 +38,17 @@
|
|||||||
# - Captures app-declared resource defaults (CPU, RAM, Disk)
|
# - Captures app-declared resource defaults (CPU, RAM, Disk)
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
variables() {
|
variables() {
|
||||||
NSAPP=$(echo "${APP,,}" | tr -d ' ') # This function sets the NSAPP variable by converting the value of the APP variable to lowercase and removing any spaces.
|
NSAPP=$(echo "${APP,,}" | tr -d ' ') # This function sets the NSAPP variable by converting the value of the APP variable to lowercase and removing any spaces.
|
||||||
var_install="${NSAPP}-install" # sets the var_install variable by appending "-install" to the value of NSAPP.
|
var_install="${NSAPP}-install" # sets the var_install variable by appending "-install" to the value of NSAPP.
|
||||||
INTEGER='^[0-9]+([.][0-9]+)?$' # it defines the INTEGER regular expression pattern.
|
INTEGER='^[0-9]+([.][0-9]+)?$' # it defines the INTEGER regular expression pattern.
|
||||||
PVEHOST_NAME=$(hostname) # gets the Proxmox Hostname and sets it to Uppercase
|
PVEHOST_NAME=$(hostname) # gets the Proxmox Hostname and sets it to Uppercase
|
||||||
DIAGNOSTICS="no" # Safe default: no telemetry until user consents via diagnostics_check()
|
DIAGNOSTICS="no" # Safe default: no telemetry until user consents via diagnostics_check()
|
||||||
METHOD="default" # sets the METHOD variable to "default", used for the API call.
|
METHOD="default" # sets the METHOD variable to "default", used for the API call.
|
||||||
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" # generates a random UUID and sets it to the RANDOM_UUID variable.
|
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" # generates a random UUID and sets it to the RANDOM_UUID variable.
|
||||||
EXECUTION_ID="${RANDOM_UUID}" # Unique execution ID for telemetry record identification (unique-indexed in PocketBase)
|
EXECUTION_ID="${RANDOM_UUID}" # Unique execution ID for telemetry record identification (unique-indexed in PocketBase)
|
||||||
SESSION_ID="${RANDOM_UUID:0:8}" # Short session ID (first 8 chars of UUID) for log files
|
SESSION_ID="${RANDOM_UUID:0:8}" # Short session ID (first 8 chars of UUID) for log files
|
||||||
BUILD_LOG="/tmp/create-lxc-${SESSION_ID}.log" # Host-side container creation log
|
BUILD_LOG="/tmp/create-lxc-${SESSION_ID}.log" # Host-side container creation log
|
||||||
# NOTE: combined_log is constructed locally in build_container() and ensure_log_on_host()
|
combined_log="/tmp/install-${SESSION_ID}-combined.log" # Combined log (build + install) for failed installations
|
||||||
# as "/tmp/${NSAPP}-${CTID}-${SESSION_ID}.log" (requires CTID, not available here)
|
|
||||||
CTTYPE="${CTTYPE:-${CT_TYPE:-1}}"
|
CTTYPE="${CTTYPE:-${CT_TYPE:-1}}"
|
||||||
|
|
||||||
# Parse dev_mode early
|
# Parse dev_mode early
|
||||||
@@ -1851,7 +1850,7 @@ advanced_settings() {
|
|||||||
|
|
||||||
# ═══════════════════════════════════════════════════════════════════════════
|
# ═══════════════════════════════════════════════════════════════════════════
|
||||||
# STEP 2: Root Password
|
# STEP 2: Root Password
|
||||||
# ════════════════════════════════════════════════════════════════════════<EFBFBD><EFBFBD><EFBFBD>══
|
# ═══════════════════════════════════════════════════════════════════════════
|
||||||
2)
|
2)
|
||||||
if PW1=$(whiptail --backtitle "Proxmox VE Helper Scripts [Step $STEP/$MAX_STEP]" \
|
if PW1=$(whiptail --backtitle "Proxmox VE Helper Scripts [Step $STEP/$MAX_STEP]" \
|
||||||
--title "ROOT PASSWORD" \
|
--title "ROOT PASSWORD" \
|
||||||
@@ -4175,13 +4174,6 @@ EOF'
|
|||||||
# Report failure to telemetry API (now with log available on host)
|
# Report failure to telemetry API (now with log available on host)
|
||||||
post_update_to_api "failed" "$install_exit_code"
|
post_update_to_api "failed" "$install_exit_code"
|
||||||
|
|
||||||
# Defense-in-depth: Ensure error handling stays disabled during recovery.
|
|
||||||
# Some functions (e.g. silent/$STD) unconditionally re-enable set -Eeuo pipefail
|
|
||||||
# and trap 'error_handler' ERR. If any code path above called such a function,
|
|
||||||
# the grep/sed pipelines below would trigger error_handler on non-match (exit 1).
|
|
||||||
set +Eeuo pipefail
|
|
||||||
trap - ERR
|
|
||||||
|
|
||||||
# Show combined log location
|
# Show combined log location
|
||||||
if [[ -n "$CTID" && -n "${SESSION_ID:-}" ]]; then
|
if [[ -n "$CTID" && -n "${SESSION_ID:-}" ]]; then
|
||||||
msg_custom "📋" "${YW}" "Installation log: ${combined_log}"
|
msg_custom "📋" "${YW}" "Installation log: ${combined_log}"
|
||||||
@@ -4295,7 +4287,7 @@ EOF'
|
|||||||
if [[ "$is_cmd_not_found" == true ]]; then
|
if [[ "$is_cmd_not_found" == true ]]; then
|
||||||
local missing_cmd=""
|
local missing_cmd=""
|
||||||
if [[ -f "$combined_log" ]]; then
|
if [[ -f "$combined_log" ]]; then
|
||||||
missing_cmd=$(grep -oiE '[a-zA-Z0-9_.-]+: command not found' "$combined_log" 2>/dev/null | tail -1 | sed 's/: command not found//') || true
|
missing_cmd=$(grep -oiE '[a-zA-Z0-9_.-]+: command not found' "$combined_log" | tail -1 | sed 's/: command not found//')
|
||||||
fi
|
fi
|
||||||
if [[ -n "$missing_cmd" ]]; then
|
if [[ -n "$missing_cmd" ]]; then
|
||||||
echo -e "${TAB}${INFO} Missing command: ${GN}${missing_cmd}${CL}"
|
echo -e "${TAB}${INFO} Missing command: ${GN}${missing_cmd}${CL}"
|
||||||
|
|||||||
@@ -490,8 +490,6 @@ log_section() {
|
|||||||
# - Executes command with output redirected to active log file
|
# - Executes command with output redirected to active log file
|
||||||
# - On error: displays last 20 lines of log and exits with original exit code
|
# - On error: displays last 20 lines of log and exits with original exit code
|
||||||
# - Temporarily disables error trap to capture exit code correctly
|
# - Temporarily disables error trap to capture exit code correctly
|
||||||
# - Saves and restores previous error handling state (so callers that
|
|
||||||
# intentionally disabled error handling aren't silently re-enabled)
|
|
||||||
# - Sources explain_exit_code() for detailed error messages
|
# - Sources explain_exit_code() for detailed error messages
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
silent() {
|
silent() {
|
||||||
@@ -509,23 +507,14 @@ silent() {
|
|||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Save current error handling state before disabling
|
|
||||||
# This prevents re-enabling error handling when the caller intentionally
|
|
||||||
# disabled it (e.g. build_container recovery section)
|
|
||||||
local _restore_errexit=false
|
|
||||||
[[ "$-" == *e* ]] && _restore_errexit=true
|
|
||||||
|
|
||||||
set +Eeuo pipefail
|
set +Eeuo pipefail
|
||||||
trap - ERR
|
trap - ERR
|
||||||
|
|
||||||
"$@" >>"$logfile" 2>&1
|
"$@" >>"$logfile" 2>&1
|
||||||
local rc=$?
|
local rc=$?
|
||||||
|
|
||||||
# Restore error handling ONLY if it was active before this call
|
set -Eeuo pipefail
|
||||||
if $_restore_errexit; then
|
trap 'error_handler' ERR
|
||||||
set -Eeuo pipefail
|
|
||||||
trap 'error_handler' ERR
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ $rc -ne 0 ]]; then
|
if [[ $rc -ne 0 ]]; then
|
||||||
# Source explain_exit_code if needed
|
# Source explain_exit_code if needed
|
||||||
@@ -799,7 +788,9 @@ exit_script() {
|
|||||||
get_header() {
|
get_header() {
|
||||||
local app_name=$(echo "${APP,,}" | tr -d ' ')
|
local app_name=$(echo "${APP,,}" | tr -d ' ')
|
||||||
local app_type=${APP_TYPE:-ct} # Default to 'ct' if not set
|
local app_type=${APP_TYPE:-ct} # Default to 'ct' if not set
|
||||||
local header_url="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/${app_type}/headers/${app_name}"
|
local header_dir="${app_type}"
|
||||||
|
[[ "$app_type" == "addon" ]] && header_dir="tools"
|
||||||
|
local header_url="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/${header_dir}/headers/${app_name}"
|
||||||
local local_header_path="/usr/local/community-scripts/headers/${app_type}/${app_name}"
|
local local_header_path="/usr/local/community-scripts/headers/${app_type}/${app_name}"
|
||||||
|
|
||||||
mkdir -p "$(dirname "$local_header_path")"
|
mkdir -p "$(dirname "$local_header_path")"
|
||||||
|
|||||||
215
tools/addon/coolify.sh
Normal file
215
tools/addon/coolify.sh
Normal file
@@ -0,0 +1,215 @@
|
|||||||
|
#!/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://coolify.io/ | Github: https://github.com/coollabsio/coolify
|
||||||
|
if ! command -v curl &>/dev/null; then
|
||||||
|
printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
|
||||||
|
if [[ -f /etc/alpine-release ]]; then
|
||||||
|
apk update >/dev/null 2>&1
|
||||||
|
apk add --no-cache curl >/dev/null 2>&1
|
||||||
|
else
|
||||||
|
apt-get update >/dev/null 2>&1
|
||||||
|
apt-get install -y curl >/dev/null 2>&1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
|
||||||
|
# Enable error handling
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler' ERR
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# CONFIGURATION
|
||||||
|
# ==============================================================================
|
||||||
|
APP="Coolify"
|
||||||
|
APP_TYPE="addon"
|
||||||
|
INSTALL_PATH="/data/coolify"
|
||||||
|
DEFAULT_PORT=8000
|
||||||
|
|
||||||
|
# Initialize all core functions (colors, formatting, icons, STD mode)
|
||||||
|
load_functions
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# UNINSTALL
|
||||||
|
# ==============================================================================
|
||||||
|
function uninstall() {
|
||||||
|
msg_info "Uninstalling ${APP}"
|
||||||
|
|
||||||
|
if command -v docker &>/dev/null; then
|
||||||
|
msg_info "Stopping and removing Docker containers"
|
||||||
|
cd /data/coolify/source 2>/dev/null && docker compose down --remove-orphans 2>/dev/null || true
|
||||||
|
$STD docker stop $(docker ps -aq) 2>/dev/null || true
|
||||||
|
$STD docker rm $(docker ps -aq) 2>/dev/null || true
|
||||||
|
$STD docker network prune -f 2>/dev/null || true
|
||||||
|
msg_ok "Stopped and removed Docker containers"
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -rf "$INSTALL_PATH"
|
||||||
|
msg_ok "${APP} has been uninstalled"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# UPDATE
|
||||||
|
# ==============================================================================
|
||||||
|
function update() {
|
||||||
|
msg_info "Updating ${APP}"
|
||||||
|
$STD bash <(curl -fsSL https://cdn.coollabs.io/coolify/install.sh)
|
||||||
|
msg_ok "Updated ${APP}"
|
||||||
|
|
||||||
|
msg_ok "Updated successfully"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# PROXMOX HOST CHECK
|
||||||
|
# ==============================================================================
|
||||||
|
function check_proxmox_host() {
|
||||||
|
if command -v pveversion &>/dev/null; then
|
||||||
|
msg_error "Running on the Proxmox host is NOT recommended!"
|
||||||
|
msg_error "This should be executed inside an LXC container."
|
||||||
|
echo ""
|
||||||
|
echo -n "${TAB}Continue anyway? (y/N): "
|
||||||
|
read -r confirm
|
||||||
|
if [[ ! "${confirm,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
msg_warn "Aborted. Please run this inside an LXC container."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
msg_warn "Proceeding on Proxmox host at your own risk!"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# CHECK / INSTALL DOCKER
|
||||||
|
# ==============================================================================
|
||||||
|
function check_or_install_docker() {
|
||||||
|
if command -v docker &>/dev/null; then
|
||||||
|
msg_ok "Docker $(docker --version | cut -d' ' -f3 | tr -d ',') is available"
|
||||||
|
if docker compose version &>/dev/null; then
|
||||||
|
msg_ok "Docker Compose is available"
|
||||||
|
else
|
||||||
|
msg_error "Docker Compose plugin is not available. Please install it."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_warn "Docker is not installed."
|
||||||
|
echo -n "${TAB}Install Docker now? (y/N): "
|
||||||
|
read -r install_docker_prompt
|
||||||
|
if [[ ! "${install_docker_prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
msg_error "Docker is required for ${APP}. Exiting."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Installing Docker"
|
||||||
|
if [[ -f /etc/alpine-release ]]; then
|
||||||
|
$STD apk add docker docker-cli-compose
|
||||||
|
$STD rc-service docker start
|
||||||
|
$STD rc-update add docker default
|
||||||
|
else
|
||||||
|
DOCKER_CONFIG_PATH='/etc/docker/daemon.json'
|
||||||
|
mkdir -p "$(dirname "$DOCKER_CONFIG_PATH")"
|
||||||
|
echo -e '{\n "log-driver": "journald"\n}' >"$DOCKER_CONFIG_PATH"
|
||||||
|
$STD sh <(curl -fsSL https://get.docker.com)
|
||||||
|
fi
|
||||||
|
msg_ok "Installed Docker"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# INSTALL
|
||||||
|
# ==============================================================================
|
||||||
|
function install() {
|
||||||
|
check_or_install_docker
|
||||||
|
|
||||||
|
msg_info "Installing dependencies"
|
||||||
|
if [[ -f /etc/alpine-release ]]; then
|
||||||
|
$STD apk add --no-cache git openssl
|
||||||
|
else
|
||||||
|
$STD apt-get update
|
||||||
|
$STD apt-get install -y git openssl
|
||||||
|
fi
|
||||||
|
msg_ok "Installed dependencies"
|
||||||
|
|
||||||
|
msg_warn "WARNING: This will run an external installer from https://coolify.io/"
|
||||||
|
msg_warn "The following code is NOT maintained or audited by our repository."
|
||||||
|
msg_warn "Review: https://cdn.coollabs.io/coolify/install.sh"
|
||||||
|
echo ""
|
||||||
|
echo -n "${TAB}Do you want to continue? (y/N): "
|
||||||
|
read -r confirm
|
||||||
|
if [[ ! "${confirm,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
msg_warn "Installation cancelled. Exiting."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Installing ${APP} (this installs Docker and pulls containers)"
|
||||||
|
$STD bash <(curl -fsSL https://cdn.coollabs.io/coolify/install.sh)
|
||||||
|
msg_ok "Installed ${APP}"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
msg_ok "${APP} is reachable at: ${BL}http://${LOCAL_IP}:${DEFAULT_PORT}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# MAIN
|
||||||
|
# ==============================================================================
|
||||||
|
|
||||||
|
# Handle type=update (called from update script)
|
||||||
|
if [[ "${type:-}" == "update" ]]; then
|
||||||
|
header_info
|
||||||
|
if [[ -d "$INSTALL_PATH" ]]; then
|
||||||
|
update
|
||||||
|
else
|
||||||
|
msg_error "${APP} is not installed. Nothing to update."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
header_info
|
||||||
|
check_proxmox_host
|
||||||
|
get_lxc_ip
|
||||||
|
|
||||||
|
# Check if already installed
|
||||||
|
if [[ -d "$INSTALL_PATH" ]]; then
|
||||||
|
msg_warn "${APP} is already installed."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -n "${TAB}Uninstall ${APP}? (y/N): "
|
||||||
|
read -r uninstall_prompt
|
||||||
|
if [[ "${uninstall_prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
uninstall
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -n "${TAB}Update ${APP}? (y/N): "
|
||||||
|
read -r update_prompt
|
||||||
|
if [[ "${update_prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
update
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_warn "No action selected. Exiting."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Fresh installation
|
||||||
|
msg_warn "${APP} is not installed."
|
||||||
|
echo ""
|
||||||
|
echo -e "${TAB}${INFO} This will install:"
|
||||||
|
echo -e "${TAB} - Coolify (via external installer)"
|
||||||
|
echo -e "${TAB} - Docker (if not already installed)"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -n "${TAB}Install ${APP}? (y/N): "
|
||||||
|
read -r install_prompt
|
||||||
|
if [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
install
|
||||||
|
else
|
||||||
|
msg_warn "Installation cancelled. Exiting."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
209
tools/addon/dockge.sh
Normal file
209
tools/addon/dockge.sh
Normal file
@@ -0,0 +1,209 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: tteck (tteckster) | Addon: MickLesk (CanbiZ)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://dockge.kuma.pet/ | Github: https://github.com/louislam/dockge
|
||||||
|
if ! command -v curl &>/dev/null; then
|
||||||
|
printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
|
||||||
|
if [[ -f /etc/alpine-release ]]; then
|
||||||
|
apk update >/dev/null 2>&1
|
||||||
|
apk add --no-cache curl >/dev/null 2>&1
|
||||||
|
else
|
||||||
|
apt-get update >/dev/null 2>&1
|
||||||
|
apt-get install -y curl >/dev/null 2>&1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
|
||||||
|
# Enable error handling
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler' ERR
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# CONFIGURATION
|
||||||
|
# ==============================================================================
|
||||||
|
APP="Dockge"
|
||||||
|
APP_TYPE="addon"
|
||||||
|
INSTALL_PATH="/opt/dockge"
|
||||||
|
STACKS_PATH="/opt/stacks"
|
||||||
|
COMPOSE_FILE="${INSTALL_PATH}/compose.yaml"
|
||||||
|
DEFAULT_PORT=5001
|
||||||
|
|
||||||
|
# Initialize all core functions (colors, formatting, icons, STD mode)
|
||||||
|
load_functions
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# UNINSTALL
|
||||||
|
# ==============================================================================
|
||||||
|
function uninstall() {
|
||||||
|
msg_info "Uninstalling ${APP}"
|
||||||
|
|
||||||
|
if [[ -f "$COMPOSE_FILE" ]]; then
|
||||||
|
msg_info "Stopping and removing Docker containers"
|
||||||
|
cd "$INSTALL_PATH"
|
||||||
|
$STD docker compose down --remove-orphans
|
||||||
|
msg_ok "Stopped and removed Docker containers"
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -rf "$INSTALL_PATH"
|
||||||
|
msg_ok "${APP} has been uninstalled"
|
||||||
|
msg_warn "Stacks directory ${STACKS_PATH} was NOT removed. Delete manually if no longer needed."
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# UPDATE
|
||||||
|
# ==============================================================================
|
||||||
|
function update() {
|
||||||
|
msg_info "Pulling latest ${APP} image"
|
||||||
|
cd "$INSTALL_PATH"
|
||||||
|
$STD docker compose pull
|
||||||
|
msg_ok "Pulled latest image"
|
||||||
|
|
||||||
|
msg_info "Restarting ${APP}"
|
||||||
|
$STD docker compose up -d --remove-orphans
|
||||||
|
msg_ok "Restarted ${APP}"
|
||||||
|
|
||||||
|
msg_ok "Updated successfully"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# PROXMOX HOST CHECK
|
||||||
|
# ==============================================================================
|
||||||
|
function check_proxmox_host() {
|
||||||
|
if command -v pveversion &>/dev/null; then
|
||||||
|
msg_error "Running on the Proxmox host is NOT recommended!"
|
||||||
|
msg_error "This should be executed inside an LXC container."
|
||||||
|
echo ""
|
||||||
|
echo -n "${TAB}Continue anyway? (y/N): "
|
||||||
|
read -r confirm
|
||||||
|
if [[ ! "${confirm,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
msg_warn "Aborted. Please run this inside an LXC container."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
msg_warn "Proceeding on Proxmox host at your own risk!"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# CHECK / INSTALL DOCKER
|
||||||
|
# ==============================================================================
|
||||||
|
function check_or_install_docker() {
|
||||||
|
if command -v docker &>/dev/null; then
|
||||||
|
msg_ok "Docker $(docker --version | cut -d' ' -f3 | tr -d ',') is available"
|
||||||
|
if docker compose version &>/dev/null; then
|
||||||
|
msg_ok "Docker Compose is available"
|
||||||
|
else
|
||||||
|
msg_error "Docker Compose plugin is not available. Please install it."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_warn "Docker is not installed."
|
||||||
|
echo -n "${TAB}Install Docker now? (y/N): "
|
||||||
|
read -r install_docker_prompt
|
||||||
|
if [[ ! "${install_docker_prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
msg_error "Docker is required for ${APP}. Exiting."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Installing Docker"
|
||||||
|
if [[ -f /etc/alpine-release ]]; then
|
||||||
|
$STD apk add docker docker-cli-compose
|
||||||
|
$STD rc-service docker start
|
||||||
|
$STD rc-update add docker default
|
||||||
|
else
|
||||||
|
DOCKER_CONFIG_PATH='/etc/docker/daemon.json'
|
||||||
|
mkdir -p "$(dirname "$DOCKER_CONFIG_PATH")"
|
||||||
|
echo -e '{\n "log-driver": "journald"\n}' >"$DOCKER_CONFIG_PATH"
|
||||||
|
$STD sh <(curl -fsSL https://get.docker.com)
|
||||||
|
fi
|
||||||
|
msg_ok "Installed Docker"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# INSTALL
|
||||||
|
# ==============================================================================
|
||||||
|
function install() {
|
||||||
|
check_or_install_docker
|
||||||
|
|
||||||
|
msg_info "Creating install directories"
|
||||||
|
mkdir -p "$INSTALL_PATH" "$STACKS_PATH"
|
||||||
|
msg_ok "Created ${INSTALL_PATH} and ${STACKS_PATH}"
|
||||||
|
|
||||||
|
msg_info "Downloading Docker Compose file"
|
||||||
|
curl -fsSL "https://raw.githubusercontent.com/louislam/dockge/master/compose.yaml" -o "$COMPOSE_FILE"
|
||||||
|
msg_ok "Downloaded Docker Compose file"
|
||||||
|
|
||||||
|
msg_info "Starting ${APP}"
|
||||||
|
cd "$INSTALL_PATH"
|
||||||
|
$STD docker compose up -d
|
||||||
|
msg_ok "Started ${APP}"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
msg_ok "${APP} is reachable at: ${BL}http://${LOCAL_IP}:${DEFAULT_PORT}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# MAIN
|
||||||
|
# ==============================================================================
|
||||||
|
|
||||||
|
# Handle type=update (called from update script)
|
||||||
|
if [[ "${type:-}" == "update" ]]; then
|
||||||
|
header_info
|
||||||
|
if [[ -f "$COMPOSE_FILE" ]]; then
|
||||||
|
update
|
||||||
|
else
|
||||||
|
msg_error "${APP} is not installed. Nothing to update."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
header_info
|
||||||
|
check_proxmox_host
|
||||||
|
get_lxc_ip
|
||||||
|
|
||||||
|
# Check if already installed
|
||||||
|
if [[ -f "$COMPOSE_FILE" ]]; then
|
||||||
|
msg_warn "${APP} is already installed."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -n "${TAB}Uninstall ${APP}? (y/N): "
|
||||||
|
read -r uninstall_prompt
|
||||||
|
if [[ "${uninstall_prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
uninstall
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -n "${TAB}Update ${APP}? (y/N): "
|
||||||
|
read -r update_prompt
|
||||||
|
if [[ "${update_prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
update
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_warn "No action selected. Exiting."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Fresh installation
|
||||||
|
msg_warn "${APP} is not installed."
|
||||||
|
echo ""
|
||||||
|
echo -e "${TAB}${INFO} This will install:"
|
||||||
|
echo -e "${TAB} - Dockge (via Docker Compose)"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -n "${TAB}Install ${APP}? (y/N): "
|
||||||
|
read -r install_prompt
|
||||||
|
if [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
install
|
||||||
|
else
|
||||||
|
msg_warn "Installation cancelled. Exiting."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
214
tools/addon/dokploy.sh
Normal file
214
tools/addon/dokploy.sh
Normal file
@@ -0,0 +1,214 @@
|
|||||||
|
#!/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://dokploy.com/ | Github: https://github.com/Dokploy/dokploy
|
||||||
|
if ! command -v curl &>/dev/null; then
|
||||||
|
printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
|
||||||
|
if [[ -f /etc/alpine-release ]]; then
|
||||||
|
apk update >/dev/null 2>&1
|
||||||
|
apk add --no-cache curl >/dev/null 2>&1
|
||||||
|
else
|
||||||
|
apt-get update >/dev/null 2>&1
|
||||||
|
apt-get install -y curl >/dev/null 2>&1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
|
||||||
|
# Enable error handling
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler' ERR
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# CONFIGURATION
|
||||||
|
# ==============================================================================
|
||||||
|
APP="Dokploy"
|
||||||
|
APP_TYPE="addon"
|
||||||
|
INSTALL_PATH="/etc/dokploy"
|
||||||
|
DEFAULT_PORT=3000
|
||||||
|
|
||||||
|
# Initialize all core functions (colors, formatting, icons, STD mode)
|
||||||
|
load_functions
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# UNINSTALL
|
||||||
|
# ==============================================================================
|
||||||
|
function uninstall() {
|
||||||
|
msg_info "Uninstalling ${APP}"
|
||||||
|
|
||||||
|
if command -v docker &>/dev/null; then
|
||||||
|
msg_info "Stopping and removing Docker containers"
|
||||||
|
$STD docker stop $(docker ps -aq) 2>/dev/null || true
|
||||||
|
$STD docker rm $(docker ps -aq) 2>/dev/null || true
|
||||||
|
$STD docker network prune -f 2>/dev/null || true
|
||||||
|
msg_ok "Stopped and removed Docker containers"
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -rf "$INSTALL_PATH"
|
||||||
|
msg_ok "${APP} has been uninstalled"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# UPDATE
|
||||||
|
# ==============================================================================
|
||||||
|
function update() {
|
||||||
|
msg_info "Updating ${APP}"
|
||||||
|
$STD curl -sSL https://dokploy.com/install.sh | bash -s update
|
||||||
|
msg_ok "Updated ${APP}"
|
||||||
|
|
||||||
|
msg_ok "Updated successfully"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# PROXMOX HOST CHECK
|
||||||
|
# ==============================================================================
|
||||||
|
function check_proxmox_host() {
|
||||||
|
if command -v pveversion &>/dev/null; then
|
||||||
|
msg_error "Running on the Proxmox host is NOT recommended!"
|
||||||
|
msg_error "This should be executed inside an LXC container."
|
||||||
|
echo ""
|
||||||
|
echo -n "${TAB}Continue anyway? (y/N): "
|
||||||
|
read -r confirm
|
||||||
|
if [[ ! "${confirm,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
msg_warn "Aborted. Please run this inside an LXC container."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
msg_warn "Proceeding on Proxmox host at your own risk!"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# CHECK / INSTALL DOCKER
|
||||||
|
# ==============================================================================
|
||||||
|
function check_or_install_docker() {
|
||||||
|
if command -v docker &>/dev/null; then
|
||||||
|
msg_ok "Docker $(docker --version | cut -d' ' -f3 | tr -d ',') is available"
|
||||||
|
if docker compose version &>/dev/null; then
|
||||||
|
msg_ok "Docker Compose is available"
|
||||||
|
else
|
||||||
|
msg_error "Docker Compose plugin is not available. Please install it."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_warn "Docker is not installed."
|
||||||
|
echo -n "${TAB}Install Docker now? (y/N): "
|
||||||
|
read -r install_docker_prompt
|
||||||
|
if [[ ! "${install_docker_prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
msg_error "Docker is required for ${APP}. Exiting."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Installing Docker"
|
||||||
|
if [[ -f /etc/alpine-release ]]; then
|
||||||
|
$STD apk add docker docker-cli-compose
|
||||||
|
$STD rc-service docker start
|
||||||
|
$STD rc-update add docker default
|
||||||
|
else
|
||||||
|
DOCKER_CONFIG_PATH='/etc/docker/daemon.json'
|
||||||
|
mkdir -p "$(dirname "$DOCKER_CONFIG_PATH")"
|
||||||
|
echo -e '{\n "log-driver": "journald"\n}' >"$DOCKER_CONFIG_PATH"
|
||||||
|
$STD sh <(curl -fsSL https://get.docker.com)
|
||||||
|
fi
|
||||||
|
msg_ok "Installed Docker"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# INSTALL
|
||||||
|
# ==============================================================================
|
||||||
|
function install() {
|
||||||
|
check_or_install_docker
|
||||||
|
|
||||||
|
msg_info "Installing dependencies"
|
||||||
|
if [[ -f /etc/alpine-release ]]; then
|
||||||
|
$STD apk add --no-cache git openssl
|
||||||
|
else
|
||||||
|
$STD apt-get update
|
||||||
|
$STD apt-get install -y git openssl redis
|
||||||
|
fi
|
||||||
|
msg_ok "Installed dependencies"
|
||||||
|
|
||||||
|
msg_warn "WARNING: This will run an external installer from https://dokploy.com/"
|
||||||
|
msg_warn "The following code is NOT maintained or audited by our repository."
|
||||||
|
echo ""
|
||||||
|
echo -n "${TAB}Do you want to continue? (y/N): "
|
||||||
|
read -r confirm
|
||||||
|
if [[ ! "${confirm,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
msg_warn "Installation cancelled. Exiting."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Installing ${APP} (this installs Docker and pulls containers)"
|
||||||
|
$STD bash <(curl -sSL https://dokploy.com/install.sh)
|
||||||
|
msg_ok "Installed ${APP}"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
msg_ok "${APP} is reachable at: ${BL}http://${LOCAL_IP}:${DEFAULT_PORT}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# MAIN
|
||||||
|
# ==============================================================================
|
||||||
|
|
||||||
|
# Handle type=update (called from update script)
|
||||||
|
if [[ "${type:-}" == "update" ]]; then
|
||||||
|
header_info
|
||||||
|
if [[ -d "$INSTALL_PATH" ]]; then
|
||||||
|
update
|
||||||
|
else
|
||||||
|
msg_error "${APP} is not installed. Nothing to update."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
header_info
|
||||||
|
check_proxmox_host
|
||||||
|
get_lxc_ip
|
||||||
|
|
||||||
|
# Check if already installed
|
||||||
|
if [[ -d "$INSTALL_PATH" ]]; then
|
||||||
|
msg_warn "${APP} is already installed."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -n "${TAB}Uninstall ${APP}? (y/N): "
|
||||||
|
read -r uninstall_prompt
|
||||||
|
if [[ "${uninstall_prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
uninstall
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -n "${TAB}Update ${APP}? (y/N): "
|
||||||
|
read -r update_prompt
|
||||||
|
if [[ "${update_prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
update
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_warn "No action selected. Exiting."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Fresh installation
|
||||||
|
msg_warn "${APP} is not installed."
|
||||||
|
echo ""
|
||||||
|
echo -e "${TAB}${INFO} This will install:"
|
||||||
|
echo -e "${TAB} - Dokploy (via external installer)"
|
||||||
|
echo -e "${TAB} - Docker (if not already installed)"
|
||||||
|
echo -e "${TAB} - Redis"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -n "${TAB}Install ${APP}? (y/N): "
|
||||||
|
read -r install_prompt
|
||||||
|
if [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
install
|
||||||
|
else
|
||||||
|
msg_warn "Installation cancelled. Exiting."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
293
tools/addon/komodo.sh
Normal file
293
tools/addon/komodo.sh
Normal file
@@ -0,0 +1,293 @@
|
|||||||
|
#!/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://komo.do/ | Github: https://github.com/mbecker20/komodo
|
||||||
|
if ! command -v curl &>/dev/null; then
|
||||||
|
printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
|
||||||
|
apt-get update >/dev/null 2>&1 || apk update >/dev/null 2>&1
|
||||||
|
apt-get install -y curl >/dev/null 2>&1 || apk add --no-cache curl >/dev/null 2>&1
|
||||||
|
fi
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
|
||||||
|
# Enable error handling
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler' ERR
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# CONFIGURATION
|
||||||
|
# ==============================================================================
|
||||||
|
APP="Komodo"
|
||||||
|
APP_TYPE="addon"
|
||||||
|
INSTALL_PATH="/opt/komodo"
|
||||||
|
COMPOSE_ENV="${INSTALL_PATH}/compose.env"
|
||||||
|
DEFAULT_PORT=9120
|
||||||
|
|
||||||
|
# Initialize all core functions (colors, formatting, icons, STD mode)
|
||||||
|
load_functions
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# HELPERS
|
||||||
|
# ==============================================================================
|
||||||
|
function find_compose_file() {
|
||||||
|
COMPOSE_FILE=$(find "$INSTALL_PATH" -maxdepth 1 -type f -name '*.compose.yaml' ! -name 'compose.env' | head -n1)
|
||||||
|
if [[ -z "${COMPOSE_FILE:-}" ]]; then
|
||||||
|
msg_error "No valid compose file found in ${INSTALL_PATH}!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
COMPOSE_BASENAME=$(basename "$COMPOSE_FILE")
|
||||||
|
}
|
||||||
|
|
||||||
|
function check_legacy_db() {
|
||||||
|
if [[ "$COMPOSE_BASENAME" == "sqlite.compose.yaml" || "$COMPOSE_BASENAME" == "postgres.compose.yaml" ]]; then
|
||||||
|
msg_error "Detected outdated Komodo setup using SQLite or PostgreSQL (FerretDB v1)."
|
||||||
|
echo -e "${YW}This configuration is no longer supported since Komodo v1.18.0.${CL}"
|
||||||
|
echo -e "${YW}Please follow the migration guide:${CL}"
|
||||||
|
echo -e "${BGN}https://github.com/community-scripts/ProxmoxVE/discussions/5689${CL}\n"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# UNINSTALL
|
||||||
|
# ==============================================================================
|
||||||
|
function uninstall() {
|
||||||
|
msg_info "Uninstalling ${APP}"
|
||||||
|
|
||||||
|
find_compose_file
|
||||||
|
msg_info "Stopping and removing Docker containers"
|
||||||
|
cd "$INSTALL_PATH"
|
||||||
|
$STD docker compose -p komodo -f "$COMPOSE_FILE" --env-file "$COMPOSE_ENV" down --volumes --remove-orphans
|
||||||
|
msg_ok "Stopped and removed Docker containers"
|
||||||
|
|
||||||
|
rm -rf "$INSTALL_PATH"
|
||||||
|
msg_ok "${APP} has been uninstalled"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# UPDATE
|
||||||
|
# ==============================================================================
|
||||||
|
function update() {
|
||||||
|
find_compose_file
|
||||||
|
check_legacy_db
|
||||||
|
|
||||||
|
msg_info "Updating ${APP}"
|
||||||
|
BACKUP_FILE="${INSTALL_PATH}/${COMPOSE_BASENAME}.bak_$(date +%Y%m%d_%H%M%S)"
|
||||||
|
cp "$COMPOSE_FILE" "$BACKUP_FILE" || {
|
||||||
|
msg_error "Failed to create backup of ${COMPOSE_BASENAME}!"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
GITHUB_URL="https://raw.githubusercontent.com/moghtech/komodo/main/compose/${COMPOSE_BASENAME}"
|
||||||
|
if ! curl -fsSL "$GITHUB_URL" -o "$COMPOSE_FILE"; then
|
||||||
|
msg_error "Failed to download ${COMPOSE_BASENAME} from GitHub!"
|
||||||
|
mv "$BACKUP_FILE" "$COMPOSE_FILE"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! grep -qxF 'COMPOSE_KOMODO_BACKUPS_PATH=/etc/komodo/backups' "$COMPOSE_ENV"; then
|
||||||
|
sed -i '/^COMPOSE_KOMODO_IMAGE_TAG=latest$/a COMPOSE_KOMODO_BACKUPS_PATH=/etc/komodo/backups' "$COMPOSE_ENV"
|
||||||
|
fi
|
||||||
|
|
||||||
|
$STD docker compose -p komodo -f "$COMPOSE_FILE" --env-file "$COMPOSE_ENV" pull
|
||||||
|
$STD docker compose -p komodo -f "$COMPOSE_FILE" --env-file "$COMPOSE_ENV" up -d
|
||||||
|
msg_ok "Updated ${APP}"
|
||||||
|
|
||||||
|
msg_ok "Updated successfully"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# PROXMOX HOST CHECK
|
||||||
|
# ==============================================================================
|
||||||
|
function check_proxmox_host() {
|
||||||
|
if command -v pveversion &>/dev/null; then
|
||||||
|
msg_error "Running on the Proxmox host is NOT recommended!"
|
||||||
|
msg_error "This should be executed inside an LXC container."
|
||||||
|
echo ""
|
||||||
|
echo -n "${TAB}Continue anyway? (y/N): "
|
||||||
|
read -r confirm
|
||||||
|
if [[ ! "${confirm,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
msg_warn "Aborted. Please run this inside an LXC container."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
msg_warn "Proceeding on Proxmox host at your own risk!"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# CHECK / INSTALL DOCKER
|
||||||
|
# ==============================================================================
|
||||||
|
function check_or_install_docker() {
|
||||||
|
if command -v docker &>/dev/null; then
|
||||||
|
msg_ok "Docker $(docker --version | cut -d' ' -f3 | tr -d ',') is available"
|
||||||
|
if docker compose version &>/dev/null; then
|
||||||
|
msg_ok "Docker Compose is available"
|
||||||
|
else
|
||||||
|
msg_error "Docker Compose plugin is not available. Please install it."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_warn "Docker is not installed."
|
||||||
|
echo -n "${TAB}Install Docker now? (y/N): "
|
||||||
|
read -r install_docker_prompt
|
||||||
|
if [[ ! "${install_docker_prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
msg_error "Docker is required for ${APP}. Exiting."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Installing Docker"
|
||||||
|
if [[ -f /etc/alpine-release ]]; then
|
||||||
|
$STD apk add docker docker-cli-compose
|
||||||
|
$STD rc-service docker start
|
||||||
|
$STD rc-update add docker default
|
||||||
|
else
|
||||||
|
DOCKER_CONFIG_PATH='/etc/docker/daemon.json'
|
||||||
|
mkdir -p "$(dirname "$DOCKER_CONFIG_PATH")"
|
||||||
|
echo -e '{\n "log-driver": "journald"\n}' >"$DOCKER_CONFIG_PATH"
|
||||||
|
$STD sh <(curl -fsSL https://get.docker.com)
|
||||||
|
fi
|
||||||
|
msg_ok "Installed Docker"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# INSTALL
|
||||||
|
# ==============================================================================
|
||||||
|
function install() {
|
||||||
|
check_or_install_docker
|
||||||
|
|
||||||
|
echo -e "${TAB}Choose the database for Komodo:"
|
||||||
|
echo -e "${TAB} 1) MongoDB (recommended)"
|
||||||
|
echo -e "${TAB} 2) FerretDB"
|
||||||
|
echo -n "${TAB}Enter your choice (default: 1): "
|
||||||
|
read -r DB_CHOICE
|
||||||
|
DB_CHOICE=${DB_CHOICE:-1}
|
||||||
|
|
||||||
|
case $DB_CHOICE in
|
||||||
|
1) DB_COMPOSE_FILE="mongo.compose.yaml" ;;
|
||||||
|
2) DB_COMPOSE_FILE="ferretdb.compose.yaml" ;;
|
||||||
|
*)
|
||||||
|
msg_warn "Invalid choice. Defaulting to MongoDB."
|
||||||
|
DB_COMPOSE_FILE="mongo.compose.yaml"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
msg_info "Creating install directory"
|
||||||
|
mkdir -p "$INSTALL_PATH"
|
||||||
|
msg_ok "Created ${INSTALL_PATH}"
|
||||||
|
|
||||||
|
msg_info "Downloading Docker Compose file"
|
||||||
|
curl -fsSL "https://raw.githubusercontent.com/moghtech/komodo/main/compose/$DB_COMPOSE_FILE" -o "${INSTALL_PATH}/${DB_COMPOSE_FILE}"
|
||||||
|
msg_ok "Downloaded ${DB_COMPOSE_FILE}"
|
||||||
|
|
||||||
|
msg_info "Configuring environment"
|
||||||
|
curl -fsSL "https://raw.githubusercontent.com/moghtech/komodo/main/compose/compose.env" -o "$COMPOSE_ENV"
|
||||||
|
|
||||||
|
DB_PASSWORD=$(openssl rand -base64 16 | tr -d '/+=')
|
||||||
|
ADMIN_PASSWORD=$(openssl rand -base64 8 | tr -d '/+=')
|
||||||
|
PASSKEY=$(openssl rand -base64 24 | tr -d '/+=')
|
||||||
|
WEBHOOK_SECRET=$(openssl rand -base64 24 | tr -d '/+=')
|
||||||
|
JWT_SECRET=$(openssl rand -base64 24 | tr -d '/+=')
|
||||||
|
|
||||||
|
sed -i "s/^KOMODO_DB_USERNAME=.*/KOMODO_DB_USERNAME=komodo_admin/" "$COMPOSE_ENV"
|
||||||
|
sed -i "s/^KOMODO_DB_PASSWORD=.*/KOMODO_DB_PASSWORD=${DB_PASSWORD}/" "$COMPOSE_ENV"
|
||||||
|
sed -i "s/^KOMODO_INIT_ADMIN_PASSWORD=changeme/KOMODO_INIT_ADMIN_PASSWORD=${ADMIN_PASSWORD}/" "$COMPOSE_ENV"
|
||||||
|
sed -i "s/^KOMODO_PASSKEY=.*/KOMODO_PASSKEY=${PASSKEY}/" "$COMPOSE_ENV"
|
||||||
|
sed -i "s/^KOMODO_WEBHOOK_SECRET=.*/KOMODO_WEBHOOK_SECRET=${WEBHOOK_SECRET}/" "$COMPOSE_ENV"
|
||||||
|
sed -i "s/^KOMODO_JWT_SECRET=.*/KOMODO_JWT_SECRET=${JWT_SECRET}/" "$COMPOSE_ENV"
|
||||||
|
msg_ok "Configured environment"
|
||||||
|
|
||||||
|
msg_info "Starting ${APP}"
|
||||||
|
cd "$INSTALL_PATH"
|
||||||
|
$STD docker compose -p komodo -f "${INSTALL_PATH}/${DB_COMPOSE_FILE}" --env-file "$COMPOSE_ENV" up -d
|
||||||
|
msg_ok "Started ${APP}"
|
||||||
|
|
||||||
|
{
|
||||||
|
echo "Komodo Credentials"
|
||||||
|
echo ""
|
||||||
|
echo "Admin User : admin"
|
||||||
|
echo "Admin Password: $ADMIN_PASSWORD"
|
||||||
|
} >>~/komodo.creds
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
msg_ok "${APP} is reachable at: ${BL}http://${LOCAL_IP}:${DEFAULT_PORT}${CL}"
|
||||||
|
echo ""
|
||||||
|
echo -e " Komodo Credentials"
|
||||||
|
echo -e " =================="
|
||||||
|
echo -e " User : admin"
|
||||||
|
echo -e " Password: ${ADMIN_PASSWORD}"
|
||||||
|
echo ""
|
||||||
|
msg_info "Credentials saved to ~/komodo.creds"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# MAIN
|
||||||
|
# ==============================================================================
|
||||||
|
|
||||||
|
# Handle type=update (called from update script)
|
||||||
|
if [[ "${type:-}" == "update" ]]; then
|
||||||
|
header_info
|
||||||
|
COMPOSE_FILE=""
|
||||||
|
COMPOSE_BASENAME=""
|
||||||
|
if [[ -d "$INSTALL_PATH" ]]; then
|
||||||
|
update
|
||||||
|
else
|
||||||
|
msg_error "${APP} is not installed. Nothing to update."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
header_info
|
||||||
|
check_proxmox_host
|
||||||
|
get_lxc_ip
|
||||||
|
|
||||||
|
# Declare variables used by find_compose_file
|
||||||
|
COMPOSE_FILE=""
|
||||||
|
COMPOSE_BASENAME=""
|
||||||
|
|
||||||
|
# Check if already installed
|
||||||
|
if [[ -d "$INSTALL_PATH" ]]; then
|
||||||
|
msg_warn "${APP} is already installed."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -n "${TAB}Uninstall ${APP}? (y/N): "
|
||||||
|
read -r uninstall_prompt
|
||||||
|
if [[ "${uninstall_prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
uninstall
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -n "${TAB}Update ${APP}? (y/N): "
|
||||||
|
read -r update_prompt
|
||||||
|
if [[ "${update_prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
update
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_warn "No action selected. Exiting."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Fresh installation
|
||||||
|
msg_warn "${APP} is not installed."
|
||||||
|
echo ""
|
||||||
|
echo -e "${TAB}${INFO} This will install:"
|
||||||
|
echo -e "${TAB} - Komodo (via Docker Compose)"
|
||||||
|
echo -e "${TAB} - MongoDB or FerretDB (your choice)"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -n "${TAB}Install ${APP}? (y/N): "
|
||||||
|
read -r install_prompt
|
||||||
|
if [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
install
|
||||||
|
else
|
||||||
|
msg_warn "Installation cancelled. Exiting."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
223
tools/addon/runtipi.sh
Normal file
223
tools/addon/runtipi.sh
Normal file
@@ -0,0 +1,223 @@
|
|||||||
|
#!/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://runtipi.io/ | Github: https://github.com/runtipi/runtipi
|
||||||
|
if ! command -v curl &>/dev/null; then
|
||||||
|
printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
|
||||||
|
if [[ -f /etc/alpine-release ]]; then
|
||||||
|
apk update >/dev/null 2>&1
|
||||||
|
apk add --no-cache curl >/dev/null 2>&1
|
||||||
|
else
|
||||||
|
apt-get update >/dev/null 2>&1
|
||||||
|
apt-get install -y curl >/dev/null 2>&1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
|
||||||
|
# Enable error handling
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler' ERR
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# CONFIGURATION
|
||||||
|
# ==============================================================================
|
||||||
|
APP="Runtipi"
|
||||||
|
APP_TYPE="addon"
|
||||||
|
INSTALL_PATH="/opt/runtipi"
|
||||||
|
DEFAULT_PORT=80
|
||||||
|
|
||||||
|
# Initialize all core functions (colors, formatting, icons, STD mode)
|
||||||
|
load_functions
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# PROXMOX HOST CHECK
|
||||||
|
# ==============================================================================
|
||||||
|
function check_proxmox_host() {
|
||||||
|
if command -v pveversion &>/dev/null; then
|
||||||
|
msg_error "Running on the Proxmox host is NOT recommended!"
|
||||||
|
msg_error "This should be executed inside an LXC container."
|
||||||
|
echo ""
|
||||||
|
echo -n "${TAB}Continue anyway? (y/N): "
|
||||||
|
read -r confirm
|
||||||
|
if [[ ! "${confirm,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
msg_warn "Aborted. Please run this inside an LXC container."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
msg_warn "Proceeding on Proxmox host at your own risk!"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# CHECK / INSTALL DOCKER
|
||||||
|
# ==============================================================================
|
||||||
|
function check_or_install_docker() {
|
||||||
|
if command -v docker &>/dev/null; then
|
||||||
|
msg_ok "Docker $(docker --version | cut -d' ' -f3 | tr -d ',') is available"
|
||||||
|
if docker compose version &>/dev/null; then
|
||||||
|
msg_ok "Docker Compose is available"
|
||||||
|
else
|
||||||
|
msg_error "Docker Compose plugin is not available. Please install it."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_warn "Docker is not installed."
|
||||||
|
echo -n "${TAB}Install Docker now? (y/N): "
|
||||||
|
read -r install_docker_prompt
|
||||||
|
if [[ ! "${install_docker_prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
msg_error "Docker is required for ${APP}. Exiting."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Installing Docker"
|
||||||
|
DOCKER_CONFIG_PATH='/etc/docker/daemon.json'
|
||||||
|
mkdir -p "$(dirname "$DOCKER_CONFIG_PATH")"
|
||||||
|
echo -e '{\n "log-driver": "journald"\n}' >"$DOCKER_CONFIG_PATH"
|
||||||
|
$STD sh <(curl -fsSL https://get.docker.com)
|
||||||
|
msg_ok "Installed Docker"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# UNINSTALL
|
||||||
|
# ==============================================================================
|
||||||
|
function uninstall() {
|
||||||
|
msg_info "Uninstalling ${APP}"
|
||||||
|
|
||||||
|
if [[ -f "${INSTALL_PATH}/runtipi-cli" ]]; then
|
||||||
|
msg_info "Stopping ${APP}"
|
||||||
|
cd "$INSTALL_PATH"
|
||||||
|
$STD ./runtipi-cli stop 2>/dev/null || true
|
||||||
|
msg_ok "Stopped ${APP}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if command -v docker &>/dev/null; then
|
||||||
|
msg_info "Removing Docker containers"
|
||||||
|
cd "$INSTALL_PATH" 2>/dev/null && $STD docker compose down --remove-orphans 2>/dev/null || true
|
||||||
|
msg_ok "Removed Docker containers"
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -rf "$INSTALL_PATH"
|
||||||
|
msg_ok "${APP} has been uninstalled"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# UPDATE
|
||||||
|
# ==============================================================================
|
||||||
|
function update() {
|
||||||
|
msg_info "Updating ${APP}"
|
||||||
|
cd "$INSTALL_PATH"
|
||||||
|
$STD ./runtipi-cli update latest
|
||||||
|
msg_ok "Updated ${APP}"
|
||||||
|
|
||||||
|
msg_ok "Updated successfully"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# INSTALL
|
||||||
|
# ==============================================================================
|
||||||
|
function install() {
|
||||||
|
check_or_install_docker
|
||||||
|
|
||||||
|
msg_info "Installing dependencies"
|
||||||
|
$STD apt-get update
|
||||||
|
$STD apt-get install -y openssl
|
||||||
|
msg_ok "Installed dependencies"
|
||||||
|
|
||||||
|
msg_warn "WARNING: This will run an external installer from https://runtipi.io/"
|
||||||
|
msg_warn "The following code is NOT maintained or audited by our repository."
|
||||||
|
msg_warn "Review: https://raw.githubusercontent.com/runtipi/runtipi/master/scripts/install.sh"
|
||||||
|
echo ""
|
||||||
|
echo -n "${TAB}Do you want to continue? (y/N): "
|
||||||
|
read -r confirm
|
||||||
|
if [[ ! "${confirm,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
msg_warn "Installation cancelled. Exiting."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Installing ${APP} (this pulls Docker containers)"
|
||||||
|
DOCKER_CONFIG_PATH='/etc/docker/daemon.json'
|
||||||
|
mkdir -p "$(dirname "$DOCKER_CONFIG_PATH")"
|
||||||
|
[[ ! -f "$DOCKER_CONFIG_PATH" ]] && echo -e '{\n "log-driver": "journald"\n}' >"$DOCKER_CONFIG_PATH"
|
||||||
|
cd /opt
|
||||||
|
curl -fsSL "https://raw.githubusercontent.com/runtipi/runtipi/master/scripts/install.sh" -o "install.sh"
|
||||||
|
chmod +x install.sh
|
||||||
|
$STD ./install.sh
|
||||||
|
chmod 666 /opt/runtipi/state/settings.json 2>/dev/null || true
|
||||||
|
rm -f /opt/install.sh
|
||||||
|
msg_ok "Installed ${APP}"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
msg_ok "${APP} is reachable at: ${BL}http://${LOCAL_IP}:${DEFAULT_PORT}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# MAIN
|
||||||
|
# ==============================================================================
|
||||||
|
|
||||||
|
# Handle type=update (called from update script)
|
||||||
|
if [[ "${type:-}" == "update" ]]; then
|
||||||
|
header_info
|
||||||
|
if [[ -d "$INSTALL_PATH" ]]; then
|
||||||
|
update
|
||||||
|
else
|
||||||
|
msg_error "${APP} is not installed. Nothing to update."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -f /etc/alpine-release ]]; then
|
||||||
|
msg_error "${APP} does not support Alpine Linux. Please use a Debian or Ubuntu based LXC."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
header_info
|
||||||
|
check_proxmox_host
|
||||||
|
get_lxc_ip
|
||||||
|
|
||||||
|
# Check if already installed
|
||||||
|
if [[ -d "$INSTALL_PATH" ]]; then
|
||||||
|
msg_warn "${APP} is already installed."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -n "${TAB}Uninstall ${APP}? (y/N): "
|
||||||
|
read -r uninstall_prompt
|
||||||
|
if [[ "${uninstall_prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
uninstall
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -n "${TAB}Update ${APP}? (y/N): "
|
||||||
|
read -r update_prompt
|
||||||
|
if [[ "${update_prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
update
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_warn "No action selected. Exiting."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Fresh installation
|
||||||
|
msg_warn "${APP} is not installed."
|
||||||
|
echo ""
|
||||||
|
echo -e "${TAB}${INFO} This will install:"
|
||||||
|
echo -e "${TAB} - Runtipi (via external installer)"
|
||||||
|
echo -e "${TAB} - Docker (if not already installed)"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -n "${TAB}Install ${APP}? (y/N): "
|
||||||
|
read -r install_prompt
|
||||||
|
if [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
install
|
||||||
|
else
|
||||||
|
msg_warn "Installation cancelled. Exiting."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
6
tools/headers/coolify
Normal file
6
tools/headers/coolify
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
______ ___ ____
|
||||||
|
/ ____/___ ____ / (_)/ __/_ __
|
||||||
|
/ / / __ \/ __ \/ / / /_/ / / /
|
||||||
|
/ /___/ /_/ / /_/ / / / __/ /_/ /
|
||||||
|
\____/\____/\____/_/_/_/ \__, /
|
||||||
|
/____/
|
||||||
6
tools/headers/dockge
Normal file
6
tools/headers/dockge
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
____ __
|
||||||
|
/ __ \____ _____/ /______ ____
|
||||||
|
/ / / / __ \/ ___/ //_/ __ `/ _ \
|
||||||
|
/ /_/ / /_/ / /__/ ,< / /_/ / __/
|
||||||
|
/_____/\____/\___/_/|_|\__, /\___/
|
||||||
|
/____/
|
||||||
6
tools/headers/dokploy
Normal file
6
tools/headers/dokploy
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
____ __ __
|
||||||
|
/ __ \____ / /______ / /___ __ __
|
||||||
|
/ / / / __ \/ //_/ __ \/ / __ \/ / / /
|
||||||
|
/ /_/ / /_/ / ,< / /_/ / / /_/ / /_/ /
|
||||||
|
/_____/\____/_/|_| .___/_/\____/\__, /
|
||||||
|
/_/ /____/
|
||||||
5
tools/headers/komodo
Normal file
5
tools/headers/komodo
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
__ __ __
|
||||||
|
/ //_/___ ____ ___ ____ ____/ /___
|
||||||
|
/ ,< / __ \/ __ `__ \/ __ \/ __ / __ \
|
||||||
|
/ /| |/ /_/ / / / / / / /_/ / /_/ / /_/ /
|
||||||
|
/_/ |_|\____/_/ /_/ /_/\____/\__,_/\____/
|
||||||
5
tools/headers/runtipi
Normal file
5
tools/headers/runtipi
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
____ __ _ _
|
||||||
|
/ __ \__ ______ / /_(_)__ (_)
|
||||||
|
/ /_/ / / / / __ \/ __/ / _ \/ /
|
||||||
|
/ _, _/ /_/ / / / / /_/ / ___/ /
|
||||||
|
/_/ |_|\__,_/_/ /_/\__/_/_/ /_/
|
||||||
Reference in New Issue
Block a user