Add flowtrack period tracker
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
56cad1cfb5
commit
4a5663f795
6 changed files with 63 additions and 2 deletions
|
|
@ -125,6 +125,7 @@ in
|
||||||
./services/code-server.nix
|
./services/code-server.nix
|
||||||
./services/redlib.nix
|
./services/redlib.nix
|
||||||
./services/stardew-tracker.nix
|
./services/stardew-tracker.nix
|
||||||
|
./services/flowtrack.nix
|
||||||
./services/hardware-health.nix
|
./services/hardware-health.nix
|
||||||
./services/wan-watchdog.nix
|
./services/wan-watchdog.nix
|
||||||
./services/deployment.nix
|
./services/deployment.nix
|
||||||
|
|
|
||||||
21
flake.lock
generated
21
flake.lock
generated
|
|
@ -170,6 +170,26 @@
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"flowtrack": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1792309033,
|
||||||
|
"narHash": "sha256-77igZpo8WI7XbLuAgD0HibkgdKao4efvvCjezdMqssQ=",
|
||||||
|
"ref": "refs/heads/main",
|
||||||
|
"rev": "94372c6abc7f93070eddd9d0ac35962a36567309",
|
||||||
|
"revCount": 1,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://forg.gregersen.it/rope/flowtrack"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://forg.gregersen.it/rope/flowtrack"
|
||||||
|
}
|
||||||
|
},
|
||||||
"fromYaml": {
|
"fromYaml": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
|
|
@ -451,6 +471,7 @@
|
||||||
},
|
},
|
||||||
"root": {
|
"root": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
|
"flowtrack": "flowtrack",
|
||||||
"home-manager": "home-manager",
|
"home-manager": "home-manager",
|
||||||
"lanzaboote": "lanzaboote",
|
"lanzaboote": "lanzaboote",
|
||||||
"loupe": "loupe",
|
"loupe": "loupe",
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,11 @@
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
flowtrack = {
|
||||||
|
url = "git+https://forg.gregersen.it/rope/flowtrack";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
|
||||||
stardew-tracker = {
|
stardew-tracker = {
|
||||||
url = "git+https://forg.gregersen.it/rope/stardew-tracker";
|
url = "git+https://forg.gregersen.it/rope/stardew-tracker";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
|
@ -54,6 +59,7 @@
|
||||||
, stylix
|
, stylix
|
||||||
, proton-cachyos-nix
|
, proton-cachyos-nix
|
||||||
, stardew-tracker
|
, stardew-tracker
|
||||||
|
, flowtrack
|
||||||
, ...
|
, ...
|
||||||
} @ inputs:
|
} @ inputs:
|
||||||
let
|
let
|
||||||
|
|
@ -64,6 +70,7 @@
|
||||||
home-manager.nixosModules.home-manager
|
home-manager.nixosModules.home-manager
|
||||||
stylix.nixosModules.stylix
|
stylix.nixosModules.stylix
|
||||||
stardew-tracker.nixosModules.default
|
stardew-tracker.nixosModules.default
|
||||||
|
flowtrack.nixosModules.default
|
||||||
./settings/stylix.nix
|
./settings/stylix.nix
|
||||||
];
|
];
|
||||||
mkHost = hostname: extraModules: nixpkgs.lib.nixosSystem {
|
mkHost = hostname: extraModules: nixpkgs.lib.nixosSystem {
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,8 @@
|
||||||
{ domain = "reddit.nordhammer.it"; policy = "one_factor"; }
|
{ domain = "reddit.nordhammer.it"; policy = "one_factor"; }
|
||||||
{ domain = "panel.nordhammer.it"; policy = "one_factor"; }
|
{ domain = "panel.nordhammer.it"; policy = "one_factor"; }
|
||||||
{ domain = "stardew.nordhammer.it"; policy = "one_factor"; }
|
{ domain = "stardew.nordhammer.it"; policy = "one_factor"; }
|
||||||
|
# Health data: only the two people the app knows about.
|
||||||
|
{ domain = "flowtrack.nordhammer.it"; policy = "one_factor"; subject = [ "user:kayla" "user:fred" ]; }
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -52,8 +54,10 @@
|
||||||
domain = "nordhammer.it";
|
domain = "nordhammer.it";
|
||||||
authelia_url = "https://auth.nordhammer.it";
|
authelia_url = "https://auth.nordhammer.it";
|
||||||
}];
|
}];
|
||||||
expiration = "12h";
|
# Long enough that the home-screen Flowtrack app on a phone does not
|
||||||
inactivity = "2h";
|
# ask for a login every time it opens.
|
||||||
|
expiration = "30d";
|
||||||
|
inactivity = "7d";
|
||||||
};
|
};
|
||||||
|
|
||||||
storage.local.path = "/var/lib/authelia-main/db.sqlite3";
|
storage.local.path = "/var/lib/authelia-main/db.sqlite3";
|
||||||
|
|
|
||||||
21
services/flowtrack.nix
Normal file
21
services/flowtrack.nix
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
# services/flowtrack.nix — Kayla's private period tracker.
|
||||||
|
#
|
||||||
|
# The application and NixOS module live in the standalone flowtrack flake.
|
||||||
|
# nginx is the only public listener and Authelia admits just kayla and fred;
|
||||||
|
# the app maps them to owner and read-only viewer. Nightly snapshots go
|
||||||
|
# straight to the SSD branch of the pool (not via mergerfs), which had the
|
||||||
|
# cleanest SMART record of the data disks.
|
||||||
|
{ config, lib, ... }:
|
||||||
|
{
|
||||||
|
config = lib.mkIf (config.networking.hostName == "FredOS-Mediaserver") {
|
||||||
|
services.flowtrack = {
|
||||||
|
enable = true;
|
||||||
|
port = 8093;
|
||||||
|
editors = [ "kayla" ];
|
||||||
|
viewers = [ "fred" ];
|
||||||
|
backup.directory = "/mnt/disk2/backups/flowtrack";
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.tmpfiles.rules = [ "d /mnt/disk2/backups 0755 root root -" ];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
@ -203,6 +203,13 @@ in
|
||||||
proxy_set_header Remote-Email $email;
|
proxy_set_header Remote-Email $email;
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
# Period tracker. The app trusts Remote-User for roles, so nginx must
|
||||||
|
# always overwrite it with the Authelia identity.
|
||||||
|
"flowtrack.nordhammer.it" = lib.recursiveUpdate (protectedProxy 8093) {
|
||||||
|
locations."/".extraConfig = autheliaAuthConfig + ''
|
||||||
|
proxy_set_header Remote-User $user;
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
# Pelican game panel. Can't turn off its own login (no such option
|
# Pelican game panel. Can't turn off its own login (no such option
|
||||||
# upstream), so Authelia is the outer gate and the Pelican account
|
# upstream), so Authelia is the outer gate and the Pelican account
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue