Agrega scripts y runbooks: Cloudflare API, autostart Coolify, parche Chatwoot, deploy Solo Leveling + docs de casos

- scripts/Invoke-CloudflareApi.ps1: control de tunnel/DNS via API
- scripts/Install-CoolifyAutostart.ps1 + scripts/host/: autostart de LXC 102 + tunnel tras corte
- scripts/Apply-ChatwootEnterprisePatch.ps1: parche enterprise (autodetecta creds)
- Deploy-SoloLeveling.ps1: deploy build-on-server verificado
- docs/runbooks/cloudflare-tunnel.md y autostart-coolify.md
- docs/casos/chatwoot-enterprise-patch.md (credenciales redactadas)
- docs/AGENTS-coolify-apps.md + issues y reportes
- deploy_skill/references/coolify-4.1.2-notes.md: hallazgos verificados (seccion 7)
- package.json para verify-online.mjs del coolify-deploy skill
- .gitignore: excluye .claude/ y .opencode/ (config local de herramientas)
This commit is contained in:
urieljareth
2026-07-18 11:31:31 -06:00
parent e7d1c33cd5
commit f587a8baa2
23 changed files with 2312 additions and 2 deletions
+166
View File
@@ -0,0 +1,166 @@
<#
.SYNOPSIS
Installs power-outage auto-start for the Coolify stack on the Proxmox host.
.DESCRIPTION
Makes sure that after a power outage (host reboot) LXC 102 (Coolify) and its
Cloudflare tunnel come back up on their own. It does three things:
1. Sets the LXC to start on boot -> pct set <id> --onboot 1 --startup order=1,up=30
2. Installs a self-healing guardian -> /usr/local/bin/coolify-autostart.sh
+ systemd unit /etc/systemd/system/coolify-autostart.service
3. Enables the guardian so it runs on every boot.
The guardian is idempotent: on each boot it ensures the LXC is running, waits
for Docker inside it, and starts any core Coolify container or tunnel that
isn't up. Everything is additive and reversible (see -Uninstall).
Source files live in scripts/host/ and are pushed over SSH (base64, so no
quoting issues and CRLF is normalised to LF on the host).
.PARAMETER VerifyOnly
Only report current state (onboot flag, unit enabled, log tail). No changes.
.PARAMETER SkipOnboot
Install/enable the guardian but do NOT touch the LXC onboot flag.
.PARAMETER RunNow
After installing, trigger the guardian once (systemctl start) to test it and
print the resulting log. Safe: the guardian only starts things, never stops.
.PARAMETER Uninstall
Remove the guardian (disable + delete unit + script). Does NOT clear onboot.
.EXAMPLE
.\scripts\Install-CoolifyAutostart.ps1 -RunNow
.EXAMPLE
.\scripts\Install-CoolifyAutostart.ps1 -VerifyOnly
#>
[CmdletBinding()]
param(
[switch]$VerifyOnly,
[switch]$SkipOnboot,
[switch]$RunNow,
[switch]$Uninstall
)
$ErrorActionPreference = "Stop"
. "$PSScriptRoot\ProxmoxAgent.ps1"
$config = Get-ProxmoxConfig
$lxc = $config.CoolifyLxc
$svcName = "coolify-autostart.service"
$svcPath = "/etc/systemd/system/$svcName"
$binPath = "/usr/local/bin/coolify-autostart.sh"
$logPath = "/var/log/coolify-autostart.log"
$localSh = Join-Path $PSScriptRoot "host\coolify-autostart.sh"
$localSvc = Join-Path $PSScriptRoot "host\coolify-autostart.service"
function Write-Section([string]$Text) {
Write-Host ""
Write-Host "== $Text ==" -ForegroundColor Cyan
}
# Run a remote command, normalising CRLF -> LF first. Multi-line command strings
# authored in this (CRLF) file would otherwise carry a trailing '\r' on every
# line, which breaks commands whose last token matters (e.g. unit names).
function Invoke-Remote([string]$Command) {
Invoke-ProxmoxSshCommand -Command ($Command -replace "`r`n", "`n")
}
# Push text to the host as LF-normalised bytes via base64 (avoids every
# quoting/CRLF pitfall of heredocs over SSH). Pass -Content to push a
# pre-built string instead of a file.
function Push-TextFile {
param(
[string]$LocalPath,
[Parameter(Mandatory)][string]$RemotePath,
[string]$Content
)
if ($Content) { $text = $Content }
else { $text = Get-Content -LiteralPath $LocalPath -Raw }
$text = $text -replace "`r`n", "`n"
$bytes = [Text.Encoding]::UTF8.GetBytes($text)
$b64 = [Convert]::ToBase64String($bytes)
Invoke-ProxmoxSshCommand -Command "echo '$b64' | base64 -d > '$RemotePath'"
}
# ---------------------------------------------------------------------------
# VERIFY-ONLY
# ---------------------------------------------------------------------------
if ($VerifyOnly) {
Write-Section "Verification (read-only) - LXC $lxc"
Invoke-Remote @"
echo '--- onboot / startup on LXC $lxc ---'
grep -Ei 'onboot|startup' /etc/pve/lxc/$lxc.conf 2>/dev/null || echo '(onboot not set -> defaults to 0, will NOT auto-start)'
echo '--- guardian unit ---'
systemctl is-enabled $svcName 2>/dev/null || echo '($svcName not installed/enabled)'
echo '--- guardian script present? ---'
test -x $binPath && echo 'present ($binPath)' || echo 'missing ($binPath)'
echo '--- last log lines ---'
tail -n 15 $logPath 2>/dev/null || echo '(no log yet)'
"@
return
}
# ---------------------------------------------------------------------------
# UNINSTALL
# ---------------------------------------------------------------------------
if ($Uninstall) {
Write-Section "Uninstalling guardian (onboot flag left untouched)"
Invoke-Remote @"
systemctl disable --now $svcName 2>/dev/null || true
rm -f $svcPath $binPath
systemctl daemon-reload
echo 'guardian removed. To also stop auto-start of the LXC: pct set $lxc --onboot 0'
"@
Write-Host "Done. onboot flag NOT changed." -ForegroundColor Yellow
return
}
# ---------------------------------------------------------------------------
# INSTALL
# ---------------------------------------------------------------------------
foreach ($f in @($localSh, $localSvc)) {
if (-not (Test-Path -LiteralPath $f)) { throw "Missing source file: $f" }
}
# Bake the configured LXC id into the unit so the guardian targets the right one.
$svcText = (Get-Content -LiteralPath $localSvc -Raw) -replace "`r`n", "`n"
$svcText = $svcText -replace "(?m)^\[Service\]\n", "[Service]`nEnvironment=COOLIFY_LXC=$lxc`n"
Write-Section "1/4 Push guardian script + unit to host"
Push-TextFile -LocalPath $localSh -RemotePath $binPath
Push-TextFile -RemotePath $svcPath -Content $svcText
Invoke-Remote "chmod 755 '$binPath' && bash -n '$binPath' && echo 'script pushed + syntax OK'"
Write-Host " script -> $binPath" -ForegroundColor Green
Write-Host " unit -> $svcPath (COOLIFY_LXC=$lxc)" -ForegroundColor Green
if (-not $SkipOnboot) {
Write-Section "2/4 Enable LXC $lxc onboot (native Proxmox auto-start)"
Invoke-Remote "pct set $lxc --onboot 1 --startup order=1,up=30 && echo 'onboot=1 set' && grep -Ei 'onboot|startup' /etc/pve/lxc/$lxc.conf"
} else {
Write-Section "2/4 Skipping onboot flag (-SkipOnboot)"
}
Write-Section "3/4 Enable guardian on every boot"
Invoke-Remote "systemctl daemon-reload && systemctl enable $svcName && echo 'guardian enabled'"
Write-Section "4/4 Verify"
Invoke-Remote @"
printf 'onboot: '; grep -Ei 'onboot' /etc/pve/lxc/$lxc.conf 2>/dev/null || echo '(not set)'
printf 'guardian enabled: '; systemctl is-enabled $svcName 2>/dev/null || echo 'no'
printf 'script executable: '; test -x $binPath && echo yes || echo no
"@
if ($RunNow) {
Write-Section "RunNow Triggering guardian once (test)"
Invoke-Remote "systemctl start $svcName; sleep 2; systemctl is-active $svcName; echo '--- log ---'; tail -n 25 $logPath"
}
Write-Host ""
Write-Host "Done. After a power outage the host will auto-start LXC $lxc, Docker, the" -ForegroundColor Green
Write-Host "Coolify core containers and the Cloudflare tunnel. Re-run with -VerifyOnly" -ForegroundColor Green
Write-Host "to check state, or -Uninstall to remove the guardian." -ForegroundColor Green