From b2e13e8985c8d2adc2a8caac7ab1ca1a6896ac36 Mon Sep 17 00:00:00 2001 From: Pierre-Olivier Mercier Date: Fri, 27 Oct 2023 16:55:30 +0200 Subject: [PATCH] New article on woodpecker --- .../index.md | 219 +++++++++++++++++ .../og.webp | Bin 0 -> 224692 bytes .../index.md | 221 ++++++++++++++++++ 3 files changed, 440 insertions(+) create mode 100644 content/en/post/woodpecker-ci-mixing-http-grpc-on-one-domain-nginx/index.md create mode 100644 content/en/post/woodpecker-ci-mixing-http-grpc-on-one-domain-nginx/og.webp create mode 100644 content/fr/post/woodpecker-ci-mixing-http-grpc-on-one-domain-nginx/index.md diff --git a/content/en/post/woodpecker-ci-mixing-http-grpc-on-one-domain-nginx/index.md b/content/en/post/woodpecker-ci-mixing-http-grpc-on-one-domain-nginx/index.md new file mode 100644 index 0000000..0801e78 --- /dev/null +++ b/content/en/post/woodpecker-ci-mixing-http-grpc-on-one-domain-nginx/index.md @@ -0,0 +1,219 @@ +--- +title: "Unify HTTP requests and GRPC calls on a single domain for more flexible configuration: example with Woodpecker" +date: !!timestamp '2023-10-27 09:35:00' +image: /post/woodpecker-ci-mixing-http-grpc-on-one-domain-nginx/og.webp +tags: +- network +- hosting +- continuous integration +--- + +I installed the continuous integration service [Woodpecker](https://woodpecker-ci.org/), to replace [DroneCI](https://drone.io), which [the company that bought it decided to bury](https://github.com/harness/gitness#where-is-drone). +As Woodpecker is a fork of the latest free version of Drone, its use is broadly similar. + +However, the teams have taken different directions on certain aspects, and communication with agents/*runners*, which used to be via websockets, is now carried out in Woodpecker using the GRPC protocol. + +The solution proposed by the [Woodpecker documentation](https://woodpecker-ci.org/docs/administration/proxy#caddy) is to use 2 domains: one will be used for the web interface and the REST API, the second will be used for GRPC. +Is this really necessary? + + + +## `nginx` configuration using 2 domains + +Woodpecker exposes the web interface and GRPC on two different ports: 8000 and 9000 respectively. + +The simplest approach to exposing these two services on the Internet is to use two separate domains. +Here's what our reverse-proxy configuration might look like: + +``` +server { + listen 80; + server_name woodpecker.example.com; + + location / { + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $http_host; + + proxy_pass http://127.0.0.1:8000; + proxy_redirect off; + proxy_http_version 1.1; + proxy_buffering off; + + chunked_transfer_encoding off; + } +} + +server { + listen 80 http2; + server_name woodpeckeragent.example.com; + + location / { + grpc_pass grpc://127.0.0.1:9000; + } +} +``` + +Here we're using `nginx`'s [GRPC module](https://nginx.org/en/docs/http/ngx_http_grpc_module.html), and in particular the [`grpc_pass`](https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_pass) directive. +This directive is similar to the [`proxy_pass`](https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass) directive: it will forward to port 9000 on the local machine all GRPC packets arriving on the `woodpeckeragent.example.com`. + +On the other hand, I prefer to avoid declaring 2 domains, obtaining 2 certificates, etc. for 1 and the same service, with a domain that you tend to forget and neglect. +So let's see if we can't do better. + + +## The GRPC protocol + +Without going into too much detail, GRPC is a [protocol close to HTTP/2](https://grpc.io/docs/what-is-grpc/faq/#why-is-grpc-betterworse-than-rest). +As such, many reverse-proxies are capable of transmitting GRPC requests. +This is the case of [Caddy](https://woodpecker-ci.org/docs/administration/proxy#caddy), a brief example of which is given, [Traefik](https://woodpecker-ci.org/docs/administration/proxy#traefik). +But `nginx` also [supports the transmission of GRPC requests](https://www.nginx.com/blog/nginx-1-13-10-grpc/). + +When a GRPC request is received by the reverse-proxy, it sees an HTTP/2 request similar to : + +``` +POST /pkg.Service/Function HTTP/2.0 +Host: grpc.example.com +User-Agent: grpc-go/1.21.0 +[...] +``` + +At first glance, there's nothing confusing for a web server. +There must be something clever we can do to use these similarities to our advantage. + + +## Combine HTTP requests and GRPC calls on the same domain + +The path for GPRC requests is fixed, and depends on the protobuf file describing calls and structures. +Each *Service* is declared within a package (*pkg*), then *Functions* complete the path. +All calls are `POSTs`. + +So we need to extract the various HTTP routes used by each protobuf service. +Let's take a look at the following file for Wookpecker : + + + +```proto +[...] +package proto; +[...] +service Woodpecker { + rpc Version (Empty) returns (VersionResponse) {} + rpc Next (NextRequest) returns (NextResponse) {} + rpc Init (InitRequest) returns (Empty) {} + rpc Wait (WaitRequest) returns (Empty) {} + rpc Done (DoneRequest) returns (Empty) {} + rpc Extend (ExtendRequest) returns (Empty) {} + rpc Update (UpdateRequest) returns (Empty) {} + rpc Log (LogRequest) returns (Empty) {} + rpc RegisterAgent (RegisterAgentRequest) returns (RegisterAgentResponse) {} + rpc ReportHealth (ReportHealthRequest) returns (Empty) {} +} +[...] +service WoodpeckerAuth { + rpc Auth (AuthRequest) returns (AuthResponse) {} +} +[...] +``` + +From this descriptive file, we have now determined all the routes that can be used by all clients using this version of the service. + +The `proto` package contains 2 services: `Woodpecker` and `WoodpeckerAuth`. +This gives us 2 root routes: + +- `/proto.Woodpecker/` +- `/proto.WoodpeckerAuth/` + +Behind each, we find the functions described by each `rpc` line. +For example: + +- `/proto.Woodpecker/Version` +- `/proto.Woodpecker/Done` +- `/proto.Woodpecker/Log` +- `/proto.WoodpeckerAuth/Auth` +- ... + + +## `nginx` configuration + +So here's what our `nginx` configuration might look like, using a single : + +``` +server { + listen 80; + http2 on; + server_name woodpecker.example.com; + + location / { + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $http_host; + + proxy_pass http://127.0.0.1:8000; + proxy_redirect off; + proxy_http_version 1.1; + proxy_buffering off; + + chunked_transfer_encoding off; + } + + location /proto.Woodpecker/ { + grpc_pass grpc://127.0.0.1:9000; + } + + location /proto.WoodpeckerAuth/ { + grpc_pass grpc://127.0.0.1:9000; + } +} +``` + +Note that, of course, this only works if HTTP/2 is enabled by means of [the `http2` directive](https://nginx.org/en/docs/http/ngx_http_v2_module.html#http2). + +There's no need to specify functions individually, as `nginx` will perform the routing using only the package and service name. + + +## Timeout on the `Next` function + +Woodpecker declares an `Next` function that waits for information about the next job to be performed. +This waiting time is generally quite variable, and can be quite long if your IC is not constantly in use. + +`nginx` will take the initiative, by default, to stop any request that has been inactive for more than 60 seconds. +This causes a large number of reconnections for the Woodpecker agent, visible in the agent logs: + + {"level":"error","error":"rpc error: code = Unavailable desc = unexpected HTTP status code received from server: 504 (Gateway Timeout); transport: received unexpected content-type \"text/html\"","time":"2023-10-27T11:28:51Z","message":"grpc error: wait(): code: Unavailable: rpc error: code = Unavailable desc = unexpected HTTP status code received from server: 504 (Gateway Timeout); transport: received unexpected content-type \"text/html\""} + +The agent will reconnect itself, but we can reduce the occurrence of this reconnection (whose main benefit is to do nothing until the server wakes us up), by adding this line to our configuration `nginx` : + +``` + location /proto.Woodpecker/Next { + grpc_pass grpc://127.0.0.1:9008; + grpc_read_timeout 3600s; + } +``` + +These few lines tell `nginx` not to disconnect inactive connections before 1 hour of inactivity, only for the `Next` function of the protocol. + + +## Filter IPs that can access the GRPC service + +In addition to the [`grpc_pass`](https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_pass) directive, you can of course use all the other directives you're used to. + +For example, we might want to filter the IPs that have access to GRPC. +We could do this with [the `allow` and `deny` directives](https://nginx.org/en/docs/http/ngx_http_access_module.html): + +``` + location /proto.Woodpecker/ { + allow 192.168.0.0/24; + deny all; + + grpc_pass grpc://127.0.0.1:9000; + } +``` + +Since only agents use the GRPC protocol, it would be perfectly legitimate to implement such a rule. + +--- + +Unifying HTTP requests and GRPC calls under a single domain offers many advantages. +Not only does this approach simplify reverse-proxy configuration, it also enables more centralized, streamlined management of the service. + +By the way, GRPC and protobuf are an excellent solution for transmitting structured data over the network, so don't hesitate to [take a look](https://protobuf.dev/overview/). diff --git a/content/en/post/woodpecker-ci-mixing-http-grpc-on-one-domain-nginx/og.webp b/content/en/post/woodpecker-ci-mixing-http-grpc-on-one-domain-nginx/og.webp new file mode 100644 index 0000000000000000000000000000000000000000..32c28e49f11038d48838cc20dfb903ae8b325b92 GIT binary patch literal 224692 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