#!/bin/bash source _common.sh source ynh_add_swap source /usr/share/yunohost/helpers config="$install_dir/live/.env.production" #================================================= # STOP SYSTEMD SERVICE #================================================= ynh_script_progression "Stopping $app's systemd service..." if ynh_app_upgrading_from_version_before 4.2.8~ynh2; then # Workaround for pre-packagingv2 versions ynh_systemctl --service=${app}-web --action="stop" --log_path="systemd" --wait_until="Goodbye" ynh_systemctl --service=${app}-sidekiq --action="stop" --log_path="systemd" --wait_until="Bye" ynh_systemctl --service=${app}-streaming --action="stop" --log_path="systemd" else 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 fi #================================================= # 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" # Remove previous added repository ynh_remove_extra_repo if ynh_app_upgrading_from_version_before 4.2.8~ynh2; then # Rename legacy database if ynh_psql_database_exists --database="${app}_production"; then db_name=$(ynh_sanitize_dbid --db_name="$app") ynh_app_setting_set --key="db_name" --value="$db_name" # Remove the newly created db by resources, and rename legacy db ynh_psql_db_shell <<< "DROP DATABASE IF EXISTS $db_name;" ynh_psql_db_shell <<< "ALTER DATABASE ${app}_production RENAME TO $db_name;" fi # Same with user if ynh_psql_user_exists --user="${app}_production"; then db_user="$db_name" ynh_app_setting_set --key="db_user" --value="$db_user" ynh_psql_db_shell <<< "DROP USER IF EXISTS $db_user;" ynh_psql_db_shell <<< "ALTER USER ${app}_production RENAME $db_user;" fi fi #================================================= # 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" 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 bin/bundle config deployment 'true' ynh_exec_as_app $ld_preload bin/bundle config without 'development test' ynh_exec_as_app $ld_preload bin/bundle config set force_ruby_platform true --quiet ynh_exec_as_app $ld_preload bin/bundle install -j$(getconf _NPROCESSORS_ONLN) env node_load_PATH corepack enable echo Y | ynh_hide_warnings ynh_exec_as_app yarn workspaces focus --production ynh_hide_warnings 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_hide_warnings ynh_exec_as_app RAILS_ENV=production $ld_preload 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_hide_warnings ynh_exec_as_app RAILS_ENV=production $ld_preload bin/bundle exec rails db:migrate --quiet ynh_hide_warnings ynh_exec_as_app RAILS_ENV=production $ld_preload bin/bundle exec rails assets:precompile --quiet 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"