#!/bin/bash #================================================= # GENERIC START #================================================= # IMPORT GENERIC HELPERS #================================================= source _common.sh source ynh_add_swap source /usr/share/yunohost/helpers #================================================= # LOAD SETTINGS #================================================= #REMOVEME? ynh_script_progression --message="Loading installation settings..." --weight=1 #REMOVEME? app=$YNH_APP_INSTANCE_NAME #REMOVEME? domain=$(ynh_app_setting_get --app=$app --key=domain) #REMOVEME? path=$(ynh_app_setting_get --app=$app --key=path) #REMOVEME? #REMOVEME? install_dir=$(ynh_app_setting_get --app=$app --key=install_dir) #REMOVEME? data_dir=$(ynh_app_setting_get --app=$app --key=data_dir) #REMOVEME? db_name=$(ynh_app_setting_get --app=$app --key=db_name) #REMOVEME? db_user=$db_name #REMOVEME? db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) #REMOVEME? port_api_gateway=$(ynh_app_setting_get --app=$app --key=port_api_gateway) #REMOVEME? port_auth=$(ynh_app_setting_get --app=$app --key=port_auth) #REMOVEME? port_auth_worker=$(ynh_app_setting_get --app=$app --key=port_auth_worker) #REMOVEME? port_files=$(ynh_app_setting_get --app=$app --key=port_files) #REMOVEME? port_syncing_server=$(ynh_app_setting_get --app=$app --key=port_syncing_server) #REMOVEME? port_syncing_server_worker=$(ynh_app_setting_get --app=$app --key=port_syncing_server_worker) #REMOVEME? port_workspace=$(ynh_app_setting_get --app=$app --key=port_workspace) #REMOVEME? redis_db=$(ynh_app_setting_get --app=$app --key=redis_db) #REMOVEME? jwt_secret=$(ynh_app_setting_get --app=$app --key=jwt_secret) #REMOVEME? legacy_jwt_secret=$(ynh_app_setting_get --app=$app --key=legacy_jwt_secret) #REMOVEME? auth_jwt_secret=$(ynh_app_setting_get --app=$app --key=auth_jwt_secret) #REMOVEME? pseudo_key_params_key=$(ynh_app_setting_get --app=$app --key=pseudo_key_params_key) #REMOVEME? encryption_server_key=$(ynh_app_setting_get --app=$app --key=encryption_server_key) #REMOVEME? valet_token_secret=$(ynh_app_setting_get --app=$app --key=valet_token_secret) #REMOVEME? disable_user_registration=$(ynh_app_setting_get --app=$app --key=DISABLE_USER_REGISTRATION) #REMOVEME? files_size=$(ynh_app_setting_get --app=$app --key=FILES_SIZE) config_api_gateway="$install_dir/live/api-gateway.env" config_auth="$install_dir/live/auth.env" config_auth_worker="$install_dir/live/auth-worker.env" config_files="$install_dir/live/files.env" config_syncing_server="$install_dir/live/syncing-server.env" config_syncing_server_worker="$install_dir/live/syncing-server-worker.env" config_workspace="$install_dir/live/workspace.env" #REMOVEME? nodejs_version_installed=$(ynh_app_setting_get --app=$app --key=nodejs_version) #================================================= # CHECK VERSION #================================================= ynh_script_progression --message="Checking version..." upgrade_type=$(ynh_check_app_version_changed) #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP #================================================= #REMOVEME? ynh_script_progression --message="Backing up the app before upgrading (may take a while)..." --weight=1 # Backup the current version of the app #REMOVEME? ynh_backup_before_upgrade #REMOVEME? ynh_clean_setup () { # Restore it if the upgrade fails #REMOVEME? ynh_restore_upgradebackup } # Exit if an error occurs during the execution of the script #REMOVEME? ynh_abort_if_errors #================================================= # STANDARD UPGRADE STEPS #================================================= # STOP SYSTEMD SERVICE #================================================= ynh_script_progression --message="Stopping a systemd service..." --weight=1 ynh_systemd_action \ --service_name="$app-api-gateway" \ --action="stop" \ --log_path="/var/log/$app/api-gateway.log" ynh_systemd_action \ --service_name="$app-auth" \ --action="stop" \ --log_path="/var/log/$app/auth.log" ynh_systemd_action \ --service_name="$app-auth-worker" \ --action="stop" \ --log_path="/var/log/$app/auth-worker.log" ynh_systemd_action \ --service_name="$app-files" \ --action="stop" \ --log_path="/var/log/$app/files.log" ynh_systemd_action \ --service_name="$app-syncing-server" \ --action="stop" \ --log_path="/var/log/$app/syncing-server.log" ynh_systemd_action \ --service_name="$app-syncing-server-worker" \ --action="stop" \ --log_path="/var/log/$app/syncing-server-worker.log" ynh_systemd_action \ --service_name="$app-workspace" \ --action="stop" \ --log_path="/var/log/$app/workspace.log" #================================================= # ENSURE DOWNWARD COMPATIBILITY #================================================= ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 # If install_dir doesn't exist, create it if [ -z "$install_dir" ]; then #REMOVEME? install_dir=/opt/yunohost/$app #REMOVEME? ynh_app_setting_set --app=$app --key=install_dir --value=$install_dir fi # If redis_db doesn't exist, create it if [ -z "$redis_db" ]; then redis_db=$(ynh_redis_get_free_db) ynh_app_setting_set --app=$app --key=redis_db --value="$redis_db" fi # If one port_* doesn't exist, create all new if [[ -z "$port_api_gateway" || \ -z "$port_auth" || \ -z "$port_auth_worker" || \ -z "$port_files" || \ -z "$port_syncing_server" || \ -z "$port_syncing_server_worker" || \ -z "$port_workspace" ]]; then #REMOVEME? port_api_gateway=$(ynh_find_port --port=3000) #REMOVEME? port_auth=$(ynh_find_port --port=$((port_api_gateway+1))) #REMOVEME? port_auth_worker=$(ynh_find_port --port=$((port_auth+1))) #REMOVEME? port_files=$(ynh_find_port --port=$((port_auth_worker+1))) #REMOVEME? port_syncing_server=$(ynh_find_port --port=$((port_files+1))) #REMOVEME? port_syncing_server_worker=$(ynh_find_port --port=$((port_syncing_server+1))) #REMOVEME? port_workspace=$(ynh_find_port --port=$((port_syncing_server_worker+1))) #REMOVEME? ynh_app_setting_set --app=$app --key=port_api_gateway --value=$port_api_gateway #REMOVEME? ynh_app_setting_set --app=$app --key=port_auth --value=$port_auth #REMOVEME? ynh_app_setting_set --app=$app --key=port_auth_worker --value=$port_auth_worker #REMOVEME? ynh_app_setting_set --app=$app --key=port_files --value=$port_files #REMOVEME? ynh_app_setting_set --app=$app --key=port_syncing_server --value=$port_syncing_server #REMOVEME? ynh_app_setting_set --app=$app --key=port_syncing_server_worker --value=$port_syncing_server_worker #REMOVEME? ynh_app_setting_set --app=$app --key=port_workspace --value=$port_workspace fi # If jwt_secret doesn't exist, create it if [ -z "$jwt_secret" ]; then jwt_secret=$(ynh_string_random --length=48 | base64) ynh_app_setting_set --app=$app --key=jwt_secret --value=$jwt_secret fi # If legacy_jwt_secret doesn't exist, create it if [ -z "$legacy_jwt_secret" ]; then legacy_jwt_secret=$(ynh_string_random --length=48 | base64) ynh_app_setting_set --app=$app --key=legacy_jwt_secret --value=$legacy_jwt_secret fi # If auth_jwt_secret doesn't exist, create it if [ -z "$auth_jwt_secret" ]; then auth_jwt_secret=$(ynh_string_random --length=48 | base64) ynh_app_setting_set --app=$app --key=auth_jwt_secret --value=$auth_jwt_secret fi # If pseudo_key_params_key doesn't exist, create it if [ -z "$pseudo_key_params_key" ]; then pseudo_key_params_key=$(ynh_string_random --length=48 | base64) ynh_app_setting_set --app=$app --key=pseudo_key_params_key --value=$pseudo_key_params_key fi # If encryption_server_key doesn't exist, create it if [ -z "$encryption_server_key" ]; then encryption_server_key=$(hexdump -n 32 -e '4/4 "%08X"' /dev/random) # 32bytes hex key is required ynh_app_setting_set --app=$app --key=encryption_server_key --value=$encryption_server_key fi # If valet_token_secret doesn't exist, create it if [ -z "$valet_token_secret" ]; then valet_token_secret=$(ynh_string_random --length=48 | base64) ynh_app_setting_set --app=$app --key=valet_token_secret --value=$valet_token_secret fi # If disable_user_registration doesn't exist, create it if [ -z "$disable_user_registration" ]; then disable_user_registration=false ynh_app_setting_set --app=$app --key=DISABLE_USER_REGISTRATION --value=$disable_user_registration fi # If files_zise doesn't exist, create it if [ -z "$files_size" ]; then files_size=100 ynh_app_setting_set --app=$app --key=FILES_SIZE --value=$files_size fi # Remove old Settings, Services, Files, Dependencies # If install_dir_www exist, delete it #REMOVEME? api_gateway_version_installed=$(ynh_app_setting_get --app=$app --key=api_gateway_version) #REMOVEME? auth_version_installed=$(ynh_app_setting_get --app=$app --key=auth_version) #REMOVEME? syncing_server_version_installed=$(ynh_app_setting_get --app=$app --key=syncing_server_version) #REMOVEME? install_dir_www=$(ynh_app_setting_get --app=$app --key=install_dir_www) #REMOVEME? install_dir_extensions=$(ynh_app_setting_get --app=$app --key=install_dir_extensions) if [ -n ${api_gateway_version_installed+x} ]; then ynh_app_setting_delete --app=$app --key=api_gateway_version_installed fi if [ -n ${auth_version_installed+x} ]; then ynh_app_setting_delete --app=$app --key=auth_version_installe fi if [ -n ${syncing_server_version_installed+x} ]; then ynh_app_setting_delete --app=$app --key=syncing_server_version_installed fi if [ -n ${install_dir_www+x} ]; then ynh_app_setting_delete --app=$app --key=install_dir_www fi # If install_dir_extensions exist, delete it if [ -n ${install_dir_extensions+x} ]; then ynh_app_setting_delete --app=$app --key=install_dir_extensions fi # If permission help exists, delete it #REMOVEME? if ynh_permission_exists --permission="help" then ynh_permission_delete --permission="help" fi # If old service exsits; remove it if ynh_exec_warn_less yunohost service status "$app-syncing-server-js" >/dev/null then ynh_script_progression --message="Removing old service..." --weight=1 yunohost service remove "$app-syncing-server-js" ynh_remove_systemd_config --service="$app-syncing-server-js" ynh_reset_systemd fi if ynh_exec_warn_less yunohost service status "$app-syncing-server-js-worker" >/dev/null then ynh_script_progression --message="Removing old service..." --weight=1 yunohost service remove "$app-syncing-server-js-worker" ynh_remove_systemd_config --service="$app-syncing-server-js-worker" ynh_reset_systemd fi # Remove unneeded data if [ -e "/var/www/$app" ]; then ynh_secure_remove --file="/var/www/$app" fi # If data_dir doesn't exist, create it # CREATE DATA DIRECTORY if [ -z "$data_dir" ]; then data_dir=/home/yunohost.app/$app #REMOVEME? ynh_app_setting_set --app=$app --key=data_dir --value=$data_dir mkdir -p $data_dir/uploads chmod -R 750 "$data_dir" chmod -R o-rwx "$data_dir" chown -R $app:$app "$data_dir" fi #================================================= # CREATE DEDICATED USER #================================================= #REMOVEME? ynh_script_progression --message="Making sure dedicated system user exists..." --weight=1 # Create a dedicated user (if not existing) #REMOVEME? ynh_system_user_create --username=$app --home_dir="$install_dir" #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= if [ "$upgrade_type" == "UPGRADE_APP" ] then ynh_script_progression --message="Upgrading source files..." --weight=1 # Download, check integrity, uncompress and patch the source from app.src #REMOVEME? ynh_secure_remove --file="$install_dir/live" mkdir -p "$install_dir/live" ynh_setup_source --dest_dir="$install_dir/live" cp "$YNH_APP_BASEDIR/sources/extra_files/cron.sh" "$install_dir/cron.sh" chmod 750 "$install_dir" chmod -R o-rwx "$install_dir" chown -R $app:$app "$install_dir" fi #================================================= # UPGRADE DEPENDENCIES #================================================= #REMOVEME? ynh_script_progression --message="Upgrading dependencies..." --weight=1 #REMOVEME? ynh_install_app_dependencies $pkg_dependencies ynh_install_nodejs --nodejs_version=$nodejs_version #REMOVEME? ynh_install_extra_app_dependencies --repo="deb https://dl.yarnpkg.com/debian/ stable main" --package="yarn" --key="https://dl.yarnpkg.com/debian/pubkey.gpg" #================================================= # NGINX CONFIGURATION #================================================= ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=1 # Create a dedicated NGINX config ynh_add_nginx_config #================================================= # SPECIFIC UPGRADE #================================================= # ADD SWAP #================================================= ynh_script_progression --message="Adding swap..." if [ ${PACKAGE_CHECK_EXEC:-0} -eq 0 ]; then ynh_add_swap --size=$swap_needed fi #================================================= # UPDATE A CONFIG FILE #================================================= ynh_script_progression --message="Updating a configuration file..." --weight=2 ynh_add_config --template="env_api-gateway.env.sample" --destination="$config_api_gateway" ynh_add_config --template="env_auth.env.sample" --destination="$config_auth" ynh_add_config --template="env_auth-worker.env.sample" --destination="$config_auth_worker" ynh_add_config --template="env_files.env.sample" --destination="$config_files" ynh_add_config --template="env_syncing-server.env.sample" --destination="$config_syncing_server" ynh_add_config --template="env_syncing-server-worker.env.sample" --destination="$config_syncing_server_worker" ynh_add_config --template="env_workspace.env.sample" --destination="$config_workspace" #================================================= # INSTALLING Standard Notes - Syncing Server #================================================= if [ "$upgrade_type" == "UPGRADE_APP" ] then ynh_script_progression --message="Installing Standard Notes - Syncing Server..." --weight=93 ynh_use_nodejs pushd "$install_dir/live" ynh_exec_warn_less ynh_exec_as $app env NODE_ENV="production" NODE_OPTIONS="--max-old-space-size=$node_max_old_space_size" $ynh_node_load_PATH yarn install --immutable ynh_exec_warn_less ynh_exec_as $app env NODE_ENV="production" NODE_OPTIONS="--max-old-space-size=$node_max_old_space_size" $ynh_node_load_PATH yarn build popd fi #================================================= # SETUP SYSTEMD #================================================= ynh_script_progression --message="Upgrading systemd configuration..." --weight=1 # Create a dedicated systemd config ynh_add_systemd_config --service="$app-api-gateway" --template="systemd_api-gateway.service" ynh_add_systemd_config --service="$app-auth" --template="systemd_auth.service" ynh_add_systemd_config --service="$app-auth-worker" --template="systemd_auth-worker.service" ynh_add_systemd_config --service="$app-files" --template="systemd_files.service" ynh_add_systemd_config --service="$app-syncing-server" --template="systemd_syncing-server.service" ynh_add_systemd_config --service="$app-syncing-server-worker" --template="systemd_syncing-server-worker.service" ynh_add_systemd_config --service="$app-workspace" --template="systemd_workspace.service" #================================================= # GENERIC FINALIZATION #================================================= # SETUP LOGROTATE #================================================= ynh_script_progression --message="Upgrading logrotate configuration..." --weight=1 mkdir -p "/var/log/$app" chown -R "$app": "/var/log/$app" # Use logrotate to manage application logfile(s) ynh_use_logrotate --logfile="/var/log/$app/api-gateway.log" ynh_use_logrotate --logfile="/var/log/$app/auth.log" ynh_use_logrotate --logfile="/var/log/$app/auth-worker.log" ynh_use_logrotate --logfile="/var/log/$app/files.log" ynh_use_logrotate --logfile="/var/log/$app/syncing-server.log" ynh_use_logrotate --logfile="/var/log/$app/syncing-server-worker.log" ynh_use_logrotate --logfile="/var/log/$app/workspace.log" #================================================= # INTEGRATE SERVICE IN YUNOHOST #================================================= ynh_script_progression --message="Integrating service in YunoHost..." --weight=1 yunohost service add "$app-api-gateway" --description="Standard Notes - API Gateway" --log="/var/log/$app/api-gateway.log" yunohost service add "$app-auth" --description="Standard Notes - Auth" --log="/var/log/$app/auth.log" yunohost service add "$app-auth-worker" --description="Standard Notes - Auth - Worker" --log="/var/log/$app/auth-worker.log" yunohost service add "$app-files" --description="Standard Notes - Files" --log="/var/log/$app/files.log" yunohost service add "$app-syncing-server" --description="Standard Notes - Syncing Server" --log="/var/log/$app/syncing-server.log" yunohost service add "$app-syncing-server-worker" --description="Standard Notes - Syncing Server - Worker" --log="/var/log/$app/syncing-server-worker.log" yunohost service add "$app-workspace" --description="Standard Notes - Workspace" --log="/var/log/$app/workspace.log" #================================================= # START SYSTEMD SERVICE #================================================= ynh_script_progression --message="Starting a systemd service..." --weight=1 # Start a systemd service ynh_systemd_action \ --service_name="$app-api-gateway" \ --action="start" \ --log_path="/var/log/$app/api-gateway.log" \ --line_match='^.*Server started on port.*$|^.*Starting worker.*$' ynh_systemd_action \ --service_name="$app-auth" \ --action="start" \ --log_path="/var/log/$app/auth.log" \ --line_match='^.*Server started on port.*$|^.*Starting worker.*$' ynh_systemd_action \ --service_name="$app-auth-worker" \ --action="start" \ --log_path="/var/log/$app/auth-worker.log" \ --line_match='^.*Server started on port.*$|^.*Starting worker.*$' ynh_systemd_action \ --service_name="$app-files" \ --action="start" \ --log_path="/var/log/$app/files.log" \ --line_match='^.*Server started on port.*$|^.*Starting worker.*$' ynh_systemd_action \ --service_name="$app-syncing-server" \ --action="start" \ --log_path="/var/log/$app/syncing-server.log" \ --line_match='^.*Server started on port.*$|^.*Starting worker.*$' ynh_systemd_action \ --service_name="$app-syncing-server-worker" \ --action="start" \ --log_path="/var/log/$app/syncing-server-worker.log" \ --line_match='^.*Server started on port.*$|^.*Starting worker.*$' ynh_systemd_action \ --service_name="$app-workspace" \ --action="start" \ --log_path="/var/log/$app/workspace.log" \ --line_match='^.*Server started on port.*$|^.*Starting worker.*$' #================================================= # SETUP A CRON #================================================= ynh_script_progression --message="Setup a cron..." ynh_add_config --template="../conf/cron.env" --destination="$install_dir/cron.env" ynh_add_config --template="../conf/cron" --destination="/etc/cron.d/$app" chown root: "/etc/cron.d/$app" chmod 640 "/etc/cron.d/$app" #================================================= # UPGRADE FAIL2BAN #================================================= ynh_script_progression --message="Reconfiguring Fail2Ban..." --weight=1 # Create a dedicated Fail2Ban config ynh_add_fail2ban_config --use_template #================================================= # RELOAD NGINX #================================================= #REMOVEME? ynh_script_progression --message="Reloading NGINX web server..." --weight=1 #REMOVEME? ynh_systemd_action --service_name=nginx --action=reload #================================================= # END OF SCRIPT #================================================= ynh_script_progression --message="Upgrade of $app completed" --last