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ë.