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;