
شبکه های اجتماعی از لحظ کارکردی که بین کاربران دارند، محبوبیت زیادی به دست آورده اند و تعامل را بین افراد آسان می کنند. شبکه اجتماعی 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 برای ذخیره استفاده کنید.
توجه داشته باشید که فایل ها باید قابلیت اجرایی داشته باشند:

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 دیدن کنید تا صفحه ای مانند صفحه زیر ببینید:
در تصویر بالا دو کاربر وجود دارد که یکی از آنها به عنوان مدیر تنظیم شده است. الیته معمولا به این صورت نمی باشد. حتی اگر فقط یک حساب اصلی ایجاد کنید در اولین اجرا و در صفحه اصلی نمایش داده نمی شود.
برای اینکه به تنظیمات دسترسی پیدا کنید از نوار سمت راست، روی گزینه preference کلیک کنید. از آنجا و از منوی سمت چپ، administration را کلیک کرده و به پنل مدیریت دسترسی پیدا کنید:
اکنون بر روی گزینه site setting از نوار کناری سمت چپ، کلیک کنید:
در این بخش نام کاربری و ایمیل خود را وارد کنید. همچنین، می توانید اطلاعات مختلف دیگری از جمله توضیحات سرور، لوگو و قوانین سرور را برای سفارشی کردن نمونه Mastodon خود پر کنید.
مرحله 9: نگهداری Mastodon
برای بررسی عملکرد و ورودهای انجام شده به نمونه Mastodon خود می توانید به آدرس زیر بروید: https://mastodon.example.com/sidekiq/
در اینجا می توانید فهرستی از تنظیمات و مراحل عملکرد های مربوط به Mastodon را بررسی کنید. همچنین، می توانید فعالیت های رد شده را در بخش Dead و یا Retries و همچنین، میزان مصرف حافظه را مشاهده کنید:
با آدرس زیر هم می توانید به میزان سلامت پایگاه داده نمونه خود پی ببرید:
https://mastodon.example.com/pghero/
می توانید از پایگاه داده خود نگهداری کنید، یا پرس و جو های SQL را اجرا کنید و یا شاخص های استفاده نشده را حذف کنید. برای فعال سازی Query statistics می توانید از دکمه Enable در صفحه بالا کلیک کنید و اطلاعات زیر را دریافت کنید.

با اجرای دستور زیر می توانید به کاربر 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 های کند را می توانید ببینید:
نکته: شما می توانید 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 و نحوه نصب آن به طور مفصل در سیستم عامل اوبونتو آشنا کنیم. زیرا این نرم افزار یک نرم افزار کاربردی برای تعامل کاربران در سیستم می باشد. امیدواریم مطالب فوق برای شما نیز مفید واقع شده باشد. در صورت داشتن سوال می توانید از بخش نظرات با ما در ارتباط باشید.