Files
labca/build/docker-compose.yml
2025-12-27 16:40:48 +01:00

252 lines
7.6 KiB
YAML

name: labca
services:
boulder:
# The `letsencrypt/boulder-tools:latest` tag is automatically built in local
# dev environments. In CI a specific BOULDER_TOOLS_TAG is passed, and it is
# pulled with `docker compose pull`.
image: ghcr.io/hakwerk/labca-boulder:${LABCA_IMAGE_VERSION:-latest}
build:
context: test/boulder-tools/
# Should match one of the GO_CI_VERSIONS in test/boulder-tools/tag_and_upload.sh.
args:
GO_VERSION: 1.25.5
environment:
# To solve HTTP-01 and TLS-ALPN-01 challenges, change the IP in FAKE_DNS
# to the IP address where your ACME client's solver is listening. This is
# pointing at the boulder service's "public" IP, where challtestsrv is.
FAKE_DNS: 64.112.117.122
BOULDER_CONFIG_DIR: labca/config
GOCACHE: /boulder/.gocache/go-build
volumes:
- boulder_data:/opt/boulder/labca
- certificates:/opt/boulder/labca/certs
- nginx_html:/var/www/html
- softhsm:/var/lib/softhsm/tokens
networks:
bouldernet:
ipv4_address: 10.77.77.77
publicnet:
ipv4_address: 64.112.117.122
publicnet2:
ipv4_address: 64.112.117.134
# Use consul as a backup to Docker's embedded DNS server. If there's a name
# Docker's DNS server doesn't know about, it will forward the query to this
# IP (running consul).
# (https://docs.docker.com/config/containers/container-networking/#dns-services).
# This is used to look up service names via A records (like ra.service.consul) that
# are configured via the ServerAddress field of cmd.GRPCClientConfig.
# TODO: Remove this when ServerAddress is deprecated in favor of SRV records
# and DNSAuthority.
dns: 10.77.77.10
extra_hosts:
# Allow the boulder container to be reached as "ca.example.org", so we
# can put that name inside our integration test certs (e.g. as a crl
# url) and have it look like a publicly-accessible name.
# TODO(#8215): Move s3-test-srv to a separate service.
- "ca.example.org:64.112.117.122"
# Allow the boulder container to be reached as "integration.trust", for
# similar reasons, but intended for use as a SAN rather than a CRLDP.
# TODO(#8215): Move observer's probe target to a separate service.
- "integration.trust:64.112.117.122"
ports:
- 4001:4001 # ACMEv2
- 4003:4003 # SFE
depends_on:
- bmysql
- bredis
- bconsul
- bpkimetal
- control
entrypoint: labca/entrypoint.sh
working_dir: &boulder_working_dir /opt/boulder
logging:
driver: "json-file"
options:
max-size: "500k"
max-file: "5"
restart: always
bmysql:
image: &db_image mariadb:10.11.13
volumes:
- dbdata:/var/lib/mysql
networks:
bouldernet:
aliases:
- boulder-mysql
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
command: mysqld --bind-address=0.0.0.0 --log-output=TABLE
logging:
driver: "json-file"
options:
max-size: "500k"
max-file: "5"
restart: always
bmysql-upgrade:
image: *db_image
networks:
- bouldernet
depends_on:
- bmysql
entrypoint: >
bash -c "sleep 20 && mysql_upgrade -h bmysql"
bredis:
image: redis:7.0.15
volumes:
- ./test/:/test/:cached
- boulder_data:/opt/boulder/labca
- certificates:/opt/boulder/labca/certs
command: redis-server /opt/boulder/labca/redis-ratelimits.config
networks:
bouldernet:
ipv4_address: 10.77.77.4
restart: always
bconsul:
image: hashicorp/consul:1.19.2
depends_on:
- control
volumes:
- boulder_data:/opt/boulder/labca
- certificates:/opt/boulder/labca/certs
networks:
bouldernet:
ipv4_address: 10.77.77.10
command: "consul agent -dev -config-format=hcl -config-file=/opt/boulder/labca/consul/config.hcl"
working_dir: /opt/boulder
restart: always
gui:
image: ghcr.io/hakwerk/labca-gui:${LABCA_IMAGE_VERSION:-latest}
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./docker-compose.yml:/opt/boulder/docker-compose.yml
- ldata:/opt/labca/data
- nginx_html:/var/www/html
- backup:/opt/backup
- boulder_data:/opt/boulder/labca
- certificates:/opt/boulder/labca/certs
- softhsm:/var/lib/softhsm/tokens
networks:
- bouldernet
expose:
- 3000
depends_on:
- bmysql
- control
working_dir: /opt/labca
command: bin/labca-gui
logging:
driver: "json-file"
options:
max-size: "500k"
max-file: "5"
restart: always
nginx:
image: nginx:latest
networks:
- bouldernet
ports:
- 80:80
- 443:443
volumes:
- nginx_conf:/etc/nginx/conf.d
- nginx_ssl:/etc/nginx/ssl
- nginx_html:/var/www/html
depends_on:
- control
restart: always
control:
image: ghcr.io/hakwerk/labca-control:${LABCA_IMAGE_VERSION:-latest}
networks:
- bouldernet
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./docker-compose.yml:/opt/boulder/docker-compose.yml
- ldata:/opt/labca/data
- backup:/opt/backup
- logs:/opt/logs
- boulder_data:/opt/boulder/labca
- certificates:/opt/boulder/labca/certs
- softhsm:/var/lib/softhsm/tokens
- nginx_conf:/etc/nginx/conf.d
- nginx_ssl:/etc/nginx/ssl
- nginx_html:/var/www/html
expose:
- 3030
environment:
LABCA_FQDN: ${LABCA_FQDN:-notset}
working_dir: /opt/labca
command: ./control.sh
restart: always
bpkimetal:
image: ghcr.io/pkimetal/pkimetal:v1.20.0
networks:
- bouldernet
restart: always
volumes:
dbdata:
nginx_conf:
nginx_ssl:
nginx_html:
boulder_data:
ldata:
backup:
logs:
softhsm:
certificates:
networks:
# This network represents the data-center internal network. It is used for
# boulder services and their infrastructure, such as consul, mariadb, and
# redis.
bouldernet:
driver: bridge
ipam:
driver: default
config:
- subnet: 10.77.77.0/24
# Only issue DHCP addresses in the top half of the range, to avoid
# conflict with static addresses.
ip_range: 10.77.77.128/25
# This network represents the public internet. It uses a real public IP space
# (that Let's Encrypt controls) so that our integration tests are happy to
# validate and issue for it. It is used by challtestsrv, which binds to
# 64.112.117.122:80 and :443 for its HTTP-01 challenge responder.
#
# TODO(#8215): Put s3-test-srv on this network.
publicnet:
driver: bridge
ipam:
driver: default
config:
- subnet: 64.112.117.0/25
# This network is used for two things in the integration tests:
# - challtestsrv binds to 64.112.117.134:443 for its tls-alpn-01 challenge
# responder, to avoid interfering with the HTTPS port used for testing
# HTTP->HTTPS redirects during http-01 challenges. Note: this could
# probably be updated in the future so that challtestsrv can handle
# both tls-alpn-01 and HTTPS on the same port.
# - test/v2_integration.py has some test cases that start their own HTTP
# server instead of relying on challtestsrv, because they want very
# specific behavior. For these cases, v2_integration.py creates a Python
# HTTP server and binds it to 64.112.117.134:80.
#
# TODO(#8215): Deprecate this network, replacing it with individual IPs within
# the existing publicnet.
publicnet2:
driver: bridge
ipam:
driver: default
config:
- subnet: 64.112.117.128/25