diff --git a/testbed/smoke-test/cheat.html b/testbed/smoke-test/cheat.html
new file mode 100644
index 000000000..74682f912
--- /dev/null
+++ b/testbed/smoke-test/cheat.html
@@ -0,0 +1,110 @@
+
+
+Reload Service
+
+Attribute Resolution
+
+
+
+
+metrics
+
+
diff --git a/testbed/smoke-test/docker-compose.yml b/testbed/smoke-test/docker-compose.yml
new file mode 100644
index 000000000..ec2f2c854
--- /dev/null
+++ b/testbed/smoke-test/docker-compose.yml
@@ -0,0 +1,105 @@
+version: "3.8"
+
+services:
+ reverse-proxy:
+ image: library/traefik:v2.5.2
+ command:
+ - "--api.insecure=true"
+ - "--providers.docker=true"
+ - "--providers.docker.exposedbydefault=false"
+ - "--entrypoints.web-secure.address=:443"
+ - "--providers.file.directory=/configuration/"
+ - "--providers.file.watch=true"
+ # - "--log.level=DEBUG"
+ networks:
+ reverse-proxy:
+ aliases:
+ - idp.unicon.local
+ ports:
+ - "80:80"
+ - "8080:8080"
+ - "443:443"
+ - "8443:8443"
+ volumes:
+ - /var/run/docker.sock:/var/run/docker.sock
+ - ../reverse-proxy/:/configuration/
+ - ../reverse-proxy/certs/:/certs/
+ directory:
+ build: ../directory
+ networks:
+ - idp
+ volumes:
+ - directory_data:/var/lib/ldap
+ - directory_config:/etc/ldap/slapd.d
+ - ../directory/certs:/container/service/slapd/assets/certs
+ environment:
+ LDAP_BASE_DN: "dc=unicon,dc=local"
+ LDAP_DOMAIN: "unicon.local"
+ HOSTNAME: "directory"
+ LDAP_TLS_VERIFY_CLIENT: "try"
+ idp:
+ build: ../integration/shibboleth-idp
+ labels:
+ - "traefik.http.routers.idp.rule=Host(`idp.unicon.local`)"
+ - "traefik.http.services.idp.loadbalancer.server.port=8080"
+ - "traefik.http.routers.idp.tls=true"
+ - "traefik.docker.network=integration_reverse-proxy"
+ - "traefik.enable=true"
+ depends_on:
+ - directory
+ - reverse-proxy
+ networks:
+ - reverse-proxy
+ - idp
+ volumes:
+ - ../directory/certs/ca.crt:/opt/shibboleth-idp/credentials/ldap-server.crt
+ - dynamic_metadata:/opt/shibboleth-idp/metadata/dynamic
+ - dynamic_config:/opt/shibboleth-idp/conf/dynamic
+ - ../integration/shibboleth-idp/metadata/dynamic:/opt/shibboleth-idp/metadata/dynamic
+ - ../authentication/shibboleth-idp/config/shib-idp/conf/attribute-filter.xml:/opt/shibboleth-idp/conf/attribute-filter.xml
+ healthcheck:
+ disable: true
+ shib-idp-ui:
+ image: unicon/shibui:latest
+ labels:
+ - "traefik.http.routers.shibui.rule=Host(`shibui.unicon.local`)"
+ - "traefik.http.services.shibui.loadbalancer.server.port=8080"
+ - "traefik.http.routers.shibui.tls=true"
+ - "traefik.docker.network=integration_reverse-proxy"
+ - "traefik.enable=true"
+ networks:
+ - reverse-proxy
+ - backend
+ volumes:
+ - ../authentication/shibui:/conf
+ - ./shibui/application.yml:/application.yml
+ - dynamic_metadata:/var/shibboleth/dynamic_metadata
+ - dynamic_config:/var/shibboleth/dynamic_config
+ - ../integration/shibboleth-idp/credentials/shib-idp/inc-md-cert-mdq.pem:/opt/shibboleth-idp/credentials/inc-md-cert-mdq.pem
+ environment:
+ - "IDP_HOME=/opt/shibboleth-idp"
+ database:
+ image: postgres:14-alpine
+ environment:
+ POSTGRES_PASSWORD: shibui
+ POSTGRES_USER: shibui
+ POSTGRES_DB: shibui
+ networks:
+ - backend
+ volumes:
+ - database_data:/var/lib/postgresql/data
+networks:
+ reverse-proxy:
+ idp:
+ backend:
+volumes:
+ directory_data:
+ driver: local
+ directory_config:
+ driver: local
+ dynamic_metadata:
+ driver: local
+ dynamic_config:
+ driver: local
+ database_data:
+ driver: local
diff --git a/testbed/smoke-test/shibui/application.yml b/testbed/smoke-test/shibui/application.yml
new file mode 100644
index 000000000..126256f0d
--- /dev/null
+++ b/testbed/smoke-test/shibui/application.yml
@@ -0,0 +1,40 @@
+server:
+ forward-headers-strategy: NATIVE
+spring:
+ profiles:
+ include:
+ datasource:
+ platform: postgres
+ driver-class-name: org.postgresql.Driver
+ url: jdbc:postgresql://database:5432/shibui
+ username: shibui
+ password: shibui
+ jpa:
+ properties:
+ hibernate:
+ dialect: org.hibernate.dialect.PostgreSQLDialect
+shibui:
+ default-password: "{noop}letmein7"
+ metadata-dir: /var/shibboleth/dynamic_metadata
+ metadataProviders:
+ target: file:/var/shibboleth/dynamic_config/metadata-providers.xml
+ user-bootstrap-resource: file:/conf/users.csv
+ roles: ROLE_ADMIN,ROLE_NONE,ROLE_USER,ROLE_ENABLE,ROLE_PONY
+ pac4j-enabled: true
+ pac4j:
+ keystorePath: "/conf/samlKeystore.jks"
+ keystorePassword: "changeit"
+ privateKeyPassword: "changeit"
+ serviceProviderEntityId: "https://unicon.net/test/shibui"
+ serviceProviderMetadataPath: "/conf/sp-metadata.xml"
+ identityProviderMetadataPath: "/conf/idp-metadata.xml"
+ forceServiceProviderMetadataGeneration: true
+ callbackUrl: "https://shibui.unicon.local/callback"
+ maximumAuthenticationLifetime: 3600000
+ simpleProfileMapping:
+ username: urn:oid:0.9.2342.19200300.100.1.1
+ firstName: urn:oid:2.5.4.42
+ lastName: urn:oid:2.5.4.4
+ email: urn:oid:0.9.2342.19200300.100.1.3
+ groups: urn:oid:2.5.4.15 # businessCategory
+ roles: urn:oid:1.3.6.1.4.1.5923.1.1.1.7 # eduPersonEntitlement