From 80a01a10b309904f603258dc058760ec84e7b234 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Han=C3=9F?= Date: Mon, 26 May 2025 21:45:15 +0200 Subject: [PATCH 01/15] Hotfix Can only click on stats detaiils when availible (#85) * update dependencies * adds loading spinner to dashboard * Hotfix: Stats details can only be clicked when stats avail. --- packages/frontend/src/components/quiz-tabs/QuizStatsTab.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/frontend/src/components/quiz-tabs/QuizStatsTab.tsx b/packages/frontend/src/components/quiz-tabs/QuizStatsTab.tsx index dceba79..7896421 100644 --- a/packages/frontend/src/components/quiz-tabs/QuizStatsTab.tsx +++ b/packages/frontend/src/components/quiz-tabs/QuizStatsTab.tsx @@ -185,8 +185,8 @@ export const QuizStatsTab: React.FC<{ quizData: CurrentQuizState }> = ({ quizDat textUnderlineOffset: "3px", // color: $primary }} - onClick={() => - tryActor.forEach(actor => + // Only activate question stats if there are details available + onClick={() => noDetails ? null : tryActor.forEach(actor => actor.send( actor, CurrentQuizMessages.ActivateQuestionStats( From 39d3e8659fccba37e315a269efe3d3c210edfabf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Han=C3=9F?= Date: Mon, 26 May 2025 21:47:15 +0200 Subject: [PATCH 02/15] Revert "Hotfix Can only click on stats detaiils when availible (#85)" (#86) This reverts commit 80a01a10b309904f603258dc058760ec84e7b234. --- packages/frontend/src/components/quiz-tabs/QuizStatsTab.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/frontend/src/components/quiz-tabs/QuizStatsTab.tsx b/packages/frontend/src/components/quiz-tabs/QuizStatsTab.tsx index 7896421..dceba79 100644 --- a/packages/frontend/src/components/quiz-tabs/QuizStatsTab.tsx +++ b/packages/frontend/src/components/quiz-tabs/QuizStatsTab.tsx @@ -185,8 +185,8 @@ export const QuizStatsTab: React.FC<{ quizData: CurrentQuizState }> = ({ quizDat textUnderlineOffset: "3px", // color: $primary }} - // Only activate question stats if there are details available - onClick={() => noDetails ? null : tryActor.forEach(actor => + onClick={() => + tryActor.forEach(actor => actor.send( actor, CurrentQuizMessages.ActivateQuestionStats( From b7617a0b4ed86182bfe3011e301d4f1b252818f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Han=C3=9F?= Date: Wed, 4 Jun 2025 14:10:52 +0200 Subject: [PATCH 03/15] Create deploy-test.yml --- .github/workflows/deploy-test.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 .github/workflows/deploy-test.yml diff --git a/.github/workflows/deploy-test.yml b/.github/workflows/deploy-test.yml new file mode 100644 index 0000000..64269b2 --- /dev/null +++ b/.github/workflows/deploy-test.yml @@ -0,0 +1,26 @@ +name: Deploy to Test Server + +on: + push: + branches: + - main + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - name: Set up SSH agent + uses: webfactory/ssh-agent@v0.7.0 + with: + ssh-private-key: ${{ secrets.TEST_SSH_PRIVATE_KEY }} + + - name: Add test server to known_hosts + run: | + mkdir -p ~/.ssh + echo "${{ secrets.TEST_SSH_KNOWN_HOSTS }}" >> ~/.ssh/known_hosts + + - name: Trigger remote deploy script + run: | + ssh -o StrictHostKeyChecking=no \ + ${{ secrets.TEST_SERVER_USER }}@${{ secrets.TEST_SERVER_HOST }} \ + "bash ~/deploy_recapp_to_test.sh" From 6312fa68e48933b436b2266befbbe5640a3af368 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Han=C3=9F?= Date: Wed, 4 Jun 2025 14:14:29 +0200 Subject: [PATCH 04/15] Update deploy-test.yml --- .github/workflows/deploy-test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/deploy-test.yml b/.github/workflows/deploy-test.yml index 64269b2..aaa93ba 100644 --- a/.github/workflows/deploy-test.yml +++ b/.github/workflows/deploy-test.yml @@ -4,6 +4,7 @@ on: push: branches: - main + workflow_dispatch: jobs: deploy: From 90f1e044c01e7d1a5957b29243615c555fc97005 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Han=C3=9F?= Date: Wed, 4 Jun 2025 14:25:52 +0200 Subject: [PATCH 05/15] Update deploy-test.yml --- .github/workflows/deploy-test.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/deploy-test.yml b/.github/workflows/deploy-test.yml index aaa93ba..bd98115 100644 --- a/.github/workflows/deploy-test.yml +++ b/.github/workflows/deploy-test.yml @@ -4,11 +4,15 @@ on: push: branches: - main + - 'feature/**' workflow_dispatch: jobs: deploy: runs-on: ubuntu-latest + env: + BRANCH_NAME: ${{ github.ref_name }} + steps: - name: Set up SSH agent uses: webfactory/ssh-agent@v0.7.0 @@ -24,4 +28,10 @@ jobs: run: | ssh -o StrictHostKeyChecking=no \ ${{ secrets.TEST_SERVER_USER }}@${{ secrets.TEST_SERVER_HOST }} \ + set -e + cd ~/recapp + git fetch origin + git checkout --force "${BRANCH_NAME}" "bash ~/deploy_recapp_to_test.sh" + echo "✅ Deployed branch '${BRANCH_NAME}' to test server." + EOF From d9fc23f7d01126f9635775c0d26e974eb8919ffe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Han=C3=9F?= Date: Wed, 4 Jun 2025 14:32:58 +0200 Subject: [PATCH 06/15] Update deploy-test.yml --- .github/workflows/deploy-test.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/.github/workflows/deploy-test.yml b/.github/workflows/deploy-test.yml index bd98115..298be1b 100644 --- a/.github/workflows/deploy-test.yml +++ b/.github/workflows/deploy-test.yml @@ -24,14 +24,13 @@ jobs: mkdir -p ~/.ssh echo "${{ secrets.TEST_SSH_KNOWN_HOSTS }}" >> ~/.ssh/known_hosts - - name: Trigger remote deploy script + - name: Deploy ${{ env.BRANCH_NAME }} to test server run: | + echo "➡️ Starting remote deployment of branch '${BRANCH_NAME}'" ssh -o StrictHostKeyChecking=no \ ${{ secrets.TEST_SERVER_USER }}@${{ secrets.TEST_SERVER_HOST }} \ - set -e - cd ~/recapp - git fetch origin - git checkout --force "${BRANCH_NAME}" - "bash ~/deploy_recapp_to_test.sh" - echo "✅ Deployed branch '${BRANCH_NAME}' to test server." - EOF + "cd ~/recapp && \ + git fetch origin && \ + git checkout --force \"${BRANCH_NAME}\" && \ + bash ~/deploy_recapp_to_test.sh" + echo "✅ Remote deployment of branch '${BRANCH_NAME}' succeeded" From 791f363f362c214f1cc02f8a1dcd29f20ec57640 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Han=C3=9F?= Date: Wed, 4 Jun 2025 14:40:03 +0200 Subject: [PATCH 07/15] Delete .github/workflows/deploy-check.yml --- .github/workflows/deploy-check.yml | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 .github/workflows/deploy-check.yml diff --git a/.github/workflows/deploy-check.yml b/.github/workflows/deploy-check.yml deleted file mode 100644 index 238bc51..0000000 --- a/.github/workflows/deploy-check.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: RECAPP deployment check - -on: - push: - branches: [main, testing, production] - pull_request: - branches: [main, testing, production] - workflow_dispatch: - -jobs: - deploy-recapp: - runs-on: ubuntu-24.04 - - env: - GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} - - steps: - - name: Checkout the repo - uses: actions/checkout@v4 - - - name: run deployment script - run: sh deployment.sh $GITHUB_WORKSPACE force-build From f473b22a293706de206d97a3e453430b8b56042b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Han=C3=9F?= Date: Wed, 4 Jun 2025 17:21:08 +0200 Subject: [PATCH 08/15] Update deployment.sh Updated for Docker deployment --- deployment.sh | 199 +++++++++++++++++++++----------------------------- 1 file changed, 84 insertions(+), 115 deletions(-) diff --git a/deployment.sh b/deployment.sh index 4cb6528..cb14349 100644 --- a/deployment.sh +++ b/deployment.sh @@ -1,131 +1,100 @@ -#!/bin/bash +#!/usr/bin/env bash +# +# deploy_recapp_to_test.sh +# This script deploys the RecApp application to the test environment. +# It assumes: +# - The deploy user has passwordless sudo for the needed npm/docker commands. +# - $HOME is the home directory of that user, and ~/recapp is the app folder. +# - npm scripts: stop:docker:prod, build:docker:prod, start:docker:prod exist in package.json. +# - set -e is in effect, so any command failing will abort the script. -# Auto-Deployment for recapp +set -euo pipefail -# Konfiguration -if [ $# -eq 0 ]; then - REPO_PATH="/home/cloud/recapp" - LOG_FILE="/home/cloud/recapp/deploy.log" -else - REPO_PATH="$1" - LOG_FILE="$1/deploy.log" -fi +# Define log file and rotation parameters +# The log file will be stored in the user's home directory. +# It will rotate when it exceeds 10 MB, keeping the last 3 old logs. +# The log file will be named deploy.log, and old logs will be named deploy.log.1, deploy.log.2, etc. +# The log rotation will be handled by the rotate_logs function. +LOG_DIR="$HOME" +LOG_FILE="$LOG_DIR/deploy.log" +MAX_LOG_SIZE=$((10 * 1024 * 1024)) # 10 MB +MAX_OLD_LOGS=3 -PM2_PROCESS_NAME="backend" +rotate_logs() { + # If deploy.log does not exist, nothing to rotate + [ -f "$LOG_FILE" ] || return -# Funktion zum Loggen -log() { - echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE" - echo "$1" -} + local actual_size + actual_size=$(stat -c%s "$LOG_FILE") + if [ "$actual_size" -le "$MAX_LOG_SIZE" ]; then + return + fi -# Funktion zum Prüfen von Änderungen im Remote -check_remote_changes() { - git fetch origin - local_branch=$(git rev-parse --abbrev-ref HEAD) - remote_branch="origin/$local_branch" - - if git diff --quiet "$local_branch" "$remote_branch"; then - log "No remote changes for current branch ($local_branch)." - return 1 - else - log "New commits detected for current branch ($local_branch)." - return 0 - fi -} + # Shift old logs: deploy.log.2 -> deploy.log.3, deploy.log.1 -> deploy.log.2, deploy.log -> deploy.log.1 + if [ -f "$LOG_DIR/deploy.log.$((MAX_OLD_LOGS - 1))" ]; then + rm -f "$LOG_DIR/deploy.log.$((MAX_OLD_LOGS - 1))" + fi -# Funktion zum Pullen von Änderungen -pull_changes() { - if git pull origin "$(git rev-parse --abbrev-ref HEAD)"; then - log "Pulling changes was successful." - return 0 - else - log "Error on pulling changes." - return 1 + for (( i=MAX_OLD_LOGS-1; i>=1; i-- )); do + if [ -f "$LOG_DIR/deploy.log.$i" ]; then + mv "$LOG_DIR/deploy.log.$i" "$LOG_DIR/deploy.log.$((i + 1))" fi -} + done -# Funktion zum Bauen der Projekte -build_projects() { - log "Starting rebuild" - - # Installiere Abhängigkeiten - if npm ci; then - log "Installed dependencies successfully." - else - log "Error on dependent package installation." - return 1 - fi - - # Führe Lerna build aus - if npx lerna run build; then - log "Build all packages." - return 0 - else - log "Error on building packages." - return 1 - fi + mv "$LOG_FILE" "$LOG_DIR/deploy.log.1" + : > "$LOG_FILE" + echo "$(date '+%Y-%m-%d %H:%M:%S') - Log rotated: previous log moved to deploy.log.1" >> "$LOG_FILE" } -# Funktion zum Neustarten des PM2-Prozesses -restart_pm2() { - if pm2 restart "$PM2_PROCESS_NAME"; then - log "Restartet backend." - return 0 - else - log "Error on restarting the backend." - return 1 - fi -} +# Rotate logs if necessary +rotate_logs -# Funktion zum Kopieren der Frontend-Dateien und Setzen der Rechte -change_frontend_permissions() { - if chmod -R o+r ./packages/frontend/dist/*; then - log "Made frontend build accessible by webserver." - return 0 - else - log "Could not change frontend access rights for webserver" - return 1 - fi +# Append a timestamped message to both the log file and stdout +log() { + local msg="$1" + echo "$(date '+%Y-%m-%d %H:%M:%S') - ${msg}" | tee -a "$LOG_FILE" } -# Funktion zum Zurücksetzen auf den letzten funktionierenden Stand -rollback() { - log "Errors occured. Rolling back." - git reset --hard HEAD~1 - build_projects - restart_pm2 - copy_frontend_files - log "Rollback finished." +# On any unexpected exit (non-zero), log it +on_error() { + local exit_code=$? + log "❌ Deployment script exited with code ${exit_code}." + exit "${exit_code}" } +trap on_error ERR -# Hauptfunktion -main() { - cd "$REPO_PATH" || { log "Fehler: Konnte nicht in das Repository-Verzeichnis wechseln."; exit 1; } - - if [ "$1" = "force-build" ]; then - log "Forced deployment." - if build_projects; then - log "New version was deployed" - else - log "An error occured" - exit 1 - fi - return - fi - - if check_remote_changes; then - if pull_changes && build_projects && restart_pm2 && change_frontend_permissions; then - log "New version was deployed" - else - log "An error occured" - rollback - exit 1 - fi - else - log "No action neccessary." - fi -} +log "=== Starting deployment to test environment ===" + +# Verify sudo privileges (without a password prompt) +if ! sudo -n true 2>/dev/null; then + log "ERROR: This script requires passwordless sudo privileges. Exiting." + exit 1 +fi + +# Ensure the recapp directory exists +REPO_DIR="$HOME/recapp" +if [ ! -d "$REPO_DIR" ]; then + log "ERROR: Directory '$REPO_DIR' not found. Cannot deploy." + exit 1 +fi + +cd "$REPO_DIR" + +# 1) Stop the existing Docker production container +log "Stopping existing production container..." +sudo npm run stop:docker:prod 2>&1 | tee -a "$LOG_FILE" + +# 2) Install dependencies (CI) +log "Installing npm dependencies for CI..." +sudo npm ci 2>&1 | tee -a "$LOG_FILE" + +# 3) Build the Docker image for production +log "Building Docker image for production..." +sudo npm run build:docker:prod 2>&1 | tee -a "$LOG_FILE" + +# 4) Start the new production container +log "Starting new production container..." +sudo npm run start:docker:prod 2>&1 | tee -a "$LOG_FILE" -# Ausführung der Hauptfunktion -main $2 +log "✅ Deployment to test environment completed successfully." +exit 0 From 88a71cccfab6659dabb83b689aac7a5b9da127d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Han=C3=9F?= Date: Thu, 5 Jun 2025 12:47:21 +0200 Subject: [PATCH 09/15] Update deployment.sh Logrotate function explicitly returns 0 now. --- deployment.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/deployment.sh b/deployment.sh index cb14349..a9f3a18 100644 --- a/deployment.sh +++ b/deployment.sh @@ -22,12 +22,12 @@ MAX_OLD_LOGS=3 rotate_logs() { # If deploy.log does not exist, nothing to rotate - [ -f "$LOG_FILE" ] || return + [ -f "$LOG_FILE" ] || return 0 local actual_size actual_size=$(stat -c%s "$LOG_FILE") if [ "$actual_size" -le "$MAX_LOG_SIZE" ]; then - return + return 0 fi # Shift old logs: deploy.log.2 -> deploy.log.3, deploy.log.1 -> deploy.log.2, deploy.log -> deploy.log.1 @@ -44,6 +44,7 @@ rotate_logs() { mv "$LOG_FILE" "$LOG_DIR/deploy.log.1" : > "$LOG_FILE" echo "$(date '+%Y-%m-%d %H:%M:%S') - Log rotated: previous log moved to deploy.log.1" >> "$LOG_FILE" + return 0 } # Rotate logs if necessary From fe753d55bdcfa2fc1a50eca2a7d2feaac9e46611 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Han=C3=9F?= Date: Fri, 6 Jun 2025 23:37:44 +0200 Subject: [PATCH 10/15] =?UTF-8?q?=F0=9F=94=92=20Improve=20token=20handling?= =?UTF-8?q?=20in=20TokenActor:=20retry=20on=20failure=20and=20clear=20prev?= =?UTF-8?q?ious=20timeout=20(#87)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/frontend/src/actors/TokenActor.ts | 68 +++++++++++++--------- 1 file changed, 41 insertions(+), 27 deletions(-) diff --git a/packages/frontend/src/actors/TokenActor.ts b/packages/frontend/src/actors/TokenActor.ts index 3c5351a..60ffb7d 100644 --- a/packages/frontend/src/actors/TokenActor.ts +++ b/packages/frontend/src/actors/TokenActor.ts @@ -1,36 +1,50 @@ -import { Unit, unit, minutes } from "itu-utils"; +// packages/frontend/src/actors/TokenActor.ts + +import { Unit, unit } from "itu-utils"; import { Actor, ActorRef, ActorSystem } from "ts-actors"; import Axios from "axios"; import { cookie } from "../utils"; -const updateToken = () => { - const hasToken = !!cookie("bearer"); - if (hasToken) { - Axios.get(import.meta.env.VITE_BACKEND_URI + "/auth/refresh", { withCredentials: true }).catch(() => { - alert( - "Could not refresh token. Presumeably the authentication server is unavailable. Please report this error if it happens repeatedly." - ); - window.location.href = "/"; - }); - } -}; - export class TokenActor extends Actor { - public interval: any; + public interval: any; + private expiresAt: Date; + + public constructor(name: string, system: ActorSystem) { + super(name, system); + this.expiresAt = new Date(); // Initialize with a default value + } + + public override async afterStart(): Promise { + this.updateToken(); + } - public constructor(name: string, system: ActorSystem) { - super(name, system); - } + public override async beforeShutdown(): Promise { + clearTimeout(this.interval); + } - public override async afterStart(): Promise { - this.interval = setInterval(updateToken, minutes(import.meta.env.VITE_INACTIVITY_LIMIT).valueOf()); - } + private updateToken = () => { + const hasToken = !!cookie("bearer"); + if (hasToken) { + Axios.get(import.meta.env.VITE_BACKEND_URI + "/auth/refresh", { withCredentials: true }) + .then(response => { + this.expiresAt = new Date(response.data.expires_at); + this.scheduleNextUpdate(); + }) + .catch(error => { + console.error("Failed to refresh token:", error); + setTimeout(this.updateToken, 5000); // Retry after 5 seconds + }); + } + }; - public override async beforeShutdown(): Promise { - clearInterval(this.interval); - } + private scheduleNextUpdate = () => { + const buffer = 30000; // 30 seconds before expiry + const delay = this.expiresAt.getTime() - Date.now() - buffer; + clearTimeout(this.interval); // Clear previous timeout + this.interval = setTimeout(this.updateToken, delay); + }; - public async receive(_from: ActorRef, _message: unknown): Promise { - return unit(); - } -} + public async receive(_from: ActorRef, _message: unknown): Promise { + return unit(); + } +} \ No newline at end of file From 9af576c4e8bfa54808bc99274f5ad70160322c13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Han=C3=9F?= Date: Sat, 7 Jun 2025 00:01:52 +0200 Subject: [PATCH 11/15] Update deploy-test.yml --- .github/workflows/deploy-test.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/deploy-test.yml b/.github/workflows/deploy-test.yml index 298be1b..d00a8de 100644 --- a/.github/workflows/deploy-test.yml +++ b/.github/workflows/deploy-test.yml @@ -29,8 +29,5 @@ jobs: echo "➡️ Starting remote deployment of branch '${BRANCH_NAME}'" ssh -o StrictHostKeyChecking=no \ ${{ secrets.TEST_SERVER_USER }}@${{ secrets.TEST_SERVER_HOST }} \ - "cd ~/recapp && \ - git fetch origin && \ - git checkout --force \"${BRANCH_NAME}\" && \ - bash ~/deploy_recapp_to_test.sh" + "bash ~/deploy_recapp_to_test.sh \"${BRANCH_NAME}\" echo "✅ Remote deployment of branch '${BRANCH_NAME}' succeeded" From 14c1d26b877d7b8c63abcf048f96978bb286778e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Han=C3=9F?= Date: Sat, 7 Jun 2025 00:05:55 +0200 Subject: [PATCH 12/15] Update deploy-test.yml --- .github/workflows/deploy-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-test.yml b/.github/workflows/deploy-test.yml index d00a8de..270c150 100644 --- a/.github/workflows/deploy-test.yml +++ b/.github/workflows/deploy-test.yml @@ -29,5 +29,5 @@ jobs: echo "➡️ Starting remote deployment of branch '${BRANCH_NAME}'" ssh -o StrictHostKeyChecking=no \ ${{ secrets.TEST_SERVER_USER }}@${{ secrets.TEST_SERVER_HOST }} \ - "bash ~/deploy_recapp_to_test.sh \"${BRANCH_NAME}\" + "bash ~/deploy_recapp_to_test.sh \"${BRANCH_NAME}\"" echo "✅ Remote deployment of branch '${BRANCH_NAME}' succeeded" From 42f9fd40ef94276db49ffc878d14ff9da9f60cae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Han=C3=9F?= Date: Sat, 7 Jun 2025 00:11:27 +0200 Subject: [PATCH 13/15] Update deployment.sh --- deployment.sh | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/deployment.sh b/deployment.sh index a9f3a18..6357957 100644 --- a/deployment.sh +++ b/deployment.sh @@ -10,6 +10,8 @@ set -euo pipefail +BRANCH="${1:-main}" + # Define log file and rotation parameters # The log file will be stored in the user's home directory. # It will rotate when it exceeds 10 MB, keeping the last 3 old logs. @@ -49,7 +51,7 @@ rotate_logs() { # Rotate logs if necessary rotate_logs - +echo "test end" # Append a timestamped message to both the log file and stdout log() { local msg="$1" @@ -81,6 +83,12 @@ fi cd "$REPO_DIR" +log "Fetching origin..." +git fetch origin --prune + +log "Checking out branch '$BRANCH' (force)..." +git checkout --force -B "$BRANCH" "origin/$BRANCH" + # 1) Stop the existing Docker production container log "Stopping existing production container..." sudo npm run stop:docker:prod 2>&1 | tee -a "$LOG_FILE" From 86cc4c3403b772a84bcbd90de2944f79daffc199 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Han=C3=9F?= Date: Sat, 7 Jun 2025 00:20:22 +0200 Subject: [PATCH 14/15] Version 1.6.2 --- packages/frontend/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/frontend/package.json b/packages/frontend/package.json index 0130c58..844d8fb 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -1,7 +1,7 @@ { "name": "@recapp/frontend", "private": true, - "version": "1.6.1", + "version": "1.6.2", "type": "module", "scripts": { "dev": "vite", From 8e525f8571d9670c71d628672f33e8af652cf1f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Han=C3=9F?= Date: Sat, 7 Jun 2025 00:22:52 +0200 Subject: [PATCH 15/15] version 1.6.2 --- NEWS.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NEWS.md b/NEWS.md index 6716aa2..4fe1125 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,2 +1,2 @@ -# recapp 1.4.2 -* almost ready to go public +# recapp 1.6.2 +