런처 실행 앱에서 백업 시도 시 오류 발생

이렇게 하면 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로 옮길 수 있는 위치에 저장하는 것입니다. 그리고 아니요, 수동으로 하려는 것이 아닙니다. 백업은 자동화되어야 합니다. 그리고 하루에 한 번은 부족합니다. 만약 문제가 발생하면 24시간 분량의 데이터를 잃고 싶지 않으니까요.

참고(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로 보내기도 하죠. 하지만 타이밍을 어떻게 잡아야 할지 모르겠어요 — 바로 그 끔찍하고 무서운 컨테이너, 즉 OS 안에 있는 OS 같은 그거 때문이거든요.

컨테이너 외부에서 사용할 수 있는 스케줄러가 있나요?

거기에서 스케줄링할 수 있습니다. 예를 들어:

# 호스트 crontab에 추가
# 매 4시간마다 정각에 백업 실행
0 */4 * * * docker exec app discourse backup --sql-only

너무 쉬워서 거의 그날의 가장 큰 실망감이 될 뻔했어요. 그리고 이제 쓸모없는 awscli 하나를 들고 있게 됐네요.

여기서 핵심은 docker exec입니다… 이제 구글링을 시작할 단단한 단서를 하나 갖게 됐네요.

감사합니다!

아, 맞다… 그 에러 말이야:

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 관련 라이브러리나 gem 같은 것들이 줄줄이 나열된 엄청나게 긴 목록이 있었어. 별로 흥미롭지 않아 보였지.