세부 정보:
서버에는 BrainyCP 패널이 설치되어 있으며, Apache와 Nginx를 사용하고 있습니다(현재 웹사이트는 Docker 컨테이너를 리버스 프록시하는 Nginx를 사용 중입니다). HTTP_CF_CONNECTING_IP는 Docker 컨테이너 내부에서 127.0.0.1으로 표시되지만, 외부에서는 정상적인 값을 가집니다.
커스텀 명령을 통해 헤더를 변경하지 않으면 Discourse는 서버의 IP를 표시합니다.
(현재 제 Discourse 인스턴스가 재구축 중이므로, 곧 더 많은 세부 정보를 추가하겠습니다.)
다시 빌드했지만 여전히 서버 IP가 표시됩니다. (커스텀 커맨드를 주석 처리해 두었습니다)
## 빌드 후 실행할 커스텀 커맨드
run:
- exec: echo "Beginning of custom commands"
## 첫 번째 가입 시 'From' 이메일 주소를 설정하려면 주석을 해제하고 변경하세요:
## 첫 번째 가입 이메일을 받은 후 해당 줄을 다시 주석 처리하세요. 한 번만 실행하면 됩니다.
- exec: rails r "SiteSetting.notification_email='noreply@zeronet.space'"
#- replace:
# filename: /etc/nginx/conf.d/discourse.conf
# from: "types {"
# to: |
# set_real_ip_from 85.25.134.45;
# real_ip_header CF-Connection-IP;
# real_ip_recursive on;
# types {
#- replace:
# filename: /etc/nginx/conf.d/discourse.conf
# from: $proxy_add_x_forwarded_for
# to: $send_http_cf_connection_ip;
# global: true
- exec: echo "End of custom commands"
주석을 해제해야 하나요? (또한 app.yml에 Cloudflare 템플릿을 추가하기 전에 이미 작동하지 않았다는 점도 참고해 주세요)
Cloudflare의 실제 IP 관련 기능이 어떻게 작동하는지에 대해 자세히 알지는 못하지만, 제 추측으로는 Discourse의 nginx에서 set_real_ip_from 값이 프록시 nginx를 어떤 IP 주소로 인식하는지에 따라 달라져야 할 것 같습니다. 127.0.0.1일까요? 다른 내부 주소일까요? 아니면 공개된 IP 주소일까요? 어떤 주소를 인식할지 정확히 알 수 없습니다.
해당 주소를 확인한 후, 저는 Cloudflare 템플릿을 그대로 유지하면서 set_real_ip_from 항목에 대해 replace 지시문을 추가로 작성하는 방법을 추천합니다.
이와 함께, 프록시 nginx가 CF-Connecting-IP 헤더를 전달하도록 설정되어 있지 않거나 기본적으로 그렇게 하지 않는다면, 이를 전달하도록 구성해야 합니다. 이 부분은 제가 도움을 드리기 어렵습니다.
## 이 파일은 올인원(All-in-one), 스탠드얼론 Discourse Docker 컨테이너 템플릿입니다
##
## 이 파일을 수정한 후에는 반드시 다시 빌드해야 합니다
## /var/discourse/launcher rebuild app
##
## 편집할 때 *매우* 주의하세요!
## YAML 파일은 공백이나 정렬 실수에 대해 매우 민감합니다!
## 필요할 경우 http://www.yamllint.com/ 에서 이 파일을 검증하세요
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
- "templates/cloudflare.template.yml"
## Lets Encrypt(https)를 추가하려면 다음 두 줄의 주석을 해제하세요
#- "templates/web.ssl.template.yml"
#- "templates/web.letsencrypt.ssl.template.yml"
## 이 컨테이너가 어떤 TCP/IP 포트를 노출해야 하는가?
## Discourse를 Apache나 nginx 같은 다른 웹서버와 동일한 포트를 공유하려면
## 세부 내용은 https://meta.discourse.org/t/17247을 참조하세요
expose:
- "31080:80" # http
- "31443:443" # https
params:
db_default_text_search_config: "pg_catalog.russian"
## db_shared_buffers를 총 메모리의 최대 25%로 설정하세요.
## bootstrap이 감지된 RAM 기반으로 자동으로 설정하거나, 직접 오버라이드할 수 있습니다
db_shared_buffers: "4096MB"
## 정렬 성능을 향상시킬 수 있지만, 연결당 메모리 사용량이 증가합니다
#db_work_mem: "40MB"
## 이 컨테이너가 어떤 Git 리비전을 사용해야 하는가? (기본값: tests-passed)
#version: tests-passed
env:
LC_ALL: ru_RU.UTF-8
LANG: ru_RU.UTF-8
LANGUAGE: ru_RU.UTF-8
DISCOURSE_DEFAULT_LOCALE: ru
## 동시 웹 요청을 얼마나 지원할 수 있는가? 메모리와 CPU 코어 수에 따라 달라집니다.
## bootstrap이 감지된 CPU 기반으로 자동으로 설정하거나, 직접 오버라이드할 수 있습니다
UNICORN_WORKERS: 8
## TODO: 이 Discourse 인스턴스가 응답할 도메인 이름
## 필수 항목입니다. Discourse는 IP 주소만으로는 작동하지 않습니다.
DISCOURSE_HOSTNAME: 'zeronet.space'
## 컨테이너가 위에서 지정된 도메인 이름(-h 옵션)과 동일한 이름으로 시작되도록 하려면
## 주석을 해제하세요 (기본값 "$hostname-$config")
#DOCKER_USE_HOSTNAME: true
## TODO: 초기 가입 시 관리자 및 개발자로 설정될 쉼표로 구분된 이메일 목록
## 예: 'user1@example.com,user2@example.com'
DISCOURSE_DEVELOPER_EMAILS: 'contact@zeronet.space'
## TODO: 새 계정을 검증하고 알림을 보내는 데 사용되는 SMTP 메일 서버
# SMTP 주소, 사용자 이름, 비밀번호는 필수입니다
# 경고: SMTP 비밀번호에 '#' 문자가 포함되면 문제가 발생할 수 있습니다!
DISCOURSE_SMTP_ADDRESS: smtp.zeronet.space
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: noreply@zeronet.space
DISCOURSE_SMTP_PASSWORD: "xxxxxxx"
DISCOURSE_SMTP_ENABLE_START_TLS: true
DISCOURSE_SMTP_AUTHENTICATION: login
DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none
DISCOURSE_NOTIFICATION_EMAIL: "noreply@zeronet.space"
#DISCOURSE_SMTP_DOMAIN: "zeronet.space"
## Lets Encrypt 템플릿을 추가했다면, 무료 SSL 인증서를 얻으려면 아래 주석을 해제하세요
#LETSENCRYPT_ACCOUNT_EMAIL: me@example.com
## 이 Discourse 인스턴스를 위한 http 또는 https CDN 주소 (풀링 설정)
## 세부 내용은 https://meta.discourse.org/t/14857을 참조하세요
#DISCOURSE_CDN_URL: https://discourse-cdn.example.com
## IP 주소 조회를 위한 maxmind 지리 위치 IP 주소 키
## 세부 내용은 https://meta.discourse.org/t/-/137387/23을 참조하세요
#DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456
## Docker 컨테이너는 상태가 없으며(stateless), 모든 데이터는 /shared에 저장됩니다
volumes:
- volume:
host: /var/discourse/shared/standalone
guest: /shared
- volume:
host: /var/discourse/shared/standalone/log/var-log
guest: /var/log
## 플러그인은 여기에 설치됩니다
## 세부 내용은 https://meta.discourse.org/t/19157을 참조하세요
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/discourse/docker_manager.git
## 빌드 후 실행할 모든 커스텀 명령
run:
- exec: echo "Beginning of custom commands"
## 첫 번째 가입 시 'From' 이메일 주소를 설정하려면 주석을 해제하고 수정하세요:
## 첫 가입 이메일을 받은 후, 해당 줄을 다시 주석 처리하세요. 한 번만 실행하면 됩니다.
- exec: rails r "SiteSetting.notification_email='noreply@zeronet.space'"
- exec: echo "End of custom commands"