compose.yaml.j2 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. services:
  2. {{ service_name }}:
  3. image: docker.io/netboxcommunity/netbox:v4.2.3
  4. restart: {{ restart_policy }}
  5. {% if container_name %}
  6. container_name: {{ container_name }}
  7. {% endif %}
  8. {% if container_hostname %}
  9. hostname: {{ container_hostname }}
  10. {% endif %}
  11. depends_on:
  12. {% if not database_external %}
  13. - {{ service_name }}-postgres
  14. {% endif %}
  15. - {{ service_name }}-redis
  16. - {{ service_name }}-redis-cache
  17. environment:
  18. {% if container_timezone %}
  19. - TZ={{ container_timezone }}
  20. {% endif %}
  21. {% if traefik_enabled %}
  22. - ALLOWED_HOSTS={{ traefik_host }}.{{ traefik_domain }}
  23. {% else %}
  24. - ALLOWED_HOSTS=*
  25. {% endif %}
  26. {% if database_external %}
  27. - DB_HOST={{ database_host }}
  28. {% else %}
  29. - DB_HOST={{ service_name }}-postgres
  30. {% endif %}
  31. - DB_NAME={{ database_name }}
  32. - DB_USER={{ database_user }}
  33. - DB_PASSWORD=${DATABASE_PASSWORD}
  34. - REDIS_HOST={{ service_name }}-redis
  35. - REDIS_PASSWORD=${REDIS_PASSWORD}
  36. - REDIS_CACHE_HOST={{ service_name }}-redis-cache
  37. - REDIS_CACHE_PASSWORD=${REDIS_PASSWORD}
  38. - SECRET_KEY=${NETBOX_SECRET_KEY}
  39. {% if netbox_metrics_enabled %}
  40. - METRICS_ENABLED=true
  41. {% endif %}
  42. {% if email_enabled %}
  43. - EMAIL_SERVER={{ email_server }}
  44. - EMAIL_PORT={{ email_port }}
  45. - EMAIL_FROM={{ email_from }}
  46. - EMAIL_USERNAME={{ email_username }}
  47. - EMAIL_PASSWORD=${EMAIL_PASSWORD}
  48. - EMAIL_USE_SSL={{ email_use_ssl }}
  49. - EMAIL_USE_TLS={{ email_use_tls }}
  50. {% endif %}
  51. networks:
  52. {% if traefik_enabled %}
  53. - {{ traefik_network }}
  54. {% endif %}
  55. - {{ service_name }}_backend
  56. {% if not traefik_enabled %}
  57. ports:
  58. - "{{ ports_http }}:8080"
  59. {% endif %}
  60. volumes:
  61. {% if volume_mode == 'mount' %}
  62. - {{ volume_mount_path }}/media:/opt/netbox/netbox/media
  63. - {{ volume_mount_path }}/reports:/opt/netbox/netbox/reports
  64. - {{ volume_mount_path }}/scripts:/opt/netbox/netbox/scripts
  65. {% elif volume_mode in ['local', 'nfs'] %}
  66. - {{ service_name }}-media:/opt/netbox/netbox/media
  67. - {{ service_name }}-reports:/opt/netbox/netbox/reports
  68. - {{ service_name }}-scripts:/opt/netbox/netbox/scripts
  69. {% endif %}
  70. {% if traefik_enabled %}
  71. labels:
  72. - traefik.enable=true
  73. - traefik.docker.network={{ traefik_network }}
  74. - traefik.http.services.{{ service_name }}-web.name={{ service_name }}-web
  75. - traefik.http.services.{{ service_name }}-web.loadBalancer.server.port=8080
  76. - traefik.http.routers.{{ service_name }}-http.service={{ service_name }}-web
  77. - traefik.http.routers.{{ service_name }}-http.rule=Host(`{{ traefik_host }}.{{ traefik_domain }}`)
  78. - traefik.http.routers.{{ service_name }}-http.entrypoints={{ traefik_entrypoint }}
  79. {% if traefik_tls_enabled %}
  80. - traefik.http.routers.{{ service_name }}-https.service={{ service_name }}-web
  81. - traefik.http.routers.{{ service_name }}-https.rule=Host(`{{ traefik_host }}.{{ traefik_domain }}`)
  82. - traefik.http.routers.{{ service_name }}-https.entrypoints={{ traefik_tls_entrypoint }}
  83. - traefik.http.routers.{{ service_name }}-https.tls=true
  84. - traefik.http.routers.{{ service_name }}-https.tls.certresolver={{ traefik_tls_certresolver }}
  85. {% endif %}
  86. {% endif %}
  87. healthcheck:
  88. test: ["CMD", "curl", "-f", "http://localhost:8080/api/"]
  89. interval: 10s
  90. timeout: 5s
  91. retries: 5
  92. {{ service_name }}-worker:
  93. image: docker.io/netboxcommunity/netbox:v4.2.3
  94. restart: {{ restart_policy }}
  95. {% if container_name %}
  96. container_name: {{ container_name }}-worker
  97. {% endif %}
  98. {% if container_hostname %}
  99. hostname: {{ container_hostname }}-worker
  100. {% endif %}
  101. command:
  102. - /opt/netbox/venv/bin/python
  103. - /opt/netbox/netbox/manage.py
  104. - rqworker
  105. depends_on:
  106. - {{ service_name }}
  107. - {{ service_name }}-postgres
  108. - {{ service_name }}-redis
  109. environment:
  110. - TZ={{ container_timezone }}
  111. {% if database_external %}
  112. - DB_HOST={{ database_host }}
  113. {% else %}
  114. - DB_HOST={{ service_name }}-postgres
  115. {% endif %}
  116. - DB_NAME={{ database_name }}
  117. - DB_USER={{ database_user }}
  118. - DB_PASSWORD=${DATABASE_PASSWORD}
  119. - REDIS_HOST={{ service_name }}-redis
  120. - REDIS_PASSWORD=${REDIS_PASSWORD}
  121. - REDIS_CACHE_HOST={{ service_name }}-redis-cache
  122. - REDIS_CACHE_PASSWORD=${REDIS_PASSWORD}
  123. - SECRET_KEY=${NETBOX_SECRET_KEY}
  124. {% if email_enabled %}
  125. - EMAIL_SERVER={{ email_server }}
  126. - EMAIL_PORT={{ email_port }}
  127. - EMAIL_FROM={{ email_from }}
  128. - EMAIL_USERNAME={{ email_username }}
  129. - EMAIL_PASSWORD=${EMAIL_PASSWORD}
  130. - EMAIL_USE_SSL={{ email_use_ssl }}
  131. - EMAIL_USE_TLS={{ email_use_tls }}
  132. {% endif %}
  133. networks:
  134. - {{ service_name }}_backend
  135. volumes:
  136. {% if volume_mode == 'mount' %}
  137. - {{ volume_mount_path }}/media:/opt/netbox/netbox/media
  138. - {{ volume_mount_path }}/reports:/opt/netbox/netbox/reports
  139. - {{ volume_mount_path }}/scripts:/opt/netbox/netbox/scripts
  140. {% elif volume_mode in ['local', 'nfs'] %}
  141. - {{ service_name }}-media:/opt/netbox/netbox/media
  142. - {{ service_name }}-reports:/opt/netbox/netbox/reports
  143. - {{ service_name }}-scripts:/opt/netbox/netbox/scripts
  144. {% endif %}
  145. {{ service_name }}-redis:
  146. image: docker.io/library/redis:8.4.0-alpine
  147. restart: {{ restart_policy }}
  148. {% if container_name %}
  149. container_name: {{ container_name }}-redis
  150. {% endif %}
  151. {% if container_hostname %}
  152. hostname: {{ container_hostname }}-redis
  153. {% endif %}
  154. command:
  155. - sh
  156. - -c
  157. - redis-server --appendonly yes --requirepass $$REDIS_PASSWORD
  158. environment:
  159. - REDIS_PASSWORD=${REDIS_PASSWORD}
  160. networks:
  161. - {{ service_name }}_backend
  162. volumes:
  163. {% if volume_mode == 'mount' %}
  164. - {{ volume_mount_path }}/redis:/data
  165. {% elif volume_mode in ['local', 'nfs'] %}
  166. - {{ service_name }}-redis:/data
  167. {% endif %}
  168. {{ service_name }}-redis-cache:
  169. image: docker.io/library/redis:8.4.0-alpine
  170. restart: {{ restart_policy }}
  171. {% if container_name %}
  172. container_name: {{ container_name }}-redis-cache
  173. {% endif %}
  174. {% if container_hostname %}
  175. hostname: {{ container_hostname }}-redis-cache
  176. {% endif %}
  177. command:
  178. - sh
  179. - -c
  180. - redis-server --requirepass $$REDIS_PASSWORD
  181. environment:
  182. - REDIS_PASSWORD=${REDIS_PASSWORD}
  183. networks:
  184. - {{ service_name }}_backend
  185. volumes:
  186. {% if volume_mode == 'mount' %}
  187. - {{ volume_mount_path }}/redis-cache:/data
  188. {% elif volume_mode in ['local', 'nfs'] %}
  189. - {{ service_name }}-redis-cache:/data
  190. {% endif %}
  191. {% if not database_external %}
  192. {{ service_name }}-postgres:
  193. image: docker.io/library/postgres:17.2-alpine
  194. restart: {{ restart_policy }}
  195. {% if container_name %}
  196. container_name: {{ container_name }}-postgres
  197. {% endif %}
  198. {% if container_hostname %}
  199. hostname: {{ container_hostname }}-postgres
  200. {% endif %}
  201. environment:
  202. - TZ={{ container_timezone }}
  203. - POSTGRES_USER={{ database_user }}
  204. - POSTGRES_PASSWORD=${DATABASE_PASSWORD}
  205. - POSTGRES_DB={{ database_name }}
  206. networks:
  207. - {{ service_name }}_backend
  208. volumes:
  209. {% if volume_mode == 'mount' %}
  210. - {{ volume_mount_path }}/postgres:/var/lib/postgresql/data
  211. {% elif volume_mode in ['local', 'nfs'] %}
  212. - {{ service_name }}-postgres:/var/lib/postgresql/data
  213. {% endif %}
  214. {% endif %}
  215. {% if volume_mode == 'local' %}
  216. volumes:
  217. {% if not database_external %}
  218. {{ service_name }}-postgres:
  219. driver: local
  220. {% endif %}
  221. {{ service_name }}-redis:
  222. driver: local
  223. {{ service_name }}-redis-cache:
  224. driver: local
  225. {{ service_name }}-media:
  226. driver: local
  227. {{ service_name }}-reports:
  228. driver: local
  229. {{ service_name }}-scripts:
  230. driver: local
  231. {% elif volume_mode == 'nfs' %}
  232. volumes:
  233. {% if not database_external %}
  234. {{ service_name }}-postgres:
  235. driver: local
  236. driver_opts:
  237. type: nfs
  238. o: addr={{ volume_nfs_server }},{{ volume_nfs_options }}
  239. device: ":{{ volume_nfs_path }}/postgres"
  240. {% endif %}
  241. {{ service_name }}-redis:
  242. driver: local
  243. driver_opts:
  244. type: nfs
  245. o: addr={{ volume_nfs_server }},{{ volume_nfs_options }}
  246. device: ":{{ volume_nfs_path }}/redis"
  247. {{ service_name }}-redis-cache:
  248. driver: local
  249. driver_opts:
  250. type: nfs
  251. o: addr={{ volume_nfs_server }},{{ volume_nfs_options }}
  252. device: ":{{ volume_nfs_path }}/redis-cache"
  253. {{ service_name }}-media:
  254. driver: local
  255. driver_opts:
  256. type: nfs
  257. o: addr={{ volume_nfs_server }},{{ volume_nfs_options }}
  258. device: ":{{ volume_nfs_path }}/media"
  259. {{ service_name }}-reports:
  260. driver: local
  261. driver_opts:
  262. type: nfs
  263. o: addr={{ volume_nfs_server }},{{ volume_nfs_options }}
  264. device: ":{{ volume_nfs_path }}/reports"
  265. {{ service_name }}-scripts:
  266. driver: local
  267. driver_opts:
  268. type: nfs
  269. o: addr={{ volume_nfs_server }},{{ volume_nfs_options }}
  270. device: ":{{ volume_nfs_path }}/scripts"
  271. {% endif %}
  272. networks:
  273. {{ service_name }}_backend:
  274. driver: bridge
  275. {% if traefik_enabled %}
  276. {{ traefik_network }}:
  277. external: true
  278. {% endif %}