Запуск приложения из лаунчера выдаёт ошибку при попытке резервного копирования

Это выдаёт мне только ошибки при запуске Redis.

/var/discourse/launcher run app "echo 'BackupRestore::Backuper.new(Discourse.system_user.id, with_uploads: false).run' | rails c"

Если я запускаю rails c вручную, резервное копирование работает. Но эта однострочная команда тоже должна работать — или она работала ещё в 2020 году (или, может, в 2022…)

А что я на самом деле пытаюсь сделать, так это получить дамп базы данных, упакованный в таком месте, куда я смогу его переместить в S3. И нет, я не хочу делать это вручную — резервное копирование должно быть автоматизированным. И нет, одного раза в день недостаточно, потому что я не хочу терять целый день работы, если что-то пойдёт не так.

Просто добавляю ссылку на материал (от 2020 года) на случай, если его стоит обновить:

Вы имеете в виду подключение к Redis? Какое именно сообщение об ошибке вы видите?

Команда launcher run app выполняет команду в контексте нового контейнера, поэтому Redis не будет запущен. Это сработает только в том случае, если Redis работает во внешней среде.

Следующая команда должна сработать, так как она выполняется в контексте существующего контейнера:

docker exec -i app rails c <<<'BackupRestore::Backuper.new(Discourse.system_user.id, with_uploads: false).run'

Зачем вы делаете это таким способом, а не используете более простой вариант discourse backup --sql-only?

Вы также можете настроить Discourse так, чтобы он использовал S3 напрямую в качестве места для хранения резервных копий, если хотите.

Потому что Docker и контейнеры — это ужасные места, где ничего не работает, например, crontab и nano :joy: Я в общих чертах понимаю, что делать, когда вижу /var/discourse, но после ./launcher enter app я совершенно теряюсь. Вот почему мой сервер Mastodon делает резервные копии сам, а Discourse — нет (ну, раз в день всё же делает, но всё равно).

Да, я знаю, что discourse backup делает то, что мне нужно, он даже отправляет дамп в S3, но я не знаю, как настроить расписание — из-за этого ужасного и пугающего контейнера, который представляет собой ОС внутри ОС.

У вас же есть планировщик вне контейнера, верно?

Вы можете запланировать это там, например:

# добавить в crontab хоста
# запускать резервное копирование каждые 4 часа в начале часа
0 */4 * * * docker exec app discourse backup --sql-only

Это было настолько просто, что едва не стало самым большим анти-климаксом дня. И теперь у меня есть один awscli, который совершенно не нужен.

docker exec — вот ключ к разгадке… теперь у меня есть конкретная отправная точка для поиска в Google.

Спасибо!

Ага… та самая ошибка:

Couldn't connect to Redis
bundler: failed to load command: pry (/var/www/discourse/vendor/bundle/ruby/3.3.0/bin/pry)
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-4.8.1/lib/redis/client.rb:398:in `rescue in establish_connection': Error connecting to Redis on localhost:6379 (Errno::ECONNREFUSED) (Redis::CannotConnectError)

А после этого был список длиной в милю, где каждая строка начиналась со слова from, и там было миллион разных ruby-объектов, гемов и прочего. Выглядело это не очень интересно.