К заметкам про Restic уже не раз упоминали веб панель к нему Backrest. У меня были большие надежды на эту панель, но они не оправдались. Я почему-то думал, что это будет панель для управления множеством распределённых по хостам экземплярам Restic. Он работает по модели push, то есть сам отправляет данные в репозиторий и поэтому должен быть установлен локально.
С такой архитектурой затруднено централизованное управление. Это должна быть какая-то сторонняя система для установки самого restic, раскатки конфигураций на него и отслеживания выполнений заданий бэкапа. Для этого, к примеру, подойдёт Ansible Semaphore.
Я рассчитывал увидеть подобную панель, но с акцентом именно на возможности restic. Но увы. Backrest не про это. С её помощью можно настраивать только локальный бэкап на конкретном одиночном хосте. Для меня вообще неактуальна подобная функциональность, потому что я предпочитаю такие вещи настраивать в консоли на скриптах.
Тем не менее, я развернул Backrest и попробовал. Она вполне удобна для тех, кому нужен веб интерфейс для настройки. Одним из явных удобств этой панели будет возможность просматривать и скачивать файлы из снепшотов в репозиотрии. Да и просто просмотр выполненных заданий и содержимое репозитория в браузере выглядит наглядно и удобно.
Запустить Backrest можно как локально, установив вручную из бинарника и создав службу, так и автоматически в Doсker Compose. Я выбрал второе. Немного доработал пример из репозитория. Получилось вот так:
Обращаю внимание на подключаемую директорию
◽️id_ed25519 - приватный ключ для доступа к серверу, делаем так:
id_ed25519.pub добавляем на удалённом сервере в
◽️known_hosts - файл с открытым ключом удалённого сервера. Подключитесь к нему с какого-нибудь сервера, а потом скопируйте сохранённую строку из
После запуска контейнера можно идти на порт 9898 и настраивать бэкап через браузер. Первым делом надо добавить Repo. Для SFTP строка Repository URI будет примерно такая:
После этого можно создавать задание для бэкапа. Я в своём примере бэкаплю директорию
Примеры настроек Repo и задания для бэкапа показал внизу на картинках.
Теперь можно либо вручную сделать бэкап здесь же, либо дождаться планировщика. Перейдя в репозиторий, можно посмотреть Snapshots уже сделанных бэкапов, увидеть список файлов в них и по желанию что-то восстановить. Для восстановления удобно использовать директорию tmp, которую добавили в compose.
В целом нормальная, удобная панель, если для вас актуальна такая функциональность. Будет хорошим решением локальных бэкапов для тех, у кого рабочая машина на Linux. Для бэкапа и восстановления файлов с серверов, я думаю, можно обойтись и без веб интерфейса.
⇨ 🌐 Сайт / Исходники
#backup #restic
С такой архитектурой затруднено централизованное управление. Это должна быть какая-то сторонняя система для установки самого restic, раскатки конфигураций на него и отслеживания выполнений заданий бэкапа. Для этого, к примеру, подойдёт Ansible Semaphore.
Я рассчитывал увидеть подобную панель, но с акцентом именно на возможности restic. Но увы. Backrest не про это. С её помощью можно настраивать только локальный бэкап на конкретном одиночном хосте. Для меня вообще неактуальна подобная функциональность, потому что я предпочитаю такие вещи настраивать в консоли на скриптах.
Тем не менее, я развернул Backrest и попробовал. Она вполне удобна для тех, кому нужен веб интерфейс для настройки. Одним из явных удобств этой панели будет возможность просматривать и скачивать файлы из снепшотов в репозиотрии. Да и просто просмотр выполненных заданий и содержимое репозитория в браузере выглядит наглядно и удобно.
Запустить Backrest можно как локально, установив вручную из бинарника и создав службу, так и автоматически в Doсker Compose. Я выбрал второе. Немного доработал пример из репозитория. Получилось вот так:
services:
backrest:
image: garethgeorge/backrest:latest
container_name: backrest
hostname: backrest
volumes:
- ./backrest/data:/data
- ./backrest/config:/config
- ./backrest/cache:/cache
- ./backrest/tmp:/tmp # для восстановления бэкапов
- ./.ssh:/root/.ssh # для доступа к repo по sftp
- /path/to/local/repos:/userdata # локальная директория, которая бэкапится
- /path/to/local/repos:/repos # для использования в качестве local repo
environment:
- BACKREST_DATA=/data
- BACKREST_CONFIG=/config/config.json
- XDG_CACHE_HOME=/cache
- TMPDIR=/tmp
- TZ=Europe/Moscow
ports:
- "9898:9898"
restart: unless-stopped
Обращаю внимание на подключаемую директорию
.ssh. Она нужна для подключения репозитория по SFTP. По мне, так это самый простой и удобный способ подключиться к удалённому хосту для хранения бэкапов на нём. В этой директории должны быть 2 файла: ◽️id_ed25519 - приватный ключ для доступа к серверу, делаем так:
# ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -C "$(whoami)@$(hostname)_$(date -I)"id_ed25519.pub добавляем на удалённом сервере в
authorized_keys.◽️known_hosts - файл с открытым ключом удалённого сервера. Подключитесь к нему с какого-нибудь сервера, а потом скопируйте сохранённую строку из
known_hosts в этот файл. После запуска контейнера можно идти на порт 9898 и настраивать бэкап через браузер. Первым делом надо добавить Repo. Для SFTP строка Repository URI будет примерно такая:
sftp:user@10.20.1.24:/mnt/backup. Остальные параметры указывайте по потребностям.После этого можно создавать задание для бэкапа. Я в своём примере бэкаплю директорию
/var/log, которую примапил в композ файле к /userdata.Примеры настроек Repo и задания для бэкапа показал внизу на картинках.
Теперь можно либо вручную сделать бэкап здесь же, либо дождаться планировщика. Перейдя в репозиторий, можно посмотреть Snapshots уже сделанных бэкапов, увидеть список файлов в них и по желанию что-то восстановить. Для восстановления удобно использовать директорию tmp, которую добавили в compose.
В целом нормальная, удобная панель, если для вас актуальна такая функциональность. Будет хорошим решением локальных бэкапов для тех, у кого рабочая машина на Linux. Для бэкапа и восстановления файлов с серверов, я думаю, можно обойтись и без веб интерфейса.
⇨ 🌐 Сайт / Исходники
#backup #restic
👍51👎5
Недавно поднимал тему переезда домена от одного регистратора к другому. Косвенно захватил тему переноса DNS записей. У меня уже ранее была один раз ситуация, когда я по какой-то причине потерял DNS записи, которые пришлось восстанавливать. Уже не помню подробностей истории. Ещё тогда я подумал, что неплохо бы было их забэкапить в любом виде, просто чтобы было.
В то время вопрос не проработал и ничего не сделал. Это не такая уж критическая информация, если у вас не десятки поддоменов и каких-то специфических сервисов со своими TXT записями. Можно всё восстановить вручную, но придётся вспоминать и открывать разные источники. На это уйдёт время. Проще будет, если хоть в каком-то виде вся эта информация будет храниться с обновлением хотя бы раз в месяц.
Решил посмотреть, есть ли какие готовые решения на этот счёт. Вот что нашёл.
◽️octoDNS - утилита, которая хранит настройки DNS записей в формате yaml и имеет интеграцию с публичными провайдерами или локальными DNS серверами. Поддерживает многих популярных западный провайдеров, типа Amazon Route 53, Azure DNS, Cloudflare DNS и т.д. и ни одного российского. По факту это не только бэкап конфигурации, но и управление. То есть типичный подход инфраструктуры как код с хранением DNS зон в GIT. С помощью octoDNS записи можно переносить от одного провайдера к другому.
◽️DNSControl - примерно то же самое, что и octoDNS, но зоны хранятся в формате языка программирования JavaScript. Не кажется это удобным. Не знаю, почему так сделано. По возможностям и интеграциям не увидел принципиальной разницы с octoDNS.
Для российских хостеров эти утилиты не подходят. Надо либо модуль интеграции самим писать, либо использовать что-то другое. Можно пойти более простым путём.
◽️Бэкап записей через API. Почти у всех крупных провайдеров есть API для управления зонами. ИИ без проблем напишет интеграцию. Достаточно скормить ему документацию и сказать, что тебе нужно. Я проверил на примере Selectel.
Но тут возникает другой вопрос. Для доступа к зонам нужен токен. Если зоны на разных учётках или у разных хостеров, то муторно настраивать везде доступы. Если задача не добавлять или менять записи, а только смотреть, доступ через API не особо нужен. Это публичные данные, которые можно прочитать напрямую.
◽️Бэкап записей через dig. Можно взять любую утилиту для просмотра DNS записей и сохранить её вывод. В Linux для этого обычно используют dig. Смотреть можно так:
Достаточно сохранить вывод для всех зон, вот тебе и бэкап. По типам записей и доменам можно пройтись в цикле:
Получается аккуратный список DNS записей доменов. У этого способа есть один существенный минус - все поддомены надо добавлять вручную. Нет возможности получить точный публичный список поддоменов. Его придётся вести вручную. Напрямую все поддомены забрать можно только у DNS хостера через его API. Так что выбирайте сами, какой способ вам больше подойдёт.
Я остановился на подобном скрипте. Мне его хватает. Буду запускать раз в неделю на бэкап сервере с консолью Linux.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
———
ServerAdmin:📱 Telegram | 🌐 Сайт | 📲 MAX
#dns #backup
В то время вопрос не проработал и ничего не сделал. Это не такая уж критическая информация, если у вас не десятки поддоменов и каких-то специфических сервисов со своими TXT записями. Можно всё восстановить вручную, но придётся вспоминать и открывать разные источники. На это уйдёт время. Проще будет, если хоть в каком-то виде вся эта информация будет храниться с обновлением хотя бы раз в месяц.
Решил посмотреть, есть ли какие готовые решения на этот счёт. Вот что нашёл.
◽️octoDNS - утилита, которая хранит настройки DNS записей в формате yaml и имеет интеграцию с публичными провайдерами или локальными DNS серверами. Поддерживает многих популярных западный провайдеров, типа Amazon Route 53, Azure DNS, Cloudflare DNS и т.д. и ни одного российского. По факту это не только бэкап конфигурации, но и управление. То есть типичный подход инфраструктуры как код с хранением DNS зон в GIT. С помощью octoDNS записи можно переносить от одного провайдера к другому.
◽️DNSControl - примерно то же самое, что и octoDNS, но зоны хранятся в формате языка программирования JavaScript. Не кажется это удобным. Не знаю, почему так сделано. По возможностям и интеграциям не увидел принципиальной разницы с octoDNS.
Для российских хостеров эти утилиты не подходят. Надо либо модуль интеграции самим писать, либо использовать что-то другое. Можно пойти более простым путём.
◽️Бэкап записей через API. Почти у всех крупных провайдеров есть API для управления зонами. ИИ без проблем напишет интеграцию. Достаточно скормить ему документацию и сказать, что тебе нужно. Я проверил на примере Selectel.
Но тут возникает другой вопрос. Для доступа к зонам нужен токен. Если зоны на разных учётках или у разных хостеров, то муторно настраивать везде доступы. Если задача не добавлять или менять записи, а только смотреть, доступ через API не особо нужен. Это публичные данные, которые можно прочитать напрямую.
◽️Бэкап записей через dig. Можно взять любую утилиту для просмотра DNS записей и сохранить её вывод. В Linux для этого обычно используют dig. Смотреть можно так:
# dig ya.ru A +noall +answer# dig ya.ru MX +noall +answer# dig ya.ru TXT +noall +answerДостаточно сохранить вывод для всех зон, вот тебе и бэкап. По типам записей и доменам можно пройтись в цикле:
#!/usr/bin/env bash
DOMAINS_LIST="domains.txt"
BACKUP_DIR="./dns_backups"
mkdir -p "$BACKUP_DIR"
DATE=$(date +%F_%H%M%S)
for DOMAIN in $(cat "$DOMAINS_LIST"); do
OUTFILE="${BACKUP_DIR}/${DOMAIN}_${DATE}.zone"
echo "### $DOMAIN ###" > "$OUTFILE"
for TYPE in NS A AAAA CNAME MX TXT SRV; do
echo "" >> "$OUTFILE"
echo "### $TYPE ###" >> "$OUTFILE"
dig "$DOMAIN" "$TYPE" +noall +answer >> "$OUTFILE"
done
echo "saved: $OUTFILE"
done
Получается аккуратный список DNS записей доменов. У этого способа есть один существенный минус - все поддомены надо добавлять вручную. Нет возможности получить точный публичный список поддоменов. Его придётся вести вручную. Напрямую все поддомены забрать можно только у DNS хостера через его API. Так что выбирайте сами, какой способ вам больше подойдёт.
Я остановился на подобном скрипте. Мне его хватает. Буду запускать раз в неделю на бэкап сервере с консолью Linux.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
———
ServerAdmin:
#dns #backup
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍95👎4
Недавно по лентам каналов проскочил анонс бесплатной программы для бэкапа и переноса почты из почтовых ящиков - Mail-Archiver. Тема интересная и актуальная, потому что такого рода программ практически нет. Я обычно новый софт смотрю, прикидываю, будет ли он мне полезен и откладываю на полгода-год, чтобы настоялся. Если получает развитие, то пробую, если разработка не продолжается, то забываю.
Про Mail-Archiver впервые услышал в видеообзоре, который был в недавней подборке. Когда мне нужно забэкапить или перенести почтовый ящик с почтового сервера, который я не обслуживаю, и, соответственно, не имею напрямую доступ к исходникам писем, то беру imapsync. Это простой и надёжный инструмент, который позволяет по imap забирать почту с одного почтового сервера и складывать на другой. Для бэкапа достаточно поднять свой вспомогательный imap сервер, который примет почту. В своё время делал большие миграции с бесплатной почты для домена от Яндекс на другие сервера, когда первый убрал бесплатные тарифы.
Возвращаюсь к Mail-Archiver. Это веб интерфейс к сборщику почты из ящиков по протоколу imap. Я его попробовал. Поставить очень просто. В репозитории есть готовый
Внешне веб интерфейс собран на базе какого-то типового фреймворка для админок. Выглядит для своих задач нормально. Настойка максимально простая:
1️⃣ Добавляете новый почтовый ящик, указав имя сервера, логин, пароль, imap порт.
2️⃣ Запускаете вручную синхронизацию.
3️⃣ Смотрите почту через веб интерфейс панели. Можете сразу по всем добавленным ящикам в едином списке. В некоторых случаях это может оказаться полезным. Либо же выбираете отдельно ящики или конкретные папки в них.
4️⃣ При желании архив можно выгрузить в формате EML или MBox, предварительно сжав в ZIP. С большими ящиками скорее всего будут проблемы.
5️⃣ Все письма из одного ящика можно скопировать в другой. В том числе в отдельную папку. То есть можно на каком-то почтовом сервере для бэкапов сделать общий ящик и складывать туда в каждую папку письма какого-то отдельного ящика.
В целом панелька удобная. Я без проблем всё настроил. Но есть несколько важных нюансов:
1️⃣ Синхронизация писем идёт медленно. В среднем из ящика забирает 1-2 письма в секунду. Большие ящики будут очень долго синхронизироваться.
2️⃣ Вся почта хранится в SQL базе, конкретно в PostgreSQL. В целом это неплохо с точки зрения быстрого поиска по большому архиву. Но накладывает соответствующие требования к процессору и дискам, чтобы переваривать большие объёмы почты. Вообще не понятно, как эта панель будет работать, если туда загрузить несколько ящиков гигабайт по 50. У меня, к примеру, в обслуживании, таких полно.
3️⃣ Нет настраиваемых задач для регулярного бэкапа. Он запускается только вручную или по какому-то своему расписанию раз в 15 минут. Я вроде всё проверил, и панель, и документацию. Не нашёл, как этим управлять. Странно, что не сделали настраиваемый планировщик. Он тут напрашивается.
Mail-Archiver неплохо решает заданную задачу. Для личного использования или набора ящиков небольших объёмов будет удобен. Для больших почтовых ящиков и серверов, скорее всего не подойдёт. Но там странно было бы надеяться на бэкап через imap. Большие ящики надо бэкапить с уровня хранилища почты.
Отдельно отмечу возможность создавать учётные записи пользователей самой панели, к которым можно добавлять разные почтовые ящики с общим поиском по ним. Для каких-то задач это может быть простым и удобным решением.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
———
ServerAdmin:📱 Telegram | 🌐 Сайт | 📲 MAX
#mailserver #backup
Про Mail-Archiver впервые услышал в видеообзоре, который был в недавней подборке. Когда мне нужно забэкапить или перенести почтовый ящик с почтового сервера, который я не обслуживаю, и, соответственно, не имею напрямую доступ к исходникам писем, то беру imapsync. Это простой и надёжный инструмент, который позволяет по imap забирать почту с одного почтового сервера и складывать на другой. Для бэкапа достаточно поднять свой вспомогательный imap сервер, который примет почту. В своё время делал большие миграции с бесплатной почты для домена от Яндекс на другие сервера, когда первый убрал бесплатные тарифы.
Возвращаюсь к Mail-Archiver. Это веб интерфейс к сборщику почты из ящиков по протоколу imap. Я его попробовал. Поставить очень просто. В репозитории есть готовый
docker-compose.yml. Если не хотите менять стандартные учётки, то можно вообще ничего не менять в файле. Я только свой часовой пояс указал.Внешне веб интерфейс собран на базе какого-то типового фреймворка для админок. Выглядит для своих задач нормально. Настойка максимально простая:
В целом панелька удобная. Я без проблем всё настроил. Но есть несколько важных нюансов:
Mail-Archiver неплохо решает заданную задачу. Для личного использования или набора ящиков небольших объёмов будет удобен. Для больших почтовых ящиков и серверов, скорее всего не подойдёт. Но там странно было бы надеяться на бэкап через imap. Большие ящики надо бэкапить с уровня хранилища почты.
Отдельно отмечу возможность создавать учётные записи пользователей самой панели, к которым можно добавлять разные почтовые ящики с общим поиском по ним. Для каких-то задач это может быть простым и удобным решением.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
———
ServerAdmin:
#mailserver #backup
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍103👎2
В современных системах хранения есть проблема частичного повреждения данных при длительном хранении. Это когда на носитель записан бит 1 или 0, а со временем по разным причинам он поменял своё значение. Называют это Bit Rot или битовым гниением.
На работе я никогда не сталкивался с этим, потому что никогда не приходилось работать с данными, которые хранятся много лет и потом используются. Обычно все всё хранят на всякий случай, но потом данные 10+ лет мало кому нужны. Но даже если и нужны, то изменения нескольких бит не всегда приводят к каким-то фатальным последствиям, так что проблем можно и не заметить, кроме каких-то частных случаев с неизменяемыми архивами.
Дома замечал на очень старых фотках (15+ лет), что некоторые с искажениями или часть изображения не грузится. Не могу сказать на 100%, что это проблема с bitrot, но похоже.
Бороться с этим можно разными способами:
◽️Использование файловых систем с автоматическим контролем данных: ZFS, Btrfs, ReiserFS, Ceph. Хранилища на их основе должны быть собраны с избыточностью. То есть каждый файл должен храниться как минимум в двух или более копиях, чтобы было откуда восстанавливать повреждённый.
◽️Использование механизма Linux DM-integrity или аналогов. С его помощью можно любое блочное устройство превратить в устройство с контролем целостности. А поверх развернуть любую файловую систему. Если на устройстве с DM-integrity использовать Mdadm или LVM с избыточностью, то они тоже будут пытаться автоматически восстанавливать повреждённые файлы.
◽️Условно ручная периодическая проверка хэшей файлов с помощью тех или иных инструментов и восстановление повреждённых из других копий. Сами файлы могут храниться где угодно.
Нет однозначного решения, что лучше применять. Всё зависит от конкретной ситуации. Например, очень большие системы обычно используют именно третий вариант и просто хранят данные на обычных файловых системах и дисках, даже без рейд массивов, в нескольких копиях. А вся информация о файлах хранится в базе данных. Повреждённый файл заменяется из копии.
Для личных архивов холодных данных тоже на мой взгляд третий вариант проще и надёжнее. Даже если использовать ZFS, то должно быть несколько копий данных. А они уже сами по себе защищают вас от bitrot, главное узнать об этом вовремя. Достаточно иметь 2-3 копии в разных местах и периодически (не очень часто) проверять хэши фалов. Сделать это можно, к примеру, с помощью скрипта bitrot.
Скрипт рекурсивно сканирует директорию, из которой запущен, проверяет хэши SHA1 файлов, записывает результаты в SQLite базу, которую кладёт сюда же в директорию. Если хэш изменится, а дата изменения файла - нет, значит файл повреждён. Утилита об этом сообщит. Будет показан текущий хэш, прошлый и дата, когда он был сделан. Нужно будет повреждённый файл восстановить из бэкапа (который так же проверяется).
Покажу, как это работает. Копируем себе скрипт
Изменим один из файлов, сохранив его метку времени, чтобы потом восстановить:
Редактируем файл, если он текстовый, либо снимаем дамп хекс редактором и заливаем обратно. Примерно так:
Меняем файл
Восстанавливаем метку времени:
Снова запускаем
Видим расхождение в хэшах при неизменной mtime, что говорит о повреждении файла. Его надо восстановить.
В проде для архивов хорошо бы иметь ZFS с избыточностью, но это не отменяет подобную проверку, так как в самой ZFS тоже могут быть ошибки, либо где-то ещё. Старые данные всё равно желательно периодически сверять тем или иным способом.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
———
ServerAdmin:📱 Telegram | 🌐 Сайт | 📲 MAX
#backup
На работе я никогда не сталкивался с этим, потому что никогда не приходилось работать с данными, которые хранятся много лет и потом используются. Обычно все всё хранят на всякий случай, но потом данные 10+ лет мало кому нужны. Но даже если и нужны, то изменения нескольких бит не всегда приводят к каким-то фатальным последствиям, так что проблем можно и не заметить, кроме каких-то частных случаев с неизменяемыми архивами.
Дома замечал на очень старых фотках (15+ лет), что некоторые с искажениями или часть изображения не грузится. Не могу сказать на 100%, что это проблема с bitrot, но похоже.
Бороться с этим можно разными способами:
◽️Использование файловых систем с автоматическим контролем данных: ZFS, Btrfs, ReiserFS, Ceph. Хранилища на их основе должны быть собраны с избыточностью. То есть каждый файл должен храниться как минимум в двух или более копиях, чтобы было откуда восстанавливать повреждённый.
◽️Использование механизма Linux DM-integrity или аналогов. С его помощью можно любое блочное устройство превратить в устройство с контролем целостности. А поверх развернуть любую файловую систему. Если на устройстве с DM-integrity использовать Mdadm или LVM с избыточностью, то они тоже будут пытаться автоматически восстанавливать повреждённые файлы.
◽️Условно ручная периодическая проверка хэшей файлов с помощью тех или иных инструментов и восстановление повреждённых из других копий. Сами файлы могут храниться где угодно.
Нет однозначного решения, что лучше применять. Всё зависит от конкретной ситуации. Например, очень большие системы обычно используют именно третий вариант и просто хранят данные на обычных файловых системах и дисках, даже без рейд массивов, в нескольких копиях. А вся информация о файлах хранится в базе данных. Повреждённый файл заменяется из копии.
Для личных архивов холодных данных тоже на мой взгляд третий вариант проще и надёжнее. Даже если использовать ZFS, то должно быть несколько копий данных. А они уже сами по себе защищают вас от bitrot, главное узнать об этом вовремя. Достаточно иметь 2-3 копии в разных местах и периодически (не очень часто) проверять хэши фалов. Сделать это можно, к примеру, с помощью скрипта bitrot.
Скрипт рекурсивно сканирует директорию, из которой запущен, проверяет хэши SHA1 файлов, записывает результаты в SQLite базу, которую кладёт сюда же в директорию. Если хэш изменится, а дата изменения файла - нет, значит файл повреждён. Утилита об этом сообщит. Будет показан текущий хэш, прошлый и дата, когда он был сделан. Нужно будет повреждённый файл восстановить из бэкапа (который так же проверяется).
Покажу, как это работает. Копируем себе скрипт
bitrot.py из репозитория, кладём в директорию с данными и запускаем:# ./bitrot.pyИзменим один из файлов, сохранив его метку времени, чтобы потом восстановить:
# MTIME=$(stat -c %y file.bin)Редактируем файл, если он текстовый, либо снимаем дамп хекс редактором и заливаем обратно. Примерно так:
# xxd file.bin > file.hexМеняем файл
file.hex текстовым редактором, заливаем обратно изменённый дамп:# xxd -r file.hex file.binВосстанавливаем метку времени:
# touch -d "$MTIME" file.binСнова запускаем
bitrot.py:# ./bitrot.pyChecking bitrot.db integrity... ok.error: SHA1 mismatch for ./file.bin: expected 615063b57508bf491223b5, got 95061866745edc76c75aebbe4. Last good hash checked on 2025-12-15 20:29:19+0000.Видим расхождение в хэшах при неизменной mtime, что говорит о повреждении файла. Его надо восстановить.
В проде для архивов хорошо бы иметь ZFS с избыточностью, но это не отменяет подобную проверку, так как в самой ZFS тоже могут быть ошибки, либо где-то ещё. Старые данные всё равно желательно периодически сверять тем или иным способом.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
———
ServerAdmin:
#backup
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍96👎1
По какой-то причине практически отсутствует как класс программное обеспечение для архивирования почты и последующей работы с архивами. По крайней мере мне ничего такого на ум не приходит, кроме некоторых небольших проектов. Про один из них я недавно писал - Mail-Archiver.
Сегодня рассмотрю другое бесплатное ПО по этой же теме - Open Archiver. По сравнению с Mail-Archiver он выглядит более функциональным и технологичным. Внешне тоже больше понравился. Но сразу скажу, что проект не очень зрелый, появился недавно. Есть некоторые баги, скупая документация. Я немного повозился, прежде чем развернул его. Но в итоге всё получилось.
📌 Возможности и особенности Open Archiver:
▪️Сбор почты по IMAP, в том числе с Google Workspace и Microsoft 365, импорт из PST и Mbox файлов.
▪️Почта хранится в виде .eml файлов с зашифрованным содержимым.
▪️Для хранения может использоваться локальная директория или S3 хранилище.
▪️Развитый поиск по телу письма и вложениям, в том числе с распознаванием PDF, DOCX, XLSX, архивов и др., в том числе картинок. В бэкенде распознавания там Apache Tika, а поисковой движок Meilisearch. Сразу скажу, что поиск работает хорошо и быстро. По крайней мере на моих тестах.
▪️Проверка и сравнение хэшей писем и вложений на оригинальном сервере и архиве.
▪️RBAC модель доступа пользователей, то есть можно создавать роли с разными правами и назначать пользователям. Кто-то может только читать, кто-то и удалять, кто-то добавлять новые ящики и т.д. Можно глобально запретить любое удаление писем или ящиков из Open Archiver.
▪️Все действия с системой можно выполнять через API.
Я недавно раздумывал над задачей, как разгрузить хранилище большого почтового сервера, где куча ящиков уволенных людей. Всё это занимает много места, не особо надо, но удалить нельзя. Вдруг ещё понадобится. Причём это не домыслы. Иногда реально старая почта нужна. Как-то раз я помогал найти письма давно уволившегося сотрудника для заверения у нотариуса, так как начались судебные разбирательства по одному старому делу.
Весь этот объём постоянно тянется от основного хранилища по цепочке бэкапов и занимает место. У меня была идея сделать отдельный почтовый сервер для таких ящиков, переносить их туда и там с ними работать. Навскидку Open Archiver выглядит удобнее для этой задачи. Думаю, что буду пробовать его в этой роли.
Установить Open Archiver нетрудно, так как он упакован в Docker контейнеры, но есть нюансы, которые я не сразу узнал. Рассказываю, как быстро установить.
Клонируем репозиторий:
Правим переменные окружения:
В файле
Ключевыми являются параметры ORIGIN и ENCRYPTION_KEY. По умолчанию ORIGIN=$APP_URL, а надо явно прописать. Если не указать ENCRYPTION_KEY, то после установки не запустится начальная настройка, невозможно будет создать администратора. При этом по умолчанию ENCRYPTION_KEY не задан, просто пустое значение. Если не указать STORAGE_ENCRYPTION_KEY, то хранилище писем не будет шифроваться. По умолчанию ENABLE_DELETION=false. Невозможно будет удалить добавленные ящики. Я не сразу понял, почему они не удаляются, потом разобрался. JWT_SECRET и MEILI_MASTER_KEY можно оставить по умолчанию на тестовой установке. На работу они не влияют.
После того, как заполните .env, запускаем:
Я сначала в консольном режиме запускаю, чтобы смотреть логи. Некоторые проблемы увидел как раз по логу. Потом можно запустить в режиме службы.
В целом, у меня всё получилось. Добавил 3 ящика, один старый от mail ru. Всё заработало. Синхронизация работает значительно быстрее, чем в Mail-Archiver.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
———
ServerAdmin:📱 Telegram | 🌐 Сайт | 📲 MAX
#mailserver #backup
Сегодня рассмотрю другое бесплатное ПО по этой же теме - Open Archiver. По сравнению с Mail-Archiver он выглядит более функциональным и технологичным. Внешне тоже больше понравился. Но сразу скажу, что проект не очень зрелый, появился недавно. Есть некоторые баги, скупая документация. Я немного повозился, прежде чем развернул его. Но в итоге всё получилось.
▪️Сбор почты по IMAP, в том числе с Google Workspace и Microsoft 365, импорт из PST и Mbox файлов.
▪️Почта хранится в виде .eml файлов с зашифрованным содержимым.
▪️Для хранения может использоваться локальная директория или S3 хранилище.
▪️Развитый поиск по телу письма и вложениям, в том числе с распознаванием PDF, DOCX, XLSX, архивов и др., в том числе картинок. В бэкенде распознавания там Apache Tika, а поисковой движок Meilisearch. Сразу скажу, что поиск работает хорошо и быстро. По крайней мере на моих тестах.
▪️Проверка и сравнение хэшей писем и вложений на оригинальном сервере и архиве.
▪️RBAC модель доступа пользователей, то есть можно создавать роли с разными правами и назначать пользователям. Кто-то может только читать, кто-то и удалять, кто-то добавлять новые ящики и т.д. Можно глобально запретить любое удаление писем или ящиков из Open Archiver.
▪️Все действия с системой можно выполнять через API.
Я недавно раздумывал над задачей, как разгрузить хранилище большого почтового сервера, где куча ящиков уволенных людей. Всё это занимает много места, не особо надо, но удалить нельзя. Вдруг ещё понадобится. Причём это не домыслы. Иногда реально старая почта нужна. Как-то раз я помогал найти письма давно уволившегося сотрудника для заверения у нотариуса, так как начались судебные разбирательства по одному старому делу.
Весь этот объём постоянно тянется от основного хранилища по цепочке бэкапов и занимает место. У меня была идея сделать отдельный почтовый сервер для таких ящиков, переносить их туда и там с ними работать. Навскидку Open Archiver выглядит удобнее для этой задачи. Думаю, что буду пробовать его в этой роли.
Установить Open Archiver нетрудно, так как он упакован в Docker контейнеры, но есть нюансы, которые я не сразу узнал. Рассказываю, как быстро установить.
Клонируем репозиторий:
# git clone https://github.com/LogicLabs-OU/OpenArchiver.git# cd OpenArchiverПравим переменные окружения:
# cp .env.example .envВ файле
.env нужно обязательно указать несколько параметров, для запуска на IP адресе, а не реальном домене:APP_URL=http://192.168.137.38:3000ORIGIN=http://192.168.137.38:3000ENCRYPTION_KEY=952e40feca16JWT_SECRET=9VRzbD56aYpFSTORAGE_ENCRYPTION_KEY=50348f31f0281MEILI_MASTER_KEY=abk3pAhzgk6NENABLE_DELETION=trueКлючевыми являются параметры ORIGIN и ENCRYPTION_KEY. По умолчанию ORIGIN=$APP_URL, а надо явно прописать. Если не указать ENCRYPTION_KEY, то после установки не запустится начальная настройка, невозможно будет создать администратора. При этом по умолчанию ENCRYPTION_KEY не задан, просто пустое значение. Если не указать STORAGE_ENCRYPTION_KEY, то хранилище писем не будет шифроваться. По умолчанию ENABLE_DELETION=false. Невозможно будет удалить добавленные ящики. Я не сразу понял, почему они не удаляются, потом разобрался. JWT_SECRET и MEILI_MASTER_KEY можно оставить по умолчанию на тестовой установке. На работу они не влияют.
После того, как заполните .env, запускаем:
# docker compose upЯ сначала в консольном режиме запускаю, чтобы смотреть логи. Некоторые проблемы увидел как раз по логу. Потом можно запустить в режиме службы.
В целом, у меня всё получилось. Добавил 3 ящика, один старый от mail ru. Всё заработало. Синхронизация работает значительно быстрее, чем в Mail-Archiver.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
———
ServerAdmin:
#mailserver #backup
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍113👎3
Есть отдельная категория программ для синхронизации между собой каталогов. Они прям так и выглядят, как файловые менеджеры с двумя панелями, в которых открыты разные каталоги. И там же настраиваются параметры синхронизации.
Я в разное время использовал следующих представителей этих программ:
◽️ GoodSync - очень крутая и функциональная программа, но платная. Она старая, с большой историей, в том числе лекарств. Если надо, без проблем всё находится. У меня до сих пор хранится и работает какая-то древняя версия 15-ти летней давности.
◽️ FreeFileSync - это более простой аналог GoodSync, но зато полностью бесплатный. При этом кроссплатформенный. Много всего умеет, в том числе подключатся к некоторым облачным дискам, или к тем же линуксам по sftp.
Подобные программы удобны для копирования разнородных бэкапов с одного хранилища в другое, если нет какой-то централизованной системы.
❗️Дома, к примеру, я держу на одном из компьютеров свой полный Яндекс.Диск и бэкаплю его таким образом, делая полную локальную копию с сохранением истории изменения файлов. Один раз меня эта копия спасла, когда в облаке пропала часть файлов. Вроде писал об этом заметку.
Так что имейте ввиду, кто ещё не сталкивался и рассчитывает на надёжность платных облачных решений. Там ваши файлы могут безвозвратно пропасть и никто их не восстановит. Если их очень много и нет какого-то контроля изменений, потеря даже небольшой части в какой-то момент может оказаться неприятным сюрпризом.
К чему я это всё. Как уже не первый раз бывало, я недавно увидел упоминание бесплатной программы под Windows - SyncToy. Ей сто лет в обед, входила в состав PowerToys и полностью бесплатна. Решает ровно одну задачу - синхронизация двух каталогов. Поддерживает 3 режима синхронизации:
- полная двусторонняя синхронизация каталогов;
- односторонняя синхронизация изменений в одном каталоге;
- односторонняя синхронизация изменений с сохранением удалённых файлов, изменения перезаписываются.
Последний вариант идеально подходит под локальный бэкап облачных дисков, типа Яндекс.Диска. Стал искать информацию про SyncToy. Оказалось, что в 2021 году Microsoft прекратила его поддержку и убрала загрузку с своего сайта, закрыла сайт программы. Найти дистрибутив можно только на каких-то сторонних сайтах, где она ещё осталась.
Мне стало любопытно проверить самую старую версию последнего релиза от 2009 года. Скачал, проверил подпись, проверил на вирусы, всё чисто (загрузил к себе). Установил на свежую Win11, и всё заработало. Предварительно нужно через Панель управления в компонентах системы установить .NET Framework 3.5. У меня он уже стоял, так что программа сразу заработала без каких-либо проблем и ошибок.
Не знаю, почему её Microsoft удалила. Не мешала же никому столько лет. Нормально работает до сих пор. У программы есть консольный режим, так что можно запускать задачи через системный планировщик.
Если хотите решить задачу синхронизации каталогов без постороннего софта, то можно взять консольный robocopy, который есть в системе по умолчанию. Там отдельный ключ для этого. Синхронизация выглядит примерно так в самом простом варианте:
По логике и возможностям чем-то линуксовый rsync напоминает. Тоже ворох ключей, проверок, уточнений, выборки, логирования и т.д. В несколько этапов можно и версионирование сделать, и сохранение удалённых файлов.
☝️ Если ещё не бэкапите свой облачный диск, обязательно это сделайте. У меня этих копий теперь несколько, а одна с сохранением истории. После той истории стало страшно всё потерять из-за ошибки и синхронизировать потерю между всеми бэкапами. Когда опомнишься, уже поздно будет.
———
ServerAdmin:📱 Telegram | 🌐 Сайт | 📲 MAX
#windows #backup
Я в разное время использовал следующих представителей этих программ:
◽️ GoodSync - очень крутая и функциональная программа, но платная. Она старая, с большой историей, в том числе лекарств. Если надо, без проблем всё находится. У меня до сих пор хранится и работает какая-то древняя версия 15-ти летней давности.
◽️ FreeFileSync - это более простой аналог GoodSync, но зато полностью бесплатный. При этом кроссплатформенный. Много всего умеет, в том числе подключатся к некоторым облачным дискам, или к тем же линуксам по sftp.
Подобные программы удобны для копирования разнородных бэкапов с одного хранилища в другое, если нет какой-то централизованной системы.
❗️Дома, к примеру, я держу на одном из компьютеров свой полный Яндекс.Диск и бэкаплю его таким образом, делая полную локальную копию с сохранением истории изменения файлов. Один раз меня эта копия спасла, когда в облаке пропала часть файлов. Вроде писал об этом заметку.
Так что имейте ввиду, кто ещё не сталкивался и рассчитывает на надёжность платных облачных решений. Там ваши файлы могут безвозвратно пропасть и никто их не восстановит. Если их очень много и нет какого-то контроля изменений, потеря даже небольшой части в какой-то момент может оказаться неприятным сюрпризом.
К чему я это всё. Как уже не первый раз бывало, я недавно увидел упоминание бесплатной программы под Windows - SyncToy. Ей сто лет в обед, входила в состав PowerToys и полностью бесплатна. Решает ровно одну задачу - синхронизация двух каталогов. Поддерживает 3 режима синхронизации:
- полная двусторонняя синхронизация каталогов;
- односторонняя синхронизация изменений в одном каталоге;
- односторонняя синхронизация изменений с сохранением удалённых файлов, изменения перезаписываются.
Последний вариант идеально подходит под локальный бэкап облачных дисков, типа Яндекс.Диска. Стал искать информацию про SyncToy. Оказалось, что в 2021 году Microsoft прекратила его поддержку и убрала загрузку с своего сайта, закрыла сайт программы. Найти дистрибутив можно только на каких-то сторонних сайтах, где она ещё осталась.
Мне стало любопытно проверить самую старую версию последнего релиза от 2009 года. Скачал, проверил подпись, проверил на вирусы, всё чисто (загрузил к себе). Установил на свежую Win11, и всё заработало. Предварительно нужно через Панель управления в компонентах системы установить .NET Framework 3.5. У меня он уже стоял, так что программа сразу заработала без каких-либо проблем и ошибок.
Не знаю, почему её Microsoft удалила. Не мешала же никому столько лет. Нормально работает до сих пор. У программы есть консольный режим, так что можно запускать задачи через системный планировщик.
Если хотите решить задачу синхронизации каталогов без постороннего софта, то можно взять консольный robocopy, который есть в системе по умолчанию. Там отдельный ключ для этого. Синхронизация выглядит примерно так в самом простом варианте:
# robocopy "D:\Source" "E:\Backup" /MIRПо логике и возможностям чем-то линуксовый rsync напоминает. Тоже ворох ключей, проверок, уточнений, выборки, логирования и т.д. В несколько этапов можно и версионирование сделать, и сохранение удалённых файлов.
☝️ Если ещё не бэкапите свой облачный диск, обязательно это сделайте. У меня этих копий теперь несколько, а одна с сохранением истории. После той истории стало страшно всё потерять из-за ошибки и синхронизировать потерю между всеми бэкапами. Когда опомнишься, уже поздно будет.
———
ServerAdmin:
#windows #backup
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍103👎1
В конце прошлого года по каналам проскочило упоминание новой веб панели для бэкапов на базе Restic под названием Zerobyte. Мне нравится Restic за его простоту, скорость и функциональность, поэтому я сразу обратил на неё внимание, но решил подождать некоторого развития, чтобы понять, собственно, будет оно или нет.
На прошлой неделе видел видео, где упоминалась Zerobyte, так что решил её попробовать сам. Сразу скажу, что панелька понравилась. Я её подробно изучил и проверил на реальных примерах, так что могу обстоятельно всё рассказать.
📌 Особенности Zerobyte:
▪️Приятный и логичный веб интерфейс.
▪️В качестве бэкенда для бэкапов использует Restic. У меня было много заметок про него с примерами, можно по тэгу посмотреть, так что не буду повторяться и рассказывать, что это такое.
▪️В качестве бэкенда для хранения может использовать локальную директорию, S3, Rest Server, SFTP, Rclone и некоторые другие облачные хранилища.
▪️Может бэкапить локальные директории, SMB и NFS шары, ресурсы, доступные по WebDAV и SFTP.
Связка Restic и Rclone делает Zerobyte универсальным решением, которое выполняет роль управляющей обвязки и не вносит свой слой обработки. То есть в случае чего доступ к бэкапам и данным можно получить напрямую, минуя веб панель.
Я для примера подключил к Zerobyte шару по SMB и забэкапил её в S3 бакет Селектела. Доступ в S3 настроен через Rclone, так что начнём настройку с него. Ставим на сервер, где будет работать Zerobyte:
Дальше настраиваем доступ к хранилищу S3. Для этого надо создать бакет, выдать права через отдельного сервисного пользователя и настроить доступ через rclone. Я не буду всё это описывать, так как очень большой объём. В документации хостера подробно показано. Я в своё время по ним делал. После настройки надо проверить, что через Rclone виден подключенный бакет:
Теперь рисуем конфигурацию
Вот мой итоговый
Запускаем:
Идём в веб интерфейс по IP адресу сервера на порт 4096, создаём нового пользователя.
Теперь вам нужно создать Volume - это источник бэкапов. Потом создаём репозиторий - место, где будут храниться бэкапы. В качестве бэкенда указываем Rclone и настроенный ранее Remote в Селектеле.
После этого идём в раздел Backups и добавляем задание, запускаем. После того, как оно отработает, можно сходить в бакет и проверить, появились ли там данные. В бакете будет располагаться шифрованный репозиторий Restic. Сами данные вы не увидите, так как Restic всё шифрует, поэтому в качестве хранилища можно использовать всё, что угодно. Тот же Rclone поддерживает подключение к Яндекс.Диску.
Провозился несколько часов, пока всё проверил и настроил. Долго ковырялся с подключением по SMB, пока не понял, что ошибка Permission denied во время подключения это не ошибка доступа к шаре, а нехватка прав у контейнера.
В целом продукт интересный, мне понравился. Если продолжит развитие, то завоюет популярность.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
———
ServerAdmin:📱 Telegram | 🌐 Сайт | 📲 MAX
#restic #backup
На прошлой неделе видел видео, где упоминалась Zerobyte, так что решил её попробовать сам. Сразу скажу, что панелька понравилась. Я её подробно изучил и проверил на реальных примерах, так что могу обстоятельно всё рассказать.
📌 Особенности Zerobyte:
▪️Приятный и логичный веб интерфейс.
▪️В качестве бэкенда для бэкапов использует Restic. У меня было много заметок про него с примерами, можно по тэгу посмотреть, так что не буду повторяться и рассказывать, что это такое.
▪️В качестве бэкенда для хранения может использовать локальную директорию, S3, Rest Server, SFTP, Rclone и некоторые другие облачные хранилища.
▪️Может бэкапить локальные директории, SMB и NFS шары, ресурсы, доступные по WebDAV и SFTP.
Связка Restic и Rclone делает Zerobyte универсальным решением, которое выполняет роль управляющей обвязки и не вносит свой слой обработки. То есть в случае чего доступ к бэкапам и данным можно получить напрямую, минуя веб панель.
Я для примера подключил к Zerobyte шару по SMB и забэкапил её в S3 бакет Селектела. Доступ в S3 настроен через Rclone, так что начнём настройку с него. Ставим на сервер, где будет работать Zerobyte:
# apt install rcloneДальше настраиваем доступ к хранилищу S3. Для этого надо создать бакет, выдать права через отдельного сервисного пользователя и настроить доступ через rclone. Я не буду всё это описывать, так как очень большой объём. В документации хостера подробно показано. Я в своё время по ним делал. После настройки надо проверить, что через Rclone виден подключенный бакет:
# rclone ls selectel_s3:zerobyteТеперь рисуем конфигурацию
compose.yml для запуска панели. Я обнаружил в ней один баг, из-за которого не получалось в качестве источника для бэкапов смонтировать внутрь контейнера SMB или NFS ресурс. Контейнеру не хватает каких-то прав. Решается добавлением этих прав или запуска контейнера в привилегированном режиме. Если это недопустимо, то можно монтировать ресурсы к хосту и прокидывать в контейнер.Вот мой итоговый
compose.yml:services:
zerobyte:
image: ghcr.io/nicotsx/zerobyte:v0.25
container_name: zerobyte
restart: unless-stopped
cap_add:
- SYS_ADMIN
- SYS_PTRACE
security_opt:
- seccomp:unconfined
- apparmor:unconfined
ports:
- "4096:4096"
devices:
- /dev/fuse:/dev/fuse
environment:
- TZ=Europe/Moscow
- BASE_URL=http://192.168.137.29:4096
- APP_SECRET=f47c06b21f12a2261f9dd
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/lib/zerobyte:/var/lib/zerobyte
- /mnt/backup:/backup
- ~/.config/rclone:/root/.config/rclone:ro
Запускаем:
# docker compose up -dИдём в веб интерфейс по IP адресу сервера на порт 4096, создаём нового пользователя.
Теперь вам нужно создать Volume - это источник бэкапов. Потом создаём репозиторий - место, где будут храниться бэкапы. В качестве бэкенда указываем Rclone и настроенный ранее Remote в Селектеле.
После этого идём в раздел Backups и добавляем задание, запускаем. После того, как оно отработает, можно сходить в бакет и проверить, появились ли там данные. В бакете будет располагаться шифрованный репозиторий Restic. Сами данные вы не увидите, так как Restic всё шифрует, поэтому в качестве хранилища можно использовать всё, что угодно. Тот же Rclone поддерживает подключение к Яндекс.Диску.
Провозился несколько часов, пока всё проверил и настроил. Долго ковырялся с подключением по SMB, пока не понял, что ошибка Permission denied во время подключения это не ошибка доступа к шаре, а нехватка прав у контейнера.
В целом продукт интересный, мне понравился. Если продолжит развитие, то завоюет популярность.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
———
ServerAdmin:
#restic #backup
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍88👎2
Недавно в обсуждениях всплыл вопрос использования Rclone c Яндекс.Диском. У последнего заявлена поддержка этого облака. Я много работал с Яндекс.Диском в разное время. У него очень низкая стоимость хранения. Туда можно очень дёшево положить одну из копий бэкапов, чем я и занимался.
Для работы с облачным диском в Linux в разное время я использовал разные инструменты, так как Яндекс периодически менял условия доступа и ставил палки в колёса для нежелательных методов.
1️⃣ Доступ по протоколу webdav. Он и сейчас заявлен, как доступный протокол, но работать по нему фактически невозможно. Скорость никакая, постоянные разрывы связи.
2️⃣ Консольный клиент для Linux. Большие объёмы данных через него удобно загружать, но есть один нюанс. Через консольный клиент нельзя просто загрузить файлы в облако, без синхронизации локального и удалённого каталога. То есть у вас локально должно быть достаточно свободного места для копии облачных файлов. Для небольших виртуалок, с которых надо просто забрать файл, это не подходит.
3️⃣ Использование API. Рабочий вариант для каких-то ситуаций, но надо заморочиться с настройкой доступа и выпуском токенов. Сейчас может упростили процедуру, но когда я занимался, немного утомился от этой кухни.
4️⃣ Использование Rclone. По ссылке пример использования в Windows 3 года назад. Тогда работало нормально. Можно было даже примонтировать облачный диск к системе с помощью Rclone.
Я решил проверить, как сейчас работает Rclone с Яндекс.Диском в Linux. Сразу скажу, что работает отлично. Настраивается очень просто и быстро. На загрузку утилизировал весь доступный у меня дома канал. Никаких задержек и отвалов.
Показываю, как с ним работать. Устанавливаем rclone:
Настраиваем конфигурацию для Яндекс.Диска:
Дальше будут нюансы. Я действовал по инструкции на сайте rclone. Для аутентификации в сервисе через OAuth понадобится браузер. В результате будет получен токен, который можно использовать где угодно. То есть машина с браузером понадобится один раз для получения токена.
Я использовал свой ноутбук с Windows, а Rclone для получения токена запустил в WSL. Для этого воспользовался приведённой выше инструкцией, а когда в консоли увидел ссылку вида http://127.0.0.1:53682/auth?state=rOjTxRP71Dexbyal-faud, просто скопировал её в браузере и там же залогинился в сервис. Если у вас нет возможности запустить браузер локально вместе с запуском Rclone, а на удалённой машине нет GUI, то можно сделать проброс порта с удалённой машины на локальную через SSH:
Почитать, как это работает, можно в заметке.
На выходе получил конфигурацию в файле
Эту конфигурацию можно перенести на целевой сервер и там работать с Яндекс.Диском. Сама работа выглядит примерно так.
Создаём директорию backup:
Копируем туда файл:
Смотрим содержимое директории:
Удаляем файл:
Очищаем корзину:
Работает всё четко. Я проверял результаты команд через веб интерфейс. Можно использовать в своих костылях из скриптов. Дешевле хранилища для данных не найти.
Отмечу только один нюанс, если будете загружать за раз много больших файлов. После каждой загрузки файла происходит задержка, связанная с тем, что облако что-то делает с файлом. Может проверяет, может хэши считает, неизвестно. Происходит заметная задержка на десятки секунд после загрузки. Если дефолтных таймаутов rclone не будет хватать, увеличьте их через ключ
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
———
ServerAdmin:📱 Telegram | 🌐 Сайт | 📲 MAX
#rclone #backup
Для работы с облачным диском в Linux в разное время я использовал разные инструменты, так как Яндекс периодически менял условия доступа и ставил палки в колёса для нежелательных методов.
Я решил проверить, как сейчас работает Rclone с Яндекс.Диском в Linux. Сразу скажу, что работает отлично. Настраивается очень просто и быстро. На загрузку утилизировал весь доступный у меня дома канал. Никаких задержек и отвалов.
Показываю, как с ним работать. Устанавливаем rclone:
# apt install rcloneНастраиваем конфигурацию для Яндекс.Диска:
# rclone configДальше будут нюансы. Я действовал по инструкции на сайте rclone. Для аутентификации в сервисе через OAuth понадобится браузер. В результате будет получен токен, который можно использовать где угодно. То есть машина с браузером понадобится один раз для получения токена.
Я использовал свой ноутбук с Windows, а Rclone для получения токена запустил в WSL. Для этого воспользовался приведённой выше инструкцией, а когда в консоли увидел ссылку вида http://127.0.0.1:53682/auth?state=rOjTxRP71Dexbyal-faud, просто скопировал её в браузере и там же залогинился в сервис. Если у вас нет возможности запустить браузер локально вместе с запуском Rclone, а на удалённой машине нет GUI, то можно сделать проброс порта с удалённой машины на локальную через SSH:
# ssh -L localhost:53682:localhost:53682 username@remote_serverПочитать, как это работает, можно в заметке.
На выходе получил конфигурацию в файле
~/.config/rclone/rclone.conf вида:[yandex]type = yandextoken = {"access_token":"y0_g8MWLxkkwkw_Cn9EpiGIH_A","token_type":"OAuth","refresh_token":"2:AAAbtrsyM:23rBwLS_kWbXMr6V1Mr7xA","expiry":"2027-02-24T18:49:25.82348698+03:00"}Эту конфигурацию можно перенести на целевой сервер и там работать с Яндекс.Диском. Сама работа выглядит примерно так.
Создаём директорию backup:
# rclone mkdir yandex:backupКопируем туда файл:
# rclone copy ics-13.0.0-2025.12.08-14.40.iso yandex:backupСмотрим содержимое директории:
# rclone ls yandex:backupУдаляем файл:
# rclone delete yandex:backup/ics-13.0.0-2025.12.08-14.40.isoОчищаем корзину:
# rclone cleanup yandex:Работает всё четко. Я проверял результаты команд через веб интерфейс. Можно использовать в своих костылях из скриптов. Дешевле хранилища для данных не найти.
Отмечу только один нюанс, если будете загружать за раз много больших файлов. После каждой загрузки файла происходит задержка, связанная с тем, что облако что-то делает с файлом. Может проверяет, может хэши считает, неизвестно. Происходит заметная задержка на десятки секунд после загрузки. Если дефолтных таймаутов rclone не будет хватать, увеличьте их через ключ
--timeout.❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
———
ServerAdmin:
#rclone #backup
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍165👎2
Мне недавно один читатель задал простой вопрос, который заставил задуматься. Человек пояснил, что он далёк от ИТ, не сильно во всём этом разбирается, но хочет себя обезопасить от потери информации. Для этого он купил два одинаковых SSD в компьютер и хочет регулярно копировать всю информацию с одного диска на второй, чтобы в случае выхода из строя основного, он бы просто загрузился с другого и продолжил работу.
Запрос прост и понятен, но при этом лично я его в таком виде вообще никогда не решал. Первое, что мне приходит на ум, это RAID1. А второе - ПО для бэкапа, которое делает образ системного диска, который потом с помощью загрузочного диска можно быстро развернуть на любом новом железе. Делать постоянно полную копию диска нерационально с точки зрения времени бэкапа. Каждый раз это будет либо полная копия, либо как минимум полное сравнение двух дисков, поэтому лично я никогда так не делал.
Спрашивающий не разбирается ни в настройке RAID, ни в загрузочных дисках. Ему надо просто копию диска с системой Windows и регулярное её обновление из-под этой же системы. Я много писал про программы для бэкапа, но сходу не вспомнил, в какой бесплатной программе это реализовано. Например, бесплатный Veeam Agent, которым я сам пользуюсь, так не умеет. Навёл справки и узнал, что клон диска умеют делать бесплатные Hasleo Backup Suite Free и AOMEI Backupper Standard. Но там нет возможности сделать задачу для этих действий. Сделать клон можно только вручную.
Я лично проверил программу Hasleo. Системный диск нормально клонировался прямо из-под рабочей системы. Я его заменил копией, всё нормально загрузилось. Но нет никакой возможности автоматизировать этот процесс. У программы есть CLI, но там можно оперировать только задачами бэкапа. А клонирование диска идёт отдельной операцией, напрямую с бэкапами не связанной.
Немного помучал ИИшки на эту тему. Они, конечно, предлагали всякие костыли на тему diskshadow, монтирование и копирование образов, загрузочных разделов с помощью скриптов. Но мне всё это показалось слишком сложным и ненадёжным. Даже не стал пробовать. Особенно позабавил DeepSeek. Он написал, как сделать клон через Hasleo, и указал, что там же можно и задание на регулярное выполнение создать. Указал источник информации. Нажимаю на источник и открывается моя заметка в TG по этой программе. Он её прочитал и сделал ошибочное мнение о том, что есть такая возможность. В реальности её нет.
Честно говоря, думал, что есть какие-то простые бесплатные утилиты для этой задачи, типа того же
И всё, вообще никаких хлопот. DD есть и под Windows, но полностью всё скопировать в одно действие, как в Linux, не получится.
По итогу получается, что для решения этой задачи надо взять либо какую-то платную программу, типа Handy Backup, либо бесплатную Hasleo Backup Suite Free и делать клон вручную. В принципе, это нормальный вариант. Сами данные можно бэкапить каждый день автоматически куда-то во вне, например, на NAS, а систему раз в неделю вручную клонировать на второй диск. Ну и третий вариант - писать какие-то костыли на скриптах.
Если знаете простое и бесплатное решение этой задачи, поделитесь. По идее, запрос то простой и понятный для неискушённого человека. Сломался диск, сделал загрузочным в биосе запасной и продолжил работу. Ещё и от всяких вирусов, шифровальщиков защита, если клон диска не смонтирован в системе. Настроенный RAID1 сразу убьёт оба диска, а тут копия останется сохранной и позволит быстро восстановить работу. Я в итоге посоветовал Hasleo и ручное создание клона.
———
ServerAdmin:📱 Telegram | 🌐 Сайт | 📲 MAX 😩
#backup #windows
Запрос прост и понятен, но при этом лично я его в таком виде вообще никогда не решал. Первое, что мне приходит на ум, это RAID1. А второе - ПО для бэкапа, которое делает образ системного диска, который потом с помощью загрузочного диска можно быстро развернуть на любом новом железе. Делать постоянно полную копию диска нерационально с точки зрения времени бэкапа. Каждый раз это будет либо полная копия, либо как минимум полное сравнение двух дисков, поэтому лично я никогда так не делал.
Спрашивающий не разбирается ни в настройке RAID, ни в загрузочных дисках. Ему надо просто копию диска с системой Windows и регулярное её обновление из-под этой же системы. Я много писал про программы для бэкапа, но сходу не вспомнил, в какой бесплатной программе это реализовано. Например, бесплатный Veeam Agent, которым я сам пользуюсь, так не умеет. Навёл справки и узнал, что клон диска умеют делать бесплатные Hasleo Backup Suite Free и AOMEI Backupper Standard. Но там нет возможности сделать задачу для этих действий. Сделать клон можно только вручную.
Я лично проверил программу Hasleo. Системный диск нормально клонировался прямо из-под рабочей системы. Я его заменил копией, всё нормально загрузилось. Но нет никакой возможности автоматизировать этот процесс. У программы есть CLI, но там можно оперировать только задачами бэкапа. А клонирование диска идёт отдельной операцией, напрямую с бэкапами не связанной.
Немного помучал ИИшки на эту тему. Они, конечно, предлагали всякие костыли на тему diskshadow, монтирование и копирование образов, загрузочных разделов с помощью скриптов. Но мне всё это показалось слишком сложным и ненадёжным. Даже не стал пробовать. Особенно позабавил DeepSeek. Он написал, как сделать клон через Hasleo, и указал, что там же можно и задание на регулярное выполнение создать. Указал источник информации. Нажимаю на источник и открывается моя заметка в TG по этой программе. Он её прочитал и сделал ошибочное мнение о том, что есть такая возможность. В реальности её нет.
Честно говоря, думал, что есть какие-то простые бесплатные утилиты для этой задачи, типа того же
dd в Linux. Там вообще 0 проблем с подобным клоном:# dd if=/dev/sda of=/dev/sdb bs=1M status=progressИ всё, вообще никаких хлопот. DD есть и под Windows, но полностью всё скопировать в одно действие, как в Linux, не получится.
По итогу получается, что для решения этой задачи надо взять либо какую-то платную программу, типа Handy Backup, либо бесплатную Hasleo Backup Suite Free и делать клон вручную. В принципе, это нормальный вариант. Сами данные можно бэкапить каждый день автоматически куда-то во вне, например, на NAS, а систему раз в неделю вручную клонировать на второй диск. Ну и третий вариант - писать какие-то костыли на скриптах.
Если знаете простое и бесплатное решение этой задачи, поделитесь. По идее, запрос то простой и понятный для неискушённого человека. Сломался диск, сделал загрузочным в биосе запасной и продолжил работу. Ещё и от всяких вирусов, шифровальщиков защита, если клон диска не смонтирован в системе. Настроенный RAID1 сразу убьёт оба диска, а тут копия останется сохранной и позволит быстро восстановить работу. Я в итоге посоветовал Hasleo и ручное создание клона.
———
ServerAdmin:
#backup #windows
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍90👎5
Никогда специально не интересовался, как ускорить обычные дампы в PostgreSQL. Если позволяет размер баз, то я предпочитаю делать именно логические бэкапы, а не бинарные. С ними проще работать, если их функциональности достаточно - снимок базы в конкретный момент времени. Рассказывал отдельно, как делаю эти дампы и как их проверяю.
Встал вопрос, как относительно просто и быстро ускорить процесс снятия дампа. Не буду подробно всё описывать, так это любая ИИ может сделать. Скажу только суть, чтобы вы понимали, что так можно.
Утилита
Формат custom - это уже бинарный дамп. Он жмётся по умолчанию. При сопоставимых настройках сжатия по скорости он +- такой же, как palin. Это наиболее популярный формат для дампов, так как из него можно восстанавливаться в несколько потоков, что значительно быстрее формата plain. Тот в восстановлении очень медленный.
Формат directory я вообще никогда не использовал. На первый взгляд он выглядит не очень удобным для обработки и длительного хранения. Но у него есть важное отличие - процесс создания дампа может быть многопоточным. И это серьёзно ускоряет его, если у вас все данные не лежат в одной большой таблице, так как создание параллелится на уровне таблиц. Я у себя потестировал на сервере с 16 ядрами дампить в 10 потоков. Прирост скорости примерно в 2 раза при одинаковых настройках сжатия по сравнению с plain и custom. То есть на ровном месте ускорил снятие дампов в 2 раза.
Почитал документацию и увидел параметр
Оказалось, что этот параметр не поддерживается в версии 15, которая используется у меня. А по умолчанию на сайте открывается документация для версии current, которая сейчас 18-я. Я не обратил на это внимание. Переключился на 15-ю версию и действительно увидел, что такого параметра там нет. Так что если у вас версия утилиты поддерживает изменение алгоритмов сжатия, то можно попробовать другие. Они должны быть быстрее gzip. Надо будет обновить этот сервер по возможности.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
———
ServerAdmin:📱 Telegram | 🌐 Сайт | 📲 MAX 😩
#postgresql #backup
Встал вопрос, как относительно просто и быстро ускорить процесс снятия дампа. Не буду подробно всё описывать, так это любая ИИ может сделать. Скажу только суть, чтобы вы понимали, что так можно.
Утилита
pg_dump может делать дампы в трёх форматах - plain, custom, directory. Plain - обычный текст. Самый медленный формат, но самый удобный в плане дальнейшей работы с ним. Из него можно вытащить отдельную таблицу, проверить какое-то содержимое, обрезать и т.д. По умолчанию он вообще не сжимается. Сжатие можно добавить настройкой pg_dump или через пайп пропустить.Формат custom - это уже бинарный дамп. Он жмётся по умолчанию. При сопоставимых настройках сжатия по скорости он +- такой же, как palin. Это наиболее популярный формат для дампов, так как из него можно восстанавливаться в несколько потоков, что значительно быстрее формата plain. Тот в восстановлении очень медленный.
Формат directory я вообще никогда не использовал. На первый взгляд он выглядит не очень удобным для обработки и длительного хранения. Но у него есть важное отличие - процесс создания дампа может быть многопоточным. И это серьёзно ускоряет его, если у вас все данные не лежат в одной большой таблице, так как создание параллелится на уровне таблиц. Я у себя потестировал на сервере с 16 ядрами дампить в 10 потоков. Прирост скорости примерно в 2 раза при одинаковых настройках сжатия по сравнению с plain и custom. То есть на ровном месте ускорил снятие дампов в 2 раза.
# sudo -u postgres /opt/pgpro/1c-15/bin/pg_dump -U postgres -Fd -Z6 -j10 -f /tmp/zup-baza01 zup-baza01Почитал документацию и увидел параметр
--compress=method[:detail]. По умолчанию используется сжатие gzip с уровнем компрессии 6, этот параметр его может изменить. Мне не особо критично сильно сжимать. Хотел ещё ускорить процесс и заменить медленный gzip на lz4 или zstd. И так, и сяк указывал параметры - ничего не помогает. Пишет, что неверное значение параметра. Сразу у ИИ спрашивать не стал, думал, уж с такой простой задачей справлюсь сам. Но увы, не справился.Оказалось, что этот параметр не поддерживается в версии 15, которая используется у меня. А по умолчанию на сайте открывается документация для версии current, которая сейчас 18-я. Я не обратил на это внимание. Переключился на 15-ю версию и действительно увидел, что такого параметра там нет. Так что если у вас версия утилиты поддерживает изменение алгоритмов сжатия, то можно попробовать другие. Они должны быть быстрее gzip. Надо будет обновить этот сервер по возможности.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
———
ServerAdmin:
#postgresql #backup
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
ServerAdmin.ru
Раз уж я рассмотрел панели для управления бэкапами (Postgresus и Pgbackweb) в виде дампов в Postgresql, было бы логично рассмотреть и вариант со своими велосипедами на bash. Поделюсь тем, что использую я.
Сначала полный текст скрипта для бэкапа:
#!/bin/bash…
Сначала полный текст скрипта для бэкапа:
#!/bin/bash…
👍84👎1
Синхронизация двух разнесённых хранилищ с файлами - нетривиальная задача, особенно если они состоят из десятков и сотен тысяч файлов. Сделать копию данных и регулярно синхронизировать - полдела. Нужно ещё как-то их сравнивать, чтобы убедиться в том, что данные в обоих местах идентичны. Мало того, что при передаче данные могут повредиться, так они ещё и со временем могут протухать из-за bit rot (битовое гниение на хранилищах) или silent corruption (повреждения из-за памяти, контроллеров, неисправных кабелей и т.д.)
С bit rot я лично сталкивался, так что это не гипотетическая ситуация. Хотя в моём случае это не приводило к каким-то проблемам, так как протухали очень старые данные, которые по сути никому уже и не нужны, а хранятся просто так, на всякий случай. Но где-то это может быть критично.
По моему опыту хранилища на несколько терабайт данных с сотнями тысяч файлов быстрее всего синхронизировать с помощью rsync. Я так обычно и делаю. У меня много заметок на этот счёт в канале. Особенность rsync в том, что он умеет быстро сравнивать хранилища и находить только изменившиеся файлы, учитывая размер файла и mtime. На основе этих данных формирует список разнящихся файлов и копирует только их.
Такой подход не страхует от повреждения файлов во время передачи. Хотя сетевые протоколы содержат собственные механизмы контроля целостности, файлы могут повредиться, например, из-за неисправной памяти, контроллеров или других аппаратных сбоев. Даже если ваше хранилище защищено от bit rot, гарантировать поступление точной копии файла оно не может. Нужны дополнительные проверки.
Rsync, как и некоторые другие подобные программы, могут сверять контрольные суммы файлов. Но это очень длительный процесс, если хранилище большое. В момент передачи данных делать это нецелесообразно. Процесс может растянуться на дни. Не так давно я в локальной сети сравнил два хранилища объёмом в 1ТБ, где хранятся ~100 тыс. файлов. У меня процесс длился в районе 20-ти часов.
Подсчитывать контрольные суммы для сравнения логичнее локально и отдельно от передачи, разнеся эти процессы по времени. Если синхронизация выполняется раз в день, то сравнение можно делать раз в неделю/месяц. Для этого есть много различных программ. Я недавно увидел анонс одной из них - precizer, поэтому и решил написать об этой теме. Ранее мне был знаком скрипт bitrot, который делает примерно то же самое, но не так изящно.
Precizer для максимального быстродействия написана на чистом Си, компилируется в одиночный бинарник, проста в использовании. Производительность в основном зависит от работы дисковой подсистемы, так как файлы приходится полностью читать. Обычно это узкое место. Результаты анализа файлов хранит в SQLite. Если её прервать, а потом запустить снова, она продолжит работу, не потеряв всё то, что сделала ранее. Это отличный инструмент для фоновой проверки хранилищ по расписанию.
Работает примерно так:
В базах share1.db и share2.db хранится относительный путь файла, его хэш SHA512 и метаданные (размер, ctime и mtime). Последующие запуски для обновления базы выполняются с ключом
Решений подобной задачи может быть несколько. Передача и сравнение файлов - только одно из них. Можно передавать снепшоты файловых систем, или систем хранения, если они это поддерживают. Например, снепшоты zfs или lvm и потом их сравнивать. Можно хранить данные в формате чанков, как это делает, к примеру, restic или borg и делать проверки на уровне чанков. Итоговое решение нужно выбирать по месту в зависимости от того, какая архитектура хранения и бэкапов используется. Уровень файлов имеет свои недостатки, но удобен, так как вы в случае чего сразу имеете живую копию данных, которую сможете использовать без преобразования или каких-то ещё дополнительных действий.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
———
ServerAdmin:📱 Telegram | 🌐 Сайт | 📲 MAX 😩
#backup
С bit rot я лично сталкивался, так что это не гипотетическая ситуация. Хотя в моём случае это не приводило к каким-то проблемам, так как протухали очень старые данные, которые по сути никому уже и не нужны, а хранятся просто так, на всякий случай. Но где-то это может быть критично.
По моему опыту хранилища на несколько терабайт данных с сотнями тысяч файлов быстрее всего синхронизировать с помощью rsync. Я так обычно и делаю. У меня много заметок на этот счёт в канале. Особенность rsync в том, что он умеет быстро сравнивать хранилища и находить только изменившиеся файлы, учитывая размер файла и mtime. На основе этих данных формирует список разнящихся файлов и копирует только их.
Такой подход не страхует от повреждения файлов во время передачи. Хотя сетевые протоколы содержат собственные механизмы контроля целостности, файлы могут повредиться, например, из-за неисправной памяти, контроллеров или других аппаратных сбоев. Даже если ваше хранилище защищено от bit rot, гарантировать поступление точной копии файла оно не может. Нужны дополнительные проверки.
Rsync, как и некоторые другие подобные программы, могут сверять контрольные суммы файлов. Но это очень длительный процесс, если хранилище большое. В момент передачи данных делать это нецелесообразно. Процесс может растянуться на дни. Не так давно я в локальной сети сравнил два хранилища объёмом в 1ТБ, где хранятся ~100 тыс. файлов. У меня процесс длился в районе 20-ти часов.
Подсчитывать контрольные суммы для сравнения логичнее локально и отдельно от передачи, разнеся эти процессы по времени. Если синхронизация выполняется раз в день, то сравнение можно делать раз в неделю/месяц. Для этого есть много различных программ. Я недавно увидел анонс одной из них - precizer, поэтому и решил написать об этой теме. Ранее мне был знаком скрипт bitrot, который делает примерно то же самое, но не так изящно.
Precizer для максимального быстродействия написана на чистом Си, компилируется в одиночный бинарник, проста в использовании. Производительность в основном зависит от работы дисковой подсистемы, так как файлы приходится полностью читать. Обычно это узкое место. Результаты анализа файлов хранит в SQLite. Если её прервать, а потом запустить снова, она продолжит работу, не потеряв всё то, что сделала ранее. Это отличный инструмент для фоновой проверки хранилищ по расписанию.
Работает примерно так:
# precizer --progress --database=share1.db /mnt/share1# precizer --progress --database=share2.db /mnt/share2# precizer --compare share1.db share2.dbВ базах share1.db и share2.db хранится относительный путь файла, его хэш SHA512 и метаданные (размер, ctime и mtime). Последующие запуски для обновления базы выполняются с ключом
--update, чтобы заново не пересчитывать хэши к неизменившимся файлам. Решений подобной задачи может быть несколько. Передача и сравнение файлов - только одно из них. Можно передавать снепшоты файловых систем, или систем хранения, если они это поддерживают. Например, снепшоты zfs или lvm и потом их сравнивать. Можно хранить данные в формате чанков, как это делает, к примеру, restic или borg и делать проверки на уровне чанков. Итоговое решение нужно выбирать по месту в зависимости от того, какая архитектура хранения и бэкапов используется. Уровень файлов имеет свои недостатки, но удобен, так как вы в случае чего сразу имеете живую копию данных, которую сможете использовать без преобразования или каких-то ещё дополнительных действий.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
———
ServerAdmin:
#backup
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
ServerAdmin.ru
В недавнем цикле статей по LVM в комментариях всплывали вопросы так называемого Bit Rot или битового гниения. Это когда на носитель записан бит 1 или 0, а со временем по разным причинам он поменял своё значение. В конечном счёте эти изменения ведут к тому…
👍62👎1