Upgrade overview
This release contains upgrade notes that deviate from the norm:
ℹ️ Requires streaming API restart
ℹ️ Requires two-step database migration process for zero-downtime deployment
⚠️ Postgres requirement raised to at least 9.5
⚠️ Node.js requirement raised to at least 12
For more information, scroll down to the upgrade instructions section.
Changelog
Added
- Add follow recommendations for onboarding (Gargron, Gargron, Gargron, Gargron, Gargron, Gargron, Gargron, noellabo, noellabo, Gargron, Gargron, ClearlyClaire, ClearlyClaire, ClearlyClaire)
- Tutorial on first web UI launch has been replaced with follow suggestions
- Follow suggestions take user locale into account and are a mix of accounts most followed by currently active local users, and accounts that wrote the most shared/favourited posts in the last 30 days
- Only accounts that have opted-in to being discoverable from their profile settings, and that do not require follow requests, will be suggested
- Moderators can review suggestions for every supported locale and suppress specific suggestions from appearing and admins can ensure certain accounts always show up in suggestions from the settings area
- New users no longer automatically follow admins
- Add server rules (Gargron, ClearlyClaire)
- Admins can create and edit itemized server rules
- They are available through the REST API and on the about page
- Add canonical e-mail blocks for suspended accounts (Gargron)
- Normally, people can make multiple accounts using the same e-mail address using the
+
trick or by inserting or removing.
characters from the first part of their address - Once an account is suspended, it will no longer be possible for the e-mail address used by that account to be used for new sign-ups in any of its forms
- Normally, people can make multiple accounts using the same e-mail address using the
- Add management of delivery availability in admin UI (noellabo)
- Add system checks to dashboard in admin UI (Gargron, ClearlyClaire, ClearlyClaire)
- The dashboard will now warn you if you some Sidekiq queues are not being processed, if you have not defined any server rules, or if you forgot to run database migrations from the latest Mastodon upgrade
- Add inline description of moderation actions in admin UI (ClearlyClaire)
- Add "recommended" label to activity/peers API toggles in admin UI (Gargron)
- Add joined date to profiles in web UI (Gargron)
- Add transition to media modal background in web UI (mkljczk)
- Add option to opt-out of unread notification markers in web UI (ClearlyClaire)
- Add borders to 📱, 🚲, and 📲 emojis in web UI (ClearlyClaire, ClearlyClaire)
- Add dropdown for boost privacy in boost confirmation modal in web UI (ClearlyClaire)
- Add support for Ruby 3.0 (ClearlyClaire, ClearlyClaire)
- Add
Message-ID
header to outgoing emails (ClearlyClaire)- Some e-mail spam filters penalize e-mails that have a
Message-ID
header that uses a different domain name than the sending e-mail address. Now, the same domain will be used
- Some e-mail spam filters penalize e-mails that have a
- Add
af
,gd
andsi
locales (Gargron) - Add guard against DNS rebinding attacks (noellabo, noellabo)
- Add HTTP header to explicitly opt-out of FLoC by default (ClearlyClaire)
- Add missing push notification title for polls and statuses (ClearlyClaire, mkljczk, ClearlyClaire)
- Add
POST /api/v1/emails/confirmations
to REST API (Gargron, Gargron)- This method allows an app through which a user signed-up to request a new confirmation e-mail to be sent, or to change the e-mail of the account before it is confirmed
- Add
GET /api/v1/accounts/lookup
to REST API (Gargron, ClearlyClaire)- This method allows to quickly convert a username of a known account to an ID that can be used with the REST API, or to check if a username is available
for sign-up
- This method allows to quickly convert a username of a known account to an ID that can be used with the REST API, or to check if a username is available
- Add
policy
param toPOST /api/v1/push/subscriptions
in REST API (Gargron)- This param allows an app to control from whom notifications should be delivered as push notifications to the app
- Add
details
to error response forPOST /api/v1/accounts
in REST API (Gargron)- This attribute allows an app to display more helpful information to the user about why the sign-up did not succeed
Changed
- Change trending hashtags to be affected be reblogs (Gargron)
- Previously, only original posts contributed to a hashtag's trending score
- Now, reblogs of posts will also contribute to that hashtag's trending score
- Change e-mail confirmation link to always redirect to web UI (ClearlyClaire)
- Change log level of worker lifecycle to WARN in streaming API (Gargron)
- Since running with INFO log level in production is not always desirable, it is easy to miss when a worker is shutdown and a new one is started
- Change the nouns "toot" and "status" to "post" in web UI (Gargron, Gargron)
- To be clear, the button still says "Toot!"
- Change order of dropdown menu on posts to be more intuitive in web UI (ariasuni)
- Change description of keyboard shortcuts in web UI (ariasuni)
- Change option labels on edit profile page (Gargron)
- "Lock account" is now "Require follow requests"
- "List this account on the directory" is now "Suggest account to others"
- "Hide your network" is now "Hide your social graph"
- Change newly generated account IDs to not be enumerable (ClearlyClaire)
- Change Web Push API deliveries to use request pooling (Gargron)
- Change multiple mentions with same username to render with domain (Gargron, noellabo)
- When a post contains mentions of two or more users who have the same username, but on different domains, render their names with domain to help disambiguate them
- Always render the domain of usernames used in profile metadata
- Change health check endpoint to reveal less information (Gargron)
- Change account counters to use upsert (requires Postgres >= 9.5) (ClearlyClaire)
- Change
mastodon:setup
to not callassets:precompile
in Docker (ClearlyClaire) - Change max. image dimensions to 1920x1080px (1080p) (Gargron)
- Previously, this was 1280x1280px
- This is the amount of pixels that original images get downsized to
- Change custom emoji to be animated when hovering container in web UI (ClearlyClaire)
- Change streaming API from deprecated ClusterWS/cws to ws (ClearlyClaire)
- Change systemd configuration to add sandboxing features (Izorkin, Izorkin, Izorkin)
- Change nginx configuration to make running Onion service easier (cohosh)
- Change Helm configuration (dunn, dunn, dunn, dunn, dunn)
- Change Docker configuration (SuperSandro2000, mashirozx)
Removed
- Remove PubSubHubbub-related columns from accounts table (Gargron, ClearlyClaire)
- Remove dependency on @babel/plugin-proposal-class-properties (ykzts)
- Remove dependency on pluck_each gem (Gargron)
- Remove spam check and dependency on nilsimsa gem (Gargron)
- Remove MySQL-specific code from Mastodon::MigrationHelpers (ClearlyClaire)
- Remove IE11 from supported browsers target (gol-cha)
Fixed
- Fix "You might be interested in" flashing while searching in web UI (Gargron)
- Fix display of posts without text content in web UI (ClearlyClaire)
- Fix Google Translate breaking web UI (ClearlyClaire, ClearlyClaire)
- Fix web UI crashing when SVG support is disabled (ClearlyClaire)
- Fix web UI crash when a status opened in the media modal is deleted (kaias1jp)
- Fix OCR language data failing to load in web UI (ClearlyClaire)
- Fix footer links not being clickable in Safari in web UI (noellabo)
- Fix autofocus/autoselection not working on mobile in web UI (ClearlyClaire, ClearlyClaire)
- Fix media redownload worker retrying on unexpected response codes (Gargron)
- Fix thread resolve worker retrying when status no longer exists (Gargron)
- Fix n+1 queries when rendering statuses in REST API (abcang)
- Fix n+1 queries when rendering notifications in REST API (abcang)
- Fix delete of local reply to local parent not being forwarded (Gargron)
- Fix remote reporters not receiving suspend/unsuspend activities (Gargron)
- Fix understanding (not fully qualified)
as:Public
andPublic
(ClearlyClaire) - Fix actor update not being distributed on profile picture deletion (ClearlyClaire)
- Fix processing of incoming Delete activities (ClearlyClaire)
- Fix processing of incoming Block activities (ClearlyClaire)
- Fix processing of incoming Update activities of unknown accounts (ClearlyClaire)
- Fix URIs of repeat follow requests not being recorded (ClearlyClaire)
- Fix error on requests with no
Digest
header (ClearlyClaire) - Fix activity object not requiring signature in secure mode (ClearlyClaire)
- Fix database serialization failure returning HTTP 500 (Gargron)
- Fix media processing getting stuck on too much stdin/stderr (Gargron)
- Fix some inefficient array manipulations (007lva, 007lva)
- Fix some inefficient regex matching (007lva)
- Fix some inefficient SQL queries (abcang, abcang, abcang)
- Fix trying to fetch key from empty URI when verifying HTTP signature (Gargron)
- Fix
tootctl maintenance fix-duplicates
failures (ClearlyClaire, ClearlyClaire) - Fix error when removing status caused by race condition (Gargron)
- Fix misspelled URLs character counting (ClearlyClaire)
- Fix Sidekiq hanging forever due to a Resolv bug in Ruby 2.7.3 (ClearlyClaire)
- Fix edge case where follow limit interferes with accepting a follow (ClearlyClaire)
- Fix inconsistent lead text style in admin UI (Gargron, ClearlyClaire)
- Fix reports of already suspended accounts being recorded (Gargron)
- Fix sign-up restrictions based on IP addresses not being enforced (ClearlyClaire)
- Fix YouTube embeds failing due to YouTube serving wrong OEmbed URLs (Gargron)
- Fix error when rendering public pages with media without meta (Gargron)
- Fix misaligned logo on follow button on public pages (noellabo)
- Fix video modal not working on public pages (noellabo)
- Fix race conditions on account migration creation (ClearlyClaire)
- Fix not being able to change world filter expiration back to “Never” (ClearlyClaire)
- Fix
.env.vagrant
not settingRAILS_ENV
variable (chandrn7) - Fix error when muting users with
duration
in REST API (Tak) - Fix border padding on front page in light theme (ClearlyClaire)
- Fix wrong URL to custom CSS when
CDN_HOST
is used (ClearlyClaire) - Fix
tootctl accounts unfollow
(ClearlyClaire) - Fix
tootctl emoji import
wasting time on MacOS shadow files (cortices) - Fix
tootctl emoji import
not treating shortcodes as case-insensitive (angristan) - Fix some issues with SAML account creation (Gargron, kaiyou)
- Fix MX validation applying for explicitly allowed e-mail domains (ClearlyClaire)
- Fix share page not using configured custom mascot (tribela)
- Fix instance actor not being automatically created if it wasn't seeded properly (ClearlyClaire)
- Fix HTTPS enforcement preventing Mastodon from being run as an Onion service (cohosh, jtracey, ClearlyClaire, cohosh)
- Fix app name, website and redirect URIs not having a maximum length (Gargron)
Upgrade notes
As always, make sure you have backups of the database before performing any upgrades. If you are using docker-compose, this is how a backup command might look: docker exec mastodon_db_1 pg_dump -Fc -U postgres postgres > name_of_the_backup.dump
Non-Docker only:
- Install dependencies:
bundle install
andyarn install
Both Docker and non-Docker:
- Run the pre-deployment database migrations by specifying the
SKIP_POST_DEPLOYMENT_MIGRATIONS=true
environment variable:- Non-Docker:
SKIP_POST_DEPLOYMENT_MIGRATIONS=true RAILS_ENV=production bundle exec rails db:migrate
- Docker:
docker-compose run --rm -e SKIP_POST_DEPLOYMENT_MIGRATIONS=true web rails db:migrate
- Non-Docker:
- Precompile the assets:
- Non-Docker:
RAILS_ENV=production bundle exec rails assets:precompile
- Docker: The assets are already precompiled during the build step
- Non-Docker:
- Restart all Mastodon processes
- Clear cache:
- Non-Docker:
RAILS_ENV=production bin/tootctl cache clear
- Docker:
docker-compose run --rm web bin/tootctl cache clear
- Non-Docker:
- Now that the new code is running, we can finish the database migrations. This will run the post-deployment ones:
- Non-Docker:
RAILS_ENV=production bundle exec rails db:migrate
- Docker:
docker-compose run --rm web rails db:migrate
- Non-Docker:
- Restart all Mastodon processes
Translators
- GunChleoc (Scottish Gaelic)
- NCAA (Danish)
- мачко (ma4ko) (Bulgarian)
- AJ-عجائب البرمجة (Esmail_Hazem) (Arabic)
- Asier Iturralde Sarasola (aldatsa) (Basque)
- adrmzz (Sardinian)
- Ondřej Pokorný (unextro) (Czech)
- ᛤᚤᛠᛥⴲ 👽 (KNTRO) (Spanish, Argentina)
- Sean Young (assanges) (Chinese Traditional)
- Jasmine Cam Andrever (gourmas) (Cornish)
- Zoltán Gera (gerazo) (Hungarian)
- Blak Ouille (BlakOuille16) (French)
- Hồ Nhất Duy (kantcer) (Vietnamese)
- pulmonarycosignerkindness (Swedish)
- kamee (Armenian)
- Takeçi (polygoat) (French, Italian)
- Ihor Hordiichuk (ihor_ck) (Ukrainian)
- Xosé M. (XoseM) (Galician)
- ozzii (French, Serbian (Cyrillic))
- Irfan (Irfan_Radz) (Malay)
- Besnik_b (Albanian)
- Emanuel Pina (emanuelpina) (Portuguese)
- Joene (joenepraat) (Dutch)
- Jeong Arm (Kjwon15) (Korean, Esperanto)
- Alix Rossi (palindromordnilap) (French, Esperanto, Corsican)
- Ramdziana F Y (rafeyu) (Indonesian)
- Roboron (Spanish)
- Store (HelaBasa) (Sinhala)
- Mauzi (German, Swedish)
- erictapen (German)
- Thai Localization (thl10n) (Thai)
- Mélanie Chauvel (ariasuni) (French, Esperanto)
- T. E. Kalaycı (tekrei) (Turkish)
- spla (Catalan)
- cybergene (cyber-gene) (Japanese)
- Satnam S Virdi (pika10singh) (Punjabi)
- coxde (Chinese Simplified)
- Sasha Sorokin (Brawaru) (Russian)
- Sveinn í Felli (sveinki) (Icelandic)
- xatier (Chinese Traditional)
- Austra Muizniece (aus_m) (Latvian)
- koyu (German)
- Timur Seber (seber) (Tatar)
- Maya Minatsuki (mayaeh) (Japanese)
- gagik_ (Armenian)
- Lalo Tafolla (lalotafo) (Spanish, Spanish, Mexico)
- Alessandro Levati (Oct326) (Italian)
- Rhys Harrison (rhedders) (Esperanto)
- Marcin Mikołajczak (mkljczkk) (Polish)
- Saederup92 (Danish)
- Nikita Epifanov (Nikets) (Russian)
- Slobodan Simić (Слободан Симић) (slsimic) (Serbian (Cyrillic))
- iVampireSP (Chinese Simplified, Chinese Traditional)
- 游荡 (MamaShip) (Chinese Simplified)
- Danial Behzadi (danialbehzadi) (Persian)
- Tagomago (tagomago) (Spanish)
- Chris Kay (chriskarasoulis) (Greek)
- zer0-x (ZER0-X) (Arabic)
- 奈卜拉 (nebula_moe) (Chinese Simplified)
- Manuel Viens (manuelviens) (French)
- Mats Gunnar Ahlqvist (goqbi) (Swedish)
- mynameismonkey (Welsh)
- VictorCorreia (victorcorreia1984) (Afrikaans)
- Hexandcube (hexandcube) (Polish)
- borys_sh (Ukrainian)
- Jaz-Michael King (jazmichaelking) (Welsh)
- Hayk Khachatryan (brutusromanus123) (Armenian)
- Gearguy (Finnish)
- yeft (Chinese Traditional, Hong Kong)
- asnomgtu (Hungarian)
- Diluns (Occitan)
- Kristoffer Grundström (Umeaboy) (Swedish)
- Sokratis Alichanidis (alichani) (Greek)
- Gianfranco Fronteddu (gianfro.gianfro) (Sardinian)
- Parodper (Galician)
- lamnatos (Greek)
- ZiriSut (Kabyle)
- NadieAishi (Spanish, Spanish, Mexico)
- v4vachan (Malayalam)
- Kristijan Tkalec (lapor) (Slovenian)
- Johannes Nilsson (nlssn) (Swedish)
- Balázs Meskó (mesko.balazs) (Hungarian)
- erikkemp (Dutch)
- Rafael H L Moretti (Moretti) (Portuguese, Brazilian)
- Marek Ľach (mareklach) (Slovak)
- t_aus_m (German)
- Ryo (DrRyo) (Korean)
- Vivek K J (Vivekkj) (Malayalam)
- Mo_der Steven (SakuraPuare) (Chinese Simplified)
- Hakim Oubouali (zenata1) (Standard Moroccan Tamazight)
- Marcus Myge (mygg-priv) (Norwegian)
- Jeff Huang (s8321414) (Chinese Traditional)
- Ali Demirtaş (alidemirtas) (Turkish)
- ಚಿರಾಗ್ ನಟರಾಜ್ (chiraag-nataraj) (Kannada)
- mawoka-myblock (mawoka) (German)
- programizer (German)
- Rikard Linde (rikardlinde) (Swedish)
- friedbeans (Croatian)
- kuchengrab (German)
- Abi Turi (abi123) (Georgian)
- Daniel Dimitrov (daniel.dimitrov) (Bulgarian)
- Asbjørn Olling (a2) (Danish)
- Wassim EL BOUHAMIDI (elbouhamidiw) (Arabic)
- Pukima (Pukimaa) (German)
- Mikkel B. Goldschmidt (mikkelbjoern) (Danish)
- Odyssey346 (alexader612) (Norwegian)
- Eban (ebanDev) (French, Esperanto)
- Nícolas Lavinicki (nclavinicki) (Portuguese, Brazilian)
- snatcher (Portuguese, Brazilian)
- GiorgioHerbie (Italian)
- fucsia (Italian)
- Ğani (freegnu) (Tatar)
- 亜緯丹穂 (ayiniho) (Japanese)
- Tigran's Tips (tigrank08) (Armenian)
- Mordi Sacks (MordiSacks) (Hebrew)
- Trinsec (Dutch)
- ahangarha (Persian)
- Vladislav Săcrieriu (vladislavs14) (Romanian)
- Szabolcs Gál (galszabolcs810624) (Hungarian)
- danreznik (Hebrew)
- c6ristian (German)
- lexxai (Ukrainian)
- Unmual (Spanish)
- Oymate (Bengali)
- serapolis (Chinese Simplified, Chinese Traditional)
- johannes hove-henriksen (J0hsHH) (Norwegian)
- mecqor labi (mecqorlabi) (Persian)
- diorama (Italian)
- Tigran (tigransimonyan) (Armenian)
- Dennis Reimund (reimunddennis7) (German)
- Adithya K (adithyak04) (Malayalam)
- phena109 (Chinese Traditional, Hong Kong)
- Michał Sidor (michcioperz) (Polish)
- Metehan Özyürek (MetehanOzyurek) (Turkish)
- Takeshi Umeda (noellabo) (Japanese)
- Y.Yamashiro (uist1idrju3i) (Japanese)
- Lauren Liberda (selfisekai) (Polish)
- Khó͘ Tiat-lêng (khotiatleng) (Taigi)
- Robert Yano (throwcalmbobaway) (Spanish, Mexico)
- Yasin İsa YILDIRIM (redsfyre) (Turkish)
- Ashok314 (ashok314) (Hindi)
- Rex_sa (rex07) (Arabic)
- Marvin (magicmarvman) (German)
- Entelekheia-ousia (Chinese Simplified)
- eorn (Breton)
- Pierre Morvan (Iriep) (Breton)
- 北䑓如法 (Nyoho) (Japanese)
- 森の子リスのミーコの大冒険 (Phroneris) (Japanese)
- oscfd (Spanish)
- EzigboOmenana (Cornish)
- asala4544 (Basque)
- Dennis Reimund (reimund_dennis) (German)
- qwerty287 (German)
- ru_mactunnag (Scottish Gaelic)
- mimikun (Japanese)
- Aman Alam (aalam) (Punjabi)
- asretro (Chinese Traditional, Hong Kong)
- bobchao (Chinese Traditional)
- Zlr- (cZeler) (French)
- frumble (German)
- Balázs Meskó (meskobalazs) (Hungarian)
- Ni Futchi (futchitwo) (Japanese)
- Brodi (brodi1) (Dutch)
- Baban Abdulrahman (baban.abdulrehman) (Sorani (Kurdish))
- twpenguin (Chinese Traditional)
- Aries (orlea) (Japanese)