Install Discourse for development using Docker

현재 M1 칩이 탑재된 Mac에서 Docker를 통해 Discourse를 실행하는 방법이 없나요?

d/boot_dev --init를 실행할 때 다음과 같은 오류가 발생했습니다:

ActiveRecord::NoDatabaseError: We could not find your database: discourse_development. Available database configurations can be found in config/database.yml. (ActiveRecord::NoDatabaseError)

이것이 boot_dev 스크립트의 버그인지, 아니면 discourse_development 데이터베이스가 다른 곳에서 생성되어야 하는 것인지 확실하지 않습니다. 어쨌든 저는 다음과 같은 변경 사항을 통해 문제를 해결할 수 있었습니다:

diff --git a/bin/docker/boot_dev b/bin/docker/boot_dev
index 89fdcf6f65..0e9c5ce7d5 100755
--- a/bin/docker/boot_dev
+++ b/bin/docker/boot_dev
@@ -122,6 +122,7 @@ echo "pnpm install..."
 
 if [ "${initialize}" = "initialize" ]; then
     echo "Migrating database..."
+    "${SCRIPTPATH}/rake" db:create
     "${SCRIPTPATH}/rake" db:migrate
     RAILS_ENV=test "${SCRIPTPATH}/rake" db:migrate

이후 OP의 지침에 따라 설정 프로세스가 정상적으로 실행되었습니다.

저는 Discourse 코드베이스에 충분히 익숙하지 않아 이것이 올바른 수정 방법인지 알 수 없지만, 도움이 된다면 PR을 제출하는 데 기꺼이 응하겠습니다. :slightly_smiling_face:

6개의 좋아요

네, 물론이죠! PR을 생성해서 여기에 링크해 주세요. 감사합니다!

4개의 좋아요

완료!

3개의 좋아요

실행하는 데 성공하셨나요?

저도 같은 오류가 발생했습니다. docker rm -f /discourse_dev를 실행한 후 d/boot_dev --init를 다시 실행했는데, 이번에는 정상적으로 작동했습니다.

주의할 점:
방금 확인해 보니 폴더가 tmp/postgres가 아니라 data/postgres이고, 이것이 바로 “데이터베이스 초기화” 명령이 data 폴더를 삭제 대상으로 삼는 이유입니다. :slight_smile:

2개의 좋아요

docker dev 설치에 대해 다시 한번 시도해 보려 했는데, 계속 다음 오류가 발생합니다:

Caused by:
PG::ConnectionBad: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory (PG::ConnectionBad)
        Is the server running locally and accepting connections on that socket?

하지만 서비스는 정상적으로 실행 중임을 확인할 수 있습니다(일반적인 docker가 아닌 “수동” 설치 방식으로 discourse를 사용할 때는 정상 작동합니다).

~/discourse_docker/discourse$ sudo service postgresql status
● postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
     Active: active (exited) since Mon 2025-03-10 17:26:13 GMT; 6min ago
    Process: 2052109 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
   Main PID: 2052109 (code=exited, status=0/SUCCESS)

Mar 10 17:26:13 black-knight systemd[1]: Starting PostgreSQL RDBMS...
Mar 10 17:26:13 black-knight systemd[1]: Finished PostgreSQL RDBMS.

Docker Dev에는 Postgres 연결에 대해 특별하거나 다른 요구 사항이 있는 건가요?

2개의 좋아요

기본 :debug 로그 레벨은 너무 상세하다고 느꼈습니다. SQL 쿼리가 중요한 오류를 가려버리거든요. config/environments/development.rb 파일에서 DISCOURSE_DEV_LOG_LEVEL을 설정할 수 있지만, d/rails 스크립트를 통해 이 설정을 할 수 있는지 모르겠습니다.

어쨌든 저는 임시로 config/environments/development.rb 파일에 config.log_level = :info로 하드코딩했는데, 제 문제에는 해결이 되었습니다. 다른 분들에게도 도움이 될 수 있을 것 같습니다.

1개의 좋아요

Data Explorer 플러그인으로 이걸 시작해 보고 싶은 건 DE 자동화 기능을 좀 더 자세히 살펴보고 싶어서입니다.

컨테이너는 정상적으로 시작했습니다.

그런 다음 리포지토리를 클론하고 disourse/plugins 디렉토리에 심볼릭 링크를 만드는 방식으로 플러그인을 "설치"하는 데 애를 먹었습니다(이게 맞는 방법인가요? 가이드에 이 부분이 훨씬 명확하게 나와 있으면 좋겠습니다).

UI에서 플러그인을 활성화했습니다. 하지만 접근을 시도하면 오류가 발생합니다.

로그에는 모두 이 내용만 표시됩니다:

Processing by DiscourseDataExplorer::QueryController#index as JSON
Completed 500 Internal Server Error in 62ms (ActiveRecord: 9.8ms (5 queries, 0 cached) | GC: 2.9ms)

이걸 어떻게 해석해야 하나요? 자세한 내용은 어디에 있나요?

1개의 좋아요

마이그레이션을 실행해 보셨나요?

플러그인 폴더를 심볼릭 링크로 연결하는 데에는 큰 성과를 거두지 못했습니다:

결국 일반 폴더로 전환하게 되었습니다(해당 스레드의 제 마지막 댓글을 참고하세요).

현재 Docker 볼륨, 파일 워처, 심볼릭 링크 사이에 일부 호환성 문제가 있는 것으로 보입니다.

2개의 좋아요

답변 주셔서 감사합니다, @Arkshine! 이 작업을 해야 한다는 걸 알리는 신호가 무엇이었어야 했나요? 플러그인 설치 튜토리얼은 확인해 봤는데, 튜토리얼 예제에 사용된 플러그인은 마이그레이션이 필요하지 않은 것 같습니다.

그동안, 제 회사의 프록시 인증서를 Docker 컨테이너에 넣어야 하는 상황에 부딪혔는데, Docker를 많이 사용해 본 경험이 없어서 이것이 문제를 해결해 줄지 모르겠습니다. :frowning:

어떤 문제를 해결하고 계신가요? 개발용 설치는 일반적으로 설치된 컴퓨터(즉, 로컬호스트)에서만 접근 가능하도록 구성됩니다.

아니면 인증 시스템처럼 인증서가 필요한 무언가를 디버깅하고 계신 건가요?

어제 이미지를 다시 시작하려고 했을 때, gems를 다운로드하라고 하더군요?

Installing gems...
Fetching source index from https://rubygems.org/

Retrying fetcher due to error (2/4): Bundler::Fetcher::CertificateFailureError Could not verify the SSL certificate for https://rubygems.org/.
There is a chance you are experiencing a man-in-the-middle attack, but most likely your system doesn't have the CA certificates needed for verification. For information about OpenSSL certificates, see https://railsapps.github.io/openssl-certificate-verify-failed.html.

Retrying fetcher due to error (3/4): Bundler::Fetcher::CertificateFailureError Could not verify the SSL certificate for https://rubygems.org/.
There is a chance you are experiencing a man-in-the-middle attack, but most likely your system doesn't have the CA certificates needed for verification. For information about OpenSSL certificates, see https://railsapps.github.io/openssl-certificate-verify-failed.html.

Retrying fetcher due to error (4/4): Bundler::Fetcher::CertificateFailureError Could not verify the SSL certificate for https://rubygems.org/.
There is a chance you are experiencing a man-in-the-middle attack, but most likely your system doesn't have the CA certificates needed for verification. For information about OpenSSL certificates, see https://railsapps.github.io/openssl-certificate-verify-failed.html.

Could not verify the SSL certificate for https://rubygems.org/.
There is a chance you are experiencing a man-in-the-middle attack, but most likely your system doesn't have
the CA certificates needed for verification. For information about OpenSSL certificates, see
https://railsapps.github.io/openssl-certificate-verify-failed.html.

아, 그러니까… 관리자 계정 비밀번호를 잊어버리면 어떻게 되나요? 개발 환경을 통째로 다시 설치해야 하나요?

이메일을 보낼 수 없어서 비밀번호 재설정도 불가능하거든요..

1개의 좋아요

콘솔을 사용하여 새 비밀번호를 설정하거나 새 관리자 계정을 생성할 수 있습니다.

1개의 좋아요

모든 사용자로 전환할 수 있는 라우트가 있습니다.

  http://localhost:4200/session/any-username/become 
5개의 좋아요

CLI에서 비밀번호를 초기화할 수 있다는 걸 알다니 좋아요.

해결이 됐는지 혹시 알고 있나요? :x: 단점: Ubuntu의 네이티브 개발 환경보다 약간 느리고, MacOS의 네이티브 설치 환경보다는 훨씬 느립니다. ?

사양을 모두 충족한다면 왜 이런 일이 발생하는 건가요?

이 로컬 개발 환경에서 백업 시 다음과 같은 오류가 발생합니다:

[2026-01-29 05:32:35] [STARTED]
[2026-01-29 05:32:35] 'system' has started the backup!
[2026-01-29 05:32:35] Marking backup as running...
[2026-01-29 05:32:35] Making sure '/src/tmp/backups/default/2026-01-29-053235' exists...
[2026-01-29 05:32:35] Making sure '/src/public/backups/default' exists...
[2026-01-29 05:32:35] Updating metadata...
[2026-01-29 05:32:35] Dumping the public schema of the database...
[2026-01-29 05:32:35] pg_dump: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL:  Peer authentication failed for user "postgres"
[2026-01-29 05:32:35] EXCEPTION: pg_dump failed
[2026-01-29 05:32:35] /src/lib/backup_restore/creator.rb:173:in `dump_public_schema'
/src/lib/backup_restore/creator.rb:36:in `run'
/src/lib/backup_restore.rb:13:in `backup!'
/src/app/jobs/regular/create_backup.rb:10:in `execute'
/src/app/jobs/base.rb:318:in `block (2 levels) in perform'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/rails_multisite-7.0.0/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/rails_multisite-7.0.0/lib/rails_multisite/connection_management.rb:17:in `with_connection'
/src/app/jobs/base.rb:305:in `block in perform'
/src/app/jobs/base.rb:301:in `each'
/src/app/jobs/base.rb:301:in `perform'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:220:in `execute_job'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:185:in `block (4 levels) in process'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:180:in `traverse'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'
/src/lib/sidekiq/suppress_user_email_errors.rb:6:in `call'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:182:in `traverse'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'
/src/lib/sidekiq/discourse_event.rb:6:in `call'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:182:in `traverse'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'
/src/lib/sidekiq/pausable.rb:131:in `call'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:182:in `traverse'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/job/interrupt_handler.rb:9:in `call'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:182:in `traverse'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/metrics/tracking.rb:26:in `track'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/metrics/tracking.rb:134:in `call'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:182:in `traverse'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:173:in `invoke'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:184:in `block (3 levels) in process'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:145:in `block (6 levels) in dispatch'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/job_retry.rb:118:in `local'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:144:in `block (5 levels) in dispatch'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/config.rb:39:in `block in <class:Config>'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:139:in `block (4 levels) in dispatch'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:281:in `stats'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:134:in `block (3 levels) in dispatch'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/job_logger.rb:15:in `call'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:133:in `block (2 levels) in dispatch'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/job_retry.rb:85:in `global'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:132:in `block in dispatch'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/job_logger.rb:40:in `prepare'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:131:in `dispatch'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:183:in `block (2 levels) in process'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:182:in `handle_interrupt'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:182:in `block in process'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:181:in `handle_interrupt'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:181:in `process'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:86:in `process_one'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:76:in `run'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/component.rb:10:in `watchdog'
/home/discourse/.bundle/gems/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/component.rb:19:in `block in safe_thread'
[2026-01-29 05:32:35] Cleaning stuff up...
[2026-01-29 05:32:35] Removing '.tar' leftovers...
[2026-01-29 05:32:35] Marking backup as finished...
[2026-01-29 05:32:35] Notifying 'system' of the end of the backup...

어떻게 해야 하나요?