Я использую Cloudflare R2 для загрузки медиафайлов, но, насколько я понимаю, это не подходит для резервного копирования базы данных. Какие директории файлов мне нужно резервировать с помощью rclone?
Вы можете найти тему ниже полезной
Файлы и директории Discourse для резервного копирования в ProtonDrive (помимо медиафайлов R2/S3)
Шаг 1 — Что означает upload://
upload://<длинный-хеш>
Комментарий
Discourse хранит в содержимом постов (raw/cooked) только ссылку upload://<хеш>. Во время сборки или при отображении Discourse обращается к своим таблицам базы данных (таким как uploads, post_uploads и т. д.), чтобы преобразовать эти хеши в реальные URL или пути в зависимости от того, где хранятся загруженные файлы (локально, CDN, S3/R2 и т. д.).
Шаг 2 — Где это находится внутри контейнера
/shared/uploads/default
Комментарий
В стандартной установке Docker (с использованием launcher и app.yml) директория /shared внутри контейнера монтируется с хост-системы из /var/discourse/shared/standalone. Всё постоянное содержимое, записываемое Discourse, включая загруженные файлы, логи, резервные копии и т. д., находится в /shared.
Шаг 3 — Путь в файловой системе хоста
/var/discourse/shared/standalone/uploads/default
Комментарий
Если вы не используете внешние хранилища для загрузки файлов (S3/R2), это основной путь, который необходимо синхронизировать с ProtonDrive для сохранения медиафайлов постов. Если вы используете S3/R2, большинство файлов не будут находиться здесь, но некоторые файлы (например, оптимизированные версии, заглушки) могут остаться. Решите, нужно ли вам делать резервную копию и этого.
Шаг 4 — Отображение тома Docker (app.yml)
volumes:
- volume:
host: /var/discourse/shared/standalone
guest: /shared
Комментарий
Всё содержимое /shared внутри контейнера становится /var/discourse/shared/standalone на хосте. Если вы сделаете резервную копию этой структуры, вы получите загруженные файлы, архивы резервных копий, логи и (опционально) данные PostgreSQL, если они хранятся на диске (хотя для восстановления обычно достаточно архивов резервных копий).
Конкретные цели для резервного копирования (локальное хранилище)
Минимальный набор (если вы доверяете резервным копиям в виде архивов от Discourse):
/var/discourse/shared/standalone/backups/ # Полные резервные копии, созданные Discourse (архивы .tar.gz)
/var/discourse/shared/standalone/uploads/ # Только если вы храните загруженные файлы локально
Комментарий
- Резервная копия в виде архива — это файл .tar.gz, созданный функцией резервного копирования Discourse. Он содержит дамп всей базы данных, конфигурацию сайта, темы и (опционально, если выбрано) все локальные загруженные файлы. Он не содержит медиафайлы, хранящиеся во внешних хранилищах S3/R2; только записи в базе данных, ссылающиеся на них.
- Если ваши загруженные файлы находятся в S3/R2, вам может потребоваться только
/backups/локально и отдельный процесс для резервного копирования вашего бакета объектного хранилища.
Набор “Всё, что мне когда-либо может понадобиться” (копия на уровне файловой системы):
/var/discourse/shared/standalone/backups/ # Полные резервные копии Discourse (архивы)
/var/discourse/shared/standalone/uploads/ # Локальные загруженные файлы/медиа (если не S3/R2)
/var/discourse/shared/standalone/log/rails/ # (Опционально) Логи Rails — полезны для криминалистики
/var/discourse/shared/standalone/tmp/backups/ # (Опционально) Временная подготовка резервных копий (обычно пуста)
/var/discourse/shared/standalone/postgres_data/ # (Опционально) Сырая директория данных PostgreSQL — обычно не требуется
/var/discourse/containers/ # Ваш app.yml и любые YML-файлы контейнеров (конфигурация)
/etc/letsencrypt/ # (Опционально) TLS-сертификаты, если SSL завершается на хосте
Комментарий
- Сырые данные PostgreSQL обычно не требуются, так как резервная копия в виде архива содержит логический дамп базы данных, который безопаснее для восстановления.
- /containers — небольшой, но критически важный для аварийного восстановления: здесь хранятся ваши настройки и сопоставления томов.
- TLS-сертификаты важны только если вы используете SSL вне контейнера.
Быстрая схема в одну строку
upload://<хеш>
↓
/shared/uploads/default (внутри Docker)
/var/discourse/shared/standalone/uploads/default (на хосте)
Комментарий
Если вы используете S3/R2:
- Отдельно сделайте резервную копию вашего бакета S3/R2 (например, с помощью Rclone).
- Также рассмотрите возможность резервного копирования
/backups/(архивы, содержащие базу данных, конфигурацию, загруженные файлы сайта, но не внешние медиафайлы) и/containers/.
Краткое резюме для темы ProtonDrive
- Локальные загруженные файлы? Сделайте резервную копию:
- /var/discourse/shared/standalone/uploads/
- /var/discourse/shared/standalone/backups/ # (содержит архивные резервные копии .tar.gz)
- Загруженные файлы в S3/R2? Сделайте резервную копию:
- /var/discourse/shared/standalone/backups/ # (архивные резервные копии: база данных/конфиг/таблица загруженных файлов)
- Ваш бакет S3/R2 с помощью другого инструмента
- Опционально: /containers/, /log/rails/ и postgres_data для полного покрытия аварийного восстановления
Комментарий
Резервная копия в виде архива: Файл .tar.gz, созданный системой резервного копирования Discourse, содержащий логический дамп базы данных, темы, конфигурации и (опционально) локальные загруженные файлы, но никогда не включающий внешние медиафайлы S3/R2.
Хочу отметить, что каждый из трёх раз, когда я переносил сервер, полагаясь на резервную копию в формате tarball для сохранения локальных загрузок, файл app.yml по умолчанию был разным.
Поэтому, вероятно, лучше вручную скопировать части старого файла app.yml, чтобы заменить соответствующие части нового файла.
Итак, как мне получить это из контейнера?
Я бы хотел попробовать команду docker cp для извлечения файла резервной копии в формате tarball из контейнера Discourse на хост-систему, если это необходимо.
- Базовый синтаксис: docker cp [ПУТ_ИСТОЧНИКА] [ИМЯ_КОНТЕЙНЕРА]:[ПУТ_НАЗНАЧЕНИЯ] и наоборот.