compose.yaml.j2 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. services:
  2. {{ service_name }}:
  3. image: ghcr.io/goauthentik/server:2025.10.1
  4. {% if not swarm_enabled %}
  5. restart: {{ restart_policy }}
  6. container_name: {{ container_name }}
  7. {% endif %}
  8. hostname: {{ container_hostname }}
  9. command: server
  10. environment:
  11. - TZ={{ container_timezone }}
  12. - AUTHENTIK_SECRET_KEY=${AUTHENTIK_SECRET_KEY}
  13. - AUTHENTIK_ERROR_REPORTING__ENABLED={{ authentik_error_reporting }}
  14. - AUTHENTIK_REDIS__HOST={{ service_name }}-redis
  15. - AUTHENTIK_POSTGRESQL__HOST={{ service_name }}-postgres
  16. - AUTHENTIK_POSTGRESQL__USER={{ database_user }}
  17. - AUTHENTIK_POSTGRESQL__NAME={{ database_name }}
  18. - AUTHENTIK_POSTGRESQL__PASSWORD=${DATABASE_PASSWORD}
  19. {% if email_enabled %}
  20. - AUTHENTIK_EMAIL__HOST={{ email_host }}
  21. - AUTHENTIK_EMAIL__PORT={{ email_port }}
  22. - AUTHENTIK_EMAIL__USERNAME={{ email_username }}
  23. - AUTHENTIK_EMAIL__PASSWORD=${EMAIL_PASSWORD}
  24. - AUTHENTIK_EMAIL__USE_TLS={{ email_use_tls }}
  25. - AUTHENTIK_EMAIL__USE_SSL={{ email_use_ssl }}
  26. - AUTHENTIK_EMAIL__FROM={{ email_from }}
  27. {% endif %}
  28. {% if network_mode == 'host' %}
  29. network_mode: host
  30. {% else %}
  31. networks:
  32. {% if traefik_enabled %}
  33. {{ traefik_network }}:
  34. {% endif %}
  35. {% if network_mode == 'macvlan' %}
  36. {{ network_name }}:
  37. ipv4_address: {{ network_macvlan_ipv4_address }}
  38. {% elif network_mode == 'bridge' %}
  39. {{ network_name }}:
  40. {% endif %}
  41. {% endif %}
  42. {% if not traefik_enabled and network_mode == 'bridge' %}
  43. ports:
  44. {% if swarm_enabled %}
  45. - target: 9000
  46. published: {{ ports_http }}
  47. protocol: tcp
  48. mode: host
  49. - target: 9443
  50. published: {{ ports_https }}
  51. protocol: tcp
  52. mode: host
  53. {% else %}
  54. - "{{ ports_http }}:9000"
  55. - "{{ ports_https }}:9443"
  56. {% endif %}
  57. {% endif %}
  58. volumes:
  59. {% if volume_mode == 'mount' %}
  60. - {{ volume_mount_path }}/media:/media
  61. - {{ volume_mount_path }}/templates:/templates
  62. {% elif volume_mode in ['local', 'nfs'] %}
  63. - {{ service_name }}-media:/media
  64. - {{ service_name }}-templates:/templates
  65. {% endif %}
  66. {% if traefik_enabled and not swarm_enabled %}
  67. labels:
  68. - traefik.enable=true
  69. - traefik.docker.network={{ traefik_network }}
  70. - traefik.http.services.{{ service_name }}-web.loadBalancer.server.port=9000
  71. - traefik.http.routers.{{ service_name }}-http.service={{ service_name }}-web
  72. - traefik.http.routers.{{ service_name }}-http.rule=Host(`{{ traefik_host }}.{{ traefik_domain }}`)
  73. - traefik.http.routers.{{ service_name }}-http.entrypoints={{ traefik_entrypoint }}
  74. {% if traefik_tls_enabled %}
  75. - traefik.http.routers.{{ service_name }}-https.service={{ service_name }}-web
  76. - traefik.http.routers.{{ service_name }}-https.rule=Host(`{{ traefik_host }}.{{ traefik_domain }}`)
  77. - traefik.http.routers.{{ service_name }}-https.entrypoints={{ traefik_tls_entrypoint }}
  78. - traefik.http.routers.{{ service_name }}-https.tls=true
  79. - traefik.http.routers.{{ service_name }}-https.tls.certresolver={{ traefik_tls_certresolver }}
  80. {% endif %}
  81. {% endif %}
  82. depends_on:
  83. - {{ service_name }}-postgres
  84. - {{ service_name }}-redis
  85. {% if swarm_enabled or resources_enabled %}
  86. deploy:
  87. {% if swarm_enabled %}
  88. mode: {{ swarm_placement_mode }}
  89. {% if swarm_placement_mode == 'replicated' %}
  90. replicas: {{ swarm_replicas }}
  91. {% endif %}
  92. {% if swarm_placement_host %}
  93. placement:
  94. constraints:
  95. - node.hostname == {{ swarm_placement_host }}
  96. {% endif %}
  97. restart_policy:
  98. condition: on-failure
  99. {% endif %}
  100. {% if resources_enabled %}
  101. resources:
  102. limits:
  103. cpus: '{{ resources_cpu_limit }}'
  104. memory: {{ resources_memory_limit }}
  105. {% if swarm_enabled %}
  106. reservations:
  107. cpus: '{{ resources_cpu_reservation }}'
  108. memory: {{ resources_memory_reservation }}
  109. {% endif %}
  110. {% endif %}
  111. {% if swarm_enabled and traefik_enabled %}
  112. labels:
  113. - traefik.enable=true
  114. - traefik.docker.network={{ traefik_network }}
  115. - traefik.http.services.{{ service_name }}-web.loadBalancer.server.port=9000
  116. - traefik.http.routers.{{ service_name }}-http.service={{ service_name }}-web
  117. - traefik.http.routers.{{ service_name }}-http.rule=Host(`{{ traefik_host }}.{{ traefik_domain }}`)
  118. - traefik.http.routers.{{ service_name }}-http.entrypoints={{ traefik_entrypoint }}
  119. {% if traefik_tls_enabled %}
  120. - traefik.http.routers.{{ service_name }}-https.service={{ service_name }}-web
  121. - traefik.http.routers.{{ service_name }}-https.rule=Host(`{{ traefik_host }}.{{ traefik_domain }}`)
  122. - traefik.http.routers.{{ service_name }}-https.entrypoints={{ traefik_tls_entrypoint }}
  123. - traefik.http.routers.{{ service_name }}-https.tls=true
  124. - traefik.http.routers.{{ service_name }}-https.tls.certresolver={{ traefik_tls_certresolver }}
  125. {% endif %}
  126. {% endif %}
  127. {% endif %}
  128. {{ service_name }}-worker:
  129. image: ghcr.io/goauthentik/server:2025.10.1
  130. {% if not swarm_enabled %}
  131. restart: {{ restart_policy }}
  132. container_name: {{ service_name }}-worker
  133. {% endif %}
  134. command: worker
  135. environment:
  136. - TZ={{ container_timezone }}
  137. - AUTHENTIK_SECRET_KEY=${AUTHENTIK_SECRET_KEY}
  138. - AUTHENTIK_ERROR_REPORTING__ENABLED={{ authentik_error_reporting }}
  139. - AUTHENTIK_REDIS__HOST={{ service_name }}-redis
  140. - AUTHENTIK_POSTGRESQL__HOST={{ service_name }}-postgres
  141. - AUTHENTIK_POSTGRESQL__USER={{ database_user }}
  142. - AUTHENTIK_POSTGRESQL__NAME={{ database_name }}
  143. - AUTHENTIK_POSTGRESQL__PASSWORD=${DATABASE_PASSWORD}
  144. {% if email_enabled %}
  145. - AUTHENTIK_EMAIL__HOST={{ email_host }}
  146. - AUTHENTIK_EMAIL__PORT={{ email_port }}
  147. - AUTHENTIK_EMAIL__USERNAME={{ email_username }}
  148. - AUTHENTIK_EMAIL__PASSWORD=${EMAIL_PASSWORD}
  149. - AUTHENTIK_EMAIL__USE_TLS={{ email_use_tls }}
  150. - AUTHENTIK_EMAIL__USE_SSL={{ email_use_ssl }}
  151. - AUTHENTIK_EMAIL__FROM={{ email_from }}
  152. {% endif %}
  153. user: root
  154. {% if network_mode == 'host' %}
  155. network_mode: host
  156. {% else %}
  157. networks:
  158. {% if traefik_enabled %}
  159. {{ traefik_network }}:
  160. {% endif %}
  161. {% if network_mode == 'macvlan' %}
  162. {{ network_name }}:
  163. ipv4_address: {{ network_macvlan_ipv4_address }}
  164. {% elif network_mode == 'bridge' %}
  165. {{ network_name }}:
  166. {% endif %}
  167. {% endif %}
  168. volumes:
  169. - /run/docker.sock:/run/docker.sock
  170. {% if volume_mode == 'mount' %}
  171. - {{ volume_mount_path }}/media:/media
  172. - {{ volume_mount_path }}/certs:/certs
  173. - {{ volume_mount_path }}/templates:/templates
  174. {% elif volume_mode in ['local', 'nfs'] %}
  175. - {{ service_name }}-media:/media
  176. - {{ service_name }}-certs:/certs
  177. - {{ service_name }}-templates:/templates
  178. {% endif %}
  179. depends_on:
  180. - {{ service_name }}-postgres
  181. - {{ service_name }}-redis
  182. {{ service_name }}-redis:
  183. image: docker.io/library/redis:8.2.3
  184. {% if not swarm_enabled %}
  185. restart: {{ restart_policy }}
  186. container_name: {{ service_name }}-redis
  187. {% endif %}
  188. command: --save 60 1 --loglevel warning
  189. healthcheck:
  190. test: ["CMD-SHELL", "redis-cli ping | grep PONG"]
  191. start_period: 20s
  192. interval: 30s
  193. retries: 5
  194. timeout: 3s
  195. {% if network_mode == 'host' %}
  196. network_mode: host
  197. {% else %}
  198. networks:
  199. {% if traefik_enabled %}
  200. {{ traefik_network }}:
  201. {% endif %}
  202. {% if network_mode == 'macvlan' %}
  203. {{ network_name }}:
  204. ipv4_address: {{ network_macvlan_ipv4_address }}
  205. {% elif network_mode == 'bridge' %}
  206. {{ network_name }}:
  207. {% endif %}
  208. {% endif %}
  209. volumes:
  210. {% if volume_mode == 'mount' %}
  211. - {{ volume_mount_path }}/redis:/data
  212. {% elif volume_mode in ['local', 'nfs'] %}
  213. - {{ service_name }}-redis:/data
  214. {% endif %}
  215. {% if not database_external %}
  216. {{ service_name }}-postgres:
  217. image: docker.io/library/postgres:17.6
  218. {% if not swarm_enabled %}
  219. restart: {{ restart_policy }}
  220. container_name: {{ service_name }}-db
  221. {% endif %}
  222. environment:
  223. - TZ={{ container_timezone }}
  224. - POSTGRES_USER={{ database_user }}
  225. - POSTGRES_PASSWORD=${DATABASE_PASSWORD}
  226. - POSTGRES_DB={{ database_name }}
  227. healthcheck:
  228. test: ["CMD-SHELL", "pg_isready -U {{ database_user }}"]
  229. start_period: 30s
  230. interval: 10s
  231. timeout: 10s
  232. retries: 5
  233. {% if network_mode == 'host' %}
  234. network_mode: host
  235. {% else %}
  236. networks:
  237. {% if traefik_enabled %}
  238. {{ traefik_network }}:
  239. {% endif %}
  240. {% if network_mode == 'macvlan' %}
  241. {{ network_name }}:
  242. ipv4_address: {{ network_macvlan_ipv4_address }}
  243. {% elif network_mode == 'bridge' %}
  244. {{ network_name }}:
  245. {% endif %}
  246. {% endif %}
  247. volumes:
  248. {% if volume_mode == 'mount' %}
  249. - {{ volume_mount_path }}/postgres:/var/lib/postgresql/data
  250. {% elif volume_mode in ['local', 'nfs'] %}
  251. - {{ service_name }}-postgres:/var/lib/postgresql/data
  252. {% endif %}
  253. {% endif %}
  254. {% if volume_mode == 'local' %}
  255. volumes:
  256. {% if not database_external %}
  257. {{ service_name }}-postgres:
  258. driver: local
  259. {% endif %}
  260. {{ service_name }}-redis:
  261. driver: local
  262. {% elif volume_mode == 'nfs' %}
  263. volumes:
  264. {{ service_name }}-postgres:
  265. driver: local
  266. driver_opts:
  267. type: nfs
  268. o: addr={{ volume_nfs_server }},{{ volume_nfs_options }}
  269. device: ":{{ volume_nfs_path }}/postgres"
  270. {{ service_name }}-redis:
  271. driver: local
  272. driver_opts:
  273. type: nfs
  274. o: addr={{ volume_nfs_server }},{{ volume_nfs_options }}
  275. device: ":{{ volume_nfs_path }}/redis"
  276. {% endif %}
  277. {% if network_mode != 'host' %}
  278. networks:
  279. {{ network_name }}:
  280. {% if network_external %}
  281. external: true
  282. {% else %}
  283. {% if network_mode == 'macvlan' %}
  284. driver: macvlan
  285. driver_opts:
  286. parent: {{ network_macvlan_parent_interface }}
  287. ipam:
  288. config:
  289. - subnet: {{ network_macvlan_subnet }}
  290. gateway: {{ network_macvlan_gateway }}
  291. name: {{ network_name }}
  292. {% elif swarm_enabled %}
  293. driver: overlay
  294. attachable: true
  295. {% else %}
  296. driver: bridge
  297. {% endif %}
  298. {% endif %}
  299. {% if traefik_enabled %}
  300. {{ traefik_network }}:
  301. external: true
  302. {% endif %}
  303. {% endif %}