From 2b80e6603f41e8154826df1713d6924253c65ca2 Mon Sep 17 00:00:00 2001 From: Gerhard Lazu Date: Mon, 2 Sep 2024 09:28:45 +0000 Subject: [PATCH] Post Namespace.so migration clean-up (#523) - [x] De-provision the Dagger Engine on Fly.io - [x] Remove the deploy config from fly.io dir - [x] Update the INFRASTRUCTURE diagram - [x] Cleanup secrets & variables from GitHub Actions While at it, bump Actions versions to latest. Also, split build, test & publish from the deploy steps so that it's easier to see in Honeycomb.io how much each step takes. Signed-off-by: Gerhard Lazu --- .github/workflows/dagger_on_github.yml | 25 ++++++++-- .github/workflows/dagger_on_k8s.yml | 4 +- .github/workflows/dagger_on_namespace.yml | 22 ++++++++- INFRASTRUCTURE.md | 33 ++++++------- fly.io/dagger-engine-2023-05-20/README.md | 58 ----------------------- fly.io/dagger-engine-2023-05-20/fly.toml | 28 ----------- 6 files changed, 60 insertions(+), 110 deletions(-) delete mode 100644 fly.io/dagger-engine-2023-05-20/README.md delete mode 100644 fly.io/dagger-engine-2023-05-20/fly.toml diff --git a/.github/workflows/dagger_on_github.yml b/.github/workflows/dagger_on_github.yml index 46f4f533d9..35348ec6cc 100644 --- a/.github/workflows/dagger_on_github.yml +++ b/.github/workflows/dagger_on_github.yml @@ -8,14 +8,14 @@ jobs: runs-on: ubuntu-latest steps: - name: "Checkout code..." - uses: actions/checkout@v3 + uses: actions/checkout@v4 - - uses: actions/setup-go@v4 + - uses: actions/setup-go@v5 with: go-version: "1.20" cache-dependency-path: "magefiles/go.sum" - - name: "Build, test, publish & deploy..." + - name: "Build, test & publish..." env: IMAGE_OWNER: "${{ vars.IMAGE_OWNER }}" GHCR_USERNAME: "${{ github.actor }}" @@ -29,7 +29,24 @@ jobs: OBAN_LICENSE_KEY: "${{ secrets.OBAN_LICENSE_KEY }}" run: | cd magefiles - go run main.go -w ../ ci cd + go run main.go -w ../ ci + + - name: "Deploy..." + if: ${{ github.repository == 'thechangelog/changelog.com' && github.ref_name == 'master' }} + env: + IMAGE_OWNER: "${{ vars.IMAGE_OWNER }}" + GHCR_USERNAME: "${{ github.actor }}" + GHCR_PASSWORD: "${{ secrets.GHCR_PASSWORD }}" + FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }} + R2_API_HOST: "${{ secrets.R2_API_HOST }}" + R2_ACCESS_KEY_ID: "${{ secrets.R2_ACCESS_KEY_ID }}" + R2_SECRET_ACCESS_KEY: "${{ secrets.R2_SECRET_ACCESS_KEY }}" + R2_ASSETS_BUCKET: "${{ env.R2_ASSETS_BUCKET }}" + OBAN_KEY_FINGERPRINT: "${{ secrets.OBAN_KEY_FINGERPRINT }}" + OBAN_LICENSE_KEY: "${{ secrets.OBAN_LICENSE_KEY }}" + run: | + cd magefiles + go run main.go -w ../ cd - name: "Announce deploy in #dev Slack..." if: ${{ github.repository == 'thechangelog/changelog.com' && github.ref_name == 'master' }} diff --git a/.github/workflows/dagger_on_k8s.yml b/.github/workflows/dagger_on_k8s.yml index f7498615cb..5e71d2346e 100644 --- a/.github/workflows/dagger_on_k8s.yml +++ b/.github/workflows/dagger_on_k8s.yml @@ -9,9 +9,9 @@ jobs: continue-on-error: true steps: - name: "Checkout code..." - uses: actions/checkout@v3 + uses: actions/checkout@v4 - - uses: actions/setup-go@v4 + - uses: actions/setup-go@v5 with: go-version: "1.20" cache-dependency-path: "magefiles/go.sum" diff --git a/.github/workflows/dagger_on_namespace.yml b/.github/workflows/dagger_on_namespace.yml index 6ad59f8703..3466e9cb87 100644 --- a/.github/workflows/dagger_on_namespace.yml +++ b/.github/workflows/dagger_on_namespace.yml @@ -24,7 +24,7 @@ jobs: --privileged \ registry.dagger.io/engine:v0.6.4 - - name: "Build, test, publish & deploy..." + - name: "Build, test & publish..." env: IMAGE_OWNER: "${{ vars.IMAGE_OWNER }}" GHCR_USERNAME: "${{ github.actor }}" @@ -39,7 +39,25 @@ jobs: _EXPERIMENTAL_DAGGER_RUNNER_HOST: "docker-container://dagger-0-6-4" run: | cd magefiles - go run main.go -w ../ ci cd + go run main.go -w ../ ci + + - name: "Deploy..." + if: ${{ github.repository == 'thechangelog/changelog.com' && github.ref_name == 'master' }} + env: + IMAGE_OWNER: "${{ vars.IMAGE_OWNER }}" + GHCR_USERNAME: "${{ github.actor }}" + GHCR_PASSWORD: "${{ secrets.GHCR_PASSWORD }}" + FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }} + R2_API_HOST: "${{ secrets.R2_API_HOST }}" + R2_ACCESS_KEY_ID: "${{ secrets.R2_ACCESS_KEY_ID }}" + R2_SECRET_ACCESS_KEY: "${{ secrets.R2_SECRET_ACCESS_KEY }}" + R2_ASSETS_BUCKET: "${{ env.R2_ASSETS_BUCKET }}" + OBAN_KEY_FINGERPRINT: "${{ secrets.OBAN_KEY_FINGERPRINT }}" + OBAN_LICENSE_KEY: "${{ secrets.OBAN_LICENSE_KEY }}" + _EXPERIMENTAL_DAGGER_RUNNER_HOST: "docker-container://dagger-0-6-4" + run: | + cd magefiles + go run main.go -w ../ cd - name: "Announce deploy in #dev Slack..." if: ${{ github.repository == 'thechangelog/changelog.com' && github.ref_name == 'master' }} diff --git a/INFRASTRUCTURE.md b/INFRASTRUCTURE.md index 91024b33c3..c560728f92 100644 --- a/INFRASTRUCTURE.md +++ b/INFRASTRUCTURE.md @@ -1,4 +1,4 @@ -[![shields.io](https://img.shields.io/badge/Last%20updated%20on-Mar.%2028%2C%202024-success?style=for-the-badge)](https://shipit.show/80) +[![shields.io](https://img.shields.io/badge/Last%20updated%20on-Sep.%202%2C%202024-success?style=for-the-badge)](https://shipit.show/80) This diagram shows the current changelog.com setup: @@ -33,9 +33,8 @@ graph TD repo -.- |fly.io/changelog-2024-01-12| app registry --> |ghcr.io/changelog/changelog-prod| app - dagger06 --> |flyctl deploy| app + runner --> |flyctl deploy| app - repo -.- |fly.io/dagger-engine-2023-05-20| dagger06 repo -.- |fly.io/dagger-engine-2024-03-28| dagger010 repo -.- |fly.io/pghero-2024-03-27| pghero @@ -45,9 +44,6 @@ graph TD proxy{fa:fa-globe Proxy} proxy ==> |https| app - dagger06([ fa:fa-project-diagram Dagger Engine v0.6 2023-05-20 ]):::link - click dagger06 "https://fly.io/apps/dagger-engine-2023-05-20" - dagger010([ fa:fa-project-diagram Dagger Engine v0.10 2024-03-28 ]):::link click dagger010 "https://fly.io/apps/dagger-engine-2024-03-28" @@ -58,14 +54,9 @@ graph TD pghero([ fa:fa-gem PgHero 2024-03-27 ]):::link click pghero "https://fly.io/apps/pghero-2024-03-27" - automation --> |wireguard| dagger06 - dagger06 --> |ghcr.io/changelog/changelog-runtime| registry - dagger06 --> |ghcr.io/changelog/changelog-prod| registry - grafana[ fa:fa-columns Grafana fly-metrics.net ]:::link click grafana "https://fly-metrics.net" grafana -.- |metrics| app - grafana -.- |metrics| dagger06 grafana -.- |metrics| dagger010 grafana -.- |metrics| pghero end @@ -81,6 +72,16 @@ graph TD dbrw -.-> |replicate| dbro1 end + subgraph Namespace.so + runner([ fa:fa-person-running GitHub Runner ]):::link + click runner "https://cloud.namespace.so/9s8hfvousnlae/ghrunners" + + automation --> |runs-on: namespace-profile-changelog| runner + runner --> |ghcr.io/changelog/changelog-runtime| registry + runner --> |ghcr.io/changelog/changelog-prod| registry + + end + %% Secrets secrets(( fa:fa-key 1Password )):::link click secrets "https://changelog.1password.com/" @@ -140,7 +141,7 @@ graph TD ``` > [!TIP] -> [Continue live editing this Mermaid diagram](https://mermaid.live/edit#pako:eNqdWHlv2zYU_yqEihYtEEk-4iPuuqFrurQo2gVzuwGLi4KSaImLRGok1cSN8933SOqgHDtNlz8cmXr38XuPvvFinhBv4T1-jDKlSrkIwzVnCl8RyQsSxLwIJcEizlYsFbjM0MfTFUPwF-dYylOyRjlll0gqwS_J4tHkJBrNZ0f2q39FE5UtxuX1c8tjP0HVK1CKniCQQJS0p7KKrIIzqt5UkT3Uf4KU_OYGrXG0WGM_pSqrIqQyEmeYpSTnadg-aXPR7e1isdBGdSLinMaXRhBaeY2bVpLx8LC0lbdijhwaJxchmKItiamIc-LHwHtZG41exopyhny0zGiJ3iq0Wn0-YI2W9aPWhNjIl-EVF5frnF_JUIKiL1QFmyLXtjY6uidcKV5gzXaxWrVR5DmIRac4TYlAZxwtT9-h8JCpnYgfNjjKeRQWWCoi4F9K1jQnsnsKUt6PsCApheLZPH26k_A0i0VAOXr27GB2Led-E7lIZd_OEseXYIbcyXCGVadb5kCElubzoGLN4ijt_DfcNm3QP_QrOP5qMF6-nP_5erTrNVSmH_g_o21gjd6f4a2pmn49Il-z7Y_t1kndvtro-GUVx0RK9CghX7fGJUtFWOK2bmMo2q7zDaSj89YfDUbH_mDoD0egtSz7XHVqjKo6k-GekvFLwROHPTH1OZhaRlAZqxwlpMz5xqG6xzwrwCcspYxoE8f-YAL_t63ohzKCb2N_NG8Zh4MmgXd4yzQjgndMsy2yRw0HAOA5xkuAiRZyG60yizgWSReSHXD8zRB2fkPArjc3FpBS6DWCzvXJ7Q4FevECAmi01YHrCJpIPL2ogQ04_iGx8hOKQWnRoMRrEwv0dRBMURdJ9PlQX7TJ63qjdhMMkAdT0--MNtoPt244QF2-vmseUD_Qvlqii7I7SFuWHXSUGSeMXvtrsJHoZkYvyxLta5dAa4W224cwUm1yogUjaOl88eh4Pj-Znjy_A9BAsN-LfQr7Ebal2YY3JQU6T9_AURfF2eEoWu4Dyu80Ql-zM1ZMf19RAIoKqn-3O-9CwX0YIiqmaEG2Lez8HyEWiDoJnQwoujVmuIlXzPOqYBKd2WME_vsFUYLGMmBEoUMztRbTj5zL6dZZQ2xQpqbZAcD9JHfjeC-dBrX7CRsga2eDfdQF-NMLAzLnXKpUEC00Elf2dV0lOur2cAfVPhDOAkX0ktmmCujaokywwhGWBBWYMhQJzOIMgI0WGIbK4Q4HEe5ghsWJ5wRiWyvTRRrWcCJhQ9C59yWvWOLPp9PB8cl8GlpdMFYj4V9hlhBBWerLQm-3s_nxdD6cnOwgViT48H7LYWKAgRgs7_tbrwD1a0W2VtidaMP8WJJYdKuz_WLARyu9JBs0PIflGnAn2YUVG5uaZe_eMixrVrO7NHXYcFgb629OER54r6djz257l7Ac-rm1GhYXRtcbHd9U3y3Qx01JJGEQvGfPujLzg1qBZt6i5nLSanh9HZPSbMl13NrvraYYCz8WMGvBHKb3kr0h6hidKEnDoFEDNkrM6DdsF_IOOQoCkymkUlZQNb_U5fViMp0Cco-aYDqOdGq2jkrHoVenH5xNoYCeTEmwhpUakFYnCOp6TdNKEDBOfKWwxoWz9F0Uv1u-Ozvd_Ptp9rY6Fcdjcra7ShgR7vgi1xeof5c6eCMA2r21U1-Z7g7HVu1LWHEqwfpDNE7Yhf4IdtR3VO0i6vRBJ_OvZbAcd8TALy-aSYyvpDN39atGbivTuPNEG2CrVxNtjRQnD79HOr44ojlVddi4e9SWV1Sl6A1nZAMuRPtrq8foBLKiQdZw9keTBhJ9We6OvvASipHkRIPzJszgut4vL-2JEjjWWMzvGm8i4fq7h8ZxXpcx7CMAkylxouYulmbV3EnNq5xXyTrHggR_jJxiMzf_NkdxS-WkytI4FVnChYq4RbEmJPmOEENiCYMDktoygPz3F2VrwBPL7pTCe84oRAKgasfbX4mCm-5SwcXPXeKwqmQzEXK8gbUyFbwq6zfBw3rOErtYtIe7P4uK1s62OGEc5cRXhDEq0adSb0qHr7Ydv1ujhimIjKtSNXdcRXARDsfj8WAU1nzShQJHFiCfxb6Gbmtq6QBtnxBy9CA6pxa_Q2nD6JSCd-QVRMDATryFd6NfrDyVEd1eC3hMsLjUjt0CnV5hlxsWewslKnLkVSX0KTm1VxMP4p1LOC0x8xY33rW38GfjaTCdDQYn8-PRZDYZzo-8jbc4GQbD48lsPJoN4Hgyntweed84BwnDYDaejE-OB7CbDWYDIIfxAna_t7_amR_vjIK_DblRePsfsqFhlQ) +> [Continue live editing this Mermaid diagram](https://mermaid.live/edit#pako:eNqVWHlv2zYU_yqEihUtEEk-4nPrhqzp0qHYFsw7gMXDQEnPkhaJ1EgqiRfnu-9R1EE5VrvmD0em3v1-76AfnZBH4KydL74giVKFXPv-jjNF70HyHLyQ574EKsJky2JBi4T8crllBP_CjEp5CTuSpeyWSCX4LaxfzFbBZLk4M1_d-zRSyXpaPHxpeMwnqnqLSslLghJASXMqy8AouErV-zIwh_pPQMEfH8mOBusddeNUJWVAVAJhQlkMGY_99kmbS56e1uu1NqoTEWZpeFsJIluncdNIqjwclrZ1tsySk4bRjY-maEvCVIQZuCHy3tZGk4tQpZwRl2yStCDfK7Ld_jlgjZb1udb4tJIv_XsubncZv5e-REV_pcrb55m2tdHRPdFS8Zxqtpvtto0iz1AsuaRxDIJccbK5_ED8IVM7EZ9tcJDxwM-pVCDwXwy7NAPZPXkx70dYQJwiePavXh0lPE5C4aWcvH49mF3DedpELmLZt7Og4S2aIY8ynFDV6ZYZEpFN9TmoWLNYSjv_K26TNqyf9A4dfzuabi6Wv72bHHuNyHQ992ty8IzRpzN8qFDTxyNxNdvp2B6s1J3CRscvyzAEKcmLCO4OlUuGClhkl25jKDnssj2mo_PWnYwm5-5o7I4nqLUo-lx1aipVdSb9E5BxC8Eji12UjCE-KzZUGKqMRFBkfG_RfMS4qIK3CyxOGdQGTt3J8kDMm9F41GThGW8RJyB4x7Q4EHPUcGAXu6Z0g7Xe9s1Gq0wCTkXU-XXU4b6rCDvz0euH_aPpKjEWDJBrffJ0REHevME4VNpq_zuC1qFXN3V7Qpa_IVRulFLUmje1_q4KBrkbeeMR6UJC_hyCdyvZwnjtKdogB4Nsd6OjjlQUXYkVCQeWPrg7tBE06MlFUZBTsPK0VoTnqUqUap-BFkwQ-tn6xflyuZqvvnzWyJDgtBenFPZr1GS_DW8MObmO3-NRF8XFcBQN94DyZ1jra8b07SijjeaQZ2XOJLkyxwQluTkokYbSY6DIUBevxfRtsDntjDXEVUnUNEdFd5rEqqyPEzbV1HYZ86hT9NWbCunXXKpYgBYaiHvzuo6j7gjm8Ki0fgTOPAV6XWlLA-natEVU0YBKIDlNGQkEZWGC1ZXmFNvTcA2gCLvF4wjmGWDMamU6jX5dcBJnjcaSK3nJInc5n4_OV8u5b3Rhgw6Ee09ZBCJlsStzvSctlufz5Xi26ucdtfLxxy3HtoUGUrS87289TOrXCg5G2LNod3HD6pM4EsGTVmMy_bdrKSAkZ64-Rdubnedn06QHg1c3cSt8GS8jj1ka_ZVcJrs7XkqWUfDjxPAczWZrDakmAhJJl7M1aUXppqdnn9uW86FWf-zTp0cR0qk0x8g10-vzRZhp1vE_Cz_OkA2EotuBzZeqO-qA38KejK9xS8bGGB33PRPdmuXkAjIuatZqCWnKu-EwEKm_WbU98F5PyJ7d5lJgOPRzazVuICzd7TW8Y31JIL_sC5DAELuvX3dV7nq1As18IM0to9Xw7iGEolp367i131tNIRVuKHDeojlMLxgnQ9QxWlGSFYPOHK6GlKX_UrNZd9nLAUenn0pZYtF-U1f3m9l8jqNl0gTTcqRTc7BUWg69vfzR2hZybIkxeDvcjXEU6ARhW9mlcSkAjRN3Ke5j_iL-EIQfNh-uLvf__Lr4vrwU51O4Ol4nKhH2fIWHG9K_FA2u9kh7Ejv13ef59G7VXuCaUwrWn_JhxG70h3ekvqNqN8pTbeji9423mXbEyC9vmlWB3ktrMdCvGrmtzMqdl9oAg15NdKikWHn4KdDxpUGapaoOG7ePWngFZUzecwZ7dCE4ja0eoxXIMvWShrPfHnQf17fe7ugvXiAYIQM9G_d-gvfuPry0J0pgf0Nf-HPjq0jY_p6gsZzXMMaFCadUDFbU7OWyWjePUvNWd-1dRgV4P08ssFVX-DZHYUtlpcrQWIgs8GYENih2ANEnhFQkhtAbkNTCAPPfX5aNAS8NuwWFHzhLMRLYqo68_RYUXlk3Cm9w9pZJVSmbaZjRPe69seBlUb_x_l_NGWK7F53g7o--vLWzBSduAzjoFOAsluTXQs-q4Ttqx29jtGLygspVqZrLqgKa--PpdDqa-DWftFuBJQs7n-l9Dd2hwtIAbZ8Qc_S_6CwsfoLShNGCgnPm5CBwX4qctfOoX2wdlYAurzU-RlTcaseekE7vFps9C521EiWcOWWBdQqX5u7UHBaU_cG5_dVZPzoPzhqvO1NvMV3NF7PVbDWZLednzt5ZLxfebLRcjueL0Wq2XM0mT2fOv5WAsTeejyYrPJ6frxbj1eT8zMFxg378YH6Oq36Ve_oPk-hbCQ) Let's dig into how all the above pieces fit together. @@ -209,9 +210,9 @@ workflow jobs perspective, it is fairly standard: - **1/2. CI/CD** - Uses Dagger Go SDK so that it works exactly the same locally as it does in GitHub Actions - - [Starts a Dagger Engine as a Fly.io machine on-demand, then connects to - it](https://github.com/thechangelog/changelog.com/pull/471) so that caching - is reliable & persistent across workflow runs + - [Uses a Namespace.so GitHub + Runner](https://github.com/thechangelog/changelog.com/pull/522) so that + caching is reliable & persistent across workflow runs - A successful run publishes a container image to https://ghcr.io/thechangelog/changelog-runtime & https://ghcr.io/thechangelog/changelog-prod @@ -294,4 +295,4 @@ you very much! ## How to branch the production db instance? -See [`changelog/README.md`](changelog/README.md). +See [Enable changelog.com devs to create prod db forks with a single command](https://github.com/thechangelog/changelog.com/pull/508). diff --git a/fly.io/dagger-engine-2023-05-20/README.md b/fly.io/dagger-engine-2023-05-20/README.md deleted file mode 100644 index a6f17b239c..0000000000 --- a/fly.io/dagger-engine-2023-05-20/README.md +++ /dev/null @@ -1,58 +0,0 @@ -# Dagger Engine on Fly.io - -## Deploy - -Follow these steps to deploy two Dagger Engines on Fly.io, the primary in `ewr -Secaucus, NJ (US)` & the secondary in `ord Chicago, Illinois (US)`: - -1. Create the `fly.toml` -2. `flyctl apps create dagger-engine-2023-05-20 --org changelog` -3. `flyctl volumes create dagger_engine_2023_05_20 --size 100 --region ewr` 👈 primary region -4. `flyctl deploy --vm-size performance-4x --region ewr` -5. `flyctl machine clone --region ord ` 👈 secondary region - -## Connect - -Now connect to this Dagger Engine running on Fly.io: - -1. Create a Wireguard peer: `flyctl wireguard create changelog iad gerhard-2023-05-20` -2. Save it to e.g. `~/Desktop/fly.io-changelog-iad-gerhard-2023-05-20.conf` -3. **Import Tunnel(s) from File...** it in WireGuard - [install](https://www.wireguard.com/install/) if needed -4. Activate new Tunnel -5. Connect to this Dagger Engine via: -```console -export _EXPERIMENTAL_DAGGER_RUNNER_HOST=tcp://dagger-engine-2023-05-20.internal:8080 -`````` - -## Delete - -`flyctl machine stop --select` stops the machine. 💡 There is a `restart` command. - -`flyctl machine destroy --select` deletes the machine. 💡 As long as the volume -is not deleted, `flyctl deploy` will restore the machine with the same state. - -Delete the volume: `flyctl volume list` && `flyctl volume destroy `. -💡 Even if all data gets wiped, it just means that subsequent builds will be -**slower**. After the first run, the build cache will get populated & -everything will continue being just as fast as when we had data on this volume. - -## Benchmark on `2023.07.02` - -TL;DR `performance-4x` instance sizes continues being the sweet spot for us. - -We ran the command below multiple times - COLD (no cache) & HOT (cache) - to -see the performance gain from using more CPUs / memory. 💡 Once images get -pulled, ops cached & volumes filled with data, there is no measurable advantage -for our pipeline go beyond `performance-4x`. - -| INSTANCE SIZE | COLD | HOT | -| --- | --- | --- | -| `performance-16x` | `4m 54s` - `1.63x` | `1m 42s` - `1.00x` | -| `performance-8x` | `4m 52s` - `1.65x` | `1m 35s` - `1.07x` | -| 👉 `performance-4x` | `4m 59s` - `1.61x` | `1m 35s` - `1.07x` | -| `performance-2x` | `8m 02s` - `1.00x` | `1m 42s` - `1.00x` | - -```console -export _EXPERIMENTAL_DAGGER_RUNNER_HOST=tcp://dagger-engine-2023-05-20.internal:8080 -dagger run mage ci -``` diff --git a/fly.io/dagger-engine-2023-05-20/fly.toml b/fly.io/dagger-engine-2023-05-20/fly.toml deleted file mode 100644 index 4156fab660..0000000000 --- a/fly.io/dagger-engine-2023-05-20/fly.toml +++ /dev/null @@ -1,28 +0,0 @@ -# https://fly.io/docs/reference/configuration/ - -app = "dagger-engine-2023-05-20" -primary_region = "iad" - -kill_signal = "SIGINT" -kill_timeout = 30 - -[build] - image = "registry.dagger.io/engine:v0.6.4" - -[env] - _EXPERIMENTAL_DAGGER_SERVICES_DNS = "true" - -[mounts] - source = "dagger_engine_2023_05_20" - destination = "/var/lib/dagger" - -[processes] - dagger = "--addr tcp://0.0.0.0:8080" - -[checks] - [checks.grpc] - grace_period = "3s" - interval = "2s" - port = 8080 - timeout = "1s" - type = "tcp"