Si të instaloni rrjetin social Mastodon me Docker në Rocky Linux 9


Mastodon është një rrjet social falas, i decentralizuar dhe me burim të hapur. Ai u krijua si një alternativë ndaj Twitter. Ashtu si Twitter, njerëzit mund të ndjekin njëri-tjetrin dhe të postojnë mesazhe, imazhe dhe video. Por ndryshe nga Twitter, nuk ka asnjë dyqan qendror apo autoritet për përmbajtjen.

Në vend të kësaj, Mastodon operon në mijëra serverë të ndryshëm secili të drejtuar nga anëtarë të ndryshëm të komunitetit. Përdoruesit e regjistruar në një server mund të lidhen lehtësisht me përdoruesit në rrjetin tjetër dhe të ndjekin njëri-tjetrin nëpër raste.

Çdokush mund të instalojë shembullin e tij të një serveri Mastodon. Ky tutorial do t'ju mësojë se si të konfiguroni shembullin tuaj të Mastodon në një server me Rocky Linux 9 duke përdorur Docker. Docker e bën të lehtë instalimin e Mastodon duke përmbajtur të gjitha paketat dhe shërbimet e kërkuara në kontejnerë.

Parakushtet

  • A server running Rocky Linux 9 with a minimum of 2 CPU cores and 2GB of memory. You will need to upgrade the server as per requirements.

  • A non-root user with sudo privileges.

  • A fully qualified domain name (FQDN) pointing to your server. For our purposes, we will use mastodon.example.com as the domain name.

  • Mastodon sends email notifications to users. We will recommend you use a 3rd party Transactional mail service like Mailgun, Sendgrid, Amazon SES, or Sparkpost. The instructions in the guide will be using Amazon SES.

  • Make sure everything is updated.

    $ sudo dnf update
    
  • Install basic utility packages. Some of them may already be installed.

    $ sudo dnf install wget curl nano unzip yum-utils -y
    

Hapi 1 - Konfiguro Firewall

Hapi i parë është konfigurimi i murit të zjarrit. Rocky Linux përdor Firewalld Firewall. Kontrolloni statusin e mureve të zjarrit.

$ sudo firewall-cmd --state
running

Firewall punon me zona të ndryshme dhe zona publike është ajo e paracaktuar që do të përdorim. Listoni të gjitha shërbimet dhe portet aktive në murin e zjarrit.

$ sudo firewall-cmd --permanent --list-services

Duhet të tregojë daljen e mëposhtme.

cockpit dhcpv6-client ssh

Wiki.js ka nevojë për porte HTTP dhe HTTPS për të funksionuar. Hapini ato.

$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https

Shto maskaradë, pasi aplikacioni do të kontaktojë me raste të tjera.

$ sudo firewall-cmd --permanent --add-masquerade

Ringarko murin e zjarrit për të zbatuar ndryshimet.

$ sudo firewall-cmd --reload

Hapi 2 - Instaloni Docker dhe Docker Compose

Rocky Linux dërgohet me një version më të vjetër të Docker. Për të instaluar versionin më të fundit, së pari, instaloni depon zyrtare të Docker.

$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

Instaloni versionin më të fundit të Docker.

$ sudo dnf install docker-ce docker-ce-cli containerd.io

Ju mund të merrni gabimin e mëposhtëm gjatë përpjekjes për të instaluar Docker.

ror: 
 Problem: problem with installed package buildah-1:1.26.2-1.el9_0.x86_64
  - package buildah-1:1.26.2-1.el9_0.x86_64 requires runc >= 1.0.0-26, but none of the providers can be installed
  - package containerd.io-1.6.9-3.1.el9.x86_64 conflicts with runc provided by runc-4:1.1.3-2.el9_0.x86_64
  - package containerd.io-1.6.9-3.1.el9.x86_64 obsoletes runc provided by runc-4:1.1.3-2.el9_0.x86_64
  - cannot install the best candidate for the job

Përdorni komandën e mëposhtme nëse merrni gabimin e mësipërm.

$ sudo dnf install docker-ce docker-ce-cli containerd.io docker-compose-plugin --allowerasing

Aktivizo dhe ekzekuto demonin Docker.

$ sudo systemctl enable docker --now

Verifiko që po funksionon.

? docker.service - Docker Application Container Engine
     Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
     Active: active (running) since Sat 2022-11-12 00:19:44 UTC; 6s ago
TriggeredBy: ? docker.socket
       Docs: https://docs.docker.com
   Main PID: 99263 (dockerd)
      Tasks: 8
     Memory: 28.1M
        CPU: 210ms
     CGroup: /system.slice/docker.service
             ??99263 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Si parazgjedhje, Docker kërkon privilegje rrënjësore. Nëse dëshironi të shmangni përdorimin e sudo sa herë që ekzekutoni komandën docker, shtoni emrin tuaj të përdoruesit në docker grup.

$ sudo usermod -aG docker $(whoami)

Ju do të duhet të dilni nga serveri dhe të hyni përsëri si i njëjti përdorues për të aktivizuar këtë ndryshim ose të përdorni komandën e mëposhtme.

$ su - ${USER}

Konfirmoni që përdoruesi juaj është shtuar në grupin Docker.

$ groups
navjot wheel docker

Hapi 3 - Përgatitja për instalim

Kufiri i paracaktuar i numërimit të mmap është shumë i ulët për Elasticsearch. Ekzekutoni komandën e mëposhtme për të kontrolluar vlerën e paracaktuar.

$ sysctl vm.max_map_count

Do të merrni daljen e mëposhtme.

vm.max_map_count = 65530

Rritni vlerën duke përdorur komandat e mëposhtme.

$ echo "vm.max_map_count=262144" | sudo tee /etc/sysctl.d/90-max_map_count.conf
$ sudo sysctl --load /etc/sysctl.d/90-max_map_count.conf

Konfiguro SELinux për të lejuar lidhjet e rrjetit.

$ sudo setsebool -P httpd_can_network_connect 1

Hapi 4 - Instaloni Mastodon

Krijoni drejtori dhe vendosni pronësi

Krijoni drejtori për Mastodon dhe shërbime të ngjashme.

$ sudo mkdir -p /opt/mastodon/database/{postgresql,pgbackups,redis,elasticsearch}
$ sudo mkdir -p /opt/mastodon/web/{public,system}
$ sudo mkdir -p /opt/mastodon/branding

Vendosni pronësinë e duhur në drejtoritë Elasticsearch, ueb dhe rezervë.

$ sudo chown 991:991 /opt/mastodon/web/{public,system}
$ sudo chown 1000 /opt/mastodon/database/elasticsearch
$ sudo chown 70:70 /opt/mastodon/database/pgbackups

Kaloni në drejtorinë Mastodon.

$ cd /opt/mastodon

Krijo mjedis dhe skedarë të kompozimit të docker

Krijoni skedarë mjedisi për aplikacionin dhe bazën e të dhënave.

$ sudo touch application.env database.env

Krijoni dhe hapni skedarin e kompozimit të Docker për redaktim.

$ sudo nano docker-compose.yml

Vendos kodin e mëposhtëm në të.

version: '3'

services:
  postgresql:
    image: postgres:15-alpine
    env_file: database.env
    restart: always
    shm_size: 512mb
    healthcheck:
      test: ['CMD', 'pg_isready', '-U', 'postgres']
    volumes:
      - postgresql:/var/lib/postgresql/data
      - pgbackups:/backups
    networks:
      - internal_network

  redis:
    image: redis:7-alpine
    restart: always
    healthcheck:
      test: ['CMD', 'redis-cli', 'ping']
    volumes:
      - redis:/data
    networks:
      - internal_network

  redis-volatile:
    image: redis:7-alpine
    restart: always
    healthcheck:
      test: ['CMD', 'redis-cli', 'ping']
    networks:
      - internal_network

  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.17.7
    restart: always
    env_file: database.env
    environment:
      - cluster.name=elasticsearch-mastodon
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - xpack.security.enabled=true
      - ingest.geoip.downloader.enabled=false
    ulimits:
      memlock:
        soft: -1
        hard: -1
    healthcheck:
      test: ["CMD-SHELL", "nc -z elasticsearch 9200"]
    volumes:
      - elasticsearch:/usr/share/elasticsearch/data
    networks:
      - internal_network

  website:
    image: tootsuite/mastodon:v4.0.2
    env_file:
      - application.env
      - database.env
    command: bash -c "bundle exec rails s -p 3000"
    restart: always
    depends_on:
      - postgresql
      - redis
      - redis-volatile
      - elasticsearch
    ports:
      - '127.0.0.1:3000:3000'
    networks:
      - internal_network
      - external_network
    healthcheck:
      test: ['CMD-SHELL', 'wget -q --spider --proxy=off localhost:3000/health || exit 1']
    volumes:
      - uploads:/mastodon/public/system

  shell:
    image: tootsuite/mastodon:v4.0.2
    env_file:
      - application.env
      - database.env
    command: /bin/bash
    restart: "no"
    networks:
      - internal_network
      - external_network
    volumes:
      - uploads:/mastodon/public/system
      - static:/static

  streaming:
    image: tootsuite/mastodon:v4.0.2
    env_file:
      - application.env
      - database.env
    command: node ./streaming
    restart: always
    depends_on:
      - postgresql
      - redis
      - redis-volatile
      - elasticsearch
    ports:
      - '127.0.0.1:4000:4000'
    networks:
      - internal_network
      - external_network
    healthcheck:
      test: ['CMD-SHELL', 'wget -q --spider --proxy=off localhost:4000/api/v1/streaming/health || exit 1']

  sidekiq:
    image: tootsuite/mastodon:v4.0.2
    env_file:
      - application.env
      - database.env
    command: bundle exec sidekiq
    restart: always
    depends_on:
      - postgresql
      - redis
      - redis-volatile
      - website
    networks:
      - internal_network
      - external_network
    healthcheck:
      test: ['CMD-SHELL', "ps aux | grep '[s]idekiq\ 6' || false"]
    volumes:
      - uploads:/mastodon/public/system

networks:
  external_network:
  internal_network:
  	 #internal:true

volumes:
  postgresql:
    driver_opts:
      type: none
      device: /opt/mastodon/database/postgresql
      o: bind
  pgbackups:
    driver_opts:
      type: none
      device: /opt/mastodon/database/pgbackups
      o: bind
  redis:
    driver_opts:
      type: none
      device: /opt/mastodon/database/redis
      o: bind
  elasticsearch:
    driver_opts:
      type: none
      device: /opt/mastodon/database/elasticsearch
      o: bind
  uploads:
    driver_opts:
      type: none
      device: /opt/mastodon/web/system
      o: bind
  static:
    driver_opts:
      type: none
      device: /opt/mastodon/web/public
      o: bind

Ruani skedarin duke shtypur Ctrl + X dhe duke futur Y kur ju kërkohet.

Në kohën e shkrimit të tutorialit, versioni më i fundit i disponueshëm i Mastodon është v4.0.2. Kontrolloni faqen e lëshimeve të Mastodon GitHub dhe rregulloni siç duhet versionin në skedarin e kompozimit të Docker. Ne po përdorim gjithashtu versionet më të fundit të PostgreSQL dhe Redis. Ju mund t'i rregulloni ato sipas kërkesave tuaja. Ne jemi duke përdorur Elasticsearch 7.x për momentin. Nuk ka asnjë version kryesor të Elasticsearch që mund ta ndiqni në faqen Docker Hub, kështu që do t'ju duhet të vazhdoni ta përditësoni manualisht për përditësimet e sigurisë që lidhen me Java.

Ai internal: true nuk funksionon me firewalld, prandaj komentohet në skedarin e mësipërm. Nëse kjo rregullohet ndonjëherë, mund të jeni në gjendje ta ri-shtoni atë kufizim shtesë.

Krijoni sekretet e aplikacionit

Hapi tjetër është krijimi i vlerave sekrete të aplikacionit.

Gjeneroni vlerat SECRET_KEY_BASE dhe OTP_SECRET duke ekzekutuar dy herë komandën e mëposhtme. Hera e parë do të marrë pak kohë pasi do të tërheqë imazhet.

$ docker compose run --rm shell bundle exec rake secret

Ju gjithashtu mund të përdorni mjetin openssl për të njëjtën gjë.

$ openssl rand -hex 64

Gjeneroni vlerat VAPID_PRIVATE_KEY dhe VAPID_PUBLIC_KEY duke përdorur komandën e mëposhtme.

$ docker compose run --rm shell bundle exec rake mastodon:webpush:generate_vapid_key 

Do të merrni një rezultat të ngjashëm.

VAPID_PRIVATE_KEY=u2qsCs5JdmdmMLnUuU0sgmFGvZedteJz-lFB_xF4_ac=
VAPID_PUBLIC_KEY=BJXjE2hIXvFpo6dnHqyf1i-2PcP-cBoL95UCmhhxwlAgtFw_vnrYp4GBneR7_cmI9LZUYjHFh-TBAPSb9WTqH9A=

Përdorni mjetin openssl për të gjeneruar fjalëkalime PostgreSQL dhe Elasticsearch.

$ openssl rand -hex 15

Skedarët e Mjedisit Mastodon

Hapni skedarin application.env për modifikim.

$ sudo nano application.env

Ngjitni rreshtat e mëposhtëm në të.

# environment
RAILS_ENV=production
NODE_ENV=production

# domain
LOCAL_DOMAIN=mastodon.example.com

# redirect to the first profile
SINGLE_USER_MODE=false

# do not serve static files
RAILS_SERVE_STATIC_FILES=false

# concurrency
WEB_CONCURRENCY=2
MAX_THREADS=5

# pgbouncer
#PREPARED_STATEMENTS=false

# locale
DEFAULT_LOCALE=en

# email, not used
SMTP_SERVER=email-smtp.us-west-2.amazonaws.com
SMTP_PORT=587
SMTP_LOGIN=AKIA3FIG4NVFNSC3AHXE
SMTP_PASSWORD=BHM4MVOjBmnGhSJ9lH3PAXKJ/9AiLWcUghG/kEN2kkFo


# secrets
SECRET_KEY_BASE=c09fa403575e0b431e54a2e228f20cd5a5fdfdbba0da80598959753b829a4e3c0266eedbac7e3cdf9f3345db36c56302c0e1bc5bfc8c5d516be59a2c41de7e37
OTP_SECRET=febb7dbb0d3308094083733fc923a430e52ccec767d48d7d2e0c577bfcb6863dbdfc920b1004b1f8c2967b9866bd7a0b4a15460f9fc7687aa4a42acf54e5a3d4

# Changing VAPID keys will break push notifications
VAPID_PRIVATE_KEY=13RgrfOY2tkwuUycylDPOkoHennkJ0ZAPV_fUwDy7-g=
VAPID_PUBLIC_KEY=BDAQuGwPbh1kbCV904adYXHvz9lLRaJHkiQkihRDPyBn3QmkAYbR21WHYoP8TkyG6dylG6IXpEVfLwdoW7fJVns=

Ruani skedarin duke shtypur Ctrl + X dhe duke futur Y kur ju kërkohet.

Hapni skedarin database.env për modifikim.

$ sudo nano database.env

Ngjitni rreshtat e mëposhtëm në të.

# postgresql configuration
POSTGRES_USER=mastodon
POSTGRES_DB=mastodon
POSTGRES_PASSWORD=15ff12dcb93aa60680d2aadb4032ee
PGPASSWORD=15ff12dcb93aa60680d2aadb4032ee
PGPORT=5432
PGHOST=postgresql
PGUSER=mastodon

# pgbouncer configuration
#POOL_MODE=transaction
#ADMIN_USERS=postgres,mastodon
#DATABASE_URL="postgres://mastodon::5432/mastodon"

# elasticsearch
ES_JAVA_OPTS=-Xms512m -Xmx512m
ELASTIC_PASSWORD=13382e99f6b2d4dc7f3d66e4b9872d

# mastodon database configuration
#DB_HOST=pgbouncer
DB_HOST=postgresql
DB_USER=mastodon
DB_NAME=mastodon
DB_PASS=15ff12dcb93aa60680d2aadb4032ee
DB_PORT=5432

REDIS_HOST=redis
REDIS_PORT=6379

CACHE_REDIS_HOST=redis-volatile
CACHE_REDIS_PORT=6379

ES_ENABLED=true
ES_HOST=elasticsearch
ES_PORT=9200
ES_USER=elastic
ES_PASS=13382e99f6b2d4dc7f3d66e4b9872d

Ruani skedarin duke shtypur Ctrl + X dhe duke futur Y kur ju kërkohet.

Përgatitni Mastodon

Bëni gati skedarët statikë për t'u shërbyer nga Nginx.

$ docker compose run --rm shell bash -c "cp -r /opt/mastodon/public/* /static/"

Sillni shtresën e të dhënave.

$ docker compose up -d postgresql redis redis-volatile

Kontrolloni statusin e kontejnerëve.

$ watch docker compose ps

Prisni që të funksionojë (i shëndetshëm), më pas shtypni Ctrl + C dhe inicializoni bazën e të dhënave duke përdorur komandën e mëposhtme.

$ docker compose run --rm shell bundle exec rake db:setup

Hapi 5 - Instaloni Nginx

Rocky Linux dërgohet me një version më të vjetër të Nginx. Duhet të shkarkoni depon zyrtare të Nginx për të instaluar versionin më të fundit.

Krijoni dhe hapni skedarin /etc/yum.repos.d/nginx.repo për krijimin e depove zyrtare Nginx.

$ sudo nano /etc/yum.repos.d/nginx.repo

Vendos kodin e mëposhtëm në të.

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

Ruani skedarin duke shtypur Ctrl + X dhe duke futur Y kur ju kërkohet.

Instaloni serverin Nginx.

$ sudo dnf install nginx

Verifikoni instalimin.

$ nginx -v
nginx version: nginx/1.22.1

Aktivizo dhe nis serverin Nginx.

$ sudo systemctl enable nginx --now

Kontrolloni statusin e serverit.

$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
     Active: active (running) since Sun 2022-11-13 13:49:55 UTC; 1s ago
       Docs: http://nginx.org/en/docs/
    Process: 230797 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
   Main PID: 230798 (nginx)
      Tasks: 3 (limit: 12355)
     Memory: 2.8M
        CPU: 13ms
     CGroup: /system.slice/nginx.service
             ??230798 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
             ??230799 "nginx: worker process"
             ??230800 "nginx: worker process"

Hapi 6 - Instaloni SSL

Mjeti Certbot gjeneron certifikata SSL duke përdorur Lets Encrypt API. Kërkon që depoja EPEL të funksionojë.

$ sudo dnf install epel-release

Ne do të përdorim Snapd për të instaluar Certbot. Instaloni Snapd.

$ sudo dnf install snapd

Aktivizo dhe nis shërbimin Snap.

$ sudo systemctl enable snapd --now

Instaloni paketën bazë Snap.

$ sudo snap install core
$ sudo snap refresh core

Krijoni lidhjet e nevojshme që Snapd të funksionojë.

$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh

Lëshoni komandën e mëposhtme për të instaluar Certbot.

$ sudo snap install --classic certbot

Aktivizo Certbot duke krijuar simlidhjen me ekzekutuesin e tij.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Gjeneroni certifikatën SSL.

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m  -d mastodon.example.com

Komanda e mësipërme do të shkarkojë një certifikatë në drejtorinë /etc/letsencrypt/live/mastodon.example.com në serverin tuaj.

Krijo një certifikatë grupi Diffie-Hellman.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Për të kontrolluar nëse rinovimi SSL po funksionon mirë, bëni një ekzekutim të thatë të procesit.

$ sudo certbot renew --dry-run

Nëse nuk shihni asnjë gabim, jeni gati. Certifikata juaj do të rinovohet automatikisht.

Hapi 7 - Konfiguro Nginx

Hapni skedarin /etc/nginx/nginx.conf për modifikim.

$ sudo nano /etc/nginx/nginx.conf

Shtoni rreshtin e mëposhtëm përpara rreshtit include /etc/nginx/conf.d/*.conf;.

server_names_hash_bucket_size  64;

Ruani skedarin duke shtypur Ctrl + X dhe duke futur Y kur ju kërkohet.

Krijoni dhe hapni skedarin /etc/nginx/conf.d/mastodon.conf për modifikim.

$ sudo nano /etc/nginx/conf.d/mastodon.conf

Vendos kodin e mëposhtëm në të.

map $http_upgrade $connection_upgrade {
  default upgrade;
  ''      close;
}

upstream backend {
    server 127.0.0.1:3000 fail_timeout=0;
}

upstream streaming {
    server 127.0.0.1:4000 fail_timeout=0;
}

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=CACHE:10m inactive=7d max_size=1g;

server {
  listen 80 default_server;
  server_name mastodon.example.com;
  location / { return 301 https://$host$request_uri; }
}

server {
   listen 443 ssl http2;
   server_name mastodon.example.com;
   
   access_log  /var/log/nginx/mastodon.access.log;
   error_log   /var/log/nginx/mastodon.error.log;

   http2_push_preload on; # Enable HTTP/2 Server Push

   ssl_certificate /etc/letsencrypt/live/mastodon.example.com/fullchain.pem;
   ssl_certificate_key /etc/letsencrypt/live/mastodon.example.com/privkey.pem;
   ssl_trusted_certificate /etc/letsencrypt/live/mastodon.example.com/chain.pem;
   ssl_session_timeout 1d;

   # Enable TLS versions (TLSv1.3 is required upcoming HTTP/3 QUIC).
   ssl_protocols TLSv1.2 TLSv1.3;

   # Enable TLSv1.3's 0-RTT. Use $ssl_early_data when reverse proxying to
   # prevent replay attacks.
   #
   # @see: https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_early_data
   ssl_early_data on;

   ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384';
   ssl_prefer_server_ciphers on;
   ssl_session_cache shared:SSL:10m;
   ssl_session_tickets off;
   
   keepalive_timeout    70;
   sendfile             on;
   client_max_body_size 80m;

   # OCSP Stapling ---
   # fetch OCSP records from URL in ssl_certificate and cache them
   ssl_stapling on;
   ssl_stapling_verify on;
   ssl_dhparam /etc/ssl/certs/dhparam.pem;

   add_header X-Early-Data $tls1_3_early_data;
   
   root /opt/mastodon/web/public;
   
   gzip on;
   gzip_disable "msie6";
   gzip_vary on;
   gzip_proxied any;
   gzip_comp_level 6;
   gzip_buffers 16 8k;
   gzip_http_version 1.1;
   gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml image/x-icon;
   
   add_header Strict-Transport-Security "max-age=31536000" always;

  location / {
    try_files $uri @proxy;
  }

  location ~ ^/(system/accounts/avatars|system/media_attachments/files) {
    add_header Cache-Control "public, max-age=31536000, immutable";
    add_header Strict-Transport-Security "max-age=31536000" always;
    root /opt/mastodon/;
    try_files $uri @proxy;
  }

  location ~ ^/(emoji|packs) {
    add_header Cache-Control "public, max-age=31536000, immutable";
    add_header Strict-Transport-Security "max-age=31536000" always;
    try_files $uri @proxy;
  }

  location /sw.js {
    add_header Cache-Control "public, max-age=0";
    add_header Strict-Transport-Security "max-age=31536000" always;
    try_files $uri @proxy;
  }

  location @proxy {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Proxy "";
    proxy_pass_header Server;

    proxy_pass http://backend;
    proxy_buffering on;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    proxy_cache CACHE;
    proxy_cache_valid 200 7d;
    proxy_cache_valid 410 24h;
    proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
    add_header X-Cached $upstream_cache_status;
    add_header Strict-Transport-Security "max-age=31536000" always;

    tcp_nodelay on;
  }

  location /api/v1/streaming {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Proxy "";

    proxy_pass http://streaming;
    proxy_buffering off;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    tcp_nodelay on;
  }

  error_page 500 501 502 503 504 /500.html;
}

# This block is useful for debugging TLS v1.3. Please feel free to remove this
# and use the `$ssl_early_data` variable exposed by NGINX directly should you
# wish to do so.
map $ssl_early_data $tls1_3_early_data {
  "~." $ssl_early_data;
  default "";
}

Pasi të keni përfunduar, ruani skedarin duke shtypur Ctrl + X dhe duke futur Y kur ju kërkohet.

Verifikoni sintaksën e skedarit të konfigurimit Nginx.

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Rinisni serverin Nginx.

$ sudo systemctl restart nginx

Nëse merrni gabimin e mëposhtëm, atëherë me shumë mundësi është për shkak të kufizimeve të SELinux.

nginx: [emerg] open() "/var/run/nginx.pid" failed (13: Permission denied)

Për të rregulluar gabimin, ekzekutoni komandat e mëposhtme.

$ sudo ausearch -c 'nginx' --raw | audit2allow -M my-nginx
$ sudo semodule -X 300 -i my-nginx.pp

Filloni përsëri shërbimin Nginx.

$ sudo systemctl start nginx

Hapi 8 - Filloni Mastodon

Mjeti Tootctl CLI

Mjeti Tootctl CLI përdoret për të kryer detyra administrative në Mastodon. Ne duhet ta bëjmë atë të aksesueshëm në predhën e hostit.

Krijoni skedarin /usr/local/bin/tootctl dhe hapeni atë për redaktim.

$ sudo nano /usr/local/bin/tootctl

Vendos kodin e mëposhtëm në të.

#!/bin/bash
docker compose -f /opt/mastodon/docker-compose.yml run --rm shell tootctl ""

Ruani skedarin duke shtypur Ctrl + X dhe duke futur Y kur ju kërkohet.

Jepni skedarin leje të ekzekutueshme.

$ sudo chmod +x /usr/local/bin/tootctl

Dosja e Shërbimit Mastodon

Ju mund të nisni kontejnerët Mastodon duke përdorur komandën e kompozimit Docker, por është më e lehtë për t'u bërë përmes një skedari të njësisë së sistemit.

Krijoni dhe hapni skedarin e shërbimit Mastodon për redaktim.

$ sudo nano /etc/systemd/system/mastodon.service

Vendos kodin e mëposhtëm në të.

[Unit]
Description=Mastodon service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes

WorkingDirectory=/opt/mastodon
ExecStart=/usr/bin/docker compose -f /opt/mastodon/docker-compose.yml up -d
ExecStop=/usr/bin/docker compose -f /opt/mastodon/docker-compose.yml down

[Install]
WantedBy=multi-user.target

Ruani skedarin duke shtypur Ctrl + X dhe duke futur Y kur ju kërkohet.

Ringarko demonin e sistemit për të nisur skedarin e shërbimit.

$ sudo systemctl daemon-reload

Aktivizo dhe nis shërbimin Mastodon.

$ sudo systemctl enable --now mastodon.service

Kontrolloni statusin e kontejnerëve Docker.

$ watch docker compose -f /opt/mastodon/docker-compose.yml ps

Pasi statusi i kontejnerëve të ndryshojë në punon (i shëndetshëm), dilni nga ekrani duke shtypur Ctrl + C.

Krijoni përdoruesin admin për Mastodon dhe shënoni fjalëkalimin e dhënë.

$ tootctl accounts create navjot --email  --confirmed --role admin
OK
New password: 1338afbe1b4e06e823b6625da80cb537

Nëse dëshironi të mbyllni regjistrimet e përdoruesve, përdorni komandën e mëposhtme.

$ tootctl settings registrations close

Për të hapur përsëri regjistrimet, lëshoni komandën e mëposhtme.

$ tootctl settings registrations open

Inicializoni Kërkimin

Do t'ju duhet të krijoni dhe të plotësoni indekset e Elasticsearch. Pasi të keni bërë një toot, lëshoni komandën e mëposhtme.

$ tootctl search deploy

Ju mund të merrni gabimin e mëposhtëm.

/opt/mastodon/vendor/bundle/ruby/3.0.0/gems/ruby-progressbar-1.11.0/lib/ruby-progressbar/progress.rb:76:in `total=': You can't set the item's total value to less than the current progress. (ProgressBar::InvalidProgressError)
        from /opt/mastodon/vendor/bundle/ruby/3.0.0/gems/ruby-progressbar-1.11.0/lib/ruby-progressbar/base.rb:178:in `block in update_progress'
        from /opt/mastodon/vendor/bundle/ruby/3.0.0/gems/ruby-progressbar-1.11.0/lib/ruby-progressbar/output.rb:43:in `with_refresh'
        from /opt/mastodon/vendor/bundle/ruby/3.0.0/gems/ruby-progressbar-1.11.0/lib/ruby-progressbar/base.rb:177:in `update_progress'
        from /opt/mastodon/vendor/bundle/ruby/3.0.0/gems/ruby-progressbar-1.11.0/lib/ruby-progressbar/base.rb:101:in `total='
        from /opt/mastodon/lib/mastodon/search_cli.rb:67:in `deploy'
        from /opt/mastodon/vendor/bundle/ruby/3.0.0/gems/thor-1.2.1/lib/thor/command.rb:27:in `run'
        from /opt/mastodon/vendor/bundle/ruby/3.0.0/gems/thor-1.2.1/lib/thor/invocation.rb:127:in `invoke_command'
        from /opt/mastodon/vendor/bundle/ruby/3.0.0/gems/thor-1.2.1/lib/thor.rb:392:in `dispatch'
        from /opt/mastodon/vendor/bundle/ruby/3.0.0/gems/thor-1.2.1/lib/thor/invocation.rb:116:in `invoke'
        from /opt/mastodon/vendor/bundle/ruby/3.0.0/gems/thor-1.2.1/lib/thor.rb:243:in `block in subcommand'
        from /opt/mastodon/vendor/bundle/ruby/3.0.0/gems/thor-1.2.1/lib/thor/command.rb:27:in `run'
        from /opt/mastodon/vendor/bundle/ruby/3.0.0/gems/thor-1.2.1/lib/thor/invocation.rb:127:in `invoke_command'
        from /opt/mastodon/vendor/bundle/ruby/3.0.0/gems/thor-1.2.1/lib/thor.rb:392:in `dispatch'
        from /opt/mastodon/vendor/bundle/ruby/3.0.0/gems/thor-1.2.1/lib/thor/base.rb:485:in `start'
        from /opt/mastodon/bin/tootctl:8:in `<main>'

Në këtë rast, futni guaskën e kontejnerit të faqes në internet.

$ docker exec -it mastodon-web-1 /bin/bash

Ekzekutoni komandën e mëposhtme.

$ sed -E 's/indices.sum.+/2000/g' -i lib/mastodon/search_cli.rb

Dilni nga guaska e kontejnerit.

$ exit

Ekzekutoni sërish komandën e vendosjes së Elasticsearch.

$ tootctl search deploy

Shërbime shtesë ndihmëse

Le të krijojmë një shërbim tjetër për heqjen e skedarëve të mediave të shkarkuar.

Krijoni dhe hapni shërbimin e heqjes së mediave Mastodon për redaktim.

$ sudo nano /etc/systemd/system/mastodon-media-remove.service

Vendos kodin e mëposhtëm në të.

[Unit]
Description=Mastodon - media remove service
Wants=mastodon-media-remove.timer

[Service]
Type=oneshot
StandardError=null
StandardOutput=null

WorkingDirectory=/opt/mastodon
ExecStart=/usr/bin/docker compose -f /opt/mastodon/docker-compose.yml run --rm shell tootctl media remove

[Install]
WantedBy=multi-user.target

Ruani skedarin duke shtypur Ctrl + X dhe duke futur Y kur ju kërkohet.

Nëse dëshironi të planifikoni heqjen e medias, mund të konfiguroni një shërbim kohëmatës për të.

$ sudo nano /etc/systemd/system/mastodon-media-remove.timer

Ngjit kodin e mëposhtëm.

[Unit]
Description=Schedule a media remove every week

[Timer]
Persistent=true
OnCalendar=Sat *-*-* 00:00:00
Unit=mastodon-media-remove.service

[Install]
WantedBy=timers.target

Ruani skedarin duke shtypur Ctrl + X dhe duke futur Y kur ju kërkohet.

Mund të konfiguroni një shërbim tjetër për të hequr kartat e pamjes paraprake Rich të krijuara duke përdorur etiketat OpenGraph.

$ sudo nano /etc/systemd/system/mastodon-preview_cards-remove.service

Ngjit kodin e mëposhtëm.

[Unit]
Description=Mastodon - preview cards remove service
Wants=mastodon-preview_cards-remove.timer

[Service]
Type=oneshot
StandardError=null
StandardOutput=null

WorkingDirectory=/opt/mastodon
ExecStart=/usr/bin/docker compose -f /opt/mastodon/docker-compose.yml run --rm shell tootctl preview_cards remove

[Install]
WantedBy=multi-user.target

Ruani skedarin duke shtypur Ctrl + X dhe duke futur Y kur ju kërkohet.

Vendosni shërbimin përkatës të kohëmatësit.

$ sudo nano /etc/systemd/system/mastodon-preview_cards-remove.timer

Ngjit kodin e mëposhtëm.

[Unit]
Description=Schedule a preview cards remove every week

[Timer]
Persistent=true
OnCalendar=Sat *-*-* 00:00:00
Unit=mastodon-preview_cards-remove.service

[Install]
WantedBy=timers.target

Ruani skedarin duke shtypur Ctrl + X dhe duke futur Y kur ju kërkohet.

Rifresko demonin e sistemit.

$ sudo systemctl daemon-reload

Aktivizo dhe nis kohëmatësit.

$ sudo systemctl enable --now mastodon-preview_cards-remove.timer
$ sudo systemctl enable --now mastodon-media-remove.timer

Listoni të gjithë kohëmatësit për të kontrolluar orarin e shërbimeve Mastodon.

$ systemctl list-timers

Hyni në Mastodon

Vizitoni URL-në https://mastodon.example.com për të hyrë në shembullin tuaj dhe do të shihni një faqe të ngjashme.

Në pamjen e mësipërme, mund të shihni se janë 2 përdorues dhe 1 prej tyre (unë) është caktuar si administrator. Zakonisht nuk është kështu. Edhe nëse krijoni një llogari administratori, ajo nuk shfaqet në faqen kryesore në ekzekutimin e parë. Për ta bërë këtë, hyni në shembullin tuaj dhe do të çoheni në faqen e mëposhtme.

Klikoni në opsionin Preferencat nga shiriti anësor i djathtë për të hyrë te cilësimet. Nga atje, klikoni në opsionin Administrimi nga menyja e majtë për të hyrë në panelin e administrimit të Mastodons.

Klikoni në opsionin Cilësimet e sitit nga shiriti anësor i majtë.

Këtu, plotësoni emrin e përdoruesit të kontaktit dhe emailin e biznesit, të cilat tani do të pasqyrohen në faqen kryesore të serverëve tuaj. Plotësoni gjithashtu informacione të tjera të ndryshme duke përfshirë përshkrimin e serverit, logon dhe rregullat e serverit për të personalizuar shembullin tuaj Mastodon.

Hapi 9 - Mirëmbajtja e Mastodonit

Për të parë performancën dhe regjistrat e shembullit tuaj Mastodon, shkoni te https://mastodon.example.com/sidekiq/.

Këtu mund të shikoni një listë të proceseve të ndryshme dhe detyrave të planifikuara në lidhje me shembullin tuaj Mastodon. Ju gjithashtu mund të kontrolloni për detyra të dështuara nën seksionin Të vdekura ose Riprovat. Do t'ju tregojë gjithashtu përdorimin e kujtesës së shembullit tuaj.

Mund të kontrolloni shëndetin e bazës së të dhënave të rasteve tuaja nga https://mastodon.example.com/pghero/.

Ju mund të kryeni mirëmbajtjen e bazës së të dhënave tuaja, të ekzekutoni pyetje SQL dhe të hiqni indekset e papërdorura. Për të aktivizuar statistikat e pyetjeve, klikoni butonin Aktivizo në faqen e mësipërme dhe do të merrni informacionin e mëposhtëm.

Kalo te përdoruesi rrënjë.

$ sudo -i su

Kalo te drejtoria /opt/mastodon/database/postgresql.

$ cd /opt/mastodon/database/postgresql

Hapni skedarin postgresql.conf.

$ nano postgresql.conf

Gjeni rreshtin #shared_preload_libraries=# (ndryshimi kërkon rinisje) dhe zëvendësojeni me sa vijon.

shared_preload_libraries = 'pg_stat_statements'

Shtoni rreshtin e mëposhtëm në fund të skedarit.

pg_stat_statements.track = all

Ruani skedarin duke shtypur Ctrl + X dhe duke futur Y kur ju kërkohet.

Rinisni kontejnerët Mastodon.

$ systemctl restart mastodon.service

Dilni nga guaska e rrënjës.

$ exit

Nëse kontrolloni faqen e shëndetit të bazës së të dhënave, mund të shihni nëse ka ndonjë pyetje të ngadaltë tani.

Shënim: Ju gjithashtu mund të hapni URL-të PgHero dhe Sidekiq nga menyja Preferencat.

Nëse faqja juaj nuk ngarkon për ndonjë arsye, mund të kontrolloni regjistrat e krijuar nga Docker.

$ docker logs <container-name>

Hapi 10 - Mastodon rezervë

Ne do të përdorim një mjet të palës së tretë të quajtur Restic për të mbështetur Mastodon. Hapi i parë për të krijuar kopje rezervë duke përdorur Restic është të shtoni të gjithë skedarët dhe drejtoritë në listën e depove.

Krijoni dhe hapni skedarin e listës së depove për redaktim.

$ sudo nano /opt/mastodon/backup-files

Ngjitni rreshtat e mëposhtëm në të.

/etc/nginx
/etc/letsencrypt
/etc/systemd/system
/root
/opt/mastodon/database/pgbackups
/opt/mastodon/*.env
/opt/mastodon/docker-compose.yml
/opt/mastodon/branding
/opt/mastodon/database/redis
/opt/mastodon/web/system
/opt/mastodon/backup-files
/opt/mastodon/mastodon-backup

Ruani skedarin duke shtypur Ctrl + X dhe duke futur Y kur ju kërkohet.

Instaloni Restic.

$ sudo dnf install restic

Krijoni një depo rezervë dhe krijoni kopjen rezervë fillestare. Ne po bëjmë kopje rezervë të të dhënave tona në shërbimin S3.

$ restic -r s3:https://$SERVER:$PORT/mybucket init
$ restic -r s3:https://$SERVER:$PORT/mybucket backup $(cat /opt/mastodon/backup-files) --exclude  /opt/mastodon/database/postgresql

Krijoni një kohëmatës të shërbimit rezervë Mastodon dhe hapeni për redaktim.

$ sudo nano /etc/systemd/system/mastodon-backup.timer

Vendos kodin e mëposhtëm në të.

[Unit]
Description=Schedule a mastodon backup every hour

[Timer]
Persistent=true
OnCalendar=*:00:00
Unit=mastodon-backup.service

[Install]
WantedBy=timers.target

Ruani skedarin duke shtypur Ctrl + X dhe duke futur Y kur ju kërkohet.

Krijoni një skedar shërbimi rezervë Mastodon dhe hapeni për redaktim.

$ sudo nano /etc/systemd/system/mastodon-backup.service

Vendos kodin e mëposhtëm në të.

[Unit]
Description=Mastodon - backup service
# Without this, they can run at the same time and race to docker compose,
# double-creating networks and failing due to ambiguous network definition
# requiring `docker network prune` and restarting
After=mastodon.service

[Service]
Type=oneshot
StandardError=file:/var/log/mastodon-backup.err
StandardOutput=file:/var/log/mastodon-backup.log

WorkingDirectory=/opt/mastodon
ExecStart=/bin/bash /opt/mastodon/mastodon-backup

[Install]
WantedBy=multi-user.target

Ruani skedarin duke shtypur Ctrl + X dhe duke futur Y kur ju kërkohet.

Më pas, krijoni dhe hapni skedarin /opt/mastodon/mastodon-backup për modifikim. Kjo përmban komandat aktuale rezervë.

$ sudo nano /opt/mastodon/mastodon-backup

Vendos kodin e mëposhtëm në të.

#!/bin/bash

set -e

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
SERVER=
PORT=
RESTIC_PASSWORD_FILE=/root/restic-pasword

docker compose -f /opt/mastodon/docker-compose.yml run --rm postgresql sh -c "pg_dump -Fp  mastodon | gzip > /backups/dump.sql.gz"
restic -r s3:https://$SERVER:$PORT/mybucket --cache-dir=/root backup $(cat /opt/mastodon/backup-files) --exclude  /opt/mastodon/database/postgresql
restic -r s3:https://$SERVER:$PORT/mybucket --cache-dir=/root forget --prune --keep-hourly 24 --keep-daily 7 --keep-monthly 3

Ruani skedarin duke shtypur Ctrl + X dhe duke futur Y kur ju kërkohet.

Jepni leje të ekzekutueshme skriptit rezervë.

$ sudo chmod +x /opt/mastodon/mastodon-backup

Ringarkoni demonin e shërbimit dhe filloni shërbimin rezervë dhe kohëmatësin.

$ sudo systemctl daemon-reload
$ sudo systemctl enable --now mastodon-backup.service
$ sudo systemctl enable --now mastodon-backup.timer

Konfirmoni që kopjet rezervë për orë po ndodhin dhe janë të arritshme duke përdorur komandat e mëposhtme.

$ restic -r s3:https://$SERVER:$PORT/mybucket snapshots
$ restic -r s3:https://$SERVER:$PORT/mybucket mount /mnt

Hapi 11 - Përmirëso Mastodon

Përmirësimi i Mastodon kërkon disa hapa. Së pari, kaloni në drejtori.

$ cd /opt/mastodon

Tërhiqni imazhet më të fundit të kontejnerëve për Mastodon.

$ docker compose pull

Bëni çdo ndryshim në docker-compose.yml nëse dëshironi.

Kryeni të gjitha migrimet e bazës së të dhënave.

$ docker compose run --rm shell bundle exec rake db:migrate

Përditësoni kopjet tuaja të skedarëve statikë.

$ docker compose run --rm shell bash -c "cp -r /opt/mastodon/public/* /static/"

Rinisni kontejnerët Mastodon.

$ sudo systemctl restart mastodon.service

Udhëzimet e mësipërme janë udhëzime të përgjithshme të përditësimit. Kontrolloni gjithmonë faqen e lëshimeve të GitHub të Mastodon për të kërkuar ndonjë detyrë specifike përditësimi dhe komanda midis versioneve për t'u siguruar që gjithçka të shkojë pa probleme.

konkluzioni

Kjo përfundon tutorialin tonë për instalimin e Rrjetit Social Mastodon duke përdorur Docker në një server Rocky Linux 9. Nëse keni ndonjë pyetje, postojini ato në komentet më poshtë.