blob: 7a99def8b5a9bfb9e8153a0c00551c70118c4cdd [file]
# devstack/lib/ingress.sh — shared Traefik bring-up + per-project registration.
INGRESS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../traefik" && pwd)"
_dc() { DEVSTACK_HOME="$DEVSTACK_HOME" docker compose -f "$INGRESS_DIR/compose.yml" "$@"; }
ingress_up() {
cp "$INGRESS_DIR/traefik.yml" "$DEVSTACK_HOME/traefik/traefik.yml"
# default cert for no-SNI / unknown-SNI clients
cat > "$DEVSTACK_HOME/traefik/dynamic/_tls-default.yml" <<EOF
tls:
stores:
default:
defaultCertificate:
certFile: /certs/$DEVSTACK_TLD.pem
keyFile: /certs/$DEVSTACK_TLD-key.pem
EOF
_dc up -d
}
ingress_register_project() {
# 1) per-project cert entry (additive; never edits another project's file)
cat > "$DEVSTACK_HOME/traefik/dynamic/$DEVSTACK_PROJECT.yml" <<EOF
tls:
certificates:
- certFile: /certs/$DEVSTACK_TLD.pem
keyFile: /certs/$DEVSTACK_TLD-key.pem
EOF
# 2) project network (idempotent) + connect Traefik to it WITH the dev hostname
# aliases, so in-VM containers resolve <name>.$DEVSTACK_TLD to Traefik via
# Docker's embedded DNS (server -> auth.airavata.host, portal -> auth/api, ...).
docker network inspect "$DEVSTACK_PROJECT-devstack" >/dev/null 2>&1 || \
docker network create --attachable "$DEVSTACK_PROJECT-devstack"
docker network connect \
--alias "api.$DEVSTACK_TLD" --alias "auth.$DEVSTACK_TLD" \
--alias "gateway.$DEVSTACK_TLD" --alias "adminer.$DEVSTACK_TLD" \
"$DEVSTACK_PROJECT-devstack" airavata-devstack-traefik 2>/dev/null || true
}