compose.yaml.j2 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. services:
  2. {{ service_name }}:
  3. image: docker.io/b4bz/homer:v25.11.1
  4. {#
  5. If not in swarm mode, check whether container_name is set and apply restart policy,
  6. else swarm mode handles restarts via deploy.restart_policy
  7. #}
  8. {% if not swarm_enabled %}
  9. restart: {{ restart_policy }}
  10. container_name: {{ container_name }}
  11. {% endif %}
  12. {#
  13. Set container hostname for identification
  14. #}
  15. hostname: {{ container_hostname }}
  16. {#
  17. Environment variables for Homer configuration
  18. #}
  19. environment:
  20. - TZ={{ container_timezone }}
  21. {#
  22. When traefik is enabled, add traefik network for reverse proxy access
  23. #}
  24. {% if traefik_enabled %}
  25. networks:
  26. {{ traefik_network }}:
  27. {% endif %}
  28. {#
  29. Port mappings for web interface (only when Traefik is disabled)
  30. Note: Swarm mode uses 'host' mode for port publishing to avoid port conflicts
  31. #}
  32. {% if not traefik_enabled %}
  33. ports:
  34. {% if swarm_enabled %}
  35. - target: 8080
  36. published: {{ ports_http }}
  37. protocol: tcp
  38. mode: host
  39. {% else %}
  40. - "{{ ports_http }}:8080"
  41. {% endif %}
  42. {% endif %}
  43. {#
  44. Volume configuration:
  45. - assets: Homer dashboard configuration and assets
  46. #}
  47. volumes:
  48. - ./assets:/www/assets
  49. {#
  50. When traefik_enabled is set, and not running in swarm mode, add traefik labels
  51. (optionally enable TLS if traefik_tls_enabled is set)
  52. #}
  53. {% if traefik_enabled and not swarm_enabled %}
  54. labels:
  55. - traefik.enable=true
  56. - traefik.docker.network={{ traefik_network }}
  57. - traefik.http.services.{{ service_name }}-web.loadBalancer.server.port=8080
  58. - traefik.http.routers.{{ service_name }}-http.service={{ service_name }}-web
  59. - traefik.http.routers.{{ service_name }}-http.rule=Host(`{{ traefik_host }}.{{ traefik_domain }}`)
  60. - traefik.http.routers.{{ service_name }}-http.entrypoints={{ traefik_entrypoint }}
  61. {% if traefik_tls_enabled %}
  62. - traefik.http.routers.{{ service_name }}-https.service={{ service_name }}-web
  63. - traefik.http.routers.{{ service_name }}-https.rule=Host(`{{ traefik_host }}.{{ traefik_domain }}`)
  64. - traefik.http.routers.{{ service_name }}-https.entrypoints={{ traefik_tls_entrypoint }}
  65. - traefik.http.routers.{{ service_name }}-https.tls=true
  66. - traefik.http.routers.{{ service_name }}-https.tls.certresolver={{ traefik_tls_certresolver }}
  67. {% endif %}
  68. {% endif %}
  69. {#
  70. Deploy configuration for Swarm mode and/or resource limits:
  71. - Swarm: Configure replicas, placement constraints, and restart policy
  72. - Resources: Set CPU/memory limits (and reservations in Swarm mode)
  73. - Traefik: Labels for reverse proxy integration (Swarm mode)
  74. #}
  75. {% if swarm_enabled or resources_enabled %}
  76. deploy:
  77. {% if swarm_enabled %}
  78. mode: {{ swarm_placement_mode }}
  79. {% if swarm_placement_mode == 'replicated' %}
  80. replicas: {{ swarm_replicas }}
  81. {% endif %}
  82. {% if swarm_placement_host %}
  83. placement:
  84. constraints:
  85. - node.hostname == {{ swarm_placement_host }}
  86. {% endif %}
  87. restart_policy:
  88. condition: on-failure
  89. {% endif %}
  90. {% if resources_enabled %}
  91. resources:
  92. limits:
  93. cpus: '{{ resources_cpu_limit }}'
  94. memory: {{ resources_memory_limit }}
  95. {% if swarm_enabled %}
  96. reservations:
  97. cpus: '{{ resources_cpu_reservation }}'
  98. memory: {{ resources_memory_reservation }}
  99. {% endif %}
  100. {% endif %}
  101. {#
  102. When traefik_enabled is set in swarm mode, add traefik labels
  103. (optionally enable TLS if traefik_tls_enabled is set, and authentik middleware if enabled)
  104. #}
  105. {% if swarm_enabled and traefik_enabled %}
  106. labels:
  107. - traefik.enable=true
  108. - traefik.docker.network={{ traefik_network }}
  109. - traefik.http.services.{{ service_name }}-web.loadBalancer.server.port=8080
  110. - traefik.http.routers.{{ service_name }}-http.service={{ service_name }}-web
  111. - traefik.http.routers.{{ service_name }}-http.rule=Host(`{{ traefik_host }}.{{ traefik_domain }}`)
  112. - traefik.http.routers.{{ service_name }}-http.entrypoints={{ traefik_entrypoint }}
  113. {% if authentik_enabled %}
  114. - traefik.http.routers.{{ service_name }}-http.middlewares={{ authentik_traefik_middleware }}
  115. {% endif %}
  116. {% if traefik_tls_enabled %}
  117. - traefik.http.routers.{{ service_name }}-https.service={{ service_name }}-web
  118. - traefik.http.routers.{{ service_name }}-https.rule=Host(`{{ traefik_host }}.{{ traefik_domain }}`)
  119. - traefik.http.routers.{{ service_name }}-https.entrypoints={{ traefik_tls_entrypoint }}
  120. - traefik.http.routers.{{ service_name }}-https.tls=true
  121. - traefik.http.routers.{{ service_name }}-https.tls.certresolver={{ traefik_tls_certresolver }}
  122. {% if authentik_enabled %}
  123. - traefik.http.routers.{{ service_name }}-https.middlewares={{ authentik_traefik_middleware }}
  124. {% endif %}
  125. {% endif %}
  126. {% endif %}
  127. {% endif %}
  128. {#
  129. Network definitions (only when Traefik is enabled):
  130. - Traefik network: always external (managed by Traefik)
  131. #}
  132. {% if traefik_enabled %}
  133. networks:
  134. {{ traefik_network }}:
  135. external: true
  136. {% endif %}