mastodon.nl upgrade naar versie 4.2.0

 ยท Eelco Maljaars

Vanmorgen was het tijd om mastodon.nl ook te voorzien van Mastodon versie 4.2.0, welke o.a. full text search gaat bieden in de toots van mensen welke deze opt-in setting zelf aanzetten in hun profiel instellingen.

Met de ervaringen van een aantal mastodon.nl upgrades over de afgelopen maanden en de ervaringen met 4.2.0 voor andere omgevingen zag ik dit als een relatief lichte release. Wel is de setup die we voor mastodon.nl wat meer werk, omdat het een traditionele virtual server based setup is en niet bijvoorbeeld een kubernetes/container gebaseerde omgeving.

De mastodon.nl omgeving bestaat naast database en storage servers, uit een set van drie webservers en twee queuing servers. Deze vijf servers zijn de virtual machines waar de mastodon code daadwerkelijk draait. Op de andere nodes draait generieke middleware welke voor de 4.2.0 niet expliciet aangepast hoeft te worden.

Om het werk met zo'n set virtual machines leuk, voorspelbaar en vlot te houden, probeer ik zoveel mogelijk te doen met ansible playbooks.

Start upgrade

Het idee was om na controle van storage en database backups, het 'upgrade_mastodon.yml' playbook te draaien. Dus na de aankondiging in de het support kanaal op matrix, heb ik dat playbook gestart. Deze stopte er al snel mee, met de mededeling dat de aanwezige ruby versies (3.0.3) toch ouder dan wenselijk werd bevonden.

Dus het playbook upgrade_ruby.yml kwam uit de kast, om ruby eerst naar 3.2.2 te brengen. Dit verloopt parallel op alle vijf de machines en kostte ongeveer tien minuten.

---


- hosts: web,sidekiq
  become: true
  vars:
    ruby_version: "3.2.2"
  tasks:

    - name: "Update git repo for ruby versions"
      command: "git -C /home/mastodon/.rbenv/plugins/ruby-build pull"
      become: "yes"
      become_user: "mastodon"

    - name: "Install version {{ ruby_version }} of ruby using rbenv"
      command: "/home/mastodon/.rbenv/bin/rbenv install {{ ruby_version }}"
      become: "yes"
      become_user: "mastodon"
      args:
        creates: "/home/mastodon/.rbenv/versions/{{ ruby_version }}/bin/ruby"

Vervolgens het playbook om mastodon zelf te upgraden weer gestart. Deze upgrade verloopt serieel, dus node voor node. Dit kan downtime schelen als er verder geen migratiestappen zijn. Dit playbook heeft denk ik in ongeveer dertig minuten alle betrokken virtual machines bijgewerkt.

---

- hosts: web,sidekiq
  become: true
  serial: 1
  vars:
    mastodon_version: "4.2.0"
  tasks:

    - name: "Update git repo for mastodon versions"
      command: "git -C /home/mastodon/live fetch"
      become: "yes"
      become_user: "mastodon"

    - name: "Checkout mastodon version {{ mastodon_version }}"
      command: "git -C /home/mastodon/live checkout v{{ mastodon_version }}"
      become: "yes"
      become_user: "mastodon"

    - name: "Run bundle install on new version "
      command: "/home/mastodon/.rbenv/shims/bundle install"
      become: "yes"
      become_user: "mastodon"
      args:
        chdir: "/home/mastodon/live"

    - name: "Run yarn install on new version "
      command: "/usr/bin/yarn install"
      become: "yes"
      become_user: "mastodon"
      args:
        chdir: "/home/mastodon/live"

    - name: "Restart services on web"
      service:
        name: "{{ item }}"
        state: restarted
      loop:
        - mastodon-streaming
        - mastodon-web
      when: inventory_hostname in groups["web"]

    - name: "Reboot sidekiq node after updating"
      reboot:
        msg: "Reboot initiated by Ansible"
        connect_timeout: 5
        reboot_timeout: 300
        pre_reboot_delay: 0
        post_reboot_delay: 30
        test_command: uptime

      when: inventory_hostname in groups["sidekiq"]

De hoop en verwachting was, dat de site nu gewoon weer zou draaien. Helaas :) Al vrij snel bleek dat er database migraties en assets recompiles moesten lopen. Op zich geen verrassing, maar wel dat dit nog met de hand aangeslingerd moet worden. In kubernetes gebaseerde omgevingen verloopt dit (inmiddels) automatisch bij upgrades.

RAILS_ENV=production bundle exec rails db:migrate

Dus de database migratie heeft op de web1 gelopen, de assets precompile op alle web nodes. Ouderwetsch handwerk met inloggen over ssh en commando's intikken. Daarna de mastodon-web en mastodon-streaming herstart en we hadden weer beeld. Met versie 4.2.0. Dat was rond 7.25u vanmorgen, dus lang voordat het drukker wordt. Mooi!

RAILS_ENV=production bundle exec rails assets:precompile

Als laatste stap is er nog een extra propertie geconfigureerd om fulltext search mogelijk te maken en is het herindexeren van de search database (elasticsearch) gestart. Deze is op moment van schrijven nog druk bezig en heeft nog ongeveer een uur nodig zegt de tools zelf.

RAILS_ENV=production bin/tootctl search deploy

Tijd om de honden uit te gaan laten, het pruttelt weer.