{{- define "defaultVolumes" }} - type: "bind" source: "/etc/timezone" target: "/etc/timezone" read_only: true - type: "bind" source: "/etc/localtime" target: "/etc/localtime" read_only: true {{- end -}} --- version: "3.9" networks: flow: name: "{{ .Docker.Network.Name }}" ipam: driver: "default" config: - subnet: "{{ .Docker.Network.Subnet }}" services: # -- Traffic flow -- traefik: container_name: "{{ .Traefik.ContainerName }}" image: "localhost/flow/traefik:{{ .Traefik.Version }}" build: context: "../traefik" networks: flow: ipv4_address: "{{ .Traefik.ContainerIpv4Address }}" ports: - target: 80 published: 80 protocol: "tcp" mode: "host" - target: 443 published: 443 protocol: "tcp" mode: "host" - target: {{ .Traefik.ExternalSSHPort }} published: {{ .Traefik.ExternalSSHPort }} protocol: "tcp" mode: "host" restart: "always" volumes: {{- template "defaultVolumes" }} # Traefik TLS volume - type: "bind" source: "{{ .Traefik.TlsHostDirectory }}" target: "{{ .Traefik.TlsContainerDirectory }}" # -- Code flow -- forgejo: container_name: "{{ .Forgejo.ContainerName }}" image: "localhost/flow/forgejo:{{ .Forgejo.Version }}" build: context: "../forgejo" expose: - "{{ .Forgejo.SshPort }}" - "{{ .Forgejo.HttpPort }}" networks: flow: ipv4_address: "{{ .Forgejo.ContainerIpv4Address }}" restart: "always" volumes: {{- template "defaultVolumes" }} # Forgejo data volume - type: "bind" source: "{{ .Forgejo.DataHostDirectory }}" target: "{{ .Forgejo.DataContainerDirectory }}" # -- Free Flow -- gotosocial: container_name: "{{ .GoToSocial.ContainerName }}" image: "localhost/flow/gotosocial:{{ .GoToSocial.Version }}" build: context: "../gotosocial" environment: TZ: {{ .GoToSocial.TZ }} expose: - "{{ .GoToSocial.Port }}" networks: flow: ipv4_address: "{{ .GoToSocial.ContainerIpv4Address }}" restart: "always" volumes: {{- template "defaultVolumes" }} # Go To Social data volume - type: "bind" source: "{{ .GoToSocial.DataHostDirectory }}" target: "{{ .GoToSocial.DataContainerDirectory }}" # -- Work Flow -- woodpecker: container_name: "{{ .Woodpecker.ContainerName }}" image: "localhost/flow/woodpecker:{{ .Woodpecker.Version }}" build: context: "../woodpecker" environment: WOODPECKER_LOG_LEVEL: "{{ .Woodpecker.LogLevel }}" WOODPECKER_HOST: "https://{{ .Woodpecker.Subdomain }}.{{ .RootDomain }}" WOODPECKER_SERVER_ADDR: "{{ .Woodpecker.ContainerIpv4Address }}:{{ .Woodpecker.HttpPort }}" WOODPECKER_GRPC_ADDR: "{{ .Woodpecker.ContainerIpv4Address }}:{{ .Woodpecker.GrpcPort }}" WOODPECKER_LETS_ENCRYPT: "false" WOODPECKER_ADMIN: "{{ .Woodpecker.Admin }}" WOODPECKER_OPEN: "{{ .Woodpecker.Open }}" WOODPECKER_AGENT_SECRET: "{{ .Woodpecker.AgentSecret }}" WOODPECKER_DATABASE_DRIVER: "sqlite3" WOODPECKER_DATABASE_DATASOURCE: "{{ .Woodpecker.DataContainerDirectory }}/woodpecker.db" WOODPECKER_GITEA: "true" WOODPECKER_GITEA_URL: "https://{{ .Forgejo.Subdomain }}.{{ .RootDomain }}" WOODPECKER_GITEA_CLIENT: "{{ .Woodpecker.ForgejoClientID }}" WOODPECKER_GITEA_SECRET: "{{ .Woodpecker.ForgejoClientSecret }}" WOODPECKER_GITEA_SKIP_VERIFY: "false" expose: - "{{ .Woodpecker.HttpPort }}" - "{{ .Woodpecker.GrpcPort }}" networks: flow: ipv4_address: "{{ .Woodpecker.ContainerIpv4Address }}" restart: "always" volumes: {{- template "defaultVolumes" }} # Woodpecker data volume - type: "bind" source: "{{ .Woodpecker.DataHostDirectory }}" target: "{{ .Woodpecker.DataContainerDirectory }}" # -- Landing Page -- landing: container_name: "{{ .Landing.ContainerName }}" command: - --address={{ .Landing.ContainerIpv4Address }}:{{ .Landing.Port }} {{ range .Landing.Services -}} - --service=title={{ .Title }},url={{ .URL }}{{ if gt (len .Rel) 0 }},rel={{ .Rel }}{{ end }} {{ end -}} {{ range .Landing.Profiles -}} - --profile=title={{ .Title }},url={{ .URL }}{{ if gt (len .Rel) 0 }},rel={{ .Rel }}{{ end }} {{ end -}} image: "codeflow.dananglin.me.uk/flow/landing:v{{ .Landing.Version }}@{{ .Landing.ImageDigest }}" expose: - "{{ .Landing.Port }}" networks: flow: ipv4_address: "{{ .Landing.ContainerIpv4Address }}" restart: "always" volumes: {{- template "defaultVolumes" }}