آذرسیس

آموزش نصب شبکه اجتماعی Mastodon به وسیله داکر در اوبونتو 22.04
5/5 - (2 امتیاز)

شبکه های اجتماعی از لحظ کارکردی که بین کاربران دارند، محبوبیت زیادی به دست آورده اند و تعامل را بین افراد آسان می کنند. شبکه اجتماعی Mastodon نیز یکی از این ابزار است که می توان در محیط لینوکس نیز از آن بهره مند شد. پس ما در ادامه به بررسی این شبکه اجتماعی و نصب آن در اوبونتو 22.04 خواهیم پرداخت.

شبکه اجتماعی Mastodon چیست؟

این ابزار در واقع یک شبکه اجتماعی رایگان، غیر متمرکز و متن باز می باشد و به عنوان جایگزینی برای توییتر ایجاد شده است. Mastodon درست مانند توییتر عمل می کند که در آن افراد می توانند یکدیگر را دنبال کنند و پیام ها، تصاویر و ویدیو ارسال کنند.

البته نکته قابل توجه این است که در آن برخلاف توییتر، هیچ فروشگاه مرکزی یا مرجعی برای محتوا وجود ندارد. در عوض، این ابزار در هزاران سرور مختلف کار می کند. یعنی، کاربرانی که در یک سرور منحصر به فرد هستند می توانند به راحتی به کاربران یک شبکه دیگر متصل شوند و یکدیگر را دنبال کنند.

مراحل نصب برنامه Mastodon با داکر در اوبونتو 22.04

حال که شما با شبکه اجتماعی Mastodon آشنا شدید و پی بردید که می توان آن را در سیستم های مختلفی نصب کرد. ما در ادامه این مقاله مراحل نصب گام به گام این ابزار در سیستم عامل اوبونتو 22.04 را مورد بررسی قرار می دهیم.

پیش نیازهای نصب برنامه Mastodon در اوبونتو 22.04

  • سیستم اوبونتو 22.04 با امکاناتی چون CPU حداقل 2 هسته ای و 2 گیگابایت حافظه. (البته طبق نیاز خود می توانید سرور را ارتقاء دهید)
  • دسترسی به صورت کاربر non-root با امتیازات sudo
  • یک نام دامنه کامل (FQDN) که به سرور شما اشاره کند.
  • یک سرویس پست الکترونیک شخص ثالث مانند: Amazon SES, Sendgrid, Sparkpost. در اینجا ما از Amazon SES استفاده خواهیم کرد.
  • از بروز بودن سیستم عامل خود با دستور زیر اطمینان حاصل کنید:
sudo apt update

از دستور زیر نیز برای نصب بسته ابزارهای پایه استفاده کنید. البته ممکن است برخی از آنها از قبل نصب شده باشد:

sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y

مرحله 1: پیکربندی فایروال در اوبونتو 22.04

اولین قدم ما اطمینان از پیکربندی فایروال در سیستم می باشد. در اینجا اوبونتو به صورت پیش فرض با دستور ufw می باشد. پس با دستور زیر از اجرای فایروال اطمینان حاصل کنید:

sudo ufw status

پورت SSH را مجاز کنید تا به این صورت فایروال اتصال فعلی را قطع نکند:

sudo ufw allow OpenSSH

همچنین، با دستور زیر پورت های http و https را مجاز کنید:

sudo ufw allow http
sudo ufw allow https

حال با دستور مورد نیاز فایروال را فعال کنید:

sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

در نهایت، برای بررسی وضعیت فایروال دستور زیر را بکار گیرید:

sudo ufw status

مرحله 2: نصب داکر و داکر compose

اوبونتو 22.04 با نسخه قدیمی داکر عرضه می شود. برای نصب آخرین نسخه، ابتدا باید کلید Docker GPG را وارد کنید:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

اکنون با استفاده از دستور زیر فایل مخزن داکر را ایجاد کنید:

echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

حالا نوبت به بروز رسانی لیست مخزن سیستم رسیده است که می توانید با دستور زیر این کار را انجام دهیذ:

sudo apt update

باید آخرین نسخه داکر را در سیستم خود داشته باشید که با دستور زیر آن را نصب کنید:

sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

وضعیت اجرای آن را نیز با دستور زیر شناسایی کنید: 

sudo systemctl status docker

به طور پیش فرض، داکر به امتیازات ریشه نیاز دارد. اگر می خواهید هر بار که دستور داکر را اجرا می کنید، از sudo استفاده نکنید، نام کاربری خود را به گروه داکر اضافه کنید:

sudo usermod -aG docker $(whoami)

می توانید از سرور خارج شده و دوباره وارد شوید تا تغییرات اعمال شود و یا از دستور زیر استفاده کنید:

su - ${USER}

با استفاده از دستور زیر اضافه شدن کاربر شما به گروه داکر را تایید کنید:

groups
navjot wheel docker

مرحله 3: آماده سازی برای نصب

حد پیش فرض تعداد nmap برای Elasticsearch بسیار کم است. برای بررسی مقدار پیش فرض دستور زیر را اجرا کنید:

sysctl vm.max_map_count

حال می توانید مقدار را با اعمال دستور زیر بالا ببرید:

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

مرحله 4: نصب شبکه اجتماعی Mastodon

حال نوبت آن رسیده است که پس از اقدامات مورد نیاز، برنامه Mastodon را نصب کنیم. در این صورت نیز باید مراحلی را پشت سر بگذاریم.

ایجاد دایرکتوری ها و تنظیم مالکیت

ابتدا، باید دایرکتوری هایی برای Mastodon و سرویس های مرتبط با آن ایجاد کنید:

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

اکنون باید امتیازهای مالکیت لازم را برای دایرکتوری های elasticsearch، web و backup تنظیم کنید:

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

سپس به دایرکتوری Mastodon سویچ کنید:

cd /opt/mastodon

ایجاد محیط مناسب و فایل های داکر compose

اکنون باید فایل های محیطی مناسب برای اپلیکیشن و پایگاه داده بوجود آورید:

sudo touch application.env database.env

اکنون برای عمل ویرایش، فایل compose داکر را ایجاد کرده و باز کنید:

sudo nano docker-compose.yml

و کد زیر را در آن وارد کنید:

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
- "ES_JAVA_OPTS=-Xms512m -Xmx512m -Des.enforce.bootstrap.checks=true"
- xpack.license.self_generated.type=basic
- xpack.watcher.enabled=false
- xpack.graph.enabled=false
- xpack.ml.enabled=false
- thread_pool.write.queue_size=1000
ulimits:
memlock:
soft: -1
hard: -1
nofile:
soft: 65536
hard: 65536
healthcheck:
test: ["CMD-SHELL", "nc -z elasticsearch 9200"]
volumes:
- elasticsearch:/usr/share/elasticsearch/data
networks:
- internal_network
ports:
- '127.0.0.1:9200:9200'
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

سپس، با زدن ctrl+x فایل را ذخیره کرده و به محض درخواست کلید Y را بزنید.

آخرین نسخه منتشر شده را در Mastodon Github Release بررسی کنید و نسخه موجود در فایل داکر compose را به طور مناسب تنظیم کنید. ما در اینجا از آخرین نسخه های postgreSQL و Redise استفاده می کنیم. شما می توانید این موارد را براساس نیاز خود تنظیم کنید. درباره Elasticsearch نیز هیچ نسخه اصلی وجود ندارد تا بتوان در صفحه Ducker Hub دنبال کرد، بنابراین باید به صورت دستی وارد کنید.

 ایجاد مقادیر سرّی در اپلیکیشن

در این قسمت باید مقادیر سری برنامه را ایجاد کنید. با دوبار اجرای دستور زیر مقادیر SECRET_KEY_BASE و OTP_SECRET را ایجاد کنید. اولین بار کمی طول می کشد.

docker compose run --rm shell bundle exec rake secret

 همچنین، می توانید از ابزار openssl به همین منظور بهره مند شوید:

openssl rand -hex 64

با دستور زیر نیز می توانید مقادیر VAPID_PRIVATE_KEY و VAPID_PUBLIC_KEY را ایجاد کنید:

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

برای ایجاد رمز عبور برای PostgreSQL و Elasticsearch هم می توانید از ابزار openssl استفاده کنید:

openssl rand -hex 15

فایل های محیطی Matsodon

برای امکان ویرایش فایل application.env  را باز کنید:

sudo nano application.env

سپس، خطوط زیر را در فایل paste کنید:

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=AES_USER
SMTP_PASSWORD=AES_PWD
[email protected] 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=
IP and session retention
-----------------------
Make sure to modify the scheduling of ip_cleanup_scheduler in config/sidekiq.yml
to be less than daily if you lower IP_RETENTION_PERIOD below two days (172800).
-----------------------
IP_RETENTION_PERIOD=2592000
SESSION_RETENTION_PERIOD=2592000

اکنون با کلیدهای ctrl+x فایل را ذخیره کرده و به محض درخواست، دکمه Y را بزنید.

برنامه Mastodon به طور پیش فرض، یک آدرس IP را به مدت یک سال حفظ می کند، ولی ما آن را به 30 روز تغییر دادیم. یعنی بر اساس نیاز می توان این مقدار را تغییر داد. البته توجه داشته باشید که این مقدار بیش از دو روز باشد.

حال برای ویرایش فایل database.env را باز کنید:

sudo nano database.env

اکنون باید خطوط زیر را در فایل باز شده درج کنید:

 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:15ff12dcb93aa60680d2aadb4032ee@postgresql: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

سپس، فایل را با زدن کلید ctrl+x و سپس کلید Y ذخیره کنید.

آماده سازی Mastodon

در این بخش باید فایل های استاتیک را برای ارائه توسط Nginx آماده کنید. انجام این مرحله نیز برای بار اولی کمی طول می کشد:

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

اکنون باید لایه داده را بالا بیاورید:

docker compose up -d postgresql redis redis-volatile

با استفاده از دستور زیر محتوای کانتینرها را چک کنید:

watch docker compose ps

منتظر بمانید تا running (healthy) ظاهر شود و سپس ctrl+c را فشار دهید و با استفاده از دستور زیر پایگاه داده را مقدار دهی اولیه کنید:

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

مرحله 5: نصب Nginx

سیستم عامل اوبونتو 22.04 با نسخه قدیمی Nginx عرضه می شود. برای نصب آخرین نسخه، باید مخزن رسمی Nginx را دانلود کنید.

ابتدا کلید امضاء Nginx را وارد کنید:

curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

سپس، مخزن مورد نظر را برای نسخه stable ابزار Nginx اضافه کنید:

echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list

سپس مخازن سیستم را بروز رسانی کرده و با دستور بعدی Nginx را نصب کنید:

sudo apt update

sudo apt install nginx

اکنون می توانید نصب را با دستور زیر شناسایی کنید:

nginx -v
nginx version: nginx/1.22.1

و سپس سرور Nginx را شروع کنید:

sudo systemctl start nginx

در نهایت، وضعیت سرور را بررسی کنید:

sudo systemctl status nginx

مرحله 6: نصب گواهی SSL

برای ایجاد گواهی SSL، ابتدا باید cerstbot را نصب کنید. همچنین می توانید Certbot را با استفاده از مخازن اوبونتو نصب کنید و یا آخرین نسخه را از طریق ابزار snapd، آخرین نسخه را بدست آورید. ما در اینجا از ورژن snapd استفاده خواهیم کرد. البته در اوبونتو snapd به طور پیش فرض نصب شده است. حالا برای اطمینان از بروز بودن snapd دستور زیر را اجرا کنید.

sudo snap install core
sudo snap refresh core

اکنون Certbot را با دستور زیر نصب کنید:

sudo snap install --classic certbot

از دستور زیر استفاده کنید تا مطمئن شوید، دستور Certbot با ایجاد یک لینک نمادین به دایرکتوری user/bin/ اجرا می شود:

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

اکنون برای ایجاد یک گواهی SSL دستور زیر را اجرا کنید:

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

دستور بالا یک گواهی برای etc/letsencrypt/live/mastodon.example.com/ در سرور شما دانلود می کند.

حال باید یک گواهی Diffie-Hellman group ایجاد کنید:

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

برای بررسی درستی تمدید SSL نیز، فرآیند را به صورت dry انجام دهید:

sudo certbot renew --dry-run

اگر با هیچ خطایی مواجه نشدید، یعنی تنظیمات درست بوده است و گواهی شما به طور خودکار تمدید خواهد شد.

مرحله 7: پیکربندی سرور Nginx

ابتدا فایل etc/nginx/nginx.conf/ برای ویرایش باز کنید:

Sudonano / Etc / Ngin x / Ngin x. conf 

حال پیش از خط ;etc/nginx/conf.d/*.conf/ خط زیر را اضافه کنید:

server_names_hash_bucket_size 64;

سپس، طبق روال قبل فایل را بوسیله ctrl+x و زدن کلید Y ذخیره کنید.

فایل /etc/nginx/conf.d/mastodon.conf را برای ویرایش ایجاد کرده و باز کنید:

Sudonano / Etc / Nginx / Konf. d/ma s and don. conf

سپس کدهای زیر را وارد کنید:

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 "";
}

و در نهایت با کلیدهای ctrl+x و سپس Y فایل را ذخیره کنید:

اکنون syntax فایل پیکربندی Nginx را با دستور زیر شناسایی کنید و سپس با دستور بعدی سرور Nginx را مجددا راه اندازی کنید:

sudo nginx -t
sudo systemctl restart nginx

مرحله 8: راه اندازی برنامه Matsodon

ابزار Tootctl CLI ابزاری برای انجام کارهای اداری در Matsodon می باشد و باید آن را در host shell در دسترس قرار دهید.

اکنون باید فایل usr/local/bin/tootctl/ ایجاد کرده و آن را برای ویرایش باز کنید:

sudo nano /usr/local/bin/tootctl

سپس، کد مورد نظر را در آن paste کنید:

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

در آخر نیز از کلیدهای ctrl+x و سپس Y برای ذخیره استفاده کنید.

توجه داشته باشید که فایل ها باید قابلیت اجرایی داشته باشند:

mastodon pghero6
sudo chmod +x /usr/local/bin/tootctl

سرویس فایل Mastodon

شما می توانید از داکر compose ها برای راه اندازی کانتینرهای Mastodon استفاده کنید ولی استفاده از یک فایل واحد systemd آسانتر است. حالا بای سرویس فایل ماستودون را برای ویرایش ایجاد کرده و باز کنید:

Sudonano / et c / sys md / sys m / ma s and don. service

سپس، کد مورد نظر را در آن به صورت زیر درج کنید:

[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

در آخر هم کلیدهای ctrl+x و بعد از آن Y را برای ذخیره فایل بزنید.

برای راه اندازی سرویس فایل deamon سیستم را دوباره بارگیری کنید:

sudo systemctl daemon-reload

اکنون سرویس ماستودون را فعال کرده و راه اندازی کنید:

sudo systemctl enable --now mastodon.service

سپس وضعیت کانتینرهای داکر را بررسی کنید:

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

وقتی وضعیت کانتینرها به حالت running (healthy) تغییر پیدا کرد، با زدن کلید ctrl+c از صفحه خارج شوید. سپس، باید یکادمین ایجاد کنید و رمز عبور ارائه شده را یادداشت برداری کنید:

tootctl accounts create navjot --email [email protected] --confirmed --role Owner
OK
New password: 1338afbe1b4e06e823b6625da80cb537

برای بستن ثبت نام کاربران نیز از دستور زیر پیروی کنید و برای باز کردن دوباره ان دستور بعدی را بکار گیرید:

tootctl settings registrations close
tootctl settings registrations open

راه اندازی بخش search یا همان جستجو

پیش از اینکه بتوانید شاخص های elasticsearch را ایجاد و پر کنید باید یک toot بسازید. به محض اینکه که toot ساخته شد، دستور زیر صادر می شود:

tootctl search deploy

البته ممکن است با خطای زیر مواجه شوید:

/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>'

اگر چنین اتفاقی افتاد، کانتینر sell وب سایت را وارد کنید:

docker exec -it mastodon-website-1 /bin/bash

اکنون دستور زیر را اجرا کنید:

sed -E '/progress.total = /d' -i lib/mastodon/search_cli.rb

برای خروج از کانتینر shell هم Exit را درج کنید:

exit

دوباره دستور deploy elasticsearch را اجرا کنید. گاهی اوقات این دستور ممکن است در زمان دیگری کار کند. این مورد یک موضوع متداول (ongoing issue at Mastodon) در ماستودون می باشد و فعلا هیچ راه حل قطعی برای آن وجود ندارد:

tootctl search deploy

ایجاد سرویس های کمک رسان اضافی

می توانید برای پاک کردن مدیا فایل های دانلود شده، سرویس دیگری ایجاد کنید. پس برای ویرایش یک سرویس پاک کننده مدیای Mastodon ایجاد کرده و باز کنید:

Sudonano / Etc / sys Te md / Sys Te m / Ma s and Donmejiare also. service

سپس کد مورد نظر را به صورت زیر وارد کنید:

[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

در نهایت از کلیدهای ctrl+x و سپس Y برای ذخیره فایل استفاده کنید.

حال اگر می خواهید یک سرویس media removal تنظیم کنید، می توانید یک سرویس تایمر تنظیم کنید:

Sudonano / Etc / Sys Te md / Sys Te m / Ma s and Donmejiare also. Chimera

سپس، کد مورد نظر را paste کنید و سپس برای ذخیره فایل کلیدهای ctrl+x و سپس Y را بزنید:

[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

اکنون باید سرویس تایمر پاسخ دهنده را تنظیم کنید:

Sudonano / et c / sys md / sys m / ma s and don'p rate w_or rds - even. Chimera

حال کد مربوطه را paste کنید و کلیدهای ctrl+x و Y را بزنید:

[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

با دستور زیر system deamon را دوباره بارگیری کنید:

sudo systemctl daemon-reload

اکنون تایمر را فعال کرده و راه اندازی کنید:

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

برای دیدن تنظیمات سرویس های Mastodon تمام تایمرها را لیست کنید:

systemctl list-timers

مرحله دسترسی به ابزار Mastodon

برای دسترسی به نمونه خود از URL https://mastodon.example.com دیدن کنید تا صفحه ای مانند صفحه زیر ببینید:

دسترسی به ابزار Mastodon

در تصویر بالا دو کاربر وجود دارد که یکی از آنها به عنوان مدیر تنظیم شده است. الیته معمولا به این صورت نمی باشد. حتی اگر فقط یک حساب اصلی ایجاد کنید در اولین اجرا و در صفحه اصلی نمایش داده نمی شود. 

mastodon-timeline

برای اینکه به تنظیمات دسترسی پیدا کنید از نوار سمت راست، روی گزینه preference کلیک کنید. از آنجا و از منوی سمت چپ، administration را کلیک کرده و به پنل مدیریت دسترسی پیدا کنید:

پنل ادمین Matsodon

اکنون بر روی گزینه site setting از نوار کناری سمت چپ، کلیک کنید:

مرحله دسترسی به ابزار Mastodon

در این بخش نام کاربری و ایمیل خود را وارد کنید. همچنین، می توانید اطلاعات مختلف دیگری از جمله توضیحات سرور، لوگو و قوانین سرور را برای سفارشی کردن نمونه Mastodon خود پر کنید.

مرحله 9: نگهداری Mastodon

برای بررسی عملکرد و ورودهای انجام شده به نمونه Mastodon خود می توانید به آدرس زیر بروید: https://mastodon.example.com/sidekiq/

در اینجا می توانید فهرستی از تنظیمات و مراحل عملکرد های مربوط به Mastodon را بررسی کنید. همچنین، می توانید فعالیت های رد شده را در بخش Dead و یا Retries و همچنین، میزان مصرف حافظه را مشاهده کنید:

mastodon-sidekiq

با آدرس زیر هم می توانید به میزان سلامت پایگاه داده نمونه خود پی ببرید:

https://mastodon.example.com/pghero/

mastodon-pghero

می توانید از پایگاه داده خود نگهداری کنید، یا پرس و جو های SQL را اجرا کنید و یا شاخص های استفاده نشده را حذف کنید. برای فعال سازی Query statistics می توانید از دکمه Enable در صفحه بالا کلیک کنید و اطلاعات زیر را دریافت کنید.

mastodon query stats info7 7 2

با اجرای دستور زیر می توانید به کاربر root سویچ کنید:

sudo -i su

سپس به دایرکتوری opt/mastodon/database/postgresql/ سویچ کنید:

cd /opt/mastodon/database/postgresql

اکنون فایل postgresql.conf را با دستور زیر باز کنید:

nano postgresql.conf

خط #shared_preload_libraries = ” # را پیدا کنید و با خط زیر جایگزین کنید: (البته برای اعمال تغییر باید راه اندازی مجدد کنید)

shared_preload_libraries = 'pg_stat_statements'

خط زیر را نیز به آخر فایل اضافه کنید و با کلیدهای ctrl+x و سپس Y فایل را ذخیره کنید:

pg_stat_statements.track = all

 حالا می توانید کانتینرهای ماستودون را دوباره راه اندازی کنید:

systemctl restart mastodon.service

اکنون با دستور Exit از root shell خارج شوید:

exit

اگر قصد بررسی صفحه سلامتی پایگاه داده را داشته باشید، می توانید query های کند را می توانید ببینید:

بررسی Matsodon slow queries

نکته: شما می توانید URLهای PgHero و sidekiq را از منوی Preferences راه اندازی کنید. 

اگر به هر دلیلی سایت شما کار نکرد، می توانید ورودهایی (logs) که توسط داکر ایجاد شده بررسی کنید.

docker logs <container-name>

مرحله 10: قابلیت بکاپ گیری در Mastodon

ما در آموزش خود از یک ابزار شخص ثالث به نام Restic برای بکاپ ماستودون استفاده کرده ایم. اولین قدم برای تهیه بکاپ به وسیله Restic این است که همه فایل ها و دایرکتوری ها به لیست مخزن اضافه کنید.

اکنون فایل لیست مخزن را با دستور زیر برای ویرایش، ایجاد کرده و باز کنید:

sudo nano /opt/mastodon/backup-files

سپس، موارد زیر را وارد کنید:

/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

طبق روال قبل، با استفاده از ctrl+x و سپس کلید Y فایل را ذخیره کنید:

حال برای نصب Restic از دستور زیر استفاده کنید:

sudo apt install restic

یک مخزن بکاپ و یک بکاپ اولیه ایجاد کنید. در اینجا ما د حال بکاپ گیری از اطلاعات خود در سرویس 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

اکنون یک تایمر سرویس بکاپ برای Mastodon ایجاد کرده و آ را برای ویرایش باز کنید:

Sudonano / et c / sys md / sys m / ma s and donba cp. Chimera

حال کدهای زیر را در آن وارد کنید:

[Unit]
Description=Schedule a mastodon backup every hour

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

[Install]
WantedBy=timers.target

اکنون با زدن کلیدهای ctrl+x و سپس Y فایل را ذخیره کنید.

سپس، یک سرویس فایل بکاپ از Mastodon ایجاد کرده و برای ویرایش باز کنید و در نهایت موارد درج شده در پایین را اضافه کنید:

Sudonano / et c / sys md / sys m / ma s and donba cp. Service
[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

در آخر نیز، با کلیدهای ctrl+x و سپس Y فایل را ذخیره کنید.

در مرحله بعد فایل /opt/mastodon/mastodon-backup را برای ویرایش ایجاد کرده و باز کنید. توجه داشته باشید که این قسمت دستورات اصلی بکاپ را در بر می گیرد:

sudo nano /opt/mastodon/mastodon-backup

حال کدهای زیر را وارد کنید:

#!/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

سپس با کلیدهای ctrl+x و سپس Y فایل را ذخیره کنید. و پس از آن امتیازات اجرایی به اسکریپت بکاپ بدهید:

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

deamon سرویس را مجددا بارگذاری کرده و بکاپ سرویس و تایمر را شروع کنید:

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

دسترسی به بکاپ های ساعتی را تایید کنید و دستور زیر را به این منظور اجرا کنید:

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

مرحله 11: ارتقاء ماستودون

ارتقاء این شبکه اجتماعی مراحل مختلفی دارد. اول از همه باید به دایرکتوری سویچ کنید:

cd /opt/mastodon

با دستور زیر، جدیدترین تصاویر کانتینر را برای برنامه Mastodon بکشید:

docker compose pull

اگر تمایل داشته باشید می توانید با دستور docker-compose.yml هر تغییری که می خواهید انجام دهید:

اکنون تمام انتقالات پایگاه داه را انجام دهید:

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

سپس،کپی فایل های استاتیک خود را اپدیت کنید:

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

با دستور زیر می توانید کانتینرهای ماستودون را مجددا راه اندازی کنید:

sudo systemctl restart mastodon.service

دستور العمل هایی که در بالا آمده، دستورالعمل های عمومی بروز رسانی هستند. بنابراین، همیشه صفحه انتشار گیت هاب GitHub Mastodon را بررسی کنید تا به دنبال عملیات و دستورات بروز رسانی خاص در بین نسخه ها باشید تا مطمئن شوید همه چیز به خوبی پیش می رود.  

چنانچه قصد دارید نحوه نصب شبکه اجتماعی Mastodon به وسیله داکر در اوبونتو 22.04 تست کنید ولی دسترسی به سرور مجازی ندارید می توانید با خرید سرور مجازی ارزان آذرسیس با سیستم عامل اوبونتو و سایر توزیع ها تست کنید و قابلیت های جذاب شبکه اجتماعی Mastodon  بهرمند شوید.

سخن آخر

ما در این مقاله سعی بر این داشتیم تا شما را با شبکه اجتماعی Mastodon و نحوه نصب آن به طور مفصل در سیستم عامل اوبونتو آشنا کنیم. زیرا این نرم افزار یک نرم افزار کاربردی برای تعامل کاربران در سیستم می باشد. امیدواریم مطالب فوق برای شما نیز مفید واقع شده باشد. در صورت داشتن سوال می توانید از بخش نظرات با ما در ارتباط باشید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *