From c06a16d86ee36819364389ddd99775186295d268 Mon Sep 17 00:00:00 2001 From: Hendrik Date: Fri, 1 May 2026 18:23:48 +0200 Subject: [PATCH] =?UTF-8?q?Prebuilt=20.next/=20via=20GitHub=20Releases=20?= =?UTF-8?q?=E2=80=94=20install/update=20fetch=20tarball,=20skip=20build=20?= =?UTF-8?q?(saves=20~25s)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/release.yml | 39 +++++++++++++++++++++++++++++++++++ package.json | 2 +- scripts/install.sh | 37 ++++++++++++++++++++++++++++++--- scripts/update.sh | 31 ++++++++++++++++++++++++++-- 4 files changed, 103 insertions(+), 6 deletions(-) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..5451490 --- /dev/null +++ b/.github/workflows/release.yml @@ -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 diff --git a/package.json b/package.json index 1bb3745..9fd5aa4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "corex-nexredirect", - "version": "0.1.0", + "version": "0.1.1", "license": "MIT", "scripts": { "dev": "tsx watch server.ts", diff --git a/scripts/install.sh b/scripts/install.sh index bc303a5..8f0343e 100755 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -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" diff --git a/scripts/update.sh b/scripts/update.sh index 7725740..3c8065e 100755 --- a/scripts/update.sh +++ b/scripts/update.sh @@ -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"