Compare commits
No commits in common. "ec04275b345fc2f98615e178f913849bd3a58c95" and "c90c3e9f0c02b67b35b099e2b1bb7f090d9aa39c" have entirely different histories.
ec04275b34
...
c90c3e9f0c
|
@ -13,10 +13,6 @@ client = discord.Client(intents=intents, activity=discord.Game('Swearing at Twit
|
||||||
tree = app_commands.CommandTree(client)
|
tree = app_commands.CommandTree(client)
|
||||||
|
|
||||||
|
|
||||||
nitter_internal = os.environ['NITTER_URL']
|
|
||||||
nitter_external = os.getenv('NITTER_EXTERNAL_URL', nitter_internal)
|
|
||||||
|
|
||||||
|
|
||||||
@client.event
|
@client.event
|
||||||
async def on_ready():
|
async def on_ready():
|
||||||
await tree.sync()
|
await tree.sync()
|
||||||
|
@ -37,10 +33,8 @@ async def nitter(interaction: discord.Interaction, link: str):
|
||||||
await interaction.response.send_message('invalid twitter link', ephemeral=True)
|
await interaction.response.send_message('invalid twitter link', ephemeral=True)
|
||||||
return
|
return
|
||||||
|
|
||||||
internal_nitter_url = f'{nitter_internal}{urlparsed.path}'
|
nitter_url = f'https://nitter.gmem.ca{urlparsed.path}'
|
||||||
nitter_url = f'{nitter_external}{urlparsed.path}'
|
response = requests.get(nitter_url)
|
||||||
|
|
||||||
response = requests.get(internal_nitter_url)
|
|
||||||
# 4xx error codes
|
# 4xx error codes
|
||||||
if 399 < response.status_code < 500:
|
if 399 < response.status_code < 500:
|
||||||
await interaction.response.send_message('could not find tweet/user', ephemeral=True)
|
await interaction.response.send_message('could not find tweet/user', ephemeral=True)
|
||||||
|
|
60
dns/dns.nix
60
dns/dns.nix
|
@ -27,27 +27,26 @@
|
||||||
};
|
};
|
||||||
"cluster" = {
|
"cluster" = {
|
||||||
a = {
|
a = {
|
||||||
data = ["100.77.43.133"];
|
data = ["100.77.43.133" "100.121.5.8" "100.106.229.20"];
|
||||||
};
|
};
|
||||||
aaaa = {
|
aaaa = {
|
||||||
data = [
|
data = [
|
||||||
"fd7a:115c:a1e0:ab12:4843:cd96:624d:2b85"
|
"fd7a:115c:a1e0:ab12:4843:cd96:624d:2b85"
|
||||||
|
"fd7a:115c:a1e0:ab12:4843:cd96:626a:e514"
|
||||||
|
"fd7a:115c:a1e0::ad79:508"
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
"newcluster" = {
|
|
||||||
a = {
|
|
||||||
ttl = 3600;
|
|
||||||
data = ["100.87.208.14"];
|
|
||||||
};
|
|
||||||
aaaa = {
|
|
||||||
ttl = 3600;
|
|
||||||
data = [ "fd7a:115c:a1e0::2001:d00e" ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
"homelab" = {
|
"homelab" = {
|
||||||
a = {
|
a = {
|
||||||
data = ["192.168.50.45"];
|
data = ["192.168.50.146" "192.168.50.134" "192.168.50.144"];
|
||||||
|
};
|
||||||
|
aaaa = {
|
||||||
|
data = [
|
||||||
|
"2a02:1648:6709:0:da3a:ddff:fe18:f4ca"
|
||||||
|
"2a02:1648:6709:0:a5ab:461a:52b:f6c5"
|
||||||
|
"2a02:1648:6709:0:dea6:32ff:fea0:b84e"
|
||||||
|
];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
"_acme-challenge.router" = {
|
"_acme-challenge.router" = {
|
||||||
|
@ -58,39 +57,36 @@
|
||||||
}
|
}
|
||||||
// lib.attrsets.genAttrs [
|
// lib.attrsets.genAttrs [
|
||||||
# Internally hosted applications
|
# Internally hosted applications
|
||||||
|
"atuin"
|
||||||
|
"dref"
|
||||||
|
"freshrss"
|
||||||
|
"hb"
|
||||||
|
"home"
|
||||||
|
"hue"
|
||||||
"netboot"
|
"netboot"
|
||||||
|
"pipedapi"
|
||||||
|
"piped"
|
||||||
|
"request-media"
|
||||||
|
"tools"
|
||||||
|
"ytproxy"
|
||||||
"changedetect"
|
"changedetect"
|
||||||
] (name: {cname.data = "cluster";})
|
] (name: {cname.data = "cluster";})
|
||||||
// lib.attrsets.genAttrs [
|
|
||||||
# Internally hosted applications
|
|
||||||
"atuin"
|
|
||||||
"pipedapi"
|
|
||||||
"piped"
|
|
||||||
"tools"
|
|
||||||
"ytproxy"
|
|
||||||
"irc"
|
|
||||||
"hue"
|
|
||||||
"home"
|
|
||||||
"hb"
|
|
||||||
"rss"
|
|
||||||
"request-media"
|
|
||||||
"ntfy"
|
|
||||||
] (name: {cname.data = "newcluster";})
|
|
||||||
// lib.attrsets.genAttrs [
|
// lib.attrsets.genAttrs [
|
||||||
# Externally hosted applications with Tunnels
|
# Externally hosted applications with Tunnels
|
||||||
"authentik"
|
|
||||||
"photos"
|
|
||||||
"pw"
|
|
||||||
"nitter"
|
|
||||||
"git"
|
"git"
|
||||||
|
"authentik"
|
||||||
|
"games"
|
||||||
"ibiza"
|
"ibiza"
|
||||||
|
"matrix"
|
||||||
"photos"
|
"photos"
|
||||||
"proxmox"
|
"proxmox"
|
||||||
|
"pw"
|
||||||
"tokyo"
|
"tokyo"
|
||||||
|
"nitter"
|
||||||
] (name: {
|
] (name: {
|
||||||
cname = {
|
cname = {
|
||||||
ttl = 0;
|
ttl = 0;
|
||||||
data = "a1544154-d851-44ee-8d3a-9fa245867745.cfargotunnel.com.";
|
data = "b325b440-3d49-43e4-a028-be516e8f9bc3.cfargotunnel.com.";
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
{lib, ...}: let
|
{lib, ...}: let
|
||||||
tailscale =
|
tailscale =
|
||||||
lib.lists.forEach [
|
lib.lists.forEach [
|
||||||
|
"git"
|
||||||
"authentik"
|
"authentik"
|
||||||
|
"games"
|
||||||
"ibiza"
|
"ibiza"
|
||||||
"matrix"
|
"matrix"
|
||||||
"photos"
|
"photos"
|
||||||
|
@ -11,7 +13,7 @@
|
||||||
"nitter"
|
"nitter"
|
||||||
] (name: {
|
] (name: {
|
||||||
name = name + ".gmem.ca";
|
name = name + ".gmem.ca";
|
||||||
content = "newcluster.gmem.ca";
|
content = "cluster.gmem.ca";
|
||||||
});
|
});
|
||||||
home =
|
home =
|
||||||
lib.lists.forEach [
|
lib.lists.forEach [
|
||||||
|
|
36
flake.lock
36
flake.lock
|
@ -239,11 +239,11 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1714515075,
|
"lastModified": 1713906585,
|
||||||
"narHash": "sha256-azMK7aWH0eUc3IqU4Fg5rwZdB9WZBvimOGG3piqvtsY=",
|
"narHash": "sha256-fv84DCOkBtjF6wMATt0rfovu7e95L8rdEkSfNbwKR3U=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "home-manager",
|
"repo": "home-manager",
|
||||||
"rev": "6d3b6dc9222c12b951169becdf4b0592ee9576ef",
|
"rev": "bfa7c06436771e3a0c666ccc6ee01e815d4c33aa",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
@ -279,11 +279,11 @@
|
||||||
"nixpkgs-lib": "nixpkgs-lib"
|
"nixpkgs-lib": "nixpkgs-lib"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1714306226,
|
"lastModified": 1713701427,
|
||||||
"narHash": "sha256-CA7bfnDt9TcFc7I8eKHf72DodYUEETDPgmBFXBRP9/E=",
|
"narHash": "sha256-v6z8hz/UDaC/rbnkH+hxGFUxlNyseVntRetVpSxLU6c=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "lib-aggregate",
|
"repo": "lib-aggregate",
|
||||||
"rev": "49d9b510614b9bd137e067eb31445a8feca83313",
|
"rev": "3b32a98eb3053f8c8ca55497d1881443ef2996e6",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
@ -414,11 +414,11 @@
|
||||||
},
|
},
|
||||||
"nixos-hardware": {
|
"nixos-hardware": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1714465198,
|
"lastModified": 1713864415,
|
||||||
"narHash": "sha256-ySkEJvS0gPz2UhXm0H3P181T8fUxvDVcoUyGn0Kc5AI=",
|
"narHash": "sha256-/BPDMJEkrsFAFOsQWhwm31wezlgshPFlLBn34KEUdVA=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixos-hardware",
|
"repo": "nixos-hardware",
|
||||||
"rev": "68d680c1b7c0e67a9b2144d6776583ee83664ef4",
|
"rev": "797f8d8082c7cc3259cba7275c699d4991b09ecc",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
@ -446,11 +446,11 @@
|
||||||
},
|
},
|
||||||
"nixpkgs-lib": {
|
"nixpkgs-lib": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1714265296,
|
"lastModified": 1713660444,
|
||||||
"narHash": "sha256-jVnKiCOoFulPT1zDdA4jfG/lnEnngdth5CT6rVDXEJ4=",
|
"narHash": "sha256-2bVnrEGyWJhRNKspzfTJmVD/fsH9HQURD4cWpz79Ulw=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "nixpkgs.lib",
|
"repo": "nixpkgs.lib",
|
||||||
"rev": "ade4fb7bbf04cd52bc1705734d5dc67755d77ec9",
|
"rev": "6882347415e352cfc9c277cc01f73e0f5cb7b93c",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
@ -469,11 +469,11 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1714525911,
|
"lastModified": 1713978995,
|
||||||
"narHash": "sha256-XYARtyCpKeL0IosMSzeHl6YFblV3n4y7plM+K9fg4N4=",
|
"narHash": "sha256-eqAZRB3a7wf44Ek+g4c22CjkhFUcypmWCRyDkKZM328=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "nixpkgs-wayland",
|
"repo": "nixpkgs-wayland",
|
||||||
"rev": "4cbf82124f2c03fa5b1b669771c48f9927264684",
|
"rev": "e5f9ab26aa52ae7aee95b479652b54e2e5248da0",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
@ -532,11 +532,11 @@
|
||||||
},
|
},
|
||||||
"nixpkgs_5": {
|
"nixpkgs_5": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1714314149,
|
"lastModified": 1713805509,
|
||||||
"narHash": "sha256-yNAevSKF4krRWacmLUsLK7D7PlfuY3zF0lYnGYNi9vQ=",
|
"narHash": "sha256-YgSEan4CcrjivCNO5ZNzhg7/8ViLkZ4CB/GrGBVSudo=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "cf8cc1201be8bc71b7cbbbdaf349b22f4f99c7ae",
|
"rev": "1e1dc66fe68972a76679644a5577828b6a7e8be4",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|
34
flake.nix
34
flake.nix
|
@ -352,6 +352,40 @@
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
seattle = nixpkgs.lib.nixosSystem {
|
||||||
|
system = "aarch64-linux";
|
||||||
|
modules = [
|
||||||
|
nixos-hardware.nixosModules.raspberry-pi-4
|
||||||
|
agenix.nixosModules.default
|
||||||
|
(import ./nix/seattle/configuration.nix)
|
||||||
|
{
|
||||||
|
_module.args.nixinate = {
|
||||||
|
host = "seattle";
|
||||||
|
sshUser = "gsimmer";
|
||||||
|
buildOn = "remote";
|
||||||
|
substituteOnTarget = true;
|
||||||
|
hermetic = false;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
glasgow = nixpkgs.lib.nixosSystem {
|
||||||
|
system = "aarch64-linux";
|
||||||
|
modules = [
|
||||||
|
agenix.nixosModules.default
|
||||||
|
nixos-hardware.nixosModules.raspberry-pi-4
|
||||||
|
(import ./nix/glasgow/configuration.nix)
|
||||||
|
{
|
||||||
|
_module.args.nixinate = {
|
||||||
|
host = "glasgow";
|
||||||
|
sshUser = "gsimmer";
|
||||||
|
buildOn = "remote";
|
||||||
|
substituteOnTarget = true;
|
||||||
|
hermetic = false;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
proxmox-k3s-node-1 = nixpkgs.lib.nixosSystem {
|
proxmox-k3s-node-1 = nixpkgs.lib.nixosSystem {
|
||||||
system = "x86_64-linux";
|
system = "x86_64-linux";
|
||||||
modules = [
|
modules = [
|
||||||
|
|
|
@ -3,7 +3,6 @@ apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: atuin
|
name: atuin
|
||||||
namespace: atuin
|
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
replicas: 1
|
||||||
selector:
|
selector:
|
||||||
|
@ -19,10 +18,12 @@ spec:
|
||||||
- server
|
- server
|
||||||
- start
|
- start
|
||||||
env:
|
env:
|
||||||
|
- name: RUST_LOG
|
||||||
|
value: debug,atuin_server=debug
|
||||||
- name: ATUIN_DB_URI
|
- name: ATUIN_DB_URI
|
||||||
valueFrom:
|
valueFrom:
|
||||||
secretKeyRef:
|
secretKeyRef:
|
||||||
name: postgres-atuin
|
name: hippo-pguser-atuin
|
||||||
key: uri
|
key: uri
|
||||||
optional: false
|
optional: false
|
||||||
- name: ATUIN_HOST
|
- name: ATUIN_HOST
|
||||||
|
@ -30,8 +31,8 @@ spec:
|
||||||
- name: ATUIN_PORT
|
- name: ATUIN_PORT
|
||||||
value: "8888"
|
value: "8888"
|
||||||
- name: ATUIN_OPEN_REGISTRATION
|
- name: ATUIN_OPEN_REGISTRATION
|
||||||
value: "false"
|
value: "true"
|
||||||
image: ghcr.io/atuinsh/atuin:v18.2.0
|
image: ghcr.io/atuinsh/atuin:v18.0.0
|
||||||
name: atuin
|
name: atuin
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 8888
|
- containerPort: 8888
|
||||||
|
@ -61,7 +62,6 @@ apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
name: atuin
|
name: atuin
|
||||||
namespace: atuin
|
|
||||||
spec:
|
spec:
|
||||||
selector:
|
selector:
|
||||||
app: atuin
|
app: atuin
|
||||||
|
@ -74,14 +74,15 @@ apiVersion: networking.k8s.io/v1
|
||||||
kind: Ingress
|
kind: Ingress
|
||||||
metadata:
|
metadata:
|
||||||
name: atuin
|
name: atuin
|
||||||
namespace: atuin
|
|
||||||
annotations:
|
annotations:
|
||||||
cert-manager.io/cluster-issuer: "le-issuer"
|
cert-manager.io/issuer: "le-issuer"
|
||||||
nginx.ingress.kubernetes.io/proxy-body-size: 1024m
|
nginx.ingress.kubernetes.io/proxy-body-size: 1024m
|
||||||
|
namespace: default
|
||||||
spec:
|
spec:
|
||||||
tls:
|
tls:
|
||||||
- hosts:
|
- hosts:
|
||||||
- atuin.gmem.ca
|
- atuin.gmem.ca
|
||||||
|
secretName: gmem-ca-wildcard
|
||||||
rules:
|
rules:
|
||||||
- host: atuin.gmem.ca
|
- host: atuin.gmem.ca
|
||||||
http:
|
http:
|
||||||
|
|
|
@ -13,21 +13,24 @@ global:
|
||||||
name: authentik-secrets
|
name: authentik-secrets
|
||||||
key: secret-key
|
key: secret-key
|
||||||
- name: AUTHENTIK_POSTGRESQL__HOST
|
- name: AUTHENTIK_POSTGRESQL__HOST
|
||||||
value: 192.168.50.236
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: hippo-pguser-authentik
|
||||||
|
key: host
|
||||||
- name: AUTHENTIK_POSTGRESQL__PASSWORD
|
- name: AUTHENTIK_POSTGRESQL__PASSWORD
|
||||||
valueFrom:
|
valueFrom:
|
||||||
secretKeyRef:
|
secretKeyRef:
|
||||||
name: postgres-authentik
|
name: hippo-pguser-authentik
|
||||||
key: password
|
key: password
|
||||||
- name: AUTHENTIK_POSTGRESQL__USER
|
- name: AUTHENTIK_POSTGRESQL__USER
|
||||||
valueFrom:
|
valueFrom:
|
||||||
secretKeyRef:
|
secretKeyRef:
|
||||||
name: postgres-authentik
|
name: hippo-pguser-authentik
|
||||||
key: user
|
key: user
|
||||||
- name: AUTHENTIK_POSTGRESQL__PORT
|
- name: AUTHENTIK_POSTGRESQL__PORT
|
||||||
valueFrom:
|
valueFrom:
|
||||||
secretKeyRef:
|
secretKeyRef:
|
||||||
name: postgres-authentik
|
name: hippo-pguser-authentik
|
||||||
key: port
|
key: port
|
||||||
|
|
||||||
server:
|
server:
|
||||||
|
@ -41,5 +44,6 @@ server:
|
||||||
tls:
|
tls:
|
||||||
- hosts:
|
- hosts:
|
||||||
- authentik.gmem.ca
|
- authentik.gmem.ca
|
||||||
|
secretName: gmem-ca-wildcard
|
||||||
redis:
|
redis:
|
||||||
enabled: true
|
enabled: true
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
...
|
...
|
||||||
}: {
|
}: {
|
||||||
kubernetes.helm.releases.cloudflare-exporter = {
|
kubernetes.helm.releases.cloudflare-exporter = {
|
||||||
namespace = "cloudflare";
|
namespace = "default";
|
||||||
chart = kubenix.lib.helm.fetch {
|
chart = kubenix.lib.helm.fetch {
|
||||||
repo = "https://lablabs.github.io/cloudflare-exporter";
|
repo = "https://lablabs.github.io/cloudflare-exporter";
|
||||||
chart = "cloudflare-exporter";
|
chart = "cloudflare-exporter";
|
||||||
|
|
|
@ -3,13 +3,11 @@ apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: cloudflared
|
name: cloudflared
|
||||||
namespace: cloudflare
|
|
||||||
|
|
||||||
spec:
|
spec:
|
||||||
selector:
|
selector:
|
||||||
matchLabels:
|
matchLabels:
|
||||||
app: cloudflared
|
app: cloudflared
|
||||||
replicas: 2
|
replicas: 3
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
labels:
|
labels:
|
||||||
|
@ -17,7 +15,7 @@ spec:
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: cloudflared
|
- name: cloudflared
|
||||||
image: cloudflare/cloudflared:2024.4.1
|
image: cloudflare/cloudflared:2024.2.1
|
||||||
args:
|
args:
|
||||||
- tunnel
|
- tunnel
|
||||||
- --config
|
- --config
|
||||||
|
@ -57,8 +55,6 @@ apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
name: cloudflared-metrics
|
name: cloudflared-metrics
|
||||||
namespace: cloudflare
|
|
||||||
|
|
||||||
spec:
|
spec:
|
||||||
selector:
|
selector:
|
||||||
app: cloudflared
|
app: cloudflared
|
||||||
|
@ -71,7 +67,6 @@ apiVersion: monitoring.coreos.com/v1
|
||||||
kind: PodMonitor
|
kind: PodMonitor
|
||||||
metadata:
|
metadata:
|
||||||
name: cloudflared
|
name: cloudflared
|
||||||
namespace: cloudflare
|
|
||||||
labels:
|
labels:
|
||||||
release: prometheus
|
release: prometheus
|
||||||
spec:
|
spec:
|
||||||
|
@ -81,35 +76,3 @@ spec:
|
||||||
podMetricsEndpoints:
|
podMetricsEndpoints:
|
||||||
- port: metrics
|
- port: metrics
|
||||||
interval: 30s
|
interval: 30s
|
||||||
---
|
|
||||||
apiVersion: v1
|
|
||||||
kind: ConfigMap
|
|
||||||
metadata:
|
|
||||||
name: cloudflared
|
|
||||||
namespace: cloudflare
|
|
||||||
data:
|
|
||||||
config.yaml: |
|
|
||||||
tunnel: new-homelab
|
|
||||||
credentials-file: /etc/cloudflared/creds/credentials.json
|
|
||||||
metrics: 0.0.0.0:2000
|
|
||||||
no-autoupdate: true
|
|
||||||
ingress:
|
|
||||||
- hostname: photos.gmem.ca
|
|
||||||
service: http://immich-server.immich.svc.cluster.local:3001
|
|
||||||
- hostname: pw.gmem.ca
|
|
||||||
service: http://vaultwarden.vaultwarden.svc.cluster.local:80
|
|
||||||
- hostname: authentik.gmem.ca
|
|
||||||
service: http://authentik-server.authentik.svc.cluster.local:80
|
|
||||||
- hostname: nitter.gmem.ca
|
|
||||||
service: http://nitter.nitter.svc.cluster.local:8081
|
|
||||||
- hostname: git.gmem.ca
|
|
||||||
service: http://192.168.50.229
|
|
||||||
- hostname: proxmox.gmem.ca
|
|
||||||
service: http://proxmox.endpoints.svc.cluster.local:8006
|
|
||||||
- hostname: tokyo.gmem.ca
|
|
||||||
service: http://tokyo.endpoints.svc.cluster.local:8000
|
|
||||||
- hostname: ibiza.gmem.ca
|
|
||||||
service: http://ibiza.endpoints.svc.cluster.local:8000
|
|
||||||
- hostname: chat.gmem.ca
|
|
||||||
service: tcp://192.168.50.45:443
|
|
||||||
- service: http_status:404
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
let
|
let
|
||||||
endpoints = {
|
endpoints = {
|
||||||
"proxmox" = {
|
"proxmox" = {
|
||||||
location = "192.168.50.3";
|
location = "100.100.75.80";
|
||||||
host = "proxmox.gmem.ca";
|
host = "proxmox.gmem.ca";
|
||||||
port = 8006;
|
port = 8006;
|
||||||
protocol = "HTTPS";
|
protocol = "HTTPS";
|
||||||
|
@ -28,7 +28,6 @@ let
|
||||||
in {
|
in {
|
||||||
kubernetes.resources.services =
|
kubernetes.resources.services =
|
||||||
builtins.mapAttrs (name: endpoint: {
|
builtins.mapAttrs (name: endpoint: {
|
||||||
metadata.namespace = "endpoints";
|
|
||||||
spec = {
|
spec = {
|
||||||
ports.${name} = {
|
ports.${name} = {
|
||||||
port = endpoint.port;
|
port = endpoint.port;
|
||||||
|
@ -39,7 +38,6 @@ in {
|
||||||
endpoints;
|
endpoints;
|
||||||
kubernetes.resources.endpoints =
|
kubernetes.resources.endpoints =
|
||||||
builtins.mapAttrs (name: endpoint: {
|
builtins.mapAttrs (name: endpoint: {
|
||||||
metadata.namespace = "endpoints";
|
|
||||||
subsets = [
|
subsets = [
|
||||||
{
|
{
|
||||||
addresses = [{ip = endpoint.location;}];
|
addresses = [{ip = endpoint.location;}];
|
||||||
|
@ -58,10 +56,9 @@ in {
|
||||||
builtins.mapAttrs (name: endpoint: {
|
builtins.mapAttrs (name: endpoint: {
|
||||||
metadata = {
|
metadata = {
|
||||||
name = name;
|
name = name;
|
||||||
namespace = "endpoints";
|
|
||||||
annotations = {
|
annotations = {
|
||||||
"nginx.ingress.kubernetes.io/proxy-body-size" = "10g";
|
"nginx.ingress.kubernetes.io/proxy-body-size" = "10g";
|
||||||
"cert-manager.io/cluser-issuer" = "le-issuer";
|
"cert-manager.io/issuer" = "le-issuer";
|
||||||
"nginx.ingress.kubernetes.io/backend-protocol" = endpoint.protocol;
|
"nginx.ingress.kubernetes.io/backend-protocol" = endpoint.protocol;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -69,6 +66,7 @@ in {
|
||||||
tls = [
|
tls = [
|
||||||
{
|
{
|
||||||
hosts = [endpoint.host];
|
hosts = [endpoint.host];
|
||||||
|
secretName = "gmem-ca-wildcard";
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
rules = [
|
rules = [
|
||||||
|
|
103
homelab/freshrss.yaml
Normal file
103
homelab/freshrss.yaml
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: freshrss
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: freshrss
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: freshrss
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: freshrss
|
||||||
|
image: freshrss/freshrss:1.22.1-arm
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
memory: "256Mi"
|
||||||
|
cpu: "500m"
|
||||||
|
ports:
|
||||||
|
- containerPort: 80
|
||||||
|
env:
|
||||||
|
- name: CRON_MIN
|
||||||
|
value: 1,31
|
||||||
|
envFrom:
|
||||||
|
- configMapRef:
|
||||||
|
name: freshrss-config
|
||||||
|
- secretRef:
|
||||||
|
name: freshrss-secrets
|
||||||
|
volumeMounts:
|
||||||
|
- name: data
|
||||||
|
mountPath: /var/www/FreshRSS/data
|
||||||
|
- name: extension-data
|
||||||
|
mountPath: /var/www/FreshRSS/data/extensions
|
||||||
|
volumes:
|
||||||
|
- name: data
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: freshrss-data
|
||||||
|
- name: extension-data
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: freshrss-extension-data
|
||||||
|
---
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: freshrss-data
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: 1Gi
|
||||||
|
storageClassName: nfs-client
|
||||||
|
---
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: freshrss-extension-data
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: 1Gi
|
||||||
|
storageClassName: nfs-client
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: freshrss
|
||||||
|
spec:
|
||||||
|
type: ClusterIP
|
||||||
|
selector:
|
||||||
|
app: freshrss
|
||||||
|
ports:
|
||||||
|
- port: 80
|
||||||
|
targetPort: 80
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: freshrss
|
||||||
|
annotations:
|
||||||
|
cert-manager.io/issuer: "le-issuer"
|
||||||
|
namespace: default
|
||||||
|
spec:
|
||||||
|
tls:
|
||||||
|
- hosts:
|
||||||
|
- freshrss.gmem.ca
|
||||||
|
secretName: gmem-ca-wildcard
|
||||||
|
rules:
|
||||||
|
- host: freshrss.gmem.ca
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: freshrss
|
||||||
|
port:
|
||||||
|
number: 80
|
|
@ -72,11 +72,13 @@ kind: Ingress
|
||||||
metadata:
|
metadata:
|
||||||
name: homebridge
|
name: homebridge
|
||||||
annotations:
|
annotations:
|
||||||
cert-manager.io/cluster-issuer: "le-issuer"
|
cert-manager.io/issuer: "le-issuer"
|
||||||
|
namespace: default
|
||||||
spec:
|
spec:
|
||||||
tls:
|
tls:
|
||||||
- hosts:
|
- hosts:
|
||||||
- hb.gmem.ca
|
- hb.gmem.ca
|
||||||
|
secretName: gmem-ca-wildcard
|
||||||
rules:
|
rules:
|
||||||
- host: hb.gmem.ca
|
- host: hb.gmem.ca
|
||||||
http:
|
http:
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
description = "Plex";
|
description = "Plex";
|
||||||
widget = {
|
widget = {
|
||||||
type = "plex";
|
type = "plex";
|
||||||
url = "http://192.168.50.229:32400";
|
url = "http://vancouver:32400";
|
||||||
key = "{{HOMEPAGE_VAR_PLEX_KEY}}";
|
key = "{{HOMEPAGE_VAR_PLEX_KEY}}";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -142,10 +142,16 @@
|
||||||
{
|
{
|
||||||
Reading = [
|
Reading = [
|
||||||
{
|
{
|
||||||
miniflux = {
|
FreshRSS = {
|
||||||
icon = "miniflux.png";
|
icon = "freshrss.png";
|
||||||
href = "https://rss.gmem.ca";
|
href = "https://freshrss.gmem.ca";
|
||||||
description = "Miniflux RSS Reader";
|
description = "FreshRSS RSS Reader";
|
||||||
|
widget = {
|
||||||
|
type = "freshrss";
|
||||||
|
url = "https://freshrss.gmem.ca";
|
||||||
|
username = "arch";
|
||||||
|
password = "{{HOMEPAGE_VAR_FRESHRSS_PASSWORD}}";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
|
@ -303,7 +309,6 @@
|
||||||
};
|
};
|
||||||
in {
|
in {
|
||||||
kubernetes.helm.releases.homepage = {
|
kubernetes.helm.releases.homepage = {
|
||||||
namespace = "homepage";
|
|
||||||
chart = kubenix.lib.helm.fetch {
|
chart = kubenix.lib.helm.fetch {
|
||||||
repo = "https://jameswynn.github.io/helm-charts";
|
repo = "https://jameswynn.github.io/helm-charts";
|
||||||
chart = "homepage";
|
chart = "homepage";
|
||||||
|
@ -345,7 +350,7 @@ in {
|
||||||
};
|
};
|
||||||
|
|
||||||
kubernetes.resources.deployments.homepage = {
|
kubernetes.resources.deployments.homepage = {
|
||||||
metadata.namespace = "homepage";
|
metadata.namespace = "default";
|
||||||
|
|
||||||
spec.template = {
|
spec.template = {
|
||||||
metadata.annotations."gmem.ca/homepage-config-hash" = builtins.hashString "md5" (builtins.toJSON homepage-config);
|
metadata.annotations."gmem.ca/homepage-config-hash" = builtins.hashString "md5" (builtins.toJSON homepage-config);
|
||||||
|
|
|
@ -2,6 +2,7 @@ apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: hue
|
name: hue
|
||||||
|
namespace: default
|
||||||
spec:
|
spec:
|
||||||
selector:
|
selector:
|
||||||
matchLabels:
|
matchLabels:
|
||||||
|
@ -13,7 +14,7 @@ spec:
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: hue
|
- name: hue
|
||||||
image: git.gmem.ca/arch/hue
|
image: icr.gmem.ca/hue
|
||||||
resources:
|
resources:
|
||||||
limits:
|
limits:
|
||||||
memory: "32Mi"
|
memory: "32Mi"
|
||||||
|
@ -53,11 +54,13 @@ kind: Ingress
|
||||||
metadata:
|
metadata:
|
||||||
name: hue
|
name: hue
|
||||||
annotations:
|
annotations:
|
||||||
cert-manager.io/cluser-issuer: "le-issuer"
|
cert-manager.io/issuer: "le-issuer"
|
||||||
|
namespace: default
|
||||||
spec:
|
spec:
|
||||||
tls:
|
tls:
|
||||||
- hosts:
|
- hosts:
|
||||||
- hue.gmem.ca
|
- hue.gmem.ca
|
||||||
|
secretName: gmem-ca-wildcard
|
||||||
rules:
|
rules:
|
||||||
- host: hue.gmem.ca
|
- host: hue.gmem.ca
|
||||||
http:
|
http:
|
||||||
|
|
|
@ -5,37 +5,34 @@
|
||||||
...
|
...
|
||||||
}: {
|
}: {
|
||||||
kubernetes.helm.releases.immich = {
|
kubernetes.helm.releases.immich = {
|
||||||
namespace = "immich";
|
|
||||||
chart = kubenix.lib.helm.fetch {
|
chart = kubenix.lib.helm.fetch {
|
||||||
repo = "https://immich-app.github.io/immich-charts";
|
repo = "https://immich-app.github.io/immich-charts";
|
||||||
chart = "immich";
|
chart = "immich";
|
||||||
version = "0.6.0";
|
version = "0.4.0";
|
||||||
sha256 = "p9fgqRMxRJ2rMBZZfMKuAIjp/N1/KgKCKLDhoXO0O6c=";
|
sha256 = "qekwsAke6NBwhlbt7nIkuwTSIydcWOq/kETooYb64oY=";
|
||||||
};
|
};
|
||||||
# arbitrary attrset passed as values to the helm release
|
# arbitrary attrset passed as values to the helm release
|
||||||
values = {
|
values = {
|
||||||
image.tag = "v1.102.3";
|
image.tag = "v1.98.2";
|
||||||
machine-learning.enabled = false;
|
machine-learning.enabled = false;
|
||||||
immich.persistence.library.existingClaim = "immich";
|
immich.persistence.library.existingClaim = "immich";
|
||||||
redis = {
|
redis.enabled = true;
|
||||||
enabled = true;
|
|
||||||
};
|
|
||||||
env = {
|
env = {
|
||||||
PGSSLMODE = "no-verify";
|
PGSSLMODE = "no-verify";
|
||||||
DB_PASSWORD.valueFrom.secretKeyRef = {
|
DB_URL.valueFrom.secretKeyRef = {
|
||||||
name = "postgres-immich";
|
name = "hippo-pguser-immich";
|
||||||
key = "password";
|
key = "uri";
|
||||||
};
|
};
|
||||||
DB_HOSTNAME.value = "192.168.50.236";
|
|
||||||
};
|
};
|
||||||
server.ingress.main = {
|
server.ingress.main = {
|
||||||
enabled = true;
|
enabled = true;
|
||||||
annotations = {
|
annotations = {
|
||||||
"cert-manager.io/cluster-issuer" = "le-issuer";
|
"cert-manager.io/issuer" = "le-issuer";
|
||||||
};
|
};
|
||||||
tls = [
|
tls = [
|
||||||
{
|
{
|
||||||
hosts = ["photos.gmem.ca"];
|
hosts = ["photos.gmem.ca"];
|
||||||
|
secretName = "gmem-ca-wildcard";
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
hosts = [
|
hosts = [
|
||||||
|
@ -49,10 +46,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
kubernetes.resources.persistentVolumeClaims.immich = {
|
kubernetes.resources.persistentVolumeClaims.immich = {
|
||||||
metadata = {
|
metadata.name = "immich";
|
||||||
name = "immich";
|
|
||||||
namespace = "immich";
|
|
||||||
};
|
|
||||||
spec = {
|
spec = {
|
||||||
accessModes = ["ReadWriteOnce"];
|
accessModes = ["ReadWriteOnce"];
|
||||||
resources.requests.storage = "50Gi";
|
resources.requests.storage = "50Gi";
|
||||||
|
|
|
@ -4,19 +4,16 @@ let
|
||||||
gamjaImage = "git.gmem.ca/arch/gamja:latest";
|
gamjaImage = "git.gmem.ca/arch/gamja:latest";
|
||||||
in {
|
in {
|
||||||
kubernetes.resources.services.soju = {
|
kubernetes.resources.services.soju = {
|
||||||
metadata.namespace = "irc";
|
|
||||||
spec = {
|
spec = {
|
||||||
type = "NodePort";
|
type = "NodePort";
|
||||||
selector.app = appName;
|
selector.app = appName;
|
||||||
ports.tls = {
|
ports.tls = {
|
||||||
port = 6697;
|
port = 6697;
|
||||||
targetPort = 6697;
|
targetPort = 6697;
|
||||||
nodePort = 6697;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
kubernetes.resources.services.soju-ws = {
|
kubernetes.resources.services.soju-ws = {
|
||||||
metadata.namespace = "irc";
|
|
||||||
spec = {
|
spec = {
|
||||||
selector.app = appName;
|
selector.app = appName;
|
||||||
ports.ws = {
|
ports.ws = {
|
||||||
|
@ -26,7 +23,6 @@ in {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
kubernetes.resources.services.gamja = {
|
kubernetes.resources.services.gamja = {
|
||||||
metadata.namespace = "irc";
|
|
||||||
spec = {
|
spec = {
|
||||||
selector.app = "gamja";
|
selector.app = "gamja";
|
||||||
ports.http = {
|
ports.http = {
|
||||||
|
@ -35,16 +31,14 @@ in {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
kubernetes.resources.deployments.soju = {
|
kubernetes.resources.deployments.soju.spec = {
|
||||||
metadata.namespace = "irc";
|
|
||||||
spec = {
|
|
||||||
selector.matchLabels.app = appName;
|
selector.matchLabels.app = appName;
|
||||||
template = {
|
template = {
|
||||||
metadata.labels.app = appName;
|
metadata.labels.app = appName;
|
||||||
spec = {
|
spec = {
|
||||||
volumes = {
|
volumes = {
|
||||||
config.configMap.name = "soju";
|
config.configMap.name = "soju";
|
||||||
ssl.secret.secretName = "irc-gmem-ca";
|
ssl.secret.secretName = "gmem-ca-wildcard";
|
||||||
};
|
};
|
||||||
containers = {
|
containers = {
|
||||||
soju = {
|
soju = {
|
||||||
|
@ -64,17 +58,20 @@ in {
|
||||||
ports.tls.containerPort = 6697;
|
ports.tls.containerPort = 6697;
|
||||||
ports.ws.containerPort = 80;
|
ports.ws.containerPort = 80;
|
||||||
|
|
||||||
env.PGHOST.value = "192.168.50.236";
|
env.PGHOST.valueFrom.secretKeyRef = {
|
||||||
|
name = "hippo-pguser-soju";
|
||||||
|
key = "host";
|
||||||
|
};
|
||||||
env.PGPASSWORD.valueFrom.secretKeyRef = {
|
env.PGPASSWORD.valueFrom.secretKeyRef = {
|
||||||
name = "postgres-soju";
|
name = "hippo-pguser-soju";
|
||||||
key = "password";
|
key = "password";
|
||||||
};
|
};
|
||||||
env.PGUSER.valueFrom.secretKeyRef = {
|
env.PGUSER.valueFrom.secretKeyRef = {
|
||||||
name = "postgres-soju";
|
name = "hippo-pguser-soju";
|
||||||
key = "user";
|
key = "user";
|
||||||
};
|
};
|
||||||
env.PGDATABASE.valueFrom.secretKeyRef = {
|
env.PGDATABASE.valueFrom.secretKeyRef = {
|
||||||
name = "postgres-soju";
|
name = "hippo-pguser-soju";
|
||||||
key = "dbname";
|
key = "dbname";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -82,10 +79,7 @@ in {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
kubernetes.resources.deployments.gamja.spec = {
|
||||||
kubernetes.resources.deployments.gamja = {
|
|
||||||
metadata.namespace = "irc";
|
|
||||||
spec = {
|
|
||||||
selector.matchLabels.app = "gamja";
|
selector.matchLabels.app = "gamja";
|
||||||
template = {
|
template = {
|
||||||
metadata.labels.app = "gamja";
|
metadata.labels.app = "gamja";
|
||||||
|
@ -100,19 +94,16 @@ in {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
|
||||||
|
|
||||||
kubernetes.resources.ingresses.irc = {
|
kubernetes.resources.ingresses.irc = {
|
||||||
metadata.namespace = "irc";
|
|
||||||
metadata.annotations = {
|
metadata.annotations = {
|
||||||
"cert-manager.io/cluster-issuer" = "le-issuer";
|
"cert-manager.io/issuer" = "le-issuer";
|
||||||
"nginx.ingress.kubernetes.io/proxy-read-timeout" = "3600";
|
|
||||||
"nginx.ingress.kubernetes.io/proxy-send-timeout" = "3600";
|
|
||||||
};
|
};
|
||||||
spec = {
|
spec = {
|
||||||
tls = [
|
tls = [
|
||||||
{
|
{
|
||||||
hosts = ["irc.gmem.ca"];
|
hosts = ["irc.gmem.ca"];
|
||||||
|
secretName = "gmem-ca-wildcard";
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
rules = [
|
rules = [
|
||||||
|
@ -141,9 +132,7 @@ in {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
kubernetes.resources.configMaps.soju = {
|
kubernetes.resources.configMaps.soju.data.config = ''
|
||||||
metadata.namespace = "irc";
|
|
||||||
data.config = ''
|
|
||||||
listen ircs://
|
listen ircs://
|
||||||
listen unix+admin:///app/admin
|
listen unix+admin:///app/admin
|
||||||
listen ws+insecure://
|
listen ws+insecure://
|
||||||
|
@ -153,5 +142,4 @@ in {
|
||||||
message-store db
|
message-store db
|
||||||
tls /ssl/tls.crt /ssl/tls.key
|
tls /ssl/tls.crt /ssl/tls.key
|
||||||
'';
|
'';
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
apiVersion: cert-manager.io/v1
|
apiVersion: cert-manager.io/v1
|
||||||
kind: ClusterIssuer
|
kind: Issuer
|
||||||
metadata:
|
metadata:
|
||||||
name: le-issuer
|
name: le-issuer
|
||||||
spec:
|
spec:
|
||||||
|
@ -29,7 +29,7 @@ metadata:
|
||||||
spec:
|
spec:
|
||||||
secretName: gmem-ca-wildcard
|
secretName: gmem-ca-wildcard
|
||||||
issuerRef:
|
issuerRef:
|
||||||
kind: ClusterIssuer
|
kind: Issuer
|
||||||
name: le-issuer
|
name: le-issuer
|
||||||
commonName: "*.gmem.ca"
|
commonName: "*.gmem.ca"
|
||||||
dnsNames:
|
dnsNames:
|
||||||
|
|
|
@ -15,16 +15,15 @@
|
||||||
(import ./immich.nix)
|
(import ./immich.nix)
|
||||||
(import ./endpoints.nix)
|
(import ./endpoints.nix)
|
||||||
(import ./homepage.nix)
|
(import ./homepage.nix)
|
||||||
|
# (import ./pterodactyl.nix)
|
||||||
(import ./cloudflare-exporter.nix)
|
(import ./cloudflare-exporter.nix)
|
||||||
(import ./piped.nix)
|
(import ./piped.nix)
|
||||||
# (import ./conduit.nix)
|
(import ./conduit.nix)
|
||||||
(import ./irc.nix)
|
(import ./irc.nix)
|
||||||
# (import ./netboot.nix)
|
(import ./netboot.nix)
|
||||||
(import ./nitter.nix)
|
(import ./nitter.nix)
|
||||||
# (import ./changedetection.nix)
|
(import ./changedetection.nix)
|
||||||
(import ./nextdns-exporter.nix)
|
(import ./nextdns-exporter.nix)
|
||||||
(import ./nitter-bot.nix)
|
(import ./nitter-bot.nix)
|
||||||
(import ./miniflux.nix)
|
|
||||||
# (import ./snikket.nix)
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,103 +0,0 @@
|
||||||
let
|
|
||||||
appName = "miniflux";
|
|
||||||
appImage = "docker.io/miniflux/miniflux";
|
|
||||||
in
|
|
||||||
{
|
|
||||||
lib,
|
|
||||||
config,
|
|
||||||
kubenix,
|
|
||||||
...
|
|
||||||
}: {
|
|
||||||
kubernetes.resources.deployments.miniflux = {
|
|
||||||
metadata.namespace = "miniflux";
|
|
||||||
spec = {
|
|
||||||
selector.matchLabels.app = appName;
|
|
||||||
template = {
|
|
||||||
metadata.labels.app = appName;
|
|
||||||
spec = {
|
|
||||||
containers = {
|
|
||||||
miniflux = {
|
|
||||||
image = appImage;
|
|
||||||
envFrom = [{secretRef.name = "miniflux";}
|
|
||||||
{configMapRef.name = "miniflux";}];
|
|
||||||
resources = {
|
|
||||||
requests = {
|
|
||||||
cpu = "1m";
|
|
||||||
memory = "256Mi";
|
|
||||||
};
|
|
||||||
limits = {
|
|
||||||
cpu = "1";
|
|
||||||
memory = "512Mi";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
ports.http.containerPort = 8080;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
kubernetes.resources.services.miniflux = {
|
|
||||||
metadata.namespace = "miniflux";
|
|
||||||
metadata.labels.app = appName;
|
|
||||||
spec = {
|
|
||||||
selector.app = appName;
|
|
||||||
ports.http = {
|
|
||||||
port = 8080;
|
|
||||||
targetPort = 8080;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
kubernetes.resources.ingresses.miniflux = {
|
|
||||||
metadata.namespace = "miniflux";
|
|
||||||
metadata.annotations = {
|
|
||||||
"cert-manager.io/cluster-issuer" = "le-issuer";
|
|
||||||
};
|
|
||||||
spec = {
|
|
||||||
tls = [
|
|
||||||
{
|
|
||||||
hosts = ["rss.gmem.ca"];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
rules = [
|
|
||||||
{
|
|
||||||
host = "rss.gmem.ca";
|
|
||||||
http.paths = [
|
|
||||||
{
|
|
||||||
path = "/";
|
|
||||||
pathType = "Prefix";
|
|
||||||
backend.service = {
|
|
||||||
name = "miniflux";
|
|
||||||
port.number = 8080;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
kubernetes.resources."monitoring.coreos.com"."v1".ServiceMonitor.miniflux = {
|
|
||||||
metadata.namespace = "miniflux";
|
|
||||||
spec = {
|
|
||||||
selector.matchLabels.app = appName;
|
|
||||||
endpoints = [
|
|
||||||
{
|
|
||||||
port = "http";
|
|
||||||
interval = "60s";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
kubernetes.resources.configMaps.miniflux = {
|
|
||||||
metadata.namespace = "miniflux";
|
|
||||||
data = {
|
|
||||||
CLEANUP_ARCHIVE_UNREAD_DAYS = "60";
|
|
||||||
METRICS_COLLECTOR = "1";
|
|
||||||
METRICS_ALLOWED_NETWORKS = "0.0.0.0/0";
|
|
||||||
BASE_URL = "https://rss.gmem.ca/";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -3,7 +3,6 @@ let
|
||||||
nextdns-exporterImage = "ghcr.io/raylas/nextdns-exporter:0.5.3";
|
nextdns-exporterImage = "ghcr.io/raylas/nextdns-exporter:0.5.3";
|
||||||
in {
|
in {
|
||||||
kubernetes.resources."monitoring.coreos.com"."v1".ServiceMonitor.nextdns-exporter = {
|
kubernetes.resources."monitoring.coreos.com"."v1".ServiceMonitor.nextdns-exporter = {
|
||||||
metadata.namespace = "prometheus";
|
|
||||||
metadata.labels.app = appName;
|
metadata.labels.app = appName;
|
||||||
spec = {
|
spec = {
|
||||||
selector.matchLabels.app = appName;
|
selector.matchLabels.app = appName;
|
||||||
|
@ -21,7 +20,6 @@ in {
|
||||||
};
|
};
|
||||||
|
|
||||||
kubernetes.resources.services.nextdns-exporter-metrics = {
|
kubernetes.resources.services.nextdns-exporter-metrics = {
|
||||||
metadata.namespace = "prometheus";
|
|
||||||
metadata.labels.app = appName;
|
metadata.labels.app = appName;
|
||||||
spec = {
|
spec = {
|
||||||
selector.app = appName;
|
selector.app = appName;
|
||||||
|
@ -36,9 +34,7 @@ in {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
kubernetes.resources.deployments.nextdns-exporter = {
|
kubernetes.resources.deployments.nextdns-exporter.spec = {
|
||||||
metadata.namespace = "prometheus";
|
|
||||||
spec = {
|
|
||||||
selector.matchLabels.app = appName;
|
selector.matchLabels.app = appName;
|
||||||
template = {
|
template = {
|
||||||
metadata.labels.app = appName;
|
metadata.labels.app = appName;
|
||||||
|
@ -61,5 +57,4 @@ in {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
nfs:
|
nfs:
|
||||||
server: 192.168.50.229
|
server: vancouver
|
||||||
path: /tank/k3scluster
|
path: /Primary/k3scluster
|
||||||
storageClass:
|
storageClass:
|
||||||
defaultClass: true
|
defaultClass: true
|
||||||
archiveOnDelete: false
|
archiveOnDelete: false
|
||||||
onDelete: delete
|
onDelete: delete
|
||||||
|
|
||||||
|
|
|
@ -9,32 +9,24 @@
|
||||||
chart = kubenix.lib.helm.fetch {
|
chart = kubenix.lib.helm.fetch {
|
||||||
repo = "https://kubernetes.github.io/ingress-nginx";
|
repo = "https://kubernetes.github.io/ingress-nginx";
|
||||||
chart = "ingress-nginx";
|
chart = "ingress-nginx";
|
||||||
version = "4.10.1";
|
version = "4.9.1";
|
||||||
sha256 = "BHRoXG5EtJdCGkzy52brAtEcMEZP+WkNtfBf+cwpNbs=";
|
sha256 = "sha256-EJjNTC7nQUbGnS0xgF/eWyKs3vBpRPbbZmwl/pd9/44=";
|
||||||
};
|
};
|
||||||
values = {
|
values = {
|
||||||
controller = {
|
controller = {
|
||||||
kind = "DaemonSet";
|
kind = "DaemonSet";
|
||||||
metrics = {
|
metrics = {
|
||||||
enabled = true;
|
enabled = true;
|
||||||
serviceMonitor.enabled = true;
|
|
||||||
additionalLabels.release = "prometheus";
|
additionalLabels.release = "prometheus";
|
||||||
};
|
};
|
||||||
podAnnotations = {
|
podAnnotations = {
|
||||||
"prometheus.io/scrape" = "true";
|
"prometheus.io/scrape" = "true";
|
||||||
"prometheus.io/port" = "10254";
|
"prometheus.io/port" = "10254";
|
||||||
};
|
};
|
||||||
tolerations = [
|
|
||||||
{
|
|
||||||
key = "node-role.kubernetes.io/control-plane";
|
|
||||||
effect = "NoSchedule";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
ingressClassResource.default = true;
|
ingressClassResource.default = true;
|
||||||
publishService.enabled = true;
|
publishService.enabled = true;
|
||||||
service.externalTrafficPolicy = "Local";
|
service.externalTrafficPolicy = "Local";
|
||||||
hostNetwork = true;
|
hostNetwork = true;
|
||||||
extraArgs.default-ssl-certificate = "cert-manager/gmem-ca-wildcard";
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -8,9 +8,7 @@ in
|
||||||
kubenix,
|
kubenix,
|
||||||
...
|
...
|
||||||
}: {
|
}: {
|
||||||
kubernetes.resources.statefulSets.nitter-bot = {
|
kubernetes.resources.statefulSets.nitter-bot.spec = {
|
||||||
metadata.namespace = "nitter";
|
|
||||||
spec = {
|
|
||||||
selector.matchLabels.app = appName;
|
selector.matchLabels.app = appName;
|
||||||
serviceName = appName;
|
serviceName = appName;
|
||||||
template = {
|
template = {
|
||||||
|
@ -19,8 +17,7 @@ in
|
||||||
containers = {
|
containers = {
|
||||||
nitter-bot = {
|
nitter-bot = {
|
||||||
image = appImage;
|
image = appImage;
|
||||||
envFrom = [{secretRef.name = "nitter-bot";}
|
envFrom = [{secretRef.name = "nitter-bot";}];
|
||||||
{configMapRef.name = "nitter-bot";}];
|
|
||||||
resources = {
|
resources = {
|
||||||
requests = {
|
requests = {
|
||||||
cpu = "1m";
|
cpu = "1m";
|
||||||
|
@ -36,13 +33,4 @@ in
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
|
||||||
|
|
||||||
kubernetes.resources.configMaps.nitter-bot = {
|
|
||||||
metadata.namespace = "nitter";
|
|
||||||
data = {
|
|
||||||
NITTER_URL = "http://nitter:8080";
|
|
||||||
NITTER_EXTERNAL_URL = "https://nitter.gmem.ca";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,6 @@ in
|
||||||
...
|
...
|
||||||
}: {
|
}: {
|
||||||
kubernetes.resources.services.nitter = {
|
kubernetes.resources.services.nitter = {
|
||||||
metadata.namespace = "nitter";
|
|
||||||
spec = {
|
spec = {
|
||||||
selector.app = appName;
|
selector.app = appName;
|
||||||
ports.http = {
|
ports.http = {
|
||||||
|
@ -22,9 +21,7 @@ in
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
kubernetes.resources.deployments.nitter = {
|
kubernetes.resources.deployments.nitter.spec = {
|
||||||
metadata.namespace = "nitter";
|
|
||||||
spec = {
|
|
||||||
selector.matchLabels.app = appName;
|
selector.matchLabels.app = appName;
|
||||||
template = {
|
template = {
|
||||||
metadata.labels.app = appName;
|
metadata.labels.app = appName;
|
||||||
|
@ -72,9 +69,7 @@ in
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
|
||||||
kubernetes.helm.releases.nitter-redis = {
|
kubernetes.helm.releases.nitter-redis = {
|
||||||
namespace = "nitter";
|
|
||||||
chart = kubenix.lib.helm.fetch {
|
chart = kubenix.lib.helm.fetch {
|
||||||
repo = "https://charts.bitnami.com/bitnami";
|
repo = "https://charts.bitnami.com/bitnami";
|
||||||
chart = "redis";
|
chart = "redis";
|
||||||
|
@ -89,15 +84,15 @@ in
|
||||||
kubernetes.resources.ingresses.nitter = {
|
kubernetes.resources.ingresses.nitter = {
|
||||||
metadata = {
|
metadata = {
|
||||||
name = appName;
|
name = appName;
|
||||||
namespace = "nitter";
|
|
||||||
annotations = {
|
annotations = {
|
||||||
"cert-manager.io/cluster-issuer" = "le-issuer";
|
"cert-manager.io/issuer" = "le-issuer";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
spec = {
|
spec = {
|
||||||
tls = [
|
tls = [
|
||||||
{
|
{
|
||||||
hosts = ["nitter.gmem.ca"];
|
hosts = ["nitter.gmem.ca"];
|
||||||
|
secretName = "gmem-ca-wildcard";
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
rules = [
|
rules = [
|
||||||
|
|
|
@ -2,7 +2,6 @@ apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: ntfy
|
name: ntfy
|
||||||
namespace: ntfy
|
|
||||||
spec:
|
spec:
|
||||||
selector:
|
selector:
|
||||||
matchLabels:
|
matchLabels:
|
||||||
|
@ -36,7 +35,6 @@ apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
name: ntfy
|
name: ntfy
|
||||||
namespace: ntfy
|
|
||||||
spec:
|
spec:
|
||||||
selector:
|
selector:
|
||||||
app: ntfy
|
app: ntfy
|
||||||
|
@ -48,7 +46,6 @@ apiVersion: v1
|
||||||
kind: ConfigMap
|
kind: ConfigMap
|
||||||
metadata:
|
metadata:
|
||||||
name: ntfy
|
name: ntfy
|
||||||
namespace: ntfy
|
|
||||||
data:
|
data:
|
||||||
server.yml: |
|
server.yml: |
|
||||||
# Template: https://github.com/binwiederhier/ntfy/blob/main/server/server.yml
|
# Template: https://github.com/binwiederhier/ntfy/blob/main/server/server.yml
|
||||||
|
@ -61,12 +58,13 @@ kind: Ingress
|
||||||
metadata:
|
metadata:
|
||||||
name: ntfy
|
name: ntfy
|
||||||
annotations:
|
annotations:
|
||||||
cert-manager.io/cluster-issuer: "le-issuer"
|
cert-manager.io/issuer: "le-issuer"
|
||||||
namespace: ntfy
|
namespace: default
|
||||||
spec:
|
spec:
|
||||||
tls:
|
tls:
|
||||||
- hosts:
|
- hosts:
|
||||||
- ntfy.gmem.ca
|
- ntfy.gmem.ca
|
||||||
|
secretName: gmem-ca-wildcard
|
||||||
rules:
|
rules:
|
||||||
- host: ntfy.gmem.ca
|
- host: ntfy.gmem.ca
|
||||||
http:
|
http:
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
let
|
let
|
||||||
appName = "jellyseerr";
|
appName = "overseerr";
|
||||||
appImage = "git.gmem.ca/arch/jellyseerr:postgres";
|
appImage = "sctx/overseerr";
|
||||||
in {
|
in {
|
||||||
kubernetes.resources.services.jellyseerr = {
|
kubernetes.resources.services.overseerr = {
|
||||||
metadata.namespace = "jellyseerr";
|
|
||||||
spec = {
|
spec = {
|
||||||
selector.app = appName;
|
selector.app = appName;
|
||||||
ports.http = {
|
ports.http = {
|
||||||
|
@ -12,29 +11,25 @@ in {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
kubernetes.resources.deployments.jellyseerr = {
|
kubernetes.resources.statefulSets.overseerr.spec = {
|
||||||
metadata.namespace = "jellyseerr";
|
|
||||||
spec = {
|
|
||||||
selector.matchLabels.app = appName;
|
selector.matchLabels.app = appName;
|
||||||
|
serviceName = appName;
|
||||||
template = {
|
template = {
|
||||||
metadata.labels.app = appName;
|
metadata.labels.app = appName;
|
||||||
spec = {
|
spec = {
|
||||||
volumes = {
|
volumes = {
|
||||||
config.configMap.name = "jellyseerr";
|
config.configMap.name = "overseerr";
|
||||||
};
|
};
|
||||||
containers = {
|
containers = {
|
||||||
jellyseerr = {
|
overseerr = {
|
||||||
image = appImage;
|
image = appImage;
|
||||||
envFrom = [{secretRef.name = "jellyseerr";}
|
|
||||||
{configMapRef.name = "jellyseerr";}];
|
|
||||||
volumeMounts = [
|
volumeMounts = [
|
||||||
{
|
{
|
||||||
name = "config";
|
name = "data";
|
||||||
mountPath = "/app/config/settings.json";
|
mountPath = "/app/config";
|
||||||
subPath = "settings.json";
|
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
ports.http.containerPort = 5055;
|
ports.metrics.containerPort = 5055;
|
||||||
resources = {
|
resources = {
|
||||||
requests = {
|
requests = {
|
||||||
cpu = "500m";
|
cpu = "500m";
|
||||||
|
@ -49,20 +44,29 @@ in {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
volumeClaimTemplates = [
|
||||||
|
{
|
||||||
|
metadata.name = "data";
|
||||||
|
spec = {
|
||||||
|
storageClassName = "nfs-client";
|
||||||
|
accessModes = ["ReadWriteOnce"];
|
||||||
|
resources.requests.storage = "1Gi";
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
};
|
};
|
||||||
kubernetes.resources.ingresses.jellyseerr = {
|
kubernetes.resources.ingresses.overseerr = {
|
||||||
metadata = {
|
metadata = {
|
||||||
name = appName;
|
name = appName;
|
||||||
namespace = "jellyseerr";
|
|
||||||
annotations = {
|
annotations = {
|
||||||
"cert-manager.io/cluster-issuer" = "le-issuer";
|
"cert-manager.io/issuer" = "le-issuer";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
spec = {
|
spec = {
|
||||||
tls = [
|
tls = [
|
||||||
{
|
{
|
||||||
hosts = ["request-media.gmem.ca"];
|
hosts = ["request-media.gmem.ca"];
|
||||||
|
secretName = "gmem-ca-wildcard";
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
rules = [
|
rules = [
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
...
|
...
|
||||||
}: {
|
}: {
|
||||||
kubernetes.helm.releases.piped = {
|
kubernetes.helm.releases.piped = {
|
||||||
namespace = "piped";
|
namespace = "default";
|
||||||
chart = kubenix.lib.helm.fetch {
|
chart = kubenix.lib.helm.fetch {
|
||||||
repo = "https://helm.piped.video";
|
repo = "https://helm.piped.video";
|
||||||
chart = "piped";
|
chart = "piped";
|
||||||
|
@ -25,12 +25,13 @@
|
||||||
password = "password";
|
password = "password";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
frontend.env.BACKEND_HOSTNAME = "pipedapi.gmem.ca";
|
fontend.env.BACKEND_HOSTNAME = "pipedapi.gmem.ca";
|
||||||
ingress = {
|
ingress = {
|
||||||
main = {
|
main = {
|
||||||
tls = [
|
tls = [
|
||||||
{
|
{
|
||||||
hosts = ["piped.gmem.ca"];
|
hosts = ["piped.gmem.ca"];
|
||||||
|
secretName = "gmem-ca-wildcard";
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
hosts = [
|
hosts = [
|
||||||
|
@ -44,6 +45,7 @@
|
||||||
tls = [
|
tls = [
|
||||||
{
|
{
|
||||||
hosts = ["pipedapi.gmem.ca"];
|
hosts = ["pipedapi.gmem.ca"];
|
||||||
|
secretName = "gmem-ca-wildcard";
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
hosts = [
|
hosts = [
|
||||||
|
@ -56,7 +58,8 @@
|
||||||
ytproxy = {
|
ytproxy = {
|
||||||
tls = [
|
tls = [
|
||||||
{
|
{
|
||||||
hosts = ["pipedproxy.gmem.ca"];
|
hosts = ["ytproxy.gmem.ca"];
|
||||||
|
secretName = "gmem-ca-wildcard";
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
hosts = [
|
hosts = [
|
||||||
|
@ -70,30 +73,27 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
kubernetes.resources.cronJobs.piped-refresh = {
|
kubernetes.resources.cronJobs.piped-refresh.spec = {
|
||||||
metadata.namespace = "piped";
|
|
||||||
spec = {
|
|
||||||
schedule = "*/10 * * * *";
|
schedule = "*/10 * * * *";
|
||||||
jobTemplate.spec.template.spec = {
|
jobTemplate.spec.template.spec = {
|
||||||
restartPolicy = "Never";
|
restartPolicy = "Never";
|
||||||
containers.refresh-subscriptions = {
|
containers.refresh-subscriptions = {
|
||||||
image = "debian:bookworm-slim";
|
image = "alpine:3.15";
|
||||||
envFrom = [{secretRef.name = "postgres-piped";}];
|
envFrom = [{secretRef.name = "hippo-pguser-piped";}];
|
||||||
command = [
|
command = [
|
||||||
"/bin/bash"
|
"/bin/ash"
|
||||||
"-c"
|
"-c"
|
||||||
''
|
''
|
||||||
apt update && apt install -y postgresql-client curl
|
apk --no-cache add postgresql-client curl &&
|
||||||
export PGPASSWORD=$password &&
|
export PGPASSWORD=$password &&
|
||||||
export subs=$(psql -U piped -h 192.168.50.236 -qtAX -c 'select id from public.pubsub;') &&
|
export subs=$(psql -U piped -h hippo-primary.default.svc -qtAX -c 'select id from public.pubsub;') &&
|
||||||
while IFS= read -r line; do
|
while IFS= read -r line; do
|
||||||
echo "refreshing $line"
|
echo "refreshing $line"
|
||||||
curl -k -o /dev/null "http://piped-backend:8080/channel/$line"
|
curl -k -S -s -o /dev/null "https://pipedapi.gmem.ca/channel/$line"
|
||||||
done < <(printf '%s' "$subs")
|
done < <(printf '%s' "$subs")
|
||||||
''
|
''
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ spec:
|
||||||
name: init-sql
|
name: init-sql
|
||||||
instances:
|
instances:
|
||||||
- name: instance1
|
- name: instance1
|
||||||
replicas: 1
|
replicas: 3
|
||||||
dataVolumeClaimSpec:
|
dataVolumeClaimSpec:
|
||||||
accessModes:
|
accessModes:
|
||||||
- "ReadWriteOnce"
|
- "ReadWriteOnce"
|
||||||
|
|
|
@ -14,13 +14,6 @@ prometheus:
|
||||||
password:
|
password:
|
||||||
name: prometheus-remote-basic-auth
|
name: prometheus-remote-basic-auth
|
||||||
key: password
|
key: password
|
||||||
additionalScrapeConfigs:
|
|
||||||
- job_name: postgresql
|
|
||||||
scrape_interval: 15s
|
|
||||||
scrape_timeout: 10s
|
|
||||||
static_configs:
|
|
||||||
- targets:
|
|
||||||
- 192.168.50.236:9187
|
|
||||||
grafana:
|
grafana:
|
||||||
enabled: false
|
enabled: false
|
||||||
alertmanager:
|
alertmanager:
|
||||||
|
|
|
@ -53,7 +53,7 @@ data:
|
||||||
grpc_listen_port: 0
|
grpc_listen_port: 0
|
||||||
|
|
||||||
clients:
|
clients:
|
||||||
- url: http://100.126.232.130:3030/loki/api/v1/push
|
- url: http://monitoring:3030/loki/api/v1/push
|
||||||
|
|
||||||
positions:
|
positions:
|
||||||
filename: /tmp/positions.yaml
|
filename: /tmp/positions.yaml
|
||||||
|
@ -127,7 +127,7 @@ metadata:
|
||||||
subjects:
|
subjects:
|
||||||
- kind: ServiceAccount
|
- kind: ServiceAccount
|
||||||
name: promtail-serviceaccount
|
name: promtail-serviceaccount
|
||||||
namespace: promtail
|
namespace: default
|
||||||
roleRef:
|
roleRef:
|
||||||
kind: ClusterRole
|
kind: ClusterRole
|
||||||
name: promtail-clusterrole
|
name: promtail-clusterrole
|
||||||
|
|
|
@ -1,149 +0,0 @@
|
||||||
let
|
|
||||||
appName = "snikket";
|
|
||||||
snikketImage = "git.gmem.ca/arch/snikket-server:latest";
|
|
||||||
snikketPortalImage = "snikket/snikket-web-portal:stable";
|
|
||||||
in
|
|
||||||
{
|
|
||||||
lib,
|
|
||||||
config,
|
|
||||||
kubenix,
|
|
||||||
...
|
|
||||||
}: {
|
|
||||||
kubernetes.resources.services.snikket = {
|
|
||||||
metadata.namespace = "snikket";
|
|
||||||
spec = {
|
|
||||||
selector.app = appName;
|
|
||||||
ports.http = {
|
|
||||||
port = 5280;
|
|
||||||
targetPort = 5280;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
kubernetes.resources.services.snikket-xmpp = {
|
|
||||||
metadata.namespace = "snikket";
|
|
||||||
spec = {
|
|
||||||
type = "NodePort";
|
|
||||||
selector.app = appName;
|
|
||||||
ports.http = {
|
|
||||||
port = 5222;
|
|
||||||
targetPort = 5222;
|
|
||||||
nodePort = 5222;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
kubernetes.resources.services.snikket-web-portal = {
|
|
||||||
metadata.namespace = "snikket";
|
|
||||||
spec = {
|
|
||||||
selector.app = appName + "-web-portal";
|
|
||||||
ports.http = {
|
|
||||||
port = 5765;
|
|
||||||
targetPort = 5765;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
kubernetes.resources.deployments.snikket = {
|
|
||||||
metadata.namespace = "snikket";
|
|
||||||
spec = {
|
|
||||||
selector.matchLabels.app = appName;
|
|
||||||
template = {
|
|
||||||
metadata.labels.app = appName;
|
|
||||||
spec = {
|
|
||||||
containers = {
|
|
||||||
snikket = {
|
|
||||||
image = snikketImage;
|
|
||||||
env.SNIKKET_TWEAK_TURNSERVER.value = "0";
|
|
||||||
env.SNIKKET_TWEAK_INTERNAL_HTTP_INTERFACE.value = "0.0.0.0";
|
|
||||||
envFrom = [{configMapRef.name = "snikket";}];
|
|
||||||
imagePullPolicy = "Always";
|
|
||||||
volumeMounts = [
|
|
||||||
{
|
|
||||||
name = "certs";
|
|
||||||
mountPath = "/etc/prosody/certs/chat.gmem.ca.crt";
|
|
||||||
subPath = "tls.crt";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "certs";
|
|
||||||
mountPath = "/etc/prosody/certs/chat.gmem.ca.key";
|
|
||||||
subPath = "tls.key";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
ports.http.containerPort = 5280;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
volumes = {
|
|
||||||
certs.secret.secretName = "chat-gmem-ca";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
kubernetes.resources.deployments.snikket-web-portal = {
|
|
||||||
metadata.namespace = "snikket";
|
|
||||||
spec = {
|
|
||||||
selector.matchLabels.app = appName + "-web-portal";
|
|
||||||
template = {
|
|
||||||
metadata.labels.app = appName + "-web-portal";
|
|
||||||
spec = {
|
|
||||||
containers = {
|
|
||||||
snikket = {
|
|
||||||
image = snikketPortalImage;
|
|
||||||
env.SNIKKET_TWEAK_PORTAL_INTERNAL_HTTP_INTERFACE.value = "0.0.0.0";
|
|
||||||
env.SNIKKET_WEB_PROSODY_ENDPOINT.value = "http://snikket:5280";
|
|
||||||
imagePullPolicy = "Always";
|
|
||||||
ports.http.containerPort = 5765;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
kubernetes.resources.ingresses.snikket = {
|
|
||||||
metadata = {
|
|
||||||
name = appName;
|
|
||||||
namespace = "snikket";
|
|
||||||
annotations = {
|
|
||||||
"cert-manager.io/cluster-issuer" = "le-issuer";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
spec = {
|
|
||||||
tls = [
|
|
||||||
{
|
|
||||||
hosts = ["chat.gmem.ca"];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
rules = [
|
|
||||||
{
|
|
||||||
host = "chat.gmem.ca";
|
|
||||||
http.paths = [
|
|
||||||
{
|
|
||||||
path = "/";
|
|
||||||
pathType = "Prefix";
|
|
||||||
backend.service = {
|
|
||||||
name = appName + "-web-portal";
|
|
||||||
port.name = "http";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
]
|
|
||||||
++ lib.lists.forEach [
|
|
||||||
# Routes we want to hit Prosody's backend
|
|
||||||
"/admin_api"
|
|
||||||
"/invites_api"
|
|
||||||
"/invites_bootstrap"
|
|
||||||
"/upload"
|
|
||||||
"/http-bind"
|
|
||||||
"/xmpp-websocket"
|
|
||||||
"/.well-known/host-meta"
|
|
||||||
"/.well-known/host-meta.json"
|
|
||||||
] (path: {
|
|
||||||
path = path;
|
|
||||||
pathType = "Prefix";
|
|
||||||
backend.service = {
|
|
||||||
name = appName;
|
|
||||||
port.name = "http";
|
|
||||||
};
|
|
||||||
});
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -1,50 +1,108 @@
|
||||||
let
|
let
|
||||||
appName = "tclip";
|
appName = "tclip";
|
||||||
|
litestreamImage = "litestream/litestream:sha-749bc0d";
|
||||||
tclipImage = "git.gmem.ca/arch/tclip:arm";
|
tclipImage = "git.gmem.ca/arch/tclip:arm";
|
||||||
in {
|
in {
|
||||||
kubernetes.resources.statefulSets.tclip = {
|
kubernetes.resources."monitoring.coreos.com"."v1".ServiceMonitor.tclip = {
|
||||||
metadata.namespace = "tclip";
|
|
||||||
spec = {
|
spec = {
|
||||||
serviceName = appName;
|
|
||||||
selector.matchLabels.app = appName;
|
selector.matchLabels.app = appName;
|
||||||
|
endpoints = [
|
||||||
|
{
|
||||||
|
port = "metrics";
|
||||||
|
interval = "30s";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
kubernetes.resources.services.tclip = {
|
||||||
|
metadata.labels.app = appName;
|
||||||
|
spec = {
|
||||||
|
selector.app = appName;
|
||||||
|
ports.metrics = {
|
||||||
|
port = 9090;
|
||||||
|
targetPort = 9090;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
kubernetes.resources.statefulSets.tclip.spec = {
|
||||||
|
selector.matchLabels.app = appName;
|
||||||
|
serviceName = appName;
|
||||||
template = {
|
template = {
|
||||||
metadata.labels.app = appName;
|
metadata.labels.app = appName;
|
||||||
spec = {
|
spec = {
|
||||||
|
volumes = {
|
||||||
|
litestream.configMap.name = "tclip-litestream";
|
||||||
|
config.configMap.name = "tclip";
|
||||||
|
};
|
||||||
|
initContainers.init-litestream = {
|
||||||
|
image = litestreamImage;
|
||||||
|
args = ["restore" "-if-db-not-exists" "-if-replica-exists" "-v" "/data/data.db"];
|
||||||
|
volumeMounts = [
|
||||||
|
{
|
||||||
|
name = "data";
|
||||||
|
mountPath = "/data";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "litestream";
|
||||||
|
mountPath = "/etc/litestream.yml";
|
||||||
|
subPath = "tclip.yml";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
envFrom = [{secretRef.name = "tclip-litestream-s3";}];
|
||||||
|
};
|
||||||
containers = {
|
containers = {
|
||||||
tclip = {
|
tclip = {
|
||||||
image = tclipImage;
|
image = tclipImage;
|
||||||
imagePullPolicy = "Always";
|
imagePullPolicy = "Always";
|
||||||
|
volumeMounts = [
|
||||||
|
{
|
||||||
|
name = "data";
|
||||||
|
mountPath = "/data";
|
||||||
|
}
|
||||||
|
];
|
||||||
env = [
|
env = [
|
||||||
{
|
{
|
||||||
name = "DATA_DIR";
|
name = "DATA_DIR";
|
||||||
value = "/state";
|
value = "/data";
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
name = "USE_FUNNEL";
|
name = "USE_FUNNEL";
|
||||||
value = "true";
|
value = "true";
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
envFrom = [{secretRef.name = "tclip";}];
|
};
|
||||||
|
litestream = {
|
||||||
|
image = litestreamImage;
|
||||||
|
args = ["replicate"];
|
||||||
volumeMounts = [
|
volumeMounts = [
|
||||||
{
|
{
|
||||||
name = "state";
|
name = "data";
|
||||||
mountPath = "/state";
|
mountPath = "/data";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "litestream";
|
||||||
|
mountPath = "/etc/litestream.yml";
|
||||||
|
subPath = "tclip.yml";
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
envFrom = [{secretRef.name = "tclip-litestream-s3";}];
|
||||||
|
ports.metrics = {
|
||||||
|
containerPort = 9090;
|
||||||
|
name = "metrics";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
volumeClaimTemplates = [
|
volumeClaimTemplates = [
|
||||||
{
|
{
|
||||||
metadata.name = "state";
|
metadata.name = "data";
|
||||||
spec = {
|
spec = {
|
||||||
storageClassName = "nfs-client";
|
storageClassName = "nfs-client";
|
||||||
accessModes = ["ReadWriteOnce"];
|
accessModes = ["ReadWriteOnce"];
|
||||||
resources.requests.storage = "512Mi";
|
resources.requests.storage = "1Gi";
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,6 @@ apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: it-tools
|
name: it-tools
|
||||||
namespace: it-tools
|
|
||||||
spec:
|
spec:
|
||||||
selector:
|
selector:
|
||||||
matchLabels:
|
matchLabels:
|
||||||
|
@ -27,7 +26,6 @@ apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
name: it-tools
|
name: it-tools
|
||||||
namespace: it-tools
|
|
||||||
spec:
|
spec:
|
||||||
selector:
|
selector:
|
||||||
app: it-tools
|
app: it-tools
|
||||||
|
@ -39,14 +37,15 @@ apiVersion: networking.k8s.io/v1
|
||||||
kind: Ingress
|
kind: Ingress
|
||||||
metadata:
|
metadata:
|
||||||
name: it-tools
|
name: it-tools
|
||||||
namespace: it-tools
|
|
||||||
annotations:
|
annotations:
|
||||||
cert-manager.io/cluster-issuer: "le-issuer"
|
cert-manager.io/issuer: "le-issuer"
|
||||||
nginx.ingress.kubernetes.io/proxy-body-size: 100m
|
nginx.ingress.kubernetes.io/proxy-body-size: 100m
|
||||||
|
namespace: default
|
||||||
spec:
|
spec:
|
||||||
tls:
|
tls:
|
||||||
- hosts:
|
- hosts:
|
||||||
- tools.gmem.ca
|
- tools.gmem.ca
|
||||||
|
secretName: gmem-ca-wildcard
|
||||||
rules:
|
rules:
|
||||||
- host: tools.gmem.ca
|
- host: tools.gmem.ca
|
||||||
http:
|
http:
|
||||||
|
|
|
@ -1,23 +1,38 @@
|
||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: StatefulSet
|
||||||
metadata:
|
metadata:
|
||||||
name: vaultwarden
|
name: vaultwarden
|
||||||
spec:
|
spec:
|
||||||
replicas: 1
|
|
||||||
selector:
|
selector:
|
||||||
matchLabels:
|
matchLabels:
|
||||||
app: vaultwarden
|
app: vaultwarden
|
||||||
|
serviceName: vaultwarden
|
||||||
|
replicas: 1
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
labels:
|
labels:
|
||||||
app: vaultwarden
|
app: vaultwarden
|
||||||
spec:
|
spec:
|
||||||
volumes:
|
volumes:
|
||||||
|
- name: litestream
|
||||||
|
configMap:
|
||||||
|
name: vaultwarden-litestream
|
||||||
- name: config
|
- name: config
|
||||||
configMap:
|
configMap:
|
||||||
name: vaultwarden
|
name: vaultwarden
|
||||||
|
initContainers:
|
||||||
|
- name: init-litestream
|
||||||
|
image: litestream/litestream:0.3.11
|
||||||
|
args: ['restore', '-if-db-not-exists', '-if-replica-exists', '-v', '/data/db.sqlite3']
|
||||||
|
volumeMounts:
|
||||||
- name: data
|
- name: data
|
||||||
emptyDir: {}
|
mountPath: /data
|
||||||
|
- name: litestream
|
||||||
|
mountPath: /etc/litestream.yml
|
||||||
|
subPath: vaultwarden.yml
|
||||||
|
envFrom:
|
||||||
|
- secretRef:
|
||||||
|
name: vaultwarden-litestream-s3
|
||||||
containers:
|
containers:
|
||||||
- name: vaultwarden
|
- name: vaultwarden
|
||||||
image: docker.io/vaultwarden/server:testing
|
image: docker.io/vaultwarden/server:testing
|
||||||
|
@ -29,9 +44,6 @@ spec:
|
||||||
requests:
|
requests:
|
||||||
memory: "64Mi"
|
memory: "64Mi"
|
||||||
cpu: "100m"
|
cpu: "100m"
|
||||||
envFrom:
|
|
||||||
- secretRef:
|
|
||||||
name: vaultwarden
|
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 80
|
- containerPort: 80
|
||||||
name: web
|
name: web
|
||||||
|
@ -41,6 +53,38 @@ spec:
|
||||||
- name: config
|
- name: config
|
||||||
mountPath: /data/config.json
|
mountPath: /data/config.json
|
||||||
subPath: vaultwarden.json
|
subPath: vaultwarden.json
|
||||||
|
- name: litestream
|
||||||
|
image: litestream/litestream:0.3.11
|
||||||
|
args: ['replicate']
|
||||||
|
volumeMounts:
|
||||||
|
- name: data
|
||||||
|
mountPath: /data
|
||||||
|
- name: litestream
|
||||||
|
mountPath: /etc/litestream.yml
|
||||||
|
subPath: vaultwarden.yml
|
||||||
|
envFrom:
|
||||||
|
- secretRef:
|
||||||
|
name: vaultwarden-litestream-s3
|
||||||
|
ports:
|
||||||
|
- name: metrics
|
||||||
|
containerPort: 9090
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
memory: "128Mi"
|
||||||
|
cpu: "300m"
|
||||||
|
requests:
|
||||||
|
memory: "64Mi"
|
||||||
|
cpu: "100m"
|
||||||
|
|
||||||
|
volumeClaimTemplates:
|
||||||
|
- metadata:
|
||||||
|
name: data
|
||||||
|
spec:
|
||||||
|
storageClassName: nfs-client
|
||||||
|
accessModes: [ "ReadWriteOnce" ]
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: 1Gi
|
||||||
---
|
---
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
|
@ -55,13 +99,31 @@ spec:
|
||||||
- port: 80
|
- port: 80
|
||||||
targetPort: 80
|
targetPort: 80
|
||||||
name: web
|
name: web
|
||||||
|
- port: 9090
|
||||||
|
targetPort: 9090
|
||||||
|
name: metrics
|
||||||
|
---
|
||||||
|
apiVersion: monitoring.coreos.com/v1
|
||||||
|
kind: ServiceMonitor
|
||||||
|
metadata:
|
||||||
|
name: vaultwarden
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: vaultwarden
|
||||||
|
endpoints:
|
||||||
|
- port: metrics
|
||||||
|
interval: 30s
|
||||||
---
|
---
|
||||||
apiVersion: networking.k8s.io/v1
|
apiVersion: networking.k8s.io/v1
|
||||||
kind: Ingress
|
kind: Ingress
|
||||||
metadata:
|
metadata:
|
||||||
name: vaultwarden
|
name: vaultwarden
|
||||||
annotations:
|
annotations:
|
||||||
cert-manager.io/cluser-issuer: "le-issuer"
|
cert-manager.io/issuer: "le-issuer"
|
||||||
|
nginx.ingress.kubernetes.io/configuration-snippet: |
|
||||||
|
more_set_headers "X-Forwarded-For $http_x_forwarded_for";
|
||||||
|
namespace: default
|
||||||
spec:
|
spec:
|
||||||
tls:
|
tls:
|
||||||
- hosts:
|
- hosts:
|
||||||
|
|
|
@ -3,7 +3,6 @@ let
|
||||||
appImage = "git.gmem.ca/arch/vrchat-prometheus-adapter:arm";
|
appImage = "git.gmem.ca/arch/vrchat-prometheus-adapter:arm";
|
||||||
in {
|
in {
|
||||||
kubernetes.resources."monitoring.coreos.com"."v1".ServiceMonitor.vrchat-prometheus-adapter = {
|
kubernetes.resources."monitoring.coreos.com"."v1".ServiceMonitor.vrchat-prometheus-adapter = {
|
||||||
metadata.namespace = "vrchat";
|
|
||||||
spec = {
|
spec = {
|
||||||
selector.matchLabels.app = appName;
|
selector.matchLabels.app = appName;
|
||||||
endpoints = [
|
endpoints = [
|
||||||
|
@ -15,7 +14,6 @@ in {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
kubernetes.resources.services.vrchat-prometheus-adapter = {
|
kubernetes.resources.services.vrchat-prometheus-adapter = {
|
||||||
metadata.namespace = "vrchat";
|
|
||||||
metadata.labels.app = appName;
|
metadata.labels.app = appName;
|
||||||
spec = {
|
spec = {
|
||||||
selector.app = appName;
|
selector.app = appName;
|
||||||
|
@ -25,9 +23,7 @@ in {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
kubernetes.resources.deployments.vrchat-prometheus-adapter = {
|
kubernetes.resources.deployments.vrchat-prometheus-adapter.spec = {
|
||||||
metadata.namespace = "vrchat";
|
|
||||||
spec = {
|
|
||||||
selector.matchLabels.app = appName;
|
selector.matchLabels.app = appName;
|
||||||
template = {
|
template = {
|
||||||
metadata.labels.app = appName;
|
metadata.labels.app = appName;
|
||||||
|
@ -63,5 +59,4 @@ in {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
(modulesPath + "/profiles/qemu-guest.nix")
|
(modulesPath + "/profiles/qemu-guest.nix")
|
||||||
''${builtins.fetchTarball {
|
''${builtins.fetchTarball {
|
||||||
url = "https://github.com/nix-community/disko/archive/master.tar.gz";
|
url = "https://github.com/nix-community/disko/archive/master.tar.gz";
|
||||||
sha256 = "1dk4xi79lvm8hv1raf2snm3j8y4q23csm6d3siljg4cpf2y4wyl7";
|
sha256 = "0qyl65hs2j4f5ffj2lv5kb4hc1gradkqvv2j35hbdyiik155l4gn";
|
||||||
}}/module.nix''
|
}}/module.nix''
|
||||||
./disk-config.nix
|
./disk-config.nix
|
||||||
];
|
];
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
(modulesPath + "/profiles/qemu-guest.nix")
|
(modulesPath + "/profiles/qemu-guest.nix")
|
||||||
''${builtins.fetchTarball {
|
''${builtins.fetchTarball {
|
||||||
url = "https://github.com/nix-community/disko/archive/master.tar.gz";
|
url = "https://github.com/nix-community/disko/archive/master.tar.gz";
|
||||||
sha256 = "1dk4xi79lvm8hv1raf2snm3j8y4q23csm6d3siljg4cpf2y4wyl7";
|
sha256 = "0qyl65hs2j4f5ffj2lv5kb4hc1gradkqvv2j35hbdyiik155l4gn";
|
||||||
}}/module.nix''
|
}}/module.nix''
|
||||||
./disk-config.nix
|
./disk-config.nix
|
||||||
];
|
];
|
||||||
|
|
113
nix/glasgow/configuration.nix
Normal file
113
nix/glasgow/configuration.nix
Normal file
|
@ -0,0 +1,113 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
imports = [
|
||||||
|
# Include the results of the hardware scan.
|
||||||
|
./hardware.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
age.secrets.k3s-token = {
|
||||||
|
file = ../../secrets/k3s-token.age;
|
||||||
|
owner = "root";
|
||||||
|
};
|
||||||
|
|
||||||
|
boot = {
|
||||||
|
supportedFilesystems = ["nfs"];
|
||||||
|
kernelPackages = pkgs.linuxPackages;
|
||||||
|
kernelParams = ["cgroup_enable=memory" "cgroup_enable=cpuset" "cgroup_memory=1"];
|
||||||
|
loader = {
|
||||||
|
grub.enable = false;
|
||||||
|
generic-extlinux-compatible.enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
swapDevices = [
|
||||||
|
{
|
||||||
|
device = "/var/lib/swapfile";
|
||||||
|
size = 8 * 1024;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
nix = {
|
||||||
|
settings = {
|
||||||
|
auto-optimise-store = true;
|
||||||
|
experimental-features = ["nix-command" "flakes"];
|
||||||
|
};
|
||||||
|
gc = {
|
||||||
|
automatic = true;
|
||||||
|
dates = "weekly";
|
||||||
|
options = "--delete-older-than 30d";
|
||||||
|
};
|
||||||
|
# Free up to 1GiB whenever there is less than 100MiB left.
|
||||||
|
extraOptions = ''
|
||||||
|
min-free = ${toString (100 * 1024 * 1024)}
|
||||||
|
max-free = ${toString (1024 * 1024 * 1024)}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
networking = {
|
||||||
|
hostName = "glasgow";
|
||||||
|
domain = "gmem.ca";
|
||||||
|
firewall = {
|
||||||
|
trustedInterfaces = ["tailscale0"];
|
||||||
|
checkReversePath = "loose";
|
||||||
|
allowedUDPPorts = [41641];
|
||||||
|
allowedTCPPorts = [22 80 443 6443 10250];
|
||||||
|
enable = false;
|
||||||
|
};
|
||||||
|
nftables.enable = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
time.timeZone = "Europe/London";
|
||||||
|
|
||||||
|
users.users.gsimmer = {
|
||||||
|
isNormalUser = true;
|
||||||
|
extraGroups = ["wheel"];
|
||||||
|
packages = with pkgs; [
|
||||||
|
tree
|
||||||
|
];
|
||||||
|
openssh.authorizedKeys.keys = let
|
||||||
|
authorizedKeys = pkgs.fetchurl {
|
||||||
|
url = "https://gmem.ca/ssh";
|
||||||
|
hash = "sha256-7PpFDgWVfp26c9PuW+2s3O8MBAODtHr4q7WU/l3BoG4=";
|
||||||
|
};
|
||||||
|
in
|
||||||
|
pkgs.lib.splitString "\n" (builtins.readFile
|
||||||
|
authorizedKeys);
|
||||||
|
};
|
||||||
|
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
vim
|
||||||
|
wget
|
||||||
|
htop
|
||||||
|
git
|
||||||
|
screen
|
||||||
|
nix-output-monitor
|
||||||
|
tailscale
|
||||||
|
nfs-utils
|
||||||
|
libraspberrypi
|
||||||
|
];
|
||||||
|
|
||||||
|
services = {
|
||||||
|
rpcbind.enable = true;
|
||||||
|
openssh.enable = true;
|
||||||
|
tailscale.enable = true;
|
||||||
|
k3s = {
|
||||||
|
enable = true;
|
||||||
|
role = "agent";
|
||||||
|
serverAddr = "https://100.77.43.133:6443";
|
||||||
|
tokenFile = config.age.secrets.k3s-token.path;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
hardware = {
|
||||||
|
bluetooth = {
|
||||||
|
enable = true;
|
||||||
|
powerOnBoot = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
system.stateVersion = "23.11"; # dId YoU rEaD tHe CoMmEnT?
|
||||||
|
}
|
37
nix/glasgow/hardware.nix
Normal file
37
nix/glasgow/hardware.nix
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||||
|
# and may be overwritten by future invocations. Please make changes
|
||||||
|
# to /etc/nixos/configuration.nix instead.
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
modulesPath,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
imports = [
|
||||||
|
(modulesPath + "/installer/scan/not-detected.nix")
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.initrd.availableKernelModules = ["xhci_pci" "uas"];
|
||||||
|
boot.initrd.kernelModules = [];
|
||||||
|
boot.kernelModules = [];
|
||||||
|
boot.extraModulePackages = [];
|
||||||
|
|
||||||
|
fileSystems."/" = {
|
||||||
|
device = "/dev/disk/by-uuid/44444444-4444-4444-8888-888888888888";
|
||||||
|
fsType = "ext4";
|
||||||
|
};
|
||||||
|
|
||||||
|
swapDevices = [];
|
||||||
|
|
||||||
|
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
||||||
|
# (the default) this is the recommended approach. When using systemd-networkd it's
|
||||||
|
# still possible to use this option, but it's recommended to use it in conjunction
|
||||||
|
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
|
||||||
|
networking.useDHCP = lib.mkDefault true;
|
||||||
|
# networking.interfaces.end0.useDHCP = lib.mkDefault true;
|
||||||
|
# networking.interfaces.wlan0.useDHCP = lib.mkDefault true;
|
||||||
|
|
||||||
|
nixpkgs.hostPlatform = lib.mkDefault "aarch64-linux";
|
||||||
|
powerManagement.cpuFreqGovernor = lib.mkDefault "ondemand";
|
||||||
|
}
|
|
@ -22,7 +22,7 @@
|
||||||
in [
|
in [
|
||||||
(import (builtins.fetchTarball {
|
(import (builtins.fetchTarball {
|
||||||
url = "https://github.com/nix-community/emacs-overlay/archive/master.tar.gz";
|
url = "https://github.com/nix-community/emacs-overlay/archive/master.tar.gz";
|
||||||
sha256 = "0yy91pryh8pbq2sz07nzjb11s5ghrn9773v0vsh475an4g4p9933";
|
sha256 = "1dqmw3v3w8grqyc492hadxswvj0dfw4w2mbb4nmfcmnanr5i3ys3";
|
||||||
}))
|
}))
|
||||||
discordOverlay
|
discordOverlay
|
||||||
];
|
];
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
fileSystems."/tmp" = {
|
fileSystems."/tmp" = {
|
||||||
device = "tmpfs";
|
device = "tmpfs";
|
||||||
fsType = "tmpfs";
|
fsType = "tmpfs";
|
||||||
options = [ "size=4G" "mode=777" ]; # mode=755 so only root can write to those files
|
options = [ "size=1G" "mode=777" ]; # mode=755 so only root can write to those files
|
||||||
};
|
};
|
||||||
|
|
||||||
swapDevices = [
|
swapDevices = [
|
||||||
|
|
|
@ -118,16 +118,6 @@
|
||||||
period = "24h";
|
period = "24h";
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
{
|
|
||||||
from = "2024-05-01";
|
|
||||||
store = "tsdb";
|
|
||||||
object_store = "filesystem";
|
|
||||||
schema = "v13";
|
|
||||||
index = {
|
|
||||||
prefix = "index_";
|
|
||||||
period = "24h";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -137,11 +127,6 @@
|
||||||
cache_location = "/var/lib/loki/boltdb-shipper-cache";
|
cache_location = "/var/lib/loki/boltdb-shipper-cache";
|
||||||
cache_ttl = "24h";
|
cache_ttl = "24h";
|
||||||
};
|
};
|
||||||
tsdb_shipper = {
|
|
||||||
active_index_directory = "/var/lib/loki/tsdb-shipper-active";
|
|
||||||
cache_location = "/var/lib/loki/tsdb-shipper-cache";
|
|
||||||
cache_ttl = "24h";
|
|
||||||
};
|
|
||||||
|
|
||||||
filesystem = {
|
filesystem = {
|
||||||
directory = "/var/lib/loki/chunks";
|
directory = "/var/lib/loki/chunks";
|
||||||
|
@ -409,11 +394,6 @@
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
{
|
|
||||||
job_name = "haproxy";
|
|
||||||
scrape_interval = "10s";
|
|
||||||
static_configs = [{targets = ["100.87.208.14:8404"];}];
|
|
||||||
}
|
|
||||||
];
|
];
|
||||||
exporters.node = {
|
exporters.node = {
|
||||||
enable = true;
|
enable = true;
|
||||||
|
|
107
nix/seattle/configuration.nix
Normal file
107
nix/seattle/configuration.nix
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
imports = [
|
||||||
|
# Include the results of the hardware scan.
|
||||||
|
./hardware.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
boot = {
|
||||||
|
supportedFilesystems = ["nfs"];
|
||||||
|
kernelPackages = pkgs.linuxPackages_rpi4;
|
||||||
|
kernelParams = ["cgroup_enable=memory" "cgroup_enable=cpuset" "cgroup_memory=1"];
|
||||||
|
loader = {
|
||||||
|
grub.enable = false;
|
||||||
|
generic-extlinux-compatible.enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
nix = {
|
||||||
|
settings = {
|
||||||
|
auto-optimise-store = true;
|
||||||
|
experimental-features = ["nix-command" "flakes"];
|
||||||
|
};
|
||||||
|
gc = {
|
||||||
|
automatic = true;
|
||||||
|
dates = "weekly";
|
||||||
|
options = "--delete-older-than 30d";
|
||||||
|
};
|
||||||
|
# Free up to 1GiB whenever there is less than 100MiB left.
|
||||||
|
extraOptions = ''
|
||||||
|
min-free = ${toString (100 * 1024 * 1024)}
|
||||||
|
max-free = ${toString (1024 * 1024 * 1024)}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
networking = {
|
||||||
|
hostName = "seattle";
|
||||||
|
domain = "gmem.ca";
|
||||||
|
firewall = {
|
||||||
|
trustedInterfaces = ["tailscale0"];
|
||||||
|
checkReversePath = "loose";
|
||||||
|
allowedTCPPorts = [22 80 443 6443 10250];
|
||||||
|
allowedUDPPorts = [41641 80 443];
|
||||||
|
enable = false;
|
||||||
|
};
|
||||||
|
nftables.enable = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
time.timeZone = "Europe/London";
|
||||||
|
|
||||||
|
users.users.gsimmer = {
|
||||||
|
isNormalUser = true;
|
||||||
|
extraGroups = ["wheel"];
|
||||||
|
packages = with pkgs; [
|
||||||
|
tree
|
||||||
|
];
|
||||||
|
openssh.authorizedKeys.keys = let
|
||||||
|
authorizedKeys = pkgs.fetchurl {
|
||||||
|
url = "https://gmem.ca/ssh";
|
||||||
|
hash = "sha256-7PpFDgWVfp26c9PuW+2s3O8MBAODtHr4q7WU/l3BoG4=";
|
||||||
|
};
|
||||||
|
in
|
||||||
|
pkgs.lib.splitString "\n" (builtins.readFile
|
||||||
|
authorizedKeys);
|
||||||
|
};
|
||||||
|
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
vim
|
||||||
|
wget
|
||||||
|
htop
|
||||||
|
git
|
||||||
|
screen
|
||||||
|
nix-output-monitor
|
||||||
|
tailscale
|
||||||
|
nfs-utils
|
||||||
|
libraspberrypi
|
||||||
|
];
|
||||||
|
|
||||||
|
services = {
|
||||||
|
rpcbind.enable = true;
|
||||||
|
openssh.enable = true;
|
||||||
|
tailscale.enable = true;
|
||||||
|
k3s = {
|
||||||
|
enable = true;
|
||||||
|
role = "server";
|
||||||
|
extraFlags = toString [
|
||||||
|
"--secrets-encryption --disable=traefik,servicelb --kube-apiserver-arg service-node-port-range=69-32767"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
hardware = {
|
||||||
|
bluetooth = {
|
||||||
|
enable = true;
|
||||||
|
powerOnBoot = true;
|
||||||
|
};
|
||||||
|
raspberry-pi."4".apply-overlays-dtmerge.enable = true;
|
||||||
|
deviceTree = {
|
||||||
|
enable = true;
|
||||||
|
filter = "*rpi-4-*.dtb";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
system.stateVersion = "23.11"; # dId YoU rEaD tHe CoMmEnT?
|
||||||
|
}
|
37
nix/seattle/hardware.nix
Normal file
37
nix/seattle/hardware.nix
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||||
|
# and may be overwritten by future invocations. Please make changes
|
||||||
|
# to /etc/nixos/configuration.nix instead.
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
modulesPath,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
imports = [
|
||||||
|
(modulesPath + "/installer/scan/not-detected.nix")
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.initrd.availableKernelModules = ["xhci_pci" "uas"];
|
||||||
|
boot.initrd.kernelModules = [];
|
||||||
|
boot.kernelModules = [];
|
||||||
|
boot.extraModulePackages = [];
|
||||||
|
|
||||||
|
fileSystems."/" = {
|
||||||
|
device = "/dev/disk/by-uuid/44444444-4444-4444-8888-888888888888";
|
||||||
|
fsType = "ext4";
|
||||||
|
};
|
||||||
|
|
||||||
|
swapDevices = [];
|
||||||
|
|
||||||
|
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
||||||
|
# (the default) this is the recommended approach. When using systemd-networkd it's
|
||||||
|
# still possible to use this option, but it's recommended to use it in conjunction
|
||||||
|
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
|
||||||
|
networking.useDHCP = lib.mkDefault true;
|
||||||
|
# networking.interfaces.end0.useDHCP = lib.mkDefault true;
|
||||||
|
# networking.interfaces.wlan0.useDHCP = lib.mkDefault true;
|
||||||
|
|
||||||
|
nixpkgs.hostPlatform = lib.mkDefault "aarch64-linux";
|
||||||
|
powerManagement.cpuFreqGovernor = lib.mkDefault "ondemand";
|
||||||
|
}
|
Loading…
Reference in a new issue