Ինչպես տեղադրել Mastodon սոցիալական ցանցը Debian 12-ում


Այս ձեռնարկը գոյություն ունի ՕՀ-ի այս տարբերակների համար

  • Debian 12 (Գիրքորդ)
  • Debian 11 (Bullseye)
  • Debian 10 (Buster)

Այս էջում

  1. Նախադրյալներ
  2. Քայլ 1 - Կարգավորել Firewall-ը
  3. Քայլ 2 - Տեղադրեք Docker-ը և Docker Compose-ը
  4. Քայլ 3 - Նախապատրաստում տեղադրմանը
  5. Քայլ 4 - Տեղադրեք Mastodon-ը

    1. Ստեղծեք դիրեկտորիաներ և սահմանեք սեփականության իրավունքներ
    2. Ստեղծեք միջավայր և դոկերի ֆայլեր
    3. Ստեղծեք հավելվածի գաղտնիքները
    4. Mastodon շրջակա միջավայրի ֆայլեր
    5. Պատրաստել Mastodon
  6. Քայլ 5 - Տեղադրեք Nginx
  7. Քայլ 6 - Տեղադրեք SSL-ը
  8. Քայլ 7 - Կարգավորեք Nginx-ը
  9. Քայլ 8 - Սկսեք Mastodon-ը

    1. Tootctl CLI գործիք
    2. Mastodon ծառայության ֆայլը
    3. Նախաձեռնել որոնումը
    4. Լրացուցիչ օգնական ծառայություններ
    5. Մուտք գործեք Mastodon
  10. Քայլ 9 - Mastodon Maintenance
  11. Քայլ 10 - Կրկնօրինակեք Mastodon
  12. Քայլ 11 - Թարմացրեք Mastodon-ը
  13. Եզրակացություն

Mastodon-ը անվճար, ապակենտրոնացված և բաց կոդով սոցիալական ցանց է: Այն ստեղծվել է որպես Twitter-ի այլընտրանք։ Ճիշտ այնպես, ինչպես Twitter-ի մարդիկ կարող են հետևել միմյանց և տեղադրել հաղորդագրություններ, պատկերներ և տեսանյութեր: Բայց ի տարբերություն Twitter-ի, բովանդակության համար կենտրոնական խանութ կամ լիազորություն չկա:

Փոխարենը, Mastodon-ը գործում է հազարավոր տարբեր սերվերների վրա, որոնցից յուրաքանչյուրը ղեկավարվում է համայնքի տարբեր անդամների կողմից: Մեկ սերվերի վրա գրանցված օգտատերերը կարող են հեշտությամբ միանալ մյուս ցանցի օգտատերերին և հետևել միմյանց տարբեր ատյաններում:

Յուրաքանչյուրը կարող է տեղադրել Mastodon սերվերի իր օրինակը: Այս ձեռնարկը կսովորեցնի ձեզ, թե ինչպես կարգավորել Mastodon-ի ձեր օրինակը Debian 12 սերվերի վրա՝ օգտագործելով Docker-ը: Docker-ը հեշտացնում է Mastodon-ի տեղադրումը` պարունակելով բեռնարկղերում պահանջվող բոլոր փաթեթներն ու ծառայությունները:

Նախադրյալներ

    Debian 12-ով աշխատող սերվեր՝ նվազագույնը 2 CPU միջուկով և 2 ԳԲ հիշողությամբ: Դուք պետք է թարմացնեք սերվերը ըստ պահանջների:

    Ոչ արմատային օգտատեր՝ sudo արտոնություններով:

    Լիովին որակավորված տիրույթի անուն (FQDN), որը ցույց է տալիս ձեր սերվերը: Մեր նպատակների համար մենք կօգտագործենք mastodon.example.com որպես տիրույթի անուն:

    Mastodon-ը էլեկտրոնային փոստով ծանուցումներ է ուղարկում օգտատերերին: Մենք խորհուրդ ենք տալիս օգտագործել երրորդ կողմի գործարքային փոստային ծառայություն, ինչպիսին է Mailgun, SendGrid, Amazon SES կամ Sparkpost: Ուղեցույցի հրահանգները կօգտագործվեն Amazon SES-ի միջոցով:

    Համոզվեք, որ ամեն ինչ թարմացվում է:

    $ sudo apt update
    

    Տեղադրեք հիմնական կոմունալ փաթեթներ: Դրանցից մի քանիսը կարող են արդեն տեղադրված լինել:

    $ sudo apt install curl wget nano software-properties-common dirmngr apt-transport-https ca-certificates lsb-release debian-archive-keyring gnupg2 ufw unzip -y
    

Քայլ 1 - Կարգավորել Firewall-ը

Առաջին քայլը firewall-ի կազմաձևումն է: Debian-ը լռելյայն գալիս է ufw-ով (Uncomplicated Firewall):

Ստուգեք, արդյոք firewall-ը աշխատում է:

$ sudo ufw status

Դուք պետք է ստանաք հետևյալ արդյունքը.

Status: inactive

Թույլատրել SSH միացքը, որպեսզի այն միացնելուց հետո firewall-ը չխախտի ընթացիկ կապը:

$ sudo ufw allow OpenSSH

Թույլատրել նաև HTTP և HTTPS պորտերը:

$ sudo ufw allow http
$ sudo ufw allow https

Միացնել Firewall-ը

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

Կրկին ստուգեք firewall-ի կարգավիճակը:

$ sudo ufw status

Դուք պետք է տեսնեք նմանատիպ արդյունք:

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)

Քայլ 2 - Տեղադրեք Docker-ը և Docker Compose-ը

Debian 12-ը առաքվում է Docker-ի ավելի հին տարբերակով: Վերջին տարբերակը տեղադրելու համար նախ ներմուծեք Docker GPG ստեղնը:

$ sudo install -m 0755 -d /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ sudo chmod a+r /etc/apt/keyrings/docker.gpg

Ստեղծեք Docker պահեստային ֆայլը:

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

Թարմացրեք համակարգի պահեստների ցանկը:

$ sudo apt update

Տեղադրեք Docker-ի վերջին տարբերակը:

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

Ստուգեք, որ այն աշխատում է:

$ sudo systemctl status docker
? docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; preset: enabled)
     Active: active (running) since Mon 2024-01-01 09:00:14 UTC; 17s ago
TriggeredBy: ? docker.socket
       Docs: https://docs.docker.com
   Main PID: 1839 (dockerd)
      Tasks: 9
     Memory: 27.6M
        CPU: 598ms
     CGroup: /system.slice/docker.service
             ??1839 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Լռելյայնորեն, Docker-ը պահանջում է արմատային արտոնություններ: Եթե ցանկանում եք խուսափել sudo-ից ամեն անգամ, երբ գործարկում եք docker հրամանը, ավելացրեք ձեր օգտվողի անունը docker խմբին:

$ sudo usermod -aG docker $(whoami)

Դուք պետք է դուրս գաք սերվերից և նորից մուտք գործեք որպես նույն օգտվող՝ այս փոփոխությունը միացնելու համար կամ օգտագործեք հետևյալ հրամանը։

$ su - ${USER}

Հաստատեք, որ ձեր օգտվողն ավելացված է Docker խմբին:

$ groups
navjot sudo users docker

Քայլ 3 - Նախապատրաստում տեղադրմանը

Elasticsearch-ի համար mmap-ների հաշվարկների լռելյայն սահմանաչափը շատ ցածր է: Գործարկեք հետևյալ հրամանը՝ լռելյայն արժեքը ստուգելու համար:

$ sudo sysctl vm.max_map_count

Դուք կստանաք հետևյալ արդյունքը.

vm.max_map_count = 65530

Բարձրացրեք արժեքը՝ օգտագործելով հետևյալ հրամանները.

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

Քայլ 4 - Տեղադրեք 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-ի, վեբ-ի և պահուստային գրացուցակների համար:

$ 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

Ստեղծեք միջավայր և դոկերի ֆայլեր

Ստեղծեք միջավայրի ֆայլեր հավելվածի և տվյալների բազայի համար:

$ sudo touch application.env database.env

Ստեղծեք և բացեք Docker compose ֆայլը խմբագրման համար:

$ sudo nano docker-compose.yml

Դրա մեջ տեղադրեք հետևյալ կոդը.

services:
  postgresql:
    image: postgres:16-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.16
    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.2.3
    env_file:
      - application.env
      - database.env
    command: bash -c "rm -f /mastodon/tmp/pids/server.pid; 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.2.3
    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.2.3
    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.2.3
    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-ի վերջին հասանելի տարբերակը v4.2.3-ն է: Ստուգեք Mastodon GitHub Releases էջը և համապատասխան կերպով կարգավորեք տարբերակը Docker compose ֆայլում: Մենք նաև օգտագործում ենք PostgreSQL-ի և Redis-ի վերջին տարբերակները: Դուք կարող եք դրանք հարմարեցնել ձեր պահանջներին համապատասխան: Այս պահին մենք օգտագործում ենք Elasticsearch 7.17.16:

Ստեղծեք հավելվածի գաղտնիքները

Հաջորդ քայլը հավելվածի գաղտնի արժեքների ստեղծումն է:

Ստեղծեք SECRET_KEY_BASE և OTP_SECRET արժեքները՝ երկու անգամ գործարկելով հետևյալ հրամանը: Առաջին անգամը որոշ ժամանակ կպահանջի, քանի որ այն կքաշի պատկերները:

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

Նույնի համար կարող եք նաև օգտագործել openssl կոմունալը:

$ openssl rand -hex 64
ae01cf7d4dfae0182461a1345f1f2bf159658a27339ffafe7d356bef9ee8d4fa015ab2e72a608f236bd8e3f9b2af2dcb1d55ee5c8e43646959112c7da5582f4b

Ստեղծեք VAPID_PRIVATE_KEY և VAPID_PUBLIC_KEY արժեքները՝ օգտագործելով հետևյալ հրամանը:

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

Դուք կստանաք նմանատիպ արդյունք:

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

PostgreSQL և Elasticsearch գաղտնաբառեր ստեղծելու համար օգտագործեք openssl օգտակար ծրագիրը:

$ openssl rand -hex 15
dd0bd7a95960623ed8e084a1fb7d5c
$ openssl rand -hex 15
0fb52834c991b5e296c647166185bc

Mastodon շրջակա միջավայրի ֆայլեր

Բացեք application.env ֆայլը խմբագրման համար:

$ sudo nano application.env

Դրա մեջ տեղադրեք հետևյալ տողերը.

# 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=AKIA3FIG4NVFB343PZEI
SMTP_PASSWORD=AZX01WiA6JGbeZ2pwVXnyC9DhEa2nKcmXSu/zbLp
[email 

# secrets
SECRET_KEY_BASE=349623c049e3b856f6848638146e459857862b908ed387bbef372a30d9bd7c604fc4de5338addc86bd369a99d38ef59bacfa28e02a1750f7094ea6ede05457b8
OTP_SECRET=ae01cf7d4dfae0182461a1345f1f2bf159658a27339ffafe7d356bef9ee8d4fa015ab2e72a608f236bd8e3f9b2af2dcb1d55ee5c8e43646959112c7da5582f4b

# Changing VAPID keys will break push notifications
VAPID_PRIVATE_KEY=oNe_4BEL7Tpc3iV8eMtLegfLwrzA7ifitGJ2YOg3dUM=
VAPID_PUBLIC_KEY=BKBgmB90vIrJg6Ifq3cCHixalyPghJDkui9vm1wscxvAfNNoAQL0KinoxRTLDp0UFlGK_ahUG2n4W2n4x9AUAWM=

# 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, երբ հուշում է:

Մենք միացրել ենք Amazon SES փոստային ծառայությունը: Եթե դրա կարիքը չունեք, կարող եք ջնջել բաժինը։ Լռելյայնորեն, Mastodon-ը պահպանում է IP հասցեն 1 տարի, բայց մենք այն փոխել ենք մինչև 30 օր (2592000 վայրկյան): Դուք կարող եք փոխել այն ըստ ձեր պահանջի: Համոզվեք, որ այն պահեք ավելի քան 2 օր, հակառակ դեպքում, ձեզ հարկավոր է մի փոքր ավելի մանրացնել, ինչը դուրս է մեր ձեռնարկի շրջանակներից:

Բացեք database.env ֆայլը խմբագրման համար:

$ sudo nano database.env

Դրա մեջ տեղադրեք հետևյալ տողերը.

# postgresql configuration
POSTGRES_USER=mastodon
POSTGRES_DB=mastodon
POSTGRES_PASSWORD=0fb52834c991b5e296c647166185bc
PGPASSWORD=0fb52834c991b5e296c647166185bc
PGPORT=5432
PGHOST=postgresql
PGUSER=mastodon

# pgbouncer configuration
#POOL_MODE=transaction
#ADMIN_USERS=postgres,mastodon
#DATABASE_URL="postgres://mastodon:0fb52834c991b5e296c647166185bc@postgresql:5432/mastodon"

# elasticsearch
ELASTIC_PASSWORD=dd0bd7a95960623ed8e084a1fb7d5c

# mastodon database configuration
#DB_HOST=pgbouncer
DB_HOST=postgresql
DB_USER=mastodon
DB_NAME=mastodon
DB_PASS=0fb52834c991b5e296c647166185bc
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=dd0bd7a95960623ed8e084a1fb7d5c

Պահպանեք ֆայլը՝ սեղմելով Ctrl + X և մուտքագրելով Y, երբ հուշում է:

Պատրաստել Mastodon

Ստացեք ստատիկ ֆայլերը Nginx-ի կողմից սպասարկվելու համար: Այս քայլը որոշ ժամանակ կխլի, քանի որ Docker-ն առաջին անգամ կհանի բոլոր պատկերները:

$ 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

Սպասեք աշխատող (առողջ), այնուհետև սեղմեք Ctrl + C և սկզբնավորեք տվյալների բազան՝ օգտագործելով հետևյալ հրամանը:

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

Եթե արդեն գոյություն ունեցող mastodon տվյալների բազայի վերաբերյալ սխալ եք ստանում, գործարկեք հետևյալ հրամանը.

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

Քայլ 5 - Տեղադրեք Nginx

Debian 12-ը առաքվում է Nginx-ի ավելի հին տարբերակով: Վերջին տարբերակը տեղադրելու համար անհրաժեշտ է ներբեռնել պաշտոնական Nginx պահոցը:

Ներմուծեք Nginx-ի ստորագրման բանալին:

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

Ավելացրեք պահեստը Nginx-ի հիմնական տարբերակի համար:

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

Թարմացրեք համակարգի պահեստները:

$ sudo apt update

Տեղադրեք Nginx-ը:

$ sudo apt install nginx

Ստուգեք տեղադրումը: Debian համակարգերում ձեզ անհրաժեշտ է sudo՝ հետևյալ հրամանը գործարկելու համար։

$ sudo nginx -v
nginx version: nginx/1.25.3

Գործարկեք Nginx սերվերը:

$ sudo systemctl start nginx

Ստուգեք սերվերի կարգավիճակը:

$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enabled)
     Active: active (running) since Mon 2024-01-01 10:17:38 UTC; 4s ago
       Docs: https://nginx.org/en/docs/
    Process: 8972 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
   Main PID: 8973 (nginx)
      Tasks: 3 (limit: 4637)
     Memory: 2.9M
        CPU: 17ms
     CGroup: /system.slice/nginx.service
             ??8973 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
             ??8974 "nginx: worker process"
             ??8975 "nginx: worker process"

Jan 01 10:17:38 mastodon systemd[1]: Starting nginx.service - nginx - high performance web server...
Jan 01 10:17:38 mastodon systemd[1]: Started nginx.service - nginx - high performance web server.

Քայլ 6 - Տեղադրեք SSL-ը

SSL վկայագիր ստեղծելու համար մենք պետք է տեղադրենք Certbot-ը: Կարող եք կա՛մ տեղադրել Certbot-ը՝ օգտագործելով Debian-ի պահոցը, կա՛մ ձեռք բերել վերջին տարբերակը՝ օգտագործելով Snapd գործիքը: Մենք կօգտագործենք Snapd տարբերակը:

Debian 12-ը չի գալիս Snapd-ի տեղադրմամբ: Տեղադրեք Snapd փաթեթը:

$ sudo apt install snapd

Գործարկեք հետևյալ հրամանները՝ համոզվելու համար, որ Snapd-ի ձեր տարբերակը արդիական է: Համոզվեք, որ Snapd-ի ձեր տարբերակը արդիական է:

$ sudo snap install core
$ sudo snap refresh core

Տեղադրեք Certbot-ը:

$ sudo snap install --classic certbot

Օգտագործեք հետևյալ հրամանը՝ համոզվելու համար, որ Certbot հրամանն աշխատում է՝ ստեղծելով խորհրդանշական հղում դեպի /usr/bin գրացուցակը:

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

Ստուգեք տեղադրումը:

$ certbot --version
certbot 2.8.0

Գործարկեք հետևյալ հրամանը՝ SSL վկայական ստեղծելու համար:

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

Վերոնշյալ հրամանը վկայական կներբեռնի ձեր սերվերի /etc/letsencrypt/live/mastodon.example.com գրացուցակում:

Ստեղծեք Diffie-Hellman խումբ վկայագիր:

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

Ստուգեք Certbot-ի նորացման ժամանակացույցի ծառայությունը:

$ systemctl list-timers

Դուք կգտնեք snap.certbot.renew.service որպես սպասարկվող ծառայություններից մեկը:

NEXT                        LEFT        LAST                        PASSED             UNIT                    ACTIVATES
-----------------------------------------------------------------------------------------------------------------------------------------
Mon 2024-01-01 20:03:52 UTC 9h left     Mon 2023-12-11 21:56:24 UTC 2 weeks 6 days ago apt-daily.timer         apt-daily.service
Mon 2024-01-01 21:06:00 UTC 10h left    -                           -                  snap.certbot.renew.timersnap.certbot.renew.service
Tue 2024-01-02 00:00:00 UTC 13h left    -                           -                  dpkg-db-backup.timer    dpkg-db-backup.service

Կատարեք գործընթացի չոր գործարկում՝ ստուգելու, թե արդյոք SSL-ի նորացումը լավ է աշխատում:

$ sudo certbot renew --dry-run

Եթե սխալներ չեք տեսնում, ամեն ինչ պատրաստ է: Ձեր վկայականը ինքնաբերաբար կերկարաձգվի:

Քայլ 7 - Կարգավորեք Nginx-ը

Բացեք ֆայլը /etc/nginx/nginx.conf խմբագրման համար:

$ sudo nano /etc/nginx/nginx.conf

Ավելացրեք հետևյալ տողը include /etc/nginx/conf.d/*.conf; տողից առաջ:

server_names_hash_bucket_size 64;

Պահպանեք ֆայլը՝ սեղմելով Ctrl + X և մուտքագրելով Y, երբ պահանջվում է:

Ստեղծեք և բացեք ֆայլը /etc/nginx/conf.d/mastodon.conf խմբագրման համար:

$ sudo nano /etc/nginx/conf.d/mastodon.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;
   server_name mastodon.example.com;
   
   access_log  /var/log/nginx/mastodon.access.log;
   error_log   /var/log/nginx/mastodon.error.log;

   http2 on; # Enable HTTP/2 - works only on Nginx 1.25.1+

   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, երբ հուշվի:

Ստուգեք Nginx կազմաձևման ֆայլի շարահյուսությունը:

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

Վերագործարկեք Nginx սերվերը:

$ sudo systemctl restart nginx

Քայլ 8 - Սկսեք Mastodon-ը

Tootctl CLI գործիք

Tootctl CLI գործիքը օգտագործվում է Mastodon-ում ադմինիստրատիվ առաջադրանքներ կատարելու համար: Մենք պետք է այն հասանելի դարձնենք հյուրընկալող վահանակի վրա:

Ստեղծեք /usr/local/bin/tootctl ֆայլը և բացեք այն խմբագրման համար:

$ sudo nano /usr/local/bin/tootctl

Դրա մեջ տեղադրեք հետևյալ կոդը.

#!/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 ծառայության ֆայլը

Դուք կարող եք գործարկել Mastodon բեռնարկղերը՝ օգտագործելով Docker compose հրամանը, բայց դա ավելի հեշտ է անել համակարգային միավորի ֆայլի միջոցով:

Ստեղծեք և բացեք Mastodon ծառայության ֆայլը խմբագրման համար:

$ sudo nano /etc/systemd/system/mastodon.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, երբ պահանջվում է:

Վերբեռնեք համակարգի դեյմոնը՝ ծառայության ֆայլը գործարկելու համար:

$ sudo systemctl daemon-reload

Միացնել և գործարկել Mastodon ծառայությունը:

$ sudo systemctl enable --now mastodon.service

Ստուգեք Docker բեռնարկղերի կարգավիճակը:

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

Երբ բեռնարկղերի կարգավիճակը փոխվի աշխատող (առողջ), դուրս եկեք էկրանից` սեղմելով Ctrl + C:

Ստեղծեք Mastodon-ի ադմինիստրատորի օգտատերը և նշեք տրամադրված գաղտնաբառը:

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

Եթե ցանկանում եք փակել օգտվողների գրանցումները, օգտագործեք հետևյալ հրամանը.

$ tootctl settings registrations close

Գրանցումները նորից բացելու համար թողարկեք հետևյալ հրամանը.

$ tootctl settings registrations open

Նախաձեռնել որոնումը

Նախքան Elasticsearch-ի ինդեքսները ստեղծելու և համալրելու համար ձեզ հարկավոր է մի բան անել: Երբ դուք կատարել եք 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>'

Այս դեպքում մուտքագրեք կայքի կոնտեյների կեղևը:

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

Գործարկեք հետևյալ հրամանը.

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

Դուրս եկեք տարայի պատյանից:

$ exit

Կրկին գործարկեք Elasticsearch deploy հրամանը: Երբեմն հրամանը կարող է աշխատել ավելի ուշ: Սա շարունակական խնդիր է Mastodon-ում, հետևաբար այս պահին հստակ լուծում չկա:

$ tootctl search deploy
Done! 1/?? |-=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=---=|  ETA: ??:??:?? (0 docs/s)
Indexed 1 records, de-indexed 0

Լրացուցիչ օգնական ծառայություններ

Եկեք ստեղծենք մեկ այլ ծառայություն՝ ներբեռնված մեդիա ֆայլերը հեռացնելու համար:

Ստեղծեք և բացեք Mastodon լրատվամիջոցների հեռացման ծառայությունը խմբագրման համար:

$ sudo nano /etc/systemd/system/mastodon-media-remove.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, երբ պահանջվում է:

Եթե ցանկանում եք պլանավորել լրատվամիջոցների հեռացումը, կարող եք կարգավորել դրա համար ժամաչափի ծառայություն:

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

Տեղադրեք հետևյալ կոդը.

[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

Պահպանեք ֆայլը՝ սեղմելով Ctrl + X և մուտքագրելով Y, երբ պահանջվում է:

Դուք կարող եք ստեղծել մեկ այլ ծառայություն՝ OpenGraph պիտակների միջոցով ստեղծված Rich նախադիտման քարտերը հեռացնելու համար:

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

Տեղադրեք հետևյալ կոդը.

[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

Պահպանեք ֆայլը՝ սեղմելով Ctrl + X և մուտքագրելով Y, երբ պահանջվում է:

Սահմանեք համապատասխան ժամաչափի ծառայությունը:

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

Տեղադրեք հետևյալ կոդը.

[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

Պահպանեք ֆայլը՝ սեղմելով Ctrl + X և մուտքագրելով Y, երբ պահանջվում է:

Վերբեռնեք համակարգի դեյմոնը:

$ 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
.....
Sat 2024-01-06 00:00:00 UTC 4 days left -                           -                  mastodon-media-remove.timer         mastodon-media-remove.service
Sat 2024-01-06 00:00:00 UTC 4 days left -                           -                  mastodon-preview_cards-remove.timer mastodon-preview_cards-remove.service

Մուտք գործեք Mastodon

Ձեր օրինակին մուտք գործելու համար այցելեք https://mastodon.example.com URL-ը և կտեսնեք նմանատիպ էջ:

Վերոնշյալ սքրինշոթում դուք կարող եք տեսնել, որ 0 օգտվող կա: Դա պայմանավորված է նրանով, որ մենք դեռ մուտք չենք գործել: Նույնիսկ եթե դուք ստեղծեք ադմինիստրատորի հաշիվ, այն չի ցուցադրվում գլխավոր էջում առաջին գործարկման ժամանակ: Դա անելու համար մուտք գործեք ձեր օրինակ և կտեղափոխվեք հետևյալ էջը։

Կտտացրեք Նախապատվություններ տարբերակը աջ կողագոտուց՝ կարգավորումներին մուտք գործելու համար: Այնտեղից ձախ մենյուից սեղմեք Կառավարում տարբերակը՝ Mastodon-ի կառավարման վահանակ մուտք գործելու համար:

Սեղմեք Սերվերի կարգավորումներ տարբերակը ձախ կողագոտում:

Այստեղ լրացրեք ձեր կոնտակտային օգտանունը և բիզնեսի էլ. փոստը, որոնք այժմ կարտացոլվեն ձեր սերվերի գլխավոր էջում: Նաև լրացրեք տարբեր այլ տեղեկություններ, ներառյալ սերվերի նկարագրությունը, պատկերանշանը և սերվերի կանոնները՝ ձեր Mastodon օրինակը հարմարեցնելու համար:

Քայլ 9 - Mastodon Maintenance

Ձեր Mastodon օրինակի կատարումն ու գրանցամատյանները դիտելու համար այցելեք https://mastodon.example.com/sidekiq/:

Այստեղ դուք կարող եք դիտել ձեր Mastodon օրինակի հետ կապված տարբեր գործընթացների և պլանավորված առաջադրանքների ցանկը: Դուք կարող եք նաև ստուգել անհաջող առաջադրանքների առկայությունը Մեռած կամ Նորից փորձեր բաժնում: Այն նաև կպատմի ձեր օրինակի հիշողության օգտագործման մասին:

Դուք կարող եք ստուգել ձեր օրինակի տվյալների բազայի առողջությունը https://mastodon.example.com/pghero/-ից:

Դուք կարող եք կատարել ձեր տվյալների բազայի սպասարկում, գործարկել SQL հարցումներ և հեռացնել չօգտագործված ինդեքսները: Հարցման վիճակագրությունը միացնելու համար սեղմեք Միացնել կոճակը վերը նշված էջում և կստանաք հետևյալ տեղեկատվությունը:

Անցեք արմատային օգտվողին:

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

Ֆայլի վերջում ավելացրեք հետևյալ տողը.

pg_stat_statements.track = all

Պահպանեք ֆայլը՝ սեղմելով Ctrl + X և մուտքագրելով Y, երբ պահանջվում է:

Վերագործարկեք Mastodon բեռնարկղերը:

$ systemctl restart mastodon.service

Դուրս եկեք արմատային կեղևից:

$ exit

Եթե ստուգեք տվյալների բազայի առողջության էջը, կարող եք տեսնել, թե արդյոք այժմ դանդաղ հարցումներ կան:

Նշում. Դուք կարող եք նաև գործարկել PgHero և Sidekiq URL-ները Նախապատվություններ ցանկից:

Եթե ձեր կայքը ինչ-ինչ պատճառներով չի բեռնվում, կարող եք ստուգել Docker-ի կողմից ստեղծված տեղեկամատյանները:

$ docker logs <container-name>

Քայլ 10 - Կրկնօրինակեք Mastodon

Մենք կօգտագործենք 3-րդ կողմի գործիք, որը կոչվում է Restic՝ Mastodon-ը կրկնօրինակելու համար: 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 պահեստային ծառայության ժամանակաչափ և բացեք այն խմբագրման համար:

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

Դրա մեջ տեղադրեք հետևյալ կոդը.

[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 պահեստային ծառայության ֆայլ և բացեք այն խմբագրման համար:

$ sudo nano /etc/systemd/system/mastodon-backup.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

Վերբեռնեք սպասարկման դեյմոնը և գործարկեք պահեստային ծառայությունը և ժամաչափը:

$ 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 - Թարմացրեք Mastodon-ը

Mastodon-ի արդիականացումը պահանջում է մի քանի քայլ: Նախ, անցեք գրացուցակին:

$ 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/"

Վերագործարկեք Mastodon բեռնարկղերը:

$ sudo systemctl restart mastodon.service

Վերոնշյալ հրահանգները թարմացման ընդհանուր հրահանգներ են: Միշտ ստուգեք Mastodon-ի GitHub-ի թողարկումների էջը՝ տարբերակների միջև թարմացման որևէ հատուկ առաջադրանք և հրամաններ փնտրելու համար՝ համոզվելու համար, որ ամեն ինչ հարթ է ընթանում:

Եզրակացություն

Սա ավարտում է մեր ձեռնարկը Mastodon սոցիալական ցանցի տեղադրման վերաբերյալ, օգտագործելով Docker-ը Debian 12 սերվերի վրա: Եթե ունեք հարցեր, տեղադրեք դրանք ստորև ներկայացված մեկնաբանություններում: