#!/bin/bash source _common.sh source ynh_add_swap source /usr/share/yunohost/helpers config="$install_dir/live/.env.production" if ynh_app_upgrading_from_version_before 4.2.8~ynh2; then ynh_die "Your installation is to old to update to this version. \ \nPlease first manually update with 4.4.3~ynh1 with the following command: \ \n's\0u\0d\0o yunohost app upgrade $app -u https://github.com/YunoHost-Apps/mastodon_ynh/commit/8fb1c6c7818430e8ac49f3ae589c6575614f5e4b' \ \nOnce done you can upgrade to the latest version." fi #================================================= # STOP SYSTEMD SERVICE #================================================= ynh_script_progression "Stopping $app's systemd service..." ynh_systemctl --service=${app}-web --action="stop" --log_path=/var/log/$app/$app-web.log --wait_until="Goodbye" ynh_systemctl --service=${app}-sidekiq --action="stop" --log_path=/var/log/$app/$app-sidekiq.log --wait_until="Bye" ynh_systemctl --service=${app}-streaming --action="stop" --log_path=/var/log/$app/$app-streaming.log #================================================= # ENSURE DOWNWARD COMPATIBILITY #================================================= ynh_script_progression "Ensuring downward compatibility..." # Set `service` settings to support `yunohost app shell` command ynh_app_setting_set_default --key=service --value="$app-web.service" #================================================= # ADD SWAP IF NEEDED #================================================= ynh_script_progression "Adding swap if needed..." total_memory=$(ynh_get_ram --total) swap_needed=0 if [ $total_memory -lt $memory_needed ]; then # Need a minimum of 8Go of memory swap_needed=$(($memory_needed - $total_memory)) fi ynh_script_progression "Adding $swap_needed Mo to swap..." ynh_add_swap --size=$swap_needed #================================================= # UPGRADE DEPENDENCIES #================================================= ynh_script_progression "Upgrading Ruby and NodeJS..." ynh_ruby_install ynh_nodejs_install #================================================= # "REBUILD" THE APP (DEPLOY NEW SOURCES, RERUN NPM BUILD...) #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= ynh_script_progression "Upgrading source files..." # Download, check integrity, uncompress and patch the source from manifest.toml ynh_setup_source --dest_dir="$install_dir/live" --full_replace --keep="public/system .env.production" # Download redis migration script ynh_setup_source --source_id=redis_migration --dest_dir="$install_dir/live" chmod -R 775 "$install_dir" chmod o-rwx "$install_dir" chown -R $app:www-data "$install_dir" #================================================= # BUILD ASSETS #================================================= ynh_script_progression "Building assets..." pushd "$install_dir/live" gem update --system gem install bundler --no-document ynh_exec_as_app LD_PRELOAD=libjemalloc.so bin/bundle config deployment 'true' ynh_exec_as_app LD_PRELOAD=libjemalloc.so bin/bundle config without 'development test' ynh_exec_as_app LD_PRELOAD=libjemalloc.so bin/bundle config set force_ruby_platform true --quiet ynh_exec_as_app LD_PRELOAD=libjemalloc.so bin/bundle install -j$(getconf _NPROCESSORS_ONLN) env corepack enable echo Y | ynh_exec_as_app yarn workspaces focus --production ynh_exec_as_app yarn install --immutable popd chown -R "$app:www-data" "$install_dir/live/public" #================================================= # REAPPLY SYSTEM CONFIGURATIONS #================================================= ynh_script_progression "Upgrading system configurations related to $app..." ynh_config_add_nginx # Create a dedicated systemd config ynh_config_add_systemd --service="$app-web" --template="mastodon-web.service" yunohost service add "$app-web" --description="$app web service" ynh_config_add_systemd --service="$app-sidekiq" --template="mastodon-sidekiq.service" yunohost service add "$app-sidekiq" --description="$app sidekiq service" ynh_config_add_systemd --service="$app-streaming" --template="mastodon-streaming.service" yunohost service add "$app-streaming" --description="$app streaming service" ynh_config_add --template="cron" --destination="/etc/cron.d/$app" # Use logrotate to manage app-specific logfile(s) mkdir -p /var/log/$app ynh_config_add_logrotate #================================================= # RECONFIGURE THE APP (UPDATE CONF, APPLY MIGRATIONS...) #================================================= # UPDATE A CONFIG FILE #================================================= ynh_script_progression "Updating a config file..." if ynh_app_upgrading_from_version_before 4.3.2~ynh1; then pushd "$install_dir/live" # Generate active record encryption ynh_exec_as_app RAILS_ENV=production LD_PRELOAD=libjemalloc.so bin/bundle exec rails db:encryption:init > active_record_encryption.txt active_record_encryption_deterministic_key=$(grep -oP "ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=\K.+" "$install_dir/live/active_record_encryption.txt") ynh_app_setting_set --key=active_record_encryption_deterministic_key --value="$active_record_encryption_deterministic_key" active_record_encryption_key_derivation_salt=$(grep -oP "ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=\K.+" "$install_dir/live/active_record_encryption.txt") ynh_app_setting_set --key=active_record_encryption_key_derivation_salt --value="$active_record_encryption_key_derivation_salt" active_record_encryption_primary_key=$(grep -oP "ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=\K.+" "$install_dir/live/active_record_encryption.txt") ynh_app_setting_set --key=active_record_encryption_primary_key --value="$active_record_encryption_primary_key" ynh_safe_rm "$install_dir/live/active_record_encryption.txt" popd fi language="$(echo $language | head -c 2)" ynh_config_add --template=".env.production.sample" --destination="$config" #================================================= # APPLY MIGRATIONS #================================================= ynh_script_progression "Applying migrations..." pushd "$install_dir/live" ynh_exec_as_app RAILS_ENV=production LD_PRELOAD=libjemalloc.so bin/bundle exec rails db:migrate --quiet ynh_exec_as_app RAILS_ENV=production LD_PRELOAD=libjemalloc.so bin/bundle exec rails assets:precompile --quiet # Apply redis namespace migration (https://github.com/mastodon/redis_namespace_migration) ynh_exec_as_app RAILS_ENV=production COREPACK_ENABLE_DOWNLOAD_PROMPT=0 LD_PRELOAD=libjemalloc.so bin/rails runner rename.rb redis_namespace="$(ynh_app_setting_get --key=redis_namespace)" if [ $redis_namespace ]; then if [ ynh_app_setting_get --key=es_enabled == "true" ] && [ ynh_app_setting_get --key=es_prefix == "" ]; then ynh_app_setting_set --key=es_prefix --value=$redis_namespace else ynh_app_setting_delete --key=redis_namespace fi fi popd #================================================= # START SYSTEMD SERVICE #================================================= ynh_script_progression "Starting $app's systemd service..." ynh_systemctl --service=${app}-web --action="restart" --log_path=/var/log/$app/$app-web.log --wait_until="Listening on" ynh_systemctl --service=${app}-sidekiq --action="start" --log_path=/var/log/$app/$app-sidekiq.log --wait_until="Schedules Loaded" ynh_systemctl --service=${app}-streaming --action="start" --log_path=/var/log/$app/$app-streaming.log --wait_until="Streaming API now listening" #================================================= # END OF SCRIPT #================================================= ynh_script_progression "Upgrade of $app completed"