Cách cài đặt Mastodon Social Network với Docker trên Ubuntu 22.04 LTS

theanh

Administrator
Nhân viên
Mastodon là một mạng xã hội miễn phí, phi tập trung và mã nguồn mở. Nó được tạo ra như một giải pháp thay thế cho Twitter. Giống như Twitter, mọi người có thể theo dõi nhau và đăng tin nhắn, hình ảnh và video. Nhưng không giống như Twitter, không có kho lưu trữ hoặc thẩm quyền trung tâm nào cho nội dung.

Thay vào đó, Mastodon hoạt động trên hàng nghìn máy chủ khác nhau, mỗi máy chủ do nhiều thành viên khác nhau trong cộng đồng điều hành. Người dùng đã đăng ký trên một máy chủ có thể dễ dàng kết nối với người dùng trên mạng khác và theo dõi nhau trên các phiên bản.

Bất kỳ ai cũng có thể cài đặt phiên bản máy chủ Mastodon của họ. Hướng dẫn này sẽ hướng dẫn bạn cách thiết lập phiên bản Mastodon của mình trên máy chủ có Ubuntu 22.04 bằng Docker. Docker giúp bạn dễ dàng cài đặt Mastodon bằng cách chứa tất cả các gói và dịch vụ cần thiết trong các vùng chứa.

Điều kiện tiên quyết​


  • Một máy chủ chạy Ubuntu 22.04 với tối thiểu 2 lõi CPU và 2GB bộ nhớ. Bạn sẽ cần nâng cấp máy chủ theo yêu cầu.

  • Người dùng không phải root có quyền sudo.

  • Tên miền đủ điều kiện (FQDN) trỏ đến máy chủ của bạn. Đối với mục đích của chúng tôi, chúng tôi sẽ sử dụng mastodon.example.com làm tên miền.

  • Mastodon gửi thông báo qua email cho người dùng. Chúng tôi khuyên bạn nên sử dụng dịch vụ thư giao dịch của bên thứ 3 như Mailgun, Sendgrid, Amazon SES hoặc Sparkpost. Hướng dẫn trong hướng dẫn sẽ sử dụng Amazon SES.

  • Đảm bảo mọi thứ đều được cập nhật.
Mã:
$ sudo apt update
[*]
Cài đặt các gói tiện ích cơ bản. Một số trong số chúng có thể đã được cài đặt.
Mã:
$ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y

Bước 1 - Cấu hình Tường lửa​

Bước đầu tiên là cấu hình tường lửa. Ubuntu đi kèm với ufw (Uncomplicated Firewall) theo mặc định.

Kiểm tra xem tường lửa có đang chạy không.
Mã:
$ sudo ufw status
Bạn sẽ nhận được kết quả sau.
Mã:
Status: inactive
Cho phép cổng SSH để tường lửa không làm gián đoạn kết nối hiện tại khi bật nó.
Mã:
$ sudo ufw allow OpenSSH
Cho phép cả cổng HTTP và HTTPS.
Mã:
$ sudo ufw allow http
$ sudo ufw allow https
Kích hoạt Tường lửa
Mã:
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
Kiểm tra lại trạng thái của tường lửa.
Mã:
$ sudo ufw status
Bạn sẽ thấy trạng thái tương tự đầu ra.
Mã:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443 ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)

Bước 2 - Cài đặt Docker và Docker Compose​

Ubuntu 22.04 đi kèm với phiên bản Docker cũ hơn. Để cài đặt phiên bản mới nhất, trước tiên, hãy nhập khóa GPG của Docker.
Mã:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
Tạo kho lưu trữ Docker tập tin.
Mã:
$ 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
Cập nhật danh sách kho lưu trữ hệ thống.
Mã:
$ sudo apt update
Cài đặt phiên bản mới nhất của Docker.
Mã:
$ sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
Xác minh rằng nó đang chạy.
Mã:
$ sudo systemctl status docker
? docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2022-12-30 15:55:17 UTC; 29min ago
TriggeredBy: ? docker.socket Docs: https://docs.docker.com Main PID: 1966 (dockerd) Tasks: 8 Memory: 20.8M CPU: 740ms CGroup: /system.slice/docker.service ??1966 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Theo mặc định, Docker yêu cầu quyền root. Nếu bạn muốn tránh sử dụng sudo mỗi khi bạn chạy lệnh docker, hãy thêm tên người dùng của bạn vào docker nhóm.
Mã:
$ sudo usermod -aG docker $(whoami)
Bạn sẽ cần phải đăng xuất khỏi máy chủ và đăng nhập lại với cùng một người dùng để kích hoạt thay đổi này hoặc sử dụng lệnh sau.
Mã:
$ su - ${USER}
Xác nhận rằng người dùng của bạn đã được thêm vào nhóm Docker.
Mã:
$ groups
navjot wheel docker

Bước 3 - Chuẩn bị cài đặt​

Giới hạn mặc định của số lượng mmap rất thấp đối với Elasticsearch. Chạy lệnh sau để kiểm tra giá trị mặc định.
Mã:
$ sysctl vm.max_map_count
Bạn sẽ nhận được kết quả đầu ra sau.
Mã:
vm.max_map_count = 65530
Tăng giá trị bằng cách sử dụng lệnh sau lệnh.
Mã:
$ 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

Bước 4 - Cài đặt Mastodon​

Tạo thư mục và thiết lập quyền sở hữu​

Tạo thư mục cho Mastodon và các dịch vụ liên quan.
Mã:
$ sudo mkdir -p /opt/mastodon/database/{postgresql,pgbackups,redis,elasticsearch}
$ sudo mkdir -p /opt/mastodon/web/{public,system}
$ sudo mkdir -p /opt/mastodon/branding
Thiết lập đúng quyền sở hữu đối với các thư mục Elasticsearch, web và sao lưu.
Mã:
$ sudo chown 991:991 /opt/mastodon/web/{public,system}
$ sudo chown 1000 /opt/mastodon/database/elasticsearch
$ sudo chown 70:70 /opt/mastodon/database/pgbackups
Chuyển sang thư mục Mastodon.
Mã:
$ cd /opt/mastodon

Tạo môi trường và các tệp docker compose​

Tạo các tệp môi trường cho ứng dụng và cơ sở dữ liệu.
Mã:
$ sudo touch application.env database.env
Tạo và mở tệp Docker compose để chỉnh sửa.
Mã:
$ sudo nano docker-compose.yml
Dán mã sau vào đó.
Mã:
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
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Tại thời điểm viết hướng dẫn, phiên bản mới nhất có sẵn của Mastodon là v4.0.2. Kiểm tra trang Mastodon GitHub Releases và điều chỉnh phiên bản trong tệp Docker compose cho phù hợp. Chúng tôi cũng đang sử dụng các phiên bản mới nhất của PostgreSQL và Redis. Bạn có thể điều chỉnh chúng theo yêu cầu của mình. Hiện tại, chúng tôi đang sử dụng Elasticsearch 7.x. Không có phiên bản chính nào của Elasticsearch mà bạn có thể theo dõi trên trang Docker Hub, vì vậy bạn sẽ phải tiếp tục cập nhật thủ công để có các bản cập nhật bảo mật liên quan đến Java.

Tạo Application Secret​

Bước tiếp theo là tạo các giá trị application secret.

Tạo SECRET_KEY_BASEOTP_SECRET bằng cách chạy lệnh sau hai lần. Lần đầu tiên sẽ mất một thời gian vì nó sẽ kéo các hình ảnh.
Mã:
$ docker compose run --rm shell bundle exec rake secret
Bạn cũng có thể sử dụng tiện ích openssl cho tương tự.
Mã:
$ openssl rand -hex 64
Tạo VAPID_PRIVATE_KEYVAPID_PUBLIC_KEY giá trị bằng cách sử dụng lệnh sau.
Mã:
$ docker compose run --rm shell bundle exec rake mastodon:webpush:generate_vapid_key
Bạn sẽ nhận được kết quả tương tự.
Mã:
VAPID_PRIVATE_KEY=u2qsCs5JdmdmMLnUuU0sgmFGvZedteJz-lFB_xF4_ac=
VAPID_PUBLIC_KEY=BJXjE2hIXvFpo6dnHqyf1i-2PcP-cBoL95UCmhhxwlAgtFw_vnrYp4GBneR7_cmI9LZUYjHFh-TBAPSb9WTqH9A=
Sử dụng tiện ích openssl để tạo PostgreSQL và Elasticsearch mật khẩu.
Mã:
$ openssl rand -hex 15

Tệp Môi trường Mastodon​

Mở tệp application.env để chỉnh sửa.
Mã:
$ sudo nano application.env
Dán các dòng sau vào đó.
Mã:
# 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
[emailprotected]
# 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
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Chúng tôi đã bật dịch vụ gửi thư Amazon SES. Nếu bạn không cần, bạn có thể xóa phần đó. Theo mặc định, Mastodon giữ lại địa chỉ IP trong 1 năm, nhưng chúng tôi đã thay đổi thành 30 ngày (2592000 giây). Bạn có thể thay đổi tùy theo yêu cầu của mình. Hãy đảm bảo giữ nó trong hơn 2 ngày, nếu không, bạn sẽ cần phải mày mò thêm một chút, điều này nằm ngoài phạm vi hướng dẫn của chúng tôi.

Mở tệp database.env để chỉnh sửa.
Mã:
$ sudo nano database.env
Dán các dòng sau vào nó.
Mã:
# 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
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Chuẩn bị Mastodon​

Chuẩn bị các tệp tĩnh để Nginx phục vụ. Bước này sẽ mất một chút thời gian vì Docker sẽ kéo tất cả hình ảnh lần đầu tiên.
Mã:
$ docker compose run --rm shell bash -c "cp -r /opt/mastodon/public/* /static/"
Mở lớp dữ liệu.
Mã:
$ docker compose up -d postgresql redis redis-volatile
Kiểm tra trạng thái của container.
Mã:
$ watch docker compose ps
Đợi running (healthy), sau đó nhấn Ctrl + C và khởi tạo cơ sở dữ liệu bằng lệnh sau.
Mã:
$ docker compose run --rm shell bundle exec rake db:setup

Bước 5 - Cài đặt Nginx​

Ubuntu 22.04 đi kèm với phiên bản Nginx cũ hơn. Để cài đặt phiên bản mới nhất, bạn cần tải xuống kho lưu trữ Nginx chính thức.

Nhập khóa ký của Nginx.
Mã:
$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \	| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
Thêm kho lưu trữ cho phiên bản ổn định của Nginx.
Mã:
$ 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
Cập nhật kho lưu trữ hệ thống.
Mã:
$ sudo apt update
Cài đặt Nginx.
Mã:
$ sudo apt install nginx
Xác minh cài đặt.
Mã:
$ nginx -v
nginx version: nginx/1.22.1
Khởi động máy chủ Nginx.
Mã:
$ sudo systemctl start nginx
Kiểm tra trạng thái của server.
Mã:
$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: active (running) since Sat 2022-12-31 02:23:12 UTC; 6s ago Docs: https://nginx.org/en/docs/ Process: 22129 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS) Main PID: 22130 (nginx) Tasks: 3 (limit: 4575) Memory: 2.5M CPU: 17ms CGroup: /system.slice/nginx.service ??22130 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf" ??22131 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ??22132 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""

Bước 6 - Cài đặt SSL​

Chúng ta cần cài đặt Certbot để tạo chứng chỉ SSL. Bạn có thể cài đặt Certbot bằng kho lưu trữ của Ubuntu hoặc tải phiên bản mới nhất bằng công cụ Snapd. Chúng ta sẽ sử dụng phiên bản Snapd.

Ubuntu 22.04 đi kèm với Snapd được cài đặt theo mặc định. Chạy các lệnh sau để đảm bảo rằng phiên bản Snapd của bạn được cập nhật. Đảm bảo rằng phiên bản Snapd của bạn được cập nhật.
Mã:
$ sudo snap install core
$ sudo snap refresh core
Cài đặt Certbot.
Mã:
$ sudo snap install --classic certbot
Sử dụng lệnh sau để đảm bảo rằng lệnh Certbot chạy bằng cách tạo liên kết tượng trưng đến /usr/bin thư mục.
Mã:
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Chạy lệnh sau để tạo SSL Chứng chỉ.
Mã:
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [emailprotected] -d mastodon.example.com
Lệnh trên sẽ tải chứng chỉ xuống thư mục /etc/letsencrypt/live/mastodon.example.com trên máy chủ của bạn.

Tạo nhóm Diffie-Hellman chứng chỉ.
Mã:
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
Để kiểm tra xem quá trình gia hạn SSL có hoạt động tốt không, hãy chạy thử quy trình.
Mã:
$ sudo certbot renew --dry-run
Nếu không thấy lỗi nào, bạn đã hoàn tất. Chứng chỉ của bạn sẽ tự động gia hạn.

Bước 7 - Cấu hình Nginx​

Mở tệp /etc/nginx/nginx.conf để chỉnh sửa.
Mã:
$ sudo nano /etc/nginx/nginx.conf
Thêm dòng sau vào trước dòng include /etc/nginx/conf.d/*.conf;.
Mã:
server_names_hash_bucket_size 64;
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Tạo và mở tệp /etc/nginx/conf.d/mastodon.conf để chỉnh sửa.
Mã:
$ sudo nano /etc/nginx/conf.d/mastodon.conf
Dán mã sau vào đó.
Mã:
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 "";
}
Sau khi hoàn tất, hãy lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Xác minh cú pháp tệp cấu hình Nginx.
Mã:
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Khởi động lại Nginx máy chủ.
Mã:
$ sudo systemctl restart nginx

Bước 8 - Khởi động Mastodon​

Công cụ Tootctl CLI​

Công cụ Tootctl CLI được sử dụng để thực hiện các tác vụ quản trị trên Mastodon. Chúng ta cần làm cho nó có thể truy cập được trên shell máy chủ.

Tạo tệp /usr/local/bin/tootctl và mở tệp đó để chỉnh sửa.
Mã:
$ sudo nano /usr/local/bin/tootctl
Dán mã sau vào đó.
Mã:
#!/bin/bash
docker compose -f /opt/mastodon/docker-compose.yml run --rm shell tootctl "$@"
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Cấp quyền thực thi cho tệp.
Mã:
$ sudo chmod +x /usr/local/bin/tootctl

Dịch vụ Mastodon Tệp​

Bạn có thể khởi động các container Mastodon bằng lệnh Docker compose nhưng sẽ dễ dàng hơn nếu thực hiện thông qua tệp đơn vị systemd.

Tạo và mở tệp dịch vụ Mastodon để chỉnh sửa.
Mã:
$ sudo nano /etc/systemd/system/mastodon.service
Dán mã sau vào đó.
Mã:
[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
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Tải lại daemon hệ thống để khởi tạo tệp dịch vụ.
Mã:
$ sudo systemctl daemon-reload
Bật và khởi động dịch vụ Mastodon.
Mã:
$ sudo systemctl enable --now mastodon.service
Kiểm tra trạng thái của Docker container.
Mã:
$ watch docker compose -f /opt/mastodon/docker-compose.yml ps
Khi trạng thái của container thay đổi thành running (healthy), thoát khỏi màn hình bằng cách nhấn Ctrl + C.

Tạo người dùng quản trị cho Mastodon và ghi lại mật khẩu đã cung cấp.
Mã:
$ tootctl accounts create navjot --email [emailprotected] --confirmed --role Owner
OK
New password: 1338afbe1b4e06e823b6625da80cb537
Nếu bạn muốn đóng đăng ký người dùng, hãy sử dụng lệnh sau.
Mã:
$ tootctl settings registrations close
Để mở lại đăng ký, hãy đưa ra lệnh sau lệnh.
Mã:
$ tootctl settings registrations open

Khởi tạo Tìm kiếm​

Bạn sẽ cần phải thực hiện lệnh toot trước khi có thể tạo và điền thông tin vào chỉ mục Elasticsearch. Sau khi bạn đã thực hiện một cú đánh, hãy đưa ra lệnh sau.
Mã:
$ tootctl search deploy
Bạn có thể gặp lỗi sau.
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 `'
Trong trường hợp này, hãy nhập vùng chứa trang web shell.
Mã:
$ docker exec -it mastodon-website-1 /bin/bash
Chạy lệnh sau.
Mã:
$ sed -E '/progress.total = /d' -i lib/mastodon/search_cli.rb
Thoát khỏi container shell.
Mã:
$ exit
Chạy lại lệnh triển khai Elasticsearch. Đôi khi lệnh có thể hoạt động sau đó. Đây là vấn đề đang diễn ra tại Mastodon, do đó hiện tại không có cách khắc phục chắc chắn nào.
Mã:
$ tootctl search deploy

Dịch vụ trợ giúp bổ sung​

Chúng ta hãy tạo một dịch vụ khác để xóa các tệp phương tiện đã tải xuống.

Tạo và mở dịch vụ xóa phương tiện Mastodon để chỉnh sửa.
Mã:
$ sudo nano /etc/systemd/system/mastodon-media-remove.service
Dán mã sau vào đó.
Mã:
[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
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Nếu bạn muốn lên lịch xóa phương tiện, bạn có thể thiết lập dịch vụ hẹn giờ cho việc này.
Mã:
$ sudo nano /etc/systemd/system/mastodon-media-remove.timer
Dán mã sau.
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
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Bạn có thể thiết lập dịch vụ khác để xóa thẻ xem trước Rich được tạo bằng Thẻ OpenGraph.
Mã:
$ sudo nano /etc/systemd/system/mastodon-preview_cards-remove.service
Dán mã sau.
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
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Đặt bộ đếm thời gian tương ứng dịch vụ.
Mã:
$ sudo nano /etc/systemd/system/mastodon-preview_cards-remove.timer
Dán mã sau.
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
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Tải lại hệ thống daemon.
Mã:
$ sudo systemctl daemon-reload
Bật và bắt đầu bộ hẹn giờ.
Mã:
$ sudo systemctl enable --now mastodon-preview_cards-remove.timer
$ sudo systemctl enable --now mastodon-media-remove.timer
Liệt kê tất cả các bộ hẹn giờ để kiểm tra lịch trình của Mastodon dịch vụ.
Mã:
$ systemctl list-timers
.....
Sat 2023-01-07 00:00:00 UTC 6 days left n/a n/a mastodon-media-remove.timer mastodon-media-remove.service
Sat 2023-01-07 00:00:00 UTC 6 days left n/a n/a mastodon-preview_cards-remove.timer mastodon-preview_cards-remove.service

Truy cập Mastodon​

Truy cập URL https://mastodon.example.com để truy cập phiên bản của bạn và bạn sẽ thấy một trang tương tự.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22598%22%3E%3C/svg%3E


Trong ảnh chụp màn hình ở trên, bạn có thể thấy có 2 người dùng và 1 trong số họ (tôi) được đặt làm quản trị viên. Thông thường thì không phải vậy. Ngay cả khi bạn tạo tài khoản quản trị viên, tài khoản đó cũng không hiển thị trên trang chính khi chạy lần đầu. Để thực hiện điều đó, hãy đăng nhập vào phiên bản của bạn và bạn sẽ được đưa đến trang sau.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22646%22%3E%3C/svg%3E


Nhấp vào tùy chọn Tùy chọn từ thanh bên phải để truy cập cài đặt. Từ đó, nhấp vào tùy chọn Quản trị từ menu bên trái để truy cập bảng quản trị của Mastodon.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22626%22%3E%3C/svg%3E


Nhấp vào tùy chọn Cài đặt trang web từ thanh bên trái.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22439%22%3E%3C/svg%3E


Tại đây, hãy điền tên người dùng liên hệ và email công việc của bạn, thông tin này sẽ được phản ánh trên trang chủ của máy chủ. Ngoài ra, hãy điền nhiều thông tin khác bao gồm mô tả máy chủ, logo và quy tắc máy chủ để tùy chỉnh phiên bản Mastodon của bạn.

Bước 9 - Bảo trì Mastodon​

Để xem hiệu suất và nhật ký của phiên bản Mastodon, hãy truy cập https://mastodon.example.com/sidekiq/.

Tại đây, bạn có thể xem danh sách các quy trình khác nhau và các tác vụ theo lịch trình liên quan đến phiên bản Mastodon của bạn. Bạn cũng có thể kiểm tra các tác vụ không thành công trong phần Đã chết hoặc Thử lại. Nó cũng sẽ cho bạn biết mức sử dụng bộ nhớ của phiên bản của bạn.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22508%22%3E%3C/svg%3E


Bạn có thể kiểm tra tình trạng cơ sở dữ liệu của phiên bản của bạn từ https://mastodon.example.com/pghero/.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22409%22%3E%3C/svg%3E


Bạn có thể thực hiện bảo trì cơ sở dữ liệu, chạy truy vấn SQL và xóa các chỉ mục không sử dụng. Để bật thống kê truy vấn, hãy nhấp vào nút Bật trên trang ở trên và bạn sẽ nhận được thông tin sau.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22552%22%20height=%22210%22%3E%3C/svg%3E


Chuyển sang người dùng gốc.
Mã:
$ sudo -i su
Chuyển sang /opt/mastodon/database/postgresql thư mục.
Mã:
$ cd /opt/mastodon/database/postgresql
Mở postgresql.conf tệp.
Mã:
$ nano postgresql.conf
Tìm dòng #shared_preload_libraries = '' # (change requires restart) và thay thế bằng dòng sau.
Mã:
shared_preload_libraries = 'pg_stat_statements'
Thêm dòng sau vào cuối tệp.
Mã:
pg_stat_statements.track = all
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Khởi động lại các thùng chứa Mastodon.
Mã:
$ systemctl restart mastodon.service
Thoát khỏi gốc shell.
Mã:
$ exit
Nếu bạn kiểm tra trang tình trạng cơ sở dữ liệu, bạn có thể xem hiện tại có bất kỳ truy vấn chậm nào không.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22304%22%3E%3C/svg%3E


Lưu ý: Bạn cũng có thể khởi chạy URL PgHero và Sidekiq từ Tùy chọn menu.

Nếu trang web của bạn không tải vì lý do nào đó, bạn có thể kiểm tra nhật ký do Docker tạo ra.
Mã:
$ docker logs

Bước 10 - Sao lưu Mastodon​

Chúng tôi sẽ sử dụng một công cụ của bên thứ 3 có tên là Restic để sao lưu Mastodon. Bước đầu tiên để sao lưu bằng Restic là thêm tất cả các tệp và thư mục vào danh sách kho lưu trữ.

Tạo và mở tệp danh sách kho lưu trữ để chỉnh sửa.
Mã:
$ sudo nano /opt/mastodon/backup-files
Dán các dòng sau vào đó.
Mã:
/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
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Cài đặt Restic.
Mã:
$ sudo apt install restic
Tạo kho lưu trữ sao lưu và tạo bản sao lưu ban đầu. Chúng tôi đang sao lưu dữ liệu của mình vào dịch vụ S3.
Mã:
$ 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
Tạo bộ đếm thời gian dịch vụ sao lưu Mastodon và mở để chỉnh sửa.
Mã:
$ sudo nano /etc/systemd/system/mastodon-backup.timer
Dán mã sau vào nó.
Mã:
[Unit]
Description=Schedule a mastodon backup every hour
[Timer]
Persistent=true
OnCalendar=*:00:00
Unit=mastodon-backup.service
[Install]
WantedBy=timers.target
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Tạo tệp dịch vụ sao lưu Mastodon và mở tệp đó để chỉnh sửa.
Mã:
$ sudo nano /etc/systemd/system/mastodon-backup.service
Dán mã sau vào nó.
Mã:
[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
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Tiếp theo, tạo và mở tệp /opt/mastodon/mastodon-backup để chỉnh sửa. Nội dung này chứa các lệnh sao lưu thực tế.
Mã:
$ sudo nano /opt/mastodon/mastodon-backup
Dán mã sau vào đó.
Mã:
#!/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
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Cấp quyền thực thi cho bản sao lưu script.
Mã:
$ sudo chmod +x /opt/mastodon/mastodon-backup
Tải lại daemon dịch vụ và khởi động dịch vụ sao lưu và bộ đếm thời gian.
Mã:
$ sudo systemctl daemon-reload
$ sudo systemctl enable --now mastodon-backup.service
$ sudo systemctl enable --now mastodon-backup.timer
Xác nhận rằng các bản sao lưu hàng giờ đang diễn ra và có thể truy cập được bằng cách sử dụng lệnh sau lệnh.
Mã:
$ restic -r s3:https://$SERVER:$PORT/mybucket snapshots
$ restic -r s3:https://$SERVER:$PORT/mybucket mount /mnt

Bước 11 - Nâng cấp Mastodon​

Việc nâng cấp Mastodon cần thực hiện một số bước. Đầu tiên, chuyển sang thư mục.
Mã:
$ cd /opt/mastodon
Kéo hình ảnh container mới nhất cho Mastodon.
Mã:
$ docker compose pull
Thực hiện bất kỳ thay đổi nào trong docker-compose.yml nếu bạn muốn.

Thực hiện tất cả các lần di chuyển cơ sở dữ liệu.
Mã:
$ docker compose run --rm shell bundle exec rake db:migrate
Cập nhật các bản sao tĩnh của bạn tệp.
Mã:
$ docker compose run --rm shell bash -c "cp -r /opt/mastodon/public/* /static/"
Khởi động lại các thùng chứa Mastodon.
Mã:
$ sudo systemctl restart mastodon.service
Các hướng dẫn trên là hướng dẫn cập nhật chung. Luôn kiểm tra trang phát hành GitHub của Mastodon để tìm kiếm bất kỳ tác vụ cập nhật và lệnh cụ thể nào giữa các phiên bản để đảm bảo mọi thứ diễn ra suôn sẻ.

Kết luận​

Bài hướng dẫn về cách cài đặt Mastodon Social Network bằng Docker trên máy chủ Ubuntu 22.04 của chúng tôi đã kết thúc. Nếu bạn có bất kỳ câu hỏi nào, hãy đăng chúng trong phần bình luận bên dưới.
 
Back
Bên trên