|
|
@@ -0,0 +1,418 @@
|
|
|
+services:
|
|
|
+ {{ service_name }}:
|
|
|
+ image: docker.io/netboxcommunity/netbox:v4.2.3
|
|
|
+ {% if not swarm_enabled %}
|
|
|
+ restart: {{ restart_policy }}
|
|
|
+ container_name: {{ container_name }}
|
|
|
+ {% endif %}
|
|
|
+ hostname: {{ container_hostname }}
|
|
|
+ depends_on:
|
|
|
+ - {{ service_name }}-postgres
|
|
|
+ - {{ service_name }}-redis
|
|
|
+ - {{ service_name }}-redis-cache
|
|
|
+ environment:
|
|
|
+ - TZ={{ container_timezone }}
|
|
|
+ - CORS_ORIGIN_ALLOW_ALL={{ netbox_cors_enabled }}
|
|
|
+ {% if netbox_cors_enabled %}
|
|
|
+ - CORS_ORIGIN_WHITELIST={{ netbox_cors_origins }}
|
|
|
+ {% endif %}
|
|
|
+ - DB_HOST={{ service_name }}-postgres
|
|
|
+ - DB_NAME={{ database_name }}
|
|
|
+ - DB_USER={{ database_user }}
|
|
|
+ - DB_PASSWORD=${DATABASE_PASSWORD}
|
|
|
+ - REDIS_HOST={{ service_name }}-redis
|
|
|
+ - REDIS_PASSWORD=${REDIS_PASSWORD}
|
|
|
+ - REDIS_CACHE_HOST={{ service_name }}-redis-cache
|
|
|
+ - REDIS_CACHE_PASSWORD=${REDIS_PASSWORD}
|
|
|
+ - SECRET_KEY=${NETBOX_SECRET_KEY}
|
|
|
+ - SKIP_SUPERUSER=true
|
|
|
+ {% if netbox_metrics_enabled %}
|
|
|
+ - METRICS_ENABLED=true
|
|
|
+ {% endif %}
|
|
|
+ {% if email_enabled %}
|
|
|
+ - EMAIL_SERVER={{ email_server }}
|
|
|
+ - EMAIL_PORT={{ email_port }}
|
|
|
+ - EMAIL_FROM={{ email_from }}
|
|
|
+ - EMAIL_USERNAME={{ email_username }}
|
|
|
+ - EMAIL_PASSWORD=${EMAIL_PASSWORD}
|
|
|
+ - EMAIL_USE_SSL={{ email_use_ssl }}
|
|
|
+ - EMAIL_USE_TLS={{ email_use_tls }}
|
|
|
+ {% endif %}
|
|
|
+ {% if network_mode == 'host' %}
|
|
|
+ network_mode: host
|
|
|
+ {% else %}
|
|
|
+ networks:
|
|
|
+ {% if traefik_enabled %}
|
|
|
+ {{ traefik_network }}:
|
|
|
+ {% endif %}
|
|
|
+ {% if network_mode == 'macvlan' %}
|
|
|
+ {{ network_name }}:
|
|
|
+ ipv4_address: {{ network_macvlan_ipv4_address }}
|
|
|
+ {% elif network_mode == 'bridge' %}
|
|
|
+ {{ network_name }}:
|
|
|
+ {% endif %}
|
|
|
+ {% endif %}
|
|
|
+ {% if not traefik_enabled and network_mode == 'bridge' %}
|
|
|
+ ports:
|
|
|
+ {% if swarm_enabled %}
|
|
|
+ - target: 8080
|
|
|
+ published: {{ ports_http }}
|
|
|
+ protocol: tcp
|
|
|
+ mode: host
|
|
|
+ {% else %}
|
|
|
+ - "{{ ports_http }}:8080"
|
|
|
+ {% endif %}
|
|
|
+ {% endif %}
|
|
|
+ volumes:
|
|
|
+ {% if volume_mode == 'mount' %}
|
|
|
+ - {{ volume_mount_path }}/media:/opt/netbox/netbox/media
|
|
|
+ - {{ volume_mount_path }}/reports:/opt/netbox/netbox/reports
|
|
|
+ - {{ volume_mount_path }}/scripts:/opt/netbox/netbox/scripts
|
|
|
+ {% elif volume_mode in ['local', 'nfs'] %}
|
|
|
+ - {{ service_name }}-media:/opt/netbox/netbox/media
|
|
|
+ - {{ service_name }}-reports:/opt/netbox/netbox/reports
|
|
|
+ - {{ service_name }}-scripts:/opt/netbox/netbox/scripts
|
|
|
+ {% endif %}
|
|
|
+ {% if traefik_enabled and not swarm_enabled %}
|
|
|
+ labels:
|
|
|
+ - traefik.enable=true
|
|
|
+ - traefik.docker.network={{ traefik_network }}
|
|
|
+ - traefik.http.services.{{ service_name }}.loadBalancer.server.port=8080
|
|
|
+ - traefik.http.routers.{{ service_name }}-http.service={{ service_name }}
|
|
|
+ - traefik.http.routers.{{ service_name }}-http.rule=Host(`{{ traefik_host }}.{{ traefik_domain }}`)
|
|
|
+ - traefik.http.routers.{{ service_name }}-http.entrypoints={{ traefik_entrypoint }}
|
|
|
+ {% if traefik_tls_enabled %}
|
|
|
+ - traefik.http.routers.{{ service_name }}-https.service={{ service_name }}
|
|
|
+ - traefik.http.routers.{{ service_name }}-https.rule=Host(`{{ traefik_host }}.{{ traefik_domain }}`)
|
|
|
+ - traefik.http.routers.{{ service_name }}-https.entrypoints={{ traefik_tls_entrypoint }}
|
|
|
+ - traefik.http.routers.{{ service_name }}-https.tls=true
|
|
|
+ - traefik.http.routers.{{ service_name }}-https.tls.certresolver={{ traefik_tls_certresolver }}
|
|
|
+ {% endif %}
|
|
|
+ {% endif %}
|
|
|
+ {% if swarm_enabled or resources_enabled %}
|
|
|
+ deploy:
|
|
|
+ {% if swarm_enabled %}
|
|
|
+ mode: {{ swarm_placement_mode }}
|
|
|
+ {% if swarm_placement_mode == 'replicated' %}
|
|
|
+ replicas: {{ swarm_replicas }}
|
|
|
+ {% endif %}
|
|
|
+ {% if swarm_placement_host %}
|
|
|
+ placement:
|
|
|
+ constraints:
|
|
|
+ - node.hostname == {{ swarm_placement_host }}
|
|
|
+ {% endif %}
|
|
|
+ restart_policy:
|
|
|
+ condition: on-failure
|
|
|
+ {% endif %}
|
|
|
+ {% if resources_enabled %}
|
|
|
+ resources:
|
|
|
+ limits:
|
|
|
+ cpus: '{{ resources_cpu_limit }}'
|
|
|
+ memory: {{ resources_memory_limit }}
|
|
|
+ {% if swarm_enabled %}
|
|
|
+ reservations:
|
|
|
+ cpus: '{{ resources_cpu_reservation }}'
|
|
|
+ memory: {{ resources_memory_reservation }}
|
|
|
+ {% endif %}
|
|
|
+ {% endif %}
|
|
|
+ {% if swarm_enabled and traefik_enabled %}
|
|
|
+ labels:
|
|
|
+ - traefik.enable=true
|
|
|
+ - traefik.docker.network={{ traefik_network }}
|
|
|
+ - traefik.http.services.{{ service_name }}.loadBalancer.server.port=8080
|
|
|
+ - traefik.http.routers.{{ service_name }}-http.service={{ service_name }}
|
|
|
+ - traefik.http.routers.{{ service_name }}-http.rule=Host(`{{ traefik_host }}.{{ traefik_domain }}`)
|
|
|
+ - traefik.http.routers.{{ service_name }}-http.entrypoints={{ traefik_entrypoint }}
|
|
|
+ {% if traefik_tls_enabled %}
|
|
|
+ - traefik.http.routers.{{ service_name }}-https.service={{ service_name }}
|
|
|
+ - traefik.http.routers.{{ service_name }}-https.rule=Host(`{{ traefik_host }}.{{ traefik_domain }}`)
|
|
|
+ - traefik.http.routers.{{ service_name }}-https.entrypoints={{ traefik_tls_entrypoint }}
|
|
|
+ - traefik.http.routers.{{ service_name }}-https.tls=true
|
|
|
+ - traefik.http.routers.{{ service_name }}-https.tls.certresolver={{ traefik_tls_certresolver }}
|
|
|
+ {% endif %}
|
|
|
+ {% endif %}
|
|
|
+ {% endif %}
|
|
|
+
|
|
|
+ {{ service_name }}-worker:
|
|
|
+ image: docker.io/netboxcommunity/netbox:v4.2.3
|
|
|
+ {% if not swarm_enabled %}
|
|
|
+ restart: {{ restart_policy }}
|
|
|
+ container_name: {{ service_name }}-worker
|
|
|
+ {% endif %}
|
|
|
+ command:
|
|
|
+ - /opt/netbox/venv/bin/python
|
|
|
+ - /opt/netbox/netbox/manage.py
|
|
|
+ - rqworker
|
|
|
+ depends_on:
|
|
|
+ - {{ service_name }}
|
|
|
+ - {{ service_name }}-postgres
|
|
|
+ - {{ service_name }}-redis
|
|
|
+ environment:
|
|
|
+ - TZ={{ container_timezone }}
|
|
|
+ - DB_HOST={{ service_name }}-postgres
|
|
|
+ - DB_NAME={{ database_name }}
|
|
|
+ - DB_USER={{ database_user }}
|
|
|
+ - DB_PASSWORD=${DATABASE_PASSWORD}
|
|
|
+ - REDIS_HOST={{ service_name }}-redis
|
|
|
+ - REDIS_PASSWORD=${REDIS_PASSWORD}
|
|
|
+ - REDIS_CACHE_HOST={{ service_name }}-redis-cache
|
|
|
+ - REDIS_CACHE_PASSWORD=${REDIS_PASSWORD}
|
|
|
+ - SECRET_KEY=${NETBOX_SECRET_KEY}
|
|
|
+ {% if email_enabled %}
|
|
|
+ - EMAIL_SERVER={{ email_server }}
|
|
|
+ - EMAIL_PORT={{ email_port }}
|
|
|
+ - EMAIL_FROM={{ email_from }}
|
|
|
+ - EMAIL_USERNAME={{ email_username }}
|
|
|
+ - EMAIL_PASSWORD=${EMAIL_PASSWORD}
|
|
|
+ - EMAIL_USE_SSL={{ email_use_ssl }}
|
|
|
+ - EMAIL_USE_TLS={{ email_use_tls }}
|
|
|
+ {% endif %}
|
|
|
+ {% if network_mode == 'host' %}
|
|
|
+ network_mode: host
|
|
|
+ {% else %}
|
|
|
+ networks:
|
|
|
+ {% if traefik_enabled %}
|
|
|
+ {{ traefik_network }}:
|
|
|
+ {% endif %}
|
|
|
+ {% if network_mode == 'macvlan' %}
|
|
|
+ {{ network_name }}:
|
|
|
+ {% elif network_mode == 'bridge' %}
|
|
|
+ {{ network_name }}:
|
|
|
+ {% endif %}
|
|
|
+ {% endif %}
|
|
|
+ volumes:
|
|
|
+ {% if volume_mode == 'mount' %}
|
|
|
+ - {{ volume_mount_path }}/media:/opt/netbox/netbox/media
|
|
|
+ - {{ volume_mount_path }}/reports:/opt/netbox/netbox/reports
|
|
|
+ - {{ volume_mount_path }}/scripts:/opt/netbox/netbox/scripts
|
|
|
+ {% elif volume_mode in ['local', 'nfs'] %}
|
|
|
+ - {{ service_name }}-media:/opt/netbox/netbox/media
|
|
|
+ - {{ service_name }}-reports:/opt/netbox/netbox/reports
|
|
|
+ - {{ service_name }}-scripts:/opt/netbox/netbox/scripts
|
|
|
+ {% endif %}
|
|
|
+
|
|
|
+ {{ service_name }}-housekeeping:
|
|
|
+ image: docker.io/netboxcommunity/netbox:v4.2.3
|
|
|
+ {% if not swarm_enabled %}
|
|
|
+ restart: {{ restart_policy }}
|
|
|
+ container_name: {{ service_name }}-housekeeping
|
|
|
+ {% endif %}
|
|
|
+ command:
|
|
|
+ - /opt/netbox/housekeeping.sh
|
|
|
+ depends_on:
|
|
|
+ - {{ service_name }}
|
|
|
+ - {{ service_name }}-postgres
|
|
|
+ - {{ service_name }}-redis
|
|
|
+ environment:
|
|
|
+ - TZ={{ container_timezone }}
|
|
|
+ - DB_HOST={{ service_name }}-postgres
|
|
|
+ - DB_NAME={{ database_name }}
|
|
|
+ - DB_USER={{ database_user }}
|
|
|
+ - DB_PASSWORD=${DATABASE_PASSWORD}
|
|
|
+ - REDIS_HOST={{ service_name }}-redis
|
|
|
+ - REDIS_PASSWORD=${REDIS_PASSWORD}
|
|
|
+ - REDIS_CACHE_HOST={{ service_name }}-redis-cache
|
|
|
+ - REDIS_CACHE_PASSWORD=${REDIS_PASSWORD}
|
|
|
+ - SECRET_KEY=${NETBOX_SECRET_KEY}
|
|
|
+ {% if network_mode == 'host' %}
|
|
|
+ network_mode: host
|
|
|
+ {% else %}
|
|
|
+ networks:
|
|
|
+ {% if traefik_enabled %}
|
|
|
+ {{ traefik_network }}:
|
|
|
+ {% endif %}
|
|
|
+ {% if network_mode == 'macvlan' %}
|
|
|
+ {{ network_name }}:
|
|
|
+ {% elif network_mode == 'bridge' %}
|
|
|
+ {{ network_name }}:
|
|
|
+ {% endif %}
|
|
|
+ {% endif %}
|
|
|
+ volumes:
|
|
|
+ {% if volume_mode == 'mount' %}
|
|
|
+ - {{ volume_mount_path }}/media:/opt/netbox/netbox/media
|
|
|
+ {% elif volume_mode in ['local', 'nfs'] %}
|
|
|
+ - {{ service_name }}-media:/opt/netbox/netbox/media
|
|
|
+ {% endif %}
|
|
|
+
|
|
|
+ {{ service_name }}-redis:
|
|
|
+ image: docker.io/library/redis:7.4-alpine
|
|
|
+ {% if not swarm_enabled %}
|
|
|
+ restart: {{ restart_policy }}
|
|
|
+ container_name: {{ service_name }}-redis
|
|
|
+ {% endif %}
|
|
|
+ command:
|
|
|
+ - sh
|
|
|
+ - -c
|
|
|
+ - redis-server --appendonly yes --requirepass $$REDIS_PASSWORD
|
|
|
+ environment:
|
|
|
+ - REDIS_PASSWORD=${REDIS_PASSWORD}
|
|
|
+ {% if network_mode == 'host' %}
|
|
|
+ network_mode: host
|
|
|
+ {% else %}
|
|
|
+ networks:
|
|
|
+ {% if traefik_enabled %}
|
|
|
+ {{ traefik_network }}:
|
|
|
+ {% endif %}
|
|
|
+ {% if network_mode == 'macvlan' %}
|
|
|
+ {{ network_name }}:
|
|
|
+ {% elif network_mode == 'bridge' %}
|
|
|
+ {{ network_name }}:
|
|
|
+ {% endif %}
|
|
|
+ {% endif %}
|
|
|
+ volumes:
|
|
|
+ {% if volume_mode == 'mount' %}
|
|
|
+ - {{ volume_mount_path }}/redis:/data
|
|
|
+ {% elif volume_mode in ['local', 'nfs'] %}
|
|
|
+ - {{ service_name }}-redis:/data
|
|
|
+ {% endif %}
|
|
|
+
|
|
|
+ {{ service_name }}-redis-cache:
|
|
|
+ image: docker.io/library/redis:7.4-alpine
|
|
|
+ {% if not swarm_enabled %}
|
|
|
+ restart: {{ restart_policy }}
|
|
|
+ container_name: {{ service_name }}-redis-cache
|
|
|
+ {% endif %}
|
|
|
+ command:
|
|
|
+ - sh
|
|
|
+ - -c
|
|
|
+ - redis-server --requirepass $$REDIS_PASSWORD
|
|
|
+ environment:
|
|
|
+ - REDIS_PASSWORD=${REDIS_PASSWORD}
|
|
|
+ {% if network_mode == 'host' %}
|
|
|
+ network_mode: host
|
|
|
+ {% else %}
|
|
|
+ networks:
|
|
|
+ {% if traefik_enabled %}
|
|
|
+ {{ traefik_network }}:
|
|
|
+ {% endif %}
|
|
|
+ {% if network_mode == 'macvlan' %}
|
|
|
+ {{ network_name }}:
|
|
|
+ {% elif network_mode == 'bridge' %}
|
|
|
+ {{ network_name }}:
|
|
|
+ {% endif %}
|
|
|
+ {% endif %}
|
|
|
+ volumes:
|
|
|
+ {% if volume_mode == 'mount' %}
|
|
|
+ - {{ volume_mount_path }}/redis-cache:/data
|
|
|
+ {% elif volume_mode in ['local', 'nfs'] %}
|
|
|
+ - {{ service_name }}-redis-cache:/data
|
|
|
+ {% endif %}
|
|
|
+
|
|
|
+ {% if not database_external %}
|
|
|
+ {{ service_name }}-postgres:
|
|
|
+ image: docker.io/library/postgres:17.2-alpine
|
|
|
+ {% if not swarm_enabled %}
|
|
|
+ restart: {{ restart_policy }}
|
|
|
+ container_name: {{ service_name }}-postgres
|
|
|
+ {% endif %}
|
|
|
+ environment:
|
|
|
+ - TZ={{ container_timezone }}
|
|
|
+ - POSTGRES_USER={{ database_user }}
|
|
|
+ - POSTGRES_PASSWORD=${DATABASE_PASSWORD}
|
|
|
+ - POSTGRES_DB={{ database_name }}
|
|
|
+ {% if network_mode == 'host' %}
|
|
|
+ network_mode: host
|
|
|
+ {% else %}
|
|
|
+ networks:
|
|
|
+ {% if traefik_enabled %}
|
|
|
+ {{ traefik_network }}:
|
|
|
+ {% endif %}
|
|
|
+ {% if network_mode == 'macvlan' %}
|
|
|
+ {{ network_name }}:
|
|
|
+ {% elif network_mode == 'bridge' %}
|
|
|
+ {{ network_name }}:
|
|
|
+ {% endif %}
|
|
|
+ {% endif %}
|
|
|
+ volumes:
|
|
|
+ {% if volume_mode == 'mount' %}
|
|
|
+ - {{ volume_mount_path }}/postgres:/var/lib/postgresql/data
|
|
|
+ {% elif volume_mode in ['local', 'nfs'] %}
|
|
|
+ - {{ service_name }}-postgres:/var/lib/postgresql/data
|
|
|
+ {% endif %}
|
|
|
+ {% endif %}
|
|
|
+
|
|
|
+{% if volume_mode == 'local' %}
|
|
|
+volumes:
|
|
|
+ {% if not database_external %}
|
|
|
+ {{ service_name }}-postgres:
|
|
|
+ driver: local
|
|
|
+ {% endif %}
|
|
|
+ {{ service_name }}-redis:
|
|
|
+ driver: local
|
|
|
+ {{ service_name }}-redis-cache:
|
|
|
+ driver: local
|
|
|
+ {{ service_name }}-media:
|
|
|
+ driver: local
|
|
|
+ {{ service_name }}-reports:
|
|
|
+ driver: local
|
|
|
+ {{ service_name }}-scripts:
|
|
|
+ driver: local
|
|
|
+{% elif volume_mode == 'nfs' %}
|
|
|
+volumes:
|
|
|
+ {% if not database_external %}
|
|
|
+ {{ service_name }}-postgres:
|
|
|
+ driver: local
|
|
|
+ driver_opts:
|
|
|
+ type: nfs
|
|
|
+ o: addr={{ volume_nfs_server }},{{ volume_nfs_options }}
|
|
|
+ device: ":{{ volume_nfs_path }}/postgres"
|
|
|
+ {% endif %}
|
|
|
+ {{ service_name }}-redis:
|
|
|
+ driver: local
|
|
|
+ driver_opts:
|
|
|
+ type: nfs
|
|
|
+ o: addr={{ volume_nfs_server }},{{ volume_nfs_options }}
|
|
|
+ device: ":{{ volume_nfs_path }}/redis"
|
|
|
+ {{ service_name }}-redis-cache:
|
|
|
+ driver: local
|
|
|
+ driver_opts:
|
|
|
+ type: nfs
|
|
|
+ o: addr={{ volume_nfs_server }},{{ volume_nfs_options }}
|
|
|
+ device: ":{{ volume_nfs_path }}/redis-cache"
|
|
|
+ {{ service_name }}-media:
|
|
|
+ driver: local
|
|
|
+ driver_opts:
|
|
|
+ type: nfs
|
|
|
+ o: addr={{ volume_nfs_server }},{{ volume_nfs_options }}
|
|
|
+ device: ":{{ volume_nfs_path }}/media"
|
|
|
+ {{ service_name }}-reports:
|
|
|
+ driver: local
|
|
|
+ driver_opts:
|
|
|
+ type: nfs
|
|
|
+ o: addr={{ volume_nfs_server }},{{ volume_nfs_options }}
|
|
|
+ device: ":{{ volume_nfs_path }}/reports"
|
|
|
+ {{ service_name }}-scripts:
|
|
|
+ driver: local
|
|
|
+ driver_opts:
|
|
|
+ type: nfs
|
|
|
+ o: addr={{ volume_nfs_server }},{{ volume_nfs_options }}
|
|
|
+ device: ":{{ volume_nfs_path }}/scripts"
|
|
|
+{% endif %}
|
|
|
+
|
|
|
+{% if network_mode != 'host' %}
|
|
|
+networks:
|
|
|
+ {{ network_name }}:
|
|
|
+ {% if network_external %}
|
|
|
+ external: true
|
|
|
+ {% else %}
|
|
|
+ {% if network_mode == 'macvlan' %}
|
|
|
+ driver: macvlan
|
|
|
+ driver_opts:
|
|
|
+ parent: {{ network_macvlan_parent_interface }}
|
|
|
+ ipam:
|
|
|
+ config:
|
|
|
+ - subnet: {{ network_macvlan_subnet }}
|
|
|
+ gateway: {{ network_macvlan_gateway }}
|
|
|
+ name: {{ network_name }}
|
|
|
+ {% elif swarm_enabled %}
|
|
|
+ driver: overlay
|
|
|
+ attachable: true
|
|
|
+ {% else %}
|
|
|
+ driver: bridge
|
|
|
+ {% endif %}
|
|
|
+ {% endif %}
|
|
|
+ {% if traefik_enabled %}
|
|
|
+ {{ traefik_network }}:
|
|
|
+ external: true
|
|
|
+ {% endif %}
|
|
|
+{% endif %}
|