[GH-ISSUE #2240] Health check ignored in blueprint + health check status not appearing in resource list. #10874

Closed
opened 2026-05-06 15:26:42 -05:00 by GiteaMirror · 2 comments
Owner

Originally created by @eskori on GitHub (Jan 13, 2026).
Original GitHub issue: https://github.com/fosrl/pangolin/issues/2240

Originally assigned to: @oschwartz10612 on GitHub.

Describe the Bug

Blueprints via Docker labels fail to enable health checks even if they are recognized as true.

Potentially related: after the resource is created, health check can be enabled manually, but it always shows as "Unknown" in the main Resources list (need to enter the resource details to see the actual status). I'm not sure if this should be a separate issue, if so please let me know.

Environment

  • OS Type & Version: AlmaLinux 10
  • Pangolin Version: 1.14.1
  • Gerbil Version: 1.3.0
  • Traefik Version: 3.6
  • Newt Version: 1.8.1

To Reproduce

First time writing an issue so please bear with me and sorry if I missed something! Anyways, the steps:

  1. Edit the compose file of the target container and add the desired labels (in this example I will create a public resource with some rules)
  2. (Re)Deploy the project, redeploy Newt and confirm that the resource is created.
  3. Review its details health check is missing.
  4. (Not sure if it is related) Manually enable health check, go back to the resource list and see that status is "Unknown".
  5. Enter the resource details to see the actual status of the health check.
    I tried this with several containers, all of them behave the same way. The resource is created and everything is properly configured except the health checks. Not only that, but seeing the blueprint in the UI it shows the health check configuration (including enabled: true) yet it does not exist.

My example for Gotify (I redacted my domain for privacy reasons, but I can confirm it is properly configured)

compose.yml

services:
  gotify:
    container_name: gotify
    restart: unless-stopped
    image: gotify/server
    ports:
      - 8088:80
    volumes:
      - /home/mola/data/gotify:/app/data
    environment:
      - GOTIFY_DEFAULTUSER_PASS=${DEFAULT_PASS}
    labels:
      # PANGOLIN BLUEPRINT
      ## Public resource
      - pangolin.public-resources.gotify.name=Gotify
      - pangolin.public-resources.gotify.full-domain=gotify.example.com
      - pangolin.public-resources.gotify.protocol=http
      - pangolin.public-resources.gotify.ssl=true
      ## Target
      - pangolin.public-resources.gotify.targets[0].site=pezluna
      - pangolin.public-resources.gotify.targets[0].hostname=192.168.1.11
      - pangolin.public-resources.gotify.targets[0].port=8088
      - pangolin.public-resources.gotify.targets[0].method=http
      ## Healthcheck
      - pangolin.public-resources.gotify.healthcheck.hostname=192.168.1.11
      - pangolin.public-resources.gotify.healthcheck.port=8088
      - pangolin.public-resources.gotify.healthcheck.enabled=true
      - pangolin.public-resources.gotify.healthcheck.path=/health
      - pangolin.public-resources.gotify.healthcheck.scheme=http
      - pangolin.public-resources.gotify.healthcheck.method=GET
      ## Rules
      - pangolin.public-resources.gotify.rules[0].action=allow
      - pangolin.public-resources.gotify.rules[0].value=/version
      - pangolin.public-resources.gotify.rules[0].match=path
      - pangolin.public-resources.gotify.rules[1].action=allow
      - pangolin.public-resources.gotify.rules[1].value=/message
      - pangolin.public-resources.gotify.rules[1].match=path
      - pangolin.public-resources.gotify.rules[2].action=allow
      - pangolin.public-resources.gotify.rules[2].value=/application
      - pangolin.public-resources.gotify.rules[2].match=path
      - pangolin.public-resources.gotify.rules[3].action=allow
      - pangolin.public-resources.gotify.rules[3].value=/client
      - pangolin.public-resources.gotify.rules[3].match=path
      - pangolin.public-resources.gotify.rules[4].action=allow
      - pangolin.public-resources.gotify.rules[4].value=/stream
      - pangolin.public-resources.gotify.rules[4].match=path
      - pangolin.public-resources.gotify.rules[5].action=allow
      - pangolin.public-resources.gotify.rules[5].value=/plugin
      - pangolin.public-resources.gotify.rules[5].match=path
      - pangolin.public-resources.gotify.rules[6].action=allow
      - pangolin.public-resources.gotify.rules[6].value=/health
      - pangolin.public-resources.gotify.rules[6].match=path

Blueprint result

proxy-resources: {}
client-resources: {}
public-resources:
  gotify:
    full-domain: gotify.example.com
    healthcheck:
      enabled: true
      hostname: 192.168.1.11
      method: GET
      path: /health
      port: 8088
      scheme: http
    name: Gotify
    protocol: http
    rules:
      - action: allow
        match: path
        value: /version
      - action: allow
        match: path
        value: /message
      - action: allow
        match: path
        value: /application
      - action: allow
        match: path
        value: /client
      - action: allow
        match: path
        value: /stream
      - action: allow
        match: path
        value: /plugin
      - action: allow
        match: path
        value: /health
    ssl: true
    targets:
      - hostname: 192.168.1.11
        method: http
        port: 8088
        site: pezluna

Regarding the potentially related issue, this is how the resource is seen in the list:
Image

vs how it looks when seeing the details:

Image

Expected Behavior

  • Public resource is created with the same configuration it has right now + health check enabled and configured.
  • Health check status appears in the Resource list too, not only in the details.
Originally created by @eskori on GitHub (Jan 13, 2026). Original GitHub issue: https://github.com/fosrl/pangolin/issues/2240 Originally assigned to: @oschwartz10612 on GitHub. ### Describe the Bug Blueprints via Docker labels fail to enable health checks even if they are recognized as true. Potentially related: after the resource is created, health check can be enabled manually, but it always shows as "Unknown" in the main Resources list (need to enter the resource details to see the actual status). I'm not sure if this should be a separate issue, if so please let me know. ### Environment - OS Type & Version: AlmaLinux 10 - Pangolin Version: 1.14.1 - Gerbil Version: 1.3.0 - Traefik Version: 3.6 - Newt Version: 1.8.1 ### To Reproduce First time writing an issue so please bear with me and sorry if I missed something! Anyways, the steps: 1. Edit the compose file of the target container and add the desired labels (in this example I will create a public resource with some rules) 3. (Re)Deploy the project, redeploy Newt and confirm that the resource is created. 4. Review its details health check is missing. 5. (Not sure if it is related) Manually enable health check, go back to the resource list and see that status is "Unknown". 6. Enter the resource details to see the actual status of the health check. I tried this with several containers, all of them behave the same way. The resource is created and everything is properly configured _except_ the health checks. Not only that, but seeing the blueprint in the UI it shows the health check configuration (including `enabled: true`) yet it does not exist. My example for Gotify (I redacted my domain for privacy reasons, but I can confirm it is properly configured) <details><summary>compose.yml</summary> <p> ```yaml services: gotify: container_name: gotify restart: unless-stopped image: gotify/server ports: - 8088:80 volumes: - /home/mola/data/gotify:/app/data environment: - GOTIFY_DEFAULTUSER_PASS=${DEFAULT_PASS} labels: # PANGOLIN BLUEPRINT ## Public resource - pangolin.public-resources.gotify.name=Gotify - pangolin.public-resources.gotify.full-domain=gotify.example.com - pangolin.public-resources.gotify.protocol=http - pangolin.public-resources.gotify.ssl=true ## Target - pangolin.public-resources.gotify.targets[0].site=pezluna - pangolin.public-resources.gotify.targets[0].hostname=192.168.1.11 - pangolin.public-resources.gotify.targets[0].port=8088 - pangolin.public-resources.gotify.targets[0].method=http ## Healthcheck - pangolin.public-resources.gotify.healthcheck.hostname=192.168.1.11 - pangolin.public-resources.gotify.healthcheck.port=8088 - pangolin.public-resources.gotify.healthcheck.enabled=true - pangolin.public-resources.gotify.healthcheck.path=/health - pangolin.public-resources.gotify.healthcheck.scheme=http - pangolin.public-resources.gotify.healthcheck.method=GET ## Rules - pangolin.public-resources.gotify.rules[0].action=allow - pangolin.public-resources.gotify.rules[0].value=/version - pangolin.public-resources.gotify.rules[0].match=path - pangolin.public-resources.gotify.rules[1].action=allow - pangolin.public-resources.gotify.rules[1].value=/message - pangolin.public-resources.gotify.rules[1].match=path - pangolin.public-resources.gotify.rules[2].action=allow - pangolin.public-resources.gotify.rules[2].value=/application - pangolin.public-resources.gotify.rules[2].match=path - pangolin.public-resources.gotify.rules[3].action=allow - pangolin.public-resources.gotify.rules[3].value=/client - pangolin.public-resources.gotify.rules[3].match=path - pangolin.public-resources.gotify.rules[4].action=allow - pangolin.public-resources.gotify.rules[4].value=/stream - pangolin.public-resources.gotify.rules[4].match=path - pangolin.public-resources.gotify.rules[5].action=allow - pangolin.public-resources.gotify.rules[5].value=/plugin - pangolin.public-resources.gotify.rules[5].match=path - pangolin.public-resources.gotify.rules[6].action=allow - pangolin.public-resources.gotify.rules[6].value=/health - pangolin.public-resources.gotify.rules[6].match=path ``` </p> </details> <details><summary>Blueprint result</summary> <p> ```yaml proxy-resources: {} client-resources: {} public-resources: gotify: full-domain: gotify.example.com healthcheck: enabled: true hostname: 192.168.1.11 method: GET path: /health port: 8088 scheme: http name: Gotify protocol: http rules: - action: allow match: path value: /version - action: allow match: path value: /message - action: allow match: path value: /application - action: allow match: path value: /client - action: allow match: path value: /stream - action: allow match: path value: /plugin - action: allow match: path value: /health ssl: true targets: - hostname: 192.168.1.11 method: http port: 8088 site: pezluna ``` </p> </details> Regarding the potentially related issue, this is how the resource is seen in the list: <img width="1676" height="277" alt="Image" src="https://github.com/user-attachments/assets/4e8643ca-d166-4c42-a105-34b3c4463ebd" /> vs how it looks when seeing the details: <img width="1675" height="373" alt="Image" src="https://github.com/user-attachments/assets/27b4af7f-daf9-46f3-a9a2-11f7a42484ca" /> ### Expected Behavior - [ ] Public resource is created with the same configuration it has right now + health check enabled and configured. - [ ] Health check status appears in the Resource list too, not only in the details.
Author
Owner

@oschwartz10612 commented on GitHub (Jan 20, 2026):

Just tested. I dont think there is a bug here I think you just have tour yaml a bit wrong. You need to have the healthcheck under the target like in the docs: https://docs.pangolin.net/manage/blueprints#health-check-configuration

public-resources:
  gotify:
    full-domain: gotify.example.com
    name: Gotify
    protocol: http
    rules:
      - action: allow
        match: path
        value: /version
      - action: allow
        match: path
        value: /message
      - action: allow
        match: path
        value: /application
      - action: allow
        match: path
        value: /client
      - action: allow
        match: path
        value: /stream
      - action: allow
        match: path
        value: /plugin
      - action: allow
        match: path
        value: /health
    ssl: true
    targets:
      - hostname: 192.168.1.11
        method: http
        port: 8088
        site: comfortable-six-lined-racerunner
        healthcheck:
          enabled: true
          hostname: 192.168.1.11
          method: GET
          path: /health
          port: 8088
          scheme: http
<!-- gh-comment-id:3771135664 --> @oschwartz10612 commented on GitHub (Jan 20, 2026): Just tested. I dont think there is a bug here I think you just have tour yaml a bit wrong. You need to have the healthcheck under the target like in the docs: https://docs.pangolin.net/manage/blueprints#health-check-configuration ``` public-resources: gotify: full-domain: gotify.example.com name: Gotify protocol: http rules: - action: allow match: path value: /version - action: allow match: path value: /message - action: allow match: path value: /application - action: allow match: path value: /client - action: allow match: path value: /stream - action: allow match: path value: /plugin - action: allow match: path value: /health ssl: true targets: - hostname: 192.168.1.11 method: http port: 8088 site: comfortable-six-lined-racerunner healthcheck: enabled: true hostname: 192.168.1.11 method: GET path: /health port: 8088 scheme: http ```
Author
Owner

@eskori commented on GitHub (Feb 16, 2026):

Hi!

Sorry for the necroposting. Just updating my situation in case it helps anyone wandering the same as I did. As you said it was an issue on my side, I didn't see that health checks are part of the target, that means that instead of writing the labels as

- pangolin.public-resources.resource.healthcheck.hostname=...

I had to do it as:

- pangolin.public-resources.resource.targets[0].healthcheck.hostname=...

Plus, the health check "disappearing" wasn't a bug; it's a feature. It was the blueprint being reapplied (with no heal check, therefore it disappeared). Thanks for the support!

<!-- gh-comment-id:3909157609 --> @eskori commented on GitHub (Feb 16, 2026): Hi! Sorry for the necroposting. Just updating my situation in case it helps anyone wandering the same as I did. As you said it was an issue on my side, I didn't see that **health checks are part of the target**, that means that instead of writing the labels as ```yaml - pangolin.public-resources.resource.healthcheck.hostname=... ``` I had to do it as: ```yaml - pangolin.public-resources.resource.targets[0].healthcheck.hostname=... ``` Plus, the health check "disappearing" wasn't a bug; it's a feature. It was the blueprint being reapplied (with no heal check, therefore it disappeared). Thanks for the support!
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/pangolin#10874