aboutsummaryrefslogtreecommitdiff
path: root/scripts/upgrade
blob: aef5d673d7ffef986c4d96cf17328b252977d51a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
#!/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"
# 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_hide_warnings ynh_exec_as_app $ld_preload bin/bundle config deployment 'true'
	ynh_hide_warnings ynh_exec_as_app $ld_preload bin/bundle config without 'development test'
	ynh_hide_warnings ynh_exec_as_app $ld_preload bin/bundle config set force_ruby_platform true --quiet
	ynh_hide_warnings ynh_exec_as_app $ld_preload bin/bundle install -j$(getconf _NPROCESSORS_ONLN)

	env 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

	# Apply redis namespace migration (https://github.com/mastodon/redis_namespace_migration)
	ynh_hide_warings ynh_exec_as_app RAILS_ENV=production COREPACK_ENABLE_DOWNLOAD_PROMPT=0 $ld_preload bin/rails runner rename.rb
	redis_namespace="$(ynh_app_setting_get --app=$app --key=redis_namespace)"
	if [ $redis_namespace ]; then
		if [ ynh_app_setting_get --app=$app --key=es_enabled == "true" ] && [ ynh_app_setting_get --app=$app --key=es_prefix == "" ]; then
			ynh_app_setting_set --app=$app --key=es_prefix --value=$redis_namespace
		else
			ynh_app_setting_delete --app=$app --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"