This commit is contained in:
parent
83da671d19
commit
b28b696adc
11 changed files with 333 additions and 49 deletions
|
@ -9,6 +9,9 @@
|
||||||
"kubernetes-helm@latest",
|
"kubernetes-helm@latest",
|
||||||
"tflint@latest"
|
"tflint@latest"
|
||||||
],
|
],
|
||||||
|
"env": {
|
||||||
|
"TFENV_AUTO_INSTALL": "true"
|
||||||
|
},
|
||||||
"shell": {
|
"shell": {
|
||||||
"init_hook": [
|
"init_hook": [
|
||||||
"echo 'Welcome to devbox!' > /dev/null"
|
"echo 'Welcome to devbox!' > /dev/null"
|
||||||
|
|
26
justfile
26
justfile
|
@ -3,32 +3,12 @@ set shell := ["devbox", "run"]
|
||||||
# Load dotenv
|
# Load dotenv
|
||||||
set dotenv-load
|
set dotenv-load
|
||||||
|
|
||||||
|
mod k8s 'k8s.tjo.cloud'
|
||||||
|
mod proxmox 'proxmox.tjo.cloud'
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@just --list
|
@just --list
|
||||||
|
|
||||||
lint:
|
lint:
|
||||||
@tofu fmt -check -recursive .
|
@tofu fmt -check -recursive .
|
||||||
@tflint --recursive
|
@tflint --recursive
|
||||||
|
|
||||||
GATEWAY_API_VERSION := "v1.1.0"
|
|
||||||
PROMETHEUS_CRDS_VERSION := "main"
|
|
||||||
|
|
||||||
modules-cluster-manifests:
|
|
||||||
@rm -rf k8s.tjo.cloud/modules/cluster/manifests
|
|
||||||
@mkdir -p k8s.tjo.cloud/modules/cluster/manifests
|
|
||||||
@curl -L -o k8s.tjo.cloud/modules/cluster/manifests/gateway-api.crds.yaml \
|
|
||||||
"https://github.com/kubernetes-sigs/gateway-api/releases/download/{{GATEWAY_API_VERSION}}/experimental-install.yaml"
|
|
||||||
|
|
||||||
module-cluster-core-manifests:
|
|
||||||
@rm -rf k8s.tjo.cloud/modules/cluster-core/manifests
|
|
||||||
@mkdir -p k8s.tjo.cloud/modules/cluster-core/manifests
|
|
||||||
@curl -L -o k8s.tjo.cloud/modules/cluster-core/manifests/crd-podmonitors.yaml \
|
|
||||||
"https://raw.githubusercontent.com/prometheus-community/helm-charts/{{PROMETHEUS_CRDS_VERSION}}/charts/kube-prometheus-stack/charts/crds/crds/crd-podmonitors.yaml"
|
|
||||||
@curl -L -o k8s.tjo.cloud/modules/cluster-core/manifests/crd-servicemonitors.yaml \
|
|
||||||
"https://raw.githubusercontent.com/prometheus-community/helm-charts/{{PROMETHEUS_CRDS_VERSION}}/charts/kube-prometheus-stack/charts/crds/crds/crd-servicemonitors.yaml"
|
|
||||||
|
|
||||||
k8s-apply: modules-cluster-manifests module-cluster-core-manifests
|
|
||||||
tofu -chdir={{justfile_directory()}}/k8s.tjo.cloud init
|
|
||||||
tofu -chdir={{justfile_directory()}}/k8s.tjo.cloud apply -target module.cluster
|
|
||||||
tofu -chdir={{justfile_directory()}}/k8s.tjo.cloud apply -target module.cluster-core
|
|
||||||
tofu -chdir={{justfile_directory()}}/k8s.tjo.cloud apply
|
|
||||||
|
|
25
k8s.tjo.cloud/justfile
Normal file
25
k8s.tjo.cloud/justfile
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
GATEWAY_API_VERSION := "v1.1.0"
|
||||||
|
PROMETHEUS_CRDS_VERSION := "main"
|
||||||
|
|
||||||
|
default:
|
||||||
|
@just --list
|
||||||
|
|
||||||
|
modules-cluster-manifests:
|
||||||
|
@rm -rf modules/cluster/manifests
|
||||||
|
@mkdir -p modules/cluster/manifests
|
||||||
|
@curl -L -o modules/cluster/manifests/gateway-api.crds.yaml \
|
||||||
|
"https://github.com/kubernetes-sigs/gateway-api/releases/download/{{GATEWAY_API_VERSION}}/experimental-install.yaml"
|
||||||
|
|
||||||
|
module-cluster-core-manifests:
|
||||||
|
@rm -rf modules/cluster-core/manifests
|
||||||
|
@mkdir -p modules/cluster-core/manifests
|
||||||
|
@curl -L -o modules/cluster-core/manifests/crd-podmonitors.yaml \
|
||||||
|
"https://raw.githubusercontent.com/prometheus-community/helm-charts/{{PROMETHEUS_CRDS_VERSION}}/charts/kube-prometheus-stack/charts/crds/crds/crd-podmonitors.yaml"
|
||||||
|
@curl -L -o modules/cluster-core/manifests/crd-servicemonitors.yaml \
|
||||||
|
"https://raw.githubusercontent.com/prometheus-community/helm-charts/{{PROMETHEUS_CRDS_VERSION}}/charts/kube-prometheus-stack/charts/crds/crds/crd-servicemonitors.yaml"
|
||||||
|
|
||||||
|
apply: modules-cluster-manifests module-cluster-core-manifests
|
||||||
|
tofu init
|
||||||
|
tofu apply -target module.cluster
|
||||||
|
tofu apply -target module.cluster-core
|
||||||
|
tofu apply
|
|
@ -1,26 +0,0 @@
|
||||||
apiVersion: v1
|
|
||||||
kind: Config
|
|
||||||
clusters:
|
|
||||||
- name: k8s-tjo-cloud
|
|
||||||
cluster:
|
|
||||||
server: https://api.k8s.tjo.cloud:443
|
|
||||||
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJpVENDQVMrZ0F3SUJBZ0lRWXFNSG94UFhiTFMvZ21oTFhUOWd0akFLQmdncWhrak9QUVFEQWpBVk1STXcKRVFZRFZRUUtFd3ByZFdKbGNtNWxkR1Z6TUI0WERUSTBNRGd3TXpFeU16TXpORm9YRFRNME1EZ3dNVEV5TXpNegpORm93RlRFVE1CRUdBMVVFQ2hNS2EzVmlaWEp1WlhSbGN6QlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VICkEwSUFCRzcvQVVjZ3VsVFhpZ1JpT2hkeWk0a1BycmJNenZqZXZYdXhKMDJkN1pEYVlkMmtzeStQVkZTcDM0a0YKSmE4ZEdWN0VnZHlWQlVZeGZVU0Z0UGpleFBHallUQmZNQTRHQTFVZER3RUIvd1FFQXdJQ2hEQWRCZ05WSFNVRQpGakFVQmdnckJnRUZCUWNEQVFZSUt3WUJCUVVIQXdJd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFCkZnUVUycmptRW1vbTJPYnVJYUhzTFNrQTFnamFYUHN3Q2dZSUtvWkl6ajBFQXdJRFNBQXdSUUloQU9CZWVyWlUKTXhHN1ErczV2OTR4QjUvVE9XaUd5MXRCOVk0aTUxZERFZkNYQWlBLzg1VEs3VDRlWGtDakFqaW1QU0Y3ZUZWago2c1NJbGd0WGhZWHpUUUVSZWc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
|
|
||||||
contexts:
|
|
||||||
- name: oidc@k8s-tjo-cloud
|
|
||||||
context:
|
|
||||||
cluster: k8s-tjo-cloud
|
|
||||||
namespace: default
|
|
||||||
user: oidc
|
|
||||||
current-context: oidc@k8s-tjo-cloud
|
|
||||||
users:
|
|
||||||
- name: oidc
|
|
||||||
user:
|
|
||||||
exec:
|
|
||||||
apiVersion: client.authentication.k8s.io/v1beta1
|
|
||||||
command: kubectl
|
|
||||||
args:
|
|
||||||
- oidc-login
|
|
||||||
- get-token
|
|
||||||
- --oidc-issuer-url=https://id.tjo.space/application/o/k8stjocloud/
|
|
||||||
- --oidc-client-id=HAI6rW0EWtgmSPGKAJ3XXzubQTUut2GMeTRS2spg
|
|
||||||
- --oidc-extra-scope=profile
|
|
25
proxmox.tjo.cloud/.terraform.lock.hcl
Normal file
25
proxmox.tjo.cloud/.terraform.lock.hcl
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
# This file is maintained automatically by "tofu init".
|
||||||
|
# Manual edits may be lost in future updates.
|
||||||
|
|
||||||
|
provider "registry.opentofu.org/bpg/proxmox" {
|
||||||
|
version = "0.61.1"
|
||||||
|
constraints = "0.61.1"
|
||||||
|
hashes = [
|
||||||
|
"h1:6kz2Rdjc8+TVq2aUxEQXLOwbb9OdhJJei0L1fC4K2R4=",
|
||||||
|
"zh:27d8b589a2dc1e0a5b0f8ab299b9f3704a2f0b69799d1d4d8845c68056986d1f",
|
||||||
|
"zh:46dfa6b33ddd7007a2144f38090457604eb56a59a303b37bb0ad1be5c84ddaca",
|
||||||
|
"zh:47a1b14a759393c5ecc76f2feb950677c418c910b8c677fde0dd3e4675c41579",
|
||||||
|
"zh:582e49d109d1c2b1f3b1268a7cbc43548f3c6d96a87c92a5428767097a5e383e",
|
||||||
|
"zh:5e98ad6afae5969a4c3ffb14c0484936550c66c8313d7686551c29b633ff32f2",
|
||||||
|
"zh:7b9e24b76f947ab8f1e571cf61beefc983b7d2aa1b85df35c4f015728fe37a38",
|
||||||
|
"zh:8255ca210f279a0f7b8ca2762df26d2ea1a01704298c5e3d5cf601bd39a743f0",
|
||||||
|
"zh:85d7655fdc95dedced9cf8105a0beeb0d7bc8f668c55f62019a7215a76d60300",
|
||||||
|
"zh:8aeea5a1d001b06baaf923b754e1a14d06c75eb8c8b87a7f65a3c8205fc8b079",
|
||||||
|
"zh:a9cfab6c06f613658c5fdd83742cd22c0eb7563778924b1407965ef8c36c1ce0",
|
||||||
|
"zh:ceaab67801d49a92eb5858b1ddae6df2569462e5ffbe31f9dbd79dcb684ea142",
|
||||||
|
"zh:dc25b506d5c55d1d78a335d3ebd03213c99b4b2a5859812349a955c2f746ff7e",
|
||||||
|
"zh:e04b477fd77a0d37a0bdb76a7cf69184dad9e7fbba9b4f3a378a8901b82b75e5",
|
||||||
|
"zh:f1e6838d9141557f73340df9b21fce5a82b41cc16ae36f063a920ccc36bc0758",
|
||||||
|
"zh:f26e0763dbe6a6b2195c94b44696f2110f7f55433dc142839be16b9697fa5597",
|
||||||
|
]
|
||||||
|
}
|
37
proxmox.tjo.cloud/configuration.nix
Normal file
37
proxmox.tjo.cloud/configuration.nix
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
{ lib, pkgs, ... }:
|
||||||
|
{
|
||||||
|
system.stateVersion = "24.05";
|
||||||
|
|
||||||
|
boot.loader.systemd-boot.enable = true;
|
||||||
|
|
||||||
|
services.qemuGuest.enable = true;
|
||||||
|
|
||||||
|
services.cloud-init = {
|
||||||
|
enable = true;
|
||||||
|
network.enable = true;
|
||||||
|
settings = lib.mkOptionDefault {
|
||||||
|
datasource = {
|
||||||
|
NoCloud = { };
|
||||||
|
ConfigDrive = { };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Needed due to cloud-init.network.enable = true
|
||||||
|
networking.useNetworkd = true;
|
||||||
|
|
||||||
|
# Create default user
|
||||||
|
security.sudo.wheelNeedsPassword = false;
|
||||||
|
nix.settings.trusted-users = [ "nixos" ];
|
||||||
|
users.users.nixos = {
|
||||||
|
isNormalUser = true;
|
||||||
|
password = "hunter2";
|
||||||
|
extraGroups = [ "wheel" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
nix.settings.experimental-features = [
|
||||||
|
"nix-command"
|
||||||
|
"flakes"
|
||||||
|
];
|
||||||
|
environment.systemPackages = [ pkgs.nginx ];
|
||||||
|
}
|
101
proxmox.tjo.cloud/flake.lock
Normal file
101
proxmox.tjo.cloud/flake.lock
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"flake-utils": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1667395993,
|
||||||
|
"narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixlib": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1723942470,
|
||||||
|
"narHash": "sha256-QdSArN0xKESEOTcv+3kE6yu4B4WX9lupZ4+Htx3RXGg=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "nixpkgs.lib",
|
||||||
|
"rev": "531a2e8416a6d8200a53eddfbdb8f2c8dc4a1251",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "nixpkgs.lib",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixos-generators": {
|
||||||
|
"inputs": {
|
||||||
|
"nixlib": "nixlib",
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1724028932,
|
||||||
|
"narHash": "sha256-U11ZiQPrpIBdv7oS23bNdX9GCxe/hPf/ARr64P2Wj1Y=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "nixos-generators",
|
||||||
|
"rev": "5fd22603892e4ec5ac6085058ed658243143aacd",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "nixos-generators",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1724316499,
|
||||||
|
"narHash": "sha256-Qb9MhKBUTCfWg/wqqaxt89Xfi6qTD3XpTzQ9eXi3JmE=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "797f7dc49e0bc7fab4b57c021cdf68f595e47841",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-24.05",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"nixos-generators": "nixos-generators",
|
||||||
|
"nixpkgs": "nixpkgs",
|
||||||
|
"xc": "xc"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"xc": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils",
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1724081153,
|
||||||
|
"narHash": "sha256-j2bfrmjBSf87ByVSGUaNzHk3Hh605/rOjar3slWAhjQ=",
|
||||||
|
"owner": "joerdav",
|
||||||
|
"repo": "xc",
|
||||||
|
"rev": "48e28d6f29623b0c2eedce688fcb7d29f0d2976e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "joerdav",
|
||||||
|
"repo": "xc",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
70
proxmox.tjo.cloud/flake.nix
Normal file
70
proxmox.tjo.cloud/flake.nix
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
{
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.05";
|
||||||
|
nixos-generators = {
|
||||||
|
url = "github:nix-community/nixos-generators";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
xc = {
|
||||||
|
url = "github:joerdav/xc";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs =
|
||||||
|
{
|
||||||
|
nixpkgs,
|
||||||
|
nixos-generators,
|
||||||
|
xc,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
pkgsForSystem =
|
||||||
|
system:
|
||||||
|
import nixpkgs {
|
||||||
|
inherit system;
|
||||||
|
overlays = [ (final: prev: { xc = xc.packages.${system}.xc; }) ];
|
||||||
|
};
|
||||||
|
allVMs = [
|
||||||
|
"x86_64-linux"
|
||||||
|
"aarch64-linux"
|
||||||
|
];
|
||||||
|
forAllVMs =
|
||||||
|
f:
|
||||||
|
nixpkgs.lib.genAttrs allVMs (
|
||||||
|
system:
|
||||||
|
f {
|
||||||
|
inherit system;
|
||||||
|
pkgs = pkgsForSystem system;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
in
|
||||||
|
{
|
||||||
|
packages = forAllVMs (
|
||||||
|
{ system, pkgs }:
|
||||||
|
{
|
||||||
|
vm = nixos-generators.nixosGenerate {
|
||||||
|
format = "qcow-efi";
|
||||||
|
system = system;
|
||||||
|
|
||||||
|
specialArgs = {
|
||||||
|
pkgs = pkgs;
|
||||||
|
};
|
||||||
|
|
||||||
|
modules = [
|
||||||
|
# Pin nixpkgs to the flake input, so that the packages installed
|
||||||
|
# come from the flake inputs.nixpkgs.url.
|
||||||
|
(
|
||||||
|
{ ... }:
|
||||||
|
{
|
||||||
|
nix.registry.nixpkgs.flake = nixpkgs;
|
||||||
|
}
|
||||||
|
)
|
||||||
|
# Apply the rest of the config.
|
||||||
|
./configuration.nix
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
18
proxmox.tjo.cloud/justfile
Normal file
18
proxmox.tjo.cloud/justfile
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
default:
|
||||||
|
@just --list
|
||||||
|
|
||||||
|
build:
|
||||||
|
@nix build .#vm
|
||||||
|
|
||||||
|
apply: build
|
||||||
|
#!/usr/bin/env sh
|
||||||
|
export NIXOS_IMAGE=$(nix path-info --quiet .#vm)/nixos.qcow2
|
||||||
|
export TF_VAR_image_path=$NIXOS_IMAGE
|
||||||
|
|
||||||
|
echo "Deploying $NIXOS_IMAGE"
|
||||||
|
tofu init
|
||||||
|
tofu apply
|
||||||
|
|
||||||
|
destroy:
|
||||||
|
#!/usr/bin/env sh
|
||||||
|
tofu destroy
|
50
proxmox.tjo.cloud/main.tf
Normal file
50
proxmox.tjo.cloud/main.tf
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
variable "storage" {
|
||||||
|
type = string
|
||||||
|
default = "proxmox-backup-tjo-cloud"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "node_name" {
|
||||||
|
type = string
|
||||||
|
default = "hetzner"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "proxmox_token" {
|
||||||
|
type = string
|
||||||
|
sensitive = true
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "image_path" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
terraform {
|
||||||
|
required_providers {
|
||||||
|
proxmox = {
|
||||||
|
source = "bpg/proxmox"
|
||||||
|
version = "0.61.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
required_version = "~> 1.7.3"
|
||||||
|
}
|
||||||
|
|
||||||
|
provider "proxmox" {
|
||||||
|
# FIXME: Traefik/NGINX breaks this! 500 ERROR
|
||||||
|
endpoint = "https://178.63.49.225:8006/api2/json"
|
||||||
|
insecure = true
|
||||||
|
api_token = var.proxmox_token
|
||||||
|
ssh {
|
||||||
|
agent = true
|
||||||
|
username = "root"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "proxmox_virtual_environment_file" "nixos-cloudinit" {
|
||||||
|
content_type = "iso"
|
||||||
|
datastore_id = var.storage
|
||||||
|
node_name = var.node_name
|
||||||
|
|
||||||
|
source_file {
|
||||||
|
path = var.image_path
|
||||||
|
file_name = "nixos-cloudinit.img"
|
||||||
|
}
|
||||||
|
}
|
1
proxmox.tjo.cloud/result
Symbolic link
1
proxmox.tjo.cloud/result
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
/nix/store/mli7a1r5dfnhn2fjn6y0h0vdybc648q6-nixos-disk-image
|
Loading…
Reference in a new issue