secondsite 메서드가 다시 작동하지 않는 것 같아서, 이제 같은 서버에서 두 사이트를 각각 다른 컨테이너로 실행하는 방법을 검토하고 있습니다.
이 부분에 대해 경험이 있으신 분은 메시지를 남겨 주세요.
secondsite 메서드가 다시 작동하지 않는 것 같아서, 이제 같은 서버에서 두 사이트를 각각 다른 컨테이너로 실행하는 방법을 검토하고 있습니다.
이 부분에 대해 경험이 있으신 분은 메시지를 남겨 주세요.
적당한 사양의 머신에서는 대부분 구현 가능합니다. 최소한 SSL을 처리하기 위해 리버스 프록시가 필요합니다. 그리고 포트 노출 대신 소켓 템플릿을 사용하는 것도 고려해 보세요.
docker 네트워크가 적절할까요?
무엇을 하고 있는지 정확히 알고 있다면, 네. 문제는 없어야 합니다.
traefik와 nginx 프록시를 사용하여 이를 구현했습니다. 멀티사이트 방식보다 더 많은 리소스를 사용하게 됩니다. 또한, postgres에 여러 데이터베이스를 설정하는 방법을 알아야 합니다(두 개의 postgres 인스턴스를 실행하는 것을 원한다면, 이는 여전히 더 많은 리소스가 필요합니다).
이 서버에는 프로세서 12개와 16기가바이트의 메모리가 있으며, 이는 트래픽이 많지 않은 포럼이므로 두 개의 컨테이너 모두에서 postgres를 실행하는 데 필요한 추가 리소스는 걱정하지 않습니다.
오직 두 컨테이너를 동시에 실행하는 방법을 알아내야 합니다. 한쪽을 재빌드하면 다른 쪽이 멈추기 때문입니다.
nginx에서 프록시 문제는 제가 처리할 수 있습니다.
app2.yml 같은 다른 yml 파일을 만들고, 다른 파일과 충돌하는 부분을 모두 수정해야 합니다.
Jay님,
에서 말씀하신 내용은, 두 컨테이너의 포트에 직접 접근하는 대신, 합리적인 호스트네임과 페일오버 구성(예: 로드 밸런서/헬스 체크를 앞단에 두고 동일한 DISCOURSE_HOSTNAME 사용) 뒤에 하나의 사이트처럼 두 컨테이너를 취급하라는 뜻인가요?
두 설정 파일이 모두 호스트 포트 바인딩 대신 동일한 Docker 네트워크에 참여할 수 있다고 가정하고, 이렇게 하면 명백한 충돌 중 일부는 피할 수 있을 것 같습니다. 이것이 올바른 접근 방식인가요?
그리고 volumes: 섹션의 경우, 바인드 마운트는 각 컨테이너마다 달라야 하는지(예: /var/discourse/shared/app1과 /var/discourse/shared/app2로 구분), 아니면 그중 일부는 공유하는 합리적인 방법이 있는지요?
감사합니다!
잠깐. Discourse를 두 번 클론한 건가요? Discourse는 한 번만 클론한 뒤, containers 디렉터리 안에 여러 개의 yml 파일을 두는 것이 좋습니다.
아마 Use Nginx Proxy Manager to manage multiple sites with Discourse 를 참고해 보실 수 있겠지만, 제가 실제로 사용해 본 것은 jwilder/nginx-proxy - Docker Image 입니다. YML 파일에 몇 가지 ENV 변수를 추가하면 연결은 가능하지만, 제대로 작동하게 하려면 이해해야 할 사항이 여전히 매우 많습니다.
각 사이트에는 각자의 호스트네임이 있습니다. 그게 바로 이 모든 작업의 목적이 아닌가요?
저는 리버스 프록시에게 컨테이너의 80번 포트와 대화하도록 설정합니다. 다른 사람들은 소켓을 사용하는 것을 선호하기도 합니다. 어떤 포트도 노출해서는 안 됩니다.
아니요. 그 파일들은 어떤 것도 공유할 수 없습니다.
각 사이트는 postgres 데이터베이스가 필요합니다 (그 방법을 안다면 동일한 postgres 서버를 사용할 수 있습니다).
각 사이트는 각자의 redis가 필요합니다. redis는 공유할 수 없으며, 이것이 멀티사이트 구성의 장점 중 하나입니다.
두 개의 postgres를 실행하고 싶다면, 호스트네임, smtp, 볼륨 경로를 변경하고 ssl 및 letsencrypt 템플릿을 제거하거나 주석 처리하면 됩니다. ./discourse-setup 을 다시 실행하기 전에 app.yml을 hostname.yml 등으로 이름 변경하면 discourse-setup 도 사용할 수 있습니다.
이 지점에 대해 좀 더 자세히 설명해 주실 수 있을까요? 아래 두 예시를 단일 사이트 구성이 아닌 두 번째 사이트 구성에 맞게 수정했습니다.
##########################################
# app1.yml (web + sidekiq)
##########################################
templates:
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
# - "templates/web.ssl.template.yml"
# - "templates/web.letsencrypt.ssl.template.yml"
- docker_args: "--network=discourse-net"
+ docker_args: "--network=discourse-net-1"
expose:
- "8001:80"
params:
version: tests-passed
env:
LC_ALL: en_US.UTF-8
LANG: en_US.UTF-8
LANGUAGE: en_US.UTF-8
DISCOURSE_HOSTNAME: "physicsyear2.site"
DISCOURSE_DEVELOPER_EMAILS: "tvgazebo5@gmail.com"
DISCOURSE_SMTP_ADDRESS: smtp-relay.brevo.com
DISCOURSE_SMTP_PORT: 2525
DISCOURSE_SMTP_USER_NAME: "YOUR_BREVO_USERNAME"
DISCOURSE_SMTP_PASSWORD: "YOUR_BREVO_PASSWORD"
DISCOURSE_NOTIFICATION_EMAIL: "noreply@physicsyear2.site"
## External Postgres
DISCOURSE_DB_HOST: pg
DISCOURSE_DB_PORT: 5432
DISCOURSE_DB_USERNAME: discourse
DISCOURSE_DB_PASSWORD: "REPLACE_ME_discordb_strong"
- DISCOURSE_DB_NAME: discourse
+ DISCOURSE_DB_NAME: discourse1
DISCOURSE_DB_SOCKET: ""
## External Redis
- DISCOURSE_REDIS_HOST: redis
+ DISCOURSE_REDIS_HOST: redis1
DISCOURSE_REDIS_PORT: 6379
DISCOURSE_REDIS_PASSWORD: "REPLACE_ME_redis_strong"
## MUST be identical on app1 and app2
SECRET_KEY_BASE: "REPLACE_ME_secret_key_base"
volumes:
- volume:
- host: /var/discourse/shared/web-only
+ host: /var/discourse/shared/web-only-1
guest: /shared
- volume:
- host: /var/discourse/shared/web-only/log/var-log
+ host: /var/discourse/shared/web-only/log/var-log-1
guest: /var/log
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/discourse/docker_manager.git
run:
- exec: echo "App1 starting — Sidekiq ENABLED"
# Note: NO sidekiq/down file here → Sidekiq runs
- exec: echo "App1 ready"
##########################################
# app2.yml (web + sidekiq)
##########################################
templates:
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
# - "templates/web.ssl.template.yml"
# - "templates/web.letsencrypt.ssl.template.yml"
- docker_args: "--network=discourse-net"
+ docker_args: "--network=discourse-net-2"
expose:
- "8002:80"
params:
version: tests-passed
env:
LC_ALL: en_US.UTF-8
LANG: en_US.UTF-8
LANGUAGE: en_US.UTF-8
- DISCOURSE_HOSTNAME: "physicsyear2.site"
+ DISCOURSE_HOSTNAME: "year2physics.site"
DISCOURSE_DEVELOPER_EMAILS: "ppyem3@gmail.com"
DISCOURSE_SMTP_ADDRESS: smtp-relay.brevo.com
DISCOURSE_SMTP_PORT: 2525
DISCOURSE_SMTP_USER_NAME: "YOUR_BREVO_USERNAME"
DISCOURSE_SMTP_PASSWORD: "YOUR_BREVO_PASSWORD"
DISCOURSE_NOTIFICATION_EMAIL: "noreply@physicsyear2.site"
## External Postgres
DISCOURSE_DB_HOST: pg
DISCOURSE_DB_PORT: 5432
DISCOURSE_DB_USERNAME: discourse
DISCOURSE_DB_PASSWORD: "REPLACE_ME_discordb_strong"
- DISCOURSE_DB_NAME: discourse
+ DISCOURSE_DB_NAME: discourse2
DISCOURSE_DB_SOCKET: ""
## External Redis
- DISCOURSE_REDIS_HOST: redis
+ DISCOURSE_REDIS_HOST: redis2
DISCOURSE_REDIS_PORT: 6379
DISCOURSE_REDIS_PASSWORD: "REPLACE_ME_redis_strong"
## MUST be identical on app1 and app2
SECRET_KEY_BASE: "REPLACE_ME_secret_key_base"
volumes:
- volume:
- host: /var/discourse/shared/web-only
+ host: /var/discourse/shared/web-only-2
guest: /shared
- volume:
- host: /var/discourse/shared/web-only/log/var-log
+ host: /var/discourse/shared/web-only/log/var-log-2
guest: /var/log
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/discourse/docker_manager.git
run:
- exec: echo "App2 starting — Sidekiq ENABLED"
# IMPORTANT: we DO NOT create /etc/service/sidekiq/down here
# so Sidekiq also runs in app2
- exec: echo "App2 ready"
./discourse-setup를 다시 실행하기 전에app.yml을 예를 들어hostname.yml로 이름 변경하면discourse-setup을 사용할 수도 있습니다.
이것은 좋은 방법인 것 같고, app.yml 대신 의도된 호스트네임으로 이름 붙여진 yml 파일을 사용해야 했기 때문에 .\discourse-setup이 작동하지 않았던 이유를 설명해 주는 것 같습니다.
최소 지금은 Discourse가 두 개나 따로 있으니, 이것저것 좀 해볼 수 있을 것 같습니다. 앞서 말씀드렸듯이 이 시스템은 충분히 크고 사이트들은 작아서, 이런 식으로 복제를 해도 문제가 되지 않을 거라고 생각합니다.
모든 것이 다시 정상적으로 온라인에 올라간 것 같습니다.
앞서 말했듯이, 이 시스템은 충분히 크고 사이트들은 충분히 작아서 무언가를 중복하는 것이 문제가 되지 않는다고 생각합니다.
공간 문제가 아닙니다. 그저 혼란스럽다는 것이죠. 이 시스템은 단일 디스코urs 클론과 컨테이너 디렉토리에 있는 모든 컨테이너를 포함하도록 설계되었습니다. 그래서 '컨테이너’라고 불리는 것입니다.
알겠습니다. 내일 고칠 것 같아요. 쉬운 수정으로 보이네요.