1 Commits
Author SHA1 Message Date
klaatu 96f682830a feat: Gitea Actions shell runners + flake-lock workflow
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-isaiah Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-linode Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-zeke Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-jeremiah Build done.
buildbot/nix-build Build done.
- Add modules/nixos/gitea-runner.nix: NixOS module for act_runner in
  shell mode, with options for enable, instanceURL, name, labels, and
  tokenFile (agenix secret path).
- Deploy gitea-runner to jeremiah, isaiah, zeke, and linode with
  appropriate labels. Agenix secret placeholders left with TODOs.
- Add .gitea/workflows/update-flake-lock.yaml: weekly workflow (Sunday
  midnight) that runs nix flake update and opens a PR if flake.lock
  changed, using GITEA_TOKEN secret for authentication.

Closes part of #15 (NixOS shell runners + flake-lock workflow).
2026-04-04 01:14:52 -05:00
7 changed files with 16 additions and 170 deletions
-6
View File
@@ -60,12 +60,6 @@ in
enable = true; enable = true;
tags = [ "home" ]; tags = [ "home" ];
}; };
backup.jobs.albyhub = {
src = "/chain/alby";
dest = "albyhub";
pre = "systemctl stop albyhub || true";
post = "systemctl start albyhub";
};
}; };
hardware = { hardware = {
+8 -2
View File
@@ -88,6 +88,13 @@ in
priority = 254; priority = 254;
}; };
nebula.enable = true; nebula.enable = true;
proxies = {
# Expose Buildbot over HTTP on the LAN so Klaatu (and other internal
# tools) can reach it without Tailscale. Buildbot's own Gitea OAuth
# handles authentication.
"buildbot.home".target = "http://localhost:8010/";
"buildbot.thehellings.lan".target = "http://localhost:8010/";
};
tailscale = { tailscale = {
enable = true; enable = true;
tags = [ "home" ]; tags = [ "home" ];
@@ -124,7 +131,6 @@ in
interface = "br0"; interface = "br0";
}; };
firewall.allowedTCPPorts = [ firewall.allowedTCPPorts = [
8010
3389 3389
9989 # buildbot communications port 9989 # buildbot communications port
]; ];
@@ -153,7 +159,7 @@ in
updateOutputs = false; updateOutputs = false;
}; };
}; };
domain = "${config.networking.hostName}.shire-zebra.ts.net"; domain = "${config.networking.hostName}.shire-zebra.ts.net:8010";
evalMaxMemorySize = 8192; evalMaxMemorySize = 8192;
evalWorkerCount = 4; evalWorkerCount = 4;
gitea = { gitea = {
-2
View File
@@ -92,8 +92,6 @@ spec:
# 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:
ALLOWED_HOST_LIST: loopback,private,*.shire-zebra.ts.net
metrics: metrics:
enabled: false enabled: false
-76
View File
@@ -1,76 +0,0 @@
apiVersion: batch/v1
kind: CronJob
metadata:
name: gitea-dump
spec:
schedule: "0 3 * * *"
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 3
jobTemplate:
spec:
template:
spec:
restartPolicy: Never
securityContext:
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
volumes:
- name: gitea-data
persistentVolumeClaim:
claimName: gitea-shared-storage
- name: dump-staging
emptyDir: {}
initContainers:
- name: gitea-dump
image: "gitea/gitea:1.25.4"
command:
- /bin/sh
- "-c"
- |
set -e
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
OUTFILE="/dump-staging/gitea-dump-${TIMESTAMP}.zip"
gitea dump \
--config /data/gitea/conf/app.ini \
--file "${OUTFILE}" \
--type zip
echo "Dump written to ${OUTFILE}"
volumeMounts:
- name: gitea-data
mountPath: /data
readOnly: true
- name: dump-staging
mountPath: /dump-staging
containers:
- name: upload-to-s3
image: "minio/mc:latest"
command:
- /bin/sh
- "-c"
- |
set -e
# Configure mc alias for MinIO
mc alias set nas1 http://nas1.shire-zebra.ts.net:9000 \
"${MINIO_ACCESS_KEY}" "${MINIO_SECRET_KEY}"
# Upload dump to backup-gitea bucket
DUMP_FILE=$(ls /dump-staging/gitea-dump-*.zip | head -1)
mc cp "${DUMP_FILE}" "nas1/backup-gitea/$(basename ${DUMP_FILE})"
echo "Uploaded $(basename ${DUMP_FILE}) to backup-gitea"
# Set 30-day lifecycle on the bucket (idempotent)
mc ilm rule add --expire-days 30 nas1/backup-gitea 2>/dev/null || true
volumeMounts:
- name: dump-staging
mountPath: /dump-staging
readOnly: true
env:
- name: MINIO_ACCESS_KEY
valueFrom:
secretKeyRef:
name: gitea-config
key: minio_key
- name: MINIO_SECRET_KEY
valueFrom:
secretKeyRef:
name: gitea-config
key: minio_secret
-1
View File
@@ -6,4 +6,3 @@ resources:
- chart.yaml - chart.yaml
- ingress.yaml - ingress.yaml
- secrets.yaml - secrets.yaml
- dump-cronjob.yaml
-2
View File
@@ -15,8 +15,6 @@ spec:
storage: |- storage: |-
MINIO_ACCESS_KEY_ID={{ .minio_key }} MINIO_ACCESS_KEY_ID={{ .minio_key }}
MINIO_SECRET_ACCESS_KEY={{ .minio_secret }} MINIO_SECRET_ACCESS_KEY={{ .minio_secret }}
minio_key: "{{ .minio_key }}"
minio_secret: "{{ .minio_secret }}"
secretStoreRef: secretStoreRef:
name: bitwarden-login name: bitwarden-login
kind: ClusterSecretStore kind: ClusterSecretStore
+8 -81
View File
@@ -19,76 +19,23 @@ spec:
key: "dd0de40c-9ad6-4034-9d5c-b311016ebf19" key: "dd0de40c-9ad6-4034-9d5c-b311016ebf19"
property: apikey property: apikey
--- ---
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata:
name: immich-minio-creds
spec:
target:
name: immich-minio-creds
deletionPolicy: Delete
template:
type: Opaque
data:
access-key: "{{ .minio_key }}"
secret-key: "{{ .minio_secret }}"
rclone.conf: |
[nas1minio]
type = s3
provider = Minio
endpoint = http://nas1.shire-zebra.ts.net:9000
access_key_id = {{ .minio_key }}
secret_access_key = {{ .minio_secret }}
region = us-east-1
secretStoreRef:
name: bitwarden-login
kind: ClusterSecretStore
data:
- secretKey: minio_key
remoteRef:
key: dcbcf704-7dce-48d7-bbd1-b3a801875b3d
property: username
- secretKey: minio_secret
remoteRef:
key: dcbcf704-7dce-48d7-bbd1-b3a801875b3d
property: password
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: immich-backup-staging
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn-default
resources:
requests:
storage: 400Gi
---
apiVersion: batch/v1 apiVersion: batch/v1
kind: CronJob kind: CronJob
metadata: metadata:
name: backup name: backup
spec: spec:
schedule: "0 4 * * *" # At 4am each day schedule: "0 4 * * *" # At 4am each day
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 3
jobTemplate: jobTemplate:
spec: spec:
template: template:
spec: spec:
restartPolicy: Never restartPolicy: Never
volumes: volumes:
- name: staging - name: nas1
persistentVolumeClaim: nfs:
claimName: immich-backup-staging path: /mnt/all/backups/immich
- name: rclone-config server: nas1.shire-zebra.ts.net
secret: containers:
secretName: immich-minio-creds
items:
- key: rclone.conf
path: rclone.conf
initContainers:
- name: immich-go - name: immich-go
image: "src.thehellings.com/greg/immich:latest" image: "src.thehellings.com/greg/immich:latest"
imagePullPolicy: "Always" imagePullPolicy: "Always"
@@ -99,38 +46,18 @@ spec:
immich-go immich-go
archive archive
"--write-to-folder" "--write-to-folder"
/staging /nas1
from-immich from-immich
"--from-api-key" "--from-api-key"
"$IMMICH_API_KEY" "$IMMICH_API_KEY"
"--from-server" "--from-server"
"http://immich-server:2283" "http://immich-server:2283"
volumeMounts: volumeMounts:
- name: staging - name: nas1
mountPath: /staging mountPath: /nas1
env: env:
- name: IMMICH_API_KEY - name: IMMICH_API_KEY
valueFrom: valueFrom:
secretKeyRef: secretKeyRef:
name: immich-login name: immich-login
key: apikey key: apikey
containers:
- name: rclone-sync
image: "rclone/rclone:1.68"
command:
- /bin/sh
- "-c"
- |
rclone sync \
--config /rclone-config/rclone.conf \
--checksum \
--progress \
--transfers 4 \
--checkers 8 \
/staging nas1minio:immich
volumeMounts:
- name: staging
mountPath: /staging
- name: rclone-config
mountPath: /rclone-config
readOnly: true