app.yml에서 사용할 수 있는 모든 훅 유형은 무엇인가요?

안녕하세요. Discourse가 재시작되거나 빌드 후 다시 시작될 때 자동으로 Docker 네트워크에 연결되도록 훅을 설정하려고 합니다. 이렇게 하면 가능할 때 관리자 웹 업데이트 도구를 사용할 수 있을 것 같습니다. 하지만 가장 좋은 방법을 찾느라 고민 중입니다. 문서에는 사용할 수 있는 모든 훅 유형이 명시되어 있지 않고, after_post_boot나 after_restart와 같은 훅을 검색해도 결과가 나오지 않습니다. 이 훅들이 더 이상 작동하지 않는 건가요? 그렇다면 그 이유는 무엇인가요? 제 훅 코드는 다음과 같습니다.

hooks:

begin custom network hook

after_restart:

  • exec:
    cmd:
  • bash
  • “-c”
  • |

이미 연결되어 있지 않다면 Discourse를 사용자 정의 Docker 네트워크에 연결

NETWORK_NAME=“proxy”
CONTAINER_NAME=$(hostname)

        # 네트워크가 존재하지 않으면 생성
        if ! docker network inspect "$NETWORK_NAME" >/dev/null 2>&1; then
          echo "Creating Docker network: $NETWORK_NAME"
          docker network create "$NETWORK_NAME"
        fi

        # 컨테이너를 네트워크에 연결 (이미 연결되어 있으면 무시)
        echo "Connecting $CONTAINER_NAME to $NETWORK_NAME..."
        docker network connect "$NETWORK_NAME" "$CONTAINER_NAME" 2>/dev/null || true

        echo "Network connection complete."

END custom network hook

app.yml에 고정된 전역 훅 타입 목록은 실제로 존재하지 않습니다.
훅은 Pups에 의해 동적으로 제공되며, 포함하는 템플릿 안에 실제로 존재하는 훅에만 연결할 수 있습니다.


:magnifying_glass_tilted_left: 작동 방식

다음과 같은 내용을 볼 때:

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

이는 템플릿에 다음과 같은 단계가 포함되어 있기 때문에 작동합니다:

- hook: code
  run:
    - exec: ...

Pups는 정의된 훅 지점의 앞이나 뒤에 명령을 연결할 수 있도록 합니다.
따라서 템플릿이 hook: code를 정의했다면 before_code: 또는 after_code:를 사용할 수 있습니다.
hook: assets_precompile을 정의했다면 before_assets_precompile: 또는 after_assets_precompile:을 사용할 수 있으며, 그 외의 경우에도 마찬가지입니다.

(예를 들어) hook: restart가 없다면, after_restart:은 단순히 실행되지 않습니다.


:white_check_mark: 표준 템플릿에 존재하는 것으로 알려진 훅

Discourse Docker와 함께 제공되는 기본 templates/*.yml에서:

훅 이름 일반적인 용도 사용 가능
code 플러그인 클론, 사용자 정의 파일 편집 등 주요 설정 단계 before_code: / after_code:
assets_precompile Rails 자산 컴파일 후 (예: S3 업로드, 정리) after_assets_precompile:
web 웹 프로세스 시작 전 마지막 조정 before_web:

플러그인 설치 예제에서 after_code:before_code:를 자주 볼 수 있습니다 — 대부분의 설정에서 필요한 것은 이 두 개뿐입니다.


:cross_mark: 기본적으로 존재하지 않는 훅

after_restart이나 after_post_boot와 같은 이름은 표준 템플릿 내의 어떤 hook:에도 해당하지 않으므로, Pups는 어디에 연결해야 할지 모릅니다.
커스텀 템플릿에 일치하는 hook: restart 단계를 추가하지 않는 한 트리거되지 않습니다.


:toolbox: 시스템에서 사용 가능한 모든 훅 찾기

/var/discourse 폴더에서 다음을 실행하세요:

grep -R "hook:" -n templates/ samples/

현재 포함하고 있는 템플릿이 지원하는 모든 훅 이름이 나열됩니다.
거기서 찾은 것은 hooks: 블록 안에서 before_<이름>: 또는 after_<이름>:으로 사용할 수 있습니다.


:blue_book: 참고 자료

이 동작은 Pups README(Discourse의 Docker 설정에 사용되는 구성 관리 도구)에서 간략히 설명되어 있습니다:

“훅은 템플릿 내에서 hook:으로 라벨링된 단계의 앞이나 뒤에 명령을 주입할 수 있는 지점입니다.”


:puzzle_piece: 실제 적용

  • 대부분의 사용자 정의 셸 명령(플러그인 설치 등)에는 after_code:를 사용하세요.
  • 컨테이너 시작 또는 재시작 시 수행되어야 하는 작업에는 새로운 훅 이름을 발명하는 대신 작은 시작 스크립트나 supervisord 태스크를 사용하세요.
  • 자체 훅 타입을 추가하려면 커스텀 hook: something 항목이 포함된 새 템플릿을 만들고, app.yml에서 이를 대상으로 지정하세요.

요약:
템플릿에서 실제로 hook: 항목으로 나타나는 훅 이름만 존재합니다.
표준 Discourse Docker에서는 기본적으로 code, assets_precompile, web입니다.

참고로 pups 저장소는 여기 있는 것 같습니다:

@Ethsim2 님, 다음 부분에 대해선 아무것도 찾아볼 수 없었습니다.

게시하기 전에 AI의 답변을 한 번 살펴보는 것이 좋을 것 같습니다 :slightly_smiling_face: .

README에서:

특정 명령의 앞과 뒤에 명령을 실행하려면 hook을 정의합니다.

GitHub 저장소에서:

이건 어떨까요?

훅을 사용하면 템플릿의 hook: <name> 레이블에 해당하는 before_<name>: 또는 after_<name>:을 정의함으로써, 특정 빌드 단계의 전후로 사용자 정의 명령어를 실행할 수 있습니다.

훅이 도움이 되지 않을 것 같습니다. web-updater를 실행하면 컨테이너가 Docker 네트워크에서 분리된다는 말씀이신가요?

web-updater는 컨테이너를 재시작하지 않는다고 확신합니다. 그것이 Discourse를 종료하지 않고 실행할 수 있는 이유입니다.

그렇습니다.

또한, 훅(hooks)은 discourse 이미지를 빌드하기 위해 컨테이너 내부에서 실행된다는 점도 주목할 필요가 있습니다. 호스트에서 실행되는 것은 없으며, launcher 함수를 통해 docker 네트워크를 재생성하거나 파괴할 방법은 없습니다.

해당 호스팅 환경에서 어떤 문제에 직면하고 있는지 설명해 주시면, 어떤 문제를 해결하고자 하는지 더 잘 이해할 수 있을 것입니다.

CLI를 통해서만 업데이트를 진행했는데, 그 과정에서 Docker 네트워크에서 연결이 끊기게 됩니다. 다만 이는 해당 시점에 컨테이너가 재시작되기 때문일 뿐입니다. 아직 이 설정에서 웹 업데이트기를 사용해 본 적이 없어서 이번에는 웹 업데이트기를 시도해 보겠습니다. 처음에는 여기에서도 동일한 현상이 발생할 거라고 생각했지만, 웹 업데이트기가 컨테이너를 종료하지 않는다면 정말 걱정할 일이 아닙니다. 제가 이 모든 내용을 언급한 이유는, 해당 시점에 웹 업데이트기를 실행했을 때 문제가 발생한다는 사례를 여러 번 봤기 때문입니다. 하지만 일단 업데이트기를 실행해 보고 결과를 확인해 보겠습니다.

Jonnyboy! 아이폰 최고!

이 주제를 비공개로 설정하고 닫을 것이며, 삭제 타이머를 설정하겠습니다. 현재 형태로는 혼란스럽고 유용하지 않습니다. @Jonathan_Candler 도움이 여전히 필요하시다면, 해결하려는 문제를 설명하기 위해 새로운 Support 주제를 시작해 주세요.