photo-stats
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -4,21 +4,21 @@ metadata:
|
|||||||
name: davical-secrets
|
name: davical-secrets
|
||||||
namespace: pim
|
namespace: pim
|
||||||
stringData:
|
stringData:
|
||||||
PGSQL_ROOT_PASS: ENC[AES256_GCM,data:f9r1bH7IqlFTeGGnBn1x4UDqfLvhRoVaesC7sxwBJIMABJ0ggOgk6mk0zteYZgGv,iv:xfucImRMa1Dw5QAIOsMs7XKjcnItB2H7j1L0YIapO/s=,tag:K7keBVRjLIpq6dQLhfdRpg==,type:str]
|
PGSQL_ROOT_PASS: ENC[AES256_GCM,data:GLoB3tznlBOy9elUlxcL9V747OWAT9YW6DjDapZUtxRAdw3wkWzFXBCqbw6vhwHi,iv:vLx1XvgLrEPhWC1XL5SKyHnp5xf2vvzc55k5ryZHVmk=,tag:y4wij39JbokpfFnugO66kQ==,type:str]
|
||||||
PASSDAVDB: ENC[AES256_GCM,data:FqlacdycRsRc+lQ1s6VaZ2Dsi7mevFYhwKAVG0AidkVKEJNJZavl/Ud1BLBSkpkB,iv:9yjFHQyJRCGRJJaCcACl5RuQUlUrWQR9oOmre5OcQAs=,tag:EYujVvJLT1DrDuswsdDTzQ==,type:str]
|
PASSDAVDB: ENC[AES256_GCM,data:FkWyfTAsorMziegamkdL3IPAm62NqEdYAM5H1gNRgDh+EWxQtQVwQuZl8G0TKe3W,iv:W64wNNiR2Iz8gU5eUJt3R23ed6tSxQl4ExOhzgzwrX4=,tag:wqApbLwnLejygCXoBj0BLA==,type:str]
|
||||||
ADMINDAVICALPASS: ENC[AES256_GCM,data:6Fz/CP0VqI96rUyzX7yN/btZqPFta1waF8rnr1P71po=,iv:Z3TLC+sUmfQ8nZymJYHXw6Ibl4o58Agm8ytsbYdPuLg=,tag:epOHlqqpffJHkBBqsZSrYw==,type:str]
|
ADMINDAVICALPASS: ENC[AES256_GCM,data:YqR0GWCQt9gibe+spuaeU5iiJ+igvQsX4Wt4uJBgb04=,iv:wR9VYd3032QGdG5f4HK3GEyMvVLNY0d0blbaNKFPcGE=,tag:0XII81rmALA+EXosfXNqYA==,type:str]
|
||||||
sops:
|
sops:
|
||||||
age:
|
age:
|
||||||
- recipient: age1yx8mey02c0mu6te9hwxwdqp5n4enjz35e8thchsmvhqw7xsrzy0syg367g
|
- recipient: age1yx8mey02c0mu6te9hwxwdqp5n4enjz35e8thchsmvhqw7xsrzy0syg367g
|
||||||
enc: |
|
enc: |
|
||||||
-----BEGIN AGE ENCRYPTED FILE-----
|
-----BEGIN AGE ENCRYPTED FILE-----
|
||||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB0bnB0WTc5UlVoeGZyMGE4
|
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBPcVBOSVF5MXUrN2xLRG83
|
||||||
RU5DSzF3UmxzWUdRZDhjbDhYeGZyWW9wRUdjCkt4elU5Y0FSQkFwTGkzenBQd0V5
|
S1MrVno4cDNUelZXYnJmbG12dG9IVzVPc0V3CjNuL0ZUbjN2TWtmNWtsNVlLU1Fa
|
||||||
akozdm5JVkVnZXdUYlhDbzVjZXoybGcKLS0tIFBiU3JndU4rRllNN09IRmc3cmxk
|
eEE2b3NtRWJZeXBtMS93QWxmUG5GU3cKLS0tIG80NzI4Z09TdVZSNEk0bktRRkFB
|
||||||
Z1N0alIweEtzZk81SlBmdTgvNkpLUTgKz4ER63C8bBv8+DGab64wWeyTOl6IniT4
|
T3dzc09KQk93VElLaU1IY2xZSGh1QTQKN2vJ27BOBq7lnTyiNPAu6k2EpVAnv8jA
|
||||||
mlseC26nHFecjvLFYNF0vHT9xg6414GgpfGvLdJCVaZQAsBuX/NuGw==
|
kTjoC3hbe2ZYherN7X/gc9QMz1PRt5AF/GsCwl6rXuSBuBucwPO2gQ==
|
||||||
-----END AGE ENCRYPTED FILE-----
|
-----END AGE ENCRYPTED FILE-----
|
||||||
lastmodified: "2026-08-26T10:26:53Z"
|
lastmodified: "2026-08-26T10:27:01Z"
|
||||||
mac: ENC[AES256_GCM,data:/DQGjxf7niDVagWw16E0eKglQ1kaPOOjeoekHndZMdzDwhdfL/GuD6Y4s2lNvM/Si7IBMvn8TlcE3EV5geWc4LzX9lEly6yr2LuVYyFUWe6zn/YNa7/YRP4so8qw0Gc0tlTDe3ojI6sBZDIGn+28xPrIM/2nkB8WzqieoszuQfI=,iv:RZYmMGUwx2sitw2ZiA9iDbqizs2RGVnsqcrZrd7T820=,tag:/heDuw3V2/GH+BU1ZaUilA==,type:str]
|
mac: ENC[AES256_GCM,data:odu1+QzHWeTsRpgfdDzxhcnVE30cMTT+60RDqPZgzmOAwPBCHgGJvbwQG/zNwVCKkZegW6SlDXTBIr/f5CM8HBVLhl3c4QSzzNAZ9eY1ctNDVSBP7AIh7Nchg3ILZY00ickejRlGt1PTuIQ0d/Fl5AZoa4bPq+jTpgA7DFpua88=,iv:jFqOO3nM5sD+10bdgR7GOsibK5JxUKj0Ljj2267FfG4=,tag:zsPF9y6dv8oqJ6XUz8l/Cw==,type:str]
|
||||||
encrypted_regex: ^(data|stringData)$
|
encrypted_regex: ^(data|stringData)$
|
||||||
version: 3.11.0
|
version: 3.11.0
|
||||||
|
|||||||
@@ -4,21 +4,21 @@ metadata:
|
|||||||
name: markdown-vault-mcp-secrets
|
name: markdown-vault-mcp-secrets
|
||||||
namespace: mcp
|
namespace: mcp
|
||||||
stringData:
|
stringData:
|
||||||
BEARER_TOKEN: ENC[AES256_GCM,data:bRV/5QwZO3I6yd9uW9onx3AJY/5ttlMm+sgjFBJjb+2b55nVtyX6H2waSXQteO4MhExpqGzfW2Jia+9ORrSQyA==,iv:y26U1Vi5+9Oui3rG/EQgmuRUSC6Fm0N0lLUwDHLr3Ic=,tag:rICRduPbUkw8zgPQ8TSGkA==,type:str]
|
BEARER_TOKEN: ENC[AES256_GCM,data:Inz6hYmHP3ZTqztps+ZI0+N6dDAvRQiO68gqooQBipSKXrVtYxM6H+eXInTyLfTIXnJo1Qw+j4wKFSaPfG25Ng==,iv:Xkk5HwEAkdf5EoTL1TQBL/Ab1Ug7MkFgbksC/EV3rys=,tag:LswsBBMwKEir3uMIodzaQw==,type:str]
|
||||||
OIDC_CLIENT_SECRET: ENC[AES256_GCM,data:6vhXqNXZAiDZz0Ej08wCSCJKkKu14MwgszdOYErxILg9U4icBeEGe9u3oMLoMt0KRrzz8qPNewomLyrjt3yAhA==,iv:9tGtJL0pcCkzOMIWbyqo5hE/OE5yZPFTYi8Z4AJUbDA=,tag:pTB/wtotzk6kqjZFkNOWKw==,type:str]
|
OIDC_CLIENT_SECRET: ENC[AES256_GCM,data:EEHlrt/5yWA/Uk+zFISWcqNMI5jh081mY3gzSzfTBNoktzPisClLaj6LgeI+E4cJwzd6rqznvlUr9GThv2/ecw==,iv:iFUC4J9LlkubV+9kWLh0Prxc140NppG2W5MpZKGBgj4=,tag:PgYH3PnLN5ElJyR38PuRTg==,type:str]
|
||||||
OIDC_JWT_SIGNING_KEY: ENC[AES256_GCM,data:UdeqSmsdmi1VLfPN/47bg39u0fB166nJ8LtPJUTpu+gVoOI0Kik2PJZY5AWYBz5APGgq+3yWG38nwgVI0E7jMA==,iv:shUioenkSoMNGF+6LZg2hiMXitb95k68CCRlauSmBdw=,tag:l2aB5fmBA39VbiQ9AsP85Q==,type:str]
|
OIDC_JWT_SIGNING_KEY: ENC[AES256_GCM,data:O6W+GihlmOshr123TFoke7DtXJttkZBMaBogvw74k4RL4uKXhOeL9Hsd3LhGheimLC5FaQJZQDdjgEpCCnF9iA==,iv:a35L2UTiMMrvixAWIOVFYQVo9n2nkbDWQxIdZGof1Dk=,tag:V+3gOYQKF6twiTnjjMM7jg==,type:str]
|
||||||
sops:
|
sops:
|
||||||
age:
|
age:
|
||||||
- recipient: age1kct5g7d7eus2hvdnmx99ewsrtz70lhlasxa25euqwdctqhwqqpxqz0n7gg
|
- recipient: age1kct5g7d7eus2hvdnmx99ewsrtz70lhlasxa25euqwdctqhwqqpxqz0n7gg
|
||||||
enc: |
|
enc: |
|
||||||
-----BEGIN AGE ENCRYPTED FILE-----
|
-----BEGIN AGE ENCRYPTED FILE-----
|
||||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBSNDc1TmdqSU54Q3c5UlBY
|
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB1a0diUlZEZVJ2c2xVZTJr
|
||||||
Z3pIQk5reG45VW5XVVp1OFI0eWVTNnM3MmhvCnRpaHprRUhkbTM4TjZ5bTdYR1l6
|
YngwcDBRdks4Z3JtV2RRR1NIdWplNDRBUmhRCmR3bmlQNEhZTHlsMktGVDd4cmRn
|
||||||
MkxrTldDby8vZlhjSzc1RmtBSkVsODgKLS0tIFhnVkIwMUJ2TWw4bXdkTWI0SzBj
|
a0R4UjlPK1BCaHlBbkdud2hUNi84WW8KLS0tIHpUd2hqVnJMM1A3U1BQdFJ5bmpm
|
||||||
WWx6OUduek5UMmx3cUg0RzZoWXN0TUUKendroGbxE+IGxnrQe5m3CmZQFwsGcjvO
|
SWpPNU9Gc2lNUUgra1M4bHVLRzNqVzAKXR2z4AtBMMmiO+hIBWzwkPaU5SrdXdVD
|
||||||
kZxWTIIpsHCwLXpBq5kmtg5kn7eEvySd2oL/Gh71K3OjDmKxXpM9JA==
|
IbhJlYW0eHOZzp0/5aE9VMFnxNC3Vd9S4A9uCyZpDExAlg741GUTtw==
|
||||||
-----END AGE ENCRYPTED FILE-----
|
-----END AGE ENCRYPTED FILE-----
|
||||||
lastmodified: "2026-08-26T10:26:54Z"
|
lastmodified: "2026-08-26T10:27:02Z"
|
||||||
mac: ENC[AES256_GCM,data:WKkjMnv0COt7AnQ7rFnrfKbkaqnBcoXaFmg7ebrQvv+JPECysv5vvc3+gyioAsilYoGhN7rNSdzeIInDv4OrT3NAtZB3nsqcEmmLpKM6Nfa0FBPFmmDzFvu8HVARM5cgkPBgQMoLSqh6ZV0gqyF8+kEc9wVQBrA7ZLhttXamgkM=,iv:UYPu4dFCKpne15JIz7T80taadFIipvw/9OO3f8QzDZk=,tag:aGBrdJ9Kzmr59DYfrQPHtg==,type:str]
|
mac: ENC[AES256_GCM,data:YA40JH2uWjuYnCF3b8L72HopTPjoUyNp2iy6e8jlXPmPclzAxNjh+TL+M40FzkfI9zK8VSJuoUV5KxKc5Y/DuZVzp3o4+yBh4hcq2YRO43vJ+ckFpFWKTGk6tvPAmPfaCkSnwlQYWoO5Voz9/c5GqSFCG8oe3g1VA8JugXlJo30=,iv:hxYQpBQGder3L8BuNKiVL20vfCpKZAG95Rj2ZIfqHA8=,tag:6THOxFNB85EBxnJdOEDCRw==,type:str]
|
||||||
encrypted_regex: ^(data|stringData)$
|
encrypted_regex: ^(data|stringData)$
|
||||||
version: 3.11.0
|
version: 3.11.0
|
||||||
|
|||||||
@@ -4,19 +4,19 @@ metadata:
|
|||||||
name: mosquitto-passwd
|
name: mosquitto-passwd
|
||||||
namespace: mqtt
|
namespace: mqtt
|
||||||
stringData:
|
stringData:
|
||||||
passwd: ENC[AES256_GCM,data:WgX2+X52PX/SfyFwRgznyV31f+cMfdjiDgRA+Dyu4n95wLwWuxTPEPHBhS5TpkpRQ3/UGSSzTmxT4TRrQxOV4fAdxchzPtso0pAPeY+xscRU2qJLxriaL9Dtu1gyEAS9Lspb+mj9HwSyij0AsHXQV2e+Nff20E5rIsfX311aYZ53xdgHjWMIOP0SznYAJHPYQXS4YNjhgMpT5CGTVloAYzLHH7zqxXulwbf45qtA9zEXt1fjZi9u3r1jTcZ/VA==,iv:OjVaYdS3iRhuYQEZzUyrcbXq4g0eZBylY16C0krXQsE=,tag:6SZabYdjAcwL7hpphi31qQ==,type:str]
|
passwd: ENC[AES256_GCM,data:QJAG3td80Zz1lofBEu0Mm/HkfiE/adTFzGFL6TofKf9VB44Of9oKc0DDdODJiMCoNlhJFmE0fdU5M/m+yUo3tJuGo9kHWMcmGbf3ORNLBde0QQXK3D5IHqS84Bs4obWzh9VD5kD6bXGm+YIw3lxKDvEupuGAf6mKGUSHImHyGTfdq7JeL8gOZmFQ4s+64+H4nFhe9yhJoq4t6WmK/AIBHH+LRns1n8NTW61j/UJypPTKja12k8aFyGBTlYO7ew==,iv:tWSIZO8xWsEw/Qe6A9pZbX4scl2Z7OVXu9ZE4gheip0=,tag:RCiv6bTNYWC/gPLPPlRfoA==,type:str]
|
||||||
sops:
|
sops:
|
||||||
age:
|
age:
|
||||||
- recipient: age1u236u5mzkzj72y4mfxx68gfqw0u0j6tdgkudnm5pdfpe7apq4u6s89jr2h
|
- recipient: age1u236u5mzkzj72y4mfxx68gfqw0u0j6tdgkudnm5pdfpe7apq4u6s89jr2h
|
||||||
enc: |
|
enc: |
|
||||||
-----BEGIN AGE ENCRYPTED FILE-----
|
-----BEGIN AGE ENCRYPTED FILE-----
|
||||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBjeEE0RXYvN2hGMW5MNHBa
|
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAwR0ZPUDNqZkQvR3Y4RFcv
|
||||||
RzRSL1luL1FkdHFPZ2trZnZHREtOeEdMRFdvCnhhcG0wTUdWT3ArTkNYTG5yOUE2
|
SVpqM3NBSWxrVEM0c3IxcWRoNGxqajlheFdBCnF4enE0akY5UEhJck4vaUx3YW5C
|
||||||
STZXN0s0NU9DbnI1MzJBL3NhWTZpTkUKLS0tIEtvRk9CSDNOdCthT09xZmx1NlBB
|
KytxU01Icm0zcFNZb2dBa3BaUXBwZFUKLS0tICszUFJCZElTL3lDSE52OVBXOFhn
|
||||||
ZEs2MzVMd2hnLzZCU01mR1lBZkw1Sk0KbsQETQCBIdGk0coHdUE8Q9hs3ZAcp32m
|
T1UrblIzb29VTlN5Q2VaSWtjR2N3MkkKi3HN5VoLCBOTNh3GIbQv/8zl/JFf43HX
|
||||||
YpekSy/Mao3HQxrdGkIRoDSqO9sPOQKUxlpQwOTbyRYy8x59IOO8EA==
|
7hvRNZlI1CtQFgCM9SDC+7feB6rA21rUHmd5B13jpoRkp0j9KRUBLA==
|
||||||
-----END AGE ENCRYPTED FILE-----
|
-----END AGE ENCRYPTED FILE-----
|
||||||
lastmodified: "2026-08-26T10:26:54Z"
|
lastmodified: "2026-08-26T10:27:03Z"
|
||||||
mac: ENC[AES256_GCM,data:VWjRqS1kE4eOUAADvtII/7ckZ8bENiXibfr/izLPYgsn+e/TuBpivzvYM8h2O480ElD0eq8AmxH2SoEy6qLBM4orRQ0JjDAbW7Fi3zNmurnsGDpL7+YA9dKFg2xyrt1VDEebzGdOuqAp7WzXW4OdScZm6vSeIITf5hObLmFe9c4=,iv:ObNftLT8p0sxcYaPkMPC6LpMIJDaCrDUmblU3Nq6UkA=,tag:fNwieqUIWrv2nnZSHkTAfw==,type:str]
|
mac: ENC[AES256_GCM,data:Iu4ocAifzRzKV9TxUZLYL2AjahmaA5cBdkbBVqh3wIAV+8fYb4iAwffpaEBs6FtN+4dVKREPulxHGlaQUownyoRoAgx7uD/LTa1ft0HF90o5m5mgBJRbYkM1Qcl2k0YnUYg5RdWxidxXHK+Wfd0kUr/LIS5JwrhOsL6Vezariss=,iv:KjI2+poUcgsfywDbmlCMJ21QelNurxqeY1Pt2MbFNN4=,tag:o9XXyjzLkvwH/IAQrxbLbg==,type:str]
|
||||||
encrypted_regex: ^(data|stringData)$
|
encrypted_regex: ^(data|stringData)$
|
||||||
version: 3.11.0
|
version: 3.11.0
|
||||||
|
|||||||
@@ -0,0 +1,175 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: photo-stats-script
|
||||||
|
namespace: photo-stats
|
||||||
|
data:
|
||||||
|
scan.py: |
|
||||||
|
import os
|
||||||
|
import time
|
||||||
|
import json
|
||||||
|
import threading
|
||||||
|
from datetime import datetime, timezone
|
||||||
|
|
||||||
|
ROOT = "/mnt/sdb2/immich/uploads/library"
|
||||||
|
OUT_DIR = "/www"
|
||||||
|
CUTOFF = datetime(2025, 1, 1, tzinfo=timezone.utc).timestamp()
|
||||||
|
RESCAN_INTERVAL_SECONDS = 6 * 3600
|
||||||
|
|
||||||
|
state_lock = threading.Lock()
|
||||||
|
state = {
|
||||||
|
"status": "starting",
|
||||||
|
"processed": 0,
|
||||||
|
"total": 0,
|
||||||
|
"percent": 0.0,
|
||||||
|
"total_files": 0,
|
||||||
|
"total_size": 0,
|
||||||
|
"recent_files": 0,
|
||||||
|
"recent_size": 0,
|
||||||
|
"started_at": None,
|
||||||
|
"finished_at": None,
|
||||||
|
"error": None,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def human_size(n):
|
||||||
|
n = float(n)
|
||||||
|
for unit in ("B", "KiB", "MiB", "GiB", "TiB", "PiB"):
|
||||||
|
if abs(n) < 1024.0:
|
||||||
|
return f"{n:.1f}{unit}"
|
||||||
|
n /= 1024.0
|
||||||
|
return f"{n:.1f}EiB"
|
||||||
|
|
||||||
|
|
||||||
|
def render_html(s):
|
||||||
|
progress_html = ""
|
||||||
|
if s["status"] == "counting":
|
||||||
|
progress_html = "<p>Counting files...</p>"
|
||||||
|
elif s["status"] == "scanning":
|
||||||
|
pct = s["percent"]
|
||||||
|
progress_html = f"""
|
||||||
|
<p>Progress: {s['processed']} / {s['total']} ({pct:.1f}%)</p>
|
||||||
|
<div class="bar"><div class="fill" style="width:{pct:.1f}%"></div></div>
|
||||||
|
"""
|
||||||
|
error_html = f"<p class='err'>Error: {s['error']}</p>" if s["error"] else ""
|
||||||
|
return f"""<!doctype html>
|
||||||
|
<html><head><meta charset="utf-8"><title>Photo library stats</title>
|
||||||
|
<meta http-equiv="refresh" content="5">
|
||||||
|
<style>
|
||||||
|
body {{ font-family: monospace; background: #111; color: #eee; padding: 2rem; }}
|
||||||
|
table {{ border-collapse: collapse; }}
|
||||||
|
td {{ padding: .25rem 1.5rem .25rem 0; }}
|
||||||
|
.bar {{ background: #333; border-radius: 4px; overflow: hidden; width: 300px; height: 14px; }}
|
||||||
|
.fill {{ background: #4caf50; height: 100%; }}
|
||||||
|
.err {{ color: #f66; }}
|
||||||
|
</style></head><body>
|
||||||
|
<h1>Photo library stats</h1>
|
||||||
|
<p>Path: {ROOT}</p>
|
||||||
|
<p>Status: <b>{s['status']}</b></p>
|
||||||
|
{progress_html}
|
||||||
|
{error_html}
|
||||||
|
<table>
|
||||||
|
<tr><td>Total files</td><td>{s['total_files']}</td></tr>
|
||||||
|
<tr><td>Total size</td><td>{human_size(s['total_size'])} ({s['total_size']} bytes)</td></tr>
|
||||||
|
<tr><td>Files newer than 2025-01-01</td><td>{s['recent_files']}</td></tr>
|
||||||
|
<tr><td>Size of files newer than 2025-01-01</td><td>{human_size(s['recent_size'])} ({s['recent_size']} bytes)</td></tr>
|
||||||
|
<tr><td>Last scan started</td><td>{s['started_at'] or '-'}</td></tr>
|
||||||
|
<tr><td>Last scan finished</td><td>{s['finished_at'] or '-'}</td></tr>
|
||||||
|
</table>
|
||||||
|
</body></html>"""
|
||||||
|
|
||||||
|
|
||||||
|
def write_output():
|
||||||
|
with state_lock:
|
||||||
|
s = dict(state)
|
||||||
|
html = render_html(s)
|
||||||
|
|
||||||
|
tmp = os.path.join(OUT_DIR, "index.html.tmp")
|
||||||
|
with open(tmp, "w") as f:
|
||||||
|
f.write(html)
|
||||||
|
os.replace(tmp, os.path.join(OUT_DIR, "index.html"))
|
||||||
|
|
||||||
|
tmp = os.path.join(OUT_DIR, "stats.json.tmp")
|
||||||
|
with open(tmp, "w") as f:
|
||||||
|
json.dump(s, f, indent=2)
|
||||||
|
os.replace(tmp, os.path.join(OUT_DIR, "stats.json"))
|
||||||
|
|
||||||
|
|
||||||
|
def scan_once():
|
||||||
|
with state_lock:
|
||||||
|
state.update(status="counting", started_at=datetime.now(timezone.utc).isoformat(),
|
||||||
|
finished_at=None, error=None, processed=0, total=0, percent=0.0)
|
||||||
|
write_output()
|
||||||
|
|
||||||
|
total = 0
|
||||||
|
try:
|
||||||
|
for _dirpath, _dirs, files in os.walk(ROOT):
|
||||||
|
total += len(files)
|
||||||
|
except OSError as e:
|
||||||
|
with state_lock:
|
||||||
|
state.update(status="error", error=str(e))
|
||||||
|
write_output()
|
||||||
|
return
|
||||||
|
|
||||||
|
with state_lock:
|
||||||
|
state.update(total=total, status="scanning")
|
||||||
|
write_output()
|
||||||
|
|
||||||
|
processed = 0
|
||||||
|
total_files = 0
|
||||||
|
total_size = 0
|
||||||
|
recent_files = 0
|
||||||
|
recent_size = 0
|
||||||
|
last_write = time.time()
|
||||||
|
|
||||||
|
try:
|
||||||
|
for dirpath, _dirs, files in os.walk(ROOT):
|
||||||
|
for name in files:
|
||||||
|
fp = os.path.join(dirpath, name)
|
||||||
|
processed += 1
|
||||||
|
try:
|
||||||
|
st = os.stat(fp)
|
||||||
|
except OSError:
|
||||||
|
continue
|
||||||
|
total_files += 1
|
||||||
|
total_size += st.st_size
|
||||||
|
if st.st_mtime >= CUTOFF:
|
||||||
|
recent_files += 1
|
||||||
|
recent_size += st.st_size
|
||||||
|
|
||||||
|
now = time.time()
|
||||||
|
if now - last_write > 2:
|
||||||
|
with state_lock:
|
||||||
|
state.update(
|
||||||
|
processed=processed, total_files=total_files,
|
||||||
|
total_size=total_size, recent_files=recent_files,
|
||||||
|
recent_size=recent_size,
|
||||||
|
percent=(processed / total * 100) if total else 100.0,
|
||||||
|
)
|
||||||
|
write_output()
|
||||||
|
last_write = now
|
||||||
|
except OSError as e:
|
||||||
|
with state_lock:
|
||||||
|
state.update(status="error", error=str(e))
|
||||||
|
write_output()
|
||||||
|
return
|
||||||
|
|
||||||
|
with state_lock:
|
||||||
|
state.update(
|
||||||
|
processed=processed, total_files=total_files, total_size=total_size,
|
||||||
|
recent_files=recent_files, recent_size=recent_size, percent=100.0,
|
||||||
|
status="done", finished_at=datetime.now(timezone.utc).isoformat(),
|
||||||
|
)
|
||||||
|
write_output()
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
os.makedirs(OUT_DIR, exist_ok=True)
|
||||||
|
write_output()
|
||||||
|
while True:
|
||||||
|
scan_once()
|
||||||
|
time.sleep(RESCAN_INTERVAL_SECONDS)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -0,0 +1,99 @@
|
|||||||
|
apiVersion: helm.toolkit.fluxcd.io/v2
|
||||||
|
kind: HelmRelease
|
||||||
|
metadata:
|
||||||
|
name: photo-stats
|
||||||
|
namespace: photo-stats
|
||||||
|
spec:
|
||||||
|
interval: 30m
|
||||||
|
chartRef:
|
||||||
|
kind: OCIRepository
|
||||||
|
name: photo-stats
|
||||||
|
driftDetection:
|
||||||
|
mode: enabled
|
||||||
|
values:
|
||||||
|
controllers:
|
||||||
|
app:
|
||||||
|
containers:
|
||||||
|
# walks the immich library over NFS (read-only) and periodically
|
||||||
|
# writes index.html/stats.json into the shared "www" volume; the
|
||||||
|
# "web" container just serves whatever is currently on disk there.
|
||||||
|
scanner:
|
||||||
|
image:
|
||||||
|
repository: python
|
||||||
|
tag: 3.13-alpine
|
||||||
|
command:
|
||||||
|
- python3
|
||||||
|
- /app/scan.py
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
cpu: 50m
|
||||||
|
memory: 64Mi
|
||||||
|
limits:
|
||||||
|
memory: 256Mi
|
||||||
|
web:
|
||||||
|
image:
|
||||||
|
repository: nginx
|
||||||
|
tag: 1.27-alpine
|
||||||
|
probes:
|
||||||
|
liveness:
|
||||||
|
enabled: true
|
||||||
|
readiness:
|
||||||
|
enabled: true
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
cpu: 10m
|
||||||
|
memory: 16Mi
|
||||||
|
limits:
|
||||||
|
memory: 64Mi
|
||||||
|
|
||||||
|
service:
|
||||||
|
app:
|
||||||
|
controller: app
|
||||||
|
ports:
|
||||||
|
http:
|
||||||
|
port: 80
|
||||||
|
|
||||||
|
ingress:
|
||||||
|
app:
|
||||||
|
className: traefik
|
||||||
|
annotations:
|
||||||
|
cert-manager.io/cluster-issuer: letsencrypt-prod
|
||||||
|
hosts:
|
||||||
|
- host: stats.photo.aggtaa.com
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
service:
|
||||||
|
identifier: app
|
||||||
|
port: http
|
||||||
|
tls:
|
||||||
|
- secretName: photo-stats-tls
|
||||||
|
hosts:
|
||||||
|
- stats.photo.aggtaa.com
|
||||||
|
|
||||||
|
persistence:
|
||||||
|
script:
|
||||||
|
type: configMap
|
||||||
|
name: photo-stats-script
|
||||||
|
advancedMounts:
|
||||||
|
app:
|
||||||
|
scanner:
|
||||||
|
- path: /app/scan.py
|
||||||
|
subPath: scan.py
|
||||||
|
readOnly: true
|
||||||
|
data:
|
||||||
|
type: persistentVolumeClaim
|
||||||
|
existingClaim: photo-stats-nas1-sdb2
|
||||||
|
advancedMounts:
|
||||||
|
app:
|
||||||
|
scanner:
|
||||||
|
- path: /mnt/sdb2
|
||||||
|
readOnly: true
|
||||||
|
www:
|
||||||
|
type: emptyDir
|
||||||
|
advancedMounts:
|
||||||
|
app:
|
||||||
|
scanner:
|
||||||
|
- path: /www
|
||||||
|
web:
|
||||||
|
- path: /usr/share/nginx/html
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
apiVersion: source.toolkit.fluxcd.io/v1
|
||||||
|
kind: OCIRepository
|
||||||
|
metadata:
|
||||||
|
name: photo-stats
|
||||||
|
namespace: photo-stats
|
||||||
|
spec:
|
||||||
|
interval: 1h
|
||||||
|
url: oci://ghcr.io/bjw-s-labs/helm/app-template
|
||||||
|
ref:
|
||||||
|
tag: "5.0.1"
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||||
|
kind: Kustomization
|
||||||
|
resources:
|
||||||
|
- helmrepository.yaml
|
||||||
|
- configmap.yaml
|
||||||
|
- pv-pvc-data.yaml
|
||||||
|
- helmrelease.yaml
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: PersistentVolume
|
||||||
|
metadata:
|
||||||
|
name: photo-stats-nas1-sdb2-nfs
|
||||||
|
spec:
|
||||||
|
capacity:
|
||||||
|
storage: 1Ti
|
||||||
|
accessModes:
|
||||||
|
- ReadOnlyMany
|
||||||
|
persistentVolumeReclaimPolicy: Retain
|
||||||
|
storageClassName: ""
|
||||||
|
mountOptions:
|
||||||
|
- nfsvers=3
|
||||||
|
- nolock
|
||||||
|
nfs:
|
||||||
|
server: 10.0.64.80
|
||||||
|
path: /mnt/sdb2
|
||||||
|
readOnly: true
|
||||||
|
claimRef:
|
||||||
|
namespace: photo-stats
|
||||||
|
name: photo-stats-nas1-sdb2
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
metadata:
|
||||||
|
name: photo-stats-nas1-sdb2
|
||||||
|
namespace: photo-stats
|
||||||
|
annotations:
|
||||||
|
helm.sh/resource-policy: keep
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- ReadOnlyMany
|
||||||
|
storageClassName: ""
|
||||||
|
volumeName: photo-stats-nas1-sdb2-nfs
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: 1Ti
|
||||||
@@ -4,20 +4,20 @@ metadata:
|
|||||||
name: vaultwarden-secrets
|
name: vaultwarden-secrets
|
||||||
namespace: vaultwarden
|
namespace: vaultwarden
|
||||||
stringData:
|
stringData:
|
||||||
#ENC[AES256_GCM,data:THltq/7KwEpBVrMJE80mXlC1UWLjsSqCVtvXwSQ20vMjAApSmNDw/J322/LTnKwDYFFtSZ/lMqCZ,iv:igZroXjPGz9IS7tzuwAH884WtTusLgT68eztm4fz39c=,tag:cJvJ3jePkp9/tfODydIgDw==,type:comment]
|
#ENC[AES256_GCM,data:Sq8wdrLjTEEPS6LsHKOd4M5lR2PBigCpEmLmMpCT+gFtlCanrJOssot3d11RZB4BvJj6SUHA1p18,iv:RSFf74+IUVendOHVlLmzRWDLNNpCs9eQ6K0PsZhsQ1M=,tag:4WSvmiH8X/T8cKLWHA4YJg==,type:comment]
|
||||||
ADMIN_TOKEN: ENC[AES256_GCM,data:xjN/8MSKGnqVyYxvV6s5bxbhXAa0pXpA03Km1U2YuGAHHfdIOlF/MsWCRY2zVS0WvvCBoSPmEiulooRIgZ2eGBgz44BX809PWqeAfptN2vcQbyYBuV+weynTgpkLieZs3OT8PqJHvMICbqazy3wrSlyI0otF/g==,iv:sJVNE2pYT7d51arI9P+MvgP83IjbIWEX+cETdOBm3/c=,tag:/D6KoCt0qipwYD1zc3E84Q==,type:str]
|
ADMIN_TOKEN: ENC[AES256_GCM,data:Eu4b2jiDLdmSFCFbVyCaRAVisQ1jH2UON/AfG5aaycxXww/DPrK3CiWyEQV7xDrFpArlFjFVXOvahUYC91qNhSrGbXKfma4cT9H1s5GSLGy4+P4vWineD8dStiKkk6tOACBnq4/xU7dyPp8NuEs1E4TO8Nifiw==,iv:Emka0B/dUAWu/GSWAy6oERLEhcMW7EpYVxb5FsGU7GY=,tag:7fSiet1SNKSjJquRiee8Xw==,type:str]
|
||||||
sops:
|
sops:
|
||||||
age:
|
age:
|
||||||
- recipient: age109zta6l0cwpkxn5wek82kvauxn6yqrq80rsz4mvu5atdnpcn9pusuvnqk5
|
- recipient: age109zta6l0cwpkxn5wek82kvauxn6yqrq80rsz4mvu5atdnpcn9pusuvnqk5
|
||||||
enc: |
|
enc: |
|
||||||
-----BEGIN AGE ENCRYPTED FILE-----
|
-----BEGIN AGE ENCRYPTED FILE-----
|
||||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBIaC80UTlBWWlicGF5alBU
|
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA5WDNZazF0ZGRyZldjTTU0
|
||||||
MjNDcEl0OEVXd3RhREw2Q2Joa2d1R0tIN0JNCm5qSHo2N2NoangxeTl4N0lTMjJv
|
UXVIcFF6K1MxeFptV1psVUMxSU5LbVZ5em04CnA5VVQvcUQ5a1k1Q3daUXZMNFVI
|
||||||
bzhrVjZPUm9saWhvcHNvKzdQdHk5clkKLS0tIHUrVExLYVp3S0thazc1S0U1Y1VW
|
YjhONGkraDljSGZMUi95RXhlK3cvWUkKLS0tIG1pS0M4WUh0elJ3dThjVzFBcExZ
|
||||||
K2MxT0Z3RnpOT2JFYzZmTTEzR3hsdzQKnl8slZroL9NgbSSn/sYxSMKpdZ2WRz01
|
U21MZlNteis2d1laY05HdW0zZEFuekUKpy3Mh/EQOly2oR0iR2HDvTWKUp1Buwo3
|
||||||
fdoK+VZvYlxEG43RxdelBu/SGmeU/V56sUmoaL7t9tKaLMyja8IbGQ==
|
6LuGvEW1/j63fAK6QUR8TaBIUYemSS0pktg9rM0dN9cRaj2LhEwKFA==
|
||||||
-----END AGE ENCRYPTED FILE-----
|
-----END AGE ENCRYPTED FILE-----
|
||||||
lastmodified: "2026-08-26T10:26:55Z"
|
lastmodified: "2026-08-26T10:27:04Z"
|
||||||
mac: ENC[AES256_GCM,data:ZJjrZdL9HGmaM6a/iZCLKrnlRb28YlDbtlQB2WcMIbUtwXiY+CuvKWwCYPrvmzat/Vw/OHGOIJgkSc02BEguR+BzEk4jV0gAQbeWYJkl5uhRK8SRYE3dsC6nodKm7njIPJZOC5W2z/+U5DiWMJrP1dkt7L6DRWJg3wrtcVXv8D8=,iv:LLOAdQAw7pVeuoB8R4KpQmb3LakBNiq8NZvAHgKRo0I=,tag:MNMcmV1svsN5xa9nJ/HQFA==,type:str]
|
mac: ENC[AES256_GCM,data:lNONeW13K6Tj4qp7hbfn3HziZa/zHh27P/BjdUjgiUEXtEjAaZLhz0tSKf0b4vKqk9Bigw8MscjVdhQUHRF9/eNNg+Nb/s6P3IchKMYRspKX4pbxx9c9Owgg7s/6d43D1xiKf+QstLZdJ0T2T5TF98WPNuwiVe1gSQEKgrgGY7w=,iv:lBHZ+DNVQjL9RASkH41/2RF7aTfYBTbLDihYBG05fBo=,tag:K40FzebWm36wrku0o38aOg==,type:str]
|
||||||
encrypted_regex: ^(data|stringData)$
|
encrypted_regex: ^(data|stringData)$
|
||||||
version: 3.11.0
|
version: 3.11.0
|
||||||
|
|||||||
@@ -4,20 +4,20 @@ metadata:
|
|||||||
name: webdav-secrets
|
name: webdav-secrets
|
||||||
namespace: webdav
|
namespace: webdav
|
||||||
stringData:
|
stringData:
|
||||||
WEBDAV_USERNAME: ENC[AES256_GCM,data:UfbWqs4=,iv:xkkVtgClX0vVFi8B8+yx5gGRZ23SaLXAG8a1qJRxrGI=,tag:SygijCFPSRsaOJ7i0/pXrw==,type:str]
|
WEBDAV_USERNAME: ENC[AES256_GCM,data:W90Dfoo=,iv:vmkJMPaVJ1T+xUaFVsIhTqXJC0rD/1EV8ofCujkyeEM=,tag:V27OH9FGCYGs3HH7pBlSCg==,type:str]
|
||||||
WEBDAV_PASSWORD: ENC[AES256_GCM,data:HyseceanaRGCybMgdRyDNUbYbTLShnu8Wn5Y/LoOjNUhXa8IWSzfPEp02nSZdY6Q,iv:VXcD47n70Ghu5rzfANUpADGfjv7CUdKc00JzNI7VOr0=,tag:bM7hkjxxmrX+690d/DCpKA==,type:str]
|
WEBDAV_PASSWORD: ENC[AES256_GCM,data:St7zfrWnJ2b74BcgnTCYYhFhLlMMYUOjDcxSw6vNrUbrsjh4n2XLib+xc9B7CHhP,iv:P7efLNC08AK/DDzyePyGhl8X+b0WuC9RtyvIrm6pIts=,tag:4iEAfvT+Qd0HC7a2f9V3Qg==,type:str]
|
||||||
sops:
|
sops:
|
||||||
age:
|
age:
|
||||||
- recipient: age1y8t9v56yuvskznddqfsd4yddzzch0yf2dutvvt8rrx6rjh5f9g0s3qeays
|
- recipient: age1y8t9v56yuvskznddqfsd4yddzzch0yf2dutvvt8rrx6rjh5f9g0s3qeays
|
||||||
enc: |
|
enc: |
|
||||||
-----BEGIN AGE ENCRYPTED FILE-----
|
-----BEGIN AGE ENCRYPTED FILE-----
|
||||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBvV2lEZlZmLzl0OXZFWEdP
|
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSByNkJKdWQ1V09vZWU1ZHY2
|
||||||
V0grT20ybGFIVE1aRFREME9sYW4rNlcvZzBVCkpkK2EwNHgyOGo2S3VwK1JCMlYw
|
MGwraExVNWhlMml1R2pLR2NvZ2orNVc2K3d3CkRLd0ZaWmh6OUVKVk9EbGZJUTlQ
|
||||||
RzFTcENHMzVSa0t4N3VUZUhxZk0vbG8KLS0tIDIvdjM0aERnTmdXRmF1Ni9UbTFw
|
V04rOHhaWXVES2pEOFhJU2ZjbG5MMFkKLS0tIFpLVGU1K0diTTZFVThmVU1xQjlH
|
||||||
WEFBSnd0TFJVUEU4S2R3WTZPR0cwSG8K9lfv1pMSlEc6Ik8B6eVcdUHMVrUkNtBm
|
S1VBTDVRNmpCMXVodEVYRDRlS0lTMkUKz+pTnHz8umsDh943JDdyyisUsFHlZKQQ
|
||||||
EisBk5UttT8PoEw7jKw4OmkWyG9PKhuGj6EGI18saujICUinBFIHJw==
|
a8qLtzb6JoJQaUANNLgi70tb2JoXDTLm7N5l2f84HG4F5aEPJxUN6A==
|
||||||
-----END AGE ENCRYPTED FILE-----
|
-----END AGE ENCRYPTED FILE-----
|
||||||
lastmodified: "2026-08-26T10:26:56Z"
|
lastmodified: "2026-08-26T10:27:04Z"
|
||||||
mac: ENC[AES256_GCM,data:FScG+0XDcgAezvwjNX//zuYjKTCy5ABAE/xrINKaGAF2ntKeIo3234DnF8VoAyLC+/9bQZfYV2+AE6YbJifrGFjMtjcvIYsMpM5N/QdQNKOzyfs45w/4kbbmdQhqCfcTDMu5/CitE6lSmkYRvJG0+ck0thxc+OX2wSaBIOciCNA=,iv:f62kG5AUL9PMH9jjbAbespMGt0vknuddgXXO+V27yos=,tag:yA931FYuj+IWKDumqM9lZg==,type:str]
|
mac: ENC[AES256_GCM,data:vjB7JuakuH6ns8CA/QXKwwxqGe+5jSNP1xTF5rSeoXJbd93SibyLXMCLIE3Lm6ijAeVm6nZItplBf2Ol2zB9AHy3KRVgfrdaTHFVZxV6Z5PFLfROLJ2yseljEP8ysEADRggPPPwdzf2hWDOer7bp5bSrMsC0epZ6osgDYG0960I=,iv:oX6lgHXDPXJkPX+b1T+7LL4G6BCdX0D6qVNwHsl+xJg=,tag:2GGp+6Hgx6BRFfjITZnZEA==,type:str]
|
||||||
encrypted_regex: ^(data|stringData)$
|
encrypted_regex: ^(data|stringData)$
|
||||||
version: 3.11.0
|
version: 3.11.0
|
||||||
|
|||||||
@@ -4,19 +4,19 @@ metadata:
|
|||||||
name: zigbee2mqtt-secrets
|
name: zigbee2mqtt-secrets
|
||||||
namespace: zigbee2mqtt
|
namespace: zigbee2mqtt
|
||||||
stringData:
|
stringData:
|
||||||
secret.yaml: ENC[AES256_GCM,data:WEWYDE2qxId6BBcq24tTRRg8myNsAagHQDF1J3/6RCedrue/io1MLXDTGAgTcSuMrVb8cKDcMQI8g5dRBz0VAF88+eYLj52aFOJ3FrOWePxPGAYbtiV30O0tU2lIsxjwR5VyIdtifpJLTH5AHFFe7S+mhGQPuEkbFaBfYRY=,iv:Qg7UALLLFsDXx56r0jbpOVXa8F9YJ9ZZSIIUaAkjI0Y=,tag:EJ4YlXWxOwPddGVmxD75IQ==,type:str]
|
secret.yaml: ENC[AES256_GCM,data:Jzp4iCtmc/HxpCujnlmDZ1uQ09wc2ayg9y60uhpcbSbUs21ROxaOeN1TMzkiAlGXfSUz8fCy88SPDezGw42CY5eJ8bJCkPpGFTPo0h7F7LNr5Fvywl5Vr/IB8gcdntucCutRmo8TZThfw71vCQzoD+RvvUt/DZIJN7BiCbk=,iv:55jEHYOCU3IoeI2tJixzz9UEVnifqCuMFwE5IYaMPTQ=,tag:+Fy5b3xyEpH9Ozgz6TuQIg==,type:str]
|
||||||
sops:
|
sops:
|
||||||
age:
|
age:
|
||||||
- recipient: age1tu4xgfefvgdda0vn2thaqndq4p9tuydq2ud6qa98tzzgnff6749qnlcx29
|
- recipient: age1tu4xgfefvgdda0vn2thaqndq4p9tuydq2ud6qa98tzzgnff6749qnlcx29
|
||||||
enc: |
|
enc: |
|
||||||
-----BEGIN AGE ENCRYPTED FILE-----
|
-----BEGIN AGE ENCRYPTED FILE-----
|
||||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAycVhXTTh6VTNHQk1OWGps
|
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBickZDaFNjSlkxOXk5STRo
|
||||||
KzRsb0RMYkdrcHN4OHRkN1g2YlM1SzJrckFVCnZHYVA2L2x3Vkpvc3NRNkFjbnJj
|
ZGpCMWxPbkJCVkhuaWRqdTl3b2g3dU5NZXprCi9xbzAvci96eEpnaDJLeG1mQWFz
|
||||||
RUJOQjhXV2dEQitjWGdZenQwUUZ4Wm8KLS0tIG1IQ2ZPT1NjWUU2OGhXL2o0MGlx
|
SzJLeHZQc05KenpPOWNqQ3VUOUJoLzQKLS0tIFo2VTB1RGQxR0doYktSM3I1YWM0
|
||||||
V1ZxQkZLZVo3N0owRURVaGI0eTFOVzQKrMDV4gJ5sT1AqTyY1F1QbK3HXPukIVhL
|
b01IQUM0NzFacUs1aVBYb2VPUjducGcKYnBZVphRgyKJWIMpmpFTGl1cpUJ/DoU4
|
||||||
BsQaGEO1SqopOYkYgeDqT6Cbb/L3nkgDoE0VcIsdU4G1U2cNaaU3gQ==
|
8LdC7Aa0xWiIORjeHopeWFeOYTNaCkBWZ303LTAjS6vhh+MsMgcCcQ==
|
||||||
-----END AGE ENCRYPTED FILE-----
|
-----END AGE ENCRYPTED FILE-----
|
||||||
lastmodified: "2026-08-26T10:26:57Z"
|
lastmodified: "2026-08-26T10:27:05Z"
|
||||||
mac: ENC[AES256_GCM,data:/AtpxHBsfW57Y3ubiMyGpu8Pu0hHa9MokVUAedC2gsemfa2K9cD/G4QYbENSFf9nQ8ryiZDGCOVEeney4lLHKnxPKpzffekQMNc7crkIQwo/5nJuHiQeauMWBYowFTE3ToU2jRMxZ9T8CGpKRfzO6SWxrpC+brmbrlEz8QYRZWE=,iv:3F7R13u3/sKEEuO5gOr5M8tgL7mPohqSVgu5MBgTGL4=,tag:k3gS/EscAoXSRHImm2K7dw==,type:str]
|
mac: ENC[AES256_GCM,data:GVIA/B4iQ507OH35gUKsxQb8IDwhuvnPsgUHz3yp9r/lWKiC7344wdJEXceAYxRfw5SJ29KrRmzlqYURWYd4GFc/6MVkt5lAC9yCvfuphcbSg5Ei6oVhsgsrj6HAgilhecyO824Cw33wOUQa0eOH+mKC1rN4xfAM0NbDCiQY2dY=,iv:Zq9PZTEdcf4fG+bhAbhThPovSlEHqlJW5azvyVEkU+g=,tag:Bb7oC5V9HGI+8fs9XNXGMg==,type:str]
|
||||||
encrypted_regex: ^(data|stringData)$
|
encrypted_regex: ^(data|stringData)$
|
||||||
version: 3.11.0
|
version: 3.11.0
|
||||||
|
|||||||
@@ -4,21 +4,21 @@ metadata:
|
|||||||
name: longhorn-backup-target-secret
|
name: longhorn-backup-target-secret
|
||||||
namespace: longhorn-system
|
namespace: longhorn-system
|
||||||
stringData:
|
stringData:
|
||||||
AWS_ACCESS_KEY_ID: ENC[AES256_GCM,data:kAxayQHJJlYP5P/Qg3bfGARO3ws=,iv:QxmY1tJcPER6bNZvtTBjQyCWPdEKroJxBqFaD89B0nE=,tag:7OfX60UbPIrML0nQwlantw==,type:str]
|
AWS_ACCESS_KEY_ID: ENC[AES256_GCM,data:ZPHzn70fTTlktcXJTm2CaNhMmiQ=,iv:yyJPkdGZqY25UVcKs3rL+CobBSjUVb4pq71FA+Sh7X0=,tag:rKH6QWJoZUxZc3/iel/Yyw==,type:str]
|
||||||
AWS_SECRET_ACCESS_KEY: ENC[AES256_GCM,data:GCLL628VnGXtnSQ/GMzum0Tlob5aoUo4nZuRYgfy8Pdu/AMlvYFhng==,iv:lFhwXvj4D+se6dMhBAF66Bku5RNUa9Un4vNo3ARTK8Q=,tag:E4uq78IJYRT/1EZwb2e2Aw==,type:str]
|
AWS_SECRET_ACCESS_KEY: ENC[AES256_GCM,data:2uiWufb57rx191+S472IZzDer0g0VNWUR3Ol9xqIl7FUzaq48dPzLQ==,iv:KTdxvcIbyuuXkNp+SD4cX3g35iYzUltf1V4TKGH6Z7I=,tag:sxsCUE59rNpovGK+ocrNUw==,type:str]
|
||||||
AWS_ENDPOINTS: ENC[AES256_GCM,data:8cVRBo/eKO5AGSYRLnCAyTRG0uqIx5vRqlJEyUHfbc1OuP2Irj+GHP3uM6RjiJUXUWkJ51S90Rrt7nvlQg==,iv:zzmzHqhi//+/n7A68h0qRukeLtJ3tDFBlghSxR6rsJo=,tag:kVsEEFpo5d88J0HaJoslmQ==,type:str]
|
AWS_ENDPOINTS: ENC[AES256_GCM,data:YDF01AWElo0avLZ57q5Qqh0Rxkk2Xl6AzaqG4k5KKkZdth1LHRJ1pxW3zYLl8AyrOaKAXQvlciu++V/sgg==,iv:Dq7adJVsg8Vjrr2bAP67pWUKRtIay9s9DcEUzY3LOlA=,tag:TxAiHorV/AavZgqP7z4XvQ==,type:str]
|
||||||
sops:
|
sops:
|
||||||
age:
|
age:
|
||||||
- recipient: age18hhmdmupj90zjgjpxk3z5cf3lx36hcznnmqsp0fpyg50823pudrqjupydt
|
- recipient: age18hhmdmupj90zjgjpxk3z5cf3lx36hcznnmqsp0fpyg50823pudrqjupydt
|
||||||
enc: |
|
enc: |
|
||||||
-----BEGIN AGE ENCRYPTED FILE-----
|
-----BEGIN AGE ENCRYPTED FILE-----
|
||||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSArdUlwTVQwa0ZzWEdUUXZk
|
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBLREttNm9CdnpPOTI0OGlK
|
||||||
T1RGNFJiOWFpVnA5emNMQS9mZTc1cjBwckZBCjNac09XNnV2ZFRKQkNkV1dIWEg3
|
Qkc3aDZmZkJMcnpyQ0FvdjBXSmNEMHRPWWdjCnRPQmdURFpJbGF6ck5GekQzTXRi
|
||||||
TmFKT3RDcFptSmh4VXgxVVZ1ODNkS2sKLS0tIEJPT3Nxd3hCbjg1QzRwTTFYckQz
|
YlBZZFZNZFB5SXROUjh1N2x3UUt5UzQKLS0tIHplUk14VkNKQTBMbUN2RTQ5Zlp5
|
||||||
SU5CYXFNdklpSktoREZLZC96UHl5czAKEqV76PrD+6whVKJH8XyIac6emtqIrbX0
|
YmE5aXIvcTAxdDVRa2FrejI4QUs4NFEKOcys+MuoW+pKiyb+JLJ64IvTnbVvXppd
|
||||||
k251UN0K0tidSFZ7bz8iRK5I2Fh1LzNpq+XomBh12AjXgJktjDZ0Zg==
|
DVZpYPxi3+BLOY18Vi0FuVwm0bY6gHrdWRu4bphS7Q10cHT6hasa8Q==
|
||||||
-----END AGE ENCRYPTED FILE-----
|
-----END AGE ENCRYPTED FILE-----
|
||||||
lastmodified: "2026-08-26T10:26:57Z"
|
lastmodified: "2026-08-26T10:27:06Z"
|
||||||
mac: ENC[AES256_GCM,data:II69xHd5Ay2MNqgkTKckoubQiIz+WrwBQpaL5KWflq04tTClF0VaEWj6j4qKEE5lfLpv7p3O4cC9UYkh/otsNJIRMCPh7ixOPc8x7wd9ceF7Tmea3LbwTMsYvJPlowDivYzfFmIoF8tA2c/HRdOT8gdKP0jCcka3BBcSyTl2aQs=,iv:RT/MHeJsUCm+hwFoVYWfzGLwtif5p9uVeDTHwpyo/aE=,tag:xlIXKHJfmLUsZczoVTn19A==,type:str]
|
mac: ENC[AES256_GCM,data:cAfmtVpmtm6830kPK/a8YA4XN5acVZ26u3SezNZ3bEG1wtwLM+aoclj9HWU9MaevdF6Pa0rfD6/vme6sqamjPaNa6BBufRBNwzgUB04yQTNyV2BbJ5oHH9uh6DfQPxIjFBok5Kc6upA5NjSOC9UZZLtjmSB74Ykkerdc1BGM5k4=,iv:Nq5BhphQQG4RUfgyZ5jmvCGa4sIjB4/VzWOw7i7WJuM=,tag:vMW5ZqXYocdw0zF4bducjw==,type:str]
|
||||||
encrypted_regex: ^(data|stringData)$
|
encrypted_regex: ^(data|stringData)$
|
||||||
version: 3.11.0
|
version: 3.11.0
|
||||||
|
|||||||
@@ -4,24 +4,24 @@ metadata:
|
|||||||
name: s3-backup-proxy-secrets
|
name: s3-backup-proxy-secrets
|
||||||
namespace: longhorn-system
|
namespace: longhorn-system
|
||||||
stringData:
|
stringData:
|
||||||
WASABI_ACCESS_KEY_ID: ENC[AES256_GCM,data:xTKTVs40ee+2LZhF8dRKJ6yH/6M=,iv:hCG/KpY5o4LFbCMv3XOc/XatoFsw2bCfCR3oZvGktro=,tag:19i0oHwqkK+KTv11C4n4Lg==,type:str]
|
WASABI_ACCESS_KEY_ID: ENC[AES256_GCM,data:/bXM9lcWza6rogcwSaC8p1RaEoU=,iv:s3MQ/fLRW1EwjEt7p+j6YWqI5fVTG59LkmhQHRrphO4=,tag:pzb2PzuNgw/X6mqBcwoozA==,type:str]
|
||||||
WASABI_SECRET_ACCESS_KEY: ENC[AES256_GCM,data:L/aDOLvyP59VhJO/G/nhnKKun2D18cFZ7plXZz/h53GbxN8OEjeT9Q==,iv:THEkt4TWzeaRszSaZDHIjheUOqKQD/PREiztay72+ls=,tag:eRfCi38J0lnKl2IF2zW+Iw==,type:str]
|
WASABI_SECRET_ACCESS_KEY: ENC[AES256_GCM,data:vCIW9VIlFO1o6bj6jx9CCCfTAkY5bcLRMuODqCaJ+KQCknuFq5N+xQ==,iv:vsPw9o6AV5CrDRh23VsNCZmOHyjtjXDyJbl+aeBB1ow=,tag:1BMEZlDmzftGvHHc/r/Yrw==,type:str]
|
||||||
CRYPT_PASSWORD: ENC[AES256_GCM,data:xISIVuxj/gjfqtB/cSOKXSyUVDu4vISSXNg76yTl913Hf+coVAs+GfIx6w==,iv:nCnsDVADWodWE7lsm/rBGpMQ4FwIOFHTwCWRhZfVt8c=,tag:QCfigqI+NgsOk5O7jhf/yA==,type:str]
|
CRYPT_PASSWORD: ENC[AES256_GCM,data:Q7MOvwhYu0WgqGDYpiXWjSRKcBhjAlUM5J3fk7Sl/e4ALnyryIsjutcQDA==,iv:y6GZ6ZacJMrOryJnxrrJ9ePYm+qAQqZSo1h34OKWu/w=,tag:9JMNmz+A8k09zE1Vo3euGA==,type:str]
|
||||||
CRYPT_PASSWORD2: ENC[AES256_GCM,data:KfBNxWZF4nS+s9uH0NEk/kJaFxQA/v1qZFEbYalkLFv1kttU2YK63PADkw==,iv:up46WBg3cPXS6LNFbLQoSNHGB/4Bnp4Aa4iw9HB+9h4=,tag:hy0K4ZNJtrO44Ann9Aebzw==,type:str]
|
CRYPT_PASSWORD2: ENC[AES256_GCM,data:lKu2fN0w3BLOl1Y8psY4bJzBCtYffAggQwfbe+StkIGOImuURpZJm0nopw==,iv:azU3sCSDYeahWlEuU+Hywr8H4Mz2TvBm6WQQCMsDxhM=,tag:dFLCtyG5IDhaV4jqBwhVeA==,type:str]
|
||||||
PROXY_ACCESS_KEY: ENC[AES256_GCM,data:xW5LowuU7UlMaG1XSujzrIpDpAo=,iv:kBEJQu/iyLwr33+A+1OM50HNLbqPP5Ct+aR3FMn4TA4=,tag:JaLBdAWdGehW/RKj8AyA4w==,type:str]
|
PROXY_ACCESS_KEY: ENC[AES256_GCM,data:WiY9BE78eEAmYGk0DjwE/tnUAsw=,iv:4jKzOOmJ3Dd+Lba7UiRO+F87eqbFDdAVdMbRcwrouRY=,tag:pqReD8mlKSVJ3rEaR3vy9g==,type:str]
|
||||||
PROXY_SECRET_KEY: ENC[AES256_GCM,data:2d9+aY6Y5/P/ylBxSkYhg/om/lHlWn/ATorl5sZThrMisyjY7gFsFg==,iv:k+Ty3ApNWCVv/tQUgC2kF6dIkKE2Hv9ACyPQZ/UM374=,tag:7MuSpoX5dfc0Ws8lvZjc+A==,type:str]
|
PROXY_SECRET_KEY: ENC[AES256_GCM,data:inQxFJqttogy40N5DeU6j1tltQXJuAP3fJ6EGvK/KyyBoQHhAlcg6Q==,iv:orNJvCoXAMiIAqsNZO0m+winQabIwseyE3ICSP/qmJs=,tag:TbyH8Wp9rNpAs6p/zkQMDQ==,type:str]
|
||||||
sops:
|
sops:
|
||||||
age:
|
age:
|
||||||
- recipient: age15vc3geq4lsec69rnxczluvwgcexeqae02zxzjpswsuatthaasu7qzath48
|
- recipient: age15vc3geq4lsec69rnxczluvwgcexeqae02zxzjpswsuatthaasu7qzath48
|
||||||
enc: |
|
enc: |
|
||||||
-----BEGIN AGE ENCRYPTED FILE-----
|
-----BEGIN AGE ENCRYPTED FILE-----
|
||||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBXQ1hUdEt2ZWUweGRqalZq
|
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBTazZZL0YzZ1M0UDdzY1kv
|
||||||
RWNHcVMybFByWU9XUm93R1N2ZzFHQmJLWmtnCldneUJtMCtMUWhLMWRBSng1cjN6
|
K1ByNUY2Ykx6K1d6V1NkZFhqcC9tbC9LOTJNCkpaeW8yN2h4d29iOFNFTWMzWERZ
|
||||||
YzVMajN4a0Y0azFJQzFUclVWclJkM2MKLS0tIEhKQVp6TC96YUl2MGlWREw3bDBn
|
eWROVmZXc2VpSVp1NTdtdTQwa3JDbFUKLS0tIGFIZWcrb3RvdFFmVHBGTllFMVVp
|
||||||
MS9Cc1NVelp4NUt5dlp1TGNtcnY4c2sKrb0mbFyz+d1H6Rz0+uq/mfUgYXB6Vp0W
|
U2pmSUY5TjJpNENHVEQ1WHJxM2h0NFkKBqipEvH05cCrOK2YyrJR4mueigQEHrEd
|
||||||
NZkvuGa25cxB6CFdzenWs/pvf4e7c9qutqCk9h1NjSYJy4NSpHG4CQ==
|
CsgqMvhQeMk12xatTwECjuSFfNd+WzSQBbES86n6A7T50NmXdIYGCw==
|
||||||
-----END AGE ENCRYPTED FILE-----
|
-----END AGE ENCRYPTED FILE-----
|
||||||
lastmodified: "2026-08-26T10:26:58Z"
|
lastmodified: "2026-08-26T10:27:07Z"
|
||||||
mac: ENC[AES256_GCM,data:YBSPMh1sKeHb4DAgdHZsNbSv95gc00p7fONGIa7r7bm55uBDsXzTbVwvEjnkzFJYAqXudlNDcA1dyK+bnpguKUdJb6LuFdQyRgqMvfgOdvtlu3/xZIEYRaALcj4FUs3ITDXn1jCuc8uVBcDTFgui4hve3KjqdeQvSHmzIHCpDvI=,iv:pykF25ERTJ8/AyisBVRUyPdvUNSrFp0ePETB/+lIx5k=,tag:1R68dA8Y0XWAwGG2S//iEg==,type:str]
|
mac: ENC[AES256_GCM,data:+6wq0xuP2mTUwMFmjU6gkj+2bRJgouxM2RK+5z5CFDuizYxSdex1PZt5+aMOElnZbK2QAhOIOWLt1btgSoBPiop6Wo320lxCEGHvcAWk8obDemJHx4cAe9eyKWkD/2pjED72Rh4e+t8kd5obTQuwGE8vSGUi33NDT2hAUXaSBM4=,iv:PZ6HbyoRX5ImXqpQn0GbPsNJjwDnXOab53tgLpvEBMY=,tag:/M8cuXF8+LBRBuonewRaBQ==,type:str]
|
||||||
encrypted_regex: ^(data|stringData)$
|
encrypted_regex: ^(data|stringData)$
|
||||||
version: 3.11.0
|
version: 3.11.0
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Namespace
|
||||||
|
metadata:
|
||||||
|
name: photo-stats
|
||||||
@@ -15,3 +15,4 @@ resources:
|
|||||||
- infcloud.yaml
|
- infcloud.yaml
|
||||||
- syncthing.yaml
|
- syncthing.yaml
|
||||||
- nfs-photo.yaml
|
- nfs-photo.yaml
|
||||||
|
- photo-stats.yaml
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
apiVersion: kustomize.toolkit.fluxcd.io/v1
|
||||||
|
kind: Kustomization
|
||||||
|
metadata:
|
||||||
|
name: photo-stats
|
||||||
|
namespace: flux-system
|
||||||
|
spec:
|
||||||
|
interval: 10m
|
||||||
|
sourceRef:
|
||||||
|
kind: GitRepository
|
||||||
|
name: flux-system
|
||||||
|
path: ./clusters/base/apps/photo-stats
|
||||||
|
prune: true
|
||||||
|
wait: true
|
||||||
|
dependsOn:
|
||||||
|
- name: namespaces
|
||||||
|
- name: infra
|
||||||
|
retryInterval: 5s
|
||||||
@@ -15,3 +15,4 @@ resources:
|
|||||||
- ../../base/namespaces/finance.yaml
|
- ../../base/namespaces/finance.yaml
|
||||||
- ../../base/namespaces/nfs.yaml
|
- ../../base/namespaces/nfs.yaml
|
||||||
- ../../base/namespaces/syncthing.yaml
|
- ../../base/namespaces/syncthing.yaml
|
||||||
|
- ../../base/namespaces/photo-stats.yaml
|
||||||
|
|||||||
Reference in New Issue
Block a user