Schulportal-Konventionen übernommen: Dark Mode (ThemeToggle), beispieldaten.py + generated.json, kimi.md, mail-server (Postfix-Relay + API), Deploy-Workflow (pscp/plink, npm_default), Screenshots in preview/
This commit is contained in:
@@ -1,43 +1,46 @@
|
||||
#!/usr/bin/env bash
|
||||
# Hocks Mieterportal – Deployment auf hocks.eu
|
||||
# Hocks Mieterportal – Deploy auf hocks.eu (Workflow aus dem Schulportal)
|
||||
#
|
||||
# SSH-Auth: Pageant (plink) oder OpenSSH-Schlüssel ~/.ssh/hocks_deploy.
|
||||
# 1. npm run build 2. Paket (dist + compose + nginx) per pscp hochladen
|
||||
# 3. Entpacken nach /opt/mieterportal, Container mp-portal neu starten
|
||||
#
|
||||
# Voraussetzungen: Pageant mit priv_ionos_hocks_vps.ppk läuft.
|
||||
# Aufruf: ./deploy.sh
|
||||
set -euo pipefail
|
||||
|
||||
SERVER="${SERVER:-hocks.eu}"
|
||||
SSH_PORT="${SSH_PORT:-38592}"
|
||||
SSH_USER="${SSH_USER:-root}"
|
||||
SERVER="root@hocks.eu"
|
||||
PORT=38592
|
||||
HOSTKEY="SHA256:4G3UxsugNkHH6BrPXScLXh+vX8P1sLgWKn8cZBKSRxw"
|
||||
KEY="Z:\Devel\ssh\priv_ionos_hocks_vps.ppk"
|
||||
PSCP="/c/Program Files/PuTTY/pscp.exe"
|
||||
PLINK="/c/Program Files/PuTTY/plink.exe"
|
||||
REMOTE_DIR="/opt/mieterportal"
|
||||
REPO="https://git.hocks.eu/ah-admin/Mieterportal.git"
|
||||
IMAGE="mieterportal:latest"
|
||||
|
||||
run() { # run <remote command>
|
||||
local cmd="$1"
|
||||
if command -v plink >/dev/null 2>&1 || [ -f "/c/Program Files/PuTTY/plink.exe" ]; then
|
||||
local PLINK="${PLINK:-$(command -v plink || echo '/c/Program Files/PuTTY/plink.exe')}"
|
||||
"$PLINK" -ssh -P "$SSH_PORT" -agent -batch "${SSH_USER}@${SERVER}" "$cmd"
|
||||
else
|
||||
ssh -p "$SSH_PORT" -i ~/.ssh/hocks_deploy -o BatchMode=yes \
|
||||
-o StrictHostKeyChecking=accept-new "${SSH_USER}@${SERVER}" "$cmd"
|
||||
fi
|
||||
}
|
||||
echo "==> 1/4 Frontend bauen"
|
||||
npm run build
|
||||
|
||||
echo "==> Verbindung zu ${SSH_USER}@${SERVER}:${SSH_PORT} testen"
|
||||
run "docker --version"
|
||||
echo "==> 2/4 Paket erstellen und hochladen"
|
||||
rm -rf tmp-deploy && mkdir -p tmp-deploy/docker
|
||||
cp -r dist tmp-deploy/dist
|
||||
cp docker-compose.yml tmp-deploy/
|
||||
cp docker/nginx.conf tmp-deploy/docker/
|
||||
tar -czf mp-dist.tar.gz -C tmp-deploy .
|
||||
rm -rf tmp-deploy
|
||||
"$PSCP" -batch -hostkey "$HOSTKEY" -i "$KEY" -P "$PORT" \
|
||||
mp-dist.tar.gz "$SERVER":/tmp/mp-dist.tar.gz
|
||||
rm -f mp-dist.tar.gz
|
||||
|
||||
echo "==> Repository auf dem Server aktualisieren (${REMOTE_DIR})"
|
||||
run "mkdir -p ${REMOTE_DIR} && cd ${REMOTE_DIR} && \
|
||||
(git rev-parse --git-dir >/dev/null 2>&1 || git clone ${REPO} .) && \
|
||||
git fetch origin && git reset --hard origin/main"
|
||||
echo "==> 3/4 Auf Server entpacken und Container ersetzen"
|
||||
"$PLINK" -batch -hostkey "$HOSTKEY" -i "$KEY" -P "$PORT" "$SERVER" "
|
||||
mkdir -p $REMOTE_DIR &&
|
||||
tar -xzf /tmp/mp-dist.tar.gz -C $REMOTE_DIR &&
|
||||
rm -f /tmp/mp-dist.tar.gz &&
|
||||
cd $REMOTE_DIR && docker compose up -d
|
||||
"
|
||||
|
||||
echo "==> Docker-Image bauen"
|
||||
run "cd ${REMOTE_DIR} && docker build -t ${IMAGE} ."
|
||||
|
||||
echo "==> Container ersetzen"
|
||||
run "docker rm -f mieterportal 2>/dev/null || true"
|
||||
run "cd ${REMOTE_DIR} && docker compose up -d"
|
||||
|
||||
echo "==> Status"
|
||||
run "docker ps --filter name=mieterportal --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'"
|
||||
echo "Fertig. Portal läuft auf dem Server (Routing: mieterportal.hocks.eu)."
|
||||
echo "==> 4/4 Status prüfen"
|
||||
"$PLINK" -batch -hostkey "$HOSTKEY" -i "$KEY" -P "$PORT" "$SERVER" "
|
||||
docker ps --filter name=mp-portal --format 'table {{.Names}}\t{{.Status}}' &&
|
||||
curl -s https://mieterportal.hocks.eu/ | grep -o 'index-[^\"]*\.js' | head -1
|
||||
"
|
||||
echo "Fertig: https://mieterportal.hocks.eu"
|
||||
|
||||
Reference in New Issue
Block a user