compose.yaml.j2 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. ---
  2. services:
  3. {{ service_name }}:
  4. image: ghcr.io/goauthentik/server:2025.12.4
  5. restart: {{ restart_policy }}
  6. command: server
  7. environment:
  8. - AUTHENTIK_SECRET_KEY=${AUTHENTIK_SECRET_KEY}
  9. - AUTHENTIK_ERROR_REPORTING__ENABLED={{ authentik_error_reporting }}
  10. - AUTHENTIK_POSTGRESQL__HOST={{ service_name }}_postgres
  11. - AUTHENTIK_POSTGRESQL__USER={{ database_user }}
  12. - AUTHENTIK_POSTGRESQL__NAME={{ database_name }}
  13. - AUTHENTIK_POSTGRESQL__PASSWORD=${DATABASE_PASSWORD}
  14. {% if email_enabled %}
  15. - AUTHENTIK_EMAIL__HOST={{ email_host }}
  16. - AUTHENTIK_EMAIL__PORT={{ email_port }}
  17. - AUTHENTIK_EMAIL__FROM={{ email_from }}
  18. - AUTHENTIK_EMAIL__USERNAME={{ email_username }}
  19. - AUTHENTIK_EMAIL__PASSWORD=${EMAIL_PASSWORD}
  20. {% if email_encryption == "ssl" %}
  21. - AUTHENTIK_EMAIL__USE_SSL=True
  22. {% elif email_encryption == "starttls" %}
  23. - AUTHENTIK_EMAIL__USE_TLS=True
  24. {% endif %}
  25. {% endif %}
  26. networks:
  27. {% if traefik_enabled %}
  28. - {{ traefik_network }}
  29. {% endif %}
  30. - {{ service_name }}_backend
  31. {% if not traefik_enabled %}
  32. ports:
  33. - "{{ ports_http }}:9000"
  34. - "{{ ports_https }}:9443"
  35. {% endif %}
  36. volumes:
  37. {% if volume_mode == 'mount' %}
  38. - {{ volume_mount_path }}/data:/data
  39. - {{ volume_mount_path }}/templates:/templates
  40. {% elif volume_mode == 'local' or volume_mode == 'nfs' %}
  41. - {{ service_name }}_data:/data
  42. - {{ service_name }}_templates:/templates
  43. {% endif %}
  44. {% if traefik_enabled %}
  45. labels:
  46. - traefik.enable=true
  47. - traefik.docker.network={{ traefik_network }}
  48. - traefik.http.services.{{ service_name }}_web.loadBalancer.server.port=9000
  49. - traefik.http.routers.{{ service_name }}_http.service={{ service_name }}_web
  50. - traefik.http.routers.{{ service_name }}_http.rule=Host(`{{ traefik_host }}.{{ traefik_domain }}`)
  51. - traefik.http.routers.{{ service_name }}_http.entrypoints=web
  52. - "traefik.http.middlewares.authentik.forwardauth.address=\
  53. http://{{ service_name }}:9000/outpost.goauthentik.io/auth/traefik"
  54. - "traefik.http.middlewares.authentik.forwardauth.trustForwardHeader=true"
  55. - "traefik.http.middlewares.authentik.forwardauth.authResponseHeaders=\
  56. X-authentik-username,\
  57. X-authentik-groups,\
  58. X-authentik-entitlements,\
  59. X-authentik-email,\
  60. X-authentik-name,\
  61. X-authentik-uid,\
  62. X-authentik-jwt,\
  63. X-authentik-meta-jwks,\
  64. X-authentik-meta-outpost,\
  65. X-authentik-meta-provider,\
  66. X-authentik-meta-app,\
  67. X-authentik-meta-version"
  68. {% if traefik_tls_enabled %}
  69. - traefik.http.routers.{{ service_name }}_https.service={{ service_name }}_web
  70. - traefik.http.routers.{{ service_name }}_https.rule=Host(`{{ traefik_host }}.{{ traefik_domain }}`)
  71. - traefik.http.routers.{{ service_name }}_https.entrypoints=websecure
  72. - traefik.http.routers.{{ service_name }}_https.tls=true
  73. - traefik.http.routers.{{ service_name }}_https.tls.certresolver={{ traefik_tls_certresolver }}
  74. {% endif %}
  75. {% endif %}
  76. {% if not database_external %}
  77. depends_on:
  78. - {{ service_name }}_postgres
  79. {% endif %}
  80. {#
  81. Authentik Worker: Background task processor
  82. Handles long-running tasks like email sending, cleanup jobs, and scheduled tasks
  83. #}
  84. {{ service_name }}_worker:
  85. image: ghcr.io/goauthentik/server:2025.12.4
  86. restart: {{ restart_policy }}
  87. command: worker
  88. environment:
  89. - AUTHENTIK_SECRET_KEY=${AUTHENTIK_SECRET_KEY}
  90. - AUTHENTIK_ERROR_REPORTING__ENABLED={{ authentik_error_reporting }}
  91. - AUTHENTIK_POSTGRESQL__HOST={{ service_name }}_postgres
  92. - AUTHENTIK_POSTGRESQL__USER={{ database_user }}
  93. - AUTHENTIK_POSTGRESQL__NAME={{ database_name }}
  94. - AUTHENTIK_POSTGRESQL__PASSWORD=${DATABASE_PASSWORD}
  95. {% if email_enabled %}
  96. - AUTHENTIK_EMAIL__HOST={{ email_host }}
  97. - AUTHENTIK_EMAIL__PORT={{ email_port }}
  98. - AUTHENTIK_EMAIL__FROM={{ email_from }}
  99. - AUTHENTIK_EMAIL__USERNAME={{ email_username }}
  100. - AUTHENTIK_EMAIL__PASSWORD=${EMAIL_PASSWORD}
  101. {% if email_encryption == "ssl" %}
  102. - AUTHENTIK_EMAIL__USE_SSL=True
  103. {% elif email_encryption == "starttls" %}
  104. - AUTHENTIK_EMAIL__USE_TLS=True
  105. {% endif %}
  106. {% endif %}
  107. {% if authentik_admin_password %}
  108. - AUTHENTIK_BOOTSTRAP_PASSWORD=${AUTHENTIK_ADMIN_PASSWORD}
  109. {% endif %}
  110. user: root
  111. networks:
  112. - {{ service_name }}_backend
  113. volumes:
  114. {# the embedded outpost uses the docker socket to manage containers #}
  115. - /run/docker.sock:/run/docker.sock
  116. {% if volume_mode == 'mount' %}
  117. - {{ volume_mount_path }}/data:/data
  118. - {{ volume_mount_path }}/certs:/certs
  119. - {{ volume_mount_path }}/templates:/templates
  120. {% elif volume_mode == 'local' or volume_mode == 'nfs' %}
  121. - {{ service_name }}_data:/data
  122. - {{ service_name }}_certs:/certs
  123. - {{ service_name }}_templates:/templates
  124. {% endif %}
  125. {% if not database_external %}
  126. depends_on:
  127. - {{ service_name }}_postgres
  128. {% endif %}
  129. {#
  130. PostgreSQL database service
  131. #}
  132. {% if not database_external %}
  133. {{ service_name }}_postgres:
  134. image: docker.io/library/postgres:17.8
  135. restart: {{ restart_policy }}
  136. environment:
  137. - POSTGRES_USER={{ database_user }}
  138. - POSTGRES_PASSWORD=${DATABASE_PASSWORD}
  139. - POSTGRES_DB={{ database_name }}
  140. healthcheck:
  141. test: ["CMD-SHELL", "pg_isready -U {{ database_user }}"]
  142. start_period: 30s
  143. interval: 10s
  144. timeout: 10s
  145. retries: 5
  146. networks:
  147. - {{ service_name }}_backend
  148. volumes:
  149. {% if volume_mode == 'mount' %}
  150. - {{ volume_mount_path }}/postgres:/var/lib/postgresql/data
  151. {% elif volume_mode == 'local' or volume_mode == 'nfs' %}
  152. - {{ service_name }}_postgres:/var/lib/postgresql/data
  153. {% endif %}
  154. {% endif %}
  155. {#
  156. Network definitions:
  157. - Backend network: Internal communication between services
  158. - Traefik network: External access via reverse proxy (always external)
  159. #}
  160. networks:
  161. {{ service_name }}_backend:
  162. driver: bridge
  163. {% if traefik_enabled %}
  164. {{ traefik_network }}:
  165. external: true
  166. {% endif %}
  167. {#
  168. Volume definitions:
  169. - When volume_mode is 'local' (default): use docker-managed local volumes
  170. - When volume_mode is 'nfs': configure NFS-backed volumes
  171. - When volume_mode is 'mount': no volume definition needed (bind mounts used directly)
  172. #}
  173. {% if volume_mode == 'local' %}
  174. volumes:
  175. {% if not database_external %}
  176. {{ service_name }}_postgres:
  177. driver: local
  178. {% endif %}
  179. {{ service_name }}_redis:
  180. driver: local
  181. {{ service_name }}_data:
  182. driver: local
  183. {{ service_name }}_certs:
  184. driver: local
  185. {{ service_name }}_templates:
  186. driver: local
  187. {% elif volume_mode == 'nfs' %}
  188. volumes:
  189. {% if not database_external %}
  190. {{ service_name }}_postgres:
  191. driver: local
  192. driver_opts:
  193. type: nfs
  194. o: addr={{ volume_nfs_server }},nfsvers=4,{{ volume_nfs_options }}
  195. device: ":{{ volume_nfs_path }}/postgres"
  196. {% endif %}
  197. {{ service_name }}_redis:
  198. driver: local
  199. driver_opts:
  200. type: nfs
  201. o: addr={{ volume_nfs_server }},nfsvers=4,{{ volume_nfs_options }}
  202. device: ":{{ volume_nfs_path }}/redis"
  203. {{ service_name }}_data:
  204. driver: local
  205. driver_opts:
  206. type: nfs
  207. o: addr={{ volume_nfs_server }},nfsvers=4,{{ volume_nfs_options }}
  208. device: ":{{ volume_nfs_path }}/data"
  209. {{ service_name }}_certs:
  210. driver: local
  211. driver_opts:
  212. type: nfs
  213. o: addr={{ volume_nfs_server }},nfsvers=4,{{ volume_nfs_options }}
  214. device: ":{{ volume_nfs_path }}/certs"
  215. {{ service_name }}_templates:
  216. driver: local
  217. driver_opts:
  218. type: nfs
  219. o: addr={{ volume_nfs_server }},nfsvers=4,{{ volume_nfs_options }}
  220. device: ":{{ volume_nfs_path }}/templates"
  221. {% endif %}