compose.yaml.j2 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. services:
  2. {{ service_name | default('pihole') }}:
  3. container_name: {{ container_name | default('pihole') }}
  4. image: docker.io/pihole/pihole:2025.08.0
  5. {% if network_enabled and network_mode == 'host' %}
  6. network_mode: host
  7. {% elif traefik_enabled or (network_enabled and network_mode == 'macvlan') %}
  8. networks:
  9. {% if traefik_enabled %}
  10. {{ traefik_network | default('traefik') }}:
  11. {% endif %}
  12. {% if network_enabled and network_mode == 'macvlan' %}
  13. {{ network_name | default('pihole_net') }}:
  14. ipv4_address: {{ network_macvlan_ipv4_address }}
  15. {% elif network_enabled and network_mode == 'bridge' %}
  16. {{ network_name | default('bridge') }}:
  17. {% endif %}
  18. {% endif %}
  19. {% if ports_enabled and not (network_enabled and network_mode in ['host', 'macvlan']) and (not traefik_enabled or dns_enabled or dhcp_enabled) %}
  20. ports:
  21. {% if not traefik_enabled %}
  22. - "{{ ports_http }}:80/tcp"
  23. - "{{ ports_https }}:443/tcp"
  24. {% endif %}
  25. {% if dns_enabled %}
  26. - "53:53/tcp"
  27. - "53:53/udp"
  28. {% endif %}
  29. {% if dhcp_enabled %}
  30. - "67:67/udp"
  31. {% endif %}
  32. {% endif %}
  33. environment:
  34. - TZ={{ container_timezone | default('UTC') }}
  35. {% if pihole_webpassword %} - FTLCONF_webserver_api_password={{ pihole_webpassword }}
  36. {% endif %} - FTLCONF_dns_upstreams={{ pihole_dns_upstreams | default('1.1.1.1;1.0.0.1') }}
  37. volumes:
  38. - config_dnsmasq:/etc/dnsmasq.d
  39. - config_pihole:/etc/pihole
  40. {% if traefik_enabled %}
  41. labels:
  42. - traefik.enable=true
  43. - traefik.http.services.{{ service_name | default('pihole') }}-web.loadBalancer.server.port=80
  44. - traefik.http.routers.{{ service_name | default('pihole') }}-http.service={{ service_name | default('pihole') }}-web
  45. - traefik.http.routers.{{ service_name | default('pihole') }}-http.rule=Host(`{{ traefik_host }}`)
  46. - traefik.http.routers.{{ service_name | default('pihole') }}-http.entrypoints={{ traefik_entrypoint | default('web') }}
  47. {% if traefik_tls_enabled %}
  48. - traefik.http.routers.{{ service_name | default('pihole') }}-https.service={{ service_name | default('pihole') }}-web
  49. - traefik.http.routers.{{ service_name | default('pihole') }}-https.rule=Host(`{{ traefik_host }}`)
  50. - traefik.http.routers.{{ service_name | default('pihole') }}-https.entrypoints={{ traefik_tls_entrypoint | default('websecure') }}
  51. - traefik.http.routers.{{ service_name | default('pihole') }}-https.tls=true
  52. - traefik.http.routers.{{ service_name | default('pihole') }}-https.tls.certresolver={{ traefik_tls_certresolver }}
  53. {% endif %}
  54. {% endif %}
  55. restart: {{ restart_policy | default('unless-stopped') }}
  56. volumes:
  57. config_dnsmasq:
  58. driver: local
  59. config_pihole:
  60. driver: local
  61. {% if network_enabled or traefik_enabled %}
  62. networks:
  63. {% if network_enabled and network_mode == 'macvlan' %}
  64. {{ network_name | default('pihole_net') }}:
  65. driver: macvlan
  66. driver_opts:
  67. parent: {{ network_macvlan_parent_interface }}
  68. ipam:
  69. config:
  70. - subnet: {{ network_macvlan_subnet }}
  71. gateway: {{ network_macvlan_gateway }}
  72. {% elif network_enabled and network_mode == 'bridge' and network_external %}
  73. {{ network_name | default('bridge') }}:
  74. external: true
  75. {% elif network_enabled and network_mode == 'bridge' and not network_external %}
  76. {{ network_name | default('bridge') }}:
  77. driver: bridge
  78. {% endif %}
  79. {% if traefik_enabled %}
  80. {{ traefik_network | default('traefik') }}:
  81. external: true
  82. {% endif %}
  83. {% endif %}