forked from extern/nixos-wiki-infra
first commit
This commit is contained in:
commit
2082b6ea8f
9
.envrc.private-template
Normal file
9
.envrc.private-template
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# Go to https://gitlab.com/-/profile/personal_access_tokens
|
||||||
|
export GITLAB_USER=<your-gitlab-username>
|
||||||
|
export GITLAB_TOKEN=<your-gitlab-token>
|
||||||
|
|
||||||
|
# https://app.netlify.com/user/applications#personal-access-tokens
|
||||||
|
export NETLIFY_TOKEN=<your-netlify-token>
|
||||||
|
|
||||||
|
# https://console.hetzner.cloud/projects/162464/security/tokens
|
||||||
|
export HCLOUD_TOKEN=<your-hetzner-token>
|
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/.envrc.private
|
69
flake.lock
Normal file
69
flake.lock
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"flake-parts": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs-lib": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1682984683,
|
||||||
|
"narHash": "sha256-fSMthG+tp60AHhNmaHc4StT3ltfHkQsJtN8GhfLWmtI=",
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "flake-parts",
|
||||||
|
"rev": "86684881e184f41aa322e653880e497b66429f3e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "flake-parts",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1683286087,
|
||||||
|
"narHash": "sha256-xseOd7W7xwF5GOF2RW8qhjmVGrKoBz+caBlreaNzoeI=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "3e313808bd2e0a0669430787fb22e43b2f4bf8bf",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-parts": "flake-parts",
|
||||||
|
"nixpkgs": "nixpkgs",
|
||||||
|
"treefmt-nix": "treefmt-nix"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"treefmt-nix": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1683307174,
|
||||||
|
"narHash": "sha256-A7nF2Q+F+Bqs4u6VS4aOzyURfly5f4ZAiihGU0FA29g=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "treefmt-nix",
|
||||||
|
"rev": "b44794f94514b61512352a18cd77c710f0005f15",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "treefmt-nix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
36
flake.nix
Normal file
36
flake.nix
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
{
|
||||||
|
description = "Dependencies to deploy a nixos-wiki";
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||||
|
flake-parts.url = "github:hercules-ci/flake-parts";
|
||||||
|
flake-parts.inputs.nixpkgs-lib.follows = "nixpkgs";
|
||||||
|
treefmt-nix.url = "github:numtide/treefmt-nix";
|
||||||
|
treefmt-nix.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = inputs@{ flake-parts, ... }:
|
||||||
|
flake-parts.lib.mkFlake { inherit inputs; } ({ lib, ... }: {
|
||||||
|
systems = lib.systems.flakeExposed;
|
||||||
|
imports = [
|
||||||
|
inputs.treefmt-nix.flakeModule
|
||||||
|
./terraform/targets/flake-module.nix
|
||||||
|
];
|
||||||
|
perSystem = { config, pkgs, ... }: {
|
||||||
|
treefmt = {
|
||||||
|
projectRootFile = "flake.nix";
|
||||||
|
programs.terraform.enable = true;
|
||||||
|
programs.nixpkgs-fmt.enable = true;
|
||||||
|
};
|
||||||
|
packages.default = pkgs.mkShell {
|
||||||
|
packages = [
|
||||||
|
pkgs.bashInteractive
|
||||||
|
(pkgs.terraform.withPlugins (p: [
|
||||||
|
p.netlify
|
||||||
|
p.hcloud
|
||||||
|
]))
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
16
terraform/.terraform.lock.hcl
Normal file
16
terraform/.terraform.lock.hcl
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
# This file is maintained automatically by "terraform init".
|
||||||
|
# Manual edits may be lost in future updates.
|
||||||
|
|
||||||
|
provider "registry.terraform.io/aegirhealth/netlify" {
|
||||||
|
version = "0.6.12"
|
||||||
|
hashes = [
|
||||||
|
"h1:jorNWhgRCghXD0F6S7urDp1dPeczpFMTGttLeYAdbuo=",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
provider "registry.terraform.io/hetznercloud/hcloud" {
|
||||||
|
version = "1.38.2"
|
||||||
|
hashes = [
|
||||||
|
"h1:RVMJb7bPzN6xrsIpegNBpSlx8pnhowWV9mzsvPFPvRU=",
|
||||||
|
]
|
||||||
|
}
|
18
terraform/modules/wiki/dns.tf
Normal file
18
terraform/modules/wiki/dns.tf
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
resource "netlify_dns_zone" "nixos" {
|
||||||
|
site_id = ""
|
||||||
|
name = var.netlify_dns_zone
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "netlify_dns_record" "nixos_wiki_a" {
|
||||||
|
zone_id = var.zone_id
|
||||||
|
hostname = var.domain
|
||||||
|
type = "A"
|
||||||
|
value = hcloud_server.nixos_wiki.ipv4_address
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "netlify_dns_record" "nixos_wiki_aaaa" {
|
||||||
|
zone_id = var.zone_id
|
||||||
|
hostname = var.domain
|
||||||
|
type = "AAAA"
|
||||||
|
value = hcloud_server.nixos_wiki.ipv6_address
|
||||||
|
}
|
40
terraform/modules/wiki/main.tf
Normal file
40
terraform/modules/wiki/main.tf
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
# Record the SSH public key into Hetzner Cloud
|
||||||
|
resource "hcloud_ssh_key" "hcloud" {
|
||||||
|
for_each = var.admin_ssh_keys
|
||||||
|
name = each.key
|
||||||
|
public_key = each.value
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "hcloud_server" "nixos_wiki" {
|
||||||
|
image = "debian-10"
|
||||||
|
keep_disk = true
|
||||||
|
name = "nixos-wiki"
|
||||||
|
server_type = var.server_type
|
||||||
|
ssh_keys = data.hcloud_ssh_key.hcloud[*].id
|
||||||
|
backups = false
|
||||||
|
labels = var.tags
|
||||||
|
|
||||||
|
location = var.server_location
|
||||||
|
|
||||||
|
lifecycle {
|
||||||
|
# Don't destroy server instance if ssh keys changes.
|
||||||
|
ignore_changes = [ssh_keys]
|
||||||
|
prevent_destroy = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module "deploy" {
|
||||||
|
depends_on = [ local_file.nixos_vars ]
|
||||||
|
source = "github.com/numtide/nixos-anywhere//terraform/all-in-one"
|
||||||
|
nixos_system_attr = ".#nixosConfigurations.${var.nixos_flake_attr}.config.system.build.toplevel"
|
||||||
|
nixos_partitioner_attr = ".#nixosConfigurations.${var.nixos_flake_attr}.config.system.build.diskoNoDeps"
|
||||||
|
target_host = hcloud_server.nixos-wiki.ipv4_address
|
||||||
|
instance_id = hcloud_server.nixos-wiki.id
|
||||||
|
debug_logging = true
|
||||||
|
}
|
||||||
|
|
||||||
|
locals {
|
||||||
|
nixos_vars = {
|
||||||
|
ipv6_address = hcloud_server.nixos_wiki.ipv6_address
|
||||||
|
}
|
||||||
|
}
|
18
terraform/modules/wiki/nixos_vars.tf
Normal file
18
terraform/modules/wiki/nixos_vars.tf
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
resource "local_file" "nixos_vars" {
|
||||||
|
content = jsonencode(local.nixos_vars)
|
||||||
|
filename = var.nixos_vars_file
|
||||||
|
file_permission = "600"
|
||||||
|
|
||||||
|
provisioner "local-exec" {
|
||||||
|
interpreter = ["bash", "-c"]
|
||||||
|
command = "git add -f '${local_file.nixos_vars.filename}'"
|
||||||
|
}
|
||||||
|
# also pro-actively add hosts and flake-module.nix to git so nix can find it.
|
||||||
|
provisioner "local-exec" {
|
||||||
|
interpreter = ["bash", "-c"]
|
||||||
|
command = <<EOT
|
||||||
|
git add "$(dirname '${local_file.nixos_vars.filename}')"/{hosts,flake-module.nix}
|
||||||
|
EOT
|
||||||
|
on_failure = continue
|
||||||
|
}
|
||||||
|
}
|
7
terraform/modules/wiki/providers.tf
Normal file
7
terraform/modules/wiki/providers.tf
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
terraform {
|
||||||
|
required_providers {
|
||||||
|
netlify = { source = "AegirHealth/netlify" }
|
||||||
|
hcloud = { source = "hetznercloud/hcloud" }
|
||||||
|
local = { source = "hashicorp/local" }
|
||||||
|
}
|
||||||
|
}
|
31
terraform/modules/wiki/variables.tf
Normal file
31
terraform/modules/wiki/variables.tf
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
variable "admin_ssh_keys" {
|
||||||
|
type = map(string)
|
||||||
|
description = "SSH public keys for admin user (name -> key)"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "server_type" {
|
||||||
|
type = string
|
||||||
|
default = "cx21"
|
||||||
|
description = "Hetzner cloud server type"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "server_location" {
|
||||||
|
type = string
|
||||||
|
default = "hel1"
|
||||||
|
description = "Hetzner cloud server location"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "netlify_dns_zone" {
|
||||||
|
type = string
|
||||||
|
description = "Netlify DNS zone"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "nixos_vars_file" {
|
||||||
|
type = string
|
||||||
|
description = "File to write NixOS configuration variables to"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "nixos_flake_attr" {
|
||||||
|
type = string
|
||||||
|
description = "NixOS configuration flake attribute"
|
||||||
|
}
|
26
terraform/targets/flake-module.nix
Normal file
26
terraform/targets/flake-module.nix
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
{ lib, self, ... }:
|
||||||
|
let
|
||||||
|
collectNixosHosts = { directory }:
|
||||||
|
lib.mapAttrs'
|
||||||
|
(name: _:
|
||||||
|
lib.nameValuePair
|
||||||
|
name
|
||||||
|
(lib.nixosSystem {
|
||||||
|
system = "x86_64-linux";
|
||||||
|
# Make flake available in modules
|
||||||
|
specialArgs = {
|
||||||
|
self = {
|
||||||
|
inputs = self.inputs;
|
||||||
|
nixosModules = self.nixosModules;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
modules = [ (directory + "/${name}/configuration.nix") ];
|
||||||
|
}))
|
||||||
|
(builtins.readDir directory);
|
||||||
|
in
|
||||||
|
{
|
||||||
|
flake.nixosConfigurations = collectNixosHosts {
|
||||||
|
directory = ".";
|
||||||
|
};
|
||||||
|
}
|
1
terraform/targets/nixos-wiki.thalheim.io/apply.sh
Symbolic link
1
terraform/targets/nixos-wiki.thalheim.io/apply.sh
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../staging.nixos-wiki.thalheim.io/apply.sh
|
@ -0,0 +1,3 @@
|
|||||||
|
{...}: {
|
||||||
|
|
||||||
|
}
|
20
terraform/targets/nixos-wiki.thalheim.io/terraform.tf
Normal file
20
terraform/targets/nixos-wiki.thalheim.io/terraform.tf
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
terraform {
|
||||||
|
backend "http" {
|
||||||
|
address = "https://gitlab.com/api/v4/projects/45776186/terraform/state/nixos-wiki.thalheim.io"
|
||||||
|
lock_address = "https://gitlab.com/api/v4/projects/45776186/terraform/state/nixos-wiki.thalheim.io/lock"
|
||||||
|
unlock_address = "https://gitlab.com/api/v4/projects/45776186/terraform/state/nixos-wiki.thalheim.io/lock"
|
||||||
|
lock_method = "POST"
|
||||||
|
unlock_method = "DELETE"
|
||||||
|
retry_wait_min = "5"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module "wiki" {
|
||||||
|
source = "${path.module}/../../modules/nixos-wiki.thalheim.io"
|
||||||
|
admin_ssh_keys = {
|
||||||
|
mic92 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKbBp2dH2X3dcU1zh+xW3ZsdYROKpJd3n13ssOP092qE joerg@turingmachine"
|
||||||
|
}
|
||||||
|
netlify_dns_zone = "wiki.thalheim.io"
|
||||||
|
nixos_flake_attr = "nixos-wiki-production"
|
||||||
|
nixos_vars_file = "${path.module}/nixos-vars.json"
|
||||||
|
}
|
7
terraform/targets/staging.nixos-wiki.thalheim.io/apply.sh
Executable file
7
terraform/targets/staging.nixos-wiki.thalheim.io/apply.sh
Executable file
@ -0,0 +1,7 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
rm -f .terraform.lock.hcl
|
||||||
|
terraform init -backend-config="password=$GITLAB_TOKEN" -backend-config="username=$GITLAB_USER"
|
||||||
|
terraform apply
|
||||||
|
|
@ -0,0 +1,3 @@
|
|||||||
|
{...}: {
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
terraform {
|
||||||
|
backend "http" {
|
||||||
|
address = "https://gitlab.com/api/v4/projects/45776186/terraform/state/staging.nixos-wiki.thalheim.io"
|
||||||
|
lock_address = "https://gitlab.com/api/v4/projects/45776186/terraform/state/staging.nixos-wiki.thalheim.io/lock"
|
||||||
|
unlock_address = "https://gitlab.com/api/v4/projects/45776186/terraform/state/staging.nixos-wiki.thalheim.io/lock"
|
||||||
|
lock_method = "POST"
|
||||||
|
unlock_method = "DELETE"
|
||||||
|
retry_wait_min = "5"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module "wiki" {
|
||||||
|
source = "${path.module}/../../modules/staging.nixos-wiki.thalheim.io"
|
||||||
|
admin_ssh_keys = {
|
||||||
|
mic92 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKbBp2dH2X3dcU1zh+xW3ZsdYROKpJd3n13ssOP092qE joerg@turingmachine"
|
||||||
|
}
|
||||||
|
netlify_dns_zone = "wiki.thalheim.io"
|
||||||
|
nixos_flake_attr = "nixos-wiki-staging"
|
||||||
|
nixos_vars_file = "${path.module}/nixos-vars.json"
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user