Skip to content

Commit 14d1f94

Browse files
committed
init terraform & dev flakeModule
using sops for secrets here as well, setups the uaq tunnel and email routing
1 parent 7940e17 commit 14d1f94

11 files changed

+281
-5
lines changed

.envrc

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
use flake

.gitignore

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# Direnv generated cache
2+
/.direnv
3+
4+
# Local .terraform directories
5+
**/.terraform/*
6+
7+
# .tfstate files
8+
*.tfstate
9+
*.tfstate.*
10+
11+
# Crash log files
12+
crash.log
13+
crash.*.log
14+
15+
# Exclude all .tfvars files, which are likely to contain sensitive data, such as
16+
# password, private keys, and other secrets. These should not be part of version
17+
# control as they are data points which are potentially sensitive and subject
18+
# to change depending on the environment.
19+
*.tfvars
20+
*.tfvars.json
21+
22+
# Ignore override files as they are usually used to override resources locally and so
23+
# are not checked in
24+
override.tf
25+
override.tf.json
26+
*_override.tf
27+
*_override.tf.json
28+
29+
# Ignore transient lock info files created by terraform apply
30+
.terraform.tfstate.lock.info
31+
32+
# Include override files you do wish to add to version control using negated pattern
33+
# !example_override.tf
34+
35+
# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan
36+
# example: *tfplan*
37+
38+
# Ignore CLI configuration files
39+
.terraformrc
40+
terraform.rc

.sops.yaml

+5
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,8 @@ creation_rules:
77
- age:
88
- *user_rmu
99
- *server_uaq
10+
- path_regex: terraform/[^/]+\.(yaml|json|env|ini)$
11+
key_groups:
12+
- age:
13+
- *user_rmu
14+

dev/default.nix

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
{
2+
perSystem = {
3+
l,
4+
pkgs,
5+
...
6+
}: {
7+
treefmt.config.projectRootFile = "../flake.nix";
8+
treefmt.config.programs = {
9+
statix.enable = true;
10+
deadnix.enable = true;
11+
alejandra.enable = true;
12+
13+
terraform.enable = true;
14+
};
15+
16+
devShells.default = pkgs.mkShell {
17+
packages = l.attrValues {
18+
inherit
19+
(pkgs)
20+
sops
21+
ssh-to-age
22+
opentofu
23+
terraform-ls
24+
;
25+
};
26+
};
27+
};
28+
}

flake.lock

+36-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

flake.nix

+9-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,13 @@
88
...
99
}:
1010
flake-parts.lib.mkFlake {inherit inputs;} {
11+
imports = [
12+
{perSystem = {lib, ...}: {_module.args.l = lib // builtins;};}
13+
14+
./dev
15+
inputs.treefmt-nix.flakeModule
16+
];
17+
1118
flake.nixosConfigurations.uaq = nixpkgs.lib.nixosSystem {
1219
system = "x86_64-linux";
1320
specialArgs = {inherit inputs self;};
@@ -21,7 +28,7 @@
2128
roles-matrix-homeserver = ./modules/roles/matrix-homeserver.nix;
2229
};
2330

24-
systems = ["x86_64-linux"];
31+
systems = ["x86_64-linux" "aarch64-darwin"];
2532
};
2633

2734
inputs = {
@@ -32,5 +39,6 @@
3239
srvos.url = "github:nix-community/srvos/63ea710b10c88f2158251d49eec7cc286cefbd68";
3340

3441
sops-nix.url = "github:Mic92/sops-nix";
42+
treefmt-nix.url = "github:numtide/treefmt-nix";
3543
};
3644
}

secrets/server.yaml

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ tailscale:
22
authKey: ENC[AES256_GCM,data:UqYlhwxGqPqHWespWKEV+JVrP+tn0pAJ2Klj/3hemtEqZ0ANIJE/t6WsSFLKfthbyTQjurI48/vXExx+BBQ=,iv:MAR7Mk5XjFlswRfFWs+2USo7g2WcOWsLxPUVdpUzyag=,tag:gJjS8R5SB4jIGe6ygcv2Vw==,type:str]
33
cloudflare:
44
tunnels:
5-
uaq: ENC[AES256_GCM,data:OaIb,iv:dqWE8f3W+d8sPbzdKBYXWzn5pFFIXqz0BUj5oKrSJuU=,tag:UwmSjEkDnFMl1K7aNEhs8g==,type:str]
5+
uaq: ENC[AES256_GCM,data:vj1ZhFAcj7q7joMfN+iqUqpF3MYUGwWxDPVW7VMvtYFFmb4WhJR1BrRqme4=,iv:MaRZG5BFuOD7g82Gxo9eG+KgbwNkSuSlYt3yCtkyjOc=,tag:FuaYcPHZNIRxjO5/yfo6rA==,type:str]
66
matrix:
77
slidingSync: ENC[AES256_GCM,data:415cxFdNcnh0Het+B2meHVTXUFDBzWoVMB285ffVhGKVljpjW6Kiya/dfnvJZHDUM+Va5H0RQkZllMl3S+7bjmwZAW0nKMI9cPabT8UU,iv:8vh0PFMch3zK/T0PEQSNDJ70DIDhGzHRYnT9blD1V5E=,tag:Ff2U2pG0LSwE5nlMaH19sg==,type:str]
88
registrationKey: ENC[AES256_GCM,data:63PmPChr1xbTNwTdsxsAC7dOXNYpjZHRYiiD1kcuOX+lhV4NlAT7KtC0J9Sst/9fp6iuYg==,iv:i+15UpnbRLhYv/WCfFTJqbTRBeCB/T+1+ntTEB7tqLk=,tag:N0sL7vXOJEMxTOv7ojLC0w==,type:str]
@@ -31,8 +31,8 @@ sops:
3131
d0hBMEVrWExwdFB3dUZjSm5YUDJzU1kKVGKKYyG3h2FQuU7K74+O7q0WlzIl1vAF
3232
pir2NWOKR8C1FG1czAR2nytPH/bgndp1aL+7vGNg6Z+QEIlsY2WYEQ==
3333
-----END AGE ENCRYPTED FILE-----
34-
lastmodified: "2024-09-25T12:50:16Z"
35-
mac: ENC[AES256_GCM,data:c4GGx37oC3oouIG3f/MxjDBmD6oIqOQtCOEU4ZtDOMzgjwXo+cn3yLEhBWpqwVFx/qbew2n4sW5tkNLVs/r+CH9KO35Ni+B+vZARyhVvcQ6EE/kZATmVKnujMd4AsN+788a6/x3kVhoLtcnwrvBtPtlV57yNb3tSotOIXpdfmq4=,iv:uDRixmRbyWFbO/eidsbQyusB8Za4qsSXSGKbyhleL4M=,tag:2vxydA4Cs7bOXzJp8tkExg==,type:str]
34+
lastmodified: "2024-09-25T22:45:51Z"
35+
mac: ENC[AES256_GCM,data:M/5VHzmuhZxQv0BVGqngXZ3oJEuf4dgspBH9V36PavpRlRmSzJxl0uqq9eydhSV3KCr8UB9aMII2cEOu87mBNTLgjNKIN6qX9lf5Rk7Mk+jeGwH38SlIzlw8kVBR2OiIeDgV5a7Mirz8ruui3jQ9Gbf3tEHG8jpNoywEYbcNFlI=,iv:ym6k88GB00z371EwR+Q0DrP0sBELH7z5ZmS5qoA4gJQ=,tag:UL48S8hCdKPk9AWK5bg5pA==,type:str]
3636
pgp: []
3737
unencrypted_suffix: _unencrypted
3838
version: 3.9.0

terraform/.terraform.lock.hcl

+57
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

terraform/cloudflare.tf

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
locals {
2+
account_id = "5dd366da8efa3edd54b306fad16911b6"
3+
4+
codershq-ae_zone_id = "8ac9c1caeb68da365765acef4de02ddd"
5+
golang-ae_zone_id = "d74bb219f0939f2f509ff3c61d2fe8bd"
6+
7+
# Alias
8+
uaq_tunnel = cloudflare_zero_trust_tunnel_cloudflared.uaq_tunnel
9+
}
10+
11+
resource "cloudflare_zero_trust_tunnel_cloudflared" "uaq_tunnel" {
12+
account_id = local.account_id
13+
name = "UAQ Instance Tunnel. Managed by Nix"
14+
secret = data.sops_file.chq.data["cloudflare.tunnels.uaqSecret"]
15+
}
16+
17+
resource "cloudflare_record" "codershq_tunnel_cname" {
18+
zone_id = local.codershq-ae_zone_id
19+
name = "uaq_tunnel"
20+
content = local.uaq_tunnel.cname
21+
type = "CNAME"
22+
proxied = true
23+
}
24+
25+
resource "cloudflare_record" "golang_tunnel_cname" {
26+
zone_id = local.golang-ae_zone_id
27+
name = "uaq_tunnel"
28+
content = local.uaq_tunnel.cname
29+
type = "CNAME"
30+
proxied = true
31+
}
32+
33+
resource "cloudflare_email_routing_rule" "cm-golang-ae" {
34+
zone_id = local.golang-ae_zone_id
35+
name = "GoUAE Community Manager Email"
36+
enabled = true
37+
38+
matcher {
39+
type = "literal"
40+
field = "to"
41+
42+
}
43+
44+
# NOTE(2024-09-26): CF's Email Routing limits destination addresses to a single address
45+
action {
46+
type = "forward"
47+
value = ["[email protected]"]
48+
}
49+
}

terraform/providers.tf

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
terraform {
2+
required_providers {
3+
cloudflare = {
4+
source = "cloudflare/cloudflare"
5+
}
6+
7+
sops = {
8+
source = "carlpett/sops"
9+
version = "1.1.1"
10+
}
11+
12+
random = {
13+
source = "hashicorp/random"
14+
version = "3.6.3"
15+
}
16+
}
17+
18+
required_version = ">= 1.8.0"
19+
}
20+
21+
data "sops_file" "chq" {
22+
source_file = "secrets.yaml"
23+
}
24+
25+
provider "cloudflare" {
26+
api_token = data.sops_file.chq.data["cloudflare.apiToken"]
27+
}
28+
29+
provider "random" {}

terraform/secrets.yaml

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
cloudflare:
2+
apiToken: ENC[AES256_GCM,data:jiFHQhiD7+WxiIZStK9kV6AvrOzkaRokagBUK5HZ68LCfPwkVF0yMg==,iv:i8focOAm5ZVIEkItzzz7ysdoaYp84abBCBqS4SBA9wA=,tag:1j9wguOF1W2e9Hg8m/4MQg==,type:str]
3+
tunnels:
4+
uaqSecret: ENC[AES256_GCM,data:Md7BMHEOyqJw5uUukbnfK/D+hwtrSyejCPWmsjiXB9yHGV05SZqKtybHsOM=,iv:2omdbKibNUmwICt/6ZSpaePS1huJDjZpKV63agw7vW8=,tag:hUnBl07WBL6rZ/bO952M7A==,type:str]
5+
sops:
6+
kms: []
7+
gcp_kms: []
8+
azure_kv: []
9+
hc_vault: []
10+
age:
11+
- recipient: age1jekavujwuvcqd76tl06nq4um3gd0sgdek2y3xquh3xuqxkyucyxqyjturt
12+
enc: |
13+
-----BEGIN AGE ENCRYPTED FILE-----
14+
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAwM2NDYzIvWGE2Q0NXV1Y5
15+
NCt6Titmdjh1Ykx6TE9UOExsMWEwL2tMRkQwCjUxSFN1aTRiSDhyR1FqZEI1Sy9r
16+
MjE2R0NaRzlhdUZyV1dNV2RnMnpQaHcKLS0tIGtIK2xxMjQxb2tjOW9qWHcreUFF
17+
OEdjVERKdUw2UmoyVXZ6V0JrZGNKQTAK6/z5Leor7smHWY0rWc4wfuutPARckLpV
18+
1WHIXSyutnwatXaaooP0AcbNI16/L0SH12B90je0S9c7TY+DTcIMqQ==
19+
-----END AGE ENCRYPTED FILE-----
20+
lastmodified: "2024-09-25T22:51:22Z"
21+
mac: ENC[AES256_GCM,data:scvmdASyCjI/If0Gglnzgd8nt+bWxLBQbs9RASp53gkkYChO48LOwFZKx0ruuGSZ9nqcGenOYJ1hOs0ZiTOZ1tdfi5Pwl4l3MO/fIf1jiME2B4dZnOal8xptrLpdYSQLxShkjLNyiDcuzf2xnvf8KyPuzzf16CiXecQzLaDlZzE=,iv:56x+64KkUVagfOhtXD+oPwhgnK7H//e3WCiQTqmTgc4=,tag:DV7oLRmccOACU85nBK4ilg==,type:str]
22+
pgp: []
23+
unencrypted_suffix: _unencrypted
24+
version: 3.9.0

0 commit comments

Comments
 (0)