{"id":18785785,"url":"https://github.com/scott-the-programmer/meshed","last_synced_at":"2025-10-29T20:32:12.176Z","repository":{"id":174508522,"uuid":"443952627","full_name":"scott-the-programmer/meshed","owner":"scott-the-programmer","description":"Hosts web stuff for the fun of it","archived":false,"fork":false,"pushed_at":"2024-11-17T05:49:24.000Z","size":74,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-12-29T12:42:05.767Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://term.nz","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/scott-the-programmer.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}},"created_at":"2022-01-03T05:38:36.000Z","updated_at":"2024-11-17T05:49:27.000Z","dependencies_parsed_at":"2024-01-12T06:02:47.556Z","dependency_job_id":null,"html_url":"https://github.com/scott-the-programmer/meshed","commit_stats":null,"previous_names":["scott-the-programmer/meshed"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scott-the-programmer%2Fmeshed","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scott-the-programmer%2Fmeshed/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scott-the-programmer%2Fmeshed/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scott-the-programmer%2Fmeshed/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/scott-the-programmer","download_url":"https://codeload.github.com/scott-the-programmer/meshed/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239702140,"owners_count":19683039,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":[],"created_at":"2024-11-07T20:49:39.581Z","updated_at":"2025-10-29T20:32:12.170Z","avatar_url":"https://github.com/scott-the-programmer.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Kubernetes Infrastructure\n\nHello there! This is my personal project for deploying my Kubernetes infrastructure, which includes my ingress controller and various applications, using Pulumi. I've opted to use Scaleway as the Kubernetes provider and Cloudflare for DNS management - these platforms fit my needs best, providing a balance of functionality, affordability, and ease-of-use.\n\nThis project is geared towards my personal use - that includes my blog, my personal projects, and more - but if you're curious and want to try it out yourself or reverse-engineer it, you're more than welcome to! However, please remember that running this project with your own credentials will incur cost. Always ensure you understand the pricing models of any cloud services you're using!\n\nThis project uses NGINX Ingress Controller instead of Istio for better compatibility with ARM architecture.\n\n## Getting Started\n\nFirst things first, you'll want to ensure you've got all the necessary tools installed:\n\n- Pulumi CLI\n- Go\n- Docker\n- kubectl\n- helm\n\nOnce that's all ready, you can use the various commands I've written into the Makefile to build, test, and deploy your infrastructure. Here's a quick rundown:\n\n- `make build` - Tidies up the Go dependencies and installs any that are missing.\n- `make cluster-preview` - Gives you a preview of what changes will be made to the cluster.\n- `make cluster-up` - Brings the cluster online.\n- `make cluster-down` - Takes the cluster offline.\n- `make mesh-preview` - Gives you a preview of what changes will be made to the mesh.\n- `make mesh-up` - Brings the mesh online.\n- `make mesh-down` - Takes the mesh offline.\n- `make apps-preview` - Gives you a preview of what changes will be made to the apps.\n- `make apps-up` - Brings the apps online.\n- `make apps-down` - Takes the apps offline.\n- `make load-config` - Loads the kubeconfig from the cluster stack.\n\n## Configuration\n\nThe project is configured via Pulumi settings. Set these using the `pulumi config set` command:\n\n- `meshed:CLOUDFLARE_BLOG_ZONE_ID`: Zone ID for the blog on Cloudflare.\n- `meshed:CLOUDFLARE_TERM_NZ_ZONE_ID`: Zone ID for the term NZ on Cloudflare.\n- `meshed:CLOUDFLARE_LEGACY_ZONE_ID`: Zone ID for the legacy domain on Cloudflare.\n- `meshed:CLOUDFLARE_EMAIL`: Your Cloudflare email.\n- `meshed:CLOUDFLARE_API_KEY`: Your Cloudflare API key.\n- `meshed:MESHED_BLOG_DNS`: The DNS for the blog.\n- `meshed:MESHED_TERM_NZ_DNS`: The DNS for term NZ.\n- `meshed:MESHED_LEGACY_DNS`: The DNS for the legacy domain.\n- `meshed:MESHED_EMAIL`: Email for domain registration.\n- `meshed:MESHED_ACME_SECRET`: The ACME secret.\n- `meshed:MESHED_STAGING`: A boolean value to indicate if it's staging.\n\nRemember to replace `\u003cvalue\u003e` with the actual values when setting the configuration.\n\n---\n\nDepending on what MESHED_CLOUD is set to, you will need to configure the [linode](https://www.pulumi.com/registry/packages/linode/installation-configuration/) or [scaleway variables](https://www.pulumi.com/registry/packages/scaleway/installation-configuration/)\n\n## Cloudflared Tunnel Helper\n\nThe script `create-cloudflared-tunnel.sh` can create a tunnel for either a subdomain or the root (apex) domain.\n\nExamples:\n\n```\n# Subdomain\n./create-cloudflared-tunnel.sh blog example.com  # creates blog.example.com\n\n# Root / apex (any of these forms):\n./create-cloudflared-tunnel.sh example.com       # creates example.com\n./create-cloudflared-tunnel.sh @ example.com     # creates example.com\n./create-cloudflared-tunnel.sh root example.com  # creates example.com\n./create-cloudflared-tunnel.sh apex example.com  # creates example.com\n```\n\nIt will:\n\n- Create (or reuse) a Cloudflare tunnel named after the subdomain or the sanitized domain for root.\n- Create/update a Kubernetes secret `\u003cname\u003e-cloudflared-file` in the `personal` namespace containing the tunnel credentials.\n- Add a DNS route for the hostname if it does not already exist.\n- Generate a config file at `~/.cloudflared/config-\u003cid\u003e.yml`.\n\nYou can then run the tunnel locally:\n\n```\ncloudflared tunnel --config ~/.cloudflared/config-blog.yml run\n```\n\nOr for the root domain:\n\n```\ncloudflared tunnel --config ~/.cloudflared/config-root.yml run\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscott-the-programmer%2Fmeshed","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fscott-the-programmer%2Fmeshed","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscott-the-programmer%2Fmeshed/lists"}