Newer
Older
EnvoyControlPlane / data / config / lds.yaml
resources:
- "@type": type.googleapis.com/envoy.config.listener.v3.Listener
  name: http_listener
  address:
    socket_address: { address: 0.0.0.0, port_value: 10000 }
  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
        codec_type: AUTO
        route_config:
          name: ingress_generic_insecure
          virtual_hosts:
          - name: http_to_https
            domains: ["*"]
            routes:
            - match: { prefix : "/.well-known/acme-challenge"}
              route: { cluster: _acme_renewer }
            - match: { prefix: "/" }
              redirect: { https_redirect: true }
          - name: video_insecure                                                
            domains: ["video.jerxie.com" , "video.local:10000"]                 
            routes: 
            - match: { prefix : "/.well-known/acme-challenge"}
              route: { cluster: _acme_renewer }                                                            
            - match: { prefix : "/"}                                            
              route: { cluster: _nas_video }
        http_filters:
        - name: envoy.filters.http.router
          typed_config:
            "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
- "@type": type.googleapis.com/envoy.config.listener.v3.Listener
  name: https_listener
  address:
    socket_address: { address: 0.0.0.0, port_value: 10001 }
  listener_filters:
  - name: "envoy.filters.listener.tls_inspector"
    typed_config: 
      "@type": type.googleapis.com/envoy.extensions.filters.listener.tls_inspector.v3.TlsInspector
  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
        normalize_path: true
        merge_slashes: true
        upgrade_configs:
        - upgrade_type: websocket
        codec_type: AUTO
        stream_idle_timeout: 300s
        request_timeout: 300s
        route_config:
          virtual_hosts:
          - name: home_service
            domains: ["home.jerxie.com"]
            routes:
            - match: { prefix: "/" }
              route: { cluster: "_homeassistant_service"}
            # - match: { path: "/printer"}
            #   redirect: { path_redirect: "/printer/" }
            # - match: { prefix: "/printer/webcam" }
            #   route: { prefix_rewrite: "/", cluster: _3d_printer_camera, idle_timeout: 0s }
            # - match: { prefix: "/printer/" }
            #   route: {  prefix_rewrite: "/", cluster: _3d_printer_console }
        http_filters:
        - name: envoy.filters.http.lua
          typed_config:
            "@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
            inline_code: |
              require "/etc/envoy/filter"
        - name: envoy.filters.http.router
          typed_config:                  
            "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
    filter_chain_match:
      server_names: ["home.jerxie.com"]
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
        common_tls_context:
          tls_certificates:
          # - certificate_chain: { filename: "/etc/certs/home_domain/certificate.crt" }
          #   private_key: { filename: "/etc/certs/home_domain/private.key" }
          - certificate_chain: { filename: "/etc/certs/downstream/home.jerxie.com/fullchain.pem" }
            private_key: { filename: "/etc/certs/downstream/home.jerxie.com/privkey.pem" }
          # validation_context:
          #   trusted_ca:
          #     filename: /etc/certs/ca_bundle.crt
  - 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
        codec_type: AUTO
        route_config:
          virtual_hosts:
          - name: docker_service
            domains: ["docker.jerxie.com"]
            routes:
            - match: { prefix: "/" }
              route: { cluster: "_docker_registry", timeout: 0s}
        http_filters:
        - name: envoy.filters.http.router
          typed_config:                  
            "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
    filter_chain_match:
      server_names: ["docker.jerxie.com", "docker.local"]
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
        common_tls_context:
          tls_certificates:
          - certificate_chain: { filename: "/etc/certs/downstream/docker.jerxie.com/fullchain.pem" }
            private_key: { filename: "/etc/certs/downstream/docker.jerxie.com/privkey.pem" }
  - 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
        codec_type: AUTO
        upgrade_configs:
        - upgrade_type: websocket
        route_config:
          virtual_hosts:
          - name: docker_service
            domains: ["nas.jerxie.com", "nas:10001"]
            routes:
            - match: { prefix: "/" }
              route: { cluster: "_nas_service", timeout: 0s}
        http_filters:
        - name: envoy.filters.http.router
          typed_config:                  
            "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
    filter_chain_match:
      server_names: ["nas.jerxie.com", "nas"]
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
        common_tls_context:
          tls_certificates:
          - certificate_chain: { filename: "/etc/certs/downstream/nas.jerxie.com/fullchain.pem" }
            private_key: { filename: "/etc/certs/downstream/nas.jerxie.com/privkey.pem" }
  - 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
        codec_type: AUTO
        route_config:
          virtual_hosts:
          - name: docker_service
            domains: ["video.jerxie.com"]
            routes:
            - match: { prefix: "/" }
              route: { cluster: "_nas_video", timeout: 0s}
        http_filters:
        - name: envoy.filters.http.router
          typed_config:                  
            "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
    filter_chain_match:
      server_names: ["video.jerxie.com"]
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
        common_tls_context:
          tls_certificates:
          - certificate_chain: { filename: "/etc/certs/downstream/video.jerxie.com/fullchain.pem" }
            private_key: { filename: "/etc/certs/downstream/video.jerxie.com/privkey.pem" }
  - 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
        codec_type: AUTO
        route_config:
          virtual_hosts:
          - name: plex_server
            domains: ["plex.jerxie.com"]
            routes:
            - match: { prefix: "/" }
              route: { cluster: "_plex_server", timeout: 0s}
        http_filters:
        - name: envoy.filters.http.router
          typed_config:                  
            "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
    filter_chain_match:
      server_names: ["plex.jerxie.com"]
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
        common_tls_context:
          tls_certificates:
          - certificate_chain: { filename: "/etc/certs/downstream/plex.jerxie.com/fullchain.pem" }
            private_key: { filename: "/etc/certs/downstream/plex.jerxie.com/privkey.pem" }
  - 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
        codec_type: AUTO
        normalize_path: true
        merge_slashes: true
        route_config:
          virtual_hosts:
          - name: kubernetes_service
            domains: ["kubernetes.jerxie.com"]
            routes:
            - match: { path: "/apiserver"}
              route: { prefix_rewrite: "/" , cluster: _k8s_apiserver }
            - match: { prefix: "/apiserver/" }
              route: { prefix_rewrite: "/" , cluster: _k8s_apiserver }
            - match: { prefix: "/" }
              route: { cluster: "_k8s_router"}
        http_filters:
        - name: envoy.filters.http.router
          typed_config:                  
            "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
    filter_chain_match:
      server_names: ["kubernetes.jerxie.com", "kubernetes.local"]
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
        common_tls_context:
          tls_certificates:
          - certificate_chain: { filename: "/etc/certs/downstream/kubernetes.jerxie.com/fullchain.pem" }
            private_key: { filename: "/etc/certs/downstream/kubernetes.jerxie.com/privkey.pem" }
  - 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
        codec_type: AUTO
        normalize_path: true
        merge_slashes: true
        route_config:
          virtual_hosts:
          - name: kubernetes_dashboard_service
            domains: ["kubernetes.dashboard.jerxie.com"]
            routes:
            - match: { prefix: "/" }
              route: { cluster: "_k8s_router"}
        http_filters:
        - name: envoy.filters.http.oauth2
          typed_config:
            "@type": type.googleapis.com/envoy.extensions.filters.http.oauth2.v3.OAuth2
            config:
              token_endpoint:
                cluster: _auth_server
                uri: auth.jerxie.com/token
                timeout: 3s
              authorization_endpoint: https://auth.jerxie.com/auth
              redirect_uri: "%REQ(x-forwarded-proto)%://%REQ(:authority)%/callback"
              redirect_path_matcher:
                path:
                  exact: /callback
              signout_path:
                path:
                  exact: /signout
              forward_bearer_token: true
              credentials:
                client_id: kubernetes-dashboard
                token_secret:
                  name: token
                  sds_config:
                    path: "/etc/envoy/token-secret.yaml"
                hmac_secret:
                  name: hmac
                  sds_config:
                    path: "/etc/envoy/hmac-secret.yaml"
              # (Optional): defaults to 'user' scope if not provided
              auth_scopes:
              - openid
              - email
              # (Optional): set resource parameter for Authorization request
        - name: envoy.filters.http.router
          typed_config:                  
            "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
    filter_chain_match:
      server_names: ["kubernetes.dashboard.jerxie.com", "kubernetes.dashboard.local"]
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
        common_tls_context:
          tls_certificates:
          - certificate_chain: { filename: "/etc/certs/downstream/kubernetes.dashboard.jerxie.com/fullchain.pem" }
            private_key: { filename: "/etc/certs/downstream/kubernetes.dashboard.jerxie.com/privkey.pem" }
  - 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
        codec_type: AUTO
        route_config:
          virtual_hosts:
          - name: kubernetes_blog_service
            domains: ["blog.jerxie.com"]
            routes:
            - match: { prefix: "/" }
              route: { cluster: "_k8s_router"}
        http_filters:
        - name: envoy.filters.http.router
          typed_config:                  
            "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
    filter_chain_match:
      server_names: ["blog.jerxie.com"]
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
        common_tls_context:
          tls_certificates:
          - certificate_chain: { filename: "/etc/certs/downstream/blog.jerxie.com/fullchain.pem" }
            private_key: { filename: "/etc/certs/downstream/blog.jerxie.com/privkey.pem" }
  - 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
        codec_type: AUTO
        route_config:
          virtual_hosts:
          - name: kubernetes_blog_service
            domains: ["argocd.jerxie.com"]
            routes:
            - match: { prefix: "/" }
              route: { cluster: "_k8s_router"}
        http_filters:
        - name: envoy.filters.http.router
          typed_config:                  
            "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
    filter_chain_match:
      server_names: ["argocd.jerxie.com"]
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
        common_tls_context:
          tls_certificates:
          - certificate_chain: { filename: "/etc/certs/downstream/argocd.jerxie.com/fullchain.pem" }
            private_key: { filename: "/etc/certs/downstream/argocd.jerxie.com/privkey.pem" }
  - 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
        codec_type: AUTO
        upgrade_configs:
        - upgrade_type: websocket
        stream_idle_timeout: 0s
        normalize_path: true
        merge_slashes: true
        route_config:
          virtual_hosts:
          - name: meet_service
            domains: ["meet.jerxie.com"]
            routes:
            - match: { prefix: "/" }
              route: { cluster: "_k8s_router"}
        http_filters:
        - name: envoy.filters.http.router
          typed_config:                  
            "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
    filter_chain_match:
      server_names: ["meet.jerxie.com"]
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
        common_tls_context:
          tls_certificates:
          - certificate_chain: { filename: "/etc/certs/downstream/meet.jerxie.com/fullchain.pem" }
            private_key: { filename: "/etc/certs/downstream/meet.jerxie.com/privkey.pem" }
  - 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
        codec_type: AUTO
        route_config:
          virtual_hosts:
          - name: docker_service
            domains: ["audio.jerxie.com", "audio.local"]
            routes:
            - match: { prefix: "/" }
              route: { cluster: "_nas_audio"}
        http_filters:
        - name: envoy.filters.http.router
          typed_config:                  
            "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
    filter_chain_match:
      server_names: ["audio.jerxie.com", "audio.local"]
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
        common_tls_context:
          tls_certificates:
          - certificate_chain: { filename: "/etc/certs/downstream/audio.jerxie.com/fullchain.pem" }
            private_key: { filename: "/etc/certs/downstream/audio.jerxie.com/privkey.pem" }
  - 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
        codec_type: AUTO
        upgrade_configs:
        - upgrade_type: websocket
        route_config:
          virtual_hosts:
          - name: code_service
            domains: ["code.jerxie.com"]
            routes:
            - match: { prefix: "/" }
              route: { cluster: "_code_server"}
        http_filters:
        - name: envoy.filters.http.oauth2
          typed_config:
            "@type": type.googleapis.com/envoy.extensions.filters.http.oauth2.v3.OAuth2
            config:
              token_endpoint:
                cluster: _auth_server
                uri: auth.jerxie.com/token
                timeout: 3s
              authorization_endpoint: https://auth.jerxie.com/auth
              redirect_uri: "%REQ(x-forwarded-proto)%://%REQ(:authority)%/callback"
              forward_bearer_token: true
              redirect_path_matcher:
                path:
                  exact: /callback
              signout_path:
                path:
                  exact: /signout
              credentials:
                client_id: code-server
                token_secret:
                  name: token
                  sds_config:
                    path: "/etc/envoy/token-secret.yaml"
                hmac_secret:
                  name: hmac
                  sds_config:
                    path: "/etc/envoy/hmac-secret.yaml"
              # (Optional): defaults to 'user' scope if not provided
              auth_scopes:
              - openid
              - email
              # (Optional): set resource parameter for Authorization request
        - name: envoy.filters.http.jwt_authn
          typed_config:
            "@type": type.googleapis.com/envoy.extensions.filters.http.jwt_authn.v3.JwtAuthentication
            providers:
              provider1:
                remote_jwks:
                  http_uri:
                    uri: "https://auth.jerxie.com/keys"
                    cluster: _auth_server
                    timeout: 5s
                  cache_duration: 600s
                from_headers:
                - name: Authorization
                  value_prefix: "Bearer "
                from_cookies:
                - BearerToken
                payload_in_metadata: jwt_payload
            rules:
              - match:
                  prefix: /
                requires:
                  provider_name: provider1
        - name: envoy.filters.http.lua
          typed_config:
            "@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
            inline_code: |
              email = ""
              function envoy_on_request(request_handle)
                email = ""
                local meta = request_handle:streamInfo():dynamicMetadata()
                for key, value in pairs(meta:get("envoy.filters.http.jwt_authn")) do
                  if key == "jwt_payload" then
                    for k, v in pairs(value) do
                      if k == "email" then
                        request_handle:logInfo("login codeserver: " ..v)
                        email = v
                      end
                    end
                  end
                end
              end

              function envoy_on_response(response_handle)
                if email ~="" and email ~= "axieyangb@gmail.com" then
                  response_handle:logInfo("Got unauthorized user, return 403 for user " ..email)
                  response_handle:headers():add("set-cookie", "BearerToken=deleted; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT")
                  response_handle:headers():add("set-cookie", "OauthHMAC=deleted; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT")
                  response_handle:headers():add("set-cookie", "IdToken=deleted; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT")
                  response_handle:headers():add("set-cookie", "OauthExpires=deleted; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT")
                end
                email = ""
              end
        - name: envoy.filters.http.router
          typed_config:                  
            "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
    filter_chain_match:
      server_names: ["code.jerxie.com"]
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
        common_tls_context:
          tls_certificates:
          - certificate_chain: { filename: "/etc/certs/downstream/code.jerxie.com/fullchain.pem" }
            private_key: { filename: "/etc/certs/downstream/code.jerxie.com/privkey.pem" }
  - 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
        codec_type: AUTO
        route_config:
          virtual_hosts:
          - name: photo_service
            domains: ["photo.jerxie.com"]
            routes:
            - match: { prefix: "/" }
              route: { cluster: "_nas_photo", timeout: 0s}
        http_filters:
        - name: envoy.filters.http.router
          typed_config:                  
            "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
    filter_chain_match:
      server_names: ["photo.jerxie.com"]
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
        common_tls_context:
          tls_certificates:
          - certificate_chain: { filename: "/etc/certs/downstream/photo.jerxie.com/fullchain.pem" }
            private_key: { filename: "/etc/certs/downstream/photo.jerxie.com/privkey.pem" }
  - 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
        codec_type: AUTO
        route_config:
          virtual_hosts:
          - name: password_service
            domains: ["password.jerxie.com"]
            routes:
            - match: { prefix: "/" }
              route: { cluster: "_bitwarden_service"}
        http_filters:
        - name: envoy.filters.http.router
          typed_config:                  
            "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
    filter_chain_match:
      server_names: ["password.jerxie.com"]
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
        common_tls_context:
          tls_certificates:
          - certificate_chain: { filename: "/etc/certs/downstream/password.jerxie.com/fullchain.pem" }
            private_key: { filename: "/etc/certs/downstream/password.jerxie.com/privkey.pem" }
  - 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
        codec_type: AUTO
        route_config:
          virtual_hosts:
          - name: gitbucket_service
            domains: ["gitbucket.jerxie.com"]
            routes:
            - match: { prefix: "/" }
              route: { cluster: "_git_bucket"}
        http_filters:
        - name: envoy.filters.http.router
          typed_config:                  
            "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
    filter_chain_match:
      server_names: ["gitbucket.jerxie.com"]
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
        common_tls_context:
          tls_certificates:
          - certificate_chain: { filename: "/etc/certs/downstream/gitbucket.jerxie.com/fullchain.pem" }
            private_key: { filename: "/etc/certs/downstream/gitbucket.jerxie.com/privkey.pem" }
  - 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
        codec_type: AUTO
        upgrade_configs:
        - upgrade_type: websocket
        stream_idle_timeout: 0s
        normalize_path: true
        merge_slashes: true
        route_config:
          virtual_hosts:
          - name: printer_service
            domains: ["printer.jerxie.com"]
            routes:
            - match: { prefix: "/webcam" }
              route: { prefix_rewrite: "/", cluster: "_3d_printer_camera", max_stream_duration: {grpc_timeout_header_max: 0s} }
            - match: { prefix: "/" }
              route: { cluster: "_3d_printer_console"}
        http_filters:
        - name: envoy.filters.http.oauth2
          typed_config:
            "@type": type.googleapis.com/envoy.extensions.filters.http.oauth2.v3.OAuth2
            config:
              token_endpoint:
                cluster: _auth_server
                uri: auth.jerxie.com/token
                timeout: 3s
              authorization_endpoint: https://auth.jerxie.com/auth
              redirect_uri: "%REQ(x-forwarded-proto)%://%REQ(:authority)%/callback"
              redirect_path_matcher:
                path:
                  exact: /callback
              signout_path:
                path:
                  exact: /signout
              forward_bearer_token: true
              credentials:
                client_id: octoprint-portal
                token_secret:
                  name: token
                  sds_config:
                    path: "/etc/envoy/token-secret.yaml"
                hmac_secret:
                  name: hmac
                  sds_config:
                    path: "/etc/envoy/hmac-secret.yaml"
              # (Optional): defaults to 'user' scope if not provided
              auth_scopes:
              - openid
              - email
              # (Optional): set resource parameter for Authorization request
        - name: envoy.filters.http.jwt_authn
          typed_config:
            "@type": type.googleapis.com/envoy.extensions.filters.http.jwt_authn.v3.JwtAuthentication
            providers:
              provider1:
                remote_jwks:
                  http_uri:
                    uri: "https://auth.jerxie.com/keys"
                    cluster: _auth_server
                    timeout: 5s
                  cache_duration: 600s
                from_headers:
                - name: Authorization
                  value_prefix: "Bearer "
                # from_cookies:
                # - BearerToken
                payload_in_metadata: jwt_payload
            rules:
              - match:
                  prefix: /
                requires:
                  provider_name: provider1
        - name: envoy.filters.http.lua
          typed_config:
            "@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
            inline_code: |
              email = ""
              function envoy_on_request(request_handle)
                email = ""
                local meta = request_handle:streamInfo():dynamicMetadata()
                for key, value in pairs(meta:get("envoy.filters.http.jwt_authn")) do
                  if key == "jwt_payload" then
                    for k, v in pairs(value) do
                      if k == "email" then
                        print("login octoprint: "..v)
                        email = v
                        request_handle:headers():add("ENVOY_AUTHENTICATED_USER", v)
                      end
                    end
                  end
                end
              end

              function envoy_on_response(response_handle)
                if email ~="" and email ~= "axieyangb@gmail.com" then
                  response_handle:logInfo("Got unauthorized user, return 403 for user " ..email)
                  response_handle:headers():add("set-cookie", "BearerToken=deleted; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT")
                  response_handle:headers():add("set-cookie", "OauthHMAC=deleted; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT")
                  response_handle:headers():add("set-cookie", "IdToken=deleted; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT")
                  response_handle:headers():add("set-cookie", "OauthExpires=deleted; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT")
                end
                email = ""
              end
        - name: envoy.filters.http.router
          typed_config:                  
            "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
    filter_chain_match:
      server_names: ["printer.jerxie.com", "printer.local"]
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
        common_tls_context:
          tls_certificates:
          - certificate_chain: { filename: "/etc/certs/downstream/printer.jerxie.com/fullchain.pem" }
            private_key: { filename: "/etc/certs/downstream/printer.jerxie.com/privkey.pem" }
  - 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
        codec_type: AUTO
        upgrade_configs:
        - upgrade_type: websocket
        route_config:
          virtual_hosts:
          - name: camera_service
            domains: ["camera.jerxie.com"]
            routes:
            - match: { prefix: "/" }
              route: { cluster: "_nas_camera"}
        http_filters:
        - name: envoy.filters.http.router
          typed_config:                  
            "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
    filter_chain_match:
      server_names: ["camera.jerxie.com"]
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
        common_tls_context:
          tls_certificates:
          - certificate_chain: { filename: "/etc/certs/downstream/camera.jerxie.com/fullchain.pem" }
            private_key: { filename: "/etc/certs/downstream/camera.jerxie.com/privkey.pem" }
  - 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
        codec_type: AUTO
        route_config:
          virtual_hosts:
          - name: note_service
            domains: ["note.jerxie.com"]
            routes:
            - match: { prefix: "/" }
              route: { cluster: "_nas_note"}
        http_filters:
        - name: envoy.filters.http.router
          typed_config:                  
            "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
    filter_chain_match:
      server_names: ["note.jerxie.com"]
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
        common_tls_context:
          tls_certificates:
          - certificate_chain: { filename: "/etc/certs/downstream/note.jerxie.com/fullchain.pem" }
            private_key: { filename: "/etc/certs/downstream/note.jerxie.com/privkey.pem" }
  # - 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
  #       codec_type: AUTO
  #       route_config:
  #         virtual_hosts:
  #         - name: baby_service
  #           domains: ["baby.jerxie.com"]
  #           routes:
  #           - match: { prefix: "/" }
  #             route: { cluster: "_baby_buddy"}
  #       http_filters:
  #       - name: envoy.filters.http.router
  #         typed_config:                  
  #           "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
  #   filter_chain_match:
  #     server_names: ["baby.jerxie.com"]
  #   transport_socket:
  #     name: envoy.transport_sockets.tls
  #     typed_config:
  #       "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
  #       common_tls_context:
  #         tls_certificates:
  #         - certificate_chain: { filename: "/etc/certs/downstream/baby.jerxie.com/fullchain.pem" }
  #           private_key: { filename: "/etc/certs/downstream/baby.jerxie.com/privkey.pem" }
  - 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
        upgrade_configs:
        - upgrade_type: websocket
        codec_type: AUTO
        route_config:
          virtual_hosts:
          - name: container_service
            domains: ["container.jerxie.com"]
            routes:
            - match: { prefix: "/" }
              route: { cluster: "_portainer_ui"}
        http_filters:
        - name: envoy.filters.http.router
          typed_config:                  
            "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
    filter_chain_match:
      server_names: ["container.jerxie.com"]
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
        common_tls_context:
          tls_certificates:
          - certificate_chain: { filename: "/etc/certs/downstream/container.jerxie.com/fullchain.pem" }
            private_key: { filename: "/etc/certs/downstream/container.jerxie.com/privkey.pem" }
  - 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
        upgrade_configs:
        - upgrade_type: websocket
        codec_type: AUTO
        route_config:
          virtual_hosts:
          - name: grafana_service
            domains: ["grafana.jerxie.com"]
            routes:
            - match: { prefix: "/" }
              route: { cluster: "_grafana_ui"}
        http_filters:
        - name: envoy.filters.http.router
          typed_config:                  
            "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
    filter_chain_match:
      server_names: ["grafana.jerxie.com"]
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
        common_tls_context:
          tls_certificates:
          - certificate_chain: { filename: "/etc/certs/downstream/grafana.jerxie.com/fullchain.pem" }
            private_key: { filename: "/etc/certs/downstream/grafana.jerxie.com/privkey.pem" }
  - 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
        upgrade_configs:
        - upgrade_type: websocket
        codec_type: AUTO
        route_config:
          virtual_hosts:
          - name: auth_service
            domains: ["auth.jerxie.com"]
            routes:
            - match: { prefix: "/" }
              route: { cluster: "_auth_server"}
        http_filters:
        - name: envoy.filters.http.router
          typed_config:
            "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
    filter_chain_match:
      server_names: ["auth.jerxie.com"]
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
        common_tls_context:
          tls_certificates:
          - certificate_chain: { filename: "/etc/certs/downstream/auth.jerxie.com/fullchain.pem" }
            private_key: { filename: "/etc/certs/downstream/auth.jerxie.com/privkey.pem" }
  - 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
        upgrade_configs:
        - upgrade_type: websocket
        codec_type: AUTO
        route_config:
          virtual_hosts:
          - name: ai_service
            domains: ["ai.jerxie.com"]
            routes:
            - match: { prefix: "/api" }
              route: { cluster: "_ai_api_server", timeout: 0s}
            - match: { prefix: "/" }
              route: { cluster: "_ai_ui_server", timeout: 0s}
        http_filters:
        - name: envoy.filters.http.router
          typed_config:
            "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
    filter_chain_match:
      server_names: ["ai.jerxie.com"]
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
        common_tls_context:
          tls_certificates:
          - certificate_chain: { filename: "/etc/certs/downstream/ai.jerxie.com/fullchain.pem" }
            private_key: { filename: "/etc/certs/downstream/ai.jerxie.com/privkey.pem" }
  - 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
        upgrade_configs:
        - upgrade_type: websocket
        codec_type: AUTO
        route_config:
          virtual_hosts:
          - name: pcb_service
            domains: ["pcb.jerxie.com"]
            routes:
            - match: { prefix: "/" }
              route: { cluster: "_pcb_server", timeout: 0s}
        http_filters:
        - name: envoy.filters.http.router
          typed_config:
            "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
    filter_chain_match:
      server_names: ["pcb.jerxie.com"]
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
        common_tls_context:
          tls_certificates:
          - certificate_chain: { filename: "/etc/certs/downstream/pcb.jerxie.com/fullchain.pem" }
            private_key: { filename: "/etc/certs/downstream/pcb.jerxie.com/privkey.pem" }
  - 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
        upgrade_configs:
        - upgrade_type: websocket
        codec_type: AUTO
        route_config:
          virtual_hosts:
          - name: monitor_service
            domains: ["monitor.jerxie.com"]
            routes:
            - match: { prefix: "/" }
              route: { cluster: "_monitor_server", timeout: 0s}
        http_filters:
        - name: envoy.filters.http.router
          typed_config:
            "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
    filter_chain_match:
      server_names: ["monitor.jerxie.com"]
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
        common_tls_context:
          tls_certificates:
          - certificate_chain: { filename: "/etc/certs/downstream/monitor.jerxie.com/fullchain.pem" }
            private_key: { filename: "/etc/certs/downstream/monitor.jerxie.com/privkey.pem" }