Компания предоставляющая услуги VPS подняла ценники, но сделала еще тарифы с меньшими по тех.характеристикам VPS по той же цене. А еще и денег стали просить за публичный IP адрес, а было бесплатно. Поэтому съезжаю, собрал монатки и, в общем дабы пригодилось при следующем переезде очень кратко все манипуляции без особых пояснений. Приведен порядок действий для сервера Ubuntu 22.04 для Debian 12 почти не отличается, вроде только с ключом для докера разница есть.

Что нужно для переезда

Создать каталог mkdir ~/mastodon/backup/ в который положим все что нужно.

Удалить мусор

Перейти в каталог, где установлен Mastodon:

cd ~/mastodon/

Удалить удаленные учетные записи, которые никогда не взаимодействовали с локальными пользователями.

docker compose exec web bin/tootctl accounts prune

Удалить из базы данных статусы, на которые нет ссылок, например статусы, полученные от ретрансляторов или от пользователей, за которыми больше не следят какие-либо локальные учетные записи, и на которых не ответили или с которыми иным образом не взаимодействовали.

docker compose exec web bin/tootctl statuses remove --days 1

Удалить локально кэшированные копии медиа-вложений, аватаров или заголовков профилей с других серверов. По умолчанию удаляются только вложения мультимедиа.

docker compose exec web bin/tootctl media remove --days 1

Вместо вложений мультимедиа удалить локально кэшированные копии заголовков с других серверов --include-follows. Переопределить поведение по умолчанию --prune-profiles и --remove-headers удалить локально кэшированные копии аватаров (и заголовков) с других серверов, независимо от статуса подписки (по умолчанию они удаляются только из учетных записей, которые не подписаны или не подписаны на кого-либо локально). Можно использовать только с --prune-profiles или --remove-headers.

docker compose exec web bin/tootctl media remove --remove-headers --days 1

Вместо медиа-вложений удалить локально кэшированные копии аватаров и заголовков с других серверов.

docker compose exec web bin/tootctl media remove --prune-profiles --days 1

Удалить локальные миниатюры для карточек предварительного просмотра.

docker compose exec web bin/tootctl preview_cards remove --days 1

Сканирует файлы, не принадлежащие существующим мультимедийным вложениям, и удаляет их. Обратите внимание, что некоторые поставщики хранилищ взимают плату за необходимые запросы API для получения списка объектов. Кроме того, эта операция требует индивидуального перебора каждого файла, поэтому она будет медленной.

docker compose exec web bin/tootctl media remove-orphans

Сохранить нужное для работы Mastodon

Посмотреть имя контейнера базы данных docker ps

Создать дамп базы данных Mastodon

docker exec -t mastodon-db-1 pg_dumpall -c -U postgres > dump_sql_mastodon.sql

Архивировать дамп базы данных

zip ~/mastodon/backup/`date +'%d%m%Y'`_dump_sql_mastodon.sql.zip dump_sql_mastodon.sql

Удалить файл дампа после архивации

rm dump_sql_mastodon.sql

Сохранить каталог с пользовательскими файлами

zip -r ~/mastodon/backup/`date +'%d%m%Y'`_mastodon_public_system_backup.zip ~/mastodon/public/system

Сохранить конфигурацию сервера

zip ~/mastodon/backup/`date +'%d%m%Y'`_env.production.zip ~/mastodon/.env.production
zip ~/mastodon/backup/`date +'%d%m%Y'`_docker-compose.yml.zip ~/mastodon/docker-compose.yml

Сохранить все что касается работы сервера

Все подключения производятся по ранее созданным ключам SSH

Сохранить все ключи:

cp -r ~/.ssh ~/mastodon/backup

Скопировать конфиг shh сервера

cp /etc/ssh/sshd_config ~/mastodon/backup

Конфиг fail2ban

sudo cp /etc/fail2ban/jail.local ~/mastodon/backup

Правила ufw

sudo cp -r /etc/ufw/applications.d ~/mastodon/backup

Сертификаты letsencrypt

sudo cp -r /etc/letsencrypt ~/mastodon/backup
sudo cp /etc/nginx/sites-available/i.wildserver.ru.conf ~/mastodon/backup

Все что скопировали в ~/mastodon/backup перенести удобным способом к себе на комп или другой сервер.

Настройка VPS

VPS

Подключится к серверу по выданным данным хостером:

ssh root@IP-VPS

Добавить пользователя желательно такого же, как был:

adduser UserVPS

Дать права на использование SUDO

usermod -aG sudo UserVPS

Сделать себя главным на сервере добавив запись в файл nano /etc/sudoers:

UserVPS ALL=(ALL:ALL) ALL

Перезагрузить сервер и зайти под именем пользователя:

ssh UserVPS@IP-VPS

Создать каталог в который перенести все сохраненные ранее данные:

mkdir backup

Скопировать ключи:

cp -r ~/backup/.ssh ~/

Очень важно установить правильные права иначе не будет копирования на удаленный сервер бэкапа:

chmod 600 ~/.ssh/id_rsa

Скопировать конфиг shh сервера

sudo cp ~/backup/sshd_config /etc/ssh/

Или отредактировать конфиг sudo nano /etc/ssh/sshd_config, что бы не было доступа по паролю:

# Include /etc/ssh/sshd_config.d/*.conf
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
UsePAM yes
X11Forwarding yes
PrintMotd no
AcceptEnv LANG LC_*
Subsystem sftp internal-sftp
AllowUsers UserVPS

Перезапустить сервер ssh:

sudo systemctl restart ssh

Выйти exit или закрыть терминал

Подключится к серверу пользователем UserVPS. Теперь парользапрашиваться не будет, вход осуществляется, только по ключу:

ssh UserVPS@IP-VPS

Установить архиватор:

sudo apt install zip

Обновить список пакетов:

sudo apt update

Установить новые пакеты и обновить имеющиеся:

sudo apt upgrade -y

В убунту вечно выскакивает окошко с выбором, что делать с конфигами после обновлений, раздражает ибо привык к Debian. Оставить все, как есть нех совацо в мои файлы.

Выбрать - Keep the local version currently installed

FAIL2BAN

sudo apt install fail2ban -y

Скопировать ранее сохраненный файл настроек:

sudo cp ~/backup/jail.local /etc/fail2ban/

Проверка конфига:

sudo fail2ban-client -d

Запуск fail2ban

sudo systemctl start fail2ban

Активировать автозапуск:

sudo systemctl enable fail2ban

UFW

UFW установлен по умолчанию

Открыть порт SSH

sudo ufw allow OpenSSH

Включить UFW

sudo ufw enable

Скопировать правила

sudo cp -r ~/backup/applications.d /etc/ufw

Открыть порты веб-сервера 80 и 443

sudo ufw allow "WWW Full"

Создать файл подкачки объёмом 2 гига, на всяк случай, памяти не очень много выделяют на VPS приходится жертвовать дисковым пространством:

sudo fallocate -l 2G /swap.img
sudo chmod 600 /swap.img
sudo mkswap /swap.img
sudo swapon /swap.img

Проверка:

free -h

Включить на постоянку свап дополнив строку в файл sudo nano /etc/fstab:

/swap.img       none    swap    sw      0       0

Настроить имя хоста редактировать файл sudo nano /etc/hosts:

127.0.0.1       localhost
IP-VPS       i.wildserver.ru       i-wildserver

Что бы в терминале было написано имя хоста

Имя хоста

sudo hostnamectl set-hostname i-wildserver

Полезные проги:

sudo apt install htop
sudo apt install mc -y

Установка Mastodon в Docker

ПЕРЕД УСТАНОВКОЙ MASTODON СДЕЛАТЬ CНАПШОТ ИЛИ БЭКАП на тот случай, если что то пойдет не так, а оно пойдет не так 😀 . У хостера есть такая бесплатная услуга, как снапшот - снимок всего VPS, очень удобно, когда собираешься сделать, что то кардинальное. Можно очень быстро откатится к той версии, когда все работало.

Установка Docker и нужных плагинов

Рабочая версия добавления репы докера другие херня. Импортировать GPG-ключ:

wget -O- https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor | sudo tee /etc/apt/keyrings/docker.gpg > /dev/null

Добавить репу докера:

echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu jammy 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

Запуск Docker:

sudo systemctl start docker

Включить автозагрузку Docker

sudo systemctl enable docker

Проверить работу Docker

sudo systemctl status docker

Чтобы не запускать Docker от имени рута

sudo usermod -aG docker ${USER}

Установка Mastodon из бэкапов

Клонировать репу

git clone https://github.com/tootsuite/mastodon.git

Перейти в каталог

cd mastodon

Эта команда находит последний (по версии) тег в репозитории Git, который не является “релиз-кандидатом” (то есть не содержит rc в своем имени), и переключается на этот тег.

git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)

Извлечь архивы:

cd ~/backup
unzip 09082024_docker-compose.yml.zip
unzip 09082024_env.production.zip
unzip 09082024_mastodon_public_system_backup.zip
unzip 09082024_postgres_backup.sql.zip

Можно заменить файл docker-compose.yml своим или отредактировать имеющийся закомментировав все build. Забегая вперед скажу, что заметил время в логах контейнеров не совпадают с серверным. Исправить:

Добавить в фйле docker-compose.yml перед всеми контейнерами

     environment:
      - TZ=Europe/Moscow

Вот мой работающий конфиг скачать

Скопировать файлы в нужные каталоги. СДЕЛАЛ СНАП теперь пошла жара

Зайти в каталог Matodon

cd ~/mastodon

Запустить контейнер базы данных, имя db базы можно узнать из docker-compose.yml:

docker compose up -d db (имя db базы из docker-compose.yml)

Скопировать дамп в контейнер, имя контейнера узнать docker ps

docker cp ~/backup/dump_sql_mastodon.sql mastodon-db-1:/mastodon_backup.sql

Подключиться к контейнеру PostgreSQL:

docker exec -it mastodon-db-1 sh

Запустить psql под пользователем postgres:

psql -U postgres

Создать базу данных и пользователя с помощью psql:

CREATE DATABASE mastodon;
CREATE USER mastodon WITH PASSWORD 'пароль'; (пароль из env.production )
GRANT ALL PRIVILEGES ON DATABASE mastodon TO mastodon;
\q

Восстановление базы данных из дампа:

psql -U postgres -d mastodon -f /mastodon_backup.sql
exit

Обязательно поменять права иначе будут ошибки и не будут загружаться изображения:

sudo chown -R 70:70 postgres14
sudo chown -R 991:991 public

Запуск сервиса всех контейнеров

docker compose up -d

Посмотреть логи:

docker compose logs -f

Проверить дату время в контейнере должна совпадать с установленным часовым поясом выше, в моем случае с моим системным временем:

docker exec -it mastodon-redis-1 date

Сертификат SSL

Скопировать из бэкапа всю папку полностью сохраненную папку:

sudo cp -r ~/backup/letsencrypt /etc 

Установка certbot через snap так проще:

sudo snap install --classic certbot

обновить сертификаты вручную с помощью команды:

sudo certbot renew

Удалить которые не нужны и выдаются с ошибками:

sudo certbot delete

Веб сервер NGINX

Установить NGINX:

sudo apt install nginx -y

Cкопировать конфиг NGINX из бэкапа:

sudo cp ~/backup/i.wildserver.ru.conf /etc/nginx/sites-available/

Активировать веб сервер:

sudo ln -s /etc/nginx/sites-available/i.wildserver.ru.conf /etc/nginx/sites-enabled/

Удалить активированный виртуальный сервер по умолчанию:

sudo rm /etc/nginx/sites-enabled/default

Ели нужно у регистратора поменять IP в записи А для домена

Проверить конфигурацию веб сервера:

sudo nginx -t
sudo systemctl reload nginx

Backup Mastodon

Периодически нужно чистить Mastodon, чтоб не захламил весь диск. Ну и самое важное это бэкап базы данных, остальное дело наживное. Пример скрипта для очистки и сохранения данных на удаленный сервер, соединение должно быть настроено и запускаться планировщиком. Скачать скрипт clear-cron-backup.sh в папку ~/mastodon/

Заменить UserVPS своим ником, IP-VPS айпи сервера или домен.

Скрипт нужно сделать исполняемым:

chmod ugo+x clear-cron-backup.sh

Добавить запись в планировщик задач:

crontab -e

# 0 */24 * * * /bin/bash ~/mastodon/clear-cron.sh
0 3 * * * ~/mastodon/./clear-cron.sh

Запускается каждый день в 3 часа ночи.

Enjoy

Вот и все телодвижения. Восстановление работы Mastodon и установка нового инстанса практически одинакова отличие только в том, что не запускается скрипт установки, который формирует базу данных с необходимыми данными для работы. Ну там есть еще некоторые тонкости, о которых позже напишу, может быть 😀