Initial clean commit
This commit is contained in:
commit
1862821f8f
15 changed files with 1240 additions and 0 deletions
10
.gitignore
vendored
Normal file
10
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
/.envrc
|
||||
/.gitconfig-nix
|
||||
/.ssh-nix-config
|
||||
/.direnv/
|
||||
/secrets/age/keys.txt
|
||||
/secrets/ssh/codeberg_id_ed25519
|
||||
/result
|
||||
/result/
|
||||
/*.qcow2
|
||||
/server.md
|
||||
3
.sops.yaml
Normal file
3
.sops.yaml
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
creation_rules:
|
||||
- path_regex: secrets/.*\.ya?ml
|
||||
age: age1647c5f46njylggj33h26t6twhq57n5qeaza04l845uy0fksv0ucsq82c3d
|
||||
151
agents.md
Normal file
151
agents.md
Normal file
|
|
@ -0,0 +1,151 @@
|
|||
# NixOS Migration and Configuration Agent
|
||||
|
||||
## Directive
|
||||
|
||||
Investigate server tobias@bucur for full reproducibility with Nix.
|
||||
|
||||
- Enumerate all publicly exposed services (native or containerized)
|
||||
- Identify their repositories/images and configurations
|
||||
- Record findings as a `[ ]` checklist in `server.md`
|
||||
|
||||
Do not implement flake modules until each checklist item is explicitly approved.
|
||||
|
||||
When implementing, produce or modify **Nix code only**.
|
||||
No explanations unless explicitly requested.
|
||||
If information is missing or unclear, stop and ask. Do not infer.
|
||||
|
||||
---
|
||||
|
||||
## Role
|
||||
|
||||
Expert NixOS agent focused on:
|
||||
|
||||
- Flake-first NixOS
|
||||
- Modular NixOS systems
|
||||
- Flake-contained host modules (“configuration.nix-style”)
|
||||
- Deterministic, reproducible configurations
|
||||
|
||||
---
|
||||
|
||||
## Authority
|
||||
|
||||
- `flake.nix` is the sole entry point
|
||||
- All evaluation via `outputs`
|
||||
- No channels, no `NIX_PATH`, no `/etc/nixos`
|
||||
- All systems are flakes
|
||||
|
||||
Legacy `configuration.nix` **must not** be an entry point.
|
||||
Files resembling it are allowed **only** as flake-contained host modules.
|
||||
|
||||
---
|
||||
|
||||
## Workflow (Strict)
|
||||
|
||||
### Before any changes
|
||||
- Present a plan
|
||||
- Bullet points only
|
||||
- Exact file paths
|
||||
- Intent per file
|
||||
- No code, no prose
|
||||
|
||||
Only approved files may be modified.
|
||||
|
||||
### Permission Gates
|
||||
|
||||
Explicit approval required **each time** before:
|
||||
- Builds, tests, or evaluations
|
||||
- Commits
|
||||
- Pushing to remotes
|
||||
|
||||
---
|
||||
|
||||
## Modules
|
||||
|
||||
### Host Modules
|
||||
- Path: `hosts/*.nix`
|
||||
- Composition only
|
||||
- Small, declarative
|
||||
- No reusable logic
|
||||
|
||||
Allowed:
|
||||
- `imports`
|
||||
- Host-specific values (hostname, locale, timezone, `system.stateVersion`)
|
||||
- Small, truly host-unique overrides
|
||||
|
||||
Forbidden:
|
||||
- Reusable features
|
||||
- Large logic blocks
|
||||
- Inline user definitions
|
||||
- Services usable by multiple hosts
|
||||
- Monolithic system configs
|
||||
|
||||
**Rule:**
|
||||
> Host modules compose. Feature modules implement.
|
||||
|
||||
### Feature Modules
|
||||
- Path: `modules/**`
|
||||
- Implementation only
|
||||
- Reusable
|
||||
- Upstream NixOS options only
|
||||
- No custom option namespaces
|
||||
|
||||
---
|
||||
|
||||
## Home Manager
|
||||
|
||||
- No home-manager
|
||||
- No `home-manager.users.*`
|
||||
- `modules/users/*` manages accounts and user settings
|
||||
|
||||
---
|
||||
|
||||
## Hardware
|
||||
|
||||
- Hardware modules allowed
|
||||
- All hardware changes must be listed in the plan
|
||||
- No unapproved disk, boot, or kernel changes
|
||||
|
||||
---
|
||||
|
||||
## Overlays
|
||||
|
||||
- Allowed but discouraged
|
||||
- Never introduce unless explicitly requested
|
||||
- Prefer:
|
||||
- flake inputs
|
||||
- `callPackage`
|
||||
- direct package references
|
||||
|
||||
---
|
||||
|
||||
## Code Style
|
||||
|
||||
### Nix
|
||||
- Pure Nix
|
||||
- Explicit attribute paths
|
||||
- Prefer `lib.mkIf`, `lib.mkMerge`, `lib.optionals`
|
||||
- Avoid `with pkgs;`, implicit imports, inline shell hacks
|
||||
|
||||
### Formatting
|
||||
- `nixfmt-rfc-style`
|
||||
- Do not reformat unrelated files
|
||||
|
||||
---
|
||||
|
||||
## Scripting
|
||||
|
||||
- Scripts live in `./scripts/`
|
||||
- Deterministic, non-interactive
|
||||
- POSIX only
|
||||
- Minimal
|
||||
- Never inline scripts in Nix
|
||||
|
||||
---
|
||||
|
||||
## Layout
|
||||
|
||||
```text
|
||||
flake.nix # authority
|
||||
hosts/ # composition
|
||||
modules/ # behavior
|
||||
scripts/
|
||||
167
flake.lock
generated
Normal file
167
flake.lock
generated
Normal file
|
|
@ -0,0 +1,167 @@
|
|||
{
|
||||
"nodes": {
|
||||
"flux_vision": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1766774843,
|
||||
"narHash": "sha256-/bikoewxigIU4SJUhq3CwPA0fqPAhi53lXdH8QcfN98=",
|
||||
"ref": "refs/heads/main",
|
||||
"rev": "ff83815c4a781ff84de4c29ee656e078ca879fef",
|
||||
"revCount": 17,
|
||||
"type": "git",
|
||||
"url": "https://codeberg.org/randogoth/flux.vision.git"
|
||||
},
|
||||
"original": {
|
||||
"type": "git",
|
||||
"url": "https://codeberg.org/randogoth/flux.vision.git"
|
||||
}
|
||||
},
|
||||
"geoblog_plugin": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1683036417,
|
||||
"narHash": "sha256-0kGJfd72WLlAZ3X2tQ7Vwodsu/qKAW0cOcSpeRdPCnM=",
|
||||
"ref": "refs/heads/main",
|
||||
"rev": "840d907235d1a81b8ebfa0345f5e848452d69d60",
|
||||
"revCount": 2,
|
||||
"type": "git",
|
||||
"url": "https://codeberg.org/randogoth/geoblog-plugin.git"
|
||||
},
|
||||
"original": {
|
||||
"type": "git",
|
||||
"url": "https://codeberg.org/randogoth/geoblog-plugin.git"
|
||||
}
|
||||
},
|
||||
"nfc_web": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1766145802,
|
||||
"narHash": "sha256-Ptq4ySrE0muiAlhkt6QT2x+u0Ux1wLJQ9Rqlq2YUmHw=",
|
||||
"ref": "refs/heads/main",
|
||||
"rev": "6bd590bcd113b6159edcdf8beaf66629ea7aa8dc",
|
||||
"revCount": 71,
|
||||
"type": "git",
|
||||
"url": "https://codeberg.org/randogoth/nfc-web.git"
|
||||
},
|
||||
"original": {
|
||||
"type": "git",
|
||||
"url": "https://codeberg.org/randogoth/nfc-web.git"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1770136044,
|
||||
"narHash": "sha256-tlFqNG/uzz2++aAmn4v8J0vAkV3z7XngeIIB3rM3650=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "e576e3c9cf9bad747afcddd9e34f51d18c855b4e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-25.11",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"praxis": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1766389293,
|
||||
"narHash": "sha256-noQDF8WKsGDR1lght9xaWXg0O8W8wPAhSoX2jwGIbRg=",
|
||||
"ref": "refs/heads/master",
|
||||
"rev": "dda2c101079b7d7e6563aa40edc1057ada710a9f",
|
||||
"revCount": 1,
|
||||
"type": "git",
|
||||
"url": "https://codeberg.org/randogoth/praxis.git"
|
||||
},
|
||||
"original": {
|
||||
"type": "git",
|
||||
"url": "https://codeberg.org/randogoth/praxis.git"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"flux_vision": "flux_vision",
|
||||
"geoblog_plugin": "geoblog_plugin",
|
||||
"nfc_web": "nfc_web",
|
||||
"nixpkgs": "nixpkgs",
|
||||
"praxis": "praxis",
|
||||
"scopesessions": "scopesessions",
|
||||
"sops-nix": "sops-nix",
|
||||
"sublunar": "sublunar",
|
||||
"sublunar_almanac": "sublunar_almanac"
|
||||
}
|
||||
},
|
||||
"scopesessions": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1766407123,
|
||||
"narHash": "sha256-f1D1pEHGAhZ96Mt7R9vxWsi3dH+THeflSroRlUIgMxU=",
|
||||
"ref": "refs/heads/main",
|
||||
"rev": "36bfce14b41942eda24bd763b8f6613141a55a1f",
|
||||
"revCount": 227,
|
||||
"type": "git",
|
||||
"url": "https://codeberg.org/randogoth/scopesessions.org.git"
|
||||
},
|
||||
"original": {
|
||||
"type": "git",
|
||||
"url": "https://codeberg.org/randogoth/scopesessions.org.git"
|
||||
}
|
||||
},
|
||||
"sops-nix": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1770145881,
|
||||
"narHash": "sha256-ktjWTq+D5MTXQcL9N6cDZXUf9kX8JBLLBLT0ZyOTSYY=",
|
||||
"owner": "Mic92",
|
||||
"repo": "sops-nix",
|
||||
"rev": "17eea6f3816ba6568b8c81db8a4e6ca438b30b7c",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "Mic92",
|
||||
"repo": "sops-nix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"sublunar": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1766145247,
|
||||
"narHash": "sha256-XFAM+eD+GUDR3G+daOcPn2nLj5CZp+m/IwpSVmEYDrU=",
|
||||
"ref": "refs/heads/main",
|
||||
"rev": "4920396e8e9a5de9d93cb01f107823c9295f5bc2",
|
||||
"revCount": 435,
|
||||
"type": "git",
|
||||
"url": "https://codeberg.org/randogoth/sublunar.git"
|
||||
},
|
||||
"original": {
|
||||
"type": "git",
|
||||
"url": "https://codeberg.org/randogoth/sublunar.git"
|
||||
}
|
||||
},
|
||||
"sublunar_almanac": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1766409110,
|
||||
"narHash": "sha256-+xlqzuTsV5fUqmDWlPFrEcmThUCq9Yxh6j65DQtINkM=",
|
||||
"ref": "refs/heads/main",
|
||||
"rev": "c10e0a0bf27a685b8c00c6ed986f0616b7b7ba3d",
|
||||
"revCount": 84,
|
||||
"type": "git",
|
||||
"url": "https://codeberg.org/randogoth/sublunar.almanac.git"
|
||||
},
|
||||
"original": {
|
||||
"type": "git",
|
||||
"url": "https://codeberg.org/randogoth/sublunar.almanac.git"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
||||
52
flake.nix
Normal file
52
flake.nix
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
{
|
||||
description = "Bucur NixOS configuration";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11";
|
||||
sops-nix.url = "github:Mic92/sops-nix";
|
||||
sops-nix.inputs.nixpkgs.follows = "nixpkgs";
|
||||
|
||||
sublunar.url = "git+https://codeberg.org/randogoth/sublunar.git";
|
||||
sublunar.flake = false;
|
||||
|
||||
flux_vision.url = "git+https://codeberg.org/randogoth/flux.vision.git";
|
||||
flux_vision.flake = false;
|
||||
|
||||
nfc_web.url = "git+https://codeberg.org/randogoth/nfc-web.git";
|
||||
nfc_web.flake = false;
|
||||
|
||||
scopesessions.url = "git+https://codeberg.org/randogoth/scopesessions.org.git";
|
||||
scopesessions.flake = false;
|
||||
|
||||
sublunar_almanac.url = "git+https://codeberg.org/randogoth/sublunar.almanac.git";
|
||||
sublunar_almanac.flake = false;
|
||||
|
||||
praxis.url = "git+https://codeberg.org/randogoth/praxis.git";
|
||||
praxis.flake = false;
|
||||
|
||||
geoblog_plugin.url = "git+https://codeberg.org/randogoth/geoblog-plugin.git";
|
||||
geoblog_plugin.flake = false;
|
||||
};
|
||||
|
||||
outputs = { self, nixpkgs, sops-nix, ... }@inputs:
|
||||
let
|
||||
system = "x86_64-linux";
|
||||
in
|
||||
{
|
||||
nixosConfigurations.bucur = nixpkgs.lib.nixosSystem {
|
||||
inherit system;
|
||||
specialArgs = { inherit inputs; };
|
||||
modules = [
|
||||
sops-nix.nixosModules.sops
|
||||
./hosts/bucur.nix
|
||||
./modules/services/caddy.nix
|
||||
./modules/services/openssh.nix
|
||||
./modules/services/firewall.nix
|
||||
./modules/services/tailscale.nix
|
||||
./modules/services/podman.nix
|
||||
./modules/services/static-sites
|
||||
./modules/users/tobias.nix
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
16
hosts/bucur.nix
Normal file
16
hosts/bucur.nix
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
{ lib, ... }:
|
||||
{
|
||||
networking.hostName = "bucur";
|
||||
time.timeZone = "UTC";
|
||||
i18n.defaultLocale = "en_US.UTF-8";
|
||||
system.stateVersion = "25.11";
|
||||
|
||||
virtualisation.vmVariant = {
|
||||
users.mutableUsers = false;
|
||||
users.users.tobias.password = "admin";
|
||||
users.users.tobias.openssh.authorizedKeys.keys = [
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILXTPk7gb4VDb+jORGw2sKp2SRTzoibXew6DqJJ0A3Zs randogoth@mrht"
|
||||
];
|
||||
services.firewalld.enable = lib.mkForce false;
|
||||
};
|
||||
}
|
||||
64
modules/services/caddy.nix
Normal file
64
modules/services/caddy.nix
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
{ pkgs, ... }:
|
||||
{
|
||||
services.caddy.enable = true;
|
||||
services.caddy.configFile = pkgs.writeText "Caddyfile" ''
|
||||
http:// {
|
||||
root * /usr/share/caddy
|
||||
file_server
|
||||
}
|
||||
|
||||
privatpraxis-last-heidelberg.de, www.privatpraxis-last-heidelberg.de {
|
||||
root * /var/www/privatpraxis-last-heidelberg.de/public
|
||||
encode zstd gzip
|
||||
file_server
|
||||
}
|
||||
|
||||
raayoni-last.com, www.raayoni-last.com, flux.vision, www.flux.vision {
|
||||
redir https://tobias.raayoni-last.com
|
||||
}
|
||||
|
||||
tobias.raayoni-last.com {
|
||||
root * /var/www/raayoni-last.com/tobias/public
|
||||
encode zstd gzip
|
||||
file_server
|
||||
}
|
||||
|
||||
randogoth.com, www.randogoth.com {
|
||||
root * /var/www/raayoni-last.com/tobias/public
|
||||
encode zstd gzip
|
||||
file_server
|
||||
}
|
||||
|
||||
sublunar.space, www.sublunar.space {
|
||||
root * /var/www/sublunar.space/public
|
||||
encode zstd gzip
|
||||
file_server
|
||||
}
|
||||
|
||||
almanac.sublunar.space {
|
||||
root * /var/www/sublunar.space/almanac/public
|
||||
encode zstd gzip
|
||||
|
||||
@wasm {
|
||||
path /js/*.wasm
|
||||
}
|
||||
header @wasm Content-Type application/wasm
|
||||
|
||||
file_server
|
||||
}
|
||||
|
||||
scopesessions.org, www.scopesessions.org {
|
||||
root * /var/www/scopesessions.org/public
|
||||
encode zstd gzip
|
||||
file_server
|
||||
}
|
||||
|
||||
nmns.place, www.nmns.place {
|
||||
root * /var/www/nmns.place/public
|
||||
encode zstd gzip
|
||||
file_server
|
||||
}
|
||||
|
||||
import Caddyfile.d/*.caddyfile
|
||||
'';
|
||||
}
|
||||
104
modules/services/firewall.nix
Normal file
104
modules/services/firewall.nix
Normal file
|
|
@ -0,0 +1,104 @@
|
|||
{ ... }:
|
||||
{
|
||||
networking.firewall.enable = true;
|
||||
networking.firewall.backend = "firewalld";
|
||||
networking.nftables.enable = true;
|
||||
|
||||
services.firewalld.enable = true;
|
||||
services.firewalld.settings.DefaultZone = "FedoraServer";
|
||||
|
||||
services.firewalld.zones.FedoraServer = {
|
||||
target = "%%REJECT%%";
|
||||
interfaces = [ "ens3" ];
|
||||
forward = true;
|
||||
services = [ "http" "https" "ssh" ];
|
||||
ports = [
|
||||
{
|
||||
port = 8443;
|
||||
protocol = "tcp";
|
||||
}
|
||||
];
|
||||
rules = [
|
||||
{
|
||||
rule = {
|
||||
"@family" = "ipv4";
|
||||
source = { "@address" = "80.94.92.177"; };
|
||||
port = { "@port" = "ssh"; "@protocol" = "tcp"; };
|
||||
reject = { "@type" = "icmp-port-unreachable"; };
|
||||
};
|
||||
}
|
||||
{
|
||||
rule = {
|
||||
"@family" = "ipv4";
|
||||
source = { "@address" = "45.148.10.240"; };
|
||||
port = { "@port" = "ssh"; "@protocol" = "tcp"; };
|
||||
reject = { "@type" = "icmp-port-unreachable"; };
|
||||
};
|
||||
}
|
||||
{
|
||||
rule = {
|
||||
"@family" = "ipv4";
|
||||
source = { "@address" = "193.242.125.233"; };
|
||||
port = { "@port" = "ssh"; "@protocol" = "tcp"; };
|
||||
reject = { "@type" = "icmp-port-unreachable"; };
|
||||
};
|
||||
}
|
||||
{
|
||||
rule = {
|
||||
"@family" = "ipv4";
|
||||
source = { "@address" = "45.78.198.204"; };
|
||||
port = { "@port" = "ssh"; "@protocol" = "tcp"; };
|
||||
reject = { "@type" = "icmp-port-unreachable"; };
|
||||
};
|
||||
}
|
||||
{
|
||||
rule = {
|
||||
"@family" = "ipv4";
|
||||
source = { "@address" = "176.120.22.47"; };
|
||||
port = { "@port" = "ssh"; "@protocol" = "tcp"; };
|
||||
reject = { "@type" = "icmp-port-unreachable"; };
|
||||
};
|
||||
}
|
||||
{
|
||||
rule = {
|
||||
"@family" = "ipv4";
|
||||
source = { "@address" = "91.202.233.33"; };
|
||||
port = { "@port" = "ssh"; "@protocol" = "tcp"; };
|
||||
reject = { "@type" = "icmp-port-unreachable"; };
|
||||
};
|
||||
}
|
||||
{
|
||||
rule = {
|
||||
"@family" = "ipv4";
|
||||
source = { "@address" = "188.166.24.102"; };
|
||||
port = { "@port" = "ssh"; "@protocol" = "tcp"; };
|
||||
reject = { "@type" = "icmp-port-unreachable"; };
|
||||
};
|
||||
}
|
||||
{
|
||||
rule = {
|
||||
"@family" = "ipv4";
|
||||
source = { "@address" = "128.1.47.28"; };
|
||||
port = { "@port" = "ssh"; "@protocol" = "tcp"; };
|
||||
reject = { "@type" = "icmp-port-unreachable"; };
|
||||
};
|
||||
}
|
||||
{
|
||||
rule = {
|
||||
"@family" = "ipv4";
|
||||
source = { "@address" = "188.166.11.218"; };
|
||||
port = { "@port" = "ssh"; "@protocol" = "tcp"; };
|
||||
reject = { "@type" = "icmp-port-unreachable"; };
|
||||
};
|
||||
}
|
||||
{
|
||||
rule = {
|
||||
"@family" = "ipv4";
|
||||
source = { "@address" = "104.248.91.222"; };
|
||||
port = { "@port" = "ssh"; "@protocol" = "tcp"; };
|
||||
reject = { "@type" = "icmp-port-unreachable"; };
|
||||
};
|
||||
}
|
||||
];
|
||||
};
|
||||
}
|
||||
13
modules/services/openssh.nix
Normal file
13
modules/services/openssh.nix
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
{ ... }:
|
||||
{
|
||||
services.openssh.enable = true;
|
||||
services.openssh.settings = {
|
||||
PermitRootLogin = "no";
|
||||
PasswordAuthentication = false;
|
||||
KbdInteractiveAuthentication = false;
|
||||
AllowTcpForwarding = "no";
|
||||
X11Forwarding = false;
|
||||
UseDns = false;
|
||||
MaxAuthTries = 3;
|
||||
};
|
||||
}
|
||||
39
modules/services/podman.nix
Normal file
39
modules/services/podman.nix
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
{ config, ... }:
|
||||
{
|
||||
environment.etc."sops/age/keys.txt".source = ../../secrets/age/keys.txt;
|
||||
sops.defaultSopsFile = ../../secrets/bucur.yaml;
|
||||
sops.age.keyFile = "/etc/sops/age/keys.txt";
|
||||
|
||||
sops.secrets.mtproto_secret = {};
|
||||
|
||||
sops.templates."mtproto-proxy.env".content = ''
|
||||
SECRET=${config.sops.placeholder."mtproto_secret"}
|
||||
'';
|
||||
|
||||
virtualisation.podman.enable = true;
|
||||
virtualisation.oci-containers.backend = "podman";
|
||||
|
||||
virtualisation.oci-containers.containers = {
|
||||
portainer = {
|
||||
image = "docker.io/portainer/portainer-ce:lts";
|
||||
autoStart = true;
|
||||
ports = [
|
||||
"100.124.109.92:8000:8000"
|
||||
"100.124.109.92:9443:9443"
|
||||
];
|
||||
volumes = [
|
||||
"portainer_data:/data"
|
||||
"/run/podman/podman.sock:/var/run/docker.sock"
|
||||
];
|
||||
extraOptions = [ "--privileged" ];
|
||||
};
|
||||
|
||||
mtproto-proxy = {
|
||||
image = "docker.io/telegrammessenger/proxy:latest";
|
||||
autoStart = true;
|
||||
ports = [ "0.0.0.0:8443:443" ];
|
||||
volumes = [ "mtproxy-data:/data" ];
|
||||
environmentFiles = [ config.sops.templates."mtproto-proxy.env".path ];
|
||||
};
|
||||
};
|
||||
}
|
||||
160
modules/services/static-sites/default.nix
Normal file
160
modules/services/static-sites/default.nix
Normal file
|
|
@ -0,0 +1,160 @@
|
|||
{ inputs, pkgs, ... }:
|
||||
let
|
||||
buildPelicanSite = { name, src, subdir ? "", pluginSources ? [ ] }:
|
||||
let
|
||||
workdir = if subdir == "" then "." else subdir;
|
||||
pythonEnv = pkgs.python3.withPackages (ps: [
|
||||
ps.pelican
|
||||
ps.markdown
|
||||
ps.pygments
|
||||
]);
|
||||
copyPlugins = pkgs.lib.concatStringsSep "\n" (map (plugin: ''
|
||||
mkdir -p "${workdir}/${plugin.dest}"
|
||||
cp -a "${plugin.src}${if plugin ? subdir then "/${plugin.subdir}" else ""}/." "${workdir}/${plugin.dest}/"
|
||||
'') pluginSources);
|
||||
in
|
||||
pkgs.stdenvNoCC.mkDerivation {
|
||||
pname = name;
|
||||
version = "git";
|
||||
src = src;
|
||||
nativeBuildInputs = [ pythonEnv ];
|
||||
buildPhase = ''
|
||||
runHook preBuild
|
||||
cd ${workdir}
|
||||
${copyPlugins}
|
||||
${pythonEnv}/bin/pelican content -o "$out"
|
||||
runHook postBuild
|
||||
'';
|
||||
installPhase = "true";
|
||||
};
|
||||
|
||||
buildJekyllSite = { name, src, gemset }:
|
||||
let
|
||||
bundlerEnv = pkgs.bundlerEnv {
|
||||
name = "${name}-bundler-env";
|
||||
gemdir = src;
|
||||
gemset = gemset;
|
||||
};
|
||||
in
|
||||
pkgs.stdenvNoCC.mkDerivation {
|
||||
pname = name;
|
||||
version = "git";
|
||||
src = src;
|
||||
nativeBuildInputs = [ bundlerEnv ];
|
||||
buildPhase = ''
|
||||
runHook preBuild
|
||||
JEKYLL_ENV=production bundle exec jekyll build -s . -d "$out"
|
||||
runHook postBuild
|
||||
'';
|
||||
installPhase = "true";
|
||||
};
|
||||
|
||||
buildStaticSite = { name, src, subdir ? "" }:
|
||||
let
|
||||
srcPath = if subdir == "" then src else "${src}/${subdir}";
|
||||
in
|
||||
pkgs.stdenvNoCC.mkDerivation {
|
||||
pname = name;
|
||||
version = "git";
|
||||
src = src;
|
||||
dontUnpack = true;
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
mkdir -p "$out"
|
||||
cp -a ${srcPath}/. "$out/"
|
||||
runHook postInstall
|
||||
'';
|
||||
};
|
||||
|
||||
mkDeployService = { name, src, dest }:
|
||||
{
|
||||
description = "Deploy ${name} site";
|
||||
path = [ pkgs.coreutils pkgs.rsync ];
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
};
|
||||
script = ''
|
||||
install -d -m 755 ${dest}
|
||||
rsync -a --delete ${src}/ ${dest}/
|
||||
'';
|
||||
};
|
||||
|
||||
sublunarSite = buildPelicanSite {
|
||||
name = "sublunar";
|
||||
src = inputs.sublunar;
|
||||
};
|
||||
|
||||
tobiasRaayoniLastSite = buildPelicanSite {
|
||||
name = "tobias-raayoni-last";
|
||||
src = inputs.flux_vision;
|
||||
subdir = "web";
|
||||
};
|
||||
|
||||
nmnsSite = buildPelicanSite {
|
||||
name = "nmns";
|
||||
src = inputs.nfc_web;
|
||||
subdir = "web";
|
||||
};
|
||||
|
||||
scopesessionsSite = buildJekyllSite {
|
||||
name = "scopesessions";
|
||||
src = inputs.scopesessions;
|
||||
gemset = ./scopesessions-gemset.nix;
|
||||
};
|
||||
|
||||
almanacSite = buildStaticSite {
|
||||
name = "sublunar-almanac";
|
||||
src = inputs.sublunar_almanac;
|
||||
};
|
||||
|
||||
praxisSite = buildStaticSite {
|
||||
name = "praxis";
|
||||
src = inputs.praxis;
|
||||
};
|
||||
|
||||
isNixBuild = builtins.getEnv "IN_NIX_BUILD" == "1";
|
||||
in
|
||||
{
|
||||
sops.secrets.codeberg_id_ed25519 = {
|
||||
owner = "root";
|
||||
group = "root";
|
||||
mode = "0400";
|
||||
path = "/etc/ssh/codeberg_id_ed25519";
|
||||
};
|
||||
|
||||
systemd.services."deploy-sublunar" = mkDeployService {
|
||||
name = "sublunar";
|
||||
src = sublunarSite;
|
||||
dest = "/var/www/sublunar.space/public";
|
||||
};
|
||||
|
||||
systemd.services."deploy-tobias-raayoni-last" = mkDeployService {
|
||||
name = "tobias-raayoni-last";
|
||||
src = tobiasRaayoniLastSite;
|
||||
dest = "/var/www/raayoni-last.com/tobias/public";
|
||||
};
|
||||
|
||||
systemd.services."deploy-nmns" = mkDeployService {
|
||||
name = "nmns";
|
||||
src = nmnsSite;
|
||||
dest = "/var/www/nmns.place/public";
|
||||
};
|
||||
|
||||
systemd.services."deploy-scopesessions" = mkDeployService {
|
||||
name = "scopesessions";
|
||||
src = scopesessionsSite;
|
||||
dest = "/var/www/scopesessions.org/public";
|
||||
};
|
||||
|
||||
systemd.services."deploy-almanac" = mkDeployService {
|
||||
name = "almanac";
|
||||
src = almanacSite;
|
||||
dest = "/var/www/sublunar.space/almanac/public";
|
||||
};
|
||||
|
||||
systemd.services."deploy-privatpraxis" = mkDeployService {
|
||||
name = "privatpraxis";
|
||||
src = praxisSite;
|
||||
dest = "/var/www/privatpraxis-last-heidelberg.de/public";
|
||||
};
|
||||
}
|
||||
419
modules/services/static-sites/scopesessions-gemset.nix
Normal file
419
modules/services/static-sites/scopesessions-gemset.nix
Normal file
|
|
@ -0,0 +1,419 @@
|
|||
{
|
||||
addressable = {
|
||||
dependencies = ["public_suffix"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0mxhjgihzsx45l9wh2n0ywl9w0c6k70igm5r0d63dxkcagwvh4vw";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.8.8";
|
||||
};
|
||||
base64 = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0yx9yn47a8lkfcjmigk79fykxvr80r4m1i35q82sxzynpbm7lcr7";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.3.0";
|
||||
};
|
||||
bigdecimal = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "19y406nx17arzsbc515mjmr6k5p59afprspa1k423yd9cp8d61wb";
|
||||
type = "gem";
|
||||
};
|
||||
version = "4.0.1";
|
||||
};
|
||||
colorator = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0f7wvpam948cglrciyqd798gdc6z3cfijciavd0dfixgaypmvy72";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.1.0";
|
||||
};
|
||||
concurrent-ruby = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1aymcakhzl83k77g2f2krz07bg1cbafbcd2ghvwr4lky3rz86mkb";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.3.6";
|
||||
};
|
||||
csv = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0gz7r2kazwwwyrwi95hbnhy54kwkfac5swh2gy5p5vw36fn38lbf";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.3.5";
|
||||
};
|
||||
em-websocket = {
|
||||
dependencies = ["eventmachine" "http_parser.rb"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1a66b0kjk6jx7pai9gc7i27zd0a128gy73nmas98gjz6wjyr4spm";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.5.3";
|
||||
};
|
||||
eventmachine = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0wh9aqb0skz80fhfn66lbpr4f86ya2z5rx6gm5xlfhd05bj1ch4r";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.2.7";
|
||||
};
|
||||
faraday = {
|
||||
dependencies = ["faraday-net_http" "json" "logger"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1ka175ci0q9ylpcy651pjj580diplkaskycn4n7jcmbyv7jwz6c6";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.14.0";
|
||||
};
|
||||
faraday-net_http = {
|
||||
dependencies = ["net-http"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0v4hfmc7d4lrqqj2wl366rm9551gd08zkv2ppwwnjlnkc217aizi";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.4.2";
|
||||
};
|
||||
ffi = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "19kdyjg3kv7x0ad4xsd4swy5izsbb1vl1rpb6qqcqisr5s23awi9";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.17.2";
|
||||
};
|
||||
forwardable-extended = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "15zcqfxfvsnprwm8agia85x64vjzr2w0xn9vxfnxzgcv8s699v0v";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.6.0";
|
||||
};
|
||||
google-protobuf = {
|
||||
dependencies = ["bigdecimal" "rake"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0583agdf2jvnq78scf8008bddrmbybn27ylyydg6bza2qvb510bl";
|
||||
type = "gem";
|
||||
};
|
||||
version = "4.33.2";
|
||||
};
|
||||
"http_parser.rb" = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1gj4fmls0mf52dlr928gaq0c0cb0m3aqa9kaa6l0ikl2zbqk42as";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.8.0";
|
||||
};
|
||||
i18n = {
|
||||
dependencies = ["concurrent-ruby"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1994i044vdmzzkyr76g8rpl1fq1532wf0sb21xg5r1ilj5iphmr8";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.14.8";
|
||||
};
|
||||
jekyll = {
|
||||
dependencies = ["addressable" "base64" "colorator" "csv" "em-websocket" "i18n" "jekyll-sass-converter" "jekyll-watch" "json" "kramdown" "kramdown-parser-gfm" "liquid" "mercenary" "pathutil" "rouge" "safe_yaml" "terminal-table" "webrick"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1h8qpki1zcw4srnzmbba2gwajycm50w53kxq8l6vicm5azc484ac";
|
||||
type = "gem";
|
||||
};
|
||||
version = "4.4.1";
|
||||
};
|
||||
jekyll-sass-converter = {
|
||||
dependencies = ["sass-embedded"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0hr4hsir8lm8aw3yj9zi7hx2xs4k00xn9inh24642d6iy625v4l3";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.1.0";
|
||||
};
|
||||
jekyll-watch = {
|
||||
dependencies = ["listen"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1qd7hy1kl87fl7l0frw5qbn22x7ayfzlv9a5ca1m59g0ym1ysi5w";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.2.1";
|
||||
};
|
||||
json = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "01fmiz052cvnxgdnhb3qwcy88xbv7l3liz0fkvs5qgqqwjp0c1di";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.18.0";
|
||||
};
|
||||
kramdown = {
|
||||
dependencies = ["rexml"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "131nwypz8b4pq1hxs6gsz3k00i9b75y3cgpkq57vxknkv6mvdfw7";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.5.1";
|
||||
};
|
||||
kramdown-parser-gfm = {
|
||||
dependencies = ["kramdown"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0a8pb3v951f4x7h968rqfsa19c8arz21zw1vaj42jza22rap8fgv";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.1.0";
|
||||
};
|
||||
liquid = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1czxv2i1gv3k7hxnrgfjb0z8khz74l4pmfwd70c7kr25l2qypksg";
|
||||
type = "gem";
|
||||
};
|
||||
version = "4.0.4";
|
||||
};
|
||||
listen = {
|
||||
dependencies = ["rb-fsevent" "rb-inotify"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0rwwsmvq79qwzl6324yc53py02kbrcww35si720490z5w0j497nv";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.9.0";
|
||||
};
|
||||
logger = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "00q2zznygpbls8asz5knjvvj2brr3ghmqxgr83xnrdj4rk3xwvhr";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.7.0";
|
||||
};
|
||||
mercenary = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0f2i827w4lmsizrxixsrv2ssa3gk1b7lmqh8brk8ijmdb551wnmj";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.4.0";
|
||||
};
|
||||
mini_magick = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1nfxjpmka12ihbwd87d5k2hh7d2pv3aq95x0l2lh8gca1s72bmki";
|
||||
type = "gem";
|
||||
};
|
||||
version = "4.13.2";
|
||||
};
|
||||
net-http = {
|
||||
dependencies = ["uri"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "15k96fj6qwbaiv6g52l538ass95ds1qwgynqdridz29yqrkhpfi5";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.9.1";
|
||||
};
|
||||
pathutil = {
|
||||
dependencies = ["forwardable-extended"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "12fm93ljw9fbxmv2krki5k5wkvr7560qy8p4spvb9jiiaqv78fz4";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.16.2";
|
||||
};
|
||||
public_suffix = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "15dhl6k4gbax0xz8frfs4nsb6lg5zgax9vkr1pqzjmhfxddhn2gp";
|
||||
type = "gem";
|
||||
};
|
||||
version = "7.0.0";
|
||||
};
|
||||
rake = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "175iisqb211n0qbfyqd8jz2g01q6xj038zjf4q0nm8k6kz88k7lc";
|
||||
type = "gem";
|
||||
};
|
||||
version = "13.3.1";
|
||||
};
|
||||
rb-fsevent = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1zmf31rnpm8553lqwibvv3kkx0v7majm1f341xbxc0bk5sbhp423";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.11.2";
|
||||
};
|
||||
rb-inotify = {
|
||||
dependencies = ["ffi"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0vmy8xgahixcz6hzwy4zdcyn2y6d6ri8dqv5xccgzc1r292019x0";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.11.1";
|
||||
};
|
||||
rexml = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0hninnbvqd2pn40h863lbrn9p11gvdxp928izkag5ysx8b1s5q0r";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.4.4";
|
||||
};
|
||||
rouge = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1pkp5icgm7s10b2n6b2pzbdsfiv0l5sxqyizx55qdmlpaxnk8xah";
|
||||
type = "gem";
|
||||
};
|
||||
version = "4.6.1";
|
||||
};
|
||||
safe_yaml = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0j7qv63p0vqcd838i2iy2f76c3dgwzkiz1d1xkg7n0pbnxj2vb56";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.5";
|
||||
};
|
||||
sass-embedded = {
|
||||
dependencies = ["google-protobuf" "rake"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1nb8wy2v397qi7hn3vamya6yv7v4ix2zfdsrk3mairslb24yhbhi";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.97.1";
|
||||
};
|
||||
terminal-table = {
|
||||
dependencies = ["unicode-display_width"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "14dfmfjppmng5hwj7c5ka6qdapawm3h6k9lhn8zj001ybypvclgr";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.0.2";
|
||||
};
|
||||
unicode-display_width = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0nkz7fadlrdbkf37m0x7sw8bnz8r355q3vwcfb9f9md6pds9h9qj";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.6.0";
|
||||
};
|
||||
uri = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1ijpbj7mdrq7rhpq2kb51yykhrs2s54wfs6sm9z3icgz4y6sb7rp";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.1.1";
|
||||
};
|
||||
webrick = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0ca1hr2rxrfw7s613rp4r4bxb454i3ylzniv9b9gxpklqigs3d5y";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.9.2";
|
||||
};
|
||||
}
|
||||
5
modules/services/tailscale.nix
Normal file
5
modules/services/tailscale.nix
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
{ ... }:
|
||||
{
|
||||
services.tailscale.enable = true;
|
||||
services.tailscale.port = 41641;
|
||||
}
|
||||
20
modules/users/tobias.nix
Normal file
20
modules/users/tobias.nix
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
{ pkgs, ... }:
|
||||
{
|
||||
users.users.tobias = {
|
||||
isNormalUser = true;
|
||||
uid = 1000;
|
||||
group = "tobias";
|
||||
extraGroups = [ "wheel" ];
|
||||
home = "/home/tobias";
|
||||
shell = pkgs.bashInteractive;
|
||||
openssh.authorizedKeys.keys = [
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBgC4+zkTKNLPCt1vcTLyA+iwKGG8hrmcN2XKUExAR8W randogoth@mrht"
|
||||
];
|
||||
};
|
||||
|
||||
users.groups.tobias = {
|
||||
gid = 1000;
|
||||
};
|
||||
|
||||
security.sudo.wheelNeedsPassword = false;
|
||||
}
|
||||
17
secrets/bucur.yaml
Normal file
17
secrets/bucur.yaml
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
mtproto_secret: ENC[AES256_GCM,data:MyzyUCH8cLOG+GMtmV03daJ9sqwOw/ozN2yi/14SMlY=,iv:LLf2LIvX+jNjRdMHclHpsmTZa7wmVM3gD6RbqeCGmik=,tag:i36lVESyKJafsn14kSzh3g==,type:str]
|
||||
codeberg_id_ed25519: ENC[AES256_GCM,data:AZbFWfc80HVskenEVLYL9MOYrGhW7Cwzdqv8gS4+1JGfk+nC801SmMgElUdISo+3m/O54b8RbJtdVz2u99gL8WG6wgbK7xqf40q4HNvV5cFXp7L/ozUkT41uXjWsDIdnMwumOqL/vjXowmAay30kMOiD5M4DL0t6EmuOo1Rcdffe/HwCVd2Pz7ZpU+BSTQV/pDTK1X3taUCjCY3Ui0XrcSCY8G2tuX5pFQ6t+vLrdqy3UGhofYHQ+nZuoyEKQHCcvEhYvEgDPJtyy+gk96vZCDYyXb9am/5k0I+MoIsArpavp4P0r5dNDcTnuCHH+fVPTG4tOsG/Ztf1rFBCsqPiM0azNElI8FERSKLYipuDDD8GI46p43OalHw4pxmAHXNOs70PfIH25iFJ5AUb32v2A71LScJMNP/TFSSezuq6g5eTd/JrtpQnWwToH1eVrwcN/8YX3xflLZ2JO1q4fjCXrkYHyw004dV/HAq3u1XQDmfMviZiH80+hiVIgZLfMWv5IyzfuomqSnfOj6oJ6D+j,iv:37HiX60OnO/zZFs1v4VWQLxcaoC1byZ3N2ueYFh4BVQ=,tag:5+z2YlnA8+MEcQTTrYhPJA==,type:str]
|
||||
sops:
|
||||
age:
|
||||
- recipient: age1647c5f46njylggj33h26t6twhq57n5qeaza04l845uy0fksv0ucsq82c3d
|
||||
enc: |
|
||||
-----BEGIN AGE ENCRYPTED FILE-----
|
||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBpZWtwNDdiRlA0K25tbkZP
|
||||
VDBrSVFCTlU4NlpqU2NHZnk1NEw4OEhXTTBJCktSU3pBcEZwN2NVNUl2ekNQY1Vp
|
||||
YUdKbVE2ZzhUTmJwVDdRcVBpbXQ1b0EKLS0tIFZINGt1enNwUHlDdmZ4YTV6K09T
|
||||
U0x1ZmtzLytSL1Y3cVo1ZVJ2Ymtob1EKTpgjSymQx14wLSuUhh5Txq++3DrLS4Bs
|
||||
x8vVtQgcXZgv1q0OMGup6DT4bkY6UiNbn9bAt4rHCaRPeb15x4ZKNw==
|
||||
-----END AGE ENCRYPTED FILE-----
|
||||
lastmodified: "2026-02-05T14:18:42Z"
|
||||
mac: ENC[AES256_GCM,data:sZTFVbWYhtYML6tZrivXYGm8ug+isUf7wi0VWwQ0Wx1Swany1RSkyQI7N0eFs58tVsY2KoizOShvLkC8UcpRvtog1M/OyZi0LypYkfMUD7Rth11AF2n3Tg4Q3VNH5DGcLWkzYleA4mj1mJnPyCQzKOykXSPocODAcKUyFYcP8uQ=,iv:ZxuNWYQesR6mtezi5yBRacPF4GC5NDsevaSlRJ+A6X4=,tag:htOCSco/V2/twoRRWeoBbA==,type:str]
|
||||
unencrypted_suffix: _unencrypted
|
||||
version: 3.11.0
|
||||
Loading…
Add table
Add a link
Reference in a new issue