compose.yaml.j2 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. services:
  2. {{ service_name }}:
  3. image: docker.io/gitlab/gitlab-ce:18.5.1-ce.0
  4. {% if not swarm_enabled %}
  5. restart: {{ restart_policy }}
  6. {% endif %}
  7. shm_size: '256m'
  8. environment:
  9. -
  10. {% if traefik_enabled %}
  11. networks:
  12. {{ traefik_network }}:
  13. {% endif %}
  14. ports:
  15. {% if not traefik_enabled %}
  16. - "{{ ports_http }}:80"
  17. {% endif %}
  18. - "{{ ports_ssh }}:22"
  19. {% if registry_enabled %}
  20. - "{{ ports_registry }}:5000"
  21. {% endif %}
  22. volumes:
  23. {% if volume_mode == 'mount' %}
  24. {% if not swarm_enabled %}
  25. - {{ volume_mount_path }}/config/gitlab.rb:/etc/gitlab/gitlab.rb:ro
  26. {% endif %}
  27. - {{ volume_mount_path }}/config:/etc/gitlab
  28. - {{ volume_mount_path }}/logs:/var/log/gitlab
  29. - {{ volume_mount_path }}/data:/var/opt/gitlab
  30. {% else %}
  31. {% if not swarm_enabled %}
  32. - ./config/gitlab.rb:/etc/gitlab/gitlab.rb:ro
  33. {% endif %}
  34. - {{ service_name }}_config:/etc/gitlab
  35. - {{ service_name }}_logs:/var/log/gitlab
  36. - {{ service_name }}_data:/var/opt/gitlab
  37. {% endif %}
  38. {% if traefik_enabled and not swarm_enabled %}
  39. labels:
  40. - traefik.enable=true
  41. - traefik.docker.network={{ traefik_network }}
  42. - traefik.http.services.{{ service_name }}_web.loadBalancer.server.port=80
  43. - traefik.http.routers.{{ service_name }}_http.service={{ service_name }}_web
  44. - traefik.http.routers.{{ service_name }}_http.rule=Host(`{{ traefik_host }}.{{ traefik_domain }}`)
  45. - traefik.http.routers.{{ service_name }}_http.entrypoints=web
  46. {% if traefik_tls_enabled %}
  47. - traefik.http.routers.{{ service_name }}_https.service={{ service_name }}_web
  48. - traefik.http.routers.{{ service_name }}_https.rule=Host(`{{ traefik_host }}.{{ traefik_domain }}`)
  49. - traefik.http.routers.{{ service_name }}_https.entrypoints=websecure
  50. - traefik.http.routers.{{ service_name }}_https.tls=true
  51. - traefik.http.routers.{{ service_name }}_https.tls.certresolver={{ traefik_tls_certresolver }}
  52. {% endif %}
  53. {% if registry_enabled %}
  54. - traefik.http.services.{{ service_name }}_registry.loadBalancer.server.port=5000
  55. - traefik.http.routers.{{ service_name }}_registry-http.service={{ service_name }}_registry
  56. - traefik.http.routers.{{ service_name }}_registry-http.rule=Host(`{{ traefik_registry_host }}`)
  57. - traefik.http.routers.{{ service_name }}_registry-http.entrypoints=web
  58. {% if traefik_tls_enabled %}
  59. - traefik.http.routers.{{ service_name }}_registry-https.service={{ service_name }}_registry
  60. - traefik.http.routers.{{ service_name }}_registry-https.rule=Host(`{{ traefik_registry_host }}`)
  61. - traefik.http.routers.{{ service_name }}_registry-https.entrypoints=websecure
  62. - traefik.http.routers.{{ service_name }}_registry-https.tls=true
  63. - traefik.http.routers.{{ service_name }}_registry-https.tls.certresolver={{ traefik_tls_certresolver }}
  64. {% endif %}
  65. {% endif %}
  66. {% endif %}
  67. {#
  68. Docker Swarm configuration (only when swarm_enabled is set):
  69. - Configs: GitLab configuration file
  70. - Secrets: Root password and registry secret (if registry enabled)
  71. - Deploy: Replication, placement, restart policy, and Traefik labels
  72. #}
  73. {% if swarm_enabled %}
  74. configs:
  75. - source: gitlab_config
  76. target: /etc/gitlab/gitlab.rb
  77. secrets:
  78. - source: {{ service_name }}_root_password
  79. target: /run/secrets/gitlab_root_password
  80. mode: 0400
  81. {% if registry_enabled %}
  82. - source: {{ service_name }}_registry_secret
  83. target: /run/secrets/gitlab_registry_secret
  84. mode: 0400
  85. {% endif %}
  86. deploy:
  87. mode: replicated
  88. replicas: 1
  89. {% if swarm_placement_host %}
  90. placement:
  91. constraints:
  92. - node.hostname == {{ swarm_placement_host }}
  93. {% endif %}
  94. restart_policy:
  95. condition: on-failure
  96. {% if traefik_enabled %}
  97. labels:
  98. - traefik.enable=true
  99. - traefik.docker.network={{ traefik_network }}
  100. - traefik.http.services.{{ service_name }}_web.loadBalancer.server.port=80
  101. - traefik.http.routers.{{ service_name }}_http.service={{ service_name }}_web
  102. - traefik.http.routers.{{ service_name }}_http.rule=Host(`{{ traefik_host }}.{{ traefik_domain }}`)
  103. - traefik.http.routers.{{ service_name }}_http.entrypoints=web
  104. {% if traefik_tls_enabled %}
  105. - traefik.http.routers.{{ service_name }}_https.service={{ service_name }}_web
  106. - traefik.http.routers.{{ service_name }}_https.rule=Host(`{{ traefik_host }}.{{ traefik_domain }}`)
  107. - traefik.http.routers.{{ service_name }}_https.entrypoints=websecure
  108. - traefik.http.routers.{{ service_name }}_https.tls=true
  109. - traefik.http.routers.{{ service_name }}_https.tls.certresolver={{ traefik_tls_certresolver }}
  110. {% endif %}
  111. {% if registry_enabled %}
  112. - traefik.http.services.{{ service_name }}_registry.loadBalancer.server.port=5000
  113. - traefik.http.routers.{{ service_name }}_registry-http.service={{ service_name }}_registry
  114. - traefik.http.routers.{{ service_name }}_registry-http.rule=Host(`{{ traefik_registry_host }}`)
  115. - traefik.http.routers.{{ service_name }}_registry-http.entrypoints=web
  116. {% if traefik_tls_enabled %}
  117. - traefik.http.routers.{{ service_name }}_registry-https.service={{ service_name }}_registry
  118. - traefik.http.routers.{{ service_name }}_registry-https.rule=Host(`{{ traefik_registry_host }}`)
  119. - traefik.http.routers.{{ service_name }}_registry-https.entrypoints=websecure
  120. - traefik.http.routers.{{ service_name }}_registry-https.tls=true
  121. - traefik.http.routers.{{ service_name }}_registry-https.tls.certresolver={{ traefik_tls_certresolver }}
  122. {% endif %}
  123. {% endif %}
  124. {% endif %}
  125. {% endif %}
  126. {#
  127. Volume definitions:
  128. - When volume_mode is 'local' (default): use docker-managed local volumes
  129. - When volume_mode is 'nfs': configure NFS-backed volumes
  130. - When volume_mode is 'mount': no volume definition needed (bind mounts used directly)
  131. #}
  132. {% if volume_mode == 'local' %}
  133. volumes:
  134. {{ service_name }}_config:
  135. driver: local
  136. {{ service_name }}_logs:
  137. driver: local
  138. {{ service_name }}_data:
  139. driver: local
  140. {% elif volume_mode == 'nfs' %}
  141. volumes:
  142. {{ service_name }}_config:
  143. driver: local
  144. driver_opts:
  145. type: nfs
  146. o: addr={{ volume_nfs_server }},nfsvers=4,{{ volume_nfs_options }}
  147. device: ":{{ volume_nfs_path }}/config"
  148. {{ service_name }}_logs:
  149. driver: local
  150. driver_opts:
  151. type: nfs
  152. o: addr={{ volume_nfs_server }},nfsvers=4,{{ volume_nfs_options }}
  153. device: ":{{ volume_nfs_path }}/logs"
  154. {{ service_name }}_data:
  155. driver: local
  156. driver_opts:
  157. type: nfs
  158. o: addr={{ volume_nfs_server }},nfsvers=4,{{ volume_nfs_options }}
  159. device: ":{{ volume_nfs_path }}/data"
  160. {% endif %}
  161. {#
  162. Docker Swarm configs and secrets (only when swarm_enabled is set):
  163. - Config: GitLab configuration file
  164. - Secrets: Root password and registry secret (if registry enabled)
  165. #}
  166. {% if swarm_enabled %}
  167. configs:
  168. gitlab_config:
  169. file: ./config/gitlab.rb
  170. secrets:
  171. {{ service_name }}_root_password:
  172. file: ./.env.secret
  173. {% if registry_enabled %}
  174. {{ service_name }}_registry_secret:
  175. file: ./.env.registry.secret
  176. {% endif %}
  177. {% endif %}
  178. {#
  179. Network definitions (only when Traefik is enabled):
  180. - Traefik network: always external (managed by Traefik)
  181. #}
  182. {% if traefik_enabled %}
  183. networks:
  184. {{ traefik_network }}:
  185. external: true
  186. {% endif %}