18 Commits
Author SHA1 Message Date
Greg Hellings 7243c7b1c0 fix: update gitea base URL
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
2026-08-08 01:00:46 -05:00
Greg Hellings e89b5ca5d1 fix: use IP address for nextcloud host 2026-08-08 01:00:12 -05:00
greg 076df9f924 Merge pull request 'fix: correct pve1 IP to 10.42.0.4, rename stale joel/opnsense refs' (#32) from emily/nixos:fix/pve1-ip-correction into main
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
Reviewed-on: #32
2026-08-08 05:58:50 +00:00
emily fcb5a89727 fix: correct pve1 IP to 10.42.0.4, rename stale joel/opnsense refs
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
pve1 is a static/DHCP-reserved Proxmox host at 10.42.0.4 (previously
mislabeled 'joel' in some places). 10.42.1.1 is the UDM Pro gateway
IP, not pve1 -- OPNsense was retired in favor of Ubiquiti. Removes
the stale duplicate PVE1 DHCP reservation at 10.42.1.1 and drops the
now-redundant 'joel' entry from network.json (consolidated into
pve1).
2026-08-08 00:44:21 -05:00
Greg Hellings c9671121dd fix: restore matrix well-known server
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
2026-08-07 17:19:45 -05:00
Greg Hellings a00773c97a fix: remove builder2
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
2026-08-06 22:53:34 -05:00
Greg Hellings 6bf0bcc0ef fix: restore immich access
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-builder2 Build done.
buildbot/nix-build Build done.
2026-08-06 21:43:28 -05:00
Greg Hellings 7619bf6258 chore: default actions packages 2026-08-06 20:36:41 -05:00
Greg Hellings 029b71d0d4 Pass traffic through genesis
* keepalived does not work with Nebula VPN
* update Genesis firewall to allow passing through local traffic
* target all traffic directly to the LAN IP using genesis's routing
2026-08-05 22:57:58 -05:00
Greg Hellings d779d275f2 Expose kubernetes on LAN 2026-08-05 20:07:35 -05:00
Greg Hellings 0196f1fd07 chore: re-enable linode gitea-runner
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-builder2 Build done.
buildbot/nix-build Build done.
2026-08-04 10:14:56 -05:00
Greg Hellings 6a13d843d7 chore: point homepage to new registry url
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-builder2 Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-hosea Build done.
buildbot/nix-build Build done.
2026-08-04 09:26:28 -05:00
Greg Hellings 8673d6193b chore: immich backup to Garage 2026-08-04 09:19:53 -05:00
Greg Hellings bbdfe1e1de chore: update Gitea to backup to Garage 2026-08-03 20:46:48 -05:00
Greg Hellings 71486e9ab3 chore: update Longhorn version 2026-08-03 20:46:20 -05:00
Greg Hellings 8a8664287f chore: remove gitea-runner 2026-08-03 18:56:23 -05:00
Greg Hellings 4965d42e59 chore: remove smokeping and donetick from k8s 2026-08-03 18:55:07 -05:00
Greg Hellings 03e174367d chore: uptimekuma migrated to NixOS 2026-08-03 18:52:01 -05:00
49 changed files with 176 additions and 640 deletions
+1 -1
View File
@@ -101,7 +101,7 @@
{ {
deployment = { deployment = {
inherit (v) tags; inherit (v) tags;
targetHost = if (v ? "nebulaIp") then v.nebulaIp else v.ts; targetHost = if (v ? "connectAddr") then v.connectAddr else v.nebulaIp;
targetUser = "greg"; targetUser = "greg";
}; };
} }
-60
View File
@@ -1,60 +0,0 @@
{
config,
metadata,
modulesPath,
...
}:
{
# Then build nixosConfiguration.<host>.config.system.build.images.proxmox
# SCP that to /var/lib/vz/dumps on the Proxmox host
imports = [ "${modulesPath}/virtualisation/proxmox-image.nix" ];
greg = {
home = true;
nebula.enable = true;
};
networking = {
defaultGateway = metadata.infra.gw;
nameservers = [ metadata.infra.dns ];
interfaces.ens18 = {
useDHCP = false;
ipv4.addresses = [
{
address = metadata.hosts."${config.networking.hostName}".ip;
prefixLength = 16;
}
];
};
};
virtualisation.diskSize = 20480; # Size in mebbibytes for the base disk image
# Use these instead of the above to run an LXC image
# The main reason I wouldn't use these is because Proxmox LXC does
# not seem to be well supported by either Nebula VPN or Tailscale,
# both of which I use for my mesh networking. If there isn't a need
# for the service to run on those networks, then by all means go ahead
# and use LXC!
# imports = [ (modulesPath + "/virtualisation/proxmox-lxc.nix") ];
# proxmoxLXC = {
# manageNetwork = false;
# privileged = true;
# };
# systemd.suppressedSystemUnits = [
# "dev-mqueue.mount"
# "sys-kernel-debug.mount"
# "sys-fs-fuse-connections.mount"
# ];
nix.settings = {
sandbox = false;
};
services = {
fstrim.enable = false; # Let Proxmox host handle fstrim
openssh = {
enable = true;
openFirewall = true;
settings = {
PermitRootLogin = "yes";
PasswordAuthentication = true;
PermitEmptyPasswords = "yes";
};
};
};
}
+2 -3
View File
@@ -1,12 +1,11 @@
# Local hosts # Local hosts
10.42.0.1 switch switch.thehellings.lan # Core switch for the network 10.42.0.1 switch switch.thehellings.lan # Core switch for the network
10.42.0.3 ap ap.thehellings.lan # OpenWRT access point (static IP) 10.42.0.3 ap ap.thehellings.lan # OpenWRT access point (static IP)
10.42.0.4 joel.thehellings.lan # Proxmox 10.42.0.4 pve1.thehellings.lan # Proxmox
10.42.0.5 sanswitch.thehellings.lan # Core switch for the SAN 10.42.0.5 sanswitch.thehellings.lan # Core switch for the SAN
# Home servers # Home servers
10.42.1.1 pve1.thehellings.lan 10.42.1.1 udm router udm.thehellings.lan router.thehellings.lan # Ubiquiti UDM gateway
10.42.1.2 opnsense router opnsense.thehellings.lan router.thehellings.lan
10.42.1.3 printer.thehellings.lan 10.42.1.3 printer.thehellings.lan
10.42.1.4 chronicles chronicles.thehellings.lan nas.thehellings.lan s3.thehellings.lan 10.42.1.4 chronicles chronicles.thehellings.lan nas.thehellings.lan s3.thehellings.lan
10.42.1.5 genesis genesis.thehellings.lan dns dns.thehellings.lan smart smart.thehellings.lan speedtest.thehellings.lan nixcache.thehellings.lan gitcache.thehellings.lan 10.42.1.5 genesis genesis.thehellings.lan dns dns.thehellings.lan smart smart.thehellings.lan speedtest.thehellings.lan nixcache.thehellings.lan gitcache.thehellings.lan
+2 -2
View File
@@ -77,7 +77,7 @@ in
}; };
}; };
firewall = { firewall = {
enable = false; enable = true;
allowedUDPPorts = [ allowedUDPPorts = [
dhcpPort dhcpPort
dnsPort dnsPort
@@ -88,7 +88,7 @@ in
80 80
]; ];
}; };
nftables.enable = false; nftables.enable = true;
}; };
environment.etc."hosts.d/local".text = extraHosts; environment.etc."hosts.d/local".text = extraHosts;
+1 -5
View File
@@ -60,7 +60,7 @@
reservations = [ reservations = [
# Static IPs for personal work # Static IPs for personal work
{ {
hw-address = "00:23:24:72:64:32"; # Joel hw-address = "00:23:24:72:64:32"; # PVE1
ip-address = "10.42.0.4"; ip-address = "10.42.0.4";
} }
{ {
@@ -76,10 +76,6 @@
#ip-address = "10.42.2.253"; #ip-address = "10.42.2.253";
ip-address = "10.42.100.6"; ip-address = "10.42.100.6";
} }
{
hw-address = "7c:83:34:b9:ee:ec"; # PVE1
ip-address = "10.42.1.1";
}
{ {
hw-address = "74:ee:2a:66:b3:51"; # printer hw-address = "74:ee:2a:66:b3:51"; # printer
ip-address = "10.42.1.3"; ip-address = "10.42.1.3";
+4
View File
@@ -47,6 +47,10 @@
enable = true; enable = true;
extraLabels = [ "bare-metal:host" ]; extraLabels = [ "bare-metal:host" ];
}; };
vmdev = {
enable = true;
host = "libvirt";
};
}; };
networking = { networking = {
+54 -19
View File
@@ -1,8 +1,9 @@
{ {
config,
lib,
metadata,
pkgs, pkgs,
pkgs', pkgs',
lib,
config,
... ...
}: }:
@@ -10,6 +11,21 @@ let
homepage = "127.0.0.1:30080"; homepage = "127.0.0.1:30080";
nextcloudPort = 8080; nextcloudPort = 8080;
sshPort = 2222; sshPort = 2222;
matrixServer = pkgs.writeText "matrix_server" (
builtins.toJSON {
"m.server" = "matrix.thehellings.com:443";
}
);
matrixClient = pkgs.writeText "matrix_client" (
builtins.toJSON {
"m.homeserver" = {
base_url = "https://matrix.thehellings.com";
};
"m.identity_server" = {
base_url = "https://vector.im";
};
}
);
in in
{ {
imports = [ imports = [
@@ -59,10 +75,11 @@ in
}; };
}; };
gitea-runner = { gitea-runner = {
enable = false; enable = true;
extraLabels = [ labels = [
"vps:host" "vps:host"
"blog:host" "blog:host"
"nixos-linode:host"
]; ];
}; };
home = false; home = false;
@@ -70,6 +87,12 @@ in
nebula = { nebula = {
enable = true; enable = true;
isLighthouse = true; isLighthouse = true;
unsafeRoutes = [
{
route = "10.42.0.0/16";
via = metadata.hosts.genesis.nebulaIp;
}
];
}; };
tailscale.enable = true; tailscale.enable = true;
}; };
@@ -126,7 +149,7 @@ in
COOKIE_DOMAIN = "thehellings.com"; COOKIE_DOMAIN = "thehellings.com";
SERVE_ROBOTS_TXT = true; SERVE_ROBOTS_TXT = true;
SLOG_LEVEL = "DEBUG"; SLOG_LEVEL = "DEBUG";
TARGET = "http://git.k3s.nebula.thehellings.com"; TARGET = "http://git.k3s.thehellings.lan";
}; };
}; };
}; };
@@ -149,9 +172,9 @@ in
bind *:${toString sshPort} bind *:${toString sshPort}
timeout client 1h timeout client 1h
mode tcp mode tcp
server git-isaiah isaiah.nebula.thehellings.com:32222 server git-isaiah isaiah.thehellings.lan:32222
server git-jeremiah jeremiah.nebula.thehellings.com:32222 server git-jeremiah jeremiah.thehellings.lan:32222
server git-zeke zeke.nebula.thehellings.com:32222 server git-zeke zeke.thehellings.lan:32222
frontend https frontend https
bind *:80 bind *:80
@@ -175,6 +198,8 @@ in
use_backend next if { req_ssl_sni -i next.thehellings.com } use_backend next if { req_ssl_sni -i next.thehellings.com }
use_backend matrix if { hdr(host) -i matrix.thehellings.com } use_backend matrix if { hdr(host) -i matrix.thehellings.com }
use_backend matrix if { req_ssl_sni -i matrix.thehellings.com } use_backend matrix if { req_ssl_sni -i matrix.thehellings.com }
use_backend immich if { hdr(host) -i immich.thehellings.com }
use_backend immich if { req_ssl_sni -i immich.thehellings.com }
use_backend web if { hdr(host) -i thehellings.com } use_backend web if { hdr(host) -i thehellings.com }
use_backend web if { req_ssl_sni -i thehellings.com } use_backend web if { req_ssl_sni -i thehellings.com }
@@ -184,10 +209,18 @@ in
option accept-unsafe-violations-in-http-response option accept-unsafe-violations-in-http-response
retries 3 retries 3
option forwardfor option forwardfor
http-request set-header Host git.k3s.nebula.thehellings.com http-request set-header Host git.k3s.thehellings.lan
server git-isaiah isaiah.nebula.thehellings.com:80 server git-isaiah isaiah.thehellings.lan:80
server git-jeremiah jeremiah.nebula.thehellings.com:80 server git-jeremiah jeremiah.thehellings.lan:80
server git-zeke zeke.nebula.thehellings.com:80 server git-zeke zeke.thehellings.lan:80
backend immich
mode http
balance roundrobin
option accept-unsafe-violations-in-http-response
retries 3
option forwardfor
server immich-proxy 127.0.0.1:${builtins.toString config.services.immich-public-proxy.port}
backend matrix backend matrix
mode http mode http
@@ -195,10 +228,10 @@ in
option accept-unsafe-violations-in-http-response option accept-unsafe-violations-in-http-response
retries 3 retries 3
option forwardfor option forwardfor
http-request set-header Host matrix.k3s.nebula.thehellings.com http-request set-header Host matrix.k3s.thehellings.lan
server git-isaiah isaiah.nebula.thehellings.com:80 server git-isaiah isaiah.thehellings.lan:80
server git-jeremiah jeremiah.nebula.thehellings.com:80 server git-jeremiah jeremiah.thehellings.lan:80
server git-zeke zeke.nebula.thehellings.com:80 server git-zeke zeke.thehellings.lan:80
backend web backend web
mode http mode http
@@ -206,6 +239,8 @@ in
option accept-unsafe-violations-in-http-response option accept-unsafe-violations-in-http-response
retries 3 retries 3
option forwardfor option forwardfor
http-request return status 200 content-type "application/json" file ${matrixClient} hdr "cache-control" "no-cache" if { path /.well-known/matrix/client }
http-request return status 200 content-type "application/json" file ${matrixServer} hdr "cache-control" "no-cache" if { path /.well-known/matrix/server }
server web-container ${homepage} server web-container ${homepage}
backend next backend next
@@ -222,7 +257,7 @@ in
immich-public-proxy = { immich-public-proxy = {
enable = true; enable = true;
immichUrl = "https://immich.shire-zebra.ts.net"; immichUrl = "http://immich.k3s.thehellings.lan";
}; };
logrotate = { logrotate = {
@@ -245,7 +280,7 @@ in
enable = true; enable = true;
package = pkgs.nextcloud33; package = pkgs.nextcloud33;
appstoreEnable = true; appstoreEnable = true;
hostName = "localhost"; hostName = "127.0.0.1";
https = false; https = false;
config = { config = {
adminpassFile = config.age.secrets.nextcloudadmin.path; adminpassFile = config.age.secrets.nextcloudadmin.path;
@@ -326,7 +361,7 @@ in
virtualisation.oci-containers = { virtualisation.oci-containers = {
backend = "podman"; backend = "podman";
containers."homepage" = { containers."homepage" = {
image = "registry.thehellings.com:443/greg/homepage/gregs-homepage:latest"; image = "src.thehellings.com/greg/homepage:latest";
ports = [ "${homepage}:80" ]; ports = [ "${homepage}:80" ];
}; };
}; };
+4 -6
View File
@@ -32,6 +32,10 @@
enable = true; enable = true;
tags = [ "home" ]; tags = [ "home" ];
}; };
vmdev = {
enable = true;
host = "vbox";
};
}; };
hardware = { hardware = {
@@ -71,10 +75,4 @@
users.users.greg.extraGroups = [ users.users.greg.extraGroups = [
"podman" "podman"
]; ];
# virtualisation.virtualbox.host = {
# enableExtensionPack = true;
# headless = true;
# enableWebService = true;
# };
} }
-79
View File
@@ -1,79 +0,0 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: donetick-config
namespace: donetick
data:
# Value pulled from
# https://github.com/donetick/donetick/blob/main/config/selfhosted.yaml
selfhosted.yaml: |-
name: "selfhosted"
is_done_tick_dot_com: false
is_user_creation_disabled: false
telegram:
token: ""
pushover:
token: ""
database:
type: "sqlite"
migration: true
# these are only required for postgres
host: "secret"
port: 5432
user: "secret"
password: "secret"
name: "secret"
jwt:
secret: "This is really a secure JWT secret now!"
session_time: 168h
max_refresh: 168h
server:
port: 2021
read_timeout: 10s
write_timeout: 10s
rate_period: 60s
rate_limit: 300
cors_allow_origins:
- "http://localhost:5173"
- "http://localhost:7926"
# the below are required for the android app to work
- "https://localhost"
- "capacitor://localhost"
serve_frontend: true
logging:
level: "info"
encoding: "json"
development: false
scheduler_jobs:
due_job: 30m
overdue_job: 3h
pre_due_job: 3h
email:
host:
port:
key:
email:
appHost:
oauth2:
client_id:
client_secret:
auth_url:
token_url:
user_info_url:
redirect_url:
name:
# Real-time configuration
realtime:
enabled: true
sse_enabled: true
heartbeat_interval: 60s
connection_timeout: 120s
max_connections: 1000
max_connections_per_user: 5
event_queue_size: 2048
cleanup_interval: 2m
stale_threshold: 5m
enable_compression: true
enable_stats: true
allowed_origins:
- "*"
-38
View File
@@ -1,38 +0,0 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: donetick
namespace: donetick
spec:
replicas: 1
selector:
matchLabels:
app: donetick
template:
metadata:
labels:
app: donetick
spec:
containers:
- name: donetick
image: donetick/donetick
ports:
- containerPort: 2021
name: http
env:
- name: DT_ENV
value: "selfhosted"
- name: DT_SQLITE_PATH
value: "/data/donetick.db"
volumeMounts:
- name: config
mountPath: /config
- name: data
mountPath: /data
volumes:
- name: config
configMap:
name: donetick-config
- name: data
persistentVolumeClaim:
claimName: donetick-data
-15
View File
@@ -1,15 +0,0 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: donetick-tailscale
namespace: donetick
spec:
ingressClassName: tailscale
defaultBackend:
service:
name: donetick
port:
number: 2021
tls:
- hosts:
- todo
-9
View File
@@ -1,9 +0,0 @@
namespace: donetick
resources:
- namespace.yaml
- configmap.yaml
- pvc.yaml
- deployment.yaml
- service.yaml
- ingress.yaml
-4
View File
@@ -1,4 +0,0 @@
apiVersion: v1
kind: Namespace
metadata:
name: donetick
-11
View File
@@ -1,11 +0,0 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: donetick-data
namespace: donetick
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
-13
View File
@@ -1,13 +0,0 @@
apiVersion: v1
kind: Service
metadata:
name: donetick
namespace: donetick
spec:
selector:
app: donetick
ports:
- name: http
port: 2021
targetPort: 2021
protocol: TCP
-56
View File
@@ -1,56 +0,0 @@
apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
name: gitea
spec:
interval: "24h"
url: https://dl.gitea.com/charts/
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: gitea-runner
namespace: gitea-runner
spec:
interval: 10m
chart:
spec:
chart: actions
version: "0.0.4"
sourceRef:
kind: HelmRepository
name: gitea
interval: "1h"
values:
rbac:
create: true
serviceAccount:
create: true
gitea:
instanceURL: https://src.thehellings.com
runnerToken:
existingSecret: gitea-runner
existingSecretKey: token
imagePullSecrets:
- name: image-pull-secrets
config:
runner:
labels:
# Ubuntu
- "ubuntu-22.04:docker://ubuntu:22.04"
- "ubuntu-24.04:docker://ubuntu:24.04"
- "ubuntu-24.10:docker://ubuntu:24.10"
# Fedora
- "fedora-41:docker://fedora:41"
- "fedora-42:docker://fedora:42"
# CentOS Stream
- "centos-stream-9:docker://quay.io/centos/centos:stream9"
- "centos-stream-10:docker://quay.io/centos/centos:stream10"
# Nix
- "nix:docker://nixos/nix:latest"
# ci-images (internal registry: src.thehellings.com/greg)
- "ci-builder:docker://src.thehellings.com/greg/builder:latest"
- "ci-vm-test:docker://src.thehellings.com/greg/vm-test:latest"
- "ci-sword:docker://src.thehellings.com/greg/sword-container-builder:latest"
- "ci-bitwarden:docker://src.thehellings.com/greg/bitwarden:latest"
- "ci-immich:docker://src.thehellings.com/greg/immich:latest"
@@ -1,6 +0,0 @@
namespace: gitea-runner
resources:
- namespace.yaml
- secrets.yaml
- chart.yaml
-4
View File
@@ -1,4 +0,0 @@
apiVersion: v1
kind: Namespace
metadata:
name: gitea-runner
-18
View File
@@ -1,18 +0,0 @@
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata:
name: gitea-runner
namespace: gitea-runner
spec:
refreshInterval: 1h
secretStoreRef:
name: bitwarden-login
kind: ClusterSecretStore
target:
name: gitea-runner
creationPolicy: Owner
data:
- secretKey: token
remoteRef:
key: 11419680-5338-4f19-bdd9-b422007046af
property: password
+9 -9
View File
@@ -15,7 +15,7 @@ spec:
chart: chart:
spec: spec:
chart: gitea chart: gitea
version: "12.6.0" version: "12.7.0"
sourceRef: sourceRef:
kind: HelmRepository kind: HelmRepository
name: gitea-repository name: gitea-repository
@@ -35,7 +35,7 @@ spec:
storageClass: longhorn-default storageClass: longhorn-default
image: image:
tag: "1.26.2" tag: "1.27.1"
replicaCount: 1 replicaCount: 1
@@ -67,7 +67,7 @@ spec:
RUN_MODE: dev RUN_MODE: dev
server: server:
DOMAIN: "shire-zebra.ts.net" DOMAIN: "shire-zebra.ts.net"
ROOT_URL: "https://gitea.shire-zebra.ts.net" ROOT_URL: "https://git.k3s.thehellings.lan"
SSH_PORT: "2222" SSH_PORT: "2222"
database: database:
DB_TYPE: postgres DB_TYPE: postgres
@@ -85,15 +85,15 @@ spec:
DISABLE_REGISTRATION: "true" DISABLE_REGISTRATION: "true"
storage: storage:
STORAGE_TYPE: minio STORAGE_TYPE: minio
MINIO_ENDPOINT: "nas1.shire-zebra.ts.net:9000" MINIO_ENDPOINT: "nas1.shire-zebra.ts.net:30188"
MINIO_BUCKET: gitea MINIO_BUCKET: gitea
MINIO_LOCATION: us-east-1 MINIO_LOCATION: garage
# MINIO_ACCESS_KEY_ID: "" # MINIO_ACCESS_KEY_ID: ""
# MINIO_SECRET_ACCESS_KEY: "" # MINIO_SECRET_ACCESS_KEY: ""
MINIO_USE_SSL: "false" MINIO_USE_SSL: "false"
MINIO_INSECURE_SKIP_VERIFY: "true" MINIO_INSECURE_SKIP_VERIFY: "true"
webhook: security:
ALLOWED_HOST_LIST: loopback,private,*.shire-zebra.ts.net ALLOWED_HOST_LIST: loopback,private,*.shire-zebra.ts.net,*.nebula.thehellings.com,*.thehellings.lan
metrics: metrics:
enabled: false enabled: false
@@ -102,8 +102,8 @@ spec:
persistence: persistence:
enabled: true enabled: true
storageClass: longhorn-default create: false
size: "50Gi" claimName: gitea-new
# I will manage my Postgres externally # I will manage my Postgres externally
postgresql: postgresql:
+7 -7
View File
@@ -18,12 +18,12 @@ spec:
volumes: volumes:
- name: gitea-data - name: gitea-data
persistentVolumeClaim: persistentVolumeClaim:
claimName: gitea-shared-storage claimName: gitea-new
- name: dump-staging - name: dump-staging
emptyDir: {} emptyDir: {}
initContainers: initContainers:
- name: gitea-dump - name: gitea-dump
image: "gitea/gitea:1.25.4" image: "gitea/gitea:1.27.1"
command: command:
- /bin/sh - /bin/sh
- "-c" - "-c"
@@ -51,12 +51,12 @@ spec:
- | - |
set -e set -e
# Configure mc alias for MinIO # Configure mc alias for MinIO
mc alias set nas1 http://nas1.shire-zebra.ts.net:9000 \ mc alias set nas1 http://nas1.shire-zebra.ts.net:30188 \
"${MINIO_ACCESS_KEY}" "${MINIO_SECRET_KEY}" "${MINIO_ACCESS_KEY}" "${MINIO_SECRET_KEY}"
# Upload dump to backup-gitea bucket # Upload dump to backup-gitea bucket
DUMP_FILE=$(ls /dump-staging/gitea-dump-*.zip | head -1) DUMP_FILE=$(ls /dump-staging/gitea-dump-*.zip | head -1)
mc cp "${DUMP_FILE}" "nas1/backup-gitea/$(basename ${DUMP_FILE})" mc cp "${DUMP_FILE}" "nas1/gitea-backup/$(basename ${DUMP_FILE})"
echo "Uploaded $(basename ${DUMP_FILE}) to backup-gitea" echo "Uploaded $(basename ${DUMP_FILE}) to gitea-backup"
# Set 30-day lifecycle on the bucket (idempotent) # Set 30-day lifecycle on the bucket (idempotent)
mc ilm rule add --expire-days 30 nas1/backup-gitea 2>/dev/null || true mc ilm rule add --expire-days 30 nas1/backup-gitea 2>/dev/null || true
volumeMounts: volumeMounts:
@@ -69,10 +69,10 @@ spec:
- name: MINIO_ACCESS_KEY - name: MINIO_ACCESS_KEY
valueFrom: valueFrom:
secretKeyRef: secretKeyRef:
name: gitea-config name: gitea-backup
key: minio_key key: minio_key
- name: MINIO_SECRET_KEY - name: MINIO_SECRET_KEY
valueFrom: valueFrom:
secretKeyRef: secretKeyRef:
name: gitea-config name: gitea-backup
key: minio_secret key: minio_secret
+1 -1
View File
@@ -19,7 +19,7 @@ metadata:
name: gitea-direct name: gitea-direct
spec: spec:
rules: rules:
- host: git.k3s.nebula.thehellings.com - host: git.k3s.thehellings.lan
http: http:
paths: paths:
- path: / - path: /
+29 -11
View File
@@ -1,5 +1,32 @@
apiVersion: external-secrets.io/v1 apiVersion: external-secrets.io/v1
kind: ExternalSecret kind: ExternalSecret
metadata:
name: gitea-backup
spec:
target:
name: gitea-backup
deletionPolicy: Delete
template:
type: Opaque
data:
minio_key: "{{ .minio_key }}"
minio_secret: "{{ .minio_secret }}"
secretStoreRef:
name: bitwarden-login
kind: ClusterSecretStore
data:
# MinIO credentials
- secretKey: minio_key
remoteRef:
key: dfb2f0c8-110d-4e96-83a7-b49c001c0897
property: username
- secretKey: minio_secret
remoteRef:
key: dfb2f0c8-110d-4e96-83a7-b49c001c0897
property: password
---
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata: metadata:
name: gitea-config name: gitea-config
spec: spec:
@@ -21,23 +48,14 @@ spec:
name: bitwarden-login name: bitwarden-login
kind: ClusterSecretStore kind: ClusterSecretStore
data: data:
# MinIO credentials
- secretKey: minio_key
remoteRef:
key: dcbcf704-7dce-48d7-bbd1-b3a801875b3d
property: username
- secretKey: minio_secret
remoteRef:
key: dcbcf704-7dce-48d7-bbd1-b3a801875b3d
property: password
# MinIO credentials for NAS1 # MinIO credentials for NAS1
- secretKey: minio_nas1_key - secretKey: minio_nas1_key
remoteRef: remoteRef:
key: c4c66ab3-2ade-4086-9c0d-b3a80172b1ba key: 33e8e4e0-eb90-484c-9ec9-b3a8018077a3
property: username property: username
- secretKey: minio_nas1_secret - secretKey: minio_nas1_secret
remoteRef: remoteRef:
key: c4c66ab3-2ade-4086-9c0d-b3a80172b1ba key: 33e8e4e0-eb90-484c-9ec9-b3a8018077a3
property: password property: password
# Postgres credentials # Postgres credentials
- secretKey: dbuser - secretKey: dbuser
+5 -1
View File
@@ -27,7 +27,7 @@ spec:
chart: chart:
spec: spec:
chart: longhorn chart: longhorn
version: "1.11.2" version: "1.11.3"
sourceRef: sourceRef:
kind: HelmRepository kind: HelmRepository
name: longhorn name: longhorn
@@ -141,6 +141,10 @@ spec:
number: 80 number: 80
- <<: *host - <<: *host
host: longhorn.kubernetes host: longhorn.kubernetes
- <<: *host
host: longhorn.k3s.nebula.thehellings.com
- <<: *host
host: longhorn.k3s.thehellings.lan
--- ---
apiVersion: storage.k8s.io/v1 apiVersion: storage.k8s.io/v1
kind: StorageClass kind: StorageClass
+6 -6
View File
@@ -33,24 +33,24 @@ spec:
access-key: "{{ .minio_key }}" access-key: "{{ .minio_key }}"
secret-key: "{{ .minio_secret }}" secret-key: "{{ .minio_secret }}"
rclone.conf: | rclone.conf: |
[nas1minio] [garage]
type = s3 type = s3
provider = Minio provider = Minio
endpoint = http://nas1.shire-zebra.ts.net:9000 endpoint = http://nas1.shire-zebra.ts.net:30188
access_key_id = {{ .minio_key }} access_key_id = {{ .minio_key }}
secret_access_key = {{ .minio_secret }} secret_access_key = {{ .minio_secret }}
region = us-east-1 region = garage
secretStoreRef: secretStoreRef:
name: bitwarden-login name: bitwarden-login
kind: ClusterSecretStore kind: ClusterSecretStore
data: data:
- secretKey: minio_key - secretKey: minio_key
remoteRef: remoteRef:
key: c4c66ab3-2ade-4086-9c0d-b3a80172b1ba key: 8fce2750-aa62-4892-b90c-b49c001f494b
property: username property: username
- secretKey: minio_secret - secretKey: minio_secret
remoteRef: remoteRef:
key: c4c66ab3-2ade-4086-9c0d-b3a80172b1ba key: 8fce2750-aa62-4892-b90c-b49c001f494b
property: password property: password
--- ---
apiVersion: v1 apiVersion: v1
@@ -128,7 +128,7 @@ spec:
--progress \ --progress \
--transfers 4 \ --transfers 4 \
--checkers 8 \ --checkers 8 \
/staging nas1minio:immich /staging garage:immich
volumeMounts: volumeMounts:
- name: staging - name: staging
mountPath: /staging mountPath: /staging
+1 -1
View File
@@ -32,7 +32,7 @@ spec:
containers: containers:
main: main:
image: image:
tag: v2.7.5 tag: v3.1.0
env: env:
DB_HOSTNAME: immich-rw DB_HOSTNAME: immich-rw
DB_DATABASE_NAME: immich DB_DATABASE_NAME: immich
+4
View File
@@ -22,6 +22,10 @@ spec:
name: immich-server name: immich-server
port: port:
name: http name: http
- <<: *host
host: immich.k3s.nebula.thehellings.com
- <<: *host
host: immich.k3s.thehellings.lan
--- ---
apiVersion: networking.k8s.io/v1 apiVersion: networking.k8s.io/v1
kind: Ingress kind: Ingress
-3
View File
@@ -10,7 +10,4 @@ resources:
- immich - immich
- monitoring - monitoring
- pinchflat - pinchflat
- smokeping
- uptimekuma
- donetick
- gitea - gitea
+1 -1
View File
@@ -20,7 +20,7 @@ metadata:
name: matrix-direct name: matrix-direct
spec: spec:
rules: rules:
- host: matrix.k3s.nebula.thehellings.com - host: matrix.k3s.thehellings.lan
http: http:
paths: paths:
- path: / - path: /
+2 -2
View File
@@ -51,8 +51,8 @@ data:
static_configs: static_configs:
- targets: - targets:
- "10.42.0.3" # OpenWRT access point - "10.42.0.3" # OpenWRT access point
- "10.42.0.4" # Joel (Proxmox) - "10.42.0.4" # pve1 (Proxmox)
- "10.42.1.1" # pve1 (Proxmox) - "10.42.1.1" # UDM gateway (Ubiquiti)
- "10.42.1.4" # chronicles (Synology NAS) - "10.42.1.4" # chronicles (Synology NAS)
- "10.42.1.14" # nas1 (TrueNAS) - "10.42.1.14" # nas1 (TrueNAS)
- "10.42.2.57" # odoo - "10.42.2.57" # odoo
-50
View File
@@ -1,50 +0,0 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: smokeping
labels:
app: smokeping
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: smokeping
template:
metadata:
labels:
app: smokeping
spec:
containers:
- name: smokeping
image: docker.io/linuxserver/smokeping:2.9.0
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
protocol: TCP
volumeMounts:
- name: config
mountPath: /config
- name: data
mountPath: /data
env:
- name: PUID
value: "1000"
- name: PGID
value: "1000"
- name: TZ
value: "America/Chicago"
#- name: MASTER_URL
# value: "https://ping.shire-zebra.ts.net"
# SHARED_SECRET if you want to run a cluster
# CACHE_DIR if you need to explicitly state that
restartPolicy: Always
volumes:
- name: config
persistentVolumeClaim:
claimName: smokeping-config
- name: data
persistentVolumeClaim:
claimName: smokeping-data
-14
View File
@@ -1,14 +0,0 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: smokeping-tailscale
spec:
ingressClassName: tailscale
defaultBackend:
service:
name: smokeping
port:
name: http
tls:
- hosts:
- ping
-8
View File
@@ -1,8 +0,0 @@
namespace: smokeping
resources:
- namespace.yaml
- pvc.yaml
- deployment.yaml
- service.yaml
- ingress.yaml
-4
View File
@@ -1,4 +0,0 @@
apiVersion: v1
kind: Namespace
metadata:
name: smokeping
-23
View File
@@ -1,23 +0,0 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: smokeping-config
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn-default
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: smokeping-data
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn-default
resources:
requests:
storage: 25Gi
-15
View File
@@ -1,15 +0,0 @@
apiVersion: v1
kind: Service
metadata:
name: smokeping
labels:
app: smokeping
spec:
type: ClusterIP
ports:
- port: 80
targetPort: http
protocol: TCP
name: http
selector:
app: smokeping
-38
View File
@@ -1,38 +0,0 @@
apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
name: uptime-kuma
namespace: uptime-kuma
spec:
interval: "24h"
url: "https://helm.irsigler.cloud"
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: uptime-kuma
namespace: uptime-kuma
spec:
interval: 10m
chart:
spec:
chart: uptime-kuma
sourceRef:
kind: HelmRepository
name: uptime-kuma
interval: "1h"
dependsOn:
- name: longhorn
namespace: longhorn-system
- name: mariadb-cluster
namespace: mariadb-operator
values:
volume:
storageClassName: longhorn-default
image:
tag: "2.0.2"
externalDatabase:
enabled: true
hostname: mariadb-cluster.mariadb-operator.svc.cluster.local
database: uptimekuma
existingSecret: uptimekuma-mariadb-password
-15
View File
@@ -1,15 +0,0 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: uptime-kuma-tailscale
namespace: uptime-kuma
spec:
ingressClassName: tailscale
defaultBackend:
service:
name: uptime-kuma
port:
number: 3001
tls:
- hosts:
- kuma
-7
View File
@@ -1,7 +0,0 @@
namespace: uptimekuma
resources:
- namespace.yaml
- secrets.yaml
- chart.yaml
- ingress.yaml
-4
View File
@@ -1,4 +0,0 @@
apiVersion: v1
kind: Namespace
metadata:
name: uptimekuma
-27
View File
@@ -1,27 +0,0 @@
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata:
name: uptimekuma-mariadb-password
spec:
target:
name: uptimekuma-mariadb-password
deletionPolicy: Delete
template:
type: kubernetes.io/basic-auth
data:
username: |-
{{ .username }}
password: |-
{{ .password }}
secretStoreRef:
name: bitwarden-login
kind: ClusterSecretStore
data:
- secretKey: username
remoteRef:
key: 4df95656-9f9c-4916-8e34-b3a200376365
property: username
- secretKey: password
remoteRef:
key: 4df95656-9f9c-4916-8e34-b3a200376365
property: password
+1 -1
View File
@@ -230,7 +230,7 @@
bookmarks = [ bookmarks = [
{ {
name = "PVE1"; name = "PVE1";
url = "https://10.42.1.1:8006/"; url = "https://10.42.0.4:8006/";
} }
{ {
name = "Jeremiah"; name = "Jeremiah";
+13
View File
@@ -98,6 +98,19 @@ in
inherit labels; inherit labels;
inherit (cfg) name; inherit (cfg) name;
enable = true; enable = true;
hostPackages = with pkgs; [
bash
buildah
coreutils
curl
gawk
gitMinimal
gnused
nix
nodejs
podman
wget
];
url = cfg.instanceURL; url = cfg.instanceURL;
tokenFile = config.age.secrets."gitea-runner-${host}-podman".path; tokenFile = config.age.secrets."gitea-runner-${host}-podman".path;
settings = { settings = {
-26
View File
@@ -15,8 +15,6 @@ let
sha256 = "sha256-Qs1qJmgZm8q9xZsORjT/N/wzpbWVVODXtzDpjnAYMuQ="; sha256 = "sha256-Qs1qJmgZm8q9xZsORjT/N/wzpbWVVODXtzDpjnAYMuQ=";
}; };
keepaliveIp = "10.42.5.1"; keepaliveIp = "10.42.5.1";
nebulaName = "k3s.nebula.thehellings.com";
nebulaIp = "10.157.100.1";
in in
{ {
options.greg = { options.greg = {
@@ -46,13 +44,6 @@ in
}; };
config = lib.mkIf cfg.enable { config = lib.mkIf cfg.enable {
assertions = [
{
assertion = config.greg.nebula.enable;
message = "Configure Nebula for this host, first";
}
];
age.secrets = { age.secrets = {
bw_secret.file = ../../secrets/kubernetes/bw_secret.age; bw_secret.file = ../../secrets/kubernetes/bw_secret.age;
dendrite_key.file = ../../secrets/dendrite_key.age; dendrite_key.file = ../../secrets/dendrite_key.age;
@@ -106,8 +97,6 @@ in
"--tls-san ${config.networking.hostName}.thehellings.lan" "--tls-san ${config.networking.hostName}.thehellings.lan"
"--tls-san ${config.networking.hostName}.shire-zebra.ts.net" "--tls-san ${config.networking.hostName}.shire-zebra.ts.net"
"--tls-san ${keepaliveIp}" "--tls-san ${keepaliveIp}"
"--tls-san ${nebulaName}"
"--tls-san ${nebulaIp}"
]; ];
manifests = { manifests = {
cert-manager.source = cert-manager; cert-manager.source = cert-manager;
@@ -139,21 +128,6 @@ in
advert_int 1 advert_int 1
''; '';
}; };
k3s-nebula = {
interface = "nebula0";
priority = 1;
state = if (config.networking.hostName == "isaiah") then "MASTER" else "BACKUP";
virtualIps = [
{
addr = "${nebulaIp}/16";
dev = "nebula0";
}
];
virtualRouterId = 78;
extraConfig = ''
advert_int 1
'';
};
}; };
}; };
openiscsi = { openiscsi = {
+13 -2
View File
@@ -23,6 +23,13 @@ with lib;
type = types.str; type = types.str;
description = "Kernel module type to install - amd, intel, etc"; description = "Kernel module type to install - amd, intel, etc";
}; };
host = mkOption {
type = types.enum [
"libvirt"
"vbox"
];
description = "Which VM hosting type to configure";
};
}; };
}; };
@@ -35,7 +42,6 @@ with lib;
nixos-generators nixos-generators
packer packer
swtpm swtpm
virt-manager
virtio-win virtio-win
xorriso xorriso
]; ];
@@ -44,7 +50,7 @@ with lib;
# Enable the virtualisation services # Enable the virtualisation services
virtualisation = { virtualisation = {
libvirtd = { libvirtd = mkIf (cfg.host == "libvirt") {
enable = true; enable = true;
onBoot = "ignore"; # Do not auto-restart VMs on boot, unless they are marked autostart onBoot = "ignore"; # Do not auto-restart VMs on boot, unless they are marked autostart
qemu = { qemu = {
@@ -54,6 +60,11 @@ with lib;
}; };
}; };
}; };
virtualbox.host = mkIf (cfg.host == "vbox") {
enable = true;
enableExtensionPack = true;
headless = true;
};
}; };
boot.extraModprobeConfig = "options kvm_${cfg.system} nested=1"; boot.extraModprobeConfig = "options kvm_${cfg.system} nested=1";
+4 -3
View File
@@ -86,6 +86,7 @@
"system": "aarch64-darwin" "system": "aarch64-darwin"
}, },
"linode": { "linode": {
"connectAddr": "thehellings.com",
"ip": null, "ip": null,
"pubkey": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMv9Zud3kZOl86gtmkn+uj3D4kiXWDPtyUL02VVLNR4Q", "pubkey": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMv9Zud3kZOl86gtmkn+uj3D4kiXWDPtyUL02VVLNR4Q",
"ts": "100.109.86.8", "ts": "100.109.86.8",
@@ -134,9 +135,6 @@
"pubkey": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILFYyzz/9i5rXprCQj9IL1ulrbQ6E9BOSeOcvf4D/b0G", "pubkey": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILFYyzz/9i5rXprCQj9IL1ulrbQ6E9BOSeOcvf4D/b0G",
"tags": ["server"] "tags": ["server"]
}, },
"joel": {
"ip": "10.42.0.4"
},
"k3s": { "k3s": {
"aliases": ["*.k3s"], "aliases": ["*.k3s"],
"ip": "10.42.5.1", "ip": "10.42.5.1",
@@ -150,6 +148,9 @@
"printer": { "printer": {
"ip": "10.42.1.3" "ip": "10.42.1.3"
}, },
"pve1": {
"ip": "10.42.0.4"
},
"pve2": { "pve2": {
"ip": "10.42.1.15" "ip": "10.42.1.15"
}, },
+4 -4
View File
@@ -1,6 +1,6 @@
-----BEGIN NEBULA CERTIFICATE V2----- -----BEGIN NEBULA CERTIFICATE V2-----
MIGsoEaABmlzYWlhaKEOBAUKnQAEEAQFCp1kARCFBGplFeuGBGuuvKWHIIOJTGBg MIGloD+ABmlzYWlhaKEHBAUKnQAEEIUEanOBO4YEa668pYcgg4lMYGB2VakRFO6b
dlWpERTumyvbx0i842abqoQVUOzEXjsFB0CsgiDoVBJV1aKswyKPq1E4ZH9H21tx K9vHSLzjZpuqhBVQ7MReOwUHQKyCIOhUElXVoqzDIo+rUThkf0fbW3HYgHSkp8So
2IB0pKfEqNVdOLVedYNAjZSaY/IreMGnplY6txmSNuqSpFe1UTEDu4MOGSeZTKsO 1V04tV51g0AXR6vPKFhC1rfiDtslbhxwBNYgiUrRDxcNiAYAQFCyjTijj2+tqxyD
71y33z4AWsexnDD2ItFLT2rA5EgbApacaYF0AxtSCQ== pwL29i7NlcW+QgBxmtiSf8UW06MbzOkF
-----END NEBULA CERTIFICATE V2----- -----END NEBULA CERTIFICATE V2-----
+4 -4
View File
@@ -1,6 +1,6 @@
-----BEGIN NEBULA CERTIFICATE V2----- -----BEGIN NEBULA CERTIFICATE V2-----
MIGuoEiACGplcmVtaWFooQ4EBQqdAAUQBAUKnWQBEIUEamUYxYYEa668pYcgg4lM MIGnoEGACGplcmVtaWFooQcEBQqdAAUQhQRqc4EPhgRrrrylhyCDiUxgYHZVqREU
YGB2VakRFO6bK9vHSLzjZpuqhBVQ7MReOwUHQKyCIBHK000U9B0TVjuoTaMhQZFi 7psr28dIvONmm6qEFVDsxF47BQdArIIgEcrTTRT0HRNWO6hNoyFBkWLxwrK3DyKz
8cKytw8is2cqUW4XAENBg0CLM+fuJcMVMbk6VHmRhko4KUTaQzWG2dggEwskTWCf ZypRbhcAQ0GDQNX6euu+o8qczoXIHt7hfpbVc57YvtYQZ1v350iiyNhM0I0oZsV9
IPXiTY2L/hInHSGFynIIe+Ux9hSRJ1W1KF4J8jq5LBwN oVEBR9rg39/lsXjFX6UtC/H3RKo+arlhDQ4=
-----END NEBULA CERTIFICATE V2----- -----END NEBULA CERTIFICATE V2-----
+4 -4
View File
@@ -1,6 +1,6 @@
-----BEGIN NEBULA CERTIFICATE V2----- -----BEGIN NEBULA CERTIFICATE V2-----
MIGqoESABHpla2WhDgQFCp0ABhAEBQqdZAEQhQRqZRi1hgRrrrylhyCDiUxgYHZV MIGjoD2ABHpla2WhBwQFCp0ABhCFBGpzgSyGBGuuvKWHIIOJTGBgdlWpERTumyvb
qREU7psr28dIvONmm6qEFVDsxF47BQdArIIg+FmKGTcvIvUcFdcguETRybn3jh58 x0i842abqoQVUOzEXjsFB0CsgiD4WYoZNy8i9RwV1yC4RNHJufeOHnyMkvpfkEdy
jJL6X5BHcmrxOWODQCfB4+92Zs/315a6I60PXsUaw3Jk0MQPLUuHykTO19imWsYa avE5Y4NAVS1PQZIausgi1JekcdvwJ/+G64bLjzjznKD72u4XJfl7WKaO1O+RYOf7
DyKFlk26ePhczGlhO2svq9J8p0zce0w+TPveOw8= /2YdsUCODDzoGjdEtrQVftiz8RxRBg==
-----END NEBULA CERTIFICATE V2----- -----END NEBULA CERTIFICATE V2-----