compose.yaml.j2 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. services:
  2. {{ service_name }}:
  3. {% if not swarm_enabled %}
  4. container_name: {{ container_name }}
  5. {% endif %}
  6. image: docker.io/pihole/pihole:2025.10.2
  7. env_file:
  8. - .env.pihole
  9. {% if network_mode == 'host' %}
  10. network_mode: host
  11. {% else %}
  12. networks:
  13. {% if traefik_enabled %}
  14. {{ traefik_network }}:
  15. {% endif %}
  16. {% if network_mode == 'macvlan' %}
  17. {{ network_name }}:
  18. ipv4_address: {{ network_macvlan_ipv4_address }}
  19. {% elif network_mode == 'bridge' %}
  20. {{ network_name }}:
  21. {% endif %}
  22. {% endif %}
  23. {% if network_mode not in ['host', 'macvlan'] %}
  24. ports:
  25. {% if not traefik_enabled %}
  26. {% if swarm_enabled %}
  27. - target: 80
  28. published: {{ ports_http }}
  29. protocol: tcp
  30. mode: host
  31. - target: 443
  32. published: {{ ports_https }}
  33. protocol: tcp
  34. mode: host
  35. {% else %}
  36. - "{{ ports_http }}:80/tcp"
  37. - "{{ ports_https }}:443/tcp"
  38. {% endif %}
  39. {% endif %}
  40. {% if swarm_enabled %}
  41. - target: 53
  42. published: {{ ports_dns }}
  43. protocol: tcp
  44. mode: host
  45. - target: 53
  46. published: {{ ports_dns }}
  47. protocol: udp
  48. mode: host
  49. - target: 123
  50. published: {{ ports_ntp }}
  51. protocol: udp
  52. mode: host
  53. {% else %}
  54. - "{{ ports_dns }}:53/tcp"
  55. - "{{ ports_dns }}:53/udp"
  56. - "{{ ports_ntp }}:123/udp"
  57. {% endif %}
  58. {% endif %}
  59. volumes:
  60. {% if not swarm_enabled %}
  61. - config_dnsmasq:/etc/dnsmasq.d
  62. - config_pihole:/etc/pihole
  63. {% else %}
  64. {% if swarm_volume_mode == 'mount' %}
  65. - {{ swarm_volume_mount_path }}/dnsmasq:/etc/dnsmasq.d:rw
  66. - {{ swarm_volume_mount_path }}/pihole:/etc/pihole:rw
  67. {% elif swarm_volume_mode == 'local' %}
  68. - config_dnsmasq:/etc/dnsmasq.d
  69. - config_pihole:/etc/pihole
  70. {% elif swarm_volume_mode == 'nfs' %}
  71. - config_dnsmasq:/etc/dnsmasq.d
  72. - config_pihole:/etc/pihole
  73. {% endif %}
  74. {% endif %}
  75. cap_add:
  76. - NET_ADMIN
  77. - SYS_TIME
  78. {% if swarm_enabled %}
  79. secrets:
  80. - {{ webpassword_secret_name }}
  81. deploy:
  82. mode: replicated
  83. replicas: 1
  84. placement:
  85. constraints:
  86. - node.hostname == {{ swarm_placement_host }}
  87. {% if traefik_enabled %}
  88. labels:
  89. - traefik.enable=true
  90. - traefik.http.services.{{ service_name }}-web.loadBalancer.server.port=80
  91. - traefik.http.routers.{{ service_name }}-http.service={{ service_name }}-web
  92. - traefik.http.routers.{{ service_name }}-http.rule=Host(`{{ traefik_host }}`)
  93. - traefik.http.routers.{{ service_name }}-http.entrypoints={{ traefik_entrypoint }}
  94. {% if traefik_tls_enabled %}
  95. - traefik.http.routers.{{ service_name }}-https.service={{ service_name }}-web
  96. - traefik.http.routers.{{ service_name }}-https.rule=Host(`{{ traefik_host }}`)
  97. - traefik.http.routers.{{ service_name }}-https.entrypoints={{ traefik_tls_entrypoint }}
  98. - traefik.http.routers.{{ service_name }}-https.tls=true
  99. - traefik.http.routers.{{ service_name }}-https.tls.certresolver={{ traefik_tls_certresolver }}
  100. {% endif %}
  101. {% endif %}
  102. {% else %}
  103. {% if traefik_enabled %}
  104. labels:
  105. - traefik.enable=true
  106. - traefik.http.services.{{ service_name }}-web.loadBalancer.server.port=80
  107. - traefik.http.routers.{{ service_name }}-http.service={{ service_name }}-web
  108. - traefik.http.routers.{{ service_name }}-http.rule=Host(`{{ traefik_host }}`)
  109. - traefik.http.routers.{{ service_name }}-http.entrypoints={{ traefik_entrypoint }}
  110. {% if traefik_tls_enabled %}
  111. - traefik.http.routers.{{ service_name }}-https.service={{ service_name }}-web
  112. - traefik.http.routers.{{ service_name }}-https.rule=Host(`{{ traefik_host }}`)
  113. - traefik.http.routers.{{ service_name }}-https.entrypoints={{ traefik_tls_entrypoint }}
  114. - traefik.http.routers.{{ service_name }}-https.tls=true
  115. - traefik.http.routers.{{ service_name }}-https.tls.certresolver={{ traefik_tls_certresolver }}
  116. {% endif %}
  117. {% endif %}
  118. restart: {{ restart_policy }}
  119. {% endif %}
  120. {% if swarm_enabled %}
  121. {% if swarm_volume_mode in ['local', 'nfs'] %}
  122. volumes:
  123. config_dnsmasq:
  124. {% if swarm_volume_mode == 'nfs' %}
  125. driver: local
  126. driver_opts:
  127. type: nfs
  128. o: addr={{ swarm_volume_nfs_server }},{{ swarm_volume_nfs_options }}
  129. device: ":{{ swarm_volume_nfs_path }}/dnsmasq"
  130. {% endif %}
  131. config_pihole:
  132. {% if swarm_volume_mode == 'nfs' %}
  133. driver: local
  134. driver_opts:
  135. type: nfs
  136. o: addr={{ swarm_volume_nfs_server }},{{ swarm_volume_nfs_options }}
  137. device: ":{{ swarm_volume_nfs_path }}/pihole"
  138. {% endif %}
  139. {% endif %}
  140. secrets:
  141. {{ webpassword_secret_name }}:
  142. file: ./.env.secret
  143. {% else %}
  144. volumes:
  145. config_dnsmasq:
  146. driver: local
  147. config_pihole:
  148. driver: local
  149. {% endif %}
  150. {% if network_mode != 'host' %}
  151. networks:
  152. {% if network_mode == 'macvlan' %}
  153. {{ network_name }}:
  154. driver: macvlan
  155. driver_opts:
  156. parent: {{ network_macvlan_parent_interface }}
  157. ipam:
  158. config:
  159. - subnet: {{ network_macvlan_subnet }}
  160. gateway: {{ network_macvlan_gateway }}
  161. {% elif network_mode == 'bridge' and network_external %}
  162. {{ network_name }}:
  163. external: true
  164. {% elif network_mode == 'bridge' and not network_external %}
  165. {{ network_name }}:
  166. {% if swarm_enabled %}
  167. driver: overlay
  168. attachable: true
  169. {% else %}
  170. driver: bridge
  171. {% endif %}
  172. {% endif %}
  173. {% if traefik_enabled %}
  174. {{ traefik_network }}:
  175. external: true
  176. {% endif %}
  177. {% endif %}