Compare commits
12 Commits
631807ca33
...
main
Author | SHA1 | Date | |
---|---|---|---|
![]() |
0666b35341 | ||
![]() |
33035950c8 | ||
![]() |
03284765d2 | ||
![]() |
037ca24e05 | ||
![]() |
7d1e206749 | ||
![]() |
45b8278d8d | ||
![]() |
bf9c6af1b7 | ||
![]() |
6ede2e83cf | ||
![]() |
5bd4c2a27d | ||
![]() |
6fd516b2a6 | ||
![]() |
74e78acea1 | ||
![]() |
d34a78214e |
14
README.md
14
README.md
@@ -2,11 +2,17 @@
|
||||
|
||||
## Dev environment
|
||||
|
||||
### One time
|
||||
|
||||
- Install hugo.
|
||||
- Install dart-sass.
|
||||
- `cd themes/blowfish && npm install`
|
||||
|
||||
### Each time
|
||||
|
||||
```bash
|
||||
hugo server -D
|
||||
npm run dev # Loads Tailwind CSS in watch mode
|
||||
hugo server # Starts the Hugo server
|
||||
```
|
||||
|
||||
## Deploy
|
||||
@@ -14,3 +20,9 @@ hugo server -D
|
||||
```bash
|
||||
scripts/deploy.sh
|
||||
```
|
||||
|
||||
## Reference
|
||||
|
||||
- [Colors](https://tailwindcss.com/docs/colors)
|
||||
- [Icons](https://blowfish.page/samples/icons/)
|
||||
|
||||
|
4769
assets/css/compiled/main.css
Normal file
4769
assets/css/compiled/main.css
Normal file
File diff suppressed because it is too large
Load Diff
37
assets/css/schemes/blowfish.css
Normal file
37
assets/css/schemes/blowfish.css
Normal file
@@ -0,0 +1,37 @@
|
||||
/* Blowfish scheme */
|
||||
:root {
|
||||
--color-neutral: 255, 255, 255;
|
||||
/* Gray */
|
||||
--color-neutral-50: 248, 250, 252;
|
||||
--color-neutral-100: 241, 245, 249;
|
||||
--color-neutral-200: 226, 232, 240;
|
||||
--color-neutral-300: 203, 213, 225;
|
||||
--color-neutral-400: 148, 163, 184;
|
||||
--color-neutral-500: 100, 116, 139;
|
||||
--color-neutral-600: 71, 85, 105;
|
||||
--color-neutral-700: 51, 65, 85;
|
||||
--color-neutral-800: 30, 41, 59;
|
||||
--color-neutral-900: 15, 23, 42;
|
||||
/* Blue */
|
||||
--color-primary-50: 239, 246, 255;
|
||||
--color-primary-100: 219, 234, 254;
|
||||
--color-primary-200: 191, 219, 254;
|
||||
--color-primary-300: 147, 197, 253;
|
||||
--color-primary-400: 96, 165, 250;
|
||||
--color-primary-500: 59, 130, 246;
|
||||
--color-primary-600: 37, 99, 235;
|
||||
--color-primary-700: 29, 78, 216;
|
||||
--color-primary-800: 30, 64, 175;
|
||||
--color-primary-900: 30, 58, 138;
|
||||
/* Cyan */
|
||||
--color-secondary-50: 236, 254, 255;
|
||||
--color-secondary-100: 207, 250, 254;
|
||||
--color-secondary-200: 165, 243, 252;
|
||||
--color-secondary-300: 103, 232, 249;
|
||||
--color-secondary-400: 34, 211, 238;
|
||||
--color-secondary-500: 6, 182, 212;
|
||||
--color-secondary-600: 8, 145, 178;
|
||||
--color-secondary-700: 14, 116, 144;
|
||||
--color-secondary-800: 21, 94, 117;
|
||||
--color-secondary-900: 22, 78, 99;
|
||||
}
|
1
assets/icons/cloud-bolt-solid-full.svg
Normal file
1
assets/icons/cloud-bolt-solid-full.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><!--!Font Awesome Free 7.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path d="M64 288C64 341 107 384 160 384L198.6 384L322.7 273C334.9 262.1 350.7 256 367.1 256C411.7 256 443.6 299 430.8 341.7L418.1 384L480 384C533 384 576 341 576 288C576 235 533 192 480 192C479.5 192 478.9 192 478.4 192C479.5 186.8 480 181.5 480 176C480 131.8 444.2 96 400 96C375.7 96 353.9 106.9 339.2 124C320.5 88.3 283.1 64 240 64C178.1 64 128 114.1 128 176C128 183.1 128.7 190.1 129.9 196.8C91.6 209.4 64 245.5 64 288zM224.6 464L286.4 464L255.2 568.1C251.6 580 260.5 592 273 592C277.6 592 282 590.3 285.4 587.3L426.5 460.9C430 457.8 432 453.3 432 448.5C432 439.3 424.6 431.9 415.4 431.9L353.6 431.9L384.8 327.8C388.4 315.9 379.5 303.9 367 303.9C362.4 303.9 358 305.6 354.6 308.6L213.5 435.1C210 438.2 208 442.7 208 447.5C208 456.7 215.4 464.1 224.6 464.1z"/></svg>
|
After Width: | Height: | Size: 981 B |
1
assets/icons/cloud-solid-full.svg
Normal file
1
assets/icons/cloud-solid-full.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><!--!Font Awesome Free 7.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path fill="currentColor" d="M32 400C32 479.5 96.5 544 176 544L480 544C550.7 544 608 486.7 608 416C608 364.4 577.5 319.9 533.5 299.7C540.2 286.6 544 271.7 544 256C544 203 501 160 448 160C430.3 160 413.8 164.8 399.6 173.1C375.5 127.3 327.4 96 272 96C192.5 96 128 160.5 128 240C128 248 128.7 255.9 129.9 263.5C73 282.7 32 336.6 32 400z"/></svg>
|
After Width: | Height: | Size: 555 B |
@@ -81,7 +81,7 @@ forgejoDefaultServer = "https://v8.next.forgejo.org"
|
||||
showTaxonomies = false
|
||||
showAuthorsBadges = false
|
||||
showWordCount = false
|
||||
sharingLinks = [ "linkedin", "twitter", "bluesky", "mastodon", "reddit", "pinterest", "facebook", "email", "whatsapp", "telegram"]
|
||||
# sharingLinks = [ "linkedin", "twitter", "bluesky", "mastodon", "reddit", "pinterest", "facebook", "email", "whatsapp", "telegram"]
|
||||
showZenMode = false
|
||||
|
||||
[list]
|
||||
|
@@ -6,3 +6,5 @@ date = '2025-06-09'
|
||||
Wild Cloud is a project of the [Civil Society Technology Foundation](https://civilsociety.dev).
|
||||
|
||||
The **Civil Society Technology Foundation (CSTF)** is a community-driven organization dedicated to empowering individuals and civil society organizations to reclaim digital sovereignty through open-source tools and self-hosted infrastructure.
|
||||
|
||||
Wild Cloud is community-driven and open-source, with contributions from individuals and organizations around the world. Learn about getting involved at [Contribute](/contribute).
|
@@ -4,4 +4,21 @@ date = '2025-06-09'
|
||||
draft = false
|
||||
+++
|
||||
|
||||
Wild Cloud is a community-driven, open source project. Join us at https://git.civilsociety.dev/CSTF/wild-cloud.
|
||||
Wild Cloud is a community-driven, open source project.
|
||||
|
||||
## Discuss
|
||||
|
||||
The [Civil Society Technology Foundation (CSTF)](https://civilsociety.dev) provides a [forum for Wild Cloud community discussion](https://forum.civilsociety.dev/c/wild-cloud/). All are welcome! It's kinda quiet there right now, but hey, if you post now you'll always be remembered as a founding contributor!
|
||||
|
||||
## Hack
|
||||
|
||||
If you're ready to jump into development, join our project at https://git.civilsociety.dev/CSTF/wild-cloud. In addition to source code, you'll find a list of our current [issues](https://git.civilsociety.dev/CSTF/wild-cloud/issues). We accept community pull requests related to any of these issues.
|
||||
|
||||
## Propose
|
||||
|
||||
You can propose new issues in the forum.
|
||||
|
||||
## Broader engagement
|
||||
|
||||
As a project of the [Civil Society Technology Foundation](https://civilsociety.dev), Wild Cloud is part of a larger movement towards digital self-determination and self-hosted infrastructure. If you'd like to contribute to this broader ecosystem, we encourage you to explore the [CSTF](https://civilsociety.dev), related projects and initiatives.
|
||||
|
||||
|
34
content/get-started/_index.md
Normal file
34
content/get-started/_index.md
Normal file
@@ -0,0 +1,34 @@
|
||||
---
|
||||
title: 🌩️ Get started
|
||||
date: 2025-08-06
|
||||
layout: single
|
||||
series:
|
||||
- Wild Cloud Setup
|
||||
series_order: 1
|
||||
---
|
||||
|
||||
You've decided to see what is involved in this 🌩️ "Wild Cloud" thing. Welcome!
|
||||
|
||||
What follows is a step-by-step setup guide for early adopters. We'll do our best to keep these instructions in sync with the latest Wild Cloud software.
|
||||
|
||||
## 🚧 Under Construction 🚧
|
||||
|
||||
First of all, <span style="background-color: rgba(255, 255, 0, 0.4);">Wild Cloud is in active development</span> as are these pages. We prefer to develop things "in the open" since this is a community project. <u>Feel free to try things out now</u> (we have two pilot clouds running), but <span style="background-color: rgba(255, 255, 0, 0.4);">expect some bumps**</span> until we get everything sorted and remove this notice.
|
||||
|
||||
## Take your time!
|
||||
|
||||
One of our big objective with Wild Cloud is to make Internet technology more accessible to everyone. We want setting up and maintaining your wild cloud to be a fun learning experience, so you'll find that we interject {{< icon "circle-info" "#05df72" >}} definitions, and let you {{< icon "graduation-cap" "#5d0ec0" >}} go deeper with tips or entire articles, but we always bring things {{< icon "sun" "#fff085" >}} back around to your own wild cloud where you can try things out first-hand.
|
||||
|
||||
|
||||
All of the technology we use in Wild Cloud is open source and widely used, so investing time to really learn the concepts in this setup guide will be well spent.
|
||||
|
||||
## The path ahead
|
||||
|
||||
The following pages will guide you through buying your wild cloud hardware, setting up each of the various components, and, in the end, deploying applications and managing your wild cloud.
|
||||
|
||||
|
||||
<div class="text-center pt-4">
|
||||
{{< button href="hardware" target="_self" >}}
|
||||
Let's begin!
|
||||
{{< /button >}}
|
||||
</div>
|
@@ -1,9 +1,14 @@
|
||||
+++
|
||||
title = "Setup Wild Cloud"
|
||||
date = '2025-06-09'
|
||||
draft = false
|
||||
+++
|
||||
---
|
||||
title: Set up your DNS server
|
||||
date: 2025-08-04
|
||||
series:
|
||||
- Wild Cloud Setup
|
||||
series_order: 5
|
||||
---
|
||||
|
||||
{{<go-deeper>}}
|
||||
This section is mandatory and, we admit, not accessible to non-technical audience. We have plans for this before releasing to early-adopters. These instructions are a placeholder suitable for Wild Cloud devs and will be replaced before the Early-Adopter release.
|
||||
{{</go-deeper>}}
|
||||
|
||||
## Get your hardware
|
||||
|
||||
@@ -12,14 +17,19 @@ Make sure you have a dedicated machine for your DNS server. It can be tiny, like
|
||||
## Install your OS
|
||||
|
||||
- Install another Debian-based Linux machine on your LAN (e.g. Debian or Ubuntu).
|
||||
- Make sure you can SSH in from your operator machine.
|
||||
- Record it's IP address.
|
||||
|
||||
## Install the DNS software
|
||||
|
||||
- Run `wild-dnsmasq-install` from your operator machine.
|
||||
- Run `wild-dnsmasq-install` from your Wild Cloud Home on your operator machine.
|
||||
|
||||
## Update your LAN router
|
||||
|
||||
- Log in to your LAN router's web interface.
|
||||
- Find the DHCP settings and reserve the IP address you recorded for your DNS server.
|
||||
- Set the DNS server for your LAN to the IP address of your DNS server.
|
||||
|
||||
## Next Steps
|
||||
|
||||
Now that you have a DNS server set up, let's [set up your wild cloud](../setup-wild-cloud/).
|
||||
|
@@ -1,8 +1,10 @@
|
||||
+++
|
||||
title = "Get a Domain Name"
|
||||
date = '2025-06-09'
|
||||
draft = false
|
||||
+++
|
||||
---
|
||||
title: Get a Domain Name
|
||||
date: 2025-08-02
|
||||
series:
|
||||
- Wild Cloud Setup
|
||||
series_order: 3
|
||||
---
|
||||
|
||||
## Get a Domain Name
|
||||
|
||||
@@ -16,3 +18,8 @@ Instructions...
|
||||
## Set up your LAN router
|
||||
|
||||
- DynamicDNS
|
||||
|
||||
|
||||
## Next Steps
|
||||
|
||||
Now that you have a domain name, let's [set up your operator machine](../operator-setup/).
|
||||
|
@@ -1,8 +1,10 @@
|
||||
+++
|
||||
title = "Hardware"
|
||||
date = '2025-06-09'
|
||||
draft = false
|
||||
+++
|
||||
---
|
||||
title: Hardware
|
||||
date: 2025-08-01
|
||||
series:
|
||||
- Wild Cloud Setup
|
||||
series_order: 2
|
||||
---
|
||||
|
||||
## Get your hardware
|
||||
|
||||
@@ -10,9 +12,9 @@ A basic wild cloud requires 8 computers, a network switch, a battery backup, and
|
||||
|
||||
Six of the computers run Talos Linux and are your "cluster nodes". One computer will run your local network's name server so you can access internal cloud applications. The last computer is just used to manage your cluster. Most of these computers can be small or old machines, and they are all managed by Wild Cloud, so don't think it's too expensive or complicated to get started. A really useful wild cloud can be built for less than the price of a new smart phone.
|
||||
|
||||
{{<alert>}}
|
||||
{{<definition>}}
|
||||
In computing, the word "machine" goes back to Alan Turing’s 1936 concept of the ‘Turing machine,’ and to early electromechanical computers like ENIAC that were literally giant calculating machines. Today, in Kubernetes and cloud systems, like your wild cloud, we still use the word "machine" to mean any physical or virtual computer that runs workloads.
|
||||
{{</alert>}}
|
||||
{{</definition>}}
|
||||
|
||||
## Your "operator" machine
|
||||
|
||||
@@ -70,4 +72,4 @@ USB thumb-drives are useful for booting your wild cloud machines and for transfe
|
||||
|
||||
## Next Steps
|
||||
|
||||
Now that you have your hardware, we can start setting things up! Follow the instructions in the [Setup Wild Cloud](../setup-wild-cloud/) guide to get started.
|
||||
Now that you have your hardware, let's make sure you've [acquired a domain name](../get-a-domain-name/) guide to get started.
|
||||
|
@@ -1,15 +0,0 @@
|
||||
+++
|
||||
title = "Get Started"
|
||||
date = '2025-06-09'
|
||||
draft = false
|
||||
+++
|
||||
|
||||
_The Wild Cloud project is in active development._
|
||||
|
||||
1. [Get your hardware](./hardware/)
|
||||
2. [Reserve a domain name](./get-a-domain-name/)
|
||||
3. [Set up your operator machine](./operator-setup/)
|
||||
4. [Set up your DNS server](./dns-server-setup/)
|
||||
5. [Set up your Wild Cloud](./setup-wild-cloud/)
|
||||
6. [Use your Wild Cloud](./using-wild-cloud/)
|
||||
|
@@ -1,20 +1,26 @@
|
||||
+++
|
||||
title = "Operator Setup"
|
||||
date = '2025-06-09'
|
||||
draft = false
|
||||
+++
|
||||
|
||||
The Wild Cloud software is Open Source and free. All you need to do is download it onto your operator machine, install some other programs we require, and then run the setup script. The setup script walks you through the process of installing your DNS machine, your control nodes, your worker nodes, and then any software you want to run on your cloud.
|
||||
---
|
||||
title: Operator machine
|
||||
date: 2025-08-03
|
||||
series:
|
||||
- Wild Cloud Setup
|
||||
series_order: 4
|
||||
---
|
||||
|
||||
(This page assumes you already have your hardware ready to set up. If you don't, read [Setting Up Your Hardware](../hardware/)).
|
||||
|
||||
## Your operator machine
|
||||
|
||||
## Download the Wild Cloud software onto your operator machine
|
||||
Your operator machine is the computer you manage your wild cloud with. Below, we will install the Wild Cloud software on your operator machine.
|
||||
|
||||
Your operator machine should be a [Linux](/learning/linux/) machine on your LAN. It's helpful if it has a nice big hard drive you can use for backing up your wild cloud data.
|
||||
|
||||
Your operator machine should be a Debian-based Linux machine (e.g. Debian or Ubuntu) on your LAN. It's helpful if it has a nice big hard drive you can use for backing up your cloud data.
|
||||
## Install the Wild Cloud software
|
||||
|
||||
{{< gitea server="https://git.civilsociety.dev" repo="CSTF/wild-cloud" showThumbnail=true >}}
|
||||
{{< go-deeper >}}
|
||||
We recognize that this part of the guide requires more knowledge of `git` and `bash`. We plan to create a `wild` CLI and perhaps even a GUI setup before wider release. For now, we are prototyping our (fully functional) POC by using scripts from this Wild Cloud repo.
|
||||
{{< /go-deeper >}}
|
||||
|
||||
Download the Wild Cloud software using git:
|
||||
|
||||
```bash
|
||||
git clone https://git.civilsociety.dev/CSTF/wild-cloud.git
|
||||
@@ -30,3 +36,21 @@ Install dependencies:
|
||||
```bash
|
||||
scripts/setup-utils.sh
|
||||
```
|
||||
|
||||
## Create your Wild Cloud Home
|
||||
|
||||
Now that you have the Wild Cloud software installed, we are going to create a directory that will hold everything about your personal wild cloud. We call this your "Wild Cloud Home".
|
||||
|
||||
{{< definition >}}
|
||||
Your **Wild Cloud Home** is the directory where all of your wild cloud data will be stored. This includes your configuration files, data files, and any other files related to your wild cloud.
|
||||
{{< /definition >}}
|
||||
|
||||
You can put it in any directory. Here we show an example if you want to make a directory named `my-wild-cloud` in your home directory.
|
||||
|
||||
```bash
|
||||
mkdir -p ~/my-wild-cloud
|
||||
cd ~/my-wild-cloud
|
||||
wild-cloud-scaffold
|
||||
```
|
||||
|
||||
That's it! Your wild cloud operator machine is ready to go! Most of the rest of the instructions in this guide will assume you are working within this directory.
|
||||
|
@@ -1,47 +1,106 @@
|
||||
+++
|
||||
title = "Setup Wild Cloud"
|
||||
date = '2025-06-09'
|
||||
draft = false
|
||||
+++
|
||||
---
|
||||
title: Set up your wild cloud
|
||||
date: 2025-08-05
|
||||
series:
|
||||
- Wild Cloud Setup
|
||||
series_order: 6
|
||||
---
|
||||
|
||||
This section of the guide will walk you through setting up your wild cloud cluster. When you are done, you will have a complete wild cloud, all set up, ready for your apps!
|
||||
|
||||
## Set up your own Wild Cloud!
|
||||
## Prepare your USB key(s)
|
||||
|
||||
That's it! Now you can start setting up your wild cloud!
|
||||
### Download the correct Talos ISO
|
||||
|
||||
First, make a directory for your wild cloud home. For example `my-wild-cloud` in your home directory.
|
||||
You will be using a USB key to boot each of your cluster machines. Let's create the bootable USB key now.
|
||||
|
||||
From your wild cloud home, run:
|
||||
|
||||
```bash
|
||||
mkdir ~/my-wild-cloud
|
||||
cd ~/my-wild-cloud
|
||||
# Upload schematic configuration to get schematic ID from the Talos ISO service.
|
||||
wild-talos-schema
|
||||
|
||||
# Download custom ISO with system extensions.
|
||||
wild-cluster-node-boot-assets-download
|
||||
```
|
||||
|
||||
Now, you can start the setup process! Just run...
|
||||
This will download all the Talos ISOs for your wild cloud configuration.
|
||||
|
||||
The custom ISO includes system extensions needed for a wild cloud cluster and is saved to `.wildcloud/iso/talos-v<VERSION>-metal-amd64.iso`.
|
||||
|
||||
|
||||
### Copy ISO to a USB drive
|
||||
|
||||
```bash
|
||||
# Find your USB device (be careful to select the right device!)
|
||||
lsblk
|
||||
sudo dmesg | tail # Check for recently connected USB devices
|
||||
|
||||
# Create bootable USB (replace /dev/sdX with your USB device and set the version you donwloaded.
|
||||
sudo dd if=.wildcloud/iso/talos-v<VERSION>-metal-amd64.iso of=/dev/sdX bs=4M status=progress sync
|
||||
|
||||
# Verify the write completed
|
||||
sync
|
||||
```
|
||||
|
||||
**⚠️ Warning**: Double-check the device path (`/dev/sdX`). Writing to the wrong device will destroy data!
|
||||
|
||||
TO DO: Look into some utilities (Balena Etcher, Rufus, etc.) to make this simpler/safer.
|
||||
|
||||
|
||||
## How to install Talos OS on a machine
|
||||
|
||||
To add a machine to your Wild Cloud, you will need to install Talos OS on it. The first time the machine boots, it will be in "maintenance mode" which makes it available to be configured as part of your wild cloud.
|
||||
|
||||
To install Talos OS:
|
||||
|
||||
Prepare the machine:
|
||||
|
||||
- The machine should have a ~100GB drive that the Talos OS will be installed to. Talos will never use more space than this, so any larger of a drive will be wasted space.
|
||||
- If the machine is going to be a worker node, any number of additional drives can be inserted.
|
||||
- Connect the machine to your wild cloud network switch.
|
||||
|
||||
1. Insert your Talos USB key and boot the machine.
|
||||
2. Enter EUFI settings (usually F2, F12, DEL, or ESC during startup) and configure the machine to boot from whatever you are selecting as your boot drive.
|
||||
3. For this time only, choose to boot from the USB key.
|
||||
|
||||
That's all you need to do. The machine should boot into maintenance mode and you will see an IP address you will use during setup.
|
||||
|
||||
## Setup!
|
||||
|
||||
Ok, with the Talos USB key and knowing how to boot a machine with it, we're ready to set up our cluster. In your Wild Cloud Home, start the setup process by running...
|
||||
|
||||
```bash
|
||||
wild-setup
|
||||
```
|
||||
|
||||
The rest of this page walks you through a few of the setup details.
|
||||
The setup script will walk you through the process of installing your cluster nodes (part 1), and your cluster services (part 2).
|
||||
|
||||
### Install your control nodes
|
||||
### Part 1: Setup your cluster nodes
|
||||
|
||||
- Make a Talos USB key.
|
||||
`wild-cluster-node-boot-assets`
|
||||
- Instal Talos OS with your USB key.
|
||||
- It will boot into "maintenance mode". Use the IP address it displays in `wild-setup`.
|
||||
- Repeat for the other two control nodes.
|
||||
_To add a node, it is expected to be in "maintenance mode"--as described above_
|
||||
|
||||
### Install your worker nodes
|
||||
Your cluster will be "brought up" after your first control node is added. Each additional control node will be added to the cluster until you have all three nodes running.
|
||||
|
||||
- Install Talos OS with your USB key.
|
||||
- It will boot into "maintenance mode". Use the IP address it displays in `wild-setup`.
|
||||
- Repeat for as many additional worker nodes as you'd like (three minimum).
|
||||
After your three control nodes are setup, you will have the opportunity to add as many worker nodes as you'd like (three minimum).
|
||||
|
||||
### Install cluster services
|
||||
If you ever want to set up more cluster nodes, you don't need to run the full setup. To get back into this part of the setup, you can just run:
|
||||
|
||||
```bash
|
||||
wild-setup-cluster
|
||||
```
|
||||
|
||||
### Part 2: Install your cluster services
|
||||
|
||||
After your control and worker nodes are installed, `wild-setup` will automatically install all of your wild cloud's cluster services.
|
||||
|
||||
The first time through this part of the setup, you will be asked for your preferences as needed and they will be captured in your `config.yaml`. Once your preferences are recorded, the services will be automatically deployed to your cluster.
|
||||
|
||||
If you ever need to change your cluster services, you don't have to re-run the full setup. You can just run:
|
||||
|
||||
```bash
|
||||
wild-setup-services
|
||||
```
|
||||
|
||||
## Check your installation
|
||||
|
||||
|
@@ -1,8 +1,10 @@
|
||||
+++
|
||||
title = "Use Your Wild Cloud"
|
||||
date = '2025-06-09'
|
||||
draft = false
|
||||
+++
|
||||
---
|
||||
title: Use your wild cloud
|
||||
date: 2025-08-06
|
||||
series:
|
||||
- Wild Cloud Setup
|
||||
series_order: 7
|
||||
---
|
||||
|
||||
## Installing Applications
|
||||
|
||||
|
22
content/learning/glossary/index.md
Normal file
22
content/learning/glossary/index.md
Normal file
@@ -0,0 +1,22 @@
|
||||
---
|
||||
title: "Glossary"
|
||||
date: 2025-08-31
|
||||
summary: "A comprehensive glossary of key terms and concepts related to Wild Cloud."
|
||||
draft: true
|
||||
---
|
||||
|
||||
## Cluster
|
||||
|
||||
- LAN
|
||||
- cluster
|
||||
|
||||
### LAN
|
||||
|
||||
- router
|
||||
|
||||
### Cluster
|
||||
|
||||
- nameserver
|
||||
- node
|
||||
- master
|
||||
- load balancer
|
@@ -21,72 +21,72 @@ It's not really _that_ complicated.
|
||||
|
||||
At its core, the Internet is simply a bunch of computers that are connected together so they can pass data between them. People thought this was a good idea from the beginning with computers, but it was always hard to physically connect them, the data moved slow, and it was hard to make sure that the data got to to the other side uncorrupted. Also, even if you get two computers connected with a wire between them, what if you want to connect a dozen computers? Do you run a wire through all of them like a big circle or do you make it like a spider web with one sort of "hub" in the middle? And what if you want to connect one group to another group?
|
||||
|
||||
{{<alert icon="circle-info">}}
|
||||
{{<definition>}}
|
||||
**Network**: A group of computers connected together so they can pass data around.
|
||||
{{</alert>}}
|
||||
{{</definition>}}
|
||||
|
||||
Lot's of people and companies worked on a lot of ideas for a few decades to solve all these challenges. In 1969, some people working at UCLA, Stanford, UC Santa Barbara, and the University of Utah figured out a way to connect their computers together to pass data around. Do you think they knew at that moment that they had created something that would connect most of the computers in the world together!?
|
||||
|
||||
{{<alert icon="circle-info">}}
|
||||
{{<definition>}}
|
||||
**ARPANET**: The original network that connected these early computers together, and the precursor to the modern Internet. This public research project was funded by the U.S. Department of Defense's Advanced Research Projects Agency (ARPA), so they named their network ARPANET.
|
||||
{{</alert>}}
|
||||
{{</definition>}}
|
||||
|
||||
Over the next ten years, they connected more than 200 nodes (the name for a computer that is part of a network). Some as far away as London and Norway.
|
||||
|
||||
{{<alert icon="circle-info">}}
|
||||
{{<definition>}}
|
||||
**Node**: A computer that is part of a network (a "network node").
|
||||
{{</alert>}}
|
||||
{{</definition>}}
|
||||
|
||||
|
||||
{{<alert icon="heart" iconColor="red" cardColor="pink">}}
|
||||
{{<bring-it-home>}}
|
||||
Your wild cloud is a network of at least 8 nodes all running on your Local Area Network (LAN) and connected through a router to the Internet, also known as the Wide Area Network (WAN).
|
||||
{{</alert>}}
|
||||
{{</bring-it-home>}}
|
||||
|
||||
|
||||
## Introducing a common language (TCP/IP)
|
||||
|
||||
But, in the 1970s, other groups kept working on other ways to connect computers, and they developed their own networking protocols that were incompatible with the ARPANET. How could these different networks communicate with each other?
|
||||
|
||||
{{<alert icon="circle-info">}}
|
||||
{{<definition>}}
|
||||
**Protocol**: An agreed-upon way of doing something. If two people, or companies, or schools, **or machines**, use the same protocol, they can work together. People or machines using different protocols have a hard time getting along. Two computers that can talk together on a network are using the same "network protocol".
|
||||
{{</alert>}}
|
||||
{{</definition>}}
|
||||
|
||||
So, they figured out a common language to connect all these different networks, named it TCP/IP, and switched the ARPANET over to it in 1983.
|
||||
|
||||
{{<alert icon="circle-info">}}
|
||||
{{<definition>}}
|
||||
**TCP/IP**: The common language that connects different networks together. It if flexible because it breaks the problem into two parts, the Transmission Control Protocol (TCP) and the Internet Protocol (IP).
|
||||
{{</alert>}}
|
||||
{{</definition>}}
|
||||
|
||||
{{<alert icon="graduation-cap" cardColor="#ffdf78ff" iconColor="#fa6b0cff">}}
|
||||
{{<go-deeper>}}
|
||||
Vint Cerf and Bob Kahn developed TCP/IP, and explained how it works in their paper, [“A Protocol for Packet Network Intercommunication”](/papers/cerf74.pdf), which was published in IEEE Transactions on Communications, May 1974. Want to have some fun digging in? Try uploading this paper to ChatGPT or some other assistant and have a conversation about it! You'll know more about networking in an afternoon than many career software engineers. 😁
|
||||
{{</alert>}}
|
||||
{{</go-deeper>}}
|
||||
|
||||
TCP/IP gives every node on the Internet a unique address you can use to find it and talk to it. These are called "IP Addresses". Every device that talks to another device on the Internet has an IP address. These are the "###.###.###.###" format numbers where section is a number from 0-255. So, 192.168.1.0 is an IP address, and so is 10.10.10.10, and so it 56.122.200.27. TCP/IP can route data to your device just using its address... very similar to how letters get to your mailbox.
|
||||
|
||||
{{<alert icon="circle-info">}}
|
||||
{{<definition>}}
|
||||
**IP Address**: A unique string of numbers separated by periods that identifies _every_ computer on a TCP/IP network like the Internet. For example, `192.168.1.1` is an IP address.
|
||||
{{</alert>}}
|
||||
{{</definition>}}
|
||||
|
||||
{{<alert icon="heart" iconColor="red" cardColor="pink">}}
|
||||
{{<bring-it-home>}}
|
||||
Every computer that is a part of your wild cloud has a unique, local, IP address. Your LAN router, which also has an IP address, assigns unique IP addresses to each device on your LAN and keeps track of them.
|
||||
{{</alert>}}
|
||||
{{</bring-it-home>}}
|
||||
|
||||
|
||||
## Making it friendly (DNS)
|
||||
|
||||
But people don't think in numbers, people think in words or names, so a guy at the University of Southern California figured out a system he called the Domain Name System (DNS) in 1983. His system allowed IP addresses to be mapped to "domain names", so that now, somebody could use `wikipedia.org` instead of `198.35.26.96` (see that's easier to remember!) to address a particular computer. The DNS system is particularly interesting because it's design is much of the reason we have a resilient, distributed, non-centrally controlled Internet today. Any individual or organization can register their own unique domain name and control what computers IP addresses it maps to.
|
||||
|
||||
{{<alert icon="circle-info">}}
|
||||
{{<definition>}}
|
||||
**DNS**: The Domain Name System, which maps IP addresses to human-readable domain names (like `wikipedia.org`).
|
||||
{{</alert>}}
|
||||
{{</definition>}}
|
||||
|
||||
{{<alert icon="graduation-cap" cardColor="#ffdf78ff" iconColor="#fa6b0cff">}}
|
||||
{{<go-deeper>}}
|
||||
Paul Mockapetris wrote up his design in a working group he was a part of in 1983. You can read his paper ["DOMAIN NAMES - CONCEPTS and FACILITIES"](/papers/rfc882.txt.pdf). The design has been adapted a bit over the years, but if you spent an afternoon with ChatGPT digging into this paper, you'll know more about how the Internet works almost anyone. 😁
|
||||
{{</alert>}}
|
||||
{{</go-deeper>}}
|
||||
|
||||
{{<alert icon="heart" iconColor="red" cardColor="pink">}}
|
||||
{{<bring-it-home>}}
|
||||
When you set up a wild cloud, you will register a domain name at a domain registrar (Wild Cloud currently supports CloudFlare). You will then map this domain name to the applications on your wild cloud.
|
||||
{{</alert>}}
|
||||
{{</bring-it-home>}}
|
||||
|
||||
|
||||
## Conclusion
|
||||
|
@@ -9,9 +9,9 @@ summary: "Linux is more than just an operating system; it is a cornerstone of di
|
||||
|
||||
Back in the days before every desktop and laptop was sold as a "PC" or an "Apple", and every phone was an "Android" or an "iPhone", people had a better idea of what an "operating system" was. As the tech landscape consolidated around a few dominant players, their brands hid the reality that hardware and software were different things and that users had more than two choices. In fact, today, it is difficult to even find a computer that isn't pre-installed with one of the two dominant operating systems, Windows or macOS.
|
||||
|
||||
{{<alert icon="circle-info">}}
|
||||
{{<definition>}}
|
||||
The **operating** system is the name for the core software that makes individual hardware components of a computer work together, gives the user a way to interact with them, and makes it easy to write and run software applications on top of them. Operating systems make storage drives accessible as folders and files, turns screens into desktops, and allows you to use keyboards and mice to drive things. Operating systems load programs into memory and execute them on purpose-tailored hardware chips like central processing units (CPUs), graphical processing units (GPUs), and neural processing units (NPUs).
|
||||
{{</alert>}}
|
||||
{{</definition>}}
|
||||
|
||||
Apple makes all of their own hardware and they work hard to only allow only _their_ operating system, macOS run on it. Most of the rest of the hardware on the market, though, was created by a bunch of different companies who, in order to and compete, made their hardware more openly, collaborating together to specify standard ways of using and assembling their various components. Before Microsoft there were dozens of different operating systems that worked with this open hardware. Microsoft introduced one of the first text-based operating systems that could run on IBM and Intel hardware in 1982 (MSDOS), and their graphical operating systems (Windows 3.1) in 1993 and, through savvy business and legal positioning came to be the default operating system on over 90% of all personal computers.
|
||||
|
||||
@@ -61,9 +61,9 @@ To install Ubuntu on a virtual machine, follow these steps:
|
||||
|
||||
Wild Cloud recommends installing Ubuntu directly on a dedicated computer to be your operator machine. This provides the best performance and compatibility for running Wild Cloud operations.
|
||||
|
||||
{{<alert icon="circle-info">}}
|
||||
{{<definition>}}
|
||||
When you install Ubuntu directly on a computer without using WSL or a virtual machine, it's known as installing on "**bare metal**". ⚡
|
||||
{{</alert>}}
|
||||
{{</definition>}}
|
||||
|
||||
You can use just about any desktop or laptop computer made in the last 10 years as your operator machine. You can't install Ubuntu on Apple hardware, though. Just keep in mind you will probably want a lot of disk space for backups of your Wild Cloud either on your operator machine or on an attached external drive.
|
||||
|
||||
@@ -74,8 +74,8 @@ To install Ubuntu on a dedicated machine, follow these steps:
|
||||
3. Boot the dedicated machine from the USB drive. Many computers will allow you to do this by simply inserting the USB drive and restarting the computer. Some computers are not set to boot from the USB drive, though, so you'll need to access the boot menu (usually by pressing a key like F12, Esc, or Del immediately after turning on the computer) and select the USB drive as the boot device. If you can't figure out how to get to the boot menu, search for your computer model + "boot menu" the the search engine of your choice.
|
||||
4. Follow the prompts to install Ubuntu on the dedicated machine. There aren't a ton of options to pick and it usually doesn't take long, maybe a half-hour.
|
||||
|
||||
{{<alert icon="heart" iconColor="red" cardColor="pink">}}
|
||||
{{<bring-it-home>}}
|
||||
You will be doing everything to operate your Wild Cloud from your operator machine. Treat yourself and make it a nice one!
|
||||
{{</alert>}}
|
||||
{{</bring-it-home>}}
|
||||
|
||||
🛟 Need help with these instructions? Ask questions in the [Wild Cloud forum](https://forum.civilsociety.dev/t/wild-cloud-support/15).
|
338
content/learning/visibility/index.md
Normal file
338
content/learning/visibility/index.md
Normal file
@@ -0,0 +1,338 @@
|
||||
---
|
||||
title: "App Visibility"
|
||||
date: 2025-08-31
|
||||
summary: "Understanding how applications achieve visibility in a Kubernetes environment, from deployment to external access."
|
||||
draft: true
|
||||
---
|
||||
|
||||
# Understanding Network Visibility in Kubernetes
|
||||
|
||||
This guide explains how applications deployed on our Kubernetes cluster become accessible from both internal and external networks. Whether you're deploying a public-facing website or an internal admin panel, this document will help you understand the journey from deployment to accessibility.
|
||||
|
||||
## The Visibility Pipeline
|
||||
|
||||
When you deploy an application to the cluster, making it accessible involves several coordinated components working together:
|
||||
|
||||
1. **Kubernetes Services** - Direct traffic to your application pods
|
||||
2. **Ingress Controllers** - Route external HTTP/HTTPS traffic to services
|
||||
3. **Load Balancers** - Assign external IPs to services
|
||||
4. **DNS Management** - Map domain names to IPs
|
||||
5. **TLS Certificates** - Secure connections with HTTPS
|
||||
|
||||
Let's walk through how each part works and how they interconnect.
|
||||
|
||||
## From Deployment to Visibility
|
||||
|
||||
### 1. Application Deployment
|
||||
|
||||
Your journey begins with deploying your application on Kubernetes. This typically involves:
|
||||
|
||||
```yaml
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: my-app
|
||||
namespace: my-namespace
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: my-app
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: my-app
|
||||
spec:
|
||||
containers:
|
||||
- name: my-app
|
||||
image: myapp:latest
|
||||
ports:
|
||||
- containerPort: 80
|
||||
```
|
||||
|
||||
This creates pods running your application, but they're not yet accessible outside their namespace.
|
||||
|
||||
### 2. Kubernetes Service: Internal Connectivity
|
||||
|
||||
A Kubernetes Service provides a stable endpoint to access your pods:
|
||||
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: my-app
|
||||
namespace: my-namespace
|
||||
spec:
|
||||
selector:
|
||||
app: my-app
|
||||
ports:
|
||||
- port: 80
|
||||
targetPort: 80
|
||||
type: ClusterIP
|
||||
```
|
||||
|
||||
With this `ClusterIP` service, your application is accessible within the cluster at `my-app.my-namespace.svc.cluster.local`, but not from outside.
|
||||
|
||||
### 3. Ingress: Defining HTTP Routes
|
||||
|
||||
For HTTP/HTTPS traffic, an Ingress resource defines routing rules:
|
||||
|
||||
```yaml
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: my-app
|
||||
namespace: my-namespace
|
||||
annotations:
|
||||
kubernetes.io/ingress.class: "traefik"
|
||||
external-dns.alpha.kubernetes.io/target: "CLOUD_DOMAIN"
|
||||
external-dns.alpha.kubernetes.io/ttl: "60"
|
||||
spec:
|
||||
rules:
|
||||
- host: my-app.CLOUD_DOMAIN
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: my-app
|
||||
port:
|
||||
number: 80
|
||||
tls:
|
||||
- hosts:
|
||||
- my-app.CLOUD_DOMAIN
|
||||
secretName: wildcard-wild-cloud-tls
|
||||
```
|
||||
|
||||
This Ingress tells the cluster to route requests for `my-app.CLOUD_DOMAIN` to your service. The annotations provide hints to other systems like ExternalDNS.
|
||||
|
||||
### 4. Traefik: The Ingress Controller
|
||||
|
||||
Our cluster uses Traefik as the ingress controller. Traefik watches for Ingress resources and configures itself to handle the routing rules. It acts as a reverse proxy and edge router, handling:
|
||||
|
||||
- HTTP/HTTPS routing
|
||||
- TLS termination
|
||||
- Load balancing
|
||||
- Path-based routing
|
||||
- Host-based routing
|
||||
|
||||
Traefik runs as a service in the cluster with its own external IP (provided by MetalLB).
|
||||
|
||||
### 5. MetalLB: Assigning External IPs
|
||||
|
||||
Since we're running on-premises (not in a cloud that provides load balancers), we use MetalLB to assign external IPs to services. MetalLB manages a pool of IP addresses from our local network:
|
||||
|
||||
```yaml
|
||||
apiVersion: metallb.io/v1beta1
|
||||
kind: IPAddressPool
|
||||
metadata:
|
||||
name: default
|
||||
namespace: metallb-system
|
||||
spec:
|
||||
addresses:
|
||||
- 192.168.8.240-192.168.8.250
|
||||
```
|
||||
|
||||
This allows Traefik and any other LoadBalancer services to receive a real IP address from our network.
|
||||
|
||||
### 6. ExternalDNS: Automated DNS Management
|
||||
|
||||
ExternalDNS automatically creates and updates DNS records in our CloudFlare DNS zone:
|
||||
|
||||
```yaml
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: external-dns
|
||||
namespace: externaldns
|
||||
spec:
|
||||
# ...
|
||||
template:
|
||||
spec:
|
||||
containers:
|
||||
- name: external-dns
|
||||
image: registry.k8s.io/external-dns/external-dns
|
||||
args:
|
||||
- --source=service
|
||||
- --source=ingress
|
||||
- --provider=cloudflare
|
||||
- --txt-owner-id=wild-cloud
|
||||
```
|
||||
|
||||
ExternalDNS watches Kubernetes Services and Ingresses with appropriate annotations, then creates corresponding DNS records in CloudFlare, making your applications discoverable by domain name.
|
||||
|
||||
### 7. Cert-Manager: TLS Certificate Automation
|
||||
|
||||
To secure connections with HTTPS, we use cert-manager to automatically obtain and renew TLS certificates:
|
||||
|
||||
```yaml
|
||||
apiVersion: cert-manager.io/v1
|
||||
kind: Certificate
|
||||
metadata:
|
||||
name: wildcard-wild-cloud-io
|
||||
namespace: default
|
||||
spec:
|
||||
secretName: wildcard-wild-cloud-tls
|
||||
dnsNames:
|
||||
- "*.CLOUD_DOMAIN"
|
||||
- "CLOUD_DOMAIN"
|
||||
issuerRef:
|
||||
name: letsencrypt-prod
|
||||
kind: ClusterIssuer
|
||||
```
|
||||
|
||||
Cert-manager handles:
|
||||
|
||||
- Certificate request and issuance
|
||||
- DNS validation (for wildcard certificates)
|
||||
- Automatic renewal
|
||||
- Secret storage of certificates
|
||||
|
||||
## The Two Visibility Paths
|
||||
|
||||
In our infrastructure, we support two primary visibility paths:
|
||||
|
||||
### Public Services (External Access)
|
||||
|
||||
Public services are those meant to be accessible from the public internet:
|
||||
|
||||
1. **Service**: Kubernetes ClusterIP service (internal)
|
||||
2. **Ingress**: Defines routing with hostname like `service-name.CLOUD_DOMAIN`
|
||||
3. **DNS**: ExternalDNS creates a CNAME record pointing to `CLOUD_DOMAIN`
|
||||
4. **TLS**: Uses wildcard certificate for `*.CLOUD_DOMAIN`
|
||||
5. **IP Addressing**: Traffic reaches the MetalLB-assigned IP for Traefik
|
||||
6. **Network**: Traffic flows from external internet → router → MetalLB IP → Traefik → Kubernetes Service → Application Pods
|
||||
|
||||
**Deploy a public service with:**
|
||||
|
||||
```bash
|
||||
./bin/deploy-service --type public --name myservice
|
||||
```
|
||||
|
||||
### Internal Services (Private Access)
|
||||
|
||||
Internal services are restricted to the internal network:
|
||||
|
||||
1. **Service**: Kubernetes ClusterIP service (internal)
|
||||
2. **Ingress**: Defines routing with hostname like `service-name.internal.CLOUD_DOMAIN`
|
||||
3. **DNS**: ExternalDNS creates an A record pointing to the internal load balancer IP
|
||||
4. **TLS**: Uses wildcard certificate for `*.internal.CLOUD_DOMAIN`
|
||||
5. **IP Addressing**: Traffic reaches the MetalLB-assigned IP for Traefik
|
||||
6. **Network**: Traffic flows from internal network → MetalLB IP → Traefik → Service → Pods
|
||||
7. **Security**: Traefik middleware restricts access to internal network IPs
|
||||
|
||||
**Deploy an internal service with:**
|
||||
|
||||
```bash
|
||||
./bin/deploy-service --type internal --name adminpanel
|
||||
```
|
||||
|
||||
## How It All Works Together
|
||||
|
||||
1. **You deploy** an application using our deploy-service script
|
||||
2. **Kubernetes** schedules and runs your application pods
|
||||
3. **Services** provide a stable endpoint for your pods
|
||||
4. **Traefik** configures routing based on Ingress definitions
|
||||
5. **MetalLB** assigns real network IPs to LoadBalancer services
|
||||
6. **ExternalDNS** creates DNS records for your services
|
||||
7. **Cert-Manager** ensures valid TLS certificates for HTTPS
|
||||
|
||||
### Network Flow Diagram
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
subgraph Internet["Internet"]
|
||||
User("User Browser")
|
||||
CloudDNS("CloudFlare DNS")
|
||||
end
|
||||
subgraph Cluster["Cluster"]
|
||||
Router("Router")
|
||||
MetalLB("MetalLB")
|
||||
Traefik("Traefik Ingress")
|
||||
IngSvc("Service")
|
||||
IngPods("Application Pods")
|
||||
Ingress("Ingress")
|
||||
CertManager("cert-manager")
|
||||
WildcardCert("Wildcard Certificate")
|
||||
ExtDNS("ExternalDNS")
|
||||
end
|
||||
User -- "1\. DNS Query" --> CloudDNS
|
||||
CloudDNS -- "2\. IP Address" --> User
|
||||
User -- "3\. HTTPS Request" --> Router
|
||||
Router -- "4\. Forward" --> MetalLB
|
||||
MetalLB -- "5\. Route" --> Traefik
|
||||
Traefik -- "6\. Route" --> Ingress
|
||||
Ingress -- "7\. Forward" --> IngSvc
|
||||
IngSvc -- "8\. Balance" --> IngPods
|
||||
ExtDNS -- "A. Update DNS" --> CloudDNS
|
||||
Ingress -- "B. Configure" --> ExtDNS
|
||||
CertManager -- "C. Issue Cert" --> WildcardCert
|
||||
Ingress -- "D. Use" --> WildcardCert
|
||||
|
||||
User:::internet
|
||||
CloudDNS:::internet
|
||||
Router:::cluster
|
||||
MetalLB:::cluster
|
||||
Traefik:::cluster
|
||||
IngSvc:::cluster
|
||||
IngPods:::cluster
|
||||
Ingress:::cluster
|
||||
CertManager:::cluster
|
||||
WildcardCert:::cluster
|
||||
ExtDNS:::cluster
|
||||
classDef internet fill:#fcfcfc,stroke:#333
|
||||
classDef cluster fill:#a6f3ff,stroke:#333
|
||||
style User fill:#C8E6C9
|
||||
style CloudDNS fill:#C8E6C9
|
||||
style Router fill:#C8E6C9
|
||||
style MetalLB fill:#C8E6C9
|
||||
style Traefik fill:#C8E6C9
|
||||
style IngSvc fill:#C8E6C9
|
||||
style IngPods fill:#C8E6C9
|
||||
style Ingress fill:#C8E6C9
|
||||
style CertManager fill:#C8E6C9
|
||||
style WildcardCert fill:#C8E6C9
|
||||
style ExtDNS fill:#C8E6C9
|
||||
```
|
||||
|
||||
A successful deployment creates a chain of connections:
|
||||
|
||||
```
|
||||
Internet → DNS (domain name) → External IP → Traefik → Kubernetes Service → Application Pod
|
||||
```
|
||||
|
||||
## Behind the Scenes: The Technical Magic
|
||||
|
||||
When you use our `deploy-service` script, several things happen:
|
||||
|
||||
1. **Template Processing**: The script processes a YAML template for your service type, using environment variables to customize it
|
||||
2. **Namespace Management**: Creates or uses your service's namespace
|
||||
3. **Resource Application**: Applies the generated YAML to create/update all Kubernetes resources
|
||||
4. **DNS Configuration**: ExternalDNS detects the new resources and creates DNS records
|
||||
5. **Certificate Management**: Cert-manager ensures TLS certificates exist or creates new ones
|
||||
6. **Secret Distribution**: For internal services, certificates are copied to the appropriate namespaces
|
||||
|
||||
## Troubleshooting Visibility Issues
|
||||
|
||||
When services aren't accessible, the issue usually lies in one of these areas:
|
||||
|
||||
1. **DNS Resolution**: Domain not resolving to the correct IP
|
||||
2. **Certificate Problems**: Invalid, expired, or missing TLS certificates
|
||||
3. **Ingress Configuration**: Incorrect routing rules or annotations
|
||||
4. **Network Issues**: Firewall rules or internal/external network segregation
|
||||
|
||||
Our [Visibility Troubleshooting Guide](/docs/troubleshooting/VISIBILITY.md) provides detailed steps for diagnosing these issues.
|
||||
|
||||
## Conclusion
|
||||
|
||||
The visibility layer in our infrastructure represents a sophisticated interplay of multiple systems working together. While complex under the hood, it provides a streamlined experience for developers to deploy applications with proper networking, DNS, and security.
|
||||
|
||||
By understanding these components and their relationships, you'll be better equipped to deploy applications and diagnose any visibility issues that arise.
|
||||
|
||||
## Further Reading
|
||||
|
||||
- [Traefik Documentation](https://doc.traefik.io/traefik/)
|
||||
- [ExternalDNS Project](https://github.com/kubernetes-sigs/external-dns)
|
||||
- [Cert-Manager Documentation](https://cert-manager.io/docs/)
|
||||
- [MetalLB Project](https://metallb.universe.tf/)
|
14
content/pasteboard.md
Normal file
14
content/pasteboard.md
Normal file
@@ -0,0 +1,14 @@
|
||||
---
|
||||
name: Pasteboard
|
||||
draft: true
|
||||
---
|
||||
|
||||
- {{< icon "cloud-solid-full" "#00bcff">}}
|
||||
- {{< icon "circle-info" "#05df72" >}}
|
||||
- {{< icon "graduation-cap" "#5d0ec0" >}}
|
||||
- {{< icon "sun" "#fff085" >}}
|
||||
- {{< alert >}}alert{{< /alert >}}
|
||||
- {{< definition >}}definition{{< /definition >}}
|
||||
- {{< bring-it-home >}}bring-it-home{{< /bring-it-home >}}
|
||||
- {{< go-deeper >}}go-deeper{{< /go-deeper >}}
|
||||
- <span style="background-color: rgba(255, 255, 0, 0.4);">highlight</span>
|
0
content/tutorial/_index.md
Normal file
0
content/tutorial/_index.md
Normal file
25
content/tutorial/welcome/index.md
Normal file
25
content/tutorial/welcome/index.md
Normal file
@@ -0,0 +1,25 @@
|
||||
---
|
||||
title: Welcome!
|
||||
description: Welcome to the Wild Cloud tutorial!
|
||||
date: 2025-07-13
|
||||
tags:
|
||||
- tutorial
|
||||
---
|
||||
|
||||
Hi! I'm Paul.
|
||||
|
||||
Welcome! I am SO excited you're here!
|
||||
|
||||
Why am I so excited?? When I was an eight year old kid, I had a computer named the Commodore64. One of the coolest things about it was that it came with a User Manual that told you all about how to not just use that computer, but to actually _use computers_. It taught me how to write my own programs and run them! That experience of wonder, that I could write something and have it do something, is the single biggest reason why I have spent the last 40 years working with computers.
|
||||
|
||||
When I was 12, I found out I could plug a cartridge into the back of my Commodore, plug a telephone line into it (maybe some of you don't even know what that is anymore!), and _actually call_ other people's computers in my city. We developed such a sense of community, connecting our computers together and leaving each other messages about the things we were thinking. It was a tiny taste of the early Internet.
|
||||
|
||||
I had a similar experience when I was 19 and installed something called the "World Wide Web" on the computers I managed in a computer lab at college. My heart skipped a beat when I clicked on a few "links" and actually saw an image from a computer in Europe just magically appear on my screen! It felt like I was teleported to the other side of the world. Pretty amazing for a kid who had rarely been out of Nebraska!
|
||||
|
||||
Everything in those days was basically free. My Commodore cost $200, people connected to each other out of pure curiosity. If you wanted to be a presence on the Internet, you could just connect your computer to it and people around the world could visit you! _All_ of the early websites were entirely non-commercial. No ads! No sign-ups! No monthly subscription fees! It felt like the whole world was coming together to build something amazing for everyone.
|
||||
|
||||
Of course, as we all know, it didn't stay that way. After college, I had to figure out ways to pay for Internet connections myself. At some point search engines decided to make money by selling ads on their pages... and then providing ad services to other pages--"monetize" they called it. Then commercial companies found out about it and wanted to sell books and shoes to other people, and the government decided they wanted to capture that tax money. Instead of making the free and open software better, and the open communities stronger, and encouraging people to participate by running their own computers and software, companies started offering people to connect _inside_ their controlled computers. "Hey! You don't have to do all that stuff" they would say, "You can just jump on our servers for free!".
|
||||
|
||||
So people stopped being curious about what we could do with our computers together, and they got a login name, and they couldn't do their own things on their own computers anymore, and their data became the property of the company whose computer they were using, and those companies started working together to make it faster to go to their own computers, and to make it go very, very, slow if you wanted to let people come to your computer, or even to forbid having people come to your computer entirely. So now, we are _safe_ and _simple_ and _secure_ and we get whatever the companies want to give us, which seems to usually be ads (so many ads) or monthly fee increases, and they really, really, love getting our attention and putting it where they want it. Mostly, it's just all so... boring. So boring.
|
||||
|
||||
So, why am I excited you're here? Because with this project, this Wild Cloud project, I think I just might be able to pass on some of that sense of wonder that captured me so many years ago!
|
17
layouts/_shortcodes/bring-it-home.html
Normal file
17
layouts/_shortcodes/bring-it-home.html
Normal file
@@ -0,0 +1,17 @@
|
||||
{{ $.Scratch.Set "icon" (default "sun" (.Get 0) ) }}
|
||||
|
||||
<div
|
||||
class="alert flex px-4 py-3 rounded-md bg-sky-200 dark:bg-sky-500"
|
||||
>
|
||||
<span
|
||||
class="ltr:pr-3 rtl:pl-3 flex text-yellow-200 items-begin pt-[6px]"
|
||||
>
|
||||
{{ partial "icon.html" ($.Scratch.Get "icon") }}
|
||||
</span>
|
||||
|
||||
<span
|
||||
class="dark:text-sky-50 text-sky-900"
|
||||
>
|
||||
{{- .Inner | markdownify -}}
|
||||
</span>
|
||||
</div>
|
17
layouts/_shortcodes/definition.html
Normal file
17
layouts/_shortcodes/definition.html
Normal file
@@ -0,0 +1,17 @@
|
||||
{{ $.Scratch.Set "icon" (default "circle-info" (.Get 0) ) }}
|
||||
|
||||
<div
|
||||
class="alert flex px-4 py-3 rounded-md bg-green-100 dark:bg-green-700"
|
||||
>
|
||||
<span
|
||||
class="text-green-400 ltr:pr-3 rtl:pl-3 flex items-begin pt-[6px]"
|
||||
>
|
||||
{{ partial "icon.html" ($.Scratch.Get "icon") }}
|
||||
</span>
|
||||
|
||||
<span
|
||||
class="dark:text-green-100 text-green-950"
|
||||
>
|
||||
{{- .Inner | markdownify -}}
|
||||
</span>
|
||||
</div>
|
17
layouts/_shortcodes/go-deeper.html
Normal file
17
layouts/_shortcodes/go-deeper.html
Normal file
@@ -0,0 +1,17 @@
|
||||
{{ $.Scratch.Set "icon" (default "graduation-cap" (.Get 0) ) }}
|
||||
|
||||
<div
|
||||
class="alert flex px-4 py-3 rounded-md bg-violet-200 dark:bg-violet-700"
|
||||
>
|
||||
<span
|
||||
class="text-violet-800 dark:text-violet-100 ltr:pr-3 rtl:pl-3 flex items-begin pt-[6px]"
|
||||
>
|
||||
{{ partial "icon.html" ($.Scratch.Get "icon") }}
|
||||
</span>
|
||||
|
||||
<span
|
||||
class="dark:text-violet-200 text-violet-900"
|
||||
>
|
||||
{{- .Inner | markdownify -}}
|
||||
</span>
|
||||
</div>
|
11
layouts/shortcodes/icon.html
Normal file
11
layouts/shortcodes/icon.html
Normal file
@@ -0,0 +1,11 @@
|
||||
{{- /* Avoid extra whitespace */ -}}
|
||||
{{- /* https://discourse.gohugo.io/t/55399/5 */ -}}
|
||||
{{- $icon := resources.Get (printf "icons/%s.svg" ($.Get 0)) -}}
|
||||
{{- $color := $.Get 1 | default "currentColor" -}}
|
||||
{{- if $icon -}}
|
||||
<span class="relative inline-block align-text-bottom icon" style="color: {{ $color }};">
|
||||
{{- strings.Replace $icon.Content "\n" "" | safeHTML -}}
|
||||
</span>
|
||||
{{- else -}}
|
||||
{{- errorf `icon shortcode: resource "%s" not found. Check the path is correct or remove the shortcode: %s` (printf "icons/%s.svg" ($.Get 0)) .Position -}}
|
||||
{{- end -}}
|
9
package.json
Normal file
9
package.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"name": "payne.io",
|
||||
"version": "1.0.0",
|
||||
"description": "payne.io website.",
|
||||
"scripts": {
|
||||
"dev": "NODE_ENV=development npx ./themes/blowfish/node_modules/@tailwindcss/cli -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit -w",
|
||||
"build": "NODE_ENV=production npx ./themes/blowfish/node_modules/@tailwindcss/cli -c ./themes/blowfish/tailwind.config.js -i ./themes/blowfish/assets/css/main.css -o ./assets/css/compiled/main.css --jit"
|
||||
}
|
||||
}
|
BIN
static/papers/cerf74.pdf
Normal file
BIN
static/papers/cerf74.pdf
Normal file
Binary file not shown.
BIN
static/papers/rfc882.txt.pdf
Normal file
BIN
static/papers/rfc882.txt.pdf
Normal file
Binary file not shown.
Submodule themes/blowfish updated: 2f12b8d0d9...a1a29be725
Reference in New Issue
Block a user