open-feature-flagd 0.2.0

The official flagd provider for OpenFeature.
Documentation
version: '3.8'

services:
  flagd:
    image: ${IMAGE:-ghcr.io/open-feature/flagd-testbed}:${VERSION:-v2.14.0} # x-release-please-version
    ports:
      - 8013
      - 8014
      - 8015
      - 8016
      - 8080
    volumes:
      - ${FLAGS_DIR:-./}:/flags
    networks:
      - flagd-network
    healthcheck:
      test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:8014/healthz"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 30s

  envoy:
    image: envoyproxy/envoy:v1.35-latest
    ports:
      - 9211
      - 9212
      - 9901
    command:
      - /bin/sh
      - -c
      - |
        echo "Creating envoy config..."

        cat > /tmp/envoy.yaml << 'EOF'
        admin:
          address:
            socket_address:
              address: 0.0.0.0
              port_value: 9901
        
        static_resources:
          listeners:
            - name: local-envoy
              address:
                socket_address:
                  address: 0.0.0.0
                  port_value: 9211
              filter_chains:
                - filters:
                    - name: envoy.filters.network.http_connection_manager
                      typed_config:
                        "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
                        stat_prefix: ingress_http
                        access_log:
                          - name: envoy.access_loggers.stdout
                            typed_config:
                              "@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog
                        http_filters:
                          - name: envoy.filters.http.router
                            typed_config:
                              "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
                        route_config:
                          name: local_route
                          virtual_hosts:
                            # Route for sync service
                            - name: sync-service
                              domains:
                                - "flagd-sync.service"
                                - "sync.flagd.local"
                                - "sync.service"
                              routes:
                                - match:
                                    prefix: "/"
                                    grpc: {}
                                  route:
                                    cluster: local-sync-service
                            # Route for RPC service
                            - name: rpc-service
                              domains:
                                - "flagd-rpc.service"
                                - "rpc.flagd.local"
                                - "rpc.service"
                              routes:
                                - match:
                                    prefix: "/"
                                    grpc: {}
                                  route:
                                    cluster: local-rpc-service
                            # Default catch-all
                            - name: default-service
                              domains:
                                - "*"
                              routes:
                                - match:
                                    prefix: "/"
                                    grpc: {}
                                  route:
                                    cluster: local-rpc-service
            - name: permission-denied-listener
              address:
                socket_address:
                  address: 0.0.0.0
                  port_value: 9212
              filter_chains:
                - filters:
                    - name: envoy.filters.network.http_connection_manager
                      typed_config:
                        "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
                        stat_prefix: permission_denied
                        access_log:
                          - name: envoy.access_loggers.stdout
                            typed_config:
                              "@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog
                        http_filters:
                          - name: envoy.filters.http.router
                            typed_config:
                              "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
                        route_config:
                          name: permission_denied_route
                          virtual_hosts:
                            - name: permission-denied
                              domains:
                                - "*"
                              routes:
                                - match:
                                    prefix: "/"
                                    grpc: {}
                                  direct_response:
                                    status: 403
                                    body:
                                      inline_string: "PERMISSION_DENIED"
          clusters:
            - name: local-sync-service
              type: LOGICAL_DNS
              dns_lookup_family: V4_ONLY
              http2_protocol_options: {}
              load_assignment:
                cluster_name: local-sync-service
                endpoints:
                  - lb_endpoints:
                      - endpoint:
                          address:
                            socket_address:
                              address: flagd
                              port_value: 8015

            - name: local-rpc-service
              type: LOGICAL_DNS
              dns_lookup_family: V4_ONLY
              http2_protocol_options: {}
              load_assignment:
                cluster_name: local-rpc-service
                endpoints:
                  - lb_endpoints:
                      - endpoint:
                          address:
                            socket_address:
                              address: flagd
                              port_value: 8013
        EOF

        echo "Generated config:"
        cat /tmp/envoy.yaml

        echo "Starting envoy..."
        exec envoy -c /tmp/envoy.yaml --log-level debug
    depends_on:
      flagd:
        condition: service_healthy
    networks:
      - flagd-network

networks:
  flagd-network:
    driver: bridge