특정 discourse 백업 버전 복원

수년간 작은 디스코르스(Discourse) 포럼을 운영해 왔는데, 잘 작동하고 있었습니다. 자동 백업을 설정해 두었지만, 디스코르스 버전을 오랫동안 업데이트하지 않았습니다.

서버가 죽었지만 백업은 가지고 있습니다. 백업은 약 2년 전의 구버전 디스코르스에서 만든 것입니다. 최신 버전을 설치하고 백업에서 복원하려고 하면 작동하지 않습니다. 구버전을 설치하려고 하면 불가능합니다. 설치 스크립트가 자동으로 새로운 커밋과 최신 Docker 이미지를 가져오기 때문이죠. 저는 런처 스크립트에서 해당 줄을 찾아서 삭제하기도 했지만, Docker 이미지 내부의 코드도 Git을 최신 버전으로 확인하고 업데이트하는 것 같습니다.

어떻게 해야 할까요? 구버전 디스코르스를 실행하거나, 새 버전에서 구버전 백업을 복원하는 방법이 있을까요?

도움이 필요하시다면 좀 더 구체적으로 말씀해 주셔야 합니다. 정상적으로 작동해야 합니다. 당시 사용하던 버전의 Discourse를 다시 설치할 수 있었다면, 그 문제도 마찬가지로 작동하지 않을 가능성이 높습니다.

복원을 시도했을 때 어떤 오류가 발생했나요?

./launcher logs app 출력에 치명적인 오류는 없지만, 포럼이 작동하지 않습니다. 거의 모든 버튼이 작동하지 않고, 게시글도 없으며, HTML이 이상하게 보입니다 (버그가 있는 시작 페이지가 반복되고, 끝없이 아래로 스크롤할 수 있습니다).

저는 전문적인 기술자가 아니므로, 어떤 로그를 보고 사항에 추가해야 하는지, 그리고 어디서 그 로그를 찾을 수 있는지 알려주시면 감사하겠습니다.

신뢰할 수 있는 로그를 어디서 찾을 수 있는지 아는 분 계신가요?

포럼의 /logs 경로에 오류가 있나요?

문제는 /logs에 접근할 수 없다는 겁니다. “이 페이지가 존재하지 않거나 비공개입니다”라는 메시지가 뜨거든요. 로그인해서 확인해 보려 해도 로그인이 안 됩니다.

https://forum.example.com/u/admin-login의 관리자 로그인을 사용해 보세요.[1].


  1. 매일 새로운 것을 배우게 되죠! ↩︎

링크를 보내주셔서 감사합니다. 하지만 작동하지 않습니다. 이메일은 전송되지만, 저는 SMTP 서버를 가지고 있지 않으며 이 플러그인을 사용하고 있습니다: Disable Email Verification for Discourse Plugin

서버에서 무슨 일이 일어났는지 확인하기 위해 콘솔 명령어를 사용할 수 있을까요?

제가 아는 한 그 플러그인은 깨져 있습니다. 사용하지 않는 것이 좋을 수도 있습니다(리메이크 버전을 사용하는 경우가 아니라면).

서버를 생성할 때, 이메일 확인 없이 계정을 만들 수 있도록 해주는 다른 해결책은 없었습니다.

지금은 고장 난 상태일 수도 있지만, 저는 적어도 포럼의 이전 버전을 복원하려고 노력하고 있습니다.

현재 백업을 가지고 있음에도 불구하고 포럼의 어떤 데이터에도 접근할 수 없습니다. 포럼 로고와 태그만 표시되고, 모든 버튼이 작동하지 않습니다.

아니, 그러면 일이 복잡해지네요. 로그를 확인해 보려면 여기에 언급된 방법을 시도해 볼 수 있을까요?

안전 모드를 시도해 보셨나요?

깨진 플러그인을 주석 처리하고, 다른 플러그인들도 모두 비활성화해 보세요. 무언가가 정상적으로 작동하기 시작하면 그때 다시 플러그인을 추가하면 됩니다.

Rails 프로덕션 로그에는 치명적인 오류가 없고, product_errors.log 파일은 비어 있습니다.

Unicorn 오류 로그 unknown OID 17246: failed to recognize type of 'embeddings'. It will be treated as String. Failed to report error: Connection refused - connect(2) for 127.0.0.1:6379 (redis://localhost:6379) 2 EOFError subscribe failed, reconnecting in 1 second. Call stack /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.25.2/lib/redis_client/ruby_connection.rb:103:in `rescue in read' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.25.2/lib/redis_client/ruby_connection.rb:94:in `read' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.25.2/lib/redis_client.rb:535:in `next_event' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-5.4.0/lib/redis/subscribe.rb:66:in `subscription' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-5.4.0/lib/redis/subscribe.rb:17:in `subscribe' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-5.4.0/lib/redis.rb:175:in `_subscription' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-5.4.0/lib/redis/commands/pubsub.rb:17:in `subscribe' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/message_bus-4.4.1/lib/message_bus/backends/redis.rb:293:in `global_subscribe' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/message_bus-4.4.1/lib/message_bus.rb:769:in `global_subscribe_thread' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/message_bus-4.4.1/lib/message_bus.rb:740:in `block in new_subscriber_thread' Failed to report error: Connection refused - connect(2) for 127.0.0.1:6379 (redis://localhost:6379) 3 Error fetching job: Connection refused - connect(2) for 127.0.0.1:6379 Failed to report error: Connection refused - connect(2) for 127.0.0.1:6379 (redis://localhost:6379) 3 Error fetching job: Connection refused - connect(2) for 127.0.0.1:6379 Failed to report error: Connection refused - connect(2) for 127.0.0.1:6379 (redis://localhost:6379) 3 Error fetching job: Connection refused - connect(2) for 127.0.0.1:6379 Failed to report error: Connection refused - connect(2) for 127.0.0.1:6379 (redis://localhost:6379) 3 Error fetching job: Connection refused - connect(2) for 127.0.0.1:6379 Failed to report error: Connection refused - connect(2) for 127.0.0.1:6379 (redis://localhost:6379) 3 Error fetching job: Connection refused - connect(2) for 127.0.0.1:6379 Failed to report error: Connection refused - connect(2) for 127.0.0.1:6379 (redis://localhost:6379) 3 Job exception: Connection refused - connect(2) for 127.0.0.1:6379 sidekiq-exception Failed to report error: Connection refused - connect(2) for 127.0.0.1:6379 (redis://localhost:6379) 3 Job exception: Connection refused - connect(2) for 127.0.0.1:6379 sidekiq-exception Failed to report error: Connection refused - connect(2) for 127.0.0.1:6379 (redis://localhost:6379) 3 Job exception: Connection refused - connect(2) for 127.0.0.1:6379 sidekiq-exception Failed to report error: Connection refused - connect(2) for 127.0.0.1:6379 (redis://localhost:6379) 3 Job exception: Connection refused - connect(2) for 127.0.0.1:6379 sidekiq-exception Failed to report error: Connection refused - connect(2) for 127.0.0.1:6379 (redis://localhost:6379) 3 Job exception: Connection refused - connect(2) for 127.0.0.1:6379 sidekiq-exception Failed to report error: Connection refused - connect(2) for 127.0.0.1:6379 (redis://localhost:6379) 3 heartbeat: Connection refused - connect(2) for 127.0.0.1:6379 Failed to report error: Connection refused - connect(2) for 127.0.0.1:6379 (redis://localhost:6379) 3 Job exception: Connection refused - connect(2) for 127.0.0.1:6379 (redis://localhost:6379) sidekiq-exception Failed to report error: Connection refused - connect(2) for 127.0.0.1:6379 (redis://localhost:6379) 2 Connection refused - connect(2) for 127.0.0.1:6379 (redis://localhost:6379) subscribe failed, reconnecting in 1 second. Call stack /usr/local/lib/ruby/3.3.0/socket.rb:1219:in `__connect_nonblock' /usr/local/lib/ruby/3.3.0/socket.rb:1219:in `connect_nonblock' /usr/local/lib/ruby/3.3.0/socket.rb:60:in `connect_internal' /usr/local/lib/ruby/3.3.0/socket.rb:141:in `connect' /usr/local/lib/ruby/3.3.0/socket.rb:647:in `block in tcp' /usr/local/lib/ruby/3.3.0/socket.rb:231:in `each' /usr/local/lib/ruby/3.3.0/socket.rb:231:in `foreach' /usr/local/lib/ruby/3.3.0/socket.rb:637:in `tcp' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.25.2/lib/redis_client/ruby_connection.rb:120:in `connect' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.25.2/lib/redis_client/connection_mixin.rb:11:in `reconnect' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.25.2/lib/redis_client.rb:769:in `block in connect' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.25.2/lib/redis_client/middlewares.rb:12:in `connect' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.25.2/lib/redis_client.rb:768:in `connect' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.25.2/lib/redis_client.rb:759:in `raw_connection' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.25.2/lib/redis_client.rb:719:in `ensure_connected' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.25.2/lib/redis_client.rb:314:in `call_v' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-5.4.0/lib/redis/client.rb:90:in `call_v' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-mini-profiler-4.0.1/lib/mini_profiler/profiling_methods.rb:90:in `block in profile_method' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-5.4.0/lib/redis.rb:152:in `block in send_command' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-5.4.0/lib/redis.rb:151:in `synchronize' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-5.4.0/lib/redis.rb:151:in `send_command' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-5.4.0/lib/redis/commands/strings.rb:191:in `get' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/message_bus-4.4.1/lib/message_bus/backends/redis.rb:366:in `process_global_backlog' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/message_bus-4.4.1/lib/message_bus/backends/redis.rb:279:in `block in global_subscribe' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/message_bus-4.4.1/lib/message_bus/backends/redis.rb:291:in `global_subscribe' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/message_bus-4.4.1/lib/message_bus.rb:769:in `global_subscribe_thread' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/message_bus-4.4.1/lib/message_bus.rb:740:in `block in new_subscriber_thread' unknown OID 17246: failed to recognize type of 'embeddings'. It will be treated as String.

Sidekiq 로그는 비어 있습니다.

Nginx 로그에는 문제가 없습니다.

Unicorn 로그에서 Redis 연결 문제를 발견했지만, Redis 로그 자체에는 오류가 없습니다:

9706:C 28 Aug 2025 15:11:25.025 * Fork CoW for RDB: current 1 MB, peak 1 MB, average 0 MB 881:M 28 Aug 2025 15:11:25.106 * Background saving terminated with success 881:M 28 Aug 2025 15:16:26.096 * 100 changes in 300 seconds. Saving... 881:M 28 Aug 2025 15:16:26.097 * Background saving started by pid 10037 10037:C 28 Aug 2025 15:16:26.109 * DB saved on disk 10037:C 28 Aug 2025 15:16:26.109 * Fork CoW for RDB: current 1 MB, peak 1 MB, average 0 MB 881:M 28 Aug 2025 15:16:26.198 * Background saving terminated with success 881:M 28 Aug 2025 15:21:27.004 * 100 changes in 300 seconds. Saving... 881:M 28 Aug 2025 15:21:27.004 * Background saving started by pid 10365 10365:C 28 Aug 2025 15:21:27.019 * DB saved on disk 10365:C 28 Aug 2025 15:21:27.019 * Fork CoW for RDB: current 1 MB, peak 1 MB, average 0 MB 881:M 28 Aug 2025 15:21:27.105 * Background saving terminated with success 881:M 28 Aug 2025 15:26:28.030 * 100 changes in 300 seconds. Saving... 881:M 28 Aug 2025 15:26:28.031 * Background saving started by pid 10703 10703:C 28 Aug 2025 15:26:28.050 * DB saved on disk 10703:C 28 Aug 2025 15:26:28.051 * Fork CoW for RDB: current 1 MB, peak 1 MB, average 0 MB 881:M 28 Aug 2025 15:26:28.132 * Background saving terminated with success 881:M 28 Aug 2025 15:31:29.094 * 100 changes in 300 seconds. Saving... 881:M 28 Aug 2025 15:31:29.095 * Background saving started by pid 11028 11028:C 28 Aug 2025 15:31:29.109 * DB saved on disk 11028:C 28 Aug 2025 15:31:29.110 * Fork CoW for RDB: current 1 MB, peak 1 MB, average 0 MB 881:M 28 Aug 2025 15:31:29.196 * Background saving terminated with success

Postgresql 로그에도 오류가 없습니다.

활성화하는 방법은 무엇인가요?

죄송합니다. “safe mode” 대신 "safe-mode"를 입력했는데, 자동 링크가 되지 않는다는 것을 알아채지 못했습니다.

감사합니다. 도움이 되었고 포럼은 작동하고 있습니다(완벽하지는 않지만, 콘텐츠를 포함한 주제에 접근할 수는 있습니다).

그러나 안전 모드 없이 포럼은 사용할 수 없으며, 정확히 어떤 플러그인을 설치했는지 기억이 나지 않습니다. 플러그인 목록은 app.yml 파일에 있어야 하지만, 서버는 죽어 있고 제가 아는 한 백업에는 app.yml 파일이 포함되어 있지 않습니다. 포럼을 복구하고 손상된 플러그인을 제거하려면 어떻게 해야 합니까?

기존 app.yml 파일을 사용하지 않고 복원하는 경우, 번들된 플러그인(모두 공식 플러그인입니다)을 제외하고는 어떤 플러그인도 설치되어서는 안 됩니다.

그러나 테마와 테마 구성 요소는 백업에 포함되므로, 이들을 비활성화해 보시기 바랍니다.

또한 안전 모드를 사용하고 테마와 구성 요소만 비활성화하여 문제가 그 중 하나에 의해 발생하는지 확인해 볼 수도 있습니다.

감사합니다. 실제로 테마가 없을 때만 작동하는데, 테마는 어디서 찾을 수 있나요? 백업에는 dump.sql.gz 파일과 uploads 폴더 두 가지 항목만 보이는데, uploads 폴더에는 사용자 미디어와 파일만 포함되어 있습니다.

관리자 화면에서 테마에 바로 접근할 수 있습니다. 먼저 모든 테마를 비활성화한 후 하나씩 활성화하는 방식으로 진행하면 됩니다.