From aa02c9e5c5b2cd3bb0f8ed2e7652168dd5f01b76 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Fri, 9 May 2025 08:06:59 +0200 Subject: [PATCH 1/3] stop deploy script on error, always cleanup lock file --- deployment/bare_metal/start.sh | 84 +++++++++++++++---- .../migration/2_5_1-2_5_2/README.md | 15 ---- .../migration/2_5_1-2_5_2/upgradeNodeJs.sh | 20 ----- 3 files changed, 67 insertions(+), 52 deletions(-) delete mode 100644 deployment/hetzner_cloud/migration/2_5_1-2_5_2/README.md delete mode 100644 deployment/hetzner_cloud/migration/2_5_1-2_5_2/upgradeNodeJs.sh diff --git a/deployment/bare_metal/start.sh b/deployment/bare_metal/start.sh index 5950547d0..a02686484 100755 --- a/deployment/bare_metal/start.sh +++ b/deployment/bare_metal/start.sh @@ -1,11 +1,6 @@ #!/bin/bash - -# helper functions -log_step() { - local message="$1" - echo -e "\e[34m$message\e[0m" > /dev/tty # blue in console - echo "

$message

" >> "$UPDATE_HTML" # blue in html -} +# stop if something fails +set -euo pipefail # check for parameter if [ -z "$1" ]; then @@ -22,9 +17,17 @@ PROJECT_ROOT=$SCRIPT_DIR/../.. NGINX_CONFIG_DIR=$SCRIPT_DIR/nginx/sites-available set +o allexport -# enable nvm +# enable nvm export NVM_DIR="$HOME/.nvm" && [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" -nvm use default +install_nvm() { + nvm install + nvm use + nvm alias default + npm i -g yarn pm2 + pm2 startup +} +# make sure correct node version is installed +nvm use || install_nvm # NOTE: all config values will be in process.env when starting # the services and will therefore take precedence over the .env @@ -72,6 +75,13 @@ if [ -f $LOCK_FILE ] ; then fi touch $LOCK_FILE +# called always on exit, regardless of error or success +cleanup() { + # release lock + rm $LOCK_FILE +} +trap cleanup EXIT + # find today string TODAY=$(date +"%Y-%m-%d") @@ -83,14 +93,56 @@ TODAY=$(date +"%Y-%m-%d") exec > >(tee -a $UPDATE_HTML) 2>&1 # configure nginx for the update-page -log_step 'Configuring nginx to serve the update-page' +echo 'Configuring nginx to serve the update-page' ln -sf $SCRIPT_DIR/nginx/sites-available/update-page.conf $SCRIPT_DIR/nginx/sites-enabled/default sudo /etc/init.d/nginx restart +# helper functions +log_step() { + local message="$1" + echo -e "\e[34m$message\e[0m" # > /dev/tty # blue in console + echo "

$message

" >> "$UPDATE_HTML" # blue in html +} +log_error() { + local message="$1" + echo -e "\e[31m$message\e[0m" # > /dev/tty # red in console + echo "$message" >> "$UPDATE_HTML" # red in html +} +log_warn() { + local message="$1" + echo -e "\e[33m$message\e[0m" # > /dev/tty # orange in console + echo "$message" >> "$UPDATE_HTML" # orange in html +} +log_success() { + local message="$1" + echo -e "\e[32m$message\e[0m" # > /dev/tty # green in console + echo "

$message

" >> "$UPDATE_HTML" # green in html +} + +# called always on error, log error really visible with ascii art in red on console and html +# stop script execution +onError() { + local exit_code=$? + log_error "Command failed!" + log_error " /\\_/\\ Line: $(caller 0)" + log_error "( x.x ) Exit Code: $exit_code" + log_error " > < Offending command: '$BASH_COMMAND'" + log_error "" + exit 1 +} +trap onError ERR + # stop all services log_step "Stop and delete all Gradido services" -pm2 delete all -pm2 save +# check if pm2 has processes, maybe it was already cleared from a failed update +# pm2 delete all if pm2 has no processes will trigger error and stop script +# so let's check first +if [ "$(echo "$(pm2 prettylist)" | tail -n 1)" != "[]" ]; then + pm2 delete all + pm2 save +else + log_warn "PM2 is already empty" +fi # git BRANCH=$1 @@ -261,11 +313,8 @@ yarn build # TODO maybe handle this differently? export NODE_ENV=production -nvm use default # start after building all to use up less ressources pm2 start --name gradido-backend "yarn --cwd $PROJECT_ROOT/backend start" -l $GRADIDO_LOG_PATH/pm2.backend.$TODAY.log --log-date-format 'YYYY-MM-DD HH:mm:ss.SSS' -#pm2 start --name gradido-frontend "yarn --cwd $PROJECT_ROOT/frontend start" -l $GRADIDO_LOG_PATH/pm2.frontend.$TODAY.log --log-date-format 'YYYY-MM-DD HH:mm:ss.SSS' -#pm2 start --name gradido-admin "yarn --cwd $PROJECT_ROOT/admin start" -l $GRADIDO_LOG_PATH/pm2.admin.$TODAY.log --log-date-format 'YYYY-MM-DD HH:mm:ss.SSS' pm2 save if [ ! -z $FEDERATION_DHT_TOPIC ]; then pm2 start --name gradido-dht-node "yarn --cwd $PROJECT_ROOT/dht-node start" -l $GRADIDO_LOG_PATH/pm2.dht-node.$TODAY.log --log-date-format 'YYYY-MM-DD HH:mm:ss.SSS' @@ -305,5 +354,6 @@ sudo /etc/init.d/nginx restart # keep the update log cat $UPDATE_HTML >> $GRADIDO_LOG_PATH/update.$TODAY.log -# release lock -rm $LOCK_FILE +log_success " /\\_/\\ " +log_success "( ^.^ ) Update finished successfully!" +log_success " > <" diff --git a/deployment/hetzner_cloud/migration/2_5_1-2_5_2/README.md b/deployment/hetzner_cloud/migration/2_5_1-2_5_2/README.md deleted file mode 100644 index 7534ce060..000000000 --- a/deployment/hetzner_cloud/migration/2_5_1-2_5_2/README.md +++ /dev/null @@ -1,15 +0,0 @@ -## Migrate from Gradido Version 2.5.1 to 2.5.2 -### What -We need to upgrade the used nodejs version in deployment. Until now for pm2, backend, dht-node, federation nodejs 16 was used, -but some newer npm libs don't work with this old nodejs version so we upgrade to nodejs 18.20.7 - -### What you can do now -You need to only run this [upgradeNodeJs.sh](upgradeNodeJs.sh) with `release-2_5_2-beta` as parameter -```bash -cd /home/gradido/gradido/deployment/hetzner_cloud/migration/2_5_1-2_5_2 -sudo ./upgradeNodeJs.sh `release-2_5_2-beta` -``` - -It will stop pm2, install new nodejs version + pm2 + yarn, remove nodejs 16. -Then it will call start.sh with first parameter of ./upgradeNodeJs.sh as his first parameter - diff --git a/deployment/hetzner_cloud/migration/2_5_1-2_5_2/upgradeNodeJs.sh b/deployment/hetzner_cloud/migration/2_5_1-2_5_2/upgradeNodeJs.sh deleted file mode 100644 index baef7550d..000000000 --- a/deployment/hetzner_cloud/migration/2_5_1-2_5_2/upgradeNodeJs.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -# check for parameter -if [ -z "$1" ]; then - echo "Usage: Please provide a branch name as the first argument." - exit 1 -fi - -# stop all services -pm2 delete all -pm2 save - -# upgrade node js version -nvm install 18.20.7 -nvm use 18.20.7 -nvm alias default 18.20.7 -npm install -g pm2 yarn -nvm uninstall 16 - -# Start gradido -sudo -u gradido $SCRIPT_PATH/start.sh $1 \ No newline at end of file From e1e65409e67401493e6648150eb0a199038ad984 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Fri, 9 May 2025 08:22:45 +0200 Subject: [PATCH 2/3] introduce fast mode --- deployment/bare_metal/start.sh | 85 ++++++++++++++++++++++------------ 1 file changed, 56 insertions(+), 29 deletions(-) diff --git a/deployment/bare_metal/start.sh b/deployment/bare_metal/start.sh index a02686484..8baed9f6b 100755 --- a/deployment/bare_metal/start.sh +++ b/deployment/bare_metal/start.sh @@ -3,10 +3,35 @@ set -euo pipefail # check for parameter -if [ -z "$1" ]; then - echo "Usage: Please provide a branch name as the first argument." +FAST_MODE=false +POSITIONAL_ARGS=() + +# loop through arguments +for arg in "$@"; do + case "$arg" in + -f|--fast) + FAST_MODE=true + ;; + *) + POSITIONAL_ARGS+=("$arg") + ;; + esac +done + +# set $1, $2, ... only with position arguments +set -- "${POSITIONAL_ARGS[@]}" +BRANCH_NAME="$1" + +# check for parameter +if [ -z "$BRANCH_NAME" ]; then + echo "Usage: $0 [--fast] [--fast]" exit 1 fi +echo "Use branch: $BRANCH_NAME" +if [ "$FAST_MODE" = true ] ; then + echo "Use fast mode, keep yarn and build cache" +fi + # Find current directory & configure paths set -o allexport SCRIPT_PATH=$(realpath $0) @@ -145,12 +170,11 @@ else fi # git -BRANCH=$1 -log_step "Starting with git pull - branch:$BRANCH" +log_step "Starting with git pull - branch:$BRANCH_NAME" cd $PROJECT_ROOT # TODO: this overfetches alot, but ensures we can use start.sh with tags git fetch --all -git checkout $BRANCH +git checkout $BRANCH_NAME git pull export BUILD_COMMIT="$(git rev-parse HEAD)" @@ -199,32 +223,35 @@ case "$URL_PROTOCOL" in esac envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $NGINX_CONFIG_DIR/$TEMPLATE_FILE > $NGINX_CONFIG_DIR/update-page.conf -log_step 'Clean tmp and yarn cache' -# Clean tmp folder - remove yarn files -find /tmp -name "yarn--*" -exec rm -r {} \; -# Clean user cache folder -rm -Rf ~/.cache/yarn +if [ "$FAST_MODE" = false ] ; then + log_step 'Clean tmp and yarn cache' + # Clean tmp folder - remove yarn files + # ignore error/warnings, we want only to remove all yarn files + find /tmp -name "yarn--*" -exec rm -r {} \; || true + # Clean user cache folder + rm -Rf ~/.cache/yarn -log_step 'Remove all node_modules and build folders' -# Remove node_modules folders -# we had problems with corrupted node_modules folder -rm -Rf $PROJECT_ROOT/database/node_modules -rm -Rf $PROJECT_ROOT/config/node_modules -rm -Rf $PROJECT_ROOT/backend/node_modules -rm -Rf $PROJECT_ROOT/frontend/node_modules -rm -Rf $PROJECT_ROOT/admin/node_modules -rm -Rf $PROJECT_ROOT/dht-node/node_modules -rm -Rf $PROJECT_ROOT/federation/node_modules + log_step 'Remove all node_modules and build folders' + # Remove node_modules folders + # we had problems with corrupted node_modules folder + rm -Rf $PROJECT_ROOT/database/node_modules + rm -Rf $PROJECT_ROOT/config/node_modules + rm -Rf $PROJECT_ROOT/backend/node_modules + rm -Rf $PROJECT_ROOT/frontend/node_modules + rm -Rf $PROJECT_ROOT/admin/node_modules + rm -Rf $PROJECT_ROOT/dht-node/node_modules + rm -Rf $PROJECT_ROOT/federation/node_modules -# Remove build folders -# we had problems with corrupted incremtal builds -rm -Rf $PROJECT_ROOT/database/build -rm -Rf $PROJECT_ROOT/config/build -rm -Rf $PROJECT_ROOT/backend/build -rm -Rf $PROJECT_ROOT/frontend/build -rm -Rf $PROJECT_ROOT/admin/build -rm -Rf $PROJECT_ROOT/dht-node/build -rm -Rf $PROJECT_ROOT/federation/build + # Remove build folders + # we had problems with corrupted incremtal builds + rm -Rf $PROJECT_ROOT/database/build + rm -Rf $PROJECT_ROOT/config/build + rm -Rf $PROJECT_ROOT/backend/build + rm -Rf $PROJECT_ROOT/frontend/build + rm -Rf $PROJECT_ROOT/admin/build + rm -Rf $PROJECT_ROOT/dht-node/build + rm -Rf $PROJECT_ROOT/federation/build +fi log_step 'Regenerate .env files' # Regenerate .env files From e55d134765777472ca9b973aae7f0391797e6b47 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Fri, 9 May 2025 08:30:07 +0200 Subject: [PATCH 3/3] use only one nvmrc in root folder, nvm search in parents --- backend/.nvmrc => .nvmrc | 0 admin/.nvmrc | 1 - config/.nvmrc | 1 - database/.nvmrc | 1 - dht-node/.nvmrc | 1 - federation/.nvmrc | 1 - frontend/.nvmrc | 1 - 7 files changed, 6 deletions(-) rename backend/.nvmrc => .nvmrc (100%) delete mode 100644 admin/.nvmrc delete mode 100644 config/.nvmrc delete mode 100644 database/.nvmrc delete mode 100644 dht-node/.nvmrc delete mode 100644 federation/.nvmrc delete mode 100644 frontend/.nvmrc diff --git a/backend/.nvmrc b/.nvmrc similarity index 100% rename from backend/.nvmrc rename to .nvmrc diff --git a/admin/.nvmrc b/admin/.nvmrc deleted file mode 100644 index 3794ab241..000000000 --- a/admin/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -v18.20 \ No newline at end of file diff --git a/config/.nvmrc b/config/.nvmrc deleted file mode 100644 index 216afccff..000000000 --- a/config/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -v18.20.7 diff --git a/database/.nvmrc b/database/.nvmrc deleted file mode 100644 index 5a0afb48b..000000000 --- a/database/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -v18.20.7 \ No newline at end of file diff --git a/dht-node/.nvmrc b/dht-node/.nvmrc deleted file mode 100644 index 5a0afb48b..000000000 --- a/dht-node/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -v18.20.7 \ No newline at end of file diff --git a/federation/.nvmrc b/federation/.nvmrc deleted file mode 100644 index 5a0afb48b..000000000 --- a/federation/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -v18.20.7 \ No newline at end of file diff --git a/frontend/.nvmrc b/frontend/.nvmrc deleted file mode 100644 index 6e50b5972..000000000 --- a/frontend/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -v18.20