Add Proxmox deployment script
This commit is contained in:
53
deploy-kostenverdeler-pve.md
Normal file
53
deploy-kostenverdeler-pve.md
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
# Kostenverdeler deployen op Proxmox VE
|
||||||
|
|
||||||
|
Gebruik `deploy-kostenverdeler-pve.sh` in de shell van je Proxmox host.
|
||||||
|
|
||||||
|
## Snel starten met DHCP
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bash deploy-kostenverdeler-pve.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Dit maakt standaard container `120` aan en serveert de app op poort `8080`.
|
||||||
|
|
||||||
|
## Met statisch IP
|
||||||
|
|
||||||
|
```bash
|
||||||
|
CTID=120 \
|
||||||
|
NET0_IP="192.168.1.50/24" \
|
||||||
|
GATEWAY="192.168.1.1" \
|
||||||
|
bash deploy-kostenverdeler-pve.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## Met domeinnaam via Caddy
|
||||||
|
|
||||||
|
Zorg eerst dat DNS naar de container wijst. Daarna:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
CTID=120 \
|
||||||
|
NET0_IP="192.168.1.50/24" \
|
||||||
|
GATEWAY="192.168.1.1" \
|
||||||
|
DOMAIN="kosten.henrystuifzand.nl" \
|
||||||
|
bash deploy-kostenverdeler-pve.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## Veelgebruikte variabelen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
CTID=120
|
||||||
|
HOSTNAME=kostenverdeler
|
||||||
|
STORAGE=local-lvm
|
||||||
|
TEMPLATE_STORAGE=local
|
||||||
|
DISK_SIZE=4
|
||||||
|
MEMORY=256
|
||||||
|
CORES=1
|
||||||
|
BRIDGE=vmbr0
|
||||||
|
DOMAIN=
|
||||||
|
REPO_URL=https://git.henrystuifzand.nl/henry/kostenverdeler.git
|
||||||
|
```
|
||||||
|
|
||||||
|
## Updaten na een nieuwe commit
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pct exec 120 -- bash -lc 'cd /var/www/kostenverdeler && git pull && systemctl reload caddy'
|
||||||
|
```
|
||||||
166
deploy-kostenverdeler-pve.sh
Normal file
166
deploy-kostenverdeler-pve.sh
Normal file
@@ -0,0 +1,166 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -Eeuo pipefail
|
||||||
|
|
||||||
|
# Kostenverdeler deployment script for a Proxmox VE host.
|
||||||
|
# Run this from the PVE shell as root:
|
||||||
|
# bash deploy-kostenverdeler-pve.sh
|
||||||
|
#
|
||||||
|
# Adjust the variables below before running.
|
||||||
|
|
||||||
|
CTID="${CTID:-120}"
|
||||||
|
HOSTNAME="${HOSTNAME:-kostenverdeler}"
|
||||||
|
STORAGE="${STORAGE:-local-lvm}"
|
||||||
|
TEMPLATE_STORAGE="${TEMPLATE_STORAGE:-local}"
|
||||||
|
DISK_SIZE="${DISK_SIZE:-4}"
|
||||||
|
MEMORY="${MEMORY:-256}"
|
||||||
|
CORES="${CORES:-1}"
|
||||||
|
BRIDGE="${BRIDGE:-vmbr0}"
|
||||||
|
|
||||||
|
# DHCP by default. For static IP, use for example:
|
||||||
|
# NET0_IP="192.168.1.50/24"
|
||||||
|
# GATEWAY="192.168.1.1"
|
||||||
|
NET0_IP="${NET0_IP:-dhcp}"
|
||||||
|
GATEWAY="${GATEWAY:-}"
|
||||||
|
|
||||||
|
# Leave DOMAIN empty to serve on port 8080.
|
||||||
|
# Set DOMAIN="kosten.henrystuifzand.nl" if DNS points to this container/reverse proxy.
|
||||||
|
DOMAIN="${DOMAIN:-}"
|
||||||
|
|
||||||
|
REPO_URL="${REPO_URL:-https://git.henrystuifzand.nl/henry/kostenverdeler.git}"
|
||||||
|
APP_DIR="${APP_DIR:-/var/www/kostenverdeler}"
|
||||||
|
TEMPLATE="${TEMPLATE:-debian-12-standard_12.7-1_amd64.tar.zst}"
|
||||||
|
|
||||||
|
log() {
|
||||||
|
printf '\n\033[1;32m==>\033[0m %s\n' "$*"
|
||||||
|
}
|
||||||
|
|
||||||
|
die() {
|
||||||
|
printf '\n\033[1;31mERROR:\033[0m %s\n' "$*" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
require_root() {
|
||||||
|
[[ "${EUID}" -eq 0 ]] || die "Run dit script als root op de Proxmox host."
|
||||||
|
}
|
||||||
|
|
||||||
|
require_pve() {
|
||||||
|
command -v pct >/dev/null 2>&1 || die "pct niet gevonden. Run dit script in de Proxmox VE shell."
|
||||||
|
command -v pveam >/dev/null 2>&1 || die "pveam niet gevonden. Run dit script in de Proxmox VE shell."
|
||||||
|
}
|
||||||
|
|
||||||
|
template_path() {
|
||||||
|
printf '/var/lib/vz/template/cache/%s' "${TEMPLATE}"
|
||||||
|
}
|
||||||
|
|
||||||
|
ensure_template() {
|
||||||
|
if [[ -f "$(template_path)" ]]; then
|
||||||
|
log "Debian template bestaat al: ${TEMPLATE}"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "Template-lijst bijwerken"
|
||||||
|
pveam update
|
||||||
|
|
||||||
|
log "Debian template downloaden: ${TEMPLATE}"
|
||||||
|
pveam download "${TEMPLATE_STORAGE}" "${TEMPLATE}"
|
||||||
|
}
|
||||||
|
|
||||||
|
create_container() {
|
||||||
|
pct status "${CTID}" >/dev/null 2>&1 && die "Container ${CTID} bestaat al. Kies een andere CTID of verwijder de bestaande container."
|
||||||
|
|
||||||
|
local net0="name=eth0,bridge=${BRIDGE},ip=${NET0_IP}"
|
||||||
|
if [[ -n "${GATEWAY}" && "${NET0_IP}" != "dhcp" ]]; then
|
||||||
|
net0="${net0},gw=${GATEWAY}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "LXC container ${CTID} aanmaken"
|
||||||
|
pct create "${CTID}" "$(template_path)" \
|
||||||
|
--hostname "${HOSTNAME}" \
|
||||||
|
--ostype debian \
|
||||||
|
--storage "${STORAGE}" \
|
||||||
|
--rootfs "${STORAGE}:${DISK_SIZE}" \
|
||||||
|
--memory "${MEMORY}" \
|
||||||
|
--cores "${CORES}" \
|
||||||
|
--net0 "${net0}" \
|
||||||
|
--unprivileged 1 \
|
||||||
|
--features nesting=1 \
|
||||||
|
--start 1
|
||||||
|
}
|
||||||
|
|
||||||
|
wait_for_network() {
|
||||||
|
log "Wachten tot de container netwerk heeft"
|
||||||
|
for _ in {1..60}; do
|
||||||
|
if pct exec "${CTID}" -- bash -lc 'getent hosts deb.debian.org >/dev/null 2>&1'; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
die "Container kreeg geen werkende netwerkverbinding."
|
||||||
|
}
|
||||||
|
|
||||||
|
install_app() {
|
||||||
|
log "Pakketten installeren in container"
|
||||||
|
pct exec "${CTID}" -- bash -lc 'apt-get update && apt-get install -y --no-install-recommends ca-certificates curl git caddy'
|
||||||
|
|
||||||
|
log "Applicatie clonen"
|
||||||
|
pct exec "${CTID}" -- bash -lc "rm -rf '${APP_DIR}' && mkdir -p '$(dirname "${APP_DIR}")' && git clone '${REPO_URL}' '${APP_DIR}'"
|
||||||
|
|
||||||
|
log "Caddy configureren"
|
||||||
|
if [[ -n "${DOMAIN}" ]]; then
|
||||||
|
pct exec "${CTID}" -- bash -lc "cat > /etc/caddy/Caddyfile <<'CADDY'
|
||||||
|
${DOMAIN} {
|
||||||
|
root * ${APP_DIR}
|
||||||
|
file_server
|
||||||
|
}
|
||||||
|
CADDY"
|
||||||
|
else
|
||||||
|
pct exec "${CTID}" -- bash -lc "cat > /etc/caddy/Caddyfile <<'CADDY'
|
||||||
|
:8080 {
|
||||||
|
root * ${APP_DIR}
|
||||||
|
file_server
|
||||||
|
}
|
||||||
|
CADDY"
|
||||||
|
fi
|
||||||
|
|
||||||
|
pct exec "${CTID}" -- bash -lc 'systemctl enable --now caddy && systemctl reload caddy'
|
||||||
|
}
|
||||||
|
|
||||||
|
container_ip() {
|
||||||
|
pct exec "${CTID}" -- bash -lc "hostname -I | awk '{print \$1}'" 2>/dev/null || true
|
||||||
|
}
|
||||||
|
|
||||||
|
print_result() {
|
||||||
|
local ip
|
||||||
|
ip="$(container_ip)"
|
||||||
|
|
||||||
|
log "Klaar"
|
||||||
|
if [[ -n "${DOMAIN}" ]]; then
|
||||||
|
printf 'App URL: https://%s\n' "${DOMAIN}"
|
||||||
|
elif [[ -n "${ip}" ]]; then
|
||||||
|
printf 'App URL: http://%s:8080\n' "${ip}"
|
||||||
|
else
|
||||||
|
printf 'App URL: http://<container-ip>:8080\n'
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat <<EOF
|
||||||
|
|
||||||
|
Container:
|
||||||
|
CTID: ${CTID}
|
||||||
|
Hostname: ${HOSTNAME}
|
||||||
|
App map: ${APP_DIR}
|
||||||
|
|
||||||
|
App updaten:
|
||||||
|
pct exec ${CTID} -- bash -lc 'cd ${APP_DIR} && git pull && systemctl reload caddy'
|
||||||
|
|
||||||
|
Logs bekijken:
|
||||||
|
pct exec ${CTID} -- journalctl -u caddy -n 100 --no-pager
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
require_root
|
||||||
|
require_pve
|
||||||
|
ensure_template
|
||||||
|
create_container
|
||||||
|
wait_for_network
|
||||||
|
install_app
|
||||||
|
print_result
|
||||||
Reference in New Issue
Block a user