{"id":15287495,"url":"https://github.com/natk64/pancake-proxy","last_synced_at":"2026-05-02T15:35:17.127Z","repository":{"id":246278094,"uuid":"820545885","full_name":"natk64/pancake-proxy","owner":"natk64","description":"Smart gRPC reverse proxy written in Go","archived":false,"fork":false,"pushed_at":"2026-03-19T11:41:48.000Z","size":98,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-20T04:47:09.837Z","etag":null,"topics":["golang","grpc","grpc-web"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/natk64.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-06-26T17:27:02.000Z","updated_at":"2026-03-19T11:42:59.000Z","dependencies_parsed_at":"2024-06-27T01:05:41.797Z","dependency_job_id":"81be82b0-0e5a-4998-95f5-4d77e173f05e","html_url":"https://github.com/natk64/pancake-proxy","commit_stats":null,"previous_names":["nicokleinschmidt/pancake-proxy","natk64/pancake-proxy"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/natk64/pancake-proxy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/natk64%2Fpancake-proxy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/natk64%2Fpancake-proxy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/natk64%2Fpancake-proxy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/natk64%2Fpancake-proxy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/natk64","download_url":"https://codeload.github.com/natk64/pancake-proxy/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/natk64%2Fpancake-proxy/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32540114,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-02T12:25:33.646Z","status":"ssl_error","status_checked_at":"2026-05-02T12:24:51.733Z","response_time":132,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["golang","grpc","grpc-web"],"created_at":"2024-09-30T15:29:34.685Z","updated_at":"2026-05-02T15:35:17.099Z","avatar_url":"https://github.com/natk64.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Pancake\n\nPancake is a smart gRPC reverse proxy or API gateway, allowing many microservices to be exposed as a single server.\n\n[Docker Hub](https://hub.docker.com/r/natk64/pancake)\n\n## How it works\n\nPancake automatically discovers gRPC services on different upstream servers using the standard reflection service.\nWhen a gRPC request arrives at Pancake, it automatically forwards that request to an upstream server that implements the requested service.\nIf multiple servers implement the same service, load balancing is performed as well.\n\nThis functionality makes configuration extremely easy and allows Pancake to basically work \"out of the box\".\nA minimal configuration could look something like this:\n\n```yaml\nservers:\n    # Simply list all servers in your cluster\n    # Pancake will figure out how to route requests by itself\n    - address: localhost:5000\n    - address: localhost:5001\n```\n\n## Configuration\n\nConfiguration can be done through a config file or environment variables. The config file can located at either /etc/pancake/config.yaml or ./config.yaml.\n\nThe documentation will use the yaml names, which can be converted to environment variables like so:\n\n```yaml\nbind_address: localhost:5000\ndocker:\n    enabled: true\n    label: pancake\n```\n\nEquivalent environment variables:\n\n```sh\nPANCAKE_BIND_ADDRESS=localhost:5000\nPANCAKE_DOCKER_ENABLED=true\nPANCAKE_DOCKER_LABEL=pancake\n```\n\nOption                  | Type                                        | Default                       | Description\n------------------------|---------------------------------------------|-------------------------------|-----------------------------------------------------------------------------------------------------\nbind_address            | string                                      | :8080                         | gRPC and gRPC Web entrypoint listener\nservice_update_interval | duration (5m10s, 3h, etc.)                  | 30s                           | Interval to update static servers\ndisable_reflection      | bool                                        | false                         | Disables the reflection service\ncors.enabled            | bool                                        | false                         | Enable/Disable CORS\ncors.allowed_origins    | []string                                    | []                            | Allowed origins for CORS requests\ncors.allowed_headers    | []string                                    | [*]                           | Allowed headers for CORS requests\ntls.enabled             | bool                                        | true                          | Enable/Disable TLS for incoming gRPC requests.\ntls.cert_file           | string                                      | ./server.crt                  | TLS cert file location, only if TLS is enabled\ntls.key_file            | string                                      | ./server.key                  | -\npprof.enabled           | bool                                        | false                         | Enable/Disable pprof HTTP server\npprof.bind_address      | string                                      | localhost:6060                | -\ndashboard.enabled       | bool                                        | false                         | Enable/Disable the HTML dashboard\ndashboard.bind_address  | string                                      | localhost:8081                | -\nlogger.development      | bool                                        | false                         | Enable debug logs\ndocker.enabled          | bool                                        | false                         | Enable/Disable the docker provider, more information on this in the [Docker section](#docker) below.\ndocker.expose           | 'all', 'manual', 'same_project', 'projects' | manual                        | Decision strategy on which services to expose.\ndocker.label            | string                                      | pancake                       | Override the label prefix used for docker label defined options.\ndocker.host             | string                                      | unix:///var/run/docker.sock   | The host of the docker socket.\ndocker.exposed_projects | []string                                    | []                            | The list of projects to expose when docker.expose = 'projects'\ndocker.network          | string                                      | See [Docker section](#docker) | Which network to use for internal communication with the upstream containers.\n\n## Static server configuration\n\nA static list of servers can be defined in the config.yaml file.\n\n```yaml\nservers:\n    - address: localhost:5001 # Required, the address of the server\n      plaintext: false # Disable TLS, default false (i.e use TLS)\n      insecure: false # Disable server certificate verification, default false, no effect if plaintext: true\n\n# Other options\nbind_address: :5000\n# ...\n```\n\n## Docker\n\nThis section only applies if your services are running in Docker, Pancake itself doesn't need to run in Docker.\nPancake only needs access to the Docker socket.\n\nInstead of defining a fixed list of servers in the config.yaml, servers can be automatically discovered through Docker.\nYou can control service discovery through the docker.* options above and through labels on your server containers.\n\nPancake needs to share a Docker network with your containers to communicate with them (Or use the 'host' network).\nThe network that pancake will use is determined in the following order:\n\n1. The value of the pancake.network label\n2. The default network specified in the docker.network option\n3. The loopback address if the container's network mode is 'host'\n\nIf no network can be found, the container will be ignored and an error printed.\n\n### Labels\n\nThe label prefix 'pancake.' can be changed with docker.label, to allow multiple Pancake instances per Docker installation.\n\nExample docker-compose.yaml\n\n```yaml\nservices:\n    my-service:\n        image: my-image\n        networks:\n            - my-network\n        labels:\n            - pancake.enable=true\n            - pancake.network=my-network\n            - pancake.port=5000\n```\n\nLabel               | Description\n--------------------|------------------------------------------------------------------------------------------------------------------------------------------------\npancake.enable      | Set to 'false' to ignore a container. If docker.expose == 'manual', this needs to be explicitly set to 'true' for the container to be included.\npancake.plaintext   | Disable TLS for communication with container, default is 'false'\npancake.skip_verify | Disable server certificate verification for communication with container, default is 'false'\npancake.port        | Which port to use for communication (this is the internal port in your container) (If unspecified, Pancake will try to figure it out by itself)\npancake.network     | Which network to use for communication (See above for what is used when this isn't set).\n\n## Reflection and Healthchecks\n\nObviously, load balancing the Reflection and Health services would cause issues, but Pancake will also take care of that.\n\nPancake provides it's own reflection service, which will include all the services on the upstream servers.\nFor example, if you have two servers, one implementing ServiceA, the other ServiceB, calling ListServices on\nPancake will report [\"ServiceA\", \"ServiceB\", ...]\n\nTo clients it would look like they're talking to a single server, implementing both services.\n\n## gRPC-Web support\n\nPancake translates and forwards incoming gRPC-Web requests (Content-Type: grpc-web*) to the upstream servers.\nThis feature is enabled by default and is usable using the default configuration,\nalthough CORS will need to configured to accept requests from browsers.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnatk64%2Fpancake-proxy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnatk64%2Fpancake-proxy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnatk64%2Fpancake-proxy/lists"}