Mastodon : Docker : Arch

Hab die letzten Tage Mastodon entdeckt und wollte mir mal eine eigene Instanz aufsetzen. Ging mehr schlecht als recht. Aber nun läuft’s. Ich habe es mit Docker gemacht, weil ich keine Lust auf 100 deps auf meinem Server hatte. Zu meinem Unglück hab ich -1 Ahnung von Docker, weswegen ich fast verweifelt bin.

Docker:

# pacman -S docker-compose
# usermod -a -G docker $(whoami)
# systemctl start docker

Mastodon:

# mkdir -p /usr/share/webapps/mastodon
# chown $(whoami) mastodon
cd /usr/share/webapps/mastodon
git clone https://github.com/tootsuite/mastodon .
git checkout v2.4.0rc1

docker-compose.yml

version: '3'
services:

  db:
    restart: always
    image: postgres:9.6-alpine
    networks:
      - internal_network
### Uncomment to enable DB persistance
    volumes:
      - ./postgres:/var/lib/postgresql/data

  redis:
    restart: always
    image: redis:4.0-alpine
    networks:
      - internal_network
### Uncomment to enable REDIS persistance
    volumes:
      - ./redis:/data

#  es:
#    restart: always
#    image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.1.3
#    environment:
#      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
#    networks:
#      - internal_network
#### Uncomment to enable ES persistance
##    volumes:
##      - ./elasticsearch:/usr/share/elasticsearch/data

  web:
    build: .
    image: tootsuite/mastodon:v2.4.0rc1
    restart: always
    env_file: .env.production
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    environment:
      - WEB_CONCURRENCY=1
      - MAX_THREADS=5
    networks:
      - external_network
      - internal_network
    ports:
      - "127.0.0.1:9001:3000"
    depends_on:
      - db
      - redis
#      - es
    volumes:
      - ./public/assets:/mastodon/public/assets
      - ./public/packs:/mastodon/public/packs
      - ./public/system:/mastodon/public/system


  streaming:
    build: .
    image: tootsuite/mastodon:v2.4.0rc1
    restart: always
    env_file: .env.production
    command: yarn start
    networks:
      - external_network
      - internal_network
    ports:
      - "127.0.0.1:9002:4000"
    depends_on:
      - db
      - redis

  sidekiq:
    build: .
    image: tootsuite/mastodon:v2.4.0rc1
    restart: always
    env_file: .env.production
    command: bundle exec sidekiq -q default -q mailers -q pull -q push
    depends_on:
      - db
      - redis
    networks:
      - external_network
      - internal_network
    volumes:
      - ./public/packs:/mastodon/public/packs
      - ./public/system:/mastodon/public/system

networks:
  external_network:
  internal_network:
    internal: true

Ich hab andere Ports als die default 3000, 4000 genommen, weil meine schon belegt sind.

.env.production

cp .env.production{.sample,}

Und alles so lassen, bis auf:

LOCAL_DOMAIN=sub.domain.tld
SECRET_KEY_BASE=
OTP_SECRET=
VAPID_PRIVATE_KEY=
VAPID_PUBLIC_KEY=
UID=991
GID=991

SECRET_KEY_BASE und OTP_SECRET erstellen durch zweimaliges ausführen von

docker-compose run --rm web rake secret

VAPID_PRIVATE_KEY und VAPID_PUBLIC_KEY durch einmaliges ausführen von

docker-compose run --rm web rake mastodon:webpush:generate_vapid_key

Danach noch:

docker-compose pull
docker-compose build
# chown -R 991:991 public
docker-compose run --rm web rails db:migrate
docker-compose run --rm web rails db:precompile
# chown -R 991:991 public
docker-compose up -d

nginx

Die default Config ist vollkommen ausreichend. Falls ihr aber einen

error during websocket handshake: unexpected response code: 400

bekommen solltet, müsst ihr den client_header hochschrauben per

client_header_buffer_size 64k;
large_client_header_buffers 4 64k;

nvidia : tty

s2ram ist eigentlich ziemlich nützlich, wenn ich meinen Rechner suspenden will. Manchmal wacht er aber nicht aus dem Suspend auf, sondern startet neu.

Heute wollte ich ihn wieder aufwecken, aber er startete neu. Was dann aber passiert ist war, dass die Bootpartition meiner SSD nicht gefunden wurde und Windows von der anderen Platte bootete. Selbst das BIOS hat meine SSD nicht erkannt.

Wusste nicht was ich machen soll, also hab ich erst mal die Windows HDD abgesteckt und noch mal versucht zu starten um zu schauen, ob es wirklich nicht funktioniert. Komischerweise wurde die Platte dann erkannt und hat Syslinux booten können.

Jedoch wurde direkt vor Eingabe des Passworts für die Partitionen zur Syslinux ausgabe zurück gesprungen und verharrte dort. Passwort + username + passwort + startx konnte ich noch blind eingeben und X starten.

Kurzgesagt:

nvidia ist irgendwie beim suspenden kaputt gegangen und konnte nur noch durch hinzufügen von nomodeset als Kernelparameter zur Kooperation gezwungen werden.

vServer migrieren

Hat mich mal wieder mehr Zeit gekostet als es sollte.

Bei Hetzner gibt es ein neues Angebot und ich bin von meinem alten cx10 zu einem neuen cx21 gewechselt. Von 1 vCPU, 1GB RAM, 20GB Platz zu 2 vCPU, 4GB, 40GB Platz für nur knapp 1€ mehr im Monat kann sich schon sehen lassen.

DNS TTL

Runterdrehen

Neuen vServer vorbereiten

Beide vServer im rescue booten, Partitionen auf dem neuen erstellen, mounten und per

rsync -aPHAXS --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} /mnt/ root@neuerserver:/mnt

kopieren.

Anpassen

Bootloader installieren:

grub-install --target=i386-pc /dev/sdx

Eventuell grub conf anpassen.

Dann noch die /etc/fstab anpassen, per mkinitcpio -p linux Kernel neu bauen.

Netzwerk

Das Installimage von Hetzner für Arch Linux ist borked. Die erstellen nämlich eine kaputte Netzwerkconfig. Weswegen ich in /etc/systemd/network/50-hetzner.network

[Match]
Name=eth0

[Network]
DHCP=ipv4

auf DHCP umstellen musste.

Cleanup

Neue IP eintragen. DNS TTL wieder hochdrehen.

Reboot

Fertig

Page 4 of 21