Prebuilt .next/ via GitHub Releases — install/update fetch tarball, skip build (saves ~25s)

This commit is contained in:
Hendrik 2026-05-01 18:23:48 +02:00
parent 3d8a1ac539
commit c06a16d86e
4 changed files with 103 additions and 6 deletions

39
.github/workflows/release.yml vendored Normal file
View file

@ -0,0 +1,39 @@
name: Release Build
on:
push:
tags:
- 'v*'
permissions:
contents: write
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install deps
run: npm ci --no-audit --no-fund
- name: Build Next.js
run: npm run build
- name: Package .next/
run: |
TAG="${GITHUB_REF_NAME}"
tar -czf "nexredirect-next-${TAG}.tar.gz" .next
ls -lh "nexredirect-next-${TAG}.tar.gz"
- name: Attach to release
uses: softprops/action-gh-release@v2
with:
files: nexredirect-next-*.tar.gz
tag_name: ${{ github.ref_name }}
fail_on_unmatched_files: true

View file

@ -1,6 +1,6 @@
{
"name": "corex-nexredirect",
"version": "0.1.0",
"version": "0.1.1",
"license": "MIT",
"scripts": {
"dev": "tsx watch server.ts",

View file

@ -50,13 +50,28 @@ if ! id "$SERVICE_USER" >/dev/null 2>&1; then
useradd --system --home "$INSTALL_DIR" --shell /usr/sbin/nologin "$SERVICE_USER"
fi
echo "==> Repo clonen / aktualisieren"
echo "==> Latest Release ermitteln"
TARGET_TAG="${NEXREDIRECT_TAG:-}"
if [[ -z "$TARGET_TAG" ]]; then
TARGET_TAG=$(curl -fsSL "https://api.github.com/repos/${REPO}/releases/latest" 2>/dev/null \
| grep -m1 '"tag_name"' | sed -E 's/.*"tag_name": *"([^"]+)".*/\1/' || true)
fi
if [[ -z "$TARGET_TAG" ]]; then
echo " (kein Release gefunden — fallback main)"
TARGET_REF="main"
else
echo " Tag: $TARGET_TAG"
TARGET_REF="$TARGET_TAG"
fi
echo "==> Repo clonen / aktualisieren ($TARGET_REF)"
if [[ -d "$INSTALL_DIR/.git" ]]; then
git -C "$INSTALL_DIR" fetch --tags --quiet
git -C "$INSTALL_DIR" reset --hard origin/main --quiet
git -C "$INSTALL_DIR" reset --hard --quiet "$TARGET_REF" 2>/dev/null || git -C "$INSTALL_DIR" reset --hard --quiet "origin/$TARGET_REF"
else
rm -rf "$INSTALL_DIR"
git clone --quiet "https://github.com/${REPO}.git" "$INSTALL_DIR"
git -C "$INSTALL_DIR" checkout --quiet "$TARGET_REF" 2>/dev/null || true
fi
mkdir -p "$DATA_DIR"
@ -65,7 +80,23 @@ chown -R "$SERVICE_USER:$SERVICE_USER" "$INSTALL_DIR" "$DATA_DIR"
echo "==> Dependencies installieren"
sudo -u "$SERVICE_USER" -H bash -c "cd '$INSTALL_DIR' && npm ci --no-audit --no-fund"
sudo -u "$SERVICE_USER" -H bash -c "cd '$INSTALL_DIR' && npm run build"
echo "==> Prebuilt .next/ versuchen"
PREBUILT_OK=0
if [[ -n "$TARGET_TAG" ]]; then
ASSET_URL="https://github.com/${REPO}/releases/download/${TARGET_TAG}/nexredirect-next-${TARGET_TAG}.tar.gz"
if curl -fsSL -o /tmp/next-build.tgz "$ASSET_URL" 2>/dev/null; then
sudo -u "$SERVICE_USER" -H tar -xzf /tmp/next-build.tgz -C "$INSTALL_DIR"
rm -f /tmp/next-build.tgz
PREBUILT_OK=1
echo " Prebuilt aus Release übernommen — Build übersprungen."
else
echo " Kein Prebuilt für $TARGET_TAG — baue lokal."
fi
fi
if [[ $PREBUILT_OK -eq 0 ]]; then
sudo -u "$SERVICE_USER" -H bash -c "cd '$INSTALL_DIR' && npm run build"
fi
echo "==> GeoLite2-Country DB"
GEOIP_PATH="$DATA_DIR/GeoLite2-Country.mmdb"

View file

@ -6,6 +6,7 @@
set -euo pipefail
TAG="${1:-}"
REPO="${NEXREDIRECT_REPO:-CoreXManagement/CoreX-NexRedirect}"
INSTALL_DIR="${NEXREDIRECT_DIR:-/opt/corex-nexredirect}"
SERVICE_USER="nexredirect"
@ -14,14 +15,40 @@ cd "$INSTALL_DIR"
chmod +x "$INSTALL_DIR/scripts/"*.sh 2>/dev/null || true
chown -R "$SERVICE_USER:$SERVICE_USER" "$INSTALL_DIR"
if [[ -z "$TAG" ]]; then
TAG=$(curl -fsSL "https://api.github.com/repos/${REPO}/releases/latest" 2>/dev/null \
| grep -m1 '"tag_name"' | sed -E 's/.*"tag_name": *"([^"]+)".*/\1/' || true)
fi
if [[ -n "$TAG" ]]; then
echo "==> Update auf $TAG"
sudo -u "$SERVICE_USER" -H bash -c "cd '$INSTALL_DIR' && git fetch --tags --quiet && git checkout --quiet '$TAG'"
else
sudo -u "$SERVICE_USER" -H bash -c "cd '$INSTALL_DIR' && git fetch --quiet && git pull --ff-only --quiet"
echo "==> Update auf main (kein Release gefunden)"
sudo -u "$SERVICE_USER" -H bash -c "cd '$INSTALL_DIR' && git fetch --quiet && git checkout --quiet main && git pull --ff-only --quiet"
fi
sudo -u "$SERVICE_USER" -H bash -c "cd '$INSTALL_DIR' && npm ci --no-audit --no-fund"
sudo -u "$SERVICE_USER" -H bash -c "cd '$INSTALL_DIR' && npm run build"
PREBUILT_OK=0
if [[ -n "$TAG" ]]; then
ASSET_URL="https://github.com/${REPO}/releases/download/${TAG}/nexredirect-next-${TAG}.tar.gz"
if curl -fsSL -o /tmp/next-build.tgz "$ASSET_URL" 2>/dev/null; then
rm -rf "$INSTALL_DIR/.next"
sudo -u "$SERVICE_USER" -H tar -xzf /tmp/next-build.tgz -C "$INSTALL_DIR"
rm -f /tmp/next-build.tgz
PREBUILT_OK=1
echo "==> Prebuilt .next/ aus Release übernommen"
fi
fi
if [[ $PREBUILT_OK -eq 0 ]]; then
echo "==> Lokal bauen"
sudo -u "$SERVICE_USER" -H bash -c "cd '$INSTALL_DIR' && npm run build"
fi
# CLI-Symlink aktualisieren falls Pfad neu
ln -sf "$INSTALL_DIR/bin/nexredirect" /usr/local/bin/nexredirect
chmod +x "$INSTALL_DIR/bin/nexredirect" 2>/dev/null || true
systemctl restart corex-nexredirect
echo "Update auf $(sudo -u "$SERVICE_USER" -H bash -c "cd '$INSTALL_DIR' && git describe --tags --always") abgeschlossen"