최신 Discourse 버전에서 rebuild가 깨지고 Redis 포트가 이미 사용 중입니다

OS: Ubuntu 20.04
서버: vServer 4 코어, 16 GB
디스크: SSD 160GB

최근 Discourse 최신 버전으로 업그레이드했습니다. 그런데 Discourse가 포트 6379가 사용 중이라고 보고하여 컨테이너를 빌드할 수 없는 문제가 발생하고 있습니다:

사용 중인 모든 포트를 확인해 보니 해당 포트는 비어 있습니다.

Discourse 체크 과정에서 포트가 비어 있음이 인식되지 않는 것 같습니다.
Docker를 확인해 보면 Discourse 컨테이너만 시작되고 나머지는 모두 실패합니다:

이 문제는 정말로 역설(Paradox)로 변했습니다.
Discourse가 Docker에서 redis-server pid를 시작한 후, 해당 프로세스가 이미 시작되어 있었기 때문에 충돌합니다:

호스트에는 메인 Redis 설치 버전이 실행 중이지만, 그 포트는 6800이므로 간섭이 일어나서는 안 됩니다.

명확하게 보기에, Redis가 스스로를 성공적으로 시작하고 나서 '주소 사용 중’이라는 실패를 보고하는 것처럼, 체크가 자기 자신에서 실패하는 것으로 보입니다:

app.yml 파일을 공유해 주시겠어요?

네, 확인해 주셔서 감사합니다 :smiley:. 제 app.yml 파일입니다:

## 이것은 올인원, 스탠드얼론 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"
## Lets Encrypt(https)를 추가하려면 다음 두 줄의 주석을 해제하십시오
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## 이 컨테이너는 어떤 TCP/IP 포트를 노출해야 하는가?
## Apache나 nginx 같은 다른 웹서버와 포트를 공유하려면
## https://meta.discourse.org/t/17247 를 참조하십시오
expose:
  - "12080:80"   # http
  - "12443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## db_shared_buffers를 총 메모리의 최대 25%로 설정하십시오.
  ## bootstrap이 감지된 RAM에 따라 자동으로 설정하거나, 직접 오버라이드할 수 있습니다
  db_shared_buffers: "4096MB"

  ## 정렬 성능을 향상시킬 수 있지만, 연결당 메모리 사용량이 증가합니다
  #db_work_mem: "40MB"

  ## 이 컨테이너는 어떤 Git 리비전을 사용해야 하는가? (기본값: tests-passed)
  #version: tests-passed

env:
  LANG: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## 동시에 얼마나 많은 웹 요청을 지원할 수 있는가? 메모리와 CPU 코어에 따라 다릅니다.
  ## bootstrap이 감지된 CPU에 따라 자동으로 설정하거나, 직접 오버라이드할 수 있습니다
  UNICORN_WORKERS: 8

  ## TODO: 이 Discourse 인스턴스가 응답할 도메인 이름
  DISCOURSE_HOSTNAME: discourse.forum

  ## 컨테이너가 위에서 지정된 것과 동일한 호스트 이름(-h 옵션)으로 시작되도록 하려면
  ## 주석을 해제하십시오 (기본값 "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: 초기 가입 시 관리자 및 개발자로 설정될 쉼표로 구분된 이메일 목록
  ## 예시 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'developer@email'

  ## TODO: 새 계정을 검증하고 알림을 보내는 데 사용되는 SMTP 메일 서버
  DISCOURSE_SMTP_ADDRESS: mailserver
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: email@email
  DISCOURSE_SMTP_PASSWORD: "****"
  #DISCOURSE_SMTP_AUTHENTICATION: plain
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (선택 사항, 기본값 true)

  ## Lets Encrypt 템플릿을 추가했다면, 무료 SSL 인증서를 받으려면 아래 주석을 해제하십시오
  #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

  ## 이 Discourse 인스턴스의 CDN 주소 (pull하도록 구성됨)
  ## 자세한 내용은 https://meta.discourse.org/t/14857 를 참조하십시오
  #DISCOURSE_CDN_URL: //discourse-cdn.example.com

## 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
          - git clone https://github.com/angusmcleod/discourse-question-answer.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-voting.git
          - git clone https://github.com/gdpelican/retort.git
          - git clone https://github.com/davidtaylorhq/discourse-whos-online.git
          - git clone https://github.com/vinkas0/discourse-navigation.git
          - git clone https://github.com/discourse/discourse-spoiler-alert.git
          - git clone https://github.com/iunctis/discourse-formatting-toolbar.git
          - git clone https://github.com/discourse/discourse-tooltips.git
          - git clone https://github.com/gdpelican/babble.git
          - git clone https://github.com/paviliondev/discourse-quick-messages.git
          - git clone https://github.com/worldismine/PM-Scanner.git
          - git clone https://github.com/paviliondev/discourse-ratings.git
          - git clone https://github.com/discourse/discourse-calendar.git
          - git clone https://github.com/jannolii/discourse-topic-trade-buttons.git

## 빌드 후 실행할 모든 사용자 지정 명령
run:
  - exec: echo "Beginning of custom commands"
  ## 첫 번째 가입 시 'From' 이메일 주소를 설정하려면 주석을 해제하고 변경하십시오:
  ## 첫 번째 가입 이메일을 받은 후, 해당 줄을 다시 주석 처리하십시오. 한 번만 실행하면 됩니다.
  ##- exec: rails r "SiteSetting.notification_email='email@email"
  - exec: echo "End of custom commands"

전체 재빌드 출력 내용도 공유해 주실 수 있나요?

확인한 바로는, 여러분이 보고 있는 로그는 예전부터 모든 재빌드에서 발생하고 있으며, 두 개의 다른 훅에서 Redis가 실행 중인지 확인하는 과정일 뿐이므로 재빌드를 막는 요인이 아닙니다. 문제는 다른 곳에 있습니다.

네. 다른 로그가 필요하시면 제공해 드릴게요 :slight_smile:
3226줄을 넘어 포럼 글자 수 제한을 초과하기 때문에 pastebin에 올렸습니다: Discourse Rebuild Log - Pastebin.com

해당 출력은 성공적인 재구축을 보여줍니다…

사이트가 포트 12080에서 작동하고 있지 않나요?

네, 사이트가 다시 성공적으로 재구축되었습니다.
사이트가 제 환경에서 제대로 로드되지 않던 원인을 찾았습니다.
문제는 자동으로 갱신되지 않은 SSL 리버스 인증서 때문이었습니다. 이로 인해 이미지가 로드되지 않아, Redis 캐시가 작동하지 않는다고 오해하게 되었습니다 :man_facepalming:

Build에서는 알림이 표시되지만, Redis 서버는 정상적으로 실행되고 있었습니다.
SSL 인증서를 갱신한 후 사이트가 다시 정상적으로 작동했습니다.

지원해 주셔서 감사합니다. 그리고 제 실수 때문에 죄송합니다 :sweat_smile: