Compare commits

...
21 Commits
Author SHA1 Message Date
RoyDumblauskas b885280ab1 add gc 2026-10-21 00:48:00 -05:00
RoyDumblauskas 37c70787c9 add gc 2026-10-21 00:46:38 -05:00
RoyDumblauskas d8b631be3d delete uneeded networking 2026-10-21 00:30:00 -05:00
RoyDumblauskas 1904cd2d2b secrets reincrypted 2026-10-21 00:10:56 -05:00
RoyDumblauskas 0501b9b374 secrets reincrypted 2026-10-21 00:03:49 -05:00
RoyDumblauskas ff687eb42d udpate flake 2026-10-21 00:03:17 -05:00
RoyDumblauskas 6a1548f902 no meta ref 2026-10-21 00:01:10 -05:00
RoyDumblauskas f1dce0773e name db 2026-10-20 23:57:44 -05:00
RoyDumblauskas 3ebec257d7 add gitea service to vm 2026-10-20 23:56:55 -05:00
RoyDumblauskas 9b79dfe614 vm 2026-10-16 01:07:59 -05:00
RoyDumblauskas de89936ea2 cleanup fix 2026-10-16 01:07:25 -05:00
RoyDumblauskas 7ee1c4e2d8 script fix 2026-10-16 01:00:05 -05:00
RoyDumblauskas c5c59320c1 sops 2026-10-16 00:55:55 -05:00
RoyDumblauskas 92e9726a02 script fix 2026-10-16 00:54:59 -05:00
RoyDumblauskas 1e16bfd1c3 script fix 2026-10-16 00:52:44 -05:00
RoyDumblauskas ac762f662d extra path refs 2026-10-16 00:47:18 -05:00
RoyDumblauskas 274a2b9207 persist run key 2026-10-16 00:35:07 -05:00
RoyDumblauskas f3ccd2ac10 tool dependencies 2026-10-16 00:14:50 -05:00
RoyDumblauskas b649dda9c9 tool dependencies 2026-10-16 00:13:56 -05:00
RoyDumblauskas 6bd22271c1 new build script 2026-10-16 00:10:01 -05:00
RoyDumblauskas dcfd574f59 new build script 2026-10-16 00:09:34 -05:00
11 changed files with 300 additions and 85 deletions

No files matched your search

+1 -1
View File
@@ -1,4 +1,4 @@
server-info.txt server-info.txt
nixos/out nixos/out
nixos/error nixos/error
virtual-machines/*/result/ virtual-machines/*/result
+26 -6
View File
@@ -7,10 +7,20 @@
{ {
imports = [ ]; imports = [ ];
nix.settings.experimental-features = [ nix = {
"nix-command" settings.experimental-features = [
"flakes" "nix-command"
]; "flakes"
];
gc = {
automatic = true;
persistent = true;
dates = [ "daily" ];
options = "--delete-older-than 7d";
};
};
nixpkgs.config.allowUnfree = true; nixpkgs.config.allowUnfree = true;
# Secret Management # Secret Management
@@ -206,6 +216,11 @@
# Init with `incus admin init --minimal` # Init with `incus admin init --minimal`
virtualisation.incus.enable = true; virtualisation.incus.enable = true;
# allow sandboxes to see my temp keys
nix.settings.extra-sandbox-paths = [
"/run/sops-virtual-key.txt=/run/sops-virtual/virtual-key.txt"
];
networking = { networking = {
hostName = meta.hostname; hostName = meta.hostname;
hostId = meta.hostId; hostId = meta.hostId;
@@ -220,8 +235,6 @@
enable = true; enable = true;
allowedTCPPorts = [ allowedTCPPorts = [
22 22
80
443
6443 # k3s 6443 # k3s
]; ];
@@ -274,6 +287,7 @@
"/var/lib/nixos" "/var/lib/nixos"
"/var/db/sudo/lectured" "/var/db/sudo/lectured"
"/var/lib/acme" "/var/lib/acme"
"/run/sops-virtual"
]; ];
}; };
@@ -320,6 +334,12 @@
path = "/persist/etc/ssh/ssh_host_rsa_key"; path = "/persist/etc/ssh/ssh_host_rsa_key";
} }
]; ];
# Don't allow remote password login
settings = {
PasswordAuthentication = false;
KbdInteractiveAuthentication = false;
};
}; };
# INITIAL system version # INITIAL system version
+1
View File
@@ -40,6 +40,7 @@
woeusb woeusb
wofi wofi
xrandr xrandr
yq
zip zip
]; ];
-2
View File
@@ -3,7 +3,6 @@ keys:
- &laptop age1zad0qu648dhjav4pzjhkc6vswnqtacuv9230xcgle8wmv56r8ykqn0ud7y - &laptop age1zad0qu648dhjav4pzjhkc6vswnqtacuv9230xcgle8wmv56r8ykqn0ud7y
- &desktop age1rwugh86469664fwhgrj9xuhjxs9vpflx3r0ftuvd0glphf2gecfs8thxsj - &desktop age1rwugh86469664fwhgrj9xuhjxs9vpflx3r0ftuvd0glphf2gecfs8thxsj
- &nixos-homelab-00 age1hzaf8j6djfc4yc98m3kqjzzdj4tcskf9kdzvjmje2xuqcfmrz5lqdtn5w7 - &nixos-homelab-00 age1hzaf8j6djfc4yc98m3kqjzzdj4tcskf9kdzvjmje2xuqcfmrz5lqdtn5w7
- &virtual age1q5zwds8g47j7xsqhp8tk995l3n4a5z876vff7wgx4sztwgdsa3yq7eu6xk
creation_rules: creation_rules:
- path_regex: '.*/secrets/[^/]+\.(yaml|json|env|ini)$' - path_regex: '.*/secrets/[^/]+\.(yaml|json|env|ini)$'
key_groups: key_groups:
@@ -11,4 +10,3 @@ creation_rules:
- *laptop - *laptop
- *desktop - *desktop
- *nixos-homelab-00 - *nixos-homelab-00
- *virtual
+196
View File
@@ -0,0 +1,196 @@
#!/usr/bin/env bash
set -Eeuo pipefail
# Usage:
# ./build-image.sh <vm-folder> <alias> [vmname]
#
# Example:
# ./build-image.sh vm-test nixos/custom/jellybean
#
# Run from anywhere; all project operations use virtual-machines/.
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
if [[ $# -lt 2 || $# -gt 3 ]]; then
echo "Usage: $0 <vm-folder> <alias> [vmname]"
exit 1
fi
VM_FOLDER="$1"
ALIAS="$2"
VMNAME="${3:-vm}"
VM_DIR="$SCRIPT_DIR/$VM_FOLDER"
SOPS_CONFIG="$SCRIPT_DIR/.sops.yaml"
AGE_DIR="/run/sops-virtual"
AGE_KEY="$AGE_DIR/virtual-key.txt"
SANDBOX_KEY="/run/sops-virtual-key.txt"
for cmd in age-keygen sops yq nix incus sudo; do
command -v "$cmd" >/dev/null 2>&1 || {
echo "Missing required command: $cmd" >&2
exit 1
}
done
[[ -d "$VM_DIR" ]] || {
echo "VM directory not found: $VM_DIR" >&2
exit 1
}
[[ -f "$VM_DIR/flake.nix" ]] || {
echo "No flake.nix found in $VM_DIR" >&2
exit 1
}
[[ -f "$SOPS_CONFIG" ]] || {
echo "SOPS config not found: $SOPS_CONFIG" >&2
exit 1
}
[[ -d "$VM_DIR/secrets" ]] || {
echo "Secrets directory not found: $VM_DIR/secrets" >&2
exit 1
}
# Refuse to overwrite a key that may belong to another running build.
if sudo test -e "$AGE_KEY"; then
echo "Temporary key already exists: $AGE_KEY" >&2
echo "Remove it or investigate the previous build before continuing." >&2
exit 1
fi
SOPS_BACKUP="$(mktemp)"
AGE_TEMP="$(mktemp)"
rm -f "$AGE_TEMP"
cp -p "$SOPS_CONFIG" "$SOPS_BACKUP"
CLEANED_UP=0
cleanup() {
local status=$?
if [[ "$CLEANED_UP" -eq 1 ]]; then
return
fi
CLEANED_UP=1
# Restore the original SOPS configuration.
cp "$SOPS_BACKUP" "$SOPS_CONFIG"
# Remove the temporary recipient from encrypted secrets.
# Do this while the original recipients are restored.
if [[ -d "$VM_DIR/secrets" ]]; then
shopt -s nullglob
local secret_files=("$VM_DIR"/secrets/*)
shopt -u nullglob
for secret in "${secret_files[@]}"; do
[[ -f "$secret" ]] || continue
echo "Restoring SOPS recipients: ${secret#"$SCRIPT_DIR"/}"
if ! sops updatekeys --yes "$secret"; then
echo "WARNING: Failed to restore recipients in $secret" >&2
status=1
fi
done
fi
rm -f "$SOPS_BACKUP" "$AGE_TEMP"
# Remove the temporary private key after recipient metadata is restored.
sudo rm -f "$AGE_KEY"
echo "Temporary age key removed."
return "$status"
}
trap cleanup EXIT
trap 'exit 130' INT
trap 'exit 143' TERM
echo "Generating temporary age identity..."
age-keygen -o "$AGE_TEMP"
AGE_PUBLIC_KEY="$(age-keygen -y "$AGE_TEMP")"
# Make the key readable by Nix build users, but not ordinary users.
sudo install -d -o root -g nixbld -m 0750 "$AGE_DIR"
sudo install -o root -g nixbld -m 0440 \
"$AGE_TEMP" "$AGE_KEY"
# Update age recipients in the SOPS creation rules temporarily.
# Requires mikefarah/yq v4 and simple comma-separated age fields.
export AGE_PUBLIC_KEY
# Confirm at least one age key group exists.
if ! yq -e '
[.creation_rules[].key_groups[] | select(.age != null)] | length > 0
' "$SOPS_CONFIG" >/dev/null; then
echo "No creation_rules with key_groups.age found in .sops.yaml" >&2
exit 1
fi
# Add the temporary public key to each age recipient list.
yq -y -i '
(.creation_rules[].key_groups[] | select(.age != null).age) |=
(. + [env.AGE_PUBLIC_KEY] | unique)
' "$SOPS_CONFIG"
echo "Updating SOPS recipients for secrets in $VM_FOLDER..."
shopt -s nullglob
SECRET_FILES=("$VM_DIR"/secrets/*)
shopt -u nullglob
if [[ ${#SECRET_FILES[@]} -eq 0 ]]; then
echo "No secret files found in $VM_DIR/secrets" >&2
exit 1
fi
for secret in "${SECRET_FILES[@]}"; do
[[ -f "$secret" ]] || continue
echo "Updating recipients: ${secret#"$SCRIPT_DIR"/}"
sops updatekeys --yes "$secret"
done
echo "Building VM metadata..."
TARBALL_DIR="$(nix build \
"./$VM_FOLDER#nixosConfigurations.${VMNAME}.config.system.build.metadata" \
--print-out-paths)"
TARBALL="$(find "$TARBALL_DIR" -type f -name '*.tar.xz' -print -quit)"
if [[ -z "$TARBALL" ]]; then
echo "Could not find a .tar.xz tarball in: $TARBALL_DIR" >&2
exit 1
fi
echo "Metadata tarball: $TARBALL"
echo "Building QEMU disk image..."
QCOW2_DIR="$(nix build \
"./$VM_FOLDER#nixosConfigurations.${VMNAME}.config.system.build.qemuImage" \
--print-out-paths)"
QCOW2="$QCOW2_DIR/nixos.qcow2"
if [[ ! -f "$QCOW2" ]]; then
echo "QEMU image not found: $QCOW2" >&2
exit 1
fi
echo "QEMU image: $QCOW2"
echo "Importing image into Incus..."
incus image import \
--alias "$ALIAS" \
"$TARBALL" \
"$QCOW2"
echo "Successfully imported image: $ALIAS"
-61
View File
@@ -1,61 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
# Usage:
# ./build-image.sh <alias> [vmname]
#
# Examples:
# ./build-image.sh nixos/custom/vm
# ./build-image.sh nixos/custom/my-vm my-vm
if [[ $# -lt 1 || $# -gt 2 ]]; then
echo "Usage: $0 <alias> [vmname]"
echo
echo " alias Required Incus image alias"
echo " vmname NixOS configuration name (default: vm)"
exit 1
fi
ALIAS="$1"
VMNAME="${2:-vm}"
# Build the NixOS LXC metadata tarball
TARBALL_DIR="$(nix build \
".#nixosConfigurations.${VMNAME}.config.system.build.metadata" \
--print-out-paths)"
# Find the tarball
TARBALL="$(find "$TARBALL_DIR" -type f -name '*.tar.xz' -print -quit)"
if [[ -z "$TARBALL" ]]; then
echo "Could not find a .tar.xz tarball in: $TARBALL_DIR"
exit 1
fi
echo "Metadata tarball: $TARBALL"
# Build the QEMU disk image
QCOW2_DIR="$(nix build \
".#nixosConfigurations.${VMNAME}.config.system.build.qemuImage" \
--print-out-paths)"
QCOW2="$QCOW2_DIR/nixos.qcow2"
if [[ ! -f "$QCOW2" ]]; then
echo "QEMU image not found: $QCOW2"
exit 1
fi
echo "Found QEMU image: $QCOW2"
echo
echo "Importing image into Incus..."
incus image import \
--alias "$ALIAS" \
"$TARBALL" \
"$QCOW2"
echo
echo "Successfully imported image: $ALIAS"
+20 -3
View File
@@ -1,12 +1,28 @@
{ {
"nodes": { "nodes": {
"gitea": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"path": "../../homelab-services/gitea",
"type": "path"
},
"original": {
"path": "../../homelab-services/gitea",
"type": "path"
},
"parent": []
},
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1790340521, "lastModified": 1792503283,
"narHash": "sha256-cRrWlIjVRJ6BHDr9caUdXsZ3owzWIKYHpNmGPHBInIU=", "narHash": "sha256-vhe2jyvRCgufWPqDuDq1S3t3ypE+ka46IFutV02xKso=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "f5c082a40f7571c266e74e80ae2e68aadd8a9fc7", "rev": "cd4ea8d57de16f4810bc5f14207bac45fbf19f67",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -34,6 +50,7 @@
}, },
"root": { "root": {
"inputs": { "inputs": {
"gitea": "gitea",
"nixpkgs": "nixpkgs", "nixpkgs": "nixpkgs",
"postgresql-db": "postgresql-db" "postgresql-db": "postgresql-db"
} }
+7 -3
View File
@@ -7,6 +7,10 @@
url = "path:../../homelab-services/postgresql-db"; url = "path:../../homelab-services/postgresql-db";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
gitea = {
url = "path:../../homelab-services/gitea";
inputs.nixpkgs.follows = "nixpkgs";
};
}; };
outputs = outputs =
@@ -14,6 +18,7 @@
self, self,
nixpkgs, nixpkgs,
postgresql-db, postgresql-db,
gitea,
}@inputs: }@inputs:
let let
system = "x86_64-linux"; system = "x86_64-linux";
@@ -27,9 +32,7 @@
pkgs.runCommand "sops-decrypt-${filename}" pkgs.runCommand "sops-decrypt-${filename}"
{ {
# Use special separate injectable key that can only decrypt these dummy secrets # Use special separate injectable key that can only decrypt these dummy secrets
SOPS_AGE_KEY_FILE = "/home/roy/.config/sops/age/virtual-key.txt"; SOPS_AGE_KEY_FILE = "/run/sops-virtual-key.txt";
__noChroot = true;
} }
'' ''
${pkgs.sops}/bin/sops -d ${./secrets}/${filename} > $out ${pkgs.sops}/bin/sops -d ${./secrets}/${filename} > $out
@@ -47,6 +50,7 @@
modules = [ modules = [
./virtual.nix ./virtual.nix
postgresql-db.nixosModules.postgresql-db postgresql-db.nixosModules.postgresql-db
gitea.nixosModules.hl-gitea
# declare the vm output # declare the vm output
"${inputs.nixpkgs}/nixos/modules/virtualisation/incus-virtual-machine.nix" "${inputs.nixpkgs}/nixos/modules/virtualisation/incus-virtual-machine.nix"
@@ -0,0 +1,13 @@
GITEA_DB_NAME=ENC[AES256_GCM,data:zEhMvGo=,iv:HxxKDckuk8wzV9k1be2kbhWWwKN5C36Mciaj+RbNfRQ=,tag:l2JTkvzVSiSD8RmMWPY/pw==,type:str]
GITEA_DB_USER=ENC[AES256_GCM,data:I7w/mZ7yq9yeHA==,iv:N3hT4f6BcH4xt0Z+YowTSM/MLIV4C1afM+2MYMFYAlg=,tag:tiUDZ9UvE/Rzmfcw69kK9Q==,type:str]
GITEA_DB_PASS=ENC[AES256_GCM,data:TRG6S/fCrJ8=,iv:gAmGfL0vapgSIf7Gyhm12ibKRmBurN5IBJIcRVki/PY=,tag:Zinc2oTv+jlZ+E+wgEvIwQ==,type:str]
sops_age__list_0__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBTWXBOSDViRVc1YVpRd2tZ\naDRvU2t0Ti8zTkoxdG1PbGR3UmNrQzlzOFVFCmlHZHNZL0VVdk81NzlVdGJsdjgy\ndFM1WmY3cXN6WHNXZjlBTGFWYnFoZjgKLS0tIHFJakgyTXhtcHYzbG9OWTJXRkMx\nK0Y4SGhnRmMyNWplTExQQmp1ZEk2VFEKwfxoGZ5q5ZTfe4+u0sm0VW6RSIZMIhPW\nCjXwHVuN9i06EH2CZ57zddjsVmXDJG6bsx7htEauxBA4TipwIrDcZQ==\n-----END AGE ENCRYPTED FILE-----\n
sops_age__list_0__map_recipient=age1zad0qu648dhjav4pzjhkc6vswnqtacuv9230xcgle8wmv56r8ykqn0ud7y
sops_age__list_1__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBWbEZ4MUpONlh4MnJPWHBF\nU2I4T3BObm9IOStGZVFIOGp1anNZY3FGNG1vCnlHYVN5d1V3clFpeW9wTi94Uy93\nVmlmeU41bU1jM1NoZ3V1VE9UQWlmYkUKLS0tIDhhZk5YRFhGblRhWDFaL3AydHJy\nTVVheGxuUnh1NXduNUxod1k0blh2V0kKZSRFcP5R2wTjIi76KhTNNKSFXPbF7fES\nLvbs56t74WVJyCxAk9Vw5UESvTXiEAvBVZ9N7N0efhAEk8iIcykrGQ==\n-----END AGE ENCRYPTED FILE-----\n
sops_age__list_1__map_recipient=age1rwugh86469664fwhgrj9xuhjxs9vpflx3r0ftuvd0glphf2gecfs8thxsj
sops_age__list_2__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBWNGlMMWlkTEZCRVdqNXJY\nWHFQWjJSZWhRMEtoOCtVOGRHSGlzZm52RWdBCmFuUWpjeW1ab0IwVlplRHQ1RXVo\nejVrekUzYzV1cHZnaDV2UUhDUjNmNXMKLS0tIGRzelliOFVLZ293Z09rOFhhazJ0\nRi9GNkxnYnZkYXdJOFIvZUo4MDVEUUkKgBXWzRcjCQP+GkH2kI2PjDa1hPlx/F2m\nVsyaL4bAt7EQj23DkYYoJ0rMcksSOVtID5CbC/JYy7pTl8n0l3vOIw==\n-----END AGE ENCRYPTED FILE-----\n
sops_age__list_2__map_recipient=age1hzaf8j6djfc4yc98m3kqjzzdj4tcskf9kdzvjmje2xuqcfmrz5lqdtn5w7
sops_lastmodified=2026-10-21T04:55:18Z
sops_mac=ENC[AES256_GCM,data:f79R0ImdGWtaPQ7S8U6/sSUArI17sOBHZYfRFs9oft4rg7nF84Umpy9Tjsy4whjRHQjpPy5iQIWORAkdVsZ4ecW0KTwDTzXAjuXYlxxoTqKkyWQOOF2X2uhZalwpw4e+RM+vkXL6qatlkFcKz3STG7/T3i4NvOa+fmMh6+vZnCc=,iv:GQU2vsU4AS629V62rCVAU8gsT+vuXFamx7/3MBhEsTA=,tag:ZkkTD7Ku0FGwyDJia1SsAQ==,type:str]
sops_unencrypted_suffix=_unencrypted
sops_version=3.13.3
+6 -8
View File
@@ -1,13 +1,11 @@
PSQL_TEST_PASSWORD=ENC[AES256_GCM,data:23yfH/WahP629zM=,iv:d7MCyz1OD/Ns1D4KMMtOhMMnG3WVXG406sUA5Xv0eFw=,tag:QTa5Akrd/co03MZn5C2VPA==,type:str] PSQL_GITEA_PASSWORD=ENC[AES256_GCM,data:tT/Uym0M6GY=,iv:4+UJmz6AD7K4qn4HfPNFafV0Bqi17Pr1LU+wARn9X44=,tag:wyD7gdV+vibdgFnExyooMw==,type:str]
sops_age__list_0__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBiVkRsaGJDUU4vWUtXUSth\naFNNbWNQNXh1WHNHS0EwUUYwY0tGTzJrclRRCjNIK2RxYnc5VU45UVFjMEhHVGtD\ncjQ1eHBRUHhId0dYRU5UTCsxMzFOaTgKLS0tIHQxUFVnSjl3Rjk1WmJWVlJZNGtn\ndk5MWit0T09ZZnBzT3AzUndPRWVkV00KYw64NyJ5YB2pkUdhAmGouk0rtf/J2RfZ\nAh7p5Nozm7d7Cx4hNXFV3sd1IpNnDYL4Tv+0+0Rp7SpXSVQagzdiwQ==\n-----END AGE ENCRYPTED FILE-----\n sops_age__list_0__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBnRnpUOFRiemJnVFcyVUdi\ndllyZklUd1BGcUlzaEV5cVdCUEoyM1BOYVNnCnFXUTRjdmVnNVp2RkFhM2plMHBz\nblI5SWJSVGdnTzI5M08xcS9na0xTQVEKLS0tIFYvRVVpWWlPQ3g0YTNnMVQ5MzNl\nWjVZdkNTT0U1aHpNbGpkdzlZZEk3SVUKuZYSue3+1HZrlv/DD/rIcL7jbUuAmfR4\nXOwRzwpfC2Pwf+d9pTCRQ9v+AephLE9fLQp9EpT9qUlUxd8MH4zEIA==\n-----END AGE ENCRYPTED FILE-----\n
sops_age__list_0__map_recipient=age1zad0qu648dhjav4pzjhkc6vswnqtacuv9230xcgle8wmv56r8ykqn0ud7y sops_age__list_0__map_recipient=age1zad0qu648dhjav4pzjhkc6vswnqtacuv9230xcgle8wmv56r8ykqn0ud7y
sops_age__list_1__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBCdTVJVVczbmFEWlRnU0Rt\naVpIYmhwQXpPQk9abzlBQUlGVCtVeHhZTkQwCjAxMDF4SmRNUDRpNU9BK0hmcmV2\nSFkyUWZLekhWN1JRYjdXWk53Nkd1dTAKLS0tIGtxODlrWWlLV0loeHQzWjRaYkJI\nSnNnY280cXlhcDZmeVJqaENVV1pYNkUKQNdY1baew90hV1lqTrEqDuql1uY4F1/o\nupm8cuUIYh2Og70arMXfi8C7VfTgCF93q0V3MLXKmaWyeC0YcH9qsw==\n-----END AGE ENCRYPTED FILE-----\n sops_age__list_1__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA2MXhmRGMwVWttWitKNDhT\nOG5pNkNjMGVjWDl2Ylp4WHRXVy9rRGFTSFVRClloaGcrQnZnYUF4WW1FSWRZbXd5\na2M5ZXNSWmVkTjlmbHpWc2hjT3pBS2MKLS0tIGoxNExVYk1xV1RmL0dDM3Y1cER5\nUmVkSGQ5OURPRWRqMWhpUmJ2V2h3OFEK5lB3GIEjnnTKZqdN6dAEMu4bM9Ywu+BB\nfS6wf1H8e2KRyaFy6jyoQfTDJr+yRjCPW4cTmbHXlhe8z3K1hPMWwg==\n-----END AGE ENCRYPTED FILE-----\n
sops_age__list_1__map_recipient=age1rwugh86469664fwhgrj9xuhjxs9vpflx3r0ftuvd0glphf2gecfs8thxsj sops_age__list_1__map_recipient=age1rwugh86469664fwhgrj9xuhjxs9vpflx3r0ftuvd0glphf2gecfs8thxsj
sops_age__list_2__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAwVGJiOWhPUTlUa0F2SWNm\ndFd1MDM3Mno1Nm1kOWlkVnYxTDhweVB5ZWh3CnFjbE5OcEEwYzZEUFg1VVg5R1ZR\nT09YTEkvR2lSSUVuNnVER1dEeTBvZlkKLS0tIGxUVGRJUitLSDVHNDJSNXlERGZN\nR05FdVlQWkJyeTcwQ1A1ekZyVmJZY0UKJe75gpOUYrRTRSzfG9GX7pD0nNgiP79Q\n+mKco3+6UAS3Lvx/fdHsAQBlL8NfF1K2WTtNXoTjqVFLK4BMXkYkVQ==\n-----END AGE ENCRYPTED FILE-----\n sops_age__list_2__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB3K2x4MVR4ZmRUN2l2d2dw\nRGFQU3d4c2I2Q0k2WFg1WUQ5aXJqR2hOdVJzCmVHZjRqZGYwSUVUcmFtc3ZFaWpk\nNi9BNCttRzZuVnVUbkdHU2VMeWN5SlEKLS0tIDV4Q3M2Y2ZLT24zd2xvRTR5MkRi\nb3k4N21lQlgwbktQNm9PYlhQdmNFOUEKbMNZwxJ7vbZr6KhkzKkL6X1R4iqGJOJa\nSFYTWMzONRiymBWKnxqqSWyzgjV3kZbUljdngpvYZ9eoDrzQ/wtV8w==\n-----END AGE ENCRYPTED FILE-----\n
sops_age__list_2__map_recipient=age1hzaf8j6djfc4yc98m3kqjzzdj4tcskf9kdzvjmje2xuqcfmrz5lqdtn5w7 sops_age__list_2__map_recipient=age1hzaf8j6djfc4yc98m3kqjzzdj4tcskf9kdzvjmje2xuqcfmrz5lqdtn5w7
sops_age__list_3__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBTaTdnYjc1SDgvNW9hMUc4\nQ3M0cnBQTThycEdtKzdhZUxDN1lRbEd0U0g0Cml4M2JFTUlIdEMxKzZ6Q09IOGRH\nRWpTUXRpWkV1cmdkY2Z1SVJWaERGaEEKLS0tIENVS3dVVVN2allaZXE1bmh4eU4w\nVFNpdWZrT200NzVxZ3owSnVhdm42RGcKH+01ReDxA0ZusdMKhxl7S+f65Lla3RHa\nuHBPXStwk6Q5YmC4AtV22YgQ/V0qRDrhQM49zX7WFGVo9HxmQ7AqHA==\n-----END AGE ENCRYPTED FILE-----\n sops_lastmodified=2026-10-21T04:55:45Z
sops_age__list_3__map_recipient=age1q5zwds8g47j7xsqhp8tk995l3n4a5z876vff7wgx4sztwgdsa3yq7eu6xk sops_mac=ENC[AES256_GCM,data:444WNcnJjuE09R9ERw5VV5vGXEo1coHKaa37luYKejcV/TNpzaeyJu9b+5UmMVJuYNm878l6tX/gmoTfliocn6Z4RaoWnNP0H5VkUw9khA3zksnrxUfpaG1CIR53BP0ZhuqMDhpvYYA1crhHUJhT0PRBdAlDluivlt627K8L4Sc=,iv:oObMPvFlsnGmseVJNAj/mMHCeyaFp4JvjedYVmz+PBA=,tag:HtV1wM+vyhpZv+x1Yd47Ww==,type:str]
sops_lastmodified=2026-09-26T06:04:51Z
sops_mac=ENC[AES256_GCM,data:Q4AhgLZLR6hSSiwextwm53DHKKeSN+YSLKyQGNfZG/sb/c+4QOQxYXZD2YXShbOei1Og+IqcVCkJy+CaYAE6roz04AxnQgis3anVOSOAMAcezFndXU/f80pqkikj/o14O6ueOi/2gQMJND9HHEZSJBAwpJbsX1CLru16Uv2gkaY=,iv:nItKXHq2sgw8ijA5d/DxeTAafkwIUuxJXyXOP8gDuL0=,tag:oNYfflLLKhhQN8H1DRBVUQ==,type:str]
sops_unencrypted_suffix=_unencrypted sops_unencrypted_suffix=_unencrypted
sops_version=3.13.3 sops_version=3.13.3
+30 -1
View File
@@ -35,6 +35,21 @@
}; };
}; };
# Networking
networking = {
nftables.enable = true;
firewall = {
enable = true;
allowedTCPPorts = [
22
80 # gitea routing not enabled, open firewall here
443 # gitea routing not enabled, open firewall here
30222 # gitea routing not enabled, open firewall here
6443 # k3s
];
};
};
# Packages # Packages
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
curl curl
@@ -63,6 +78,20 @@
]; ];
}; };
# ================================ #
# GITEA SERVICE #
# ================================ #
services.hl-gitea = {
enable = true;
credentialsFile = credentials.gitea-env;
database-hostname = "192.168.8.180:5432";
default-nginx = {
enable = false;
};
};
# ================================ # # ================================ #
# PSQL SERVICE # # PSQL SERVICE #
# ================================ # # ================================ #
@@ -74,7 +103,7 @@
port = 5432; port = 5432;
credentialsFile = credentials.psql-env; credentialsFile = credentials.psql-env;
databases = [ databases = [
"test" "gitea"
]; ];
ipMasks = [ ipMasks = [
"10.42.0.0/20" # k3s pod mask "10.42.0.0/20" # k3s pod mask