Compare commits

...

428 commits

Author SHA1 Message Date
Rouven Seifert 48c04ce61e
updates 2024-11-12 2024-11-12 15:12:16 +01:00
Rouven Seifert d075afaac5
courses: disable phil 2024-11-12 15:12:01 +01:00
Rouven Seifert 8e3a5b0ff3
monitoring: remove postfix 2024-11-08 11:19:59 +01:00
Rouven Seifert 06281a1432
monitoring: move to module folder 2024-11-08 11:16:21 +01:00
Lyn Fugmann 97cb91d703
update course-management 2024-11-04 21:20:39 +01:00
Rouven Seifert c442ea54a4
updates 2024-10-30 2024-10-30 11:06:06 +01:00
Rouven Seifert ae4fcb60cc
rspamd web interface: limit to university nets 2024-10-28 13:16:15 +01:00
Jonas Gaffke e8e71eda7c kanboard: update to 1.2.41 2024-10-27 09:06:33 +01:00
Rouven Seifert 4d5e2ae3eb
updates 2024-10-25 2024-10-25 11:17:20 +02:00
quitte 2fa18c816d Revert "kanboard: move away from podman because of nftables and podman bug"
This reverts commit 6416be37f5.
2024-10-23 23:58:08 +02:00
Rouven Seifert dd9aaba3ef
updates 2024-10-20 2024-10-20 19:58:26 +02:00
Rouven Seifert 37bf91a57a
close wireguard port 2024-10-13 22:53:15 +02:00
Rouven Seifert 6fa82f7453
remove ese secret 2024-10-13 22:51:18 +02:00
Rouven Seifert f518bd545d
remove ese wireguard 2024-10-13 22:50:06 +02:00
Rouven Seifert 3d0f3cfa21
nix: flake update 2024-10-13 14:16:01 +02:00
Rouven Seifert fb0b36b200 Merge pull request 'switch to lts kernel' (#94) from linux-lts into main
Reviewed-on: #94
2024-10-13 14:09:34 +02:00
Rouven Seifert 7d69600115
switch to lts kernel
zfs latestCompatibleLinuxPackages will be deprecated at some point
2024-10-08 21:39:17 +02:00
Rouven Seifert efc38dac8f
ran deadnix 2024-10-08 21:36:52 +02:00
Lyn Fugmann ea8efc298d
add ese-deploy user 2024-10-06 23:09:22 +02:00
Lyn Fugmann 7c86415c50
change ese web root 2024-10-06 20:37:13 +02:00
Lyn Fugmann 9662b35f42
fix forgejo actions 2024-10-06 20:04:32 +02:00
Lyn Fugmann 161a4ae838
ese website caching 2024-10-06 16:54:32 +02:00
Rouven Seifert fcffa5f79c
fix ese wireguard 2024-10-04 16:34:54 +02:00
Rouven Seifert 0d9bd777c8
network: init ese wireguard 2024-10-04 15:39:10 +02:00
Rouven Seifert e80eb649ca
updates 2024-10-04 2024-10-04 14:22:46 +02:00
Rouven Seifert af3c401cf6
core: add sudo rule 2024-10-03 00:17:05 +02:00
Rouven Seifert c25d9d3f9e
updates 2024-09-28 2024-09-28 23:03:28 +02:00
Jonas Gaffke d4ae4d1743 remove broken decisions tool 2024-09-28 10:48:10 +02:00
Rouven Seifert 4e99931626
directus: remove
yeet
2024-09-26 20:11:04 +02:00
Rouven Seifert f6cda1a4fc
updates 2024-09-26 2024-09-26 17:51:50 +02:00
Rouven Seifert 74f8e85f51
updates 2024-09-23 2024-09-23 15:41:33 +02:00
Rouven Seifert f5cf94d257
mail: don't forbid non-tls connections 2024-09-22 23:34:52 +02:00
Rouven Seifert ec5f15946e
the postfix nixos module has stupid defaults 2024-09-22 23:05:37 +02:00
Rouven Seifert c2149ec639
mail: remove deprecated postfix tls options 2024-09-22 23:01:32 +02:00
Rouven Seifert d2c543fc07
updates: 2024-09-17 2024-09-17 16:24:43 +02:00
Rouven Seifert ed3e8de2cb
updades 2024-09-13 2024-09-13 22:42:24 +02:00
Rouven Seifert 6e2b0d262f
backup: disable compression 2024-09-10 20:29:52 +02:00
Rouven Seifert f83abbfe8d
updates 2024-09-10 2024-09-10 09:30:38 +02:00
Rouven Seifert e10b491cdf
formatting 2024-09-07 11:33:19 +02:00
Benno Fünfstück ddecabc25f hyperilo: fix websocket config 2024-09-06 17:12:45 +02:00
Benno Fünfstück 776f860a92 hyperilo: proxy websockets for console 2024-09-06 17:05:02 +02:00
Jonas Gaffke e84a83e305 mediawiki: add visual editor and update extensions to 1.41 2024-09-05 16:04:03 +02:00
Rouven Seifert 643f92dfc5
keycloak: format 2024-09-05 15:32:19 +02:00
Rouven Seifert 805484dd0b
matrix: allow olm as insecure 2024-09-05 15:32:03 +02:00
Rouven Seifert 173d5e693d
updates 2024-09-05 2024-09-05 15:26:22 +02:00
Rouven Seifert fc01acbc46
mediawiki: remove VisualEditor 2024-09-05 15:25:19 +02:00
Lyn Fugmann 096a04e00c
forgejo: disable federation again for now
we have to update to Forgejo 8.x and test if it does leak all existing
user accounts, and if it's possible to prevent that.
2024-09-04 16:52:42 +02:00
Rouven Seifert 8177e8407a
forgejo: properly configure runner 2024-09-04 12:00:59 +02:00
Rouven Seifert 46b0bfaa8d
updates 2024-09-03 2024-09-03 21:23:56 +02:00
Jonas Gaffke c98206231c
Merge branch 'forgejo-runner' 2024-09-03 11:27:14 +02:00
Rouven Seifert f54d5fd867 forgejo actions: disable native for now 2024-09-03 11:24:41 +02:00
Rouven Seifert 5286041789 forgejo: initial runner configuration 2024-09-03 11:24:41 +02:00
quitte 703002d148 forgejo: allow *.ifsr.de webhooks 2024-09-03 10:44:26 +02:00
quitte 382bbc6601 forgejo: federation 2024-09-03 10:17:25 +02:00
quitte 6416be37f5 kanboard: move away from podman because of nftables and podman bug 2024-09-02 11:14:02 +02:00
quitte 23a5062f7b kanboard: update 2024-09-02 10:34:23 +02:00
quitte a6ada675df save the teich!!! 2024-09-02 09:49:25 +02:00
Rouven Seifert e470b83cb6
keycloak: remove dangling file 2024-09-01 22:40:52 +02:00
Benno Fünfstück c1a0b67261 add hyperilo reverse proxy 2024-09-01 21:39:45 +02:00
Rouven Seifert 0d0512a539
keycloak: add ifsr theme 2024-08-31 22:15:42 +02:00
Rouven Seifert c4d2b5fd08
readd stream.ifsr.de 2024-08-31 13:48:18 +02:00
Rouven Seifert c5cc3bd8b8
updates 2024-08-31 2024-08-31 13:39:27 +02:00
Jonas Gaffke 923d8a8697 minecraft: allow monitoring ip 2024-08-29 07:59:46 +02:00
Rouven Seifert a506e7d550
updates 2024-08-28 2024-08-28 16:38:24 +02:00
Rouven Seifert 62b344a2c2
minecraft: switch to fabric 2024-08-26 13:53:44 +02:00
Rouven Seifert 72566b656a
updates 2024-08-23 2024-08-23 13:48:08 +02:00
quitte ab1e4d10ee update 2024-08-21 2024-08-21 18:13:05 +02:00
quitte f268507d85 base: add yazi 2024-08-21 18:07:15 +02:00
Rouven Seifert df82b2e35b
updates 2024-08-20 2024-08-20 20:21:06 +02:00
Rouven Seifert 7d1cf705ee
updates 2024-08-14 2024-08-14 14:03:32 +02:00
Rouven Seifert 697df17b33
updates 2024-08-13 2024-08-13 16:49:57 +02:00
Rouven Seifert 530570699a
updates 2024-08-12 2024-08-12 16:01:18 +02:00
Rouven Seifert 3fae2321f3
updates 2024-08-07 2024-08-07 11:39:49 +02:00
Rouven Seifert 00104e593c
updates 2024-08-01 2024-08-01 16:26:34 +02:00
Rouven Seifert 33497714db
updates 2024-07-30 2024-07-30 13:01:00 +02:00
Rouven Seifert d7389d41da
updates 2024-07-27 2024-07-27 13:40:58 +02:00
Lyn Fugmann 42b3613b95
add mailman error fix 2024-07-26 13:10:36 +02:00
Rouven Seifert 799c9a67ff
logging: fix filemodes 2024-07-24 10:53:35 +02:00
Rouven Seifert 6d6e00f5bf
bluemap: render hourly 2024-07-22 18:09:36 +02:00
Rouven Seifert 49d48dc8d4
minecraft: fix server and init bluemap 2024-07-22 18:05:26 +02:00
Rouven Seifert 7a9e841a5f
treewide: format 2024-07-22 18:05:07 +02:00
Rouven Seifert 85f8932908
minecraft-server: init 2024-07-22 13:26:53 +02:00
Rouven Seifert 21a1000dad
updates: 2024-07-19 2024-07-19 10:58:00 +02:00
Rouven Seifert fe5836b8c9
updates 2024-07-15 2024-07-15 17:15:39 +02:00
Rouven Seifert 340781cafd
rspamd: allow more regexes in blacklists 2024-07-14 14:32:25 +02:00
Rouven Seifert 2fc48b6708
updates 2024-07-12 2024-07-12 14:02:43 +02:00
Rouven Seifert 3480be73ef
updates 2024-07-07 2024-07-07 14:04:55 +02:00
Rouven Seifert e027043637
decisions: disable faulty service 2024-07-05 13:25:22 +02:00
Rouven Seifert 4a2984115f
mail: fix learing scripts 2024-07-05 13:25:06 +02:00
Rouven Seifert 8426ca4c6a
nix: flake update 2024-07-04 11:10:41 +02:00
Rouven Seifert d2e06a075e
nginx: disable http/3
quictls is unmaintained for 5 months now
2024-07-02 10:43:23 +02:00
Rouven Seifert 4df70a68cc
nix: flake update 2024-07-02 10:35:44 +02:00
Rouven Seifert b8c52bf8f4
nix: flake update 2024-07-01 11:38:26 +02:00
Rouven Seifert 6814cd7485
nix: flake update 2024-06-28 13:43:07 +02:00
Rouven Seifert 5a3fdbb77e
nix: flake update 2024-06-25 17:38:19 +02:00
Rouven Seifert 033e1fad2d
drop nixos-unstable 2024-06-21 18:47:49 +02:00
Rouven Seifert a971e3f100
nextcloud: update to 29 2024-06-21 14:59:46 +02:00
Rouven Seifert a0cb59cd48
rspamd: init reputation module 2024-06-21 14:59:00 +02:00
Rouven Seifert d01694587a
mlx5_core got fixed 2024-06-21 14:55:59 +02:00
Rouven Seifert fe1add7e9d
dovecot fixes 2024-06-21 14:46:36 +02:00
Rouven Seifert ef50b987a4 Merge pull request 'nixos: upgrade to 24.05' (#93) from upgrade-24.05 into main
Reviewed-on: #93
2024-06-21 13:35:26 +02:00
Rouven Seifert 97de6f6489
fix warnings 2024-06-21 13:31:41 +02:00
Rouven Seifert 54a86b59ed
imap: disable port 143 2024-06-20 13:13:10 +02:00
Rouven Seifert 121f077fd0
Revert "web: init crimecampus"
This reverts commit 05152b6db4.
2024-06-16 18:30:08 +02:00
Rouven Seifert f1c3ecffe2
upstream loose changes on quitte 2024-06-16 18:29:36 +02:00
Rouven Seifert 059a4ebf0e
nixos: upgrade to 24.05 and fix errors 2024-06-16 18:12:57 +02:00
Rouven Seifert 05152b6db4
web: init crimecampus 2024-05-25 15:36:33 +02:00
Rouven Seifert 6a8559fb33
nix: flake update 2024-05-25 15:35:35 +02:00
quitte 66519d8196 decisions: set network mode host 2024-05-19 11:41:38 +02:00
quitte 1c8fe9ec66 directus: undo network port mapping: for host db access network mode host required 2024-05-19 11:38:58 +02:00
quitte 68138c0a31 podman: add dive and podman-tui 2024-05-19 11:34:46 +02:00
quitte c7f3120c9d kanboard: update 2024-05-19 11:29:25 +02:00
quitte 616b3c64f7 ese directus: use port mapping insted of network mode=host 2024-05-19 11:25:15 +02:00
quitte bb697f3a50 decisions: use port mapping insted of network mode=host 2024-05-19 11:25:03 +02:00
quitte b34c53ddf8 podman: conf in extra file 2024-05-19 11:21:30 +02:00
quitte c8afe48290 use podman and kanboard with podman 2024-05-19 11:16:49 +02:00
quitte 16f8ec19f9 firewall: allow ldaps from podman 2024-05-19 11:15:58 +02:00
quitte 7f00d6746a disable struktur-bot 2024-05-19 11:15:07 +02:00
Jonas Gaffke 0c19d4e565
sops: fix kanboard conf 2024-05-19 11:14:27 +02:00
Jonas Gaffke fa964bf950
sops: add kanboard conf 2024-05-18 10:28:15 +02:00
Rouven Seifert 727f5464ae
keycloak: explain things 2024-05-14 18:59:43 +02:00
Rouven Seifert f5f4bf1b24
keycloak: use from unstable 2024-05-14 18:57:23 +02:00
Rouven Seifert b70c5b14b3
nix: flake update 2024-05-14 18:35:01 +02:00
Rouven Seifert 763a71c93f
initrd-ssh: fix shell 2024-05-14 14:08:21 +02:00
Rouven Seifert 071c0aa464
ldap: fix dex line 2024-05-13 15:50:34 +02:00
Rouven Seifert c595af81e7
nix: flake update 2024-05-08 16:12:10 +02:00
Rouven Seifert 077138401e
dex: deconfigure 2024-05-08 15:37:19 +02:00
Rouven Seifert cb828a2188
decision: move to keycloak 2024-05-08 14:10:46 +02:00
Rouven Seifert 7b7e8858cf
secrets: cleanup 2024-05-08 14:08:05 +02:00
Rouven Seifert f40e47f871
mediawiki: fix account migration 2024-05-08 12:29:07 +02:00
Rouven Seifert 7c87808bc1
mediawiki: update secret 2024-05-08 11:54:11 +02:00
Rouven Seifert 8ea250e387
mediawiki: enable keycloak 2024-05-08 11:47:07 +02:00
Rouven Seifert a339235b33
postgres: add more databases to the backup 2024-05-08 11:41:47 +02:00
Rouven Seifert 02535cca08
grafana: configure oidc 2024-05-08 00:09:40 +02:00
Rouven Seifert 5384918ce6
directus: fix sso 2024-05-07 11:57:15 +02:00
Rouven Seifert 6abc1e75b9
directus: configure openid connect 2024-05-07 11:10:59 +02:00
Rouven Seifert 395ca48ac0
padlist: remove dex configuration 2024-05-06 23:51:28 +02:00
Rouven Seifert 6a2bcecb5e
ifsr.de: add sso redirect 2024-05-06 22:59:48 +02:00
Rouven Seifert a832b8d2a5
keycloak: fix things 2024-05-06 17:05:22 +02:00
Rouven Seifert 2c4be79f32 Merge pull request 'keycloak: init' (#92) from keycloak into main
Reviewed-on: #92
2024-05-06 16:57:53 +02:00
Rouven Seifert 5294cd68f8
keycloak: init 2024-05-06 11:24:21 +02:00
Rouven Seifert 4fa9a2fe7d
treewide: cleanup with deadnix 2024-05-06 11:21:12 +02:00
Rouven Seifert 5930da6bdf
ssh: fix type 2024-05-06 11:13:49 +02:00
Rouven Seifert 81ac3b4c0d
ssh: disable password login 2024-05-06 11:12:19 +02:00
Jonas Gaffke 7630dc4494
decisions: use newer image 2024-05-06 11:08:41 +02:00
Jonas Gaffke 993a554396
sops: decisions env 2024-05-05 09:40:31 +02:00
Rouven Seifert bdc6185fce
grafana: fix root_url 2024-05-02 19:33:50 +02:00
Rouven Seifert 197956ea90
prometheus: patch the postfix exporter to catch rspamd rejects 2024-05-02 11:23:13 +02:00
quitte 1f4e9a620b trying to get postfix running 2024-05-02 10:48:26 +02:00
quitte ab5df354ff Merge branch 'monitoring' of ifsr.de:wurzel/fruitbasket into monitoring 2024-04-30 14:23:46 +02:00
Joachim Stramke cf7ff37367 adding postfix to monitoring 2024-04-30 14:22:50 +02:00
quitte f0c73a1763 Merge branch 'monitoring' of ifsr.de:wurzel/fruitbasket into monitoring 2024-04-29 17:10:37 +02:00
quitte d92eff80ce fixing postgres warning 2024-04-29 17:10:35 +02:00
Joachim Stramke d1147621e1 changing scrape intervall 2024-04-29 17:09:37 +02:00
Joachim Stramke 3f47b32983 add first node 2024-04-29 15:12:52 +02:00
quitte 7526b9273b making grafana work 2024-04-29 15:09:56 +02:00
quitte 795e3db47f Merge branch 'main' into monitoring
merging master in monitoring
2024-04-29 14:30:23 +02:00
Rouven Seifert 126cff2263
quitte: pin kernel to 6.6.27
6.6.28 broke the network driver
2024-04-29 14:26:49 +02:00
tenksom 9327314ec9 create grafana and prometheus setup 2024-04-29 14:21:58 +02:00
Rouven Seifert d03f4c6fb1
initrd: try loading network modules in stage 1 2024-04-26 22:40:30 +02:00
Rouven Seifert ebe977672a
mailman: restrict registration to tud nets 2024-04-26 22:40:18 +02:00
Rouven Seifert 579ad274d5
nix: flake update 2024-04-26 09:47:36 +02:00
Rouven Seifert 15299bcb99
nix: flake update 2024-04-26 09:40:21 +02:00
Rouven Seifert d5ab09207a
core: set zsh as default shell for the root user 2024-04-16 21:44:48 +02:00
Rouven Seifert 375674b1b4
nginx: fix the http3 wordpress fix 2024-04-16 20:51:16 +02:00
Rouven Seifert 6cd1ba6aa5
Revert "nix: update course-management"
This reverts commit f24793bbb6.
2024-04-16 20:38:07 +02:00
Rouven Seifert 08893439e7
http3: attempt a fix for wordpress sites 2024-04-16 20:36:44 +02:00
Rouven Seifert 0d4283f109
Revert "nginx: disable http3 to prevent wordpress error"
This reverts commit 8606e89c03.
2024-04-16 20:32:29 +02:00
Rouven Seifert ceca1b3798
tomate: remove fail2ban
- Not really needed any more
2024-04-16 20:21:16 +02:00
Rouven Seifert 3a47c43741
tomate: use zsh as default shell 2024-04-16 18:50:51 +02:00
Rouven Seifert f24793bbb6
nix: update course-management 2024-04-16 13:58:32 +02:00
Rouven Seifert 5b95918c29
tomate: configure ifsr-apb network 2024-04-16 10:58:35 +02:00
Rouven Seifert 83db5399d7
quitte: format hardware config 2024-04-14 11:40:00 +02:00
Rouven Seifert 4b173581dc
mount boot drives with the nofail option
One drive failure shouldn't block the entire boot
2024-04-14 11:39:11 +02:00
Rouven Seifert be638b274d
systemd-boot: copy the entire bootloader to the second disc on every switch 2024-04-14 11:35:47 +02:00
Rouven Seifert c534e2a8e1
nix-serve: use nix-serve-ng 2024-04-12 11:21:52 +02:00
Rouven Seifert c04bef7173
forgejo: move into dedicated folder and enable initial action support 2024-04-11 15:27:10 +02:00
Rouven Seifert 65253342a6
remove github actions 2024-04-11 15:02:53 +02:00
Lyn Fugmann cc98ba62b3
forgejo: add migration fix patch 2024-04-11 14:04:10 +02:00
Rouven Seifert 5edc459dba
mailman: prevent sending emails to unknown accounts 2024-04-10 10:46:18 +02:00
Jonas Gaffke 8606e89c03 nginx: disable http3 to prevent wordpress error 2024-04-09 18:38:59 +02:00
Rouven Seifert 31901ddffe
Revert "network: use TUD ntp servers"
This reverts commit a87ecffa6b.

Doesn't work. Nevermind
2024-04-08 18:42:48 +02:00
Rouven Seifert a87ecffa6b
network: use TUD ntp servers 2024-04-08 18:39:14 +02:00
Rouven Seifert 3b48a937c8
nightline & ewsp: add www. subdomain 2024-04-04 17:12:38 +02:00
Rouven Seifert 9dd71f8b8c
nix: flake update 2024-04-04 16:14:03 +02:00
Rouven Seifert 913f410813
Merge pull request #89 from fsr/http3
nginx: enable http3
2024-04-04 14:09:14 +02:00
Rouven Seifert a0132fa7cf
nginx: enable http3 2024-04-03 14:59:57 +02:00
Rouven Seifert b12ed4b803
zfs: add some maintenance services 2024-04-01 16:12:53 +02:00
Rouven Seifert 2d03a3dffd
nix: flake update 2024-03-29 22:30:20 +01:00
Rouven Seifert 58e9794dff
network: enable lldp 2024-03-28 23:49:49 +01:00
Rouven Seifert 7e03d4574f
treewide: formatting 2024-03-28 22:10:39 +01:00
Rouven Seifert aa86572079
activation: remove initrd 2024-03-28 22:08:25 +01:00
Rouven Seifert 6bfd7c8e9c
logging: give up on dates in logrotate 2024-03-28 22:02:09 +01:00
Rouven Seifert d482e15bcb
forgot about tomate 2024-03-28 21:01:32 +01:00
Rouven Seifert 4334b5ef50
treewide: minor cleanups 2024-03-28 20:55:47 +01:00
Rouven Seifert f2af8d0a75
quitte: move back to bare-metal
Das Proxmox ist tot. Lang lebe NixOS!
2024-03-28 18:06:41 +01:00
tenksom e18a99c452 fixing user groups for websides
Co-authored-by: fugi <me@fugi.dev>
Co-authored-by: tenksom <joachim@stramke.com>
2024-03-28 16:01:12 +01:00
Rouven Seifert 4a33da7ec2
Merge pull request #88 from fsr/streamlined-acme
nginx: streamline all `forceSSL` and `enableACME` directives in one file
2024-03-25 22:07:46 +01:00
Rouven Seifert 4f1f88a779
nginx: streamline all forceSSL and enableACME directives in one file 2024-03-25 19:34:47 +01:00
Rouven Seifert bedee4f90c
nix: flake update 2024-03-24 23:40:26 +01:00
Rouven Seifert d086eed901
network: clean up secrets 2024-03-21 15:49:50 +01:00
Rouven Seifert 3be5380c58
quitte: network fixes 2024-03-21 15:47:32 +01:00
Rouven Seifert ddd2514cdb
activation script: fix kernel warning 2024-03-19 11:30:00 +01:00
Rouven Seifert 632578f5b5
nix: flake update 2024-03-19 11:28:22 +01:00
Jonas Gaffke ba2f0fb86b
grav: try dex login 2024-03-17 15:48:54 +01:00
Rouven Seifert cf49b8dd13
Merge pull request #87 from fsr/ftp-timezone-fix
fixing wrong timezone on ftp
2024-03-17 00:42:21 +01:00
tenksom 30b4bf9540
fixing wrong timezone on ftp 2024-03-16 22:41:36 +01:00
Rouven Seifert 1e689b6c40
Merge pull request #86 from fsr/log-retention
core: configure log retention
2024-03-15 11:33:15 +01:00
Rouven Seifert da871679f4
nix: flake update 2024-03-15 00:10:47 +01:00
Rouven Seifert d3da0eab79
rspamd: fix dmarc domain 2024-03-15 00:10:19 +01:00
Rouven Seifert 66a554a13b
core: configure log retention 2024-03-14 23:59:42 +01:00
Rouven Seifert d1c2ece3ea
Merge pull request #85 from fsr/refactoring
modules: some refactoring
2024-03-14 18:52:14 +01:00
Rouven Seifert 7023c328d9
mail: move mailman options to mailman.nix 2024-03-14 00:09:06 +01:00
Rouven Seifert 39320d987c
matrix: move into folder 2024-03-12 12:34:20 +01:00
Rouven Seifert fea01b0b2e
courses: move into folder 2024-03-12 12:11:44 +01:00
Rouven Seifert 527651706e
options: move to tree root 2024-03-12 12:06:21 +01:00
Rouven Seifert 01bcc9ecad
refactor: streamline core modules into dedicated folder 2024-03-12 12:03:29 +01:00
Rouven Seifert b429e6468f
refactor: streamline all websites into one folder 2024-03-12 11:49:01 +01:00
Rouven Seifert 71fdea75be
refactor: split mail into modules 2024-03-12 11:41:04 +01:00
Rouven Seifert 3979e9b2b9
nix: flake update 2024-03-11 23:22:35 +01:00
Rouven Seifert 736c84cce9
treewide: ran deadnix 2024-03-11 22:49:12 +01:00
Rouven Seifert 05a5e085d8 ftp: fix content type for komplefprüfungen 2024-03-11 12:04:31 +01:00
Rouven Seifert d1fca836b9
mail: match smtp banner to rDNS 2024-03-08 14:41:03 +01:00
Rouven Seifert 8fe2173040
rspamd: fix rspamd signing for mailman
Mails to the big mailing lists currently fail dkim checking since we add
a footer and rewrite the subject. To not trigger DMARC fails, we sign all
outgoing mails from local networks with our domain.
2024-03-07 14:56:21 +01:00
Rouven Seifert b9559cf5ce
pad: wiki: add robots.txt 2024-03-06 20:59:11 +01:00
Rouven Seifert c04e11a958
mailman: add robots.txt 2024-03-06 20:49:02 +01:00
Lyn Fugmann 71cb425527
Merge remote-tracking branch 'origin/portunus2' 2024-03-06 12:44:18 +01:00
Rouven Seifert 08e43cf903
Merge pull request #82 from fsr/opendkim
Disable opendkim
2024-03-05 17:25:47 +01:00
Rouven Seifert 1955aa3cb2
rspamd: change dkim selector 2024-03-05 17:11:59 +01:00
Rouven Seifert c36a242b35
rspamd: remove faulty allow_hdrfrom_mismatch option 2024-03-05 17:05:37 +01:00
Lyn Fugmann 2d7ed61384
use portunus from nixos-unstable 2024-03-05 15:24:28 +01:00
Rouven Seifert 71bc8234a2
opendkim: disable 2024-03-04 22:44:53 +01:00
Rouven Seifert 8e8cc54f75 mail: configure periodically sent dmarc aggregate reports 2024-03-04 22:40:04 +01:00
Rouven Seifert a1bfa3f7e1
ldap: switch to sssd on quitte 2024-03-04 22:14:24 +01:00
Rouven Seifert b454ad2437
secrets: prepare sssd for quitte 2024-03-04 21:51:30 +01:00
Rouven Seifert a3e15cc105
rspamd: migrate redis to unix sockets 2024-03-04 19:47:09 +01:00
Rouven Seifert 4e1cf47b7b
mail: test rspamd signing with rspamd 2024-03-04 12:08:50 +01:00
Rouven Seifert 1e47c01032
ulimit: limit nix builders to 10000 processes at once 2024-03-03 11:39:52 +01:00
Rouven Seifert d611cc5a26
ulimit: limit maximum number of processes per user
- Limits the number of processes a user can start to 2000
  Mostly in place to prevent fork bombs taking down the host.
- If anyone encounters problems with this number we can raise it
2024-03-03 11:34:39 +01:00
Rouven Seifert 017a807a7c
nix: update flake inputs 2024-03-02 18:50:21 +01:00
Rouven Seifert 02e661890a
nix: restructure flake and add devshell 2024-03-02 18:50:08 +01:00
Lyn Fugmann 0cf95c4c34
Add hendrik's pgp and ssh keys 2024-02-29 16:24:21 +01:00
Lyn Fugmann 4f5148fbf4
Show warning when kernel version changes 2024-02-29 12:03:02 +01:00
Lyn Fugmann 7f70ae990c
ftp: custom 403 error page 2024-02-27 14:06:06 +01:00
Rouven Seifert b3ee1d8e23
nix: flake update 2024-02-25 23:27:39 +01:00
Rouven Seifert ae74749c28
tomate: add ifsr cache 2024-02-25 23:26:13 +01:00
Rouven Seifert 794b565e07
nix-serve: fix port 2024-02-25 23:16:47 +01:00
Rouven Seifert a364e28bb8
nix-serve: init at cache.ifsr.de 2024-02-25 23:10:43 +01:00
Rouven Seifert e4bb60adff
padlist: remove
moved to https://github.com/fsr/padlist
2024-02-25 22:16:37 +01:00
Rouven Seifert 522351905c
quitte: enable memory resource control
Limits the Memory of some important slices via systemd cgroup management.

- nix-daemon may not use more than 32 GB of Memory
- all users together may not use more than 32GB of Memory

See man systemd.resource-control(5) for more detailed information.
2024-02-25 21:52:36 +01:00
Rouven Seifert be6fbd9d67
nix: update flake 2024-02-22 20:10:36 +01:00
Rouven Seifert f9fca746f7
decisions: fix secret 2024-02-22 12:20:21 +01:00
Rouven Seifert 7b37644a5b
nix: update flake 2024-02-22 12:19:41 +01:00
Rouven Seifert d84ad31126
mail: configure optional archive mailbox
This enables the 'Archive' special use for Mailboxes according to
RFC 6154 [0]. Most Mailclients support this out of the box

[0] https://www.rfc-editor.org/rfc/rfc6154.html
2024-02-21 14:02:26 +01:00
Rouven Seifert 22ca2010a0
initrd: fix command to unlock disk 2024-02-19 11:35:22 +01:00
Rouven Seifert 813628aea4
nix: updates 2024-02-18 14:59:24 +01:00
Rouven Seifert fecff52804
ewsp: fix nginx group 2024-02-18 14:58:29 +01:00
quitte 8846096ce7 Merge branch 'main' of github.com:fsr/fruitbasket 2024-02-18 12:54:38 +01:00
tenksom a97f94e4b1 fixed nginx group for nightline 2024-02-18 12:54:21 +01:00
Rouven Seifert ca6c2f81d0
nix: flake update 2024-02-16 18:48:33 +01:00
Rouven Seifert 8d081ce157
nix: flake update 2024-02-16 18:44:28 +01:00
Rouven Seifert f3585fcc97
nix: flake update 2024-02-12 19:10:36 +01:00
Jonas Gaffke b9a216ad59
decisions: add dex openid connect client 2024-02-05 22:01:11 +01:00
quitte ef42822101 Merge branch 'main' of github.com:fsr/fruitbasket 2024-02-04 13:08:18 +01:00
quitte bf6585a833 decisions: fix typs 2024-02-04 13:08:14 +01:00
quitte 594e672df4 decisions: add timer for tex to db 2024-02-04 13:07:41 +01:00
Rouven Seifert 6d6585c78f
formatting 2024-02-03 20:49:47 +01:00
Jonas Gaffke 81a83d7989
strukturbot: move to quitte 2024-02-03 20:48:34 +01:00
Rouven Seifert 826758e138
decisions: init secrets 2024-02-03 20:17:06 +01:00
Jonas Gaffke cd10890f1b
decisions: init 2024-02-03 20:05:52 +01:00
Rouven Seifert 7e2dc399bb
formatting 2024-02-03 20:03:45 +01:00
Rouven Seifert 175e2750ce
quitte: fix hosts 2024-02-03 20:02:15 +01:00
Rouven Seifert 948570032b
strukturbot: init secrets 2024-02-03 19:56:14 +01:00
Rouven Seifert 2e5f4fbe23
nextcloud: deprecate oc.ifsr.de 2024-02-02 21:53:54 +01:00
Rouven Seifert e198002d60
mysql: enable backups 2024-02-02 21:41:44 +01:00
Rouven Seifert e70b57490e
formatting 2024-02-02 21:18:42 +01:00
Jonas Gaffke 5b2ca5141c mysql: bind to localhost 2024-02-02 21:13:44 +01:00
Rouven Seifert c0c9249e5a
remove old wiki module 2024-02-02 21:09:58 +01:00
Rouven Seifert e1325a329a
wiki: move to wiki 2024-02-02 21:08:30 +01:00
Jonas Gaffke 454394981e quitte: add nightline and fsrewsp sites 2024-02-02 20:26:37 +01:00
Rouven Seifert dbe12fbfeb
ese: move to quitte 2024-02-02 19:54:06 +01:00
Jonas Gaffke cc09c14143 quitte: add mysql 2024-02-02 17:41:34 +01:00
Rouven Seifert 4177a2ba0a
directus: init secrets 2024-02-02 16:59:42 +01:00
Rouven Seifert b8c31b4e4a
initrd: fix network 2024-01-29 16:23:56 +01:00
Rouven Seifert ccd6290fb7
Merge pull request #81 from fsr/initrd-ssh
quitte: enable ssh in initrd
2024-01-29 16:11:00 +01:00
Rouven Seifert 48683c6b2f
nextcloud: update to nextcloud28 2024-01-29 16:04:51 +01:00
Rouven Seifert 6b541c0fac
nix: flake update 2024-01-29 15:59:44 +01:00
Rouven Seifert a9f6bc3ed0
print: initial config 2024-01-29 14:51:37 +01:00
Rouven Seifert 0e2d68fb26
postfix: fix format 2024-01-28 14:26:12 +01:00
Rouven Seifert 583990556e
postfix: lift message size limit 2024-01-28 14:25:02 +01:00
Lyn Fugmann 316ffbb9e0
quitte: enable ssh in initrd 2024-01-25 19:40:22 +01:00
Rouven Seifert 4d0edc7280
nix: flake update 2024-01-25 18:23:27 +01:00
Rouven Seifert 69553c0645
Merge pull request #80 from fsr/sender-verification
verify mail senders
2024-01-24 17:33:30 +01:00
Rouven Seifert ffeb47cd5e
verify mail senders 2024-01-24 16:02:58 +01:00
Rouven Seifert 93baff94f1
formatting 2024-01-13 17:40:20 +01:00
Rouven Seifert 01f5df464f
zammad: set loglevel to warn 2024-01-13 17:36:22 +01:00
Rouven Seifert d30e35cd8f
tomate: fix printing 2024-01-13 16:38:40 +01:00
Rouven Seifert 1d4da79c16
fix forgejo homedir 2024-01-10 15:23:56 +01:00
Rouven Seifert 94c2a2de5d
fix integer formatting 2024-01-07 01:22:42 +01:00
Rouven Seifert d6571ac695
bacula: restrict port to agdsn networks 2024-01-07 01:16:37 +01:00
Rouven Seifert 0084a02568
git: set loglevel to WARN
- gitea is crawled by some bots and logs every request
2024-01-06 16:07:48 +01:00
Rouven Seifert bde7d0b3d4
matrix: disable spammy logging 2024-01-06 16:01:32 +01:00
Jonas Gaffke 9f465f4f66 dex: customize login page 2024-01-05 16:49:29 +01:00
quitte 693154fe1a padlist: dex openid connect login instead of basic auth 2024-01-05 15:57:32 +01:00
Rouven Seifert dd99021da1
nix: flake update 2024-01-02 14:30:44 +01:00
Rouven Seifert 98f0e6e491
tomate: fix missing module causing a failed check 2024-01-02 14:28:58 +01:00
Jonas Gaffke 2ed00fb4c0 quitte: add vscode server 2024-01-01 17:23:01 +01:00
Jonas Gaffke a336061b1d
sops: add dex oicd client secret for padlist tool 2024-01-01 16:26:43 +01:00
Rouven Seifert 83a668b9f0
bacula: fix keys 2023-12-26 19:15:07 +01:00
Rouven Seifert 68202e2d64
sops: rotate again and add jonasga
apparently key rotation doesn't mean actually updating the keys
2023-12-26 18:18:53 +01:00
Rouven Seifert 86cd033cba
forgejo: fix prestart 2023-12-26 17:56:32 +01:00
Rouven Seifert 665c69ca20
sops: fix phil 2023-12-26 17:48:01 +01:00
Jonas Gaffke eb3eb02a53
sops: add jonasga pgp key 2023-12-26 17:17:42 +01:00
Rouven Seifert 3f4c304bc9
sops: rotate some passwords 2023-12-26 16:21:39 +01:00
Rouven Seifert 0330129ec2
sops: remove old key 2023-12-26 16:10:05 +01:00
Rouven Seifert b8e950d5d0
postfix: apply fix against smtp mail smuggling 2023-12-22 23:39:09 +01:00
Rouven Seifert 956ce2fb35
nix: flake update 2023-12-19 23:17:31 +01:00
Rouven Seifert 12fd11d18e
postgres: fix table names in backup 2023-12-18 12:06:09 +01:00
Rouven Seifert 11bdb6b8f7
zsh: disable root git reminder 2023-12-18 12:04:35 +01:00
Jonas Gaffke cc39b86e78 base: add unzip package 2023-12-15 16:03:17 +01:00
Jonas Gaffke 956908e981 userdir: add robots.txt 2023-12-15 15:48:40 +01:00
Jonas Gaffke 9607dd1b54 wiki: format 2023-12-15 12:05:43 +01:00
Jonas Gaffke 3aeec71dd4 wiki: add SyntaxHighlight extension 2023-12-15 12:02:15 +01:00
Jonas Gaffke 5ce0b2d4ec wiki: update extensions 2023-12-15 11:19:38 +01:00
Rouven Seifert 7022528b62
fix phil postgres 2023-12-14 17:32:13 +01:00
Rouven Seifert 02de2df6d3
Merge pull request #79 from fsr/nixos-23.11
update flake to 23.11
2023-12-14 15:53:28 +01:00
Rouven Seifert f57babf97c
use new bacula fixes 2023-12-14 15:51:52 +01:00
Rouven Seifert 8acfe6ee0c
fix checks 2023-12-14 15:42:10 +01:00
Rouven Seifert 42c2cce513
update flake to 23.11 2023-12-14 15:07:02 +01:00
Rouven Seifert 63551dd42a
tomate: enable login per u2f 2023-12-12 18:12:39 +01:00
Rouven Seifert 0809f266fc
flake: update kpp 2023-12-12 14:17:23 +01:00
Rouven Seifert 4e569a8f7b
Merge pull request #78 from fsr/sssd
tomate: init sssd
2023-12-12 13:18:14 +01:00
Rouven Seifert 2eb832c8a9
better homedir creation 2023-12-12 13:04:03 +01:00
Rouven Seifert 1789ac741d
formatting 2023-12-12 13:01:08 +01:00
Rouven Seifert 220136af25
tomate: init sssd 2023-12-12 12:57:47 +01:00
Rouven Seifert 3ee4380328
tomate: prepare secrets for sssd 2023-12-12 11:39:38 +01:00
Rouven Seifert a16337f84f
tomate: secret consistency 2023-12-12 11:35:27 +01:00
Rouven Seifert 7d4a6e08ef
tomate: init secrets 2023-12-12 11:31:48 +01:00
Rouven Seifert 2b5706b987
zammad: enable backup 2023-11-29 23:29:59 +01:00
Rouven Seifert fd5e0108f6
quitte: allow ldaps access 2023-11-28 23:00:41 +01:00
Rouven Seifert 2d73376a60
tomate: enable fail2ban 2023-11-28 22:44:12 +01:00
Lyn Fugmann 964183a0e7
userdir: increase upload size limit 2023-11-28 18:34:51 +01:00
Rouven Seifert 549fffcab2
Merge pull request #77 from fsr/tomate
tomate: init
2023-11-28 11:57:42 +01:00
Rouven Seifert 8b9099fe04
tomate: remove fsr from wheel 2023-11-28 11:48:11 +01:00
Rouven Seifert 7197d6b2e2
tomate: add missing modules 2023-11-28 11:42:50 +01:00
Rouven Seifert 71f197c2f5
tomate: reformat 2023-11-28 11:40:04 +01:00
Rouven Seifert e86fdf1819
tomate: init 2023-11-28 11:37:35 +01:00
Rouven Seifert e04914e30d
nix: flake update 2023-11-20 21:30:37 +01:00
Lyn Fugmann b972d22997
matrix: use upstream ldap plugin
it has been updated and supports reading bind_password from a file now
2023-11-17 20:38:36 +01:00
quitte 8a8af52ec7 zammad: init 2023-11-17 18:18:35 +01:00
Rouven Seifert 65b2bff6b1
nix: flake update 2023-11-16 15:59:47 +01:00
Rouven Seifert 127ab9d92e
rspamd: add more headers 2023-11-16 00:07:22 +01:00
Rouven Seifert 4324dceddc
firewall: stop logging every refused connection 2023-11-14 14:00:22 +01:00
Rouven Seifert 7ad0c7d98e
bacula: close udp port
not needed for operation
2023-11-14 13:20:41 +01:00
Rouven Seifert 121a9f001e
ssh: enable mosh 2023-11-13 14:20:18 +01:00
Lyn Fugmann fe946150d7 nginx: refactor, remove hard coded vhost names 2023-11-13 11:12:58 +01:00
Rouven Seifert 87a5486114
nginx: fix newline 2023-11-13 10:04:12 +01:00
Rouven Seifert 075bc2b6fa
nginx: split logs per vhost 2023-11-13 09:51:07 +01:00
Lyn Fugmann 3e70f7a0fc
element-web: disable identity server 2023-11-10 15:42:58 +01:00
Rouven Seifert fd9e9c8b0b
nix: flake update 2023-11-10 00:03:41 +01:00
Rouven Seifert 2496192efc nextcloud: configure redis 2023-11-09 18:03:04 +01:00
Jonas Gaffke 5de01790c4 nextcloud: enable HEIC image preview 2023-11-09 15:35:26 +01:00
Jonas Gaffke 0dab62ebff postgres: increse max_connections to 1000 2023-11-09 15:29:42 +01:00
Lyn Fugmann 7e17d77b1d
nextcloud: migration changes 2023-11-08 18:40:11 +01:00
Rouven Seifert faddb9ea87
nix: flake update 2023-11-05 19:22:59 +01:00
Rouven Seifert 0eeac8391d mail: enable imap_filter_sieve 2023-11-03 11:08:42 +01:00
Rouven Seifert 85e6ebbc29
fail2ban: disable tor lists
some people have legimitate interest in accessing our services via tor
in case of abuse out of these networks this commit can be reverted
2023-11-02 22:50:23 +01:00
Rouven Seifert a9d4543da7
rspamd: whitelist tu networks 2023-11-01 22:45:21 +01:00
Rouven Seifert c038ea7ed9
nix: flake update 2023-10-28 17:36:10 +02:00
Rouven Seifert dd50175c58
httpd: limit number of spawned processes 2023-10-28 17:35:14 +02:00
Rouven Seifert 245d5bc498
fail2ban: use nftables 2023-10-28 17:34:55 +02:00
Rouven Seifert 9a5d048676
hydra: disable
Not in use and spams database connections
2023-10-28 17:34:07 +02:00
Rouven Seifert 7b3925deca
courses-phil: use systemd credentials to load the secrets 2023-10-23 15:08:33 +02:00
Rouven Seifert 6e269d8dc7
firewall: use nftables 2023-10-23 11:59:12 +02:00
Rouven Seifert 8eaf733126
fail2ban: whitelist tu ranges 2023-10-23 11:57:01 +02:00
Rouven Seifert 0899143b8c
formatting 2023-10-23 10:47:40 +02:00
Rouven Seifert 303888dfd9
nixify the manual 2023-10-23 10:27:30 +02:00
Rouven Seifert 75be7e22a3
mail: add keyword blacklist 2023-10-21 00:49:24 +02:00
Rouven Seifert 5171b2f443
nix: flake update 2023-10-21 00:05:29 +02:00
quitte 5270ab09e6 add btop package 2023-10-20 21:38:28 +02:00
Rouven Seifert 3763b8b106
fail2ban: enable incremental bantime 2023-10-20 16:57:02 +02:00
Rouven Seifert a8d1444ef9
Merge pull request #76 from fsr/fail2ban-mail
fail2ban: setup postfix and dovecot
2023-10-20 12:27:58 +02:00
Rouven Seifert 0712f02d40
fail2ban: setup postfix and dovecot 2023-10-19 14:24:11 +02:00
quitte 2058b8f955 add infoscreen, manual and sharepic websites 2023-10-19 11:54:15 +02:00
Rouven Seifert c360abe7d9
ftp: remove TUD private subnet
was added on kaki back then. Probably because of some routing misconfigurations
let's embrace some hope that this is now fixed
2023-10-18 23:30:16 +02:00
Rouven Seifert 5d01d02db4
nix: flake update 2023-10-17 19:11:36 +02:00
Rouven Seifert ddc7179312
kanboard: add short domain 2023-10-16 11:59:06 +02:00
quitte 94c9be356c kanboard: first version 2023-10-15 13:38:48 +02:00
quitte 5bdd64666f disable stream ese is over 2023-10-15 11:35:37 +02:00
Rouven Seifert 58acf5b98a
nix flake update 2023-10-12 23:25:54 +02:00
quitte 8c7ffab70e mautrix-telegram: enable again and small fix 2023-10-09 21:19:05 +02:00
Rouven Seifert e5b9d8b944
nix: flake update 2023-10-08 13:44:06 +02:00
Rouven Seifert 3d18969471
nginx: disable ip anonymizing 2023-10-08 13:43:04 +02:00
Rouven Seifert 5820741dd2
matrix: move to ifsr.de 2023-10-08 13:42:29 +02:00
Lyn Fugmann d48fb6c13a
setup fail2ban
block tor exit nodes
2023-10-04 18:49:12 +02:00
Rouven Seifert 23fb7747fb
Revert "temporarily show participants again in the course-management"
This reverts commit 39db962a2c.
2023-10-02 17:32:52 +02:00
quitte a9c8c03f08 userdir: disable php error display 2023-10-01 19:17:29 +02:00
Rouven Seifert 39db962a2c
temporarily show participants again in the course-management 2023-09-29 17:49:45 +02:00
Rouven Seifert 0f0b183f5a
nix: flake update 2023-09-29 17:49:08 +02:00
quitte 6d277b6814 courses-phil: add redirects 2023-09-28 13:34:58 +02:00
Rouven Seifert a2f49374e7
remove ldap test script 2023-09-28 13:33:18 +02:00
Rouven Seifert 55d7d67668
Merge pull request #73 from fsr/philo-kurse
courses: phil: init as container
2023-09-27 16:43:12 +02:00
quitte 3c17c0ad6a course-phil: on-metal fixes 2023-09-27 15:08:12 +02:00
Rouven Seifert a5d29c3338 sops: set sopsfile 2023-09-27 14:25:03 +02:00
Lyn Fugmann 7d7ac6c571
add courses-phil secrets 2023-09-27 14:23:22 +02:00
Rouven Seifert 8908b3bbff courses: phil: init as container 2023-09-27 14:20:11 +02:00
Rouven Seifert e4b26a640b
mail: set mailUser and mailGroup 2023-09-27 11:12:07 +02:00
Rouven Seifert aa1f91c5b4
mail: fix typo 2023-09-27 11:04:37 +02:00
Rouven Seifert 201fef3084
added global spam filtering script 2023-09-27 11:03:10 +02:00
Rouven Seifert 71f4c64022
nextcloud upgrade to 27 2023-09-24 16:06:10 +02:00
Rouven Seifert 84faec16f3
nix: flake update 2023-09-22 17:07:02 +02:00
Rouven Seifert 1b36010ad9
mail: disable pam authentication 2023-09-22 13:46:49 +02:00
Rouven Seifert 92efae76ed
rspamd: formatting fix 2023-09-21 21:50:36 +02:00
Rouven Seifert 7c15108f3d
rspamd: enable the neural module
so we can throw some buzzwords
2023-09-21 21:49:00 +02:00
Rouven Seifert 3b59947673
rspamd: configure dynamic blacklisting 2023-09-21 21:20:48 +02:00
quitte b35703040b nix: allow fetching the index from github 2023-09-20 22:20:49 +02:00
quitte bed0f24e94 format 2023-09-20 14:09:55 +02:00
quitte e739a60e66 userdir, zsh fixes 2023-09-20 14:07:50 +02:00
Rouven Seifert 7043532749
update kpp 2023-09-20 13:46:36 +02:00
Rouven Seifert d1da869558
Merge pull request #69 from fsr/zsh-improvements
add agdsn zsh config and comma
2023-09-20 08:26:21 +02:00
Rouven Seifert 06ec7d6e32
fix double promptinit 2023-09-19 21:08:53 +02:00
Rouven Seifert 0197610e3f
fix promptinit 2023-09-19 20:44:11 +02:00
Rouven Seifert dc65c4c5c7
don't use zsh as the default shell 2023-09-19 20:30:30 +02:00
Rouven Seifert e4e1cfd3d6
zsh: add agdsn config and comma 2023-09-19 16:03:41 +02:00
Hendrik Wolff da97f9e750 mail: Enable listescape globally 2023-09-19 14:37:07 +02:00
quitte 77c2248eee add helix editor 2023-09-19 10:33:03 +02:00
Rouven Seifert 3f9998c46d
flake: update inputs 2023-09-18 12:31:15 +02:00
Rouven Seifert 9393915efe
mail: disable the quota check for now 2023-09-18 09:48:55 +02:00
93 changed files with 4249 additions and 1359 deletions

View file

@ -1,27 +0,0 @@
name: main
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
check-flake:
name: Nixpkgs Formatting
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install Nix
uses: cachix/install-nix-action@v18
with:
extra_nix_config: |
experimental-features = nix-command flakes
- run: nix-channel --add https://nixos.org/channels/nixos-22.11 nixos
- run: nix-channel --update
- run: nix shell nixpkgs#nixpkgs-fmt -c nixpkgs-fmt . --check

View file

@ -1,34 +0,0 @@
name: main
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
check-flake:
name: Check Flake
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install Nix
uses: cachix/install-nix-action@v18
with:
install_url: https://releases.nixos.org/nix/nix-2.13.3/install
extra_nix_config: |
experimental-features = nix-command flakes
- uses: cachix/cachix-action@v12
with:
name: fruitbasket
authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
extraPullNames: nix-community
- run: nix build
- run: nix flake check

View file

@ -7,9 +7,11 @@ keys:
- &helene B43C3A8A92CA28486AC6C4E2F115100C787C1C19
- &fugi BF37903AE6FD294C4C674EE24472A20091BFA792
- &emmanuel E83F398E6423179FE4F63D4FF085CAD394DE329D
- &jonas A4F92BC7B792108A463995827C1F2DA2BC929412
- &joachim B1A16011B86BACB56ADB713DB712039D23133661
- &jonasga FB44F0746DF25F0B24A2EAE586C8A257C3EC82AB
- &hendrik FBBFAC260D9283D1EF2397DD3CA65E9DD6EB319D
- &quitte age1wvdnprpnq2rcc4se3zpx2p267n0apxg2jucvlm93e3pfj439ephqh2506t
- &tomate age18lwgjazaxujqgcc5j0gjllnykhtjn6p0q44jzrsk4au2a5k6nd9s77kd6d
creation_rules:
- path_regex: secrets/quitte\.yaml$
@ -21,9 +23,23 @@ creation_rules:
- *rouven
- *fugi
- *joachim
- *jonas
- *jonasga
- *hendrik
age:
- *quitte
- path_regex: secrets/tomate\.yaml$
key_groups:
- pgp:
- *bennofs
- *revol-xut
- *felix
- *rouven
- *fugi
- *joachim
- *jonasga
- *hendrik
age:
- *tomate
- path_regex: secrets/admin\.yaml$
key_groups:
- pgp:
@ -33,4 +49,5 @@ creation_rules:
- *rouven
- *fugi
- *joachim
- *jonas
- *jonasga
- *hendrik

View file

@ -9,11 +9,11 @@
"poetry2nix": "poetry2nix"
},
"locked": {
"lastModified": 1694358978,
"narHash": "sha256-gHWIIYJZepq1/3oFVkUkl0n52bRJWnNgmGaiZ2aGEwc=",
"lastModified": 1730751072,
"narHash": "sha256-+FQjzCNV3k8U4BfNcFmoZTRf8aO9ufn3s7kkzHj/b7s=",
"owner": "fsr",
"repo": "course-management",
"rev": "5ccbee8151c5caa519ebdb2ce2b8ec52b7749949",
"rev": "60b7062ce47ee9f0609e701ad5eb5e3e0a857ff2",
"type": "github"
},
"original": {
@ -22,16 +22,52 @@
"type": "github"
}
},
"ese-manual": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1730889586,
"narHash": "sha256-SLgo7UjWLaFaaUPFqzKbr9DLAGzm5kparfxuJHEpK3w=",
"ref": "refs/heads/main",
"rev": "a111147ce5eaea4f1d691afe1203e7529d68522d",
"revCount": 9,
"type": "git",
"url": "https://git.ifsr.de/ese/manual-website"
},
"original": {
"type": "git",
"url": "https://git.ifsr.de/ese/manual-website"
}
},
"flake-compat": {
"flake": false,
"locked": {
"lastModified": 1673956053,
"narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=",
"owner": "edolstra",
"repo": "flake-compat",
"rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9",
"type": "github"
},
"original": {
"owner": "edolstra",
"repo": "flake-compat",
"type": "github"
}
},
"flake-utils": {
"inputs": {
"systems": "systems"
},
"locked": {
"lastModified": 1687709756,
"narHash": "sha256-Y5wKlQSkgEK2weWdOu4J3riRd+kV/VCgHsqLNTTWQ/0=",
"lastModified": 1726560853,
"narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "dbabf0ca0c0c4bce6ea5eaf65af5cb694d2082c7",
"rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a",
"type": "github"
},
"original": {
@ -45,11 +81,47 @@
"systems": "systems_2"
},
"locked": {
"lastModified": 1687709756,
"narHash": "sha256-Y5wKlQSkgEK2weWdOu4J3riRd+kV/VCgHsqLNTTWQ/0=",
"lastModified": 1726560853,
"narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "dbabf0ca0c0c4bce6ea5eaf65af5cb694d2082c7",
"rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"flake-utils_3": {
"inputs": {
"systems": "systems_4"
},
"locked": {
"lastModified": 1681202837,
"narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "cfacdce06f30d2b68473a46042957675eebb3401",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"flake-utils_4": {
"inputs": {
"systems": "systems_5"
},
"locked": {
"lastModified": 1681202837,
"narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "cfacdce06f30d2b68473a46042957675eebb3401",
"type": "github"
},
"original": {
@ -65,11 +137,11 @@
]
},
"locked": {
"lastModified": 1693305731,
"narHash": "sha256-ku0FU1pn6eXGdoEx0Tg0Kp8c8wmd6TF7IrdOnX0Uco0=",
"lastModified": 1724255946,
"narHash": "sha256-YVT/QE2PCDzx4eq1i3PqOOpQVXJstN18e0sFB/UbAY0=",
"owner": "fsr",
"repo": "kpp",
"rev": "7c04f958bb652de680ae3311b6eab080ac64b3ad",
"rev": "ce98b985201a5453aee708a3fc13bbccf2357f8e",
"type": "github"
},
"original": {
@ -78,52 +150,133 @@
"type": "github"
}
},
"nix-github-actions": {
"inputs": {
"nixpkgs": [
"course-management",
"poetry2nix",
"nixpkgs"
]
},
"locked": {
"lastModified": 1729742964,
"narHash": "sha256-B4mzTcQ0FZHdpeWcpDYPERtyjJd/NIuaQ9+BV1h+MpA=",
"owner": "nix-community",
"repo": "nix-github-actions",
"rev": "e04df33f62cdcf93d73e9a04142464753a16db67",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "nix-github-actions",
"type": "github"
}
},
"nix-index-database": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1731209121,
"narHash": "sha256-BF7FBh1hIYPDihdUlImHGsQzaJZVLLfYqfDx41wjuF0=",
"owner": "nix-community",
"repo": "nix-index-database",
"rev": "896019f04b22ce5db4c0ee4f89978694f44345c3",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "nix-index-database",
"type": "github"
}
},
"nix-minecraft": {
"inputs": {
"flake-compat": "flake-compat",
"flake-utils": "flake-utils_3",
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1731375802,
"narHash": "sha256-CvWPEzrl2EA3xrtg9X6K8aqV7T5r0SaDz6PLpGA0yIY=",
"owner": "Infinidoge",
"repo": "nix-minecraft",
"rev": "b873a123366b9a62f9262414ada8d83b03f1f0bf",
"type": "github"
},
"original": {
"owner": "Infinidoge",
"repo": "nix-minecraft",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1694499547,
"narHash": "sha256-R7xMz1Iia6JthWRHDn36s/E248WB1/je62ovC/dUVKI=",
"lastModified": 1731239293,
"narHash": "sha256-q2yjIWFFcTzp5REWQUOU9L6kHdCDmFDpqeix86SOvDc=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "e5f018cf150e29aac26c61dac0790ea023c46b24",
"rev": "9256f7c71a195ebe7a218043d9f93390d49e6884",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-23.05",
"ref": "nixos-24.05",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-stable": {
"locked": {
"lastModified": 1693675694,
"narHash": "sha256-2pIOyQwGyy2FtFAUIb8YeKVmOCcPOTVphbAvmshudLE=",
"lastModified": 1730602179,
"narHash": "sha256-efgLzQAWSzJuCLiCaQUCDu4NudNlHdg2NzGLX5GYaEY=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "5601118d39ca9105f8e7b39d4c221d3388c0419d",
"rev": "3c2f1c4ca372622cb2f9de8016c9a0b1cbd0f37c",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "release-23.05",
"ref": "release-24.05",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_2": {
"locked": {
"lastModified": 1682134069,
"narHash": "sha256-TnI/ZXSmRxQDt2sjRYK/8j8iha4B4zP2cnQCZZ3vp7k=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "fd901ef4bf93499374c5af385b2943f5801c0833",
"type": "github"
},
"original": {
"id": "nixpkgs",
"type": "indirect"
}
},
"poetry2nix": {
"inputs": {
"flake-utils": "flake-utils_2",
"nix-github-actions": "nix-github-actions",
"nixpkgs": [
"course-management",
"nixpkgs"
]
],
"systems": "systems_3",
"treefmt-nix": "treefmt-nix"
},
"locked": {
"lastModified": 1688440303,
"narHash": "sha256-hFfOyityHdVFI0HNM+sqZfpi9Fbvjvy0N9O7FjuqPWY=",
"lastModified": 1730284601,
"narHash": "sha256-eHYcKVLIRRv3J1vjmxurS6HVdGphB53qxUeAkylYrZY=",
"owner": "nix-community",
"repo": "poetry2nix",
"rev": "04714155bae013fb9b207e54d1faf9f0c3d08706",
"rev": "43a898b4d76f7f3f70df77a2cc2d40096bc9d75e",
"type": "github"
},
"original": {
@ -132,12 +285,37 @@
"type": "github"
}
},
"print-interface": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1706540741,
"narHash": "sha256-4/JI3xhw76Z1oa8Ivn3AzR6zNqXkmSEgHl+v0PRGnTc=",
"owner": "fsr",
"repo": "print-interface",
"rev": "ca830bc64ee92ec24562e707ddf36c19a5607a94",
"type": "github"
},
"original": {
"owner": "fsr",
"repo": "print-interface",
"type": "github"
}
},
"root": {
"inputs": {
"course-management": "course-management",
"ese-manual": "ese-manual",
"kpp": "kpp",
"nix-index-database": "nix-index-database",
"nix-minecraft": "nix-minecraft",
"nixpkgs": "nixpkgs",
"sops-nix": "sops-nix"
"print-interface": "print-interface",
"sops-nix": "sops-nix",
"vscode-server": "vscode-server"
}
},
"sops-nix": {
@ -148,11 +326,11 @@
"nixpkgs-stable": "nixpkgs-stable"
},
"locked": {
"lastModified": 1694495315,
"narHash": "sha256-sZEYXs9T1NVHZSSbMqBEtEm2PGa7dEDcx0ttQkArORc=",
"lastModified": 1731364708,
"narHash": "sha256-HC0anOL+KmUQ2hdRl0AtunbAckasxrkn4VLmxbW/WaA=",
"owner": "Mic92",
"repo": "sops-nix",
"rev": "ea208e55f8742fdcc0986b256bdfa8986f5e4415",
"rev": "4c91d52db103e757fc25b58998b0576ae702d659",
"type": "github"
},
"original": {
@ -190,6 +368,91 @@
"repo": "default",
"type": "github"
}
},
"systems_3": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"id": "systems",
"type": "indirect"
}
},
"systems_4": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
"systems_5": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
"treefmt-nix": {
"inputs": {
"nixpkgs": [
"course-management",
"poetry2nix",
"nixpkgs"
]
},
"locked": {
"lastModified": 1730120726,
"narHash": "sha256-LqHYIxMrl/1p3/kvm2ir925tZ8DkI0KA10djk8wecSk=",
"owner": "numtide",
"repo": "treefmt-nix",
"rev": "9ef337e492a5555d8e17a51c911ff1f02635be15",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "treefmt-nix",
"type": "github"
}
},
"vscode-server": {
"inputs": {
"flake-utils": "flake-utils_4",
"nixpkgs": "nixpkgs_2"
},
"locked": {
"lastModified": 1729422940,
"narHash": "sha256-DlvJv33ml5UTKgu4b0HauOfFIoDx6QXtbqUF3vWeRCY=",
"owner": "nix-community",
"repo": "nixos-vscode-server",
"rev": "8b6db451de46ecf9b4ab3d01ef76e59957ff549f",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "nixos-vscode-server",
"type": "github"
}
}
},
"root": "root",

125
flake.nix
View file

@ -1,61 +1,128 @@
{
inputs = {
nixpkgs.url = github:nixos/nixpkgs/nixos-23.05;
sops-nix.url = github:Mic92/sops-nix;
nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05";
sops-nix.url = "github:Mic92/sops-nix";
sops-nix.inputs.nixpkgs.follows = "nixpkgs";
nix-index-database.url = "github:nix-community/nix-index-database";
nix-index-database.inputs.nixpkgs.follows = "nixpkgs";
kpp.url = "github:fsr/kpp";
kpp.inputs.nixpkgs.follows = "nixpkgs";
print-interface = {
url = "github:fsr/print-interface";
inputs.nixpkgs.follows = "nixpkgs";
};
ese-manual.url = "git+https://git.ifsr.de/ese/manual-website";
ese-manual.inputs.nixpkgs.follows = "nixpkgs";
vscode-server.url = "github:nix-community/nixos-vscode-server";
course-management = {
url = "github:fsr/course-management";
inputs.nixpkgs.follows = "nixpkgs";
};
nix-minecraft.url = "github:Infinidoge/nix-minecraft";
nix-minecraft.inputs.nixpkgs.follows = "nixpkgs";
};
outputs = { self, nixpkgs, sops-nix, kpp, course-management, ... }@inputs:
{
packages."x86_64-linux".quitte = self.nixosConfigurations.quitte.config.system.build.toplevel;
packages."x86_64-linux".default = self.packages."x86_64-linux".quitte;
formatter.x86_64-linux = nixpkgs.legacyPackages.x86_64-linux.nixpkgs-fmt;
hydraJobs."x86-64-linux".quitte = self.packages."x86_64-linux".quitte;
outputs =
{ self
, nixpkgs
, sops-nix
, nix-index-database
, kpp
, ese-manual
, vscode-server
, course-management
, print-interface
, nix-minecraft
, ...
}@inputs:
let
supportedSystems = [ "x86_64-linux" ];
forAllSystems = nixpkgs.lib.genAttrs supportedSystems;
pkgs = forAllSystems (system: nixpkgs.legacyPackages.${system});
in
{
packages = forAllSystems (system: rec {
default = quitte;
quitte = self.nixosConfigurations.quitte.config.system.build.toplevel;
tomate = self.nixosConfigurations.tomate.config.system.build.toplevel;
});
formatter = forAllSystems (system: pkgs.${system}.nixpkgs-fmt);
hydraJobs = forAllSystems (system: {
quitte = self.packages.${system}.quitte;
});
devShells = forAllSystems (system: {
default = pkgs.${system}.mkShell {
packages = with pkgs.${system}; [
sops
];
};
});
overlays.default = import ./overlays;
nixosConfigurations = {
quitte = nixpkgs.lib.nixosSystem {
quitte = nixpkgs.lib.nixosSystem rec {
system = "x86_64-linux";
specialArgs = inputs // { inherit system; };
modules = [
inputs.sops-nix.nixosModules.sops
inputs.kpp.nixosModules.default
inputs.nix-index-database.nixosModules.nix-index
ese-manual.nixosModules.default
course-management.nixosModules.default
vscode-server.nixosModules.default
nix-minecraft.nixosModules.minecraft-servers
./hosts/quitte/configuration.nix
./modules/bacula.nix
./modules/options.nix
./modules/base.nix
./modules/sops.nix
./modules/kpp.nix
./options
./modules/core
./modules/ldap
./modules/mail
./modules/mailman.nix
./modules/nginx.nix
./modules/hydra.nix
./modules/userdir.nix
./modules/web
./modules/courses
./modules/wiki
./modules/matrix
./modules/minecraft
./modules/keycloak
./modules/monitoring
./modules/nix-serve.nix
./modules/hedgedoc.nix
./modules/padlist.nix
./modules/postgres.nix
./modules/wiki.nix
./modules/ftp.nix
./modules/stream.nix
./modules/nextcloud.nix
./modules/matrix.nix
./modules/mautrix-telegram.nix
./modules/sogo.nix
./modules/vaultwarden.nix
./modules/website.nix
./modules/zsh.nix
./modules/course-management.nix
./modules/gitea.nix
./modules/forgejo
./modules/kanboard.nix
./modules/zammad.nix
# ./modules/decisions.nix
./modules/stream.nix
# ./modules/struktur-bot.nix
{
nixpkgs.overlays = [
self.overlays.default
nix-minecraft.overlay
];
sops.defaultSopsFile = ./secrets/quitte.yaml;
}
];
};
tomate = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
specialArgs = inputs;
modules = [
inputs.sops-nix.nixosModules.sops
inputs.nix-index-database.nixosModules.nix-index
vscode-server.nixosModules.default
print-interface.nixosModules.default
./hosts/tomate/configuration.nix
./modules/core/base.nix
./modules/core/zsh.nix
./modules/core/sssd.nix
{
sops.defaultSopsFile = ./secrets/tomate.yaml;
}
];
};
};
};
}

View file

@ -7,41 +7,61 @@
./network.nix
];
# Use the systemd-boot EFI boot loader.
boot.loader.systemd-boot.enable = true;
#boot.kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages;
boot.loader.systemd-boot = {
enable = true;
extraInstallCommands = ''
${pkgs.coreutils}/bin/cp -r /boot/* /boot2
'';
};
# boot.kernelParams = [ "video=VGA-1:1024x768@30" ];
boot.loader.efi.canTouchEfiVariables = true;
#boot.supportedFilesystems = [ "zfs" ];
#boot.zfs.devNodes = "/dev/";
boot.supportedFilesystems = [ "zfs" ];
services.qemuGuest.enable = true;
services.zfs = {
trim.enable = true;
autoScrub.enable = true;
};
# Set your time zone.
time.timeZone = "Europe/Berlin";
i18n.defaultLocale = "en_US.UTF-8";
# List packages installed in system profile. To search, run:
# $ nix search wget
environment.systemPackages = with pkgs; [
vim
wget
git
security.sudo.extraRules = [
{
commands = [
{
command = "ALL";
options = [ "NOPASSWD" ];
}
];
groups = [ "admins" ];
}
];
# prevent fork bombs
security.pam.loginLimits = [
{
domain = "@users";
item = "nproc";
type = "hard";
value = "2000";
}
{
domain = "@nixbld";
item = "nproc";
type = "hard";
value = "10000";
}
];
# Enable the OpenSSH daemon.
services.openssh.enable = true;
services.openssh.settings.PermitRootLogin = "yes";
# Open ports in the firewall.
networking.firewall.allowedTCPPorts = [ 443 80 ];
# networking.firewall.allowedUDPPorts = [ ... ];
# Or disable the firewall altogether.
# networking.firewall.enable = false;
# Copy the NixOS configuration file and link it from the resulting system
# (/run/current-system/configuration.nix). This is useful in case you
# accidentally delete configuration.nix.
# system.copySystemConfiguration = true;
systemd = {
services.nix-daemon.serviceConfig = {
MemoryMax = "32G";
};
# all users together may not use more than $MemoryMax of RAM
slices."user".sliceConfig = {
MemoryMax = "32G";
};
};
# This value determines the NixOS release from which the default
# settings for stateful data, like file locations and database versions

View file

@ -1,42 +1,52 @@
# Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead.
{ config, lib, modulesPath, ... }:
{
imports =
[
(modulesPath + "/profiles/qemu-guest.nix")
imports = [
(modulesPath + "/installer/scan/not-detected.nix")
];
boot.initrd.availableKernelModules = [ "ata_piix" "uhci_hcd" "virtio_pci" "virtio_scsi" "sd_mod" "sr_mod" ];
boot.initrd.availableKernelModules = [ "megaraid_sas" "xhci_pci" "nvme" "ahci" "usbhid" "usb_storage" "sd_mod" "sr_mod" ];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ ];
boot.kernelModules = [ "kvm-amd" ];
boot.extraModulePackages = [ ];
fileSystems."/" =
{
device = "/dev/disk/by-uuid/4d57c7c1-ed70-4fb1-af4c-4ba027b75248";
fsType = "ext4";
fileSystems."/" = {
device = "rpool/nixos/root";
fsType = "zfs";
};
boot.initrd.luks.devices."luksroot".device = "/dev/disk/by-uuid/cfb9b37e-152d-45e9-b75d-88d71471be45";
fileSystems."/home" = {
device = "rpool/nixos/home";
fsType = "zfs";
};
fileSystems."/boot" =
{
device = "/dev/disk/by-uuid/06C4-1FDB";
fileSystems."/nix" = {
device = "rpool/nixos/nixnew";
fsType = "zfs";
};
fileSystems."/var/lib" = {
device = "rpool/nixos/var/lib";
fsType = "zfs";
};
fileSystems."/var/log" = {
device = "rpool/nixos/var/log";
fsType = "zfs";
};
fileSystems."/boot" = {
device = "/dev/disk/by-uuid/3278-8D00";
fsType = "vfat";
options = [ "nofail" ];
};
fileSystems."/boot2" = {
device = "/dev/disk/by-uuid/3366-F71E";
fsType = "vfat";
options = [ "nofail" ];
};
swapDevices = [ ];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's
# still possible to use this option, but it's recommended to use it in conjunction
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
networking.useDHCP = lib.mkDefault true;
# networking.interfaces.ens18.useDHCP = lib.mkDefault true;
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
}

View file

@ -1,46 +1,35 @@
{ config, ... }:
let
wireguard_port = 51820;
in
{ config, lib, ... }:
{
sops.secrets = {
"wg-fsr" = {
owner = config.users.users.systemd-network.name;
};
};
networking = {
# portunus module does weird things to this, so we force it to some sane values
hosts = {
"127.0.0.1" = lib.mkForce [ "quitte.ifsr.de" "quitte" ];
"::1" = lib.mkForce [ "quitte.ifsr.de" "quitte" ];
};
hostId = "a71c81fc";
domain = "ifsr.de";
hostName = "quitte";
rDNS = config.networking.fqdn;
enableIPv6 = true;
useDHCP = true;
interfaces.ens18.useDHCP = true;
useNetworkd = true;
nftables.enable = true;
firewall.allowedUDPPorts = [ wireguard_port ];
wireguard.enable = true;
firewall = {
logRefusedConnections = false;
};
};
services.resolved = {
enable = true;
#dnssec = "false";
fallbackDns = [ "1.1.1.1" ];
fallbackDns = [ "9.9.9.9" ];
};
# workaround for networkd waiting for shit
systemd.services.systemd-networkd-wait-online.serviceConfig.ExecStart = [
"" # clear old command
"${config.systemd.package}/lib/systemd/systemd-networkd-wait-online --any"
];
systemd.network = {
enable = true;
wait-online.anyInterface = true;
# Interfaces on the machine
networks."10-ether-bond" = {
matchConfig.Name = "ens18";
networks."10-wired-default" = {
matchConfig.Name = "enp65s0f0np0";
address = [ "141.30.30.169/25" ];
routes = [
@ -50,39 +39,8 @@ in
];
networkConfig = {
DNS = "141.30.1.1";
#IPv6AcceptRA = true;
};
};
# defining network device for wireguard connections
netdevs."fsr-wg" = {
netdevConfig = {
Kind = "wireguard";
Name = "fsr-wg";
Description = "fsr enterprise wireguard";
};
wireguardConfig = {
PrivateKeyFile = config.sops.secrets."wg-fsr".path;
ListenPort = wireguard_port;
};
wireguardPeers = [
{
# tassilo
wireguardPeerConfig = {
PublicKey = "vgo3le9xrFsIbbDZsAhQZpIlX+TuWjfEyUcwkoqUl2Y=";
AllowedIPs = [ "10.66.66.100/32" ];
PersistentKeepalive = 25;
};
}
];
};
# fsr wireguard server
networks."fsr-wg" = {
matchConfig.Name = "fsr-wg";
networkConfig = {
Address = "10.66.66.1/24";
IPForward = "ipv4";
LLDP = true;
EmitLLDP = "nearest-bridge";
};
};
};

View file

@ -0,0 +1,177 @@
# Edit this configuration file to define what should be installed on
# your system. Help is available in the configuration.nix(5) man page
# and in the NixOS manual (accessible by running nixos-help).
{ config, pkgs, ... }:
{
imports =
[
# Include the results of the hardware scan.
./network.nix
./hardware-configuration.nix
];
# Bootloader.
boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true;
nix = {
settings = {
substituters = [
"https://cache.ifsr.de"
];
trusted-public-keys = [
"cache.ifsr.de:y55KBAMF4YkjIzXwYOKVk9fcQS+CZ9RM1zAAMYQJtsg="
];
};
};
# Set your time zone.
time.timeZone = "Europe/Berlin";
# Select internationalisation properties.
i18n.defaultLocale = "de_DE.UTF-8";
i18n.extraLocaleSettings = {
LC_ADDRESS = "de_DE.UTF-8";
LC_IDENTIFICATION = "de_DE.UTF-8";
LC_MEASUREMENT = "de_DE.UTF-8";
LC_MONETARY = "de_DE.UTF-8";
LC_NAME = "de_DE.UTF-8";
LC_NUMERIC = "de_DE.UTF-8";
LC_PAPER = "de_DE.UTF-8";
LC_TELEPHONE = "de_DE.UTF-8";
LC_TIME = "de_DE.UTF-8";
};
# Enable the X11 windowing system.
services.xserver.enable = true;
# Enable the KDE Plasma Desktop Environment.
services.displayManager.sddm.enable = true;
services.xserver.desktopManager.plasma5.enable = true;
# Configure keymap in X11
services.xserver = {
xkb.layout = "de";
xkb.variant = "";
};
# Configure console keymap
console.keyMap = "de";
services.printing = {
enable = true;
stateless = true;
drivers = with pkgs; [ cups-kyocera ];
browsing = true;
defaultShared = true;
# todo fix
allowFrom = [ "all" ];
listenAddresses = [ "0.0.0.0:631" ];
};
sops.secrets."print/smtp-password" = {
owner = config.services.print-interface.user;
group = config.services.print-interface.group;
};
services.print-interface = {
enable = true;
smtp = {
username = "print";
passwordFile = config.sops.secrets."print/smtp-password".path;
};
};
services.avahi = {
enable = true;
nssmdns4 = true;
openFirewall = true;
publish = {
enable = true;
userServices = true;
};
};
networking.firewall = {
allowedTCPPorts = [
631
config.services.print-interface.listenPort
];
allowedUDPPorts = [ 631 ];
};
# Enable sound with pipewire.
sound.enable = true;
hardware.pulseaudio.enable = false;
security.rtkit.enable = true;
services.pipewire = {
enable = true;
alsa.enable = true;
alsa.support32Bit = true;
pulse.enable = true;
# If you want to use JACK applications, uncomment this
#jack.enable = true;
# use the example session manager (no others are packaged yet so this is enabled by default,
# no need to redefine it in your config for now)
#media-session.enable = true;
};
# Enable touchpad support (enabled default in most desktopManager).
# services.xserver.libinput.enable = true;
# Allow unfree packages
nixpkgs.config.allowUnfree = true;
# List packages installed in system profile. To search, run:
# $ nix search wget
environment.systemPackages = with pkgs; [
# vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default.
# wget
];
security = {
pam = {
u2f = {
enable = true;
};
services = {
login.u2fAuth = true;
sudo.u2fAuth = true;
};
};
};
# Some programs need SUID wrappers, can be configured further or are
# started in user sessions.
# programs.mtr.enable = true;
# programs.gnupg.agent = {
# enable = true;
# enableSSHSupport = true;
# };
# List services that you want to enable:
# Enable the OpenSSH daemon.
services.openssh.enable = true;
# Open ports in the firewall.
# networking.firewall.allowedTCPPorts = [ ... ];
# networking.firewall.allowedUDPPorts = [ ... ];
# Or disable the firewall altogether.
# networking.firewall.enable = false;
# This value determines the NixOS release from which the default
# settings for stateful data, like file locations and database versions
# on your system were taken. Its perfectly fine and recommended to leave
# this value at the release version of the first install of this system.
# Before changing this value read the documentation for this option
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
system.stateVersion = "23.05"; # Did you read the comment?
}

View file

@ -0,0 +1,42 @@
# Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead.
{ config, lib, modulesPath, ... }:
{
imports =
[
(modulesPath + "/installer/scan/not-detected.nix")
];
boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "ohci_pci" "ehci_pci" "usbhid" "usb_storage" "sd_mod" ];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-amd" ];
boot.extraModulePackages = [ ];
fileSystems."/" =
{
device = "/dev/disk/by-uuid/618e281f-a8bf-4129-bfc1-aa47f86a8c54";
fsType = "ext4";
};
fileSystems."/boot" =
{
device = "/dev/disk/by-uuid/0844-2A73";
fsType = "vfat";
};
swapDevices =
[{ device = "/dev/disk/by-uuid/8bdeb0c1-8f1e-43a7-b4b9-c06e27a94460"; }];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's
# still possible to use this option, but it's recommended to use it in conjunction
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
networking.useDHCP = lib.mkDefault true;
# networking.interfaces.enp3s0.useDHCP = lib.mkDefault true;
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
powerManagement.cpuFreqGovernor = lib.mkDefault "ondemand";
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
}

40
hosts/tomate/network.nix Normal file
View file

@ -0,0 +1,40 @@
{ config, ... }:
{
sops.secrets.ifsr-apb-auth = { };
networking = {
domain = "ifsr.de";
hostName = "tomate";
useNetworkd = true;
nftables.enable = true;
# Radius authentification
supplicant."enp3s0" = {
driver = "wired";
configFile.path = config.sops.secrets.ifsr-apb-auth.path;
};
};
services.resolved = {
enable = true;
fallbackDns = [ "9.9.9.9" ];
};
systemd.network = {
enable = true;
networks."10-wired-default" = {
matchConfig.Name = "enp3s0";
address = [ "141.30.86.196/26" ];
routes = [
{
routeConfig.Gateway = "141.30.86.193";
}
];
networkConfig = {
DNS = "141.30.1.1";
LLDP = true;
EmitLLDP = "nearest-bridge";
};
};
};
}

23
keys/pgp/hendrik.asc Normal file
View file

@ -0,0 +1,23 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mDMEZNJqYBYJKwYBBAHaRw8BAQdAKncDaEdOUQGOqVBQuEsJ42wCcyLB7x1XcNDZ
VEQpVyO0JkhlbmRyaWsgV29sZmYgPGhlbmRyaWsud29sZmZAYWdkc24ubWU+iJAE
ExYIADgWIQT7v6wmDZKD0e8jl908pl6d1usxnQUCZNJqYAIbAwULCQgHAgYVCgkI
CwIEFgIDAQIeAQIXgAAKCRA8pl6d1usxnX6zAP9Rut+Yg31zBAiRdQxV4tlK+hko
wCq9WIKtIbBvrqv5/AEAujkRCgBpFeHzhId55QmvK0FXZgFgfy9wm/QtXb4+lQ64
MwRk0mrEFgkrBgEEAdpHDwEBB0AidcMADt+W+eSbrInHeCPZThyd1V7NKEMhk3sL
xJApx4j1BBgWCAAmFiEE+7+sJg2Sg9HvI5fdPKZendbrMZ0FAmTSasQCGwIFCQeE
zgAAgQkQPKZendbrMZ12IAQZFggAHRYhBEK0YmsN4JpCoNWvKp5LZR/BVBjgBQJk
0mrEAAoJEJ5LZR/BVBjg6ogBAOcFh/S99L/aN6bQu9bYRPomakbNqypHA1YbodjG
1IQgAPwLj19BXNnQmTgYzY3bWmtcAc8lsGWTNkDDTZMRRTP+BSS1AP9qBuCeU/fj
2hpa17LiV6sjdRquxWQXjKxTlBRV8oKj1gD/WarlxiHt8nMn527FXuBrGZC+mZq2
NvvoTb+uvZNliAq4OARk0mtEEgorBgEEAZdVAQUBAQdAkK0jBo/37NbRHMOYCal0
9vGuK3KaxU3Cl9No+VbZDEYDAQgHiH4EGBYIACYWIQT7v6wmDZKD0e8jl908pl6d
1usxnQUCZNJrRAIbDAUJB4TOAAAKCRA8pl6d1usxnbaqAP9abTf+DibaAR6hdU9y
CEE5TD32EB+ySw/v45yCi28B8AEA5PcpwMD6emVrNQGeVChkOlwauwA3HkE6DDTO
yeebAwi4MwRk0mvNFgkrBgEEAdpHDwEBB0DSYGCNq15sOLj1wDJjoKoCRMGH8I/y
ARMUws7PQ4KPkYh+BBgWCAAmFiEE+7+sJg2Sg9HvI5fdPKZendbrMZ0FAmTSa80C
GyAFCQeEzgAACgkQPKZendbrMZ1HggEAxSBYuJ4BTr9GCl8e79HTSwg8iIIJx8Nc
REFvro0BrnEA/3AbyQYBQVAhqIwSSza5dr4+FiLbbVhPFcxU98TLBTQJ
=sA2V
-----END PGP PUBLIC KEY BLOCK-----

View file

@ -1,77 +0,0 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=Fs3l
-----END PGP PUBLIC KEY BLOCK-----

92
keys/pgp/jonasga.asc Normal file
View file

@ -0,0 +1,92 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
q0Mleg==
=M2wX
-----END PGP PUBLIC KEY BLOCK-----

View file

@ -1,78 +0,0 @@
{ pkgs, config, lib, ... }:
with lib;
let
# We write a custom config file because the upstream config has some flaws
fd_cfg = config.services.bacula-fd;
fd_conf = pkgs.writeText "bacula-fd.conf" ''
Client {
Name = ${fd_cfg.name}
FDPort = ${toString fd_cfg.port}
WorkingDirectory = /var/lib/bacula
Pid Directory = /run
${fd_cfg.extraClientConfig}
}
${concatStringsSep "\n" (mapAttrsToList (name: value: ''
Director {
Name = ${name}
Password = ${value.password}
Monitor = ${value.monitor}
}
'') fd_cfg.director)}
Messages {
Name = Standard;
syslog = all, !skipped, !restored
${fd_cfg.extraMessagesConfig}
}
'';
# AGDSN is running an outdated version that we have to comply to
bacula_package = (pkgs.bacula.overrideAttrs (old: rec {
version = "9.6.7";
src = pkgs.fetchurl {
url = "mirror://sourceforge/bacula/${old.pname}-${version}.tar.gz";
sha256 = "sha256-3w+FJezbo4DnS1N8pxrfO3WWWT8CGJtZqw6//IXMyN4=";
};
}));
in
{
sops.secrets = {
"bacula/password".owner = "bacula";
"bacula/keypair".owner = "bacula";
"bacula/masterkey".owner = "bacula";
};
networking.firewall.allowedTCPPorts = [ config.services.bacula-fd.port ];
networking.firewall.allowedUDPPorts = [ config.services.bacula-fd.port ];
services.bacula-fd = {
enable = true;
name = "ifsr-quitte";
extraClientConfig = ''
Maximum Concurrent Jobs = 20
FDAddress = 141.30.30.169
PKI Signatures = Yes
PKI Encryption = Yes
PKI Keypair = ${config.sops.secrets."bacula/keypair".path}
PKI Master Key = ${config.sops.secrets."bacula/masterkey".path}
'';
extraMessagesConfig = ''
director = abel-dir = all, !skipped, !restored
mailcommand = "${bacula_package}/bin/bsmtp -f \"Bacula <bacula@${config.networking.domain}>\" -s \"Bacula report" %r"
mail = root+backup = all, !skipped
'';
director."abel-dir".password = "@${config.sops.secrets."bacula/password".path}";
};
environment.etc."bacula/bconsole.conf".text = ''
Director {
Name = abel-dir
DIRport = 9101
address = 10.144.0.11
Password = @${config.sops.secrets."bacula/password".path}
}
Console {
Name = ifsr-quitte-console
Password = @${config.sops.secrets."bacula/password".path}
}
'';
systemd.services.bacula-fd.serviceConfig.ExecStart = lib.mkForce "${bacula_package}/sbin/bacula-fd -f -u root -g bacula -c ${fd_conf}";
}

47
modules/core/bacula.nix Normal file
View file

@ -0,0 +1,47 @@
{ pkgs, config, ... }:
{
sops.secrets = {
"bacula/password".owner = "bacula";
"bacula/keypair".owner = "bacula";
"bacula/masterkey".owner = "bacula";
};
networking.firewall = {
extraInputRules = ''
ip saddr 10.144.0.11 tcp dport ${builtins.toString config.services.bacula-fd.port} accept comment "Only allow Bacula access from Abel"
'';
};
services.bacula-fd = {
enable = true;
name = "ifsr-quitte";
extraClientConfig = ''
Comm Compression = no
Maximum Concurrent Jobs = 20
FDAddress = 141.30.30.169
PKI Signatures = Yes
PKI Encryption = Yes
PKI Keypair = ${config.sops.secrets."bacula/keypair".path}
PKI Master Key = ${config.sops.secrets."bacula/masterkey".path}
'';
extraMessagesConfig = ''
director = abel-dir = all, !skipped, !restored
mailcommand = "${pkgs.bacula}/bin/bsmtp -f \"Bacula <bacula@${config.networking.domain}>\" -s \"Bacula report" %r"
mail = root+backup = all, !skipped
'';
director."abel-dir" = {
password = "@${config.sops.secrets."bacula/password".path}";
tls.enable = false;
};
};
environment.etc."bacula/bconsole.conf".text = ''
Director {
Name = abel-dir
DIRport = 9101
address = 10.144.0.11
Password = @${config.sops.secrets."bacula/password".path}
}
Console {
Name = ifsr-quitte-console
Password = @${config.sops.secrets."bacula/password".path}
}
'';
}

View file

@ -1,6 +1,5 @@
{ pkgs, config, ... }: {
nix = {
package = pkgs.nixUnstable; # or versioned attributes like nix_2_4
extraOptions = ''
experimental-features = nix-command flakes
'';
@ -11,10 +10,17 @@
echo System package diff:
${config.nix.package}/bin/nix store diff-closures /run/current-system $systemConfig || true
fi
NO_FORMAT="\033[0m"
F_BOLD="\033[1m"
C_RED="\033[38;5;9m"
${pkgs.diffutils}/bin/cmp --silent \
<(readlink /run/current-system/{kernel,kernel-modules}) \
<(readlink $systemConfig/{kernel,kernel-modules}) \
|| echo -e "''${F_BOLD}''${C_RED}Kernel version changed, reboot is advised.''${NO_FORMAT}"
'';
# Select internationalisation properties.
i18n.defaultLocale = "en_US.UTF-8";
console = {
#font = "Lat2-Terminus16";
font = "${pkgs.terminus_font}/share/consolefonts/ter-u28n.psf.gz";
@ -22,7 +28,17 @@
};
# Enable the OpenSSH daemon.
services.openssh.enable = true;
services.openssh = {
enable = true;
settings = {
PermitRootLogin = "yes";
PasswordAuthentication = false;
};
};
programs.mosh.enable = true;
# vs code server
services.vscode-server.enable = true;
# set root ssh keys
users.users.root.openssh.authorizedKeys = {
@ -40,17 +56,17 @@
# "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEXMHwy4AZ9B4pMRBa/P/rb7N3SCas9e7Lp89plTHdFS halcyon@eisvogel.moe"
# "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAJ7qUGZUjiDhQ6Se+aXr9DbgRTG2tx69owqVMkd2bna simon@mayushii"
"ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLlITzcTVnSi8EpEW3leSuqYCDhbnJyoGCjFOtIJ0Dl5uRNm0UNXS7AbQtLLylEeI1+/qinQDEWAJ6cBDAaPfNw= rouven@thinkpad"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINJgYI2rXmw4uPXAMmOgqgJEwYfwj/IBExTCzs9Dgo+R w0lff"
];
keyFiles = [
../keys/ssh/marcus-sapphire
../keys/ssh/schrader
../keys/ssh/jannusch
../keys/ssh/jannusch-arch
../keys/ssh/tassilo
../keys/ssh/jonasga
../keys/ssh/rouven
../keys/ssh/joachim
../../keys/ssh/marcus-sapphire
../../keys/ssh/schrader
../../keys/ssh/jannusch
../../keys/ssh/jannusch-arch
../../keys/ssh/tassilo
../../keys/ssh/jonasga
../../keys/ssh/rouven
../../keys/ssh/joachim
];
};
@ -63,9 +79,10 @@
# $ nix search wget
environment.systemPackages = with pkgs; [
atop
btop
bat
git
htop
htop-vim
fd
ripgrep
tldr
@ -73,6 +90,7 @@
usbutils
wget
neovim
helix
nmap
tcpdump
bat
@ -91,8 +109,10 @@
sysstat
tree
whois
exa
eza
zsh
unzip
yazi
];
}

15
modules/core/default.nix Executable file
View file

@ -0,0 +1,15 @@
{ ... }: {
imports = [
./base.nix
./logging.nix
./bacula.nix
./fail2ban.nix
./initrd-ssh.nix
./mysql.nix
./nginx.nix
./podman.nix
./postgres.nix
./sssd.nix
./zsh.nix
];
}

27
modules/core/fail2ban.nix Normal file
View file

@ -0,0 +1,27 @@
{ ... }:
{
services.fail2ban = {
enable = true;
ignoreIP = [
"141.30.0.0/16"
"141.76.0.0/16"
];
bantime-increment = {
enable = true;
};
jails = {
dovecot = ''
enabled = true
# aggressive mode to add blocking for aborted connections
filter = dovecot[mode=aggressive]
maxretry = 3
'';
postfix = ''
enabled = true
filter = postfix[mode=aggressive]
maxretry = 3
'';
};
};
}

View file

@ -0,0 +1,29 @@
# Find the required kernel module for the network adapter using `lspci -v` and add it to `boot.initrd.availableKernelModules`.
# Enable `networking.useDHCP` or set a static ip using the `ip=` kernel parameter.
# Generate another SSH host key for the machine:
# $ ssh-keygen -t ed25519 -N "" -f /etc/ssh/ssh_host_ed25519_key_initrd -C HOSTNAME-initrd
# Add the public key to your known_hosts and create an ssh config entry.
{ config, ... }:
{
boot.initrd = {
availableKernelModules = [ "mlx5_core" ];
systemd = {
enable = true;
network = {
enable = true;
networks."10-wired-default" = config.systemd.network.networks."10-wired-default";
};
users.root.shell = "/bin/systemd-tty-ask-password-agent";
};
network = {
enable = true;
ssh = {
enable = true;
port = 222;
hostKeys = [ "/etc/ssh/ssh_host_ed25519_key_initrd" ];
# authorizedKeys option inherits root's authorizedKeys.keys, but not keyFiles
};
};
};
}

34
modules/core/logging.nix Normal file
View file

@ -0,0 +1,34 @@
{ pkgs, ... }:
{
services.rsyslogd = {
enable = true;
defaultConfig = ''
$FileCreateMode 0640
:programname, isequal, "postfix" /var/log/postfix.log
auth.* -/var/log/auth.log
'';
};
services.logrotate.configFile = pkgs.writeText "logrotate.conf" ''
weekly
missingok
notifempty
rotate 4
"/var/log/postfix.log" {
compress
delaycompress
weekly
rotate 156
}
"/var/log/nginx/*.log" {
compress
delaycompress
weekly
postrotate
[ ! -f /var/run/nginx/nginx.pid ] || kill -USR1 `cat /var/run/nginx/nginx.pid`
endscript
rotate 26
su nginx nginx
}
'';
}

20
modules/core/mysql.nix Normal file
View file

@ -0,0 +1,20 @@
{ pkgs, ... }:
{
services.mysql = {
enable = true;
package = pkgs.mariadb;
settings.mysqld.bind_address = "127.0.0.1";
};
services.mysqlBackup = {
enable = true;
user = "mysql";
location = "/var/lib/backup/mysql";
databases = [
"decisions"
"fsrewsp"
"nightline"
"wiki_ese"
"wiki_vernetzung"
];
};
}

60
modules/core/nginx.nix Normal file
View file

@ -0,0 +1,60 @@
{ lib, config, pkgs, ... }:
{
# set default options for virtualHosts
options = with lib; {
services.nginx.virtualHosts = mkOption {
type = types.attrsOf (types.submodule
({ name, ... }: {
enableACME = true;
forceSSL = true;
# split up nginx access logs per vhost
extraConfig = ''
access_log /var/log/nginx/${name}_access.log;
error_log /var/log/nginx/${name}_error.log;
'';
})
);
};
};
config = {
networking.firewall.allowedTCPPorts = [ 80 443 ];
networking.firewall.allowedUDPPorts = [ 443 ];
services.nginx = {
enable = true;
package = pkgs.nginxQuic;
additionalModules = [ pkgs.nginxModules.pam ];
recommendedProxySettings = true;
recommendedGzipSettings = true;
recommendedOptimisation = true;
recommendedTlsSettings = true;
# appendHttpConfig = ''
# map $remote_addr $remote_addr_anon {
# ~(?P<ip>\d+\.\d+\.\d+)\. $ip.0;
# ~(?P<ip>[^:]+:[^:]+): $ip::;
# # IP addresses to not anonymize
# 127.0.0.1 $remote_addr;
# ::1 $remote_addr;
# default 0.0.0.0;
# }
# log_format anon_ip '$remote_addr_anon - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
# access_log /var/log/nginx/access.log anon_ip;
# '';
};
security.acme = {
acceptTerms = true;
defaults = {
#server = "https://acme-staging-v02.api.letsencrypt.org/directory";
email = "root@${config.networking.domain}";
};
};
security.pam.services.nginx.text = ''
auth required ${pkgs.nss_pam_ldapd}/lib/security/pam_ldap.so
account required ${pkgs.nss_pam_ldapd}/lib/security/pam_ldap.so
'';
};
}

26
modules/core/podman.nix Normal file
View file

@ -0,0 +1,26 @@
{ pkgs, ... }:
{
# From: https://nixos.wiki/wiki/Podman
virtualisation.containers.enable = true;
virtualisation = {
podman = {
enable = true;
# Create a `docker` alias for podman, to use it as a drop-in replacement
dockerCompat = true;
# Required for containers under podman-compose to be able to talk to each other.
defaultNetwork.settings.dns_enabled = true;
};
};
virtualisation.oci-containers.backend = "podman";
# Useful otherdevelopment tools
environment.systemPackages = with pkgs; [
dive # look into docker image layers
podman-tui # status of containers in the terminal
#docker-compose # start group of containers for dev
#podman-compose # start group of containers for dev
];
}

View file

@ -6,8 +6,10 @@
location = "/var/lib/backup/postgresql";
databases = [
"course-management"
"gitea"
"git"
"grafana"
"hedgedoc"
"keycloak"
"matrix-synapse"
"mautrix-telegram"
"mediawiki"
@ -16,7 +18,10 @@
"sogo"
"vaultwarden"
"mailman"
"mailmanweb"
"mailman-web"
"zammad"
];
};
services.postgresql.settings.max_connections = 1000;
}

41
modules/core/sssd.nix Normal file
View file

@ -0,0 +1,41 @@
{ config, ... }:
{
sops.secrets = {
"sssd/env" = { };
};
services.sssd = {
enable = true;
environmentFile = config.sops.secrets."sssd/env".path;
sshAuthorizedKeysIntegration = true;
config = ''
[sssd]
config_file_version = 2
services = nss, pam, ssh
domains = ldap
[ssh]
[nss]
[pam]
[domain/ldap]
auth_provider = ldap
ldap_uri = ldaps://auth.ifsr.de
ldap_default_authtok_type = password
ldap_default_authtok = $SSSD_LDAP_DEFAULT_AUTHTOK
ldap_search_base = dc=ifsr,dc=de
id_provider = ldap
ldap_default_bind_dn = uid=search,ou=users,dc=ifsr,dc=de
cache_credentials = True
ldap_tls_cacert = /etc/ssl/certs/ca-bundle.crt
ldap_tls_reqcert = hard
'';
};
security.pam.services = {
sshd.makeHomeDir = true;
login.makeHomeDir = true;
};
}

35
modules/core/zsh.nix Normal file
View file

@ -0,0 +1,35 @@
{ lib, pkgs, ... }:
{
users.users.root.shell = pkgs.zsh;
programs.command-not-found.enable = false;
programs.nix-index-database.comma.enable = true;
environment.systemPackages = with pkgs; [
# fzf
bat
duf
];
programs.fzf = {
keybindings = true;
};
programs.zsh = {
enable = true;
autosuggestions = {
enable = true;
highlightStyle = "fg=#00bbbb,bold";
};
# don't override agdsn-zsh-config aliases
shellAliases = lib.mkForce { };
shellInit = ''
zsh-newuser-install () {}
'';
interactiveShellInit = ''
source ${pkgs.zsh-fzf-tab}/share/fzf-tab/fzf-tab.plugin.zsh
HW_CONF_ALIASES_GIT_AUTHOR_REMINDER=0
source ${pkgs.agdsn-zsh-config}/etc/zsh/zshrc
'';
promptInit = "";
};
}

View file

@ -38,15 +38,28 @@ in
enable = lib.mkForce true; # upstream bacula config wants to disable it, so we need to force
ensureUsers = [{
name = "course-management";
ensurePermissions = {
"DATABASE \"course-management\"" = "ALL PRIVILEGES";
};
ensureDBOwnership = true;
}];
ensureDatabases = [ "course-management" ];
};
services.nginx.virtualHosts.${hostName} = {
enableACME = true;
forceSSL = true;
# phil redirects
locations =
let
philDomain = "https://kurse-phil.ifsr.de";
courses = [ "238" "239" "240" "241" "242" "243" ];
subjects = [
"ESE 2023 PHIL Campustour"
"ESE 2023 PHIL Bowlingabend"
"ESE 2023 PHIL Filmabend"
"ESE 2023 PHIL Wandern"
"ESE 2023 PHIL Spieleabend Pen and Paper"
];
in
{
"~ \"^/course/(${builtins.concatStringsSep "|" courses})/\"".return = "301 ${philDomain}/course/$1";
"~ \"^/subject/(${builtins.concatStringsSep "|" subjects})/\"".return = "301 ${philDomain}/subject/$1";
};
};
}

93
modules/courses/phil.nix Normal file
View file

@ -0,0 +1,93 @@
{ config, lib, course-management, ... }:
let
hostName = "kurse-phil.${config.networking.domain}";
in
{
services.nginx.virtualHosts."${hostName}" = {
locations."/".proxyPass = "http://127.0.0.1:8084";
enableACME = true;
forceSSL = true;
};
sops.secrets = {
"course-management-phil/secret-key" = { };
"course-management-phil/adminpass" = { };
};
containers."courses-phil" = {
autoStart = true;
extraFlags = [
"--load-credential=course-secret-key:${config.sops.secrets."course-management-phil/secret-key".path}"
"--load-credential=course-adminpass:${config.sops.secrets."course-management-phil/adminpass".path}"
];
config = { config, ... }: {
system.stateVersion = "23.05";
networking.domain = "ifsr.de";
imports = [
course-management.nixosModules.default
];
systemd.services.course-management = {
after = [ "postgresql.service" ];
serviceConfig = {
LoadCredential = [
"secret-key:course-secret-key"
"adminpass:course-adminpass"
];
};
};
services.course-management = {
inherit hostName;
enable = true;
listenPort = 5001;
settings = {
secretKeyFile = "$CREDENTIALS_DIRECTORY/secret-key";
adminPassFile = "$CREDENTIALS_DIRECTORY/adminpass";
admins = [{
name = "Root iFSR";
email = "root@${config.networking.domain}";
}];
database = {
ENGINE = "django.db.backends.postgresql";
NAME = "course-management";
};
email = lib.mkDefault {
fromEmail = "noreply@${config.networking.domain}";
serverEmail = "root@${config.networking.domain}";
};
};
};
security.acme = {
acceptTerms = true;
defaults = {
email = "root@${config.networking.domain}";
};
};
services.postgresql = {
enable = true;
enableTCPIP = lib.mkForce false;
ensureUsers = [{
name = "course-management";
ensureDBOwnership = true;
}];
ensureDatabases = [ "course-management" ];
};
systemd.services.postgresql.serviceConfig.ExecStart = lib.mkForce "${config.services.postgresql.package}/bin/postgres -c listen_addresses=''";
services.nginx = {
enable = true;
recommendedProxySettings = true;
recommendedGzipSettings = true;
recommendedOptimisation = true;
recommendedTlsSettings = true;
virtualHosts.${hostName} = {
listen = [{
addr = "127.0.0.1";
port = 8084;
}];
};
};
};
};
}

46
modules/decisions.nix Normal file
View file

@ -0,0 +1,46 @@
{ config, ... }:
let
domain = "decisions.${config.networking.domain}";
in
{
sops.secrets."decisions_env" = { };
virtualisation.oci-containers = {
containers.decisions = {
image = "ghcr.io/fsr/decisions";
volumes = [
"/var/lib/nextcloud/data/root/files/FSR/protokolle:/protokolle:ro"
];
extraOptions = [ "--network=host" ];
environmentFiles = [
config.sops.secrets."decisions_env".path
];
};
};
services.nginx = {
virtualHosts."${domain}" = {
locations."/" = {
proxyPass = "http://127.0.0.1:5055";
};
};
};
systemd.timers."decisions-to-db" = {
wantedBy = [ "timers.target" ];
timerConfig = {
OnCalendar = "01:11:00";
Unit = "decisions-to-db.service";
};
};
# systemd.services."decisions-to-db" = {
# script = ''
# set -eu
# ${pkgs.podman}/bin/podman exec decisions python tex_to_db.py
# '';
# serviceConfig = {
# Type = "oneshot";
# User = "root";
# };
# };
}

View file

@ -0,0 +1,30 @@
{ config, pkgs, ... }:
{
sops.secrets."forgejo/runner-token" = { };
services.gitea-actions-runner = {
package = pkgs.forgejo-actions-runner;
instances."quitte" = {
enable = true;
labels = [
# provide a debian base with nodejs for actions
"debian-latest:docker://node:18-bullseye"
# fake the ubuntu name, because node provides no ubuntu builds
"ubuntu-latest:docker://node:18-bullseye"
# provide native execution on the host
# "native:host"
];
tokenFile = config.sops.secrets."forgejo/runner-token".path;
url = "https://git.ifsr.de";
name = "quitte";
settings = {
container = {
# use podman's default network, otherwise dns was not working for some reason
network = "podman";
# don't mount the docker socket into the build containers,
# this would basically mean root on the host...
docker_host = "-";
};
};
};
};
}

View file

@ -1,40 +1,45 @@
{ config, lib, pkgs, ... }:
let
domain = "git.${config.networking.domain}";
giteaUser = "git";
gitUser = "git";
in
{
imports = [
./actions.nix
];
sops.secrets.gitea_ldap_search = {
key = "portunus/search-password";
owner = config.services.gitea.user;
owner = config.services.forgejo.user;
};
users.users.${giteaUser} = {
users.users.${gitUser} = {
isSystemUser = true;
home = config.services.gitea.stateDir;
group = giteaUser;
home = config.services.forgejo.stateDir;
group = gitUser;
useDefaultShell = true;
};
users.groups.${giteaUser} = { };
users.groups.${gitUser} = { };
services.gitea = {
services.forgejo = {
enable = true;
package = pkgs.forgejo; # community fork
user = giteaUser;
group = giteaUser;
appName = "iFSR Git";
user = gitUser;
group = gitUser;
lfs.enable = true;
database = {
type = "postgres";
name = "git"; # legacy
createDatabase = true;
user = giteaUser;
user = gitUser;
};
# TODO: enable periodic dumps of the DB and repos, maybe use this for backups?
# dump = { };
settings = {
DEFAULT = {
APP_NAME = "iFSR Git";
};
server = {
PROTOCOL = "http+unix";
DOMAIN = domain;
@ -42,6 +47,7 @@ in
ROOT_URL = "https://${domain}";
OFFLINE_MODE = true; # disable use of CDNs
};
log.LEVEL = "Warn";
database.LOG_SQL = false;
service = {
DISABLE_REGISTRATION = true;
@ -63,12 +69,15 @@ in
COOKIE_SECURE = true;
PROVIDER = "db";
};
actions.ENABLED = true;
# federation.ENABLED = true;
webhook.ALLOWED_HOST_LIST = "*.ifsr.de";
};
};
systemd.services.gitea.preStart =
systemd.services.forgejo.preStart =
let
exe = lib.getExe config.services.gitea.package;
exe = lib.getExe config.services.forgejo.package;
portunus = config.services.portunus;
basedn = "ou=users,${portunus.ldap.suffix}";
ldapConfigArgs = ''
@ -105,10 +114,8 @@ in
'';
services.nginx.virtualHosts.${domain} = {
enableACME = true;
forceSSL = true;
locations."/" = {
proxyPass = "http://unix:${config.services.gitea.settings.server.HTTP_ADDR}:/";
proxyPass = "http://unix:${config.services.forgejo.settings.server.HTTP_ADDR}:/";
proxyWebsockets = true;
};
locations."/api/v1/users/search".return = "403";

View file

@ -1,23 +0,0 @@
{ config, pkgs, ... }:
let
domain = "ftp.${config.networking.domain}";
in
{
services.nginx.additionalModules = [ pkgs.nginxModules.fancyindex ];
services.nginx.virtualHosts."${domain}" = {
enableACME = true;
forceSSL = true;
root = "/srv/ftp";
extraConfig = ''
fancyindex on;
fancyindex_exact_size off;
'';
locations."~/(klausuren|uebungen|skripte|abschlussarbeiten)".extraConfig = ''
allow 141.30.0.0/16;
allow 141.76.0.0/16;
allow 172.16.0.0/16;
deny all;
'';
};
}

View file

@ -14,9 +14,7 @@ in
ensureUsers = [
{
name = "hedgedoc";
ensurePermissions = {
"DATABASE hedgedoc" = "ALL PRIVILEGES";
};
ensureDBOwnership = true;
}
];
ensureDatabases = [ "hedgedoc" ];
@ -70,12 +68,16 @@ in
recommendedProxySettings = true;
virtualHosts = {
"${domain}" = {
enableACME = true;
forceSSL = true;
locations."/" = {
proxyPass = "http://[::1]:${toString config.services.hedgedoc.settings.port}";
proxyWebsockets = true;
};
locations."/robots.txt" = {
extraConfig = ''
add_header Content-Type text/plain;
return 200 "User-agent: *\nDisallow: /\n";
'';
};
};
};
};

View file

@ -4,6 +4,7 @@ let
in
{
sops.secrets."hydra_ldap_search" = { owner = "hydra"; group = "hydra"; mode = "440"; };
nix.settings.allowed-uris = [ "https://github.com/nix-community" ]; # whitelisted to fetch nix-index
services.hydra = {
enable = true;
port = 4000;
@ -59,8 +60,6 @@ in
};
services.nginx.virtualHosts."${domain}" = {
enableACME = true;
forceSSL = true;
locations."/" = {
proxyPass = "http://127.0.0.1:${toString config.services.hydra.port}";
};

34
modules/kanboard.nix Normal file
View file

@ -0,0 +1,34 @@
{ config, pkgs, ... }:
let
domain = "kanboard.${config.networking.domain}";
domain_short = "kb.${config.networking.domain}";
in
{
sops.secrets."kanboard_env" = { };
virtualisation.oci-containers = {
containers.kanboard = {
image = "ghcr.io/kanboard/kanboard:v1.2.41";
volumes = [
"kanboard_data:/var/www/app/data"
"kanboard_plugins:/var/www/app/plugins"
];
ports = [ "127.0.0.1:8045:80" ];
environmentFiles = [
config.sops.secrets."kanboard_env".path
];
};
};
services.nginx = {
virtualHosts."${domain_short}" = {
locations."/".return = "301 $scheme://${domain}$request_uri";
};
virtualHosts."${domain}" = {
locations."/" = {
proxyPass = "http://127.0.0.1:8045";
};
};
};
}

View file

@ -0,0 +1,37 @@
{ config, pkgs, ... }:
let
domain = "sso.${config.networking.domain}";
in
{
sops.secrets."keycloak/db" = { };
services.keycloak = {
enable = true;
# we use unstable as the release in stable is insecure
# package = nixpkgs-unstable.legacyPackages.x86_64-linux.keycloak;
settings = {
http-port = 8086;
https-port = 19000;
hostname = domain;
proxy = "edge";
};
# The module requires a password for the DB and works best with its own DB config
# Does an automatic Postgresql configuration
database = {
passwordFile = config.sops.secrets."keycloak/db".path;
};
initialAdminPassword = "plschangeme";
themes = with pkgs ; {
ifsr = keycloak_ifsr_theme;
};
};
services.nginx.virtualHosts."${domain}" = {
locations."/" = {
proxyPass = "http://127.0.0.1:${toString config.services.keycloak.settings.http-port}";
extraConfig = ''
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
'';
};
};
}

View file

@ -0,0 +1,15 @@
{ stdenv }:
stdenv.mkDerivation rec {
name = "keycloak_ifsr_theme";
version = "1.1";
src = ./theme;
nativeBuildInputs = [ ];
buildInputs = [ ];
installPhase = ''
mkdir -p $out
cp -a login $out
'';
}

View file

@ -0,0 +1,772 @@
.login-pf {
background: none;
}
.login-pf body {
background: url(../img/background.jpg) no-repeat center center fixed;
background-size: cover;
height: 100%;
}
/*IE compatibility*/
.pf-c-form-control {
font-size: 14px;
font-size: var(--pf-global--FontSize--sm);
border-width: 1px;
border-width: var(--pf-global--BorderWidth--sm);;
border-color: #EDEDED #EDEDED #8A8D90 #EDEDED;
border-color: var(--pf-global--BorderColor--300) var(--pf-global--BorderColor--300) var(--pf-global--BorderColor--200) var(--pf-global--BorderColor--300);
background-color: #FFFFFF;
background-color: var(--pf-global--BackgroundColor--100);
height: 36px;
height: calc(var(--pf-c-form-control--FontSize) * var(--pf-c-form-control--LineHeight) + var(--pf-c-form-control--BorderWidth) * 2 + var(--pf-c-form-control--PaddingTop) + var(--pf-c-form-control--PaddingBottom));
padding: 5px 0.5rem;
padding: var(--pf-c-form-control--PaddingTop) var(--pf-c-form-control--PaddingRight) var(--pf-c-form-control--PaddingBottom) var(--pf-c-form-control--PaddingLeft);
}
textarea.pf-c-form-control {
height: auto;
}
.pf-c-form-control:hover, .pf-c-form-control:focus {
border-bottom-color: #0066CC;
border-bottom-color: var(--pf-global--primary-color--100);
border-bottom-width: 2px;
border-bottom-width: var(--pf-global--BorderWidth--md);
}
.pf-c-form-control[aria-invalid=true] {
border-bottom-color: #C9190B;
border-bottom-color: var(--pf-global--danger-color--100);
border-bottom-width: 2px;
border-bottom-width: var(--pf-global--BorderWidth--md);
}
.pf-c-check__label, .pf-c-radio__label {
font-size: 14px;
font-size: var(--pf-global--FontSize--sm);
}
.pf-c-alert.pf-m-inline {
margin-bottom: 0.5rem; /* default - IE compatibility */
margin-bottom: var(--pf-global--spacer--sm);
padding: 0.25rem;
padding: var(--pf-global--spacer--xs);
border: solid #ededed;
border: solid var(--pf-global--BorderColor--300);
border-width: 1px;
border-width: var(--pf-c-alert--m-inline--BorderTopWidth) var(--pf-c-alert--m-inline--BorderRightWidth) var(--pf-c-alert--m-inline--BorderBottomWidth) var(--pf-c-alert--m-inline--BorderLeftWidth);
display: -ms-flexbox;
display: grid;
-ms-grid-columns: max-content 1fr max-content;
grid-template-columns:max-content 1fr max-content;
grid-template-columns: var(--pf-c-alert--grid-template-columns);
grid-template-rows: 1fr auto;
grid-template-rows: var(--pf-c-alert--grid-template-rows);
}
.pf-c-alert.pf-m-inline::before {
position: absolute;
top: -1px;
top: var(--pf-c-alert--m-inline--before--Top);
bottom: -1px;
bottom: var(--pf-c-alert--m-inline--before--Bottom);
left: 0;
width: 3px;
width: var(--pf-c-alert--m-inline--before--Width);
content: ;
background-color: #FFFFFF;
background-color: var(--pf-global--BackgroundColor--100);
}
.pf-c-alert.pf-m-inline.pf-m-success::before {
background-color: #92D400;
background-color: var(--pf-global--success-color--100);
}
.pf-c-alert.pf-m-inline.pf-m-danger::before {
background-color: #C9190B;
background-color: var(--pf-global--danger-color--100);
}
.pf-c-alert.pf-m-inline.pf-m-warning::before {
background-color: #F0AB00;
background-color: var(--pf-global--warning-color--100);
}
.pf-c-alert.pf-m-inline .pf-c-alert__icon {
padding: 1rem 0.5rem 1rem 1rem;
padding: var(--pf-c-alert--m-inline__icon--PaddingTop) var(--pf-c-alert--m-inline__icon--PaddingRight) var(--pf-c-alert--m-inline__icon--PaddingBottom) var(--pf-c-alert--m-inline__icon--PaddingLeft);
font-size: 16px;
font-size: var(--pf-c-alert--m-inline__icon--FontSize);
}
.pf-c-alert.pf-m-success .pf-c-alert__icon {
color: #92D400;
color: var(--pf-global--success-color--100);
}
.pf-c-alert.pf-m-success .pf-c-alert__title {
color: #486B00;
color: var(--pf-global--success-color--200);
}
.pf-c-alert.pf-m-danger .pf-c-alert__icon {
color: #C9190B;
color: var(--pf-global--danger-color--100);
}
.pf-c-alert.pf-m-danger .pf-c-alert__title {
color: #A30000;
color: var(--pf-global--danger-color--200);
}
.pf-c-alert.pf-m-warning .pf-c-alert__icon {
color: #F0AB00;
color: var(--pf-global--warning-color--100);
}
.pf-c-alert.pf-m-warning .pf-c-alert__title {
color: #795600;
color: var(--pf-global--warning-color--200);
}
.pf-c-alert__title {
font-size: 14px; /* default - IE compatibility */
font-size: var(--pf-global--FontSize--sm);
padding: 5px 8px;
padding: var(--pf-c-alert__title--PaddingTop) var(--pf-c-alert__title--PaddingRight) var(--pf-c-alert__title--PaddingBottom) var(--pf-c-alert__title--PaddingLeft);
}
.pf-c-button{
padding:0.375rem 1rem;
padding: var(--pf-global--spacer--form-element) var(--pf-global--spacer--md);
}
/* default - IE compatibility */
.pf-m-primary {
color: #FFFFFF;
background-color: #0066CC;
background-color: var(--pf-global--primary-color--100);
}
/* default - IE compatibility */
.pf-m-primary:hover {
background-color: #004080;
background-color: var(--pf-global--primary-color--200);
}
/* default - IE compatibility */
.pf-c-button.pf-m-control {
border: solid 1px;
border: solid var(--pf-global--BorderWidth--sm);
border-color: rgba(230, 230, 230, 0.5);
}
/*End of IE compatibility*/
h1#kc-page-title {
margin-top: 10px;
}
#kc-locale ul {
background-color: #FFF;
background-color: var(--pf-global--BackgroundColor--100);
display: none;
top: 20px;
min-width: 100px;
padding: 0;
}
#kc-locale-dropdown{
display: inline-block;
}
#kc-locale-dropdown:hover ul {
display:block;
}
/* IE compatibility */
#kc-locale-dropdown a {
color: #6A6E73;
color: var(--pf-global--Color--200);
text-align: right;
font-size: 14px;
font-size: var(--pf-global--FontSize--sm);
}
/* IE compatibility */
a#kc-current-locale-link::after {
content: 2c5;
margin-left: 4px;
margin-left: var(--pf-global--spacer--xs)
}
.login-pf .container {
padding-top: 40px;
}
.login-pf a:hover {
color: #0099d3;
}
#kc-logo {
width: 100%;
}
div.kc-logo-text {
background-image: url(../img/agdsn_logo.png);
background-repeat: no-repeat;
background-size: auto;
position: relative;
top: 0%;
left: 25%;
width: 950px;
height: 250px;
}
div.kc-logo-text span {
display: none;
}
#kc-header {
color: #ededed;
overflow: visible;
white-space: nowrap;
}
#kc-header-wrapper {
font-size: 29px;
text-transform: uppercase;
letter-spacing: 3px;
line-height: 1.2em;
padding: 62px 10px 20px;
white-space: normal;
}
#kc-content {
width: 100%;
}
#kc-attempted-username {
font-size: 20px;
font-family: inherit;
font-weight: normal;
padding-right: 10px;
}
#kc-username {
text-align: center;
margin-bottom:-10px;
}
#kc-webauthn-settings-form {
padding-top: 8px;
}
#kc-form-webauthn .select-auth-box-parent {
pointer-events: none;
}
#kc-form-webauthn .select-auth-box-desc {
color: var(--pf-global--palette--black-600);
}
#kc-form-webauthn .select-auth-box-headline {
color: var(--pf-global--Color--300);
}
#kc-form-webauthn .select-auth-box-icon {
flex: 0 0 3em;
}
#kc-form-webauthn .select-auth-box-icon-properties {
margin-top: 10px;
font-size: 1.8em;
}
#kc-form-webauthn .select-auth-box-icon-properties.unknown-transport-class {
margin-top: 3px;
}
#kc-form-webauthn .pf-l-stack__item {
margin: -1px 0;
}
#kc-content-wrapper {
margin-top: 20px;
}
#kc-form-wrapper {
margin-top: 10px;
}
#kc-info {
margin: 20px -40px -30px;
}
#kc-info-wrapper {
font-size: 13px;
padding: 15px 35px;
background-color: #F0F0F0;
}
#kc-form-options span {
display: block;
}
#kc-form-options .checkbox {
margin-top: 0;
color: #72767b;
}
#kc-terms-text {
margin-bottom: 20px;
}
#kc-registration {
margin-bottom: 0;
}
/* TOTP */
.subtitle {
text-align: right;
margin-top: 30px;
color: #909090;
}
.required {
color: #A30000; /* default - IE compatibility */
color: var(--pf-global--danger-color--200);
}
ol#kc-totp-settings {
margin: 0;
padding-left: 20px;
}
ul#kc-totp-supported-apps {
margin-bottom: 10px;
}
#kc-totp-secret-qr-code {
max-width:150px;
max-height:150px;
}
#kc-totp-secret-key {
background-color: #fff;
color: #333333;
font-size: 16px;
padding: 10px 0;
}
/* OAuth */
#kc-oauth h3 {
margin-top: 0;
}
#kc-oauth ul {
list-style: none;
padding: 0;
margin: 0;
}
#kc-oauth ul li {
border-top: 1px solid rgba(255, 255, 255, 0.1);
font-size: 12px;
padding: 10px 0;
}
#kc-oauth ul li:first-of-type {
border-top: 0;
}
#kc-oauth .kc-role {
display: inline-block;
width: 50%;
}
/* Code */
#kc-code textarea {
width: 100%;
height: 8em;
}
/* Social */
.kc-social-links {
margin-top: 20px;
}
.kc-social-provider-logo {
font-size: 23px;
width: 30px;
height: 25px;
float: left;
}
.kc-social-gray {
color: #737679; /* default - IE compatibility */
color: var(--pf-global--Color--200);
}
.kc-social-item {
margin-bottom: 0.5rem; /* default - IE compatibility */
margin-bottom: var(--pf-global--spacer--sm);
font-size: 15px;
text-align: center;
}
.kc-social-provider-name {
position: relative;
top: 3px;
}
.kc-social-icon-text {
left: -15px;
}
.kc-social-grid {
display:grid;
grid-column-gap: 10px;
grid-row-gap: 5px;
grid-column-end: span 6;
--pf-l-grid__item--GridColumnEnd: span 6;
}
.kc-social-grid .kc-social-icon-text {
left: -10px;
}
.kc-login-tooltip {
position: relative;
display: inline-block;
}
.kc-social-section {
text-align: center;
}
.kc-social-section hr{
margin-bottom: 10px
}
.kc-login-tooltip .kc-tooltip-text{
top:-3px;
left:160%;
background-color: black;
visibility: hidden;
color: #fff;
min-width:130px;
text-align: center;
border-radius: 2px;
box-shadow:0 1px 8px rgba(0,0,0,0.6);
padding: 5px;
position: absolute;
opacity:0;
transition:opacity 0.5s;
}
/* Show tooltip */
.kc-login-tooltip:hover .kc-tooltip-text {
visibility: visible;
opacity:0.7;
}
/* Arrow for tooltip */
.kc-login-tooltip .kc-tooltip-text::after {
content: ;
position: absolute;
top: 15px;
right: 100%;
margin-top: -5px;
border-width: 5px;
border-style: solid;
border-color: transparent black transparent transparent;
}
@media (min-width: 768px) {
#kc-container-wrapper {
position: absolute;
width: 100%;
}
.login-pf .container {
padding-right: 80px;
}
#kc-locale {
position: relative;
text-align: right;
z-index: 9999;
}
}
@media (max-width: 767px) {
.login-pf body {
background: white;
}
#kc-header {
padding-left: 15px;
padding-right: 15px;
float: none;
text-align: left;
}
#kc-header-wrapper {
font-size: 16px;
font-weight: bold;
padding: 20px 60px 0 0;
color: #72767b;
letter-spacing: 0;
}
div.kc-logo-text {
margin: 0;
width: 150px;
height: 32px;
background-size: 100%;
}
#kc-form {
float: none;
}
#kc-info-wrapper {
border-top: 1px solid rgba(255, 255, 255, 0.1);
background-color: transparent;
}
.login-pf .container {
padding-top: 15px;
padding-bottom: 15px;
}
#kc-locale {
position: absolute;
width: 200px;
top: 20px;
right: 20px;
text-align: right;
z-index: 9999;
}
}
@media (min-height: 646px) {
#kc-container-wrapper {
bottom: 12%;
}
}
@media (max-height: 645px) {
#kc-container-wrapper {
padding-top: 50px;
top: 20%;
}
}
.card-pf form.form-actions .btn {
float: right;
margin-left: 10px;
}
#kc-form-buttons {
margin-top: 20px;
}
.login-pf-page .login-pf-brand {
margin-top: 20px;
max-width: 360px;
width: 40%;
}
/* Internet Explorer 11 compatibility workaround for select-authenticator screen */
@media all and (-ms-high-contrast: none),
(-ms-high-contrast: active) {
.select-auth-box-parent {
border-top: 1px solid #f0f0f0;
padding-top: 1rem;
padding-bottom: 1rem;
cursor: pointer;
}
.select-auth-box-headline {
font-size: 16px;
color: #06c;
font-weight: bold;
}
.select-auth-box-desc {
font-size: 14px;
}
.pf-l-stack {
flex-basis: 100%;
}
}
/* End of IE11 workaround for select-authenticator screen */
.select-auth-box-arrow{
display: flex;
align-items: center;
margin-right: 2rem;
}
.select-auth-box-icon{
display: flex;
flex: 0 0 2em;
justify-content: center;
margin-right: 1rem;
margin-left: 3rem;
}
.select-auth-box-parent{
border-top: 1px solid var(--pf-global--palette--black-200);
padding-top: 1rem;
padding-bottom: 1rem;
cursor: pointer;
}
.select-auth-box-parent:hover{
background-color: #f7f8f8;
}
.select-auth-container {
}
.select-auth-box-headline {
font-size: var(--pf-global--FontSize--md);
color: var(--pf-global--primary-color--100);
font-weight: bold;
}
.select-auth-box-desc {
font-size: var(--pf-global--FontSize--sm);
}
.select-auth-box-paragraph {
text-align: center;
font-size: var(--pf-global--FontSize--md);
margin-bottom: 5px;
}
.card-pf {
margin: 0 auto;
box-shadow: var(--pf-global--BoxShadow--lg);
padding: 0 20px;
max-width: 500px;
border-top: 4px solid;
border-color: #0066CC; /* default - IE compatibility */
border-color: var(--pf-global--primary-color--100);
}
/*phone*/
@media (max-width: 767px) {
.login-pf-page .card-pf {
max-width: none;
margin-left: 0;
margin-right: 0;
padding-top: 0;
border-top: 0;
box-shadow: 0 0;
}
.kc-social-grid {
grid-column-end: 12;
--pf-l-grid__item--GridColumnEnd: span 12;
}
.kc-social-grid .kc-social-icon-text {
left: -15px;
}
}
.login-pf-page .login-pf-signup {
font-size: 15px;
color: #72767b;
}
#kc-content-wrapper .row {
margin-left: 0;
margin-right: 0;
}
.login-pf-page.login-pf-page-accounts {
margin-left: auto;
margin-right: auto;
}
.login-pf-page .btn-primary {
margin-top: 0;
}
.login-pf-page .list-view-pf .list-group-item {
border-bottom: 1px solid #ededed;
}
.login-pf-page .list-view-pf-description {
width: 100%;
}
#kc-form-login div.form-group:last-of-type,
#kc-register-form div.form-group:last-of-type,
#kc-update-profile-form div.form-group:last-of-type {
margin-bottom: 0px;
}
.no-bottom-margin {
margin-bottom: 0;
}
#kc-back {
margin-top: 5px;
}
/* Recovery codes */
.kc-recovery-codes-warning {
margin-bottom: 32px;
}
.kc-recovery-codes-warning .pf-c-alert__description p {
font-size: 0.875rem;
}
.kc-recovery-codes-list {
list-style: none;
columns: 2;
margin: 16px 0;
padding: 16px 16px 8px 16px;
border: 1px solid #D2D2D2;
}
.kc-recovery-codes-list li {
margin-bottom: 8px;
font-size: 11px;
}
.kc-recovery-codes-list li span {
color: #6A6E73;
width: 16px;
text-align: right;
display: inline-block;
margin-right: 1px;
}
.kc-recovery-codes-actions {
margin-bottom: 24px;
}
.kc-recovery-codes-actions button {
padding-left: 0;
}
.kc-recovery-codes-actions button i {
margin-right: 8px;
}
.kc-recovery-codes-confirmation {
align-items: baseline;
margin-bottom: 16px;
}
/* End Recovery codes */

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

View file

@ -0,0 +1,4 @@
parent=keycloak
import=common/keycloak
styles=css/login.css

View file

@ -1,25 +1,35 @@
From f5c68898be345fb0dca5ab7b596b9cbe674f5dfb Mon Sep 17 00:00:00 2001
From: Rouven Seifert <rouven@rfive.de>
Date: Tue, 4 Jul 2023 15:14:00 +0200
Subject: [PATCH] update user validation regex
---
internal/core/validation.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/internal/core/validation.go b/internal/core/validation.go
index 3e168b5..10dfc0a 100644
--- a/internal/core/validation.go
+++ b/internal/core/validation.go
@@ -30,7 +30,7 @@ import (
)
//this regexp copied from useradd(8) manpage
-const posixAccountNamePattern = `[a-z_][a-z0-9_-]*\$?`
+const posixAccountNamePattern = `[a-z_][a-z0-9._-]*\$?`
diff --git a/cmd/portunus-orchestrator/config.go b/cmd/portunus-orchestrator/config.go
index 4db19f2..290128a 100644
--- a/cmd/portunus-orchestrator/config.go
+++ b/cmd/portunus-orchestrator/config.go
@@ -23,7 +23,7 @@ type valueCheck struct {
}
var (
errIsMissing = errors.New("is missing")
--
2.41.0
- userOrGroupPattern = `^[a-z_][a-z0-9_-]*\$?$`
+ userOrGroupPattern = `^[a-z_][a-z0-9._-]*\$?$`
envDefaults = map[string]string{
//empty value = not optional
"PORTUNUS_DEBUG": "false",
diff --git a/internal/grammars/grammars.go b/internal/grammars/grammars.go
index 1253c05..e458fd0 100644
--- a/internal/grammars/grammars.go
+++ b/internal/grammars/grammars.go
@@ -39,7 +39,7 @@ const (
// This regex is based on the respective format description in the useradd(8) manpage.
//
// This is only shown for documentation purposes here; use func IsPOSIXAccountName instead.
- POSIXAccountNameRegex = `^[a-z_][a-z0-9_-]*\$?$`
+ POSIXAccountNameRegex = `^[a-z_][a-z0-9._-]*\$?$`
)
//TODO There is also some `import "regexp"` in cmd/orchestrator/ldap.go to render
@@ -159,7 +159,7 @@ func checkByteInPOSIXAccountName(idx, length int, b byte) bool {
switch {
case (b >= 'a' && b <= 'z') || b == '_':
return true
- case (b >= '0' && b <= '9') || b == '-':
+ case (b >= '0' && b <= '9') || b == '-' || b == '.':
return idx != 0 // not allowed at start
default:
return false

View file

@ -1,8 +1,8 @@
diff --git a/cmd/orchestrator/ldap.go b/cmd/orchestrator/ldap.go
index ed0d466..a672046 100644
--- a/cmd/orchestrator/ldap.go
+++ b/cmd/orchestrator/ldap.go
@@ -130,7 +130,7 @@ func runLDAPServer(environment map[string]string) {
diff --git a/cmd/portunus-orchestrator/ldap.go b/cmd/portunus-orchestrator/ldap.go
index 9564c5e..40cd2d7 100644
--- a/cmd/portunus-orchestrator/ldap.go
+++ b/cmd/portunus-orchestrator/ldap.go
@@ -134,7 +134,7 @@ func runLDAPServer(environment map[string]string) {
bindURL := "ldap:///"
if environment["PORTUNUS_SLAPD_TLS_CERTIFICATE"] != "" {

View file

@ -1,24 +1,26 @@
diff --git a/internal/core/user.go b/internal/core/user.go
index e74ccfe..291c75b 100644
--- a/internal/core/user.go
+++ b/internal/core/user.go
@@ -8,6 +8,7 @@ package core
diff --git a/internal/ldap/object.go b/internal/ldap/object.go
index d4e5c6f..fcefec7 100644
--- a/internal/ldap/object.go
+++ b/internal/ldap/object.go
@@ -8,6 +8,7 @@ package ldap
import (
"fmt"
+ "strconv"
)
+ "regexp"
// User represents a single user account.
@@ -86,9 +87,9 @@ func (u User) RenderToLDAP(suffix string, allGroups map[string]Group) LDAPObject
"github.com/majewsky/portunus/internal/core"
)
@@ -94,10 +95,11 @@ func renderUser(u core.User, dnSuffix string, allGroups []core.Group) Object {
if u.POSIX.LoginShell != "" {
obj.Attributes["loginShell"] = []string{u.POSIX.LoginShell}
}
+ var nonASCII = regexp.MustCompile("[^\\x00-\\x7F]")
if u.POSIX.GECOS == "" {
- obj.Attributes["gecos"] = []string{u.FullName()}
+ obj.Attributes["gecos"] = []string{strconv.QuoteToASCII(u.FullName())}
+ obj.Attributes["gecos"] = []string{nonASCII.ReplaceAllString(u.FullName(), "")}
} else {
- obj.Attributes["gecos"] = []string{u.POSIX.GECOS}
+ obj.Attributes["gecos"] = []string{strconv.QuoteToASCII(u.POSIX.GECOS)}
+ obj.Attributes["gecos"] = []string{nonASCII.ReplaceAllString(u.POSIX.GECOS, "")}
}
obj.Attributes["objectClass"] = append(obj.Attributes["objectClass"], "posixAccount")
}

View file

@ -1,8 +1,20 @@
diff --git a/internal/core/user.go b/internal/core/user.go
index e74ccfe..ce03eeb 100644
index f45fdf7..4f93b37 100644
--- a/internal/core/user.go
+++ b/internal/core/user.go
@@ -64,7 +64,6 @@ func (u User) RenderToLDAP(suffix string, allGroups map[string]Group) LDAPObject
@@ -76,7 +76,6 @@ func (u User) validateLocal(cfg *ValidationConfig) (errs errext.ErrorSet) {
MustBePosixAccountNameIf(u.LoginName, u.POSIX != nil),
))
errs.Add(ref.Field("given_name").WrapFirst(
- MustNotBeEmpty(u.GivenName),
MustNotHaveSurroundingSpaces(u.GivenName),
))
errs.Add(ref.Field("family_name").WrapFirst(
diff --git a/internal/ldap/object.go b/internal/ldap/object.go
index d4e5c6f..1225084 100644
--- a/internal/ldap/object.go
+++ b/internal/ldap/object.go
@@ -73,7 +73,6 @@ func renderUser(u core.User, dnSuffix string, allGroups []core.Group) Object {
"uid": {u.LoginName},
"cn": {u.FullName()},
"sn": {u.FamilyName},
@ -10,7 +22,7 @@ index e74ccfe..ce03eeb 100644
"userPassword": {u.PasswordHash},
"isMemberOf": memberOfGroupDNames,
"objectClass": {"portunusPerson", "inetOrgPerson", "organizationalPerson", "person", "top"},
@@ -74,6 +73,9 @@ func (u User) RenderToLDAP(suffix string, allGroups map[string]Group) LDAPObject
@@ -83,6 +82,9 @@ func renderUser(u core.User, dnSuffix string, allGroups []core.Group) Object {
if u.EMailAddress != "" {
obj.Attributes["mail"] = []string{u.EMailAddress}
}
@ -20,15 +32,3 @@ index e74ccfe..ce03eeb 100644
if len(u.SSHPublicKeys) > 0 {
obj.Attributes["sshPublicKey"] = u.SSHPublicKeys
}
diff --git a/internal/frontend/users.go b/internal/frontend/users.go
index 225c5b3..1a961ca 100644
--- a/internal/frontend/users.go
+++ b/internal/frontend/users.go
@@ -168,7 +168,6 @@ func buildUserMasterdataFieldset(e core.Engine, u *core.User, state *h.FormState
Name: "given_name",
Label: "Given name",
Rules: []h.ValidationRule{
- core.MustNotBeEmpty,
core.MustNotHaveSurroundingSpaces,
},
},

View file

@ -1,7 +1,7 @@
{ config, lib, pkgs, ... }:
{ config, pkgs, ... }:
let
domain = "auth.${config.networking.domain}";
seed = {
seedSettings = {
groups = [
{
name = "admins";
@ -46,11 +46,6 @@ in
sops.secrets = {
"portunus/admin-password".owner = config.services.portunus.user;
"portunus/search-password".owner = config.services.portunus.user;
"dex/environment".owner = config.systemd.services.dex.serviceConfig.User;
nslcd_ldap_search = {
key = "portunus/search-password";
owner = config.systemd.services.nslcd.serviceConfig.User;
};
};
services.portunus = {
@ -62,13 +57,11 @@ in
./0003-gecos-ascii-escape.patch
./0004-make-givenName-optional.patch
];
doCheck = false; # posix regex related tests break
});
inherit domain;
inherit domain seedSettings;
port = 8681;
dex.enable = true;
seedPath = pkgs.writeText "portunus-seed.json" (builtins.toJSON seed);
ldap = {
suffix = "dc=ifsr,dc=de";
searchUserName = "search";
@ -79,47 +72,19 @@ in
};
};
services.dex.settings.oauth2.skipApprovalScreen = true;
systemd.services.dex.serviceConfig = {
DynamicUser = lib.mkForce false;
EnvironmentFile = config.sops.secrets."dex/environment".path;
StateDirectory = "dex";
User = "dex";
};
users = {
users.dex = {
group = "dex";
isSystemUser = true;
};
groups.dex = { };
ldap =
let portunus = config.services.portunus; in
rec {
enable = true;
server = "ldap://localhost";
base = "${portunus.ldap.suffix}";
bind = {
distinguishedName = "uid=${portunus.ldap.searchUserName},ou=users,${base}";
passwordFile = config.sops.secrets.nslcd_ldap_search.path;
};
daemon.enable = true;
};
};
security.pam.services.sshd.makeHomeDir = true;
services.nginx = {
enable = true;
virtualHosts."${config.services.portunus.domain}" = {
forceSSL = true;
enableACME = true;
locations = {
"/".proxyPass = "http://localhost:${toString config.services.portunus.port}";
"/dex".proxyPass = "http://localhost:${toString config.services.portunus.dex.port}";
};
};
};
networking.firewall = {
extraInputRules = ''
ip saddr { 141.30.86.192/26, 141.76.100.128/25, 141.30.30.169, 10.88.0.1/16 } tcp dport 636 accept comment "Allow ldaps access from office nets and podman"
'';
};
}

View file

@ -1,298 +1,17 @@
{ config, pkgs, ... }:
{ config, ... }:
let
hostname = "mail.${config.networking.domain}";
domain = config.networking.domain;
rspamd-domain = "rspamd.${config.networking.domain}";
dovecot-ldap-args = pkgs.writeText "ldap-args" ''
uris = ldap://localhost
dn = uid=search, ou=users, dc=ifsr, dc=de
auth_bind = yes
!include ${config.sops.secrets."dovecot_ldap_search".path}
ldap_version = 3
scope = subtree
base = dc=ifsr, dc=de
user_filter = (&(objectClass=posixAccount)(uid=%n))
pass_filter = (&(objectClass=posixAccount)(uid=%n))
'';
# see https://www.kuketz-blog.de/e-mail-anbieter-ip-stripping-aus-datenschutzgruenden/
header_cleanup = pkgs.writeText "header_cleanup_outgoing" ''
/^\s*(Received: from)[^\n]*(.*)/ REPLACE $1 127.0.0.1 (localhost [127.0.0.1])$2
/^\s*User-Agent/ IGNORE
/^\s*X-Enigmail/ IGNORE
/^\s*X-Mailer/ IGNORE
/^\s*X-Originating-IP/ IGNORE
/^\s*Mime-Version/ IGNORE
'';
in
{
sops.secrets."rspamd-password".owner = config.users.users.rspamd.name;
sops.secrets."dovecot_ldap_search".owner = config.services.dovecot2.user;
sops.secrets."postfix_ldap_aliases".owner = config.services.postfix.user;
networking.firewall.allowedTCPPorts = [
25 # insecure SMTP
143
465
587 # SMTP
993 # IMAP
4190 # sieve
imports = [
./postfix.nix
./dovecot2.nix
./rspamd.nix
./sogo.nix
./mailman.nix
];
users.users.postfix.extraGroups = [ "opendkim" ];
environment.etc = {
"dovecot/sieve-pipe/sa-learn-spam.sh" = {
text = ''
#!/bin/sh
${pkgs.rspamd}/bin/rspamc learn_spam
'';
mode = "0555";
};
"dovecot/sieve-pipe/sa-learn-ham.sh" = {
text = ''
#!/bin/sh
${pkgs.rspamd}/bin/rspamc learn_ham
'';
mode = "0555";
};
"dovecot/sieve/report-spam.sieve" = {
source = ./report-spam.sieve;
user = "dovecot2";
group = "dovecot2";
mode = "0544";
};
"dovecot/sieve/report-ham.sieve" = {
source = ./report-ham.sieve;
user = "dovecot2";
group = "dovecot2";
mode = "0544";
};
};
services = {
postfix = {
enable = true;
enableSubmission = true;
enableSubmissions = true;
hostname = "${hostname}";
domain = "${domain}";
origin = "${domain}";
destination = [ "${hostname}" "${domain}" "localhost" ];
networksStyle = "host"; # localhost and own public IP
sslCert = "/var/lib/acme/${hostname}/fullchain.pem";
sslKey = "/var/lib/acme/${hostname}/key.pem";
relayDomains = [ "hash:/var/lib/mailman/data/postfix_domains" ];
config = {
home_mailbox = "Maildir/";
# hostname used in helo command. It is recommended to have this match the reverse dns entry
smtp_helo_name = config.networking.rDNS;
smtp_use_tls = true;
# smtp_tls_security_level = "encrypt";
smtpd_use_tls = true;
# smtpd_tls_security_level = lib.mkForce "encrypt";
# smtpd_tls_auth_only = true;
smtpd_tls_protocols = [
"!SSLv2"
"!SSLv3"
"!TLSv1"
"!TLSv1.1"
];
# "reject_non_fqdn_hostname"
smtpd_recipient_restrictions = [
"permit_sasl_authenticated"
"permit_mynetworks"
"reject_unauth_destination"
"reject_non_fqdn_sender"
"reject_non_fqdn_recipient"
"reject_unknown_sender_domain"
"reject_unknown_recipient_domain"
"reject_unauth_destination"
"reject_unauth_pipelining"
"reject_invalid_hostname"
"check_policy_service inet:localhost:12340"
];
smtpd_relay_restrictions = [
"permit_sasl_authenticated"
"permit_mynetworks"
"reject_unauth_destination"
];
smtp_header_checks = "pcre:${header_cleanup}";
# smtpd_sender_login_maps = [ "ldap:${ldap-senders}" ];
alias_maps = [ "hash:/etc/aliases" ];
alias_database = [ "hash:/etc/aliases" ];
# alias_maps = [ "hash:/etc/aliases" "ldap:${ldap-aliases}" ];
smtpd_milters = [ "local:/run/opendkim/opendkim.sock" ];
non_smtpd_milters = [ "local:/var/run/opendkim/opendkim.sock" ];
smtpd_sasl_auth_enable = true;
smtpd_sasl_path = "/var/lib/postfix/auth";
smtpd_sasl_type = "dovecot";
#mailman stuff
mailbox_transport = "lmtp:unix:/run/dovecot2/dovecot-lmtp";
transport_maps = [ "hash:/var/lib/mailman/data/postfix_lmtp" ];
virtual_alias_maps = [ "hash:/var/lib/mailman/data/postfix_vmap" ];
local_recipient_maps = [ "hash:/var/lib/mailman/data/postfix_lmtp" "ldap:${config.sops.secrets."postfix_ldap_aliases".path}" "$alias_maps" ];
};
};
dovecot2 = {
enable = true;
enableImap = true;
enableQuota = true;
quotaGlobalPerUser = "10G";
enableLmtp = true;
mailLocation = "maildir:~/Maildir";
sslServerCert = "/var/lib/acme/${hostname}/fullchain.pem";
sslServerKey = "/var/lib/acme/${hostname}/key.pem";
protocols = [ "imap" "sieve" ];
mailPlugins = {
perProtocol = {
imap = {
enable = [ "imap_sieve" ];
};
lmtp = {
enable = [ "sieve" ];
};
};
};
mailboxes = {
Spam = {
auto = "subscribe";
specialUse = "Junk";
autoexpunge = "60d";
};
Sent = {
auto = "subscribe";
specialUse = "Sent";
};
Drafts = {
auto = "subscribe";
specialUse = "Drafts";
};
Trash = {
auto = "subscribe";
specialUse = "Trash";
};
};
modules = [
pkgs.dovecot_pigeonhole
];
extraConfig = ''
auth_username_format = %Ln
passdb {
driver = ldap
args = ${dovecot-ldap-args}
}
userdb {
driver = ldap
args = ${dovecot-ldap-args}
}
service auth {
unix_listener /var/lib/postfix/auth {
group = postfix
mode = 0660
user = postfix
}
}
service managesieve-login {
inet_listener sieve {
port = 4190
}
service_count = 1
}
namespace inbox {
separator = /
inbox = yes
}
service lmtp {
unix_listener dovecot-lmtp {
group = postfix
mode = 0600
user = postfix
}
client_limit = 1
}
mail_plugins = $mail_plugins listescape
plugin {
sieve_plugins = sieve_imapsieve sieve_extprograms
sieve_global_extensions = +vnd.dovecot.pipe
sieve_pipe_bin_dir = /etc/dovecot/sieve-pipe
# Spam: From elsewhere to Spam folder or flag changed in Spam folder
imapsieve_mailbox1_name = Spam
imapsieve_mailbox1_causes = COPY APPEND FLAG
imapsieve_mailbox1_before = file:/etc/dovecot/sieve/report-spam.sieve
# Ham: From Spam folder to elsewhere
imapsieve_mailbox2_name = *
imapsieve_mailbox2_from = Spam
imapsieve_mailbox2_causes = COPY
imapsieve_mailbox2_before = file:/etc/dovecot/sieve/report-ham.sieve
# https://doc.dovecot.org/configuration_manual/plugins/listescape_plugin/
listescape_char = "\\"
}
'';
};
opendkim = {
enable = true;
domains = "csl:${config.networking.domain}";
selector = config.networking.hostName;
configFile = pkgs.writeText "opendkim-config" ''
UMask 0117
'';
};
rspamd = {
enable = true;
postfix.enable = true;
locals = {
"worker-controller.inc".source = config.sops.secrets."rspamd-password".path;
"redis.conf".text = ''
read_servers = "127.0.0.1";
write_servers = "127.0.0.1";
'';
# headers in spamassasin style to not break old sieve scripts
"worker-proxy.inc".text = ''
spam_header = "X-Spam-Flag";
'';
"milter_headers.conf".text = ''
use = ["x-spam-level", "x-spam-status"];
'';
};
};
redis = {
vmOverCommit = true;
servers.rspamd = {
enable = true;
port = 6379;
};
};
nginx = {
enable = true;
recommendedGzipSettings = true;
recommendedOptimisation = true;
recommendedProxySettings = true;
recommendedTlsSettings = true;
virtualHosts."${hostname}" = {
forceSSL = true;
enableACME = true;
};
virtualHosts."${rspamd-domain}" = {
forceSSL = true;
enableACME = true;
locations = {
"/" = {
proxyPass = "http://127.0.0.1:11334";
proxyWebsockets = true;
};
};
};
};
};
security.acme.certs."${domain}" = {
security.acme.certs."${hostname}" = {
reloadServices = [
"postfix.service"
"dovecot2.service"

158
modules/mail/dovecot2.nix Normal file
View file

@ -0,0 +1,158 @@
{ lib, config, pkgs, ... }:
let
hostname = "mail.${config.networking.domain}";
dovecot-ldap-args = pkgs.writeText "ldap-args" ''
uris = ldap://localhost
dn = uid=search, ou=users, dc=ifsr, dc=de
auth_bind = yes
!include ${config.sops.secrets."dovecot_ldap_search".path}
ldap_version = 3
scope = subtree
base = dc=ifsr, dc=de
user_filter = (&(objectClass=posixAccount)(uid=%n))
pass_filter = (&(objectClass=posixAccount)(uid=%n))
'';
in
{
networking.firewall.allowedTCPPorts = [
993 # IMAPS
4190 # Managesieve
];
sops.secrets."dovecot_ldap_search".owner = config.services.dovecot2.user;
services.dovecot2 = {
enable = true;
enableImap = true;
enableQuota = true;
quotaGlobalPerUser = "10G";
enableLmtp = true;
enablePAM = false;
mailLocation = "maildir:~/Maildir";
sslServerCert = "/var/lib/acme/${hostname}/fullchain.pem";
sslServerKey = "/var/lib/acme/${hostname}/key.pem";
protocols = [ "imap" "sieve" ];
mailPlugins = {
globally.enable = [ "listescape" ];
perProtocol = {
imap = {
enable = [ "imap_sieve" "imap_filter_sieve" ];
};
lmtp = {
enable = [ "sieve" ];
};
};
};
mailboxes = {
Spam = {
auto = "subscribe";
specialUse = "Junk";
autoexpunge = "60d";
};
Sent = {
auto = "subscribe";
specialUse = "Sent";
};
Drafts = {
auto = "subscribe";
specialUse = "Drafts";
};
Trash = {
auto = "subscribe";
specialUse = "Trash";
};
Archive = {
auto = "no";
specialUse = "Archive";
};
};
modules = [
pkgs.dovecot_pigeonhole
];
# set to satisfy the sieveScripts check, will be overridden by userdb lookups anyways
mailUser = "vmail";
mailGroup = "vmail";
sieve = {
# just pot something in here to prevent empty strings
extensions = [ "notify" ];
pipeBins = map lib.getExe [
(pkgs.writeShellScriptBin "learn-ham.sh" "exec ${pkgs.rspamd}/bin/rspamc learn_ham")
(pkgs.writeShellScriptBin "learn-spam.sh" "exec ${pkgs.rspamd}/bin/rspamc learn_spam")
];
plugins = [
"sieve_imapsieve"
"sieve_extprograms"
];
scripts = {
before = pkgs.writeText "spam.sieve" ''
require "fileinto";
if anyof(
header :contains "x-spam-flag" "yes",
header :contains "X-Spam-Status" "Yes"){
fileinto "Spam";
}
'';
};
};
imapsieve.mailbox = [
{
# Spam: From elsewhere to Spam folder or flag changed in Spam folder
name = "Spam";
causes = [ "COPY" "APPEND" "FLAG" ];
before = ./report-spam.sieve;
}
{
# From Junk folder to elsewhere
name = "*";
from = "Spam";
causes = [ "COPY" ];
before = ./report-ham.sieve;
}
];
extraConfig = ''
auth_username_format = %Ln
passdb {
driver = ldap
args = ${dovecot-ldap-args}
}
userdb {
driver = ldap
args = ${dovecot-ldap-args}
}
service auth {
unix_listener /var/lib/postfix/auth {
group = postfix
mode = 0660
user = postfix
}
}
service managesieve-login {
inet_listener sieve {
port = 4190
}
service_count = 1
}
namespace inbox {
separator = /
inbox = yes
}
service lmtp {
unix_listener dovecot-lmtp {
group = postfix
mode = 0600
user = postfix
}
client_limit = 1
}
plugin {
# https://doc.dovecot.org/configuration_manual/plugins/listescape_plugin/
listescape_char = "\\"
}
'';
};
}

View file

@ -20,8 +20,10 @@
webSettings = {
DATABASES.default = {
ENGINE = "django.db.backends.postgresql";
NAME = "mailmanweb";
NAME = "mailman-web";
};
ACCOUNT_EMAIL_UNKNOWN_ACCOUNTS = false;
ACCOUNT_PREVENT_ENUMERATION = false;
};
ldap = {
enable = true;
@ -40,26 +42,43 @@
superUserGroup = "cn=admins,ou=groups,dc=ifsr,dc=de";
};
};
services.postfix = {
relayDomains = [ "hash:/var/lib/mailman/data/postfix_domains" ];
config = {
mailbox_transport = "lmtp:unix:/run/dovecot2/dovecot-lmtp";
transport_maps = [ "hash:/var/lib/mailman/data/postfix_lmtp" ];
virtual_alias_maps = [ "hash:/var/lib/mailman/data/postfix_vmap" ];
local_recipient_maps = [ "hash:/var/lib/mailman/data/postfix_lmtp" ];
};
};
services.postgresql = {
enable = true;
ensureUsers = [
{
name = "mailman";
ensurePermissions = {
"DATABASE mailman" = "ALL PRIVILEGES";
};
ensureDBOwnership = true;
}
{
name = "mailman-web";
ensurePermissions = {
"DATABASE mailmanweb" = "ALL PRIVILEGES";
};
ensureDBOwnership = true;
}
];
ensureDatabases = [ "mailman" "mailmanweb" ];
ensureDatabases = [ "mailman" "mailman-web" ];
};
services.nginx.virtualHosts."lists.${config.networking.domain}" = {
enableACME = true;
forceSSL = true;
locations."/accounts/signup" = {
extraConfig = ''
allow 141.30.0.0/16;
allow 141.76.0.0/16;
deny all;
uwsgi_pass unix:/run/mailman-web.socket;
'';
};
locations."/robots.txt" = {
extraConfig = ''
add_header Content-Type text/plain;
return 200 "User-agent: *\nDisallow: /\n";
'';
};
};
}

98
modules/mail/postfix.nix Normal file
View file

@ -0,0 +1,98 @@
{ config, pkgs, ... }:
let
domain = config.networking.domain;
hostname = "mail.${config.networking.domain}";
# see https://www.kuketz-blog.de/e-mail-anbieter-ip-stripping-aus-datenschutzgruenden/
header_cleanup = pkgs.writeText "header_cleanup_outgoing" ''
/^\s*(Received: from)[^\n]*(.*)/ REPLACE $1 127.0.0.1 (localhost [127.0.0.1])$2
/^\s*User-Agent/ IGNORE
/^\s*X-Enigmail/ IGNORE
/^\s*X-Mailer/ IGNORE
/^\s*X-Originating-IP/ IGNORE
/^\s*Mime-Version/ IGNORE
'';
# https://unix.stackexchange.com/questions/294300/postfix-prevent-users-from-changing-the-real-e-mail-address
login_maps = pkgs.writeText "login_maps.pcre" ''
# basic username => username@ifsr.de
/^([^@+]*)(\+[^@]*)?@ifsr\.de$/ ''${1}
'';
in
{
sops.secrets."postfix_ldap_aliases".owner = config.services.postfix.user;
networking.firewall.allowedTCPPorts = [
25 # SMTP
465 # Submissions
587 # Submission
];
services = {
postfix = {
enable = true;
enableSubmission = true;
enableSubmissions = true;
hostname = "${hostname}";
domain = "${domain}";
origin = "${domain}";
destination = [ "${hostname}" "${domain}" "localhost" ];
networksStyle = "host"; # localhost and own public IP
sslCert = "/var/lib/acme/${hostname}/fullchain.pem";
sslKey = "/var/lib/acme/${hostname}/key.pem";
config = {
home_mailbox = "Maildir/";
# 25 MiB
message_size_limit = "26214400";
# hostname used in helo command. It is recommended to have this match the reverse dns entry
smtp_helo_name = config.networking.rDNS;
smtpd_banner = "${config.networking.rDNS} ESMTP $mail_name";
smtp_tls_security_level = "may";
smtpd_tls_security_level = "may";
smtpd_tls_auth_only = true;
smtpd_tls_protocols = [
"!SSLv2"
"!SSLv3"
"!TLSv1"
"!TLSv1.1"
];
# "reject_non_fqdn_hostname"
smtpd_recipient_restrictions = [
"permit_sasl_authenticated"
"permit_mynetworks"
"reject_unauth_destination"
"reject_non_fqdn_sender"
"reject_non_fqdn_recipient"
"reject_unknown_sender_domain"
"reject_unknown_recipient_domain"
"reject_unauth_destination"
"reject_unauth_pipelining"
"reject_invalid_hostname"
"check_policy_service inet:localhost:12340"
];
smtpd_relay_restrictions = [
"permit_sasl_authenticated"
"permit_mynetworks"
"reject_unauth_destination"
];
# https://www.postfix.org/smtp-smuggling.html
smtpd_data_restrictions = [
"reject_unauth_pipelining"
];
smtpd_sender_restrictions = [
"reject_authenticated_sender_login_mismatch"
];
smtpd_sender_login_maps = [
"pcre:/etc/special-aliases.pcre"
"pcre:${login_maps}"
];
smtp_header_checks = "pcre:${header_cleanup}";
# smtpd_sender_login_maps = [ "ldap:${ldap-senders}" ];
alias_maps = [ "hash:/etc/aliases" ];
alias_database = [ "hash:/etc/aliases" ];
# alias_maps = [ "hash:/etc/aliases" "ldap:${ldap-aliases}" ];
smtpd_sasl_auth_enable = true;
smtpd_sasl_path = "/var/lib/postfix/auth";
smtpd_sasl_type = "dovecot";
local_recipient_maps = [ "ldap:${config.sops.secrets."postfix_ldap_aliases".path}" "$alias_maps" ];
};
};
};
}

View file

@ -12,4 +12,4 @@ if environment :matches "imap.user" "*" {
set "username" "${1}";
}
pipe :copy "sa-learn-ham.sh" [ "${username}" ];
pipe :copy "learn-ham.sh" [ "${username}" ];

View file

@ -4,4 +4,4 @@ if environment :matches "imap.user" "*" {
set "username" "${1}";
}
pipe :copy "sa-learn-spam.sh" [ "${username}" ];
pipe :copy "learn-spam.sh" [ "${username}" ];

218
modules/mail/rspamd.nix Normal file
View file

@ -0,0 +1,218 @@
{ config, pkgs, ... }:
let
domain = "rspamd.${config.networking.domain}";
in
{
sops.secrets."rspamd-password".owner = config.users.users.rspamd.name;
users.users.rspamd.extraGroups = [ "redis-rspamd" ];
services = {
rspamd = {
enable = true;
postfix.enable = true;
locals = {
"worker-controller.inc".source = config.sops.secrets."rspamd-password".path;
"redis.conf".text = ''
read_servers = "/run/redis-rspamd/redis.sock";
write_servers = "/run/redis-rspamd/redis.sock";
'';
# headers in spamassasin style to not break old sieve scripts
"worker-proxy.inc".text = ''
spam_header = "X-Spam-Flag";
'';
"milter_headers.conf".text = ''
use = ["x-spam-level", "x-spam-status", "x-spamd-result", "authentication-results" ];
'';
"neural.conf".text = ''
servers = "/run/redis-rspamd/redis.sock";
enabled = true;
'';
"neural_group.conf".text = ''
symbols = {
"NEURAL_SPAM" {
weight = 0.5; # fairly low weight since we don't know how this will behave
description = "Neural network spam";
}
"NEURAL_HAM" {
weight = -0.5;
description = "Neural network ham";
}
}
'';
"dmarc.conf".text = ''
reporting {
enabled = true;
email = 'noreply-dmarc@${config.networking.domain}';
domain = '${config.networking.domain}';
org_name = '${config.networking.domain}';
from_name = 'DMARC Aggregate Report';
}
'';
"dkim_signing.conf".text = ''
selector = "quitte2024";
allow_username_mismatch = true;
allow_hdrfrom_mismatch = true;
use_domain_sign_local = "ifsr.de";
path = /var/lib/rspamd/dkim/$domain.$selector.key;
'';
"reputation.conf".text = ''
rules {
ip_reputation = {
selector "ip" {
}
backend "redis" {
servers = "/run/redis-rspamd/redis.sock";
}
symbol = "IP_REPUTATION";
}
spf_reputation = {
selector "spf" {
}
backend "redis" {
servers = "/run/redis-rspamd/redis.sock";
}
symbol = "SPF_REPUTATION";
}
dkim_reputation = {
selector "dkim" {
}
backend "redis" {
servers = "/run/redis-rspamd/redis.sock";
}
symbol = "DKIM_REPUTATION"; # Also adjusts scores for DKIM_ALLOW, DKIM_REJECT
}
generic_reputation = {
selector "generic" {
selector = "ip"; # see https://rspamd.com/doc/configuration/selectors.html
}
backend "redis" {
servers = "/run/redis-rspamd/redis.sock";
}
symbol = "GENERIC_REPUTATION";
}
}
'';
"groups.conf".text = ''
group "reputation" {
symbols = {
"IP_REPUTATION_HAM" {
weight = 1.0;
}
"IP_REPUTATION_SPAM" {
weight = 4.0;
}
"DKIM_REPUTATION" {
weight = 1.0;
}
"SPF_REPUTATION_HAM" {
weight = 1.0;
}
"SPF_REPUTATION_SPAM" {
weight = 2.0;
}
"GENERIC_REPUTATION" {
weight = 1.0;
}
}
}
'';
"multimap.conf".text =
let
local_ips = pkgs.writeText "localhost.map" ''
::1
127.0.0.1
'';
tud_ips = pkgs.writeText "tud.map" ''
141.30.0.0/16
141.76.0.0/16
'';
in
''
WHITELIST_SENDER_DOMAIN {
type = "from";
filter = "email:domain";
map = "/var/lib/rspamd/whitelist.sender.domain.map";
action = "accept";
regexp = true;
}
WHITELIST_SENDER_EMAIL {
type = "from";
map = "/var/lib/rspamd/whitelist.sender.email.map";
action = "accept";
regexp = true;
}
BLACKLIST_SENDER_DOMAIN {
type = "from";
filter = "email:domain";
map = "/var/lib/rspamd/blacklist.sender.domain.map";
action = "reject";
regexp = true;
}
BLACKLIST_SENDER_EMAIL {
type = "from";
map = "/var/lib/rspamd/blacklist.sender.email.map";
action = "reject";
regexp = true;
}
BLACKLIST_SUBJECT_KEYWORDS {
type = "header";
header = "Subject"
map = "/var/lib/rspamd/blacklist.keyword.subject.map";
action = "reject";
regexp = true;
}
RECEIVED_LOCALHOST {
type = "ip";
action = "accept";
map = ${local_ips};
}
RECEIVED_TU_NETWORKS {
type = "ip";
map = ${tud_ips};
}
'';
};
};
redis = {
vmOverCommit = true;
servers.rspamd = {
enable = true;
};
};
nginx = {
virtualHosts."${domain}" = {
locations = {
"/" = {
proxyPass = "http://127.0.0.1:11334";
proxyWebsockets = true;
extraConfig = ''
allow 141.30.0.0/16;
allow 141.76.0.0/16;
deny all;
'';
};
};
};
};
};
systemd = {
services.rspamd-dmarc-report = {
description = "rspamd dmarc reporter";
serviceConfig = {
Type = "oneshot";
ExecStart = "${pkgs.rspamd}/bin/rspamadm dmarc_report -v";
User = "rspamd";
Group = "rspamd";
};
startAt = "daily";
};
};
}

View file

@ -51,9 +51,7 @@ in
ensureUsers = [
{
name = "sogo";
ensurePermissions = {
"DATABASE sogo" = "ALL PRIVILEGES";
};
ensureDBOwnership = true;
}
];
ensureDatabases = [ "sogo" ];
@ -67,11 +65,7 @@ in
proxy_buffers 8 64k;
proxy_buffer_size 64k;
'';
forceSSL = true;
enableACME = true;
locations = {
"^~/SOGo".extraConfig = lib.mkForce ''
proxy_pass http://127.0.0.1:20000;
proxy_redirect http://127.0.0.1:20000 default;

View file

@ -1,7 +1,7 @@
{ config, pkgs, ... }:
let
domainServer = "matrix.staging.${config.networking.domain}";
domainClient = "chat.staging.${config.networking.domain}";
domainServer = "matrix.${config.networking.domain}";
domainClient = "chat.${config.networking.domain}";
clientConfig = {
"m.homeserver" = {
@ -19,15 +19,17 @@ let
return 200 '${builtins.toJSON data}';
'';
# build ldap3 plugin from git because it's very outdated in nixpkgs
matrix-synapse-ldap3 = pkgs.python3.pkgs.callPackage ../pkgs/matrix-synapse-ldap3.nix { };
# matrix-synapse-ldap3 = config.services.matrix-synapse.package.plugins.matrix-synapse-ldap3;
matrix-synapse-ldap3 = config.services.matrix-synapse.package.plugins.matrix-synapse-ldap3;
in
{
imports = [ ./mautrix-telegram.nix ];
sops.secrets.matrix_ldap_search = {
key = "portunus/search-password";
owner = config.systemd.services.matrix-synapse.serviceConfig.User;
};
nixpkgs.config.permittedInsecurePackages = [
"olm-3.2.16"
];
services = {
postgresql = {
@ -42,9 +44,6 @@ in
virtualHosts = {
# synapse
"${domainServer}" = {
enableACME = true;
forceSSL = true;
# homeserver discovery
locations."= /.well-known/matrix/client".extraConfig = mkWellKnown clientConfig;
locations."= /.well-known/matrix/server".extraConfig = mkWellKnown serverConfig;
@ -59,12 +58,12 @@ in
# element
"${domainClient}" = {
enableACME = true;
forceSSL = true;
root = pkgs.element-web.override {
conf = {
default_server_config = clientConfig;
default_server_config = {
inherit (clientConfig) "m.homeserver";
"m.identity_server".base_url = "";
};
disable_3pid_login = true;
};
};
@ -77,6 +76,10 @@ in
plugins = [ matrix-synapse-ldap3 ];
log = {
root.level = "WARNING";
};
settings = {
server_name = domainServer;

View file

@ -10,9 +10,7 @@ in
enable = true;
ensureUsers = [{
name = "mautrix-telegram";
ensurePermissions = {
"DATABASE \"mautrix-telegram\"" = "ALL PRIVILEGES";
};
ensureDBOwnership = true;
}];
ensureDatabases = [ "mautrix-telegram" ];
};
@ -46,12 +44,13 @@ in
# Use postgresql instead of sqlite
database = "postgresql:///mautrix-telegram?host=/run/postgresql";
port = 8082;
address = "localhost:${toString port}";
address = "http://localhost:${toString port}";
};
bridge = {
relaybot.authless_portals = false;
permissions = {
# Add yourself here temporarily
"@admin:${homeserverDomain}" = "admin";
};
relay_user_distinguishers = [ ];

View file

@ -0,0 +1,52 @@
{ pkgs, config, lib, ... }:
{
nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
"minecraft-server"
];
services.minecraft-servers = {
enable = true;
eula = true;
servers.ifsr = {
enable = true;
package = pkgs.fabricServers.fabric-1_21;
jvmOpts = "-Xmx8192M -Xms8192M";
};
};
services.bluemap = {
enable = true;
host = "map.mc.ifsr.de";
eula = true;
onCalendar = "hourly";
defaultWorld = "/srv/minecraft/ifsr/world";
};
services.nginx.virtualHosts."map.mc.ifsr.de".extraConfig = ''
allow 141.30.0.0/16;
allow 141.76.0.0/16;
allow 217.160.244.15/32; # jonas uptime kuma
deny all;
'';
networking.firewall = {
extraInputRules = ''
ip saddr { 141.30.0.0/16, 141.76.0.0/16, 217.160.244.15/32 } tcp dport 25565 accept comment "Allow minecraft access from TU network and jonas monitoring"
'';
};
users.users.minecraft = {
isNormalUser = true;
isSystemUser = lib.mkForce false;
openssh.authorizedKeys.keys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILkxTuzjS3EswMfj+wSKu9ciRyStvjDlDUXzkqEUGDaP rouven@thinkpad"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOhdjiPvtAo/ZV36RjBBPSlixzeP3VN6cqa4YAmM5uXM ff00005@ff00005-laptop" # malte
];
};
security.sudo.extraRules = [
{
users = [ "minecraft" ];
commands = [
{ command = "/run/current-system/sw/bin/systemctl restart minecraft-server-ifsr"; options = [ "NOPASSWD" ]; }
{ command = "/run/current-system/sw/bin/systemctl start minecraft-server-ifsr"; options = [ "NOPASSWD" ]; }
{ command = "/run/current-system/sw/bin/systemctl stop minecraft-server-ifsr"; options = [ "NOPASSWD" ]; }
];
}
];
}

View file

@ -0,0 +1,90 @@
{ config, ... }:
let
domain = "monitoring.${config.networking.domain}";
in
{
sops.secrets."grafana/oidc_secret" = {
owner = "grafana";
};
# grafana configuration
services.grafana = {
enable = true;
settings = {
server = {
inherit domain;
http_addr = "127.0.0.1";
http_port = 2342;
root_url = "https://monitoring.ifsr.de";
};
database = {
type = "postgres";
user = "grafana";
host = "/run/postgresql";
};
"auth.generic_oauth" = {
enabled = true;
name = "iFSR";
allow_sign_up = true;
client_id = "grafana";
client_secret = "$__file{${config.sops.secrets."grafana/oidc_secret".path}}";
scopes = "openid email profile offline_access roles";
email_attribute_path = "email";
login_attribute_path = "username";
name_attribute_path = "full_name";
auth_url = "https://sso.ifsr.de/realms/internal/protocol/openid-connect/auth";
token_url = "https://sso.ifsr.de/realms/internal/protocol/openid-connect/token";
api_url = "https://sso.ifsr.de/realms/internal/protocol/openid-connect/userinfo";
role_attribute_path = "contains(roles[*], 'admin') && 'Admin' || contains(roles[*], 'editor') && 'Editor' || 'Viewer'";
};
};
};
services.postgresql = {
enable = true;
ensureUsers = [
{
name = "grafana";
ensureDBOwnership = true;
}
];
ensureDatabases = [ "grafana" ];
};
services.prometheus = {
enable = true;
port = 9001;
exporters = {
node = {
enable = true;
enabledCollectors = [ "systemd" ];
port = 9002;
};
};
scrapeConfigs = [
{
job_name = "node";
static_configs = [{
targets = [ "127.0.0.1:${toString config.services.prometheus.exporters.node.port}" ];
}];
scrape_interval = "15s";
}
{
job_name = "rspamd";
static_configs = [{
targets = [ "rspamd.ifsr.de:11334" ];
}];
scrape_interval = "15s";
}
];
};
# nginx reverse proxy
services.nginx.virtualHosts.${domain} = {
locations."/" = {
proxyPass = "http://localhost:${toString config.services.grafana.settings.server.http_port}";
proxyWebsockets = true;
};
};
}

View file

@ -1,7 +1,6 @@
{ config, pkgs, lib, ... }:
let
domain = "nc.staging.${config.networking.domain}";
legacy_domain = "oc.${config.networking.domain}";
domain = "nc.${config.networking.domain}";
in
{
sops.secrets = {
@ -15,8 +14,8 @@ in
services = {
nextcloud = {
enable = true;
package = pkgs.nextcloud25;
enableBrokenCiphersForSSE = false; # disable the openssl warning
configureRedis = true;
package = pkgs.nextcloud29;
hostName = domain;
https = true; # Use https for all urls
phpExtraExtensions = all: [
@ -29,17 +28,22 @@ in
};
# postgres database is configured automatically
database.createLocally = true;
};
# Enable ACME and force SSL
nginx.virtualHosts.${domain} = {
enableACME = true;
forceSSL = true;
};
nginx.virtualHosts.${legacy_domain} = {
enableACME = true;
forceSSL = true;
locations."/".return = "301 https://nc.ifsr.de";
# enable HEIC image preview
settings.enabledPreviewProviders = [
"OC\\Preview\\BMP"
"OC\\Preview\\GIF"
"OC\\Preview\\JPEG"
"OC\\Preview\\Krita"
"OC\\Preview\\MarkDown"
"OC\\Preview\\MP3"
"OC\\Preview\\OpenDocument"
"OC\\Preview\\PNG"
"OC\\Preview\\TXT"
"OC\\Preview\\XBitmap"
"OC\\Preview\\HEIC"
];
};
};
@ -74,6 +78,9 @@ in
preStart = pkgs.writeScript "nextcloud-preStart" ''
# enable included LDAP app
${occ} app:enable user_ldap
${occ} app:enable calendar
${occ} app:enable tasks
${occ} app:enable polls
# set up new LDAP config if it does not exist
if ! ${occ} ldap:show-config s01 > /dev/null; then

View file

@ -1,39 +0,0 @@
{ config, pkgs, ... }:
{
services.nginx = {
additionalModules = [ pkgs.nginxModules.pam ];
enable = true;
recommendedProxySettings = true;
recommendedGzipSettings = true;
recommendedOptimisation = true;
recommendedTlsSettings = true;
appendHttpConfig = ''
map $remote_addr $remote_addr_anon {
~(?P<ip>\d+\.\d+\.\d+)\. $ip.0;
~(?P<ip>[^:]+:[^:]+): $ip::;
# IP addresses to not anonymize
127.0.0.1 $remote_addr;
::1 $remote_addr;
default 0.0.0.0;
}
log_format anon_ip '$remote_addr_anon - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log anon_ip;
'';
};
security.acme = {
acceptTerms = true;
defaults = {
#server = "https://acme-staging-v02.api.letsencrypt.org/directory";
email = "root@${config.networking.domain}";
};
};
security.pam.services.nginx.text = ''
auth required ${pkgs.nss_pam_ldapd}/lib/security/pam_ldap.so
account required ${pkgs.nss_pam_ldapd}/lib/security/pam_ldap.so
'';
}

18
modules/nix-serve.nix Normal file
View file

@ -0,0 +1,18 @@
{ config, pkgs, ... }:
let
domain = "cache.${config.networking.domain}";
in
{
sops.secrets."nix-serve/key" = { };
services.nix-serve = {
enable = true;
package = pkgs.nix-serve-ng;
secretKeyFile = config.sops.secrets."nix-serve/key".path;
port = 5002;
};
services.nginx.virtualHosts."${domain}" = {
locations."/" = {
proxyPass = "http://127.0.0.1:${toString config.services.nix-serve.port}";
};
};
}

View file

@ -24,13 +24,7 @@ in
services.nginx = {
virtualHosts.${domain} = {
root = pkgs.callPackage ../pkgs/padlist { };
enableACME = true;
forceSSL = true;
extraConfig = ''
auth_pam "LDAP Authentication Required";
auth_pam_service_name "nginx";
'';
root = "/srv/web/padlist";
locations = {
"= /" = {
extraConfig = ''
@ -41,13 +35,15 @@ in
extraConfig = ''
try_files $uri =404;
fastcgi_pass unix:${config.services.phpfpm.pools.padlist.socket};
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
include ${pkgs.nginx}/conf/fastcgi_params;
include ${pkgs.nginx}/conf/fastcgi.conf;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
'';
};
"/vendor".return = "403";
};
};
};
}

View file

@ -1,5 +0,0 @@
{ ... }:
{
sops.age.sshKeyPaths = [ "/etc/ssh/ssh_host_ed25519_key" ];
sops.age.generateKey = false;
}

View file

@ -4,8 +4,6 @@
nginx = {
virtualHosts = {
"stream.${config.networking.domain}" = {
enableACME = true;
forceSSL = true;
locations."/" =
let
cfg = config.services.owncast;

32
modules/struktur-bot.nix Normal file
View file

@ -0,0 +1,32 @@
{ config, pkgs, ... }:
{
sops.secrets."strukturbot_env" = { };
# virtualisation.docker.daemon.settings.dns = [ "141.30.1.1" "141.76.14.1" ];
virtualisation.oci-containers = {
containers.struktur-bot = {
image = "struktur-bot";
environmentFiles = [
config.sops.secrets."strukturbot_env".path
];
extraOptions = [ "--network=host" ];
};
};
systemd.timers."overleaf-backup" = {
wantedBy = [ "timers.target" ];
timerConfig = {
OnCalendar = "02:22:00";
Unit = "overleaf-backup.service";
};
};
systemd.services."overleaf-backup" = {
script = ''
set -eu
${pkgs.docker}/bin/docker exec struktur-bot python3 backup.py
'';
serviceConfig = {
Type = "oneshot";
User = "root";
};
};
}

View file

@ -25,16 +25,12 @@ in
ensureUsers = [
{
name = "vaultwarden";
ensurePermissions = {
"DATABASE vaultwarden" = "ALL PRIVILEGES";
};
ensureDBOwnership = true;
}
];
ensureDatabases = [ "vaultwarden" ];
};
services.nginx.virtualHosts."${domain}" = {
enableACME = true;
forceSSL = true;
locations."/" = {
proxyPass = "http://127.0.0.1:${toString config.services.vaultwarden.config.rocketPort}";
};

16
modules/web/default.nix Normal file
View file

@ -0,0 +1,16 @@
{ ... }:
{
imports = [
./ifsrde.nix
./ese.nix
./infoscreen.nix
./kpp.nix
./nightline.nix
./fsrewsp.nix
./manual.nix
./sharepic.nix
./userdir.nix
./ftp.nix
./hyperilo.nix
];
}

34
modules/web/ese.nix Normal file
View file

@ -0,0 +1,34 @@
{ config, pkgs, ... }:
let
domain = "ese.${config.networking.domain}";
webRoot = "/srv/web/ese";
in
{
services.nginx = {
virtualHosts."${domain}" = {
locations."= /" = {
# temporary redirect, to avoid caching problems
return = "302 /2024/";
};
locations."/" = {
root = webRoot;
tryFiles = "$uri $uri/ =404";
};
# cache static assets
locations."~* \.(?:css|svg|webp|jpg|jpeg|gif|png|ico|mp4|mp3|ogg|ogv|webm|ttf|woff2|woff)$" = {
root = webRoot;
extraConfig = ''
expires 1y;
'';
};
};
};
users.users."ese-deploy" = {
isNormalUser = true;
openssh.authorizedKeys.keys = [
''command="${pkgs.rrsync}/bin/rrsync ${webRoot}",restrict ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEWGdTdobZN2oSLsTQmHOahdc9vqyuwUBS0PSk5IQhGV''
];
};
}

73
modules/web/fsrewsp.nix Normal file
View file

@ -0,0 +1,73 @@
{ pkgs, config, lib, ... }:
let
domain = "fsrewsp.de";
user = "fsrewsp";
group = "fsrewsp";
in
{
users.users.${user} = {
group = group;
isSystemUser = true;
};
users.groups.${group} = { };
users.users.nginx = {
extraGroups = [ group ];
};
services.phpfpm.pools.fsrewsp = {
user = "fsrewsp";
group = "fsrewsp";
settings = {
"listen.owner" = config.services.nginx.user;
"pm" = "dynamic";
"pm.max_children" = 32;
"pm.max_requests" = 500;
"pm.start_servers" = 2;
"pm.min_spare_servers" = 2;
"pm.max_spare_servers" = 5;
"php_admin_value[error_log]" = "stderr";
"php_admin_flag[log_errors]" = true;
"catch_workers_output" = true;
};
phpEnv."PATH" = lib.makeBinPath [ pkgs.php ];
};
services.nginx.enable = true;
services.nginx = {
virtualHosts."www.${domain}" = {
locations."/".return = "301 $scheme://${domain}$request_uri";
};
virtualHosts."${domain}" = {
root = "/srv/web/fsrewsp";
extraConfig = ''
index index.php index.html;
'';
locations = {
"/" = {
tryFiles = "$uri $uri/ /index.php?$args";
};
"~ \.php$" = {
extraConfig = ''
try_files $uri =404;
fastcgi_pass unix:${config.services.phpfpm.pools.fsrewsp.socket};
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
include ${pkgs.nginx}/conf/fastcgi_params;
include ${pkgs.nginx}/conf/fastcgi.conf;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
fastcgi_param HTTP_HOST $host;
'';
};
"~ \.log$".return = "403";
"~ ^/\.user\.ini".return = "403";
"~* \.(js|css|png|jpg|jpeg|gif|ico)$".extraConfig = ''
expires max;
log_not_found off;
'';
};
};
};
}

38
modules/web/ftp.nix Normal file
View file

@ -0,0 +1,38 @@
{ config, pkgs, ... }:
let
domain = "ftp.${config.networking.domain}";
in
{
services.nginx.additionalModules = [ pkgs.nginxModules.fancyindex ];
services.nginx.virtualHosts."${domain}" = {
root = "/srv/ftp";
extraConfig = ''
fancyindex on;
fancyindex_exact_size off;
error_page 403 /403.html;
fancyindex_localtime on;
'';
locations."~/(klausuren|uebungen|skripte|abschlussarbeiten)".extraConfig = ''
allow 141.30.0.0/16;
allow 141.76.0.0/16;
deny all;
'';
locations."~ /komplexpruef".extraConfig = ''
default_type text/plain;
'';
locations."=/403.html" = {
root = pkgs.writeTextDir "403.html" ''
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
<center><h1>403 Forbidden</h1></center>
<center>Dieser Ordner ist nur aus dem Uni-Netz zug&aumlnglich.</center>
<center>This directory is only accessible from the TUD network.</center>
</body>
</html>
'';
};
};
}

34
modules/web/hyperilo.nix Normal file
View file

@ -0,0 +1,34 @@
{ ... }:
{
# provide access to iLO of colocated server
# in case of questions, contact @bennofs
services.nginx.virtualHosts."hyperilo.deutschland.gmbh" = {
forceSSL = true;
locations."/".proxyPass = "https://192.168.0.120:443";
locations."/".basicAuthFile = "/run/secrets/hyperilo_htaccess";
locations."/".extraConfig = ''
proxy_ssl_verify off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade_capitalized;
'';
};
# HP iLO requires uppercase Upgrade, not lowercase "upgrade"
services.nginx.commonHttpConfig = ''
map $http_upgrade $connection_upgrade_capitalized {
default Upgrade;
''' close;
}
'';
systemd.network.networks."20-hyperilo" = {
matchConfig.Name = "eno8303";
address = [ "192.168.0.1/24" ];
networkConfig.LLDP = true;
networkConfig.EmitLLDP = "nearest-bridge";
};
sops.secrets."hyperilo_htaccess".owner = "nginx";
}

View file

@ -10,7 +10,9 @@ in
isSystemUser = true;
};
users.groups.${group} = { };
users.users.nginx = {
extraGroups = [ group ];
};
services.phpfpm.pools.ifsrde = {
user = user;
group = group;
@ -32,14 +34,9 @@ in
services.nginx = {
virtualHosts."www.${config.networking.domain}" = {
enableACME = true;
forceSSL = true;
locations."/".return = "301 $scheme://ifsr.de$request_uri";
};
virtualHosts."${config.networking.domain}" = {
enableACME = true;
forceSSL = true;
root = "/srv/web/ifsrde";
extraConfig = ''
index index.html index.php;
@ -63,6 +60,7 @@ in
"~ ^/cmd(/?[^\\n|\\r]*)$".return = "301 https://pad.ifsr.de$1";
"/bbb".return = "301 https://bbb.tu-dresden.de/b/fsr-58o-tmf-yy6";
"/kpp".return = "301 https://kpp.ifsr.de";
"/sso".return = "301 https://sso.ifsr.de/realms/internal/account";
# security
"~* /(\.git|cache|bin|logs|backup|tests)/.*$".return = "403";
# deny running scripts inside core system folders

View file

@ -0,0 +1,12 @@
{ config, ... }:
let
domain = "infoscreen.${config.networking.domain}";
in
{
services.nginx = {
enable = true;
virtualHosts."${domain}" = {
root = "/srv/web/infoscreen/dist";
};
};
}

View file

@ -7,9 +7,4 @@ in
enable = true;
hostName = domain;
};
services.nginx.virtualHosts."${domain}" = {
enableACME = true;
forceSSL = true;
};
}

10
modules/web/manual.nix Normal file
View file

@ -0,0 +1,10 @@
{ config, ... }:
let
domain = "manual.${config.networking.domain}";
in
{
services.ese-manual = {
enable = true;
hostName = domain;
};
}

70
modules/web/nightline.nix Normal file
View file

@ -0,0 +1,70 @@
{ pkgs, config, lib, ... }:
let
domain = "nightline-dresden.de";
user = "nightline";
group = "nightline";
in
{
users.users.${user} = {
group = group;
isSystemUser = true;
};
users.users.nginx = {
extraGroups = [ group ];
};
users.groups.${group} = { };
services.phpfpm.pools.nightline = {
user = "nightline";
group = "nightline";
settings = {
"listen.owner" = config.services.nginx.user;
"pm" = "dynamic";
"pm.max_children" = 32;
"pm.max_requests" = 500;
"pm.start_servers" = 2;
"pm.min_spare_servers" = 2;
"pm.max_spare_servers" = 5;
"php_admin_value[error_log]" = "stderr";
"php_admin_flag[log_errors]" = true;
"catch_workers_output" = true;
};
phpEnv."PATH" = lib.makeBinPath [ pkgs.php ];
};
services.nginx = {
virtualHosts."www.${domain}" = {
locations."/".return = "301 $scheme://${domain}$request_uri";
};
virtualHosts."${domain}" = {
root = "/srv/web/nightline";
extraConfig = ''
index index.php index.html;
'';
locations = {
"/" = {
tryFiles = "$uri $uri/ /index.php?$args";
};
"~ \.php$" = {
extraConfig = ''
try_files $uri =404;
fastcgi_pass unix:${config.services.phpfpm.pools.nightline.socket};
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
include ${pkgs.nginx}/conf/fastcgi_params;
include ${pkgs.nginx}/conf/fastcgi.conf;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
fastcgi_param HTTP_HOST $host;
'';
};
"~ \.log$".return = "403";
"~ ^/\.user\.ini".return = "403";
"~* \.(js|css|png|jpg|jpeg|gif|ico)$".extraConfig = ''
expires max;
log_not_found off;
'';
};
};
};
}

60
modules/web/sharepic.nix Normal file
View file

@ -0,0 +1,60 @@
{ pkgs, config, lib, ... }:
let
domain = "sharepic.${config.networking.domain}";
user = "sharepic";
group = "sharepic";
in
{
users.users.${user} = {
group = group;
isSystemUser = true;
};
users.groups.${group} = { };
services.phpfpm.pools.sharepic = {
user = "sharepic";
group = "sharepic";
settings = {
"listen.owner" = config.services.nginx.user;
"pm" = "dynamic";
"pm.max_children" = 32;
"pm.max_requests" = 500;
"pm.start_servers" = 2;
"pm.min_spare_servers" = 2;
"pm.max_spare_servers" = 5;
"php_admin_value[error_log]" = "stderr";
"php_admin_flag[log_errors]" = true;
"catch_workers_output" = true;
};
phpEnv."PATH" = lib.makeBinPath [ pkgs.php ];
};
services.nginx = {
enable = true;
virtualHosts."${domain}" = {
root = "/srv/web/sharepic";
extraConfig = ''
index index.php index.html;
'';
locations = {
"/" = {
tryFiles = "$uri $uri/ =404";
};
"~ \.php$" = {
extraConfig = ''
try_files $uri =404;
fastcgi_pass unix:${config.services.phpfpm.pools.sharepic.socket};
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
include ${pkgs.nginx}/conf/fastcgi_params;
include ${pkgs.nginx}/conf/fastcgi.conf;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
'';
};
"/data".return = "403";
};
};
};
}

View file

@ -1,4 +1,4 @@
{ config, ... }:
{ config, pkgs, ... }:
let
domain = "users.${config.networking.domain}";
port = 8083;
@ -18,18 +18,21 @@ in
mkdir -p $HOME/public_html
# public_html dir: apache and $USER have rwx on everything inside
setfacl -m u:${apacheUser}:rwx,d:u:${apacheUser}:rwx,d:u:$USER:rwx $HOME/public_html
setfacl -m u:${apacheUser}:rwx,d:u:${apacheUser}:rwx,d:u:''${USER}:rwx $HOME/public_html
fi
'';
services.httpd = {
enable = true;
enablePHP = true;
maxClients = 10;
mpm = "prefork";
extraModules = [ "userdir" ];
virtualHosts.${domain} = {
enableUserDir = true;
extraConfig = ''
UserDir /home/users/*/public_html
UserDir disabled root
UserDir /home/users/*/public_html/
<Directory "/home/users/*/public_html">
Options -Indexes +MultiViews +SymLinksIfOwnerMatch +IncludesNoExec
DirectoryIndex index.php index.html
@ -47,14 +50,33 @@ in
inherit port;
}];
};
phpPackage = pkgs.php.buildEnv {
extraConfig = ''
display_errors=0
post_max_size = 40M
upload_max_filesize = 40M
extension=sysvsem.so
'';
};
};
services.nginx.virtualHosts.${domain} = {
enableACME = true;
forceSSL = true;
locations."/" = {
proxyPass = "http://localhost:${toString port}";
extraConfig = ''
proxy_intercept_errors on;
error_page 403 404 =404 /404.html;
client_max_body_size 40M;
'';
};
locations."/robots.txt" = {
extraConfig = ''
add_header Content-Type text/plain;
return 200 "User-agent: *\nDisallow: /\n";
'';
};
};
}

8
modules/wiki/default.nix Normal file
View file

@ -0,0 +1,8 @@
{ ... }:
{
imports = [
./fsr.nix
./vernetzung.nix
./ese.nix
];
}

83
modules/wiki/ese.nix Normal file
View file

@ -0,0 +1,83 @@
{ config, lib, pkgs, ... }:
let
domain = "wiki.ese.${config.networking.domain}";
user = "wiki-ese";
group = "wiki-ese";
in
{
users.users.${user} = {
group = group;
isSystemUser = true;
};
users.groups.${group} = { };
services.phpfpm.pools.wiki-ese = {
user = user;
group = group;
settings = {
"listen.owner" = config.services.nginx.user;
"pm" = "dynamic";
"pm.max_children" = 32;
"pm.max_requests" = 500;
"pm.start_servers" = 2;
"pm.min_spare_servers" = 2;
"pm.max_spare_servers" = 5;
"php_admin_value[error_log]" = "stderr";
"php_admin_flag[log_errors]" = true;
"catch_workers_output" = true;
};
phpEnv."PATH" = lib.makeBinPath [ pkgs.php ];
};
services.nginx = {
virtualHosts."${domain}" = {
root = "/srv/web/wiki.ese";
extraConfig = ''
index index.php;
'';
locations = {
"/" = {
tryFiles = "$uri $uri/ @rewrite";
};
"@rewrite".extraConfig = ''
rewrite ^/(.*)$ /index.php?title=$1&$args;
'';
"^~ /maintenance/".return = "403";
"~ \.php$" = {
extraConfig = ''
fastcgi_pass unix:${config.services.phpfpm.pools.wiki-ese.socket};
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
include ${pkgs.nginx}/conf/fastcgi_params;
include ${pkgs.nginx}/conf/fastcgi.conf;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
'';
};
"/rest.php" = {
tryFiles = "$uri $uri/ /rest.php?$args";
};
"~* \.(js|css|png|jpg|jpeg|gif|ico)$" = {
tryFiles = "$uri /index.php";
extraConfig = ''
expires max;
log_not_found off;
'';
};
"/_.gif" = {
extraConfig = ''
expires max;
empty_gif;
'';
};
"^~ /cache/".extraConfig = ''
deny all;
'';
"/dumps" = {
root = "/srv/web/wiki-ese/local";
extraConfig = ''
autoindex on;
'';
};
};
};
};
}

View file

@ -63,11 +63,12 @@ in
# Auth
# https://www.mediawiki.org/wiki/Extension:PluggableAuth
# https://www.mediawiki.org/wiki/Extension:OpenID_Connect
$wgOpenIDConnect_MigrateUsersByEmail = true;
$wgPluggableAuth_EnableLocalLogin = true;
$wgPluggableAuth_Config["iFSR Login"] = [
"plugin" => "OpenIDConnect",
"data" => [
"providerURL" => "${config.services.portunus.domain}/dex",
"providerURL" => "https://sso.ifsr.de/realms/internal",
"clientID" => "wiki",
"clientsecret" => file_get_contents('${config.sops.secrets."mediawiki/oidc_secret".path}'),
],
@ -76,30 +77,33 @@ in
extensions = {
PluggableAuth = pkgs.fetchzip {
url = "https://web.archive.org/web/20230615112924/https://extdist.wmflabs.org/dist/extensions/PluggableAuth-REL1_39-068be5d.tar.gz";
hash = "sha256-kmdSPMQNaO0qgEzb8j0+eLlsNQLmfJfo0Ls4yvYgOFI=";
url = "https://extdist.wmflabs.org/dist/extensions/PluggableAuth-REL1_41-b92b48e.tar.gz";
hash = "sha256-Fv5reEqFVVpSvmb4cy4oZBzeKc/fVddoJIsalnW4wUY=";
};
OpenIDConnect = pkgs.fetchzip {
url = "https://web.archive.org/web/20230615113527/https://extdist.wmflabs.org/dist/extensions/OpenIDConnect-REL1_39-42e4d75.tar.gz";
hash = "sha256-VN0G0Crjlx0DTLeDvaSFtMmYsfB7VzgYkSNDS+nkIyQ=";
url = "https://extdist.wmflabs.org/dist/extensions/OpenIDConnect-REL1_41-520f4bf.tar.gz";
hash = "sha256-gLHaveEzfmpqU9fWATZsUU377FJj2yq//raHZUR/VWk=";
};
VisualEditor = pkgs.fetchzip {
url = "https://web.archive.org/web/20230723212424/https://extdist.wmflabs.org/dist/extensions/VisualEditor-REL1_39-b1204c9.tar.gz";
hash = "sha256-g/ATW3xkecHynwbwLbmYgawNW+LCVTth0ZlhY7A3N5U=";
url = "https://extdist.wmflabs.org/dist/extensions/VisualEditor-REL1_41-1bdb5a0.tar.gz";
hash = "sha256-HtKV9Uru0SRtl61nP3PgMcT9t8okB8jGPKFmtYIV1XM=";
};
SyntaxHighlight = pkgs.fetchzip {
url = "https://extdist.wmflabs.org/dist/extensions/SyntaxHighlight_GeSHi-REL1_41-e5818be.tar.gz";
hash = "sha256-dvXfOUlvT2Y8ELx83JlEx0S51oKyW4DDbVyUzyh5zag=";
};
};
};
portunus.dex.oidcClients = [{
id = "wiki";
callbackURL = "https://${domain}/Spezial:PluggableAuthLogin";
}];
nginx = {
recommendedProxySettings = true;
virtualHosts.${domain} = {
enableACME = true;
forceSSL = true;
locations."/robots.txt" = {
extraConfig = ''
add_header Content-Type text/plain;
return 200 "User-agent: *\nDisallow: /\n";
'';
};
locations."/" = {
proxyPass = "http://127.0.0.1:${toString listenPort}";
proxyWebsockets = true;

View file

@ -0,0 +1,83 @@
{ config, lib, pkgs, ... }:
let
domain = "vernetzung.${config.networking.domain}";
user = "vernetzung";
group = "vernetzung";
in
{
users.users.${user} = {
group = group;
isSystemUser = true;
};
users.groups.${group} = { };
services.phpfpm.pools.vernetzung = {
user = user;
group = group;
settings = {
"listen.owner" = config.services.nginx.user;
"pm" = "dynamic";
"pm.max_children" = 32;
"pm.max_requests" = 500;
"pm.start_servers" = 2;
"pm.min_spare_servers" = 2;
"pm.max_spare_servers" = 5;
"php_admin_value[error_log]" = "stderr";
"php_admin_flag[log_errors]" = true;
"catch_workers_output" = true;
};
phpEnv."PATH" = lib.makeBinPath [ pkgs.php ];
};
services.nginx = {
virtualHosts."${domain}" = {
root = "/srv/web/vernetzung";
extraConfig = ''
index index.php;
'';
locations = {
"/" = {
tryFiles = "$uri $uri/ @rewrite";
};
"@rewrite".extraConfig = ''
rewrite ^/(.*)$ /index.php?title=$1&$args;
'';
"^~ /maintenance/".return = "403";
"~ \.php$" = {
extraConfig = ''
fastcgi_pass unix:${config.services.phpfpm.pools.vernetzung.socket};
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
include ${pkgs.nginx}/conf/fastcgi_params;
include ${pkgs.nginx}/conf/fastcgi.conf;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
'';
};
"/rest.php" = {
tryFiles = "$uri $uri/ /rest.php?$args";
};
"~* \.(js|css|png|jpg|jpeg|gif|ico)$" = {
tryFiles = "$uri /index.php";
extraConfig = ''
expires max;
log_not_found off;
'';
};
"/_.gif" = {
extraConfig = ''
expires max;
empty_gif;
'';
};
"^~ /cache/".extraConfig = ''
deny all;
'';
"/dumps" = {
root = "/srv/web/vernetzung/local";
extraConfig = ''
autoindex on;
'';
};
};
};
};
}

33
modules/zammad.nix Normal file
View file

@ -0,0 +1,33 @@
{ config, ... }:
let
domain = "tickets.${config.networking.domain}";
in
{
services.zammad = {
enable = true;
database = {
createLocally = true;
type = "PostgreSQL";
};
port = 8085;
secretKeyBaseFile = config.sops.secrets."zammad_secret".path;
};
# disably spammy logs
systemd.services.zammad-web.preStart = ''
sed -i -e "s|debug|warn|" ./config/environments/production.rb
'';
services.nginx.virtualHosts.${domain} = {
locations."/" = {
proxyPass = "http://localhost:${toString config.services.zammad.port}";
};
locations."/ws" = {
proxyPass = "http://localhost:${toString config.services.zammad.websocketPort}";
proxyWebsockets = true;
};
};
sops.secrets."zammad_secret".owner = "zammad";
}

View file

@ -1,36 +0,0 @@
{ pkgs, ... }:
{
environment.systemPackages = with pkgs; [
# fzf
bat
duf
];
users.defaultUserShell = pkgs.zsh;
programs.fzf = {
fuzzyCompletion = true;
keybindings = true;
};
programs.zsh = {
enable = true;
shellAliases = {
l = "ls -l";
ll = "ls -la";
la = "ls -a";
less = "bat";
};
histSize = 100000;
histFile = "~/.local/share/zsh/history";
autosuggestions = {
enable = true;
highlightStyle = "fg=#00bbbb,bold";
};
shellInit =
''
source ${pkgs.zsh-fzf-tab}/share/fzf-tab/fzf-tab.plugin.zsh
zsh-newuser-install () {}
'';
};
}

27
overlays/default.nix Normal file
View file

@ -0,0 +1,27 @@
_final: prev:
let
inherit (prev) fetchurl;
inherit (prev) callPackage;
in
{
# AGDSN is running an outdated version that we have to comply to
bacula = (prev.bacula.overrideAttrs (old: rec {
version = "9.6.7";
src = fetchurl {
url = "mirror://sourceforge/bacula/${old.pname}-${version}.tar.gz";
sha256 = "sha256-3w+FJezbo4DnS1N8pxrfO3WWWT8CGJtZqw6//IXMyN4=";
};
}));
# Mailman internal server error fix
# https://gitlab.com/mailman/mailman/-/issues/1137
# https://github.com/NixOS/nixpkgs/pull/321136
pythonPackagesExtensions = prev.pythonPackagesExtensions ++ [
(_python-final: python-prev: {
readme-renderer = python-prev.readme-renderer.overridePythonAttrs (_oldAttrs: {
propagatedBuildInputs = [ python-prev.cmarkgfm ];
});
})
];
keycloak_ifsr_theme = callPackage ../modules/keycloak/theme.nix { };
}

View file

@ -0,0 +1,25 @@
From f4c5dd5628c873981b2d6d6b8f3bbf036b9fd724 Mon Sep 17 00:00:00 2001
From: Rouven Seifert <rouven.seifert@ifsr.de>
Date: Thu, 2 May 2024 11:20:27 +0200
Subject: [PATCH] cleanup: also catch milter-reject
---
postfix_exporter.go | 2 ++
1 file changed, 2 insertions(+)
diff --git a/postfix_exporter.go b/postfix_exporter.go
index f20d99c..676d767 100644
--- a/postfix_exporter.go
+++ b/postfix_exporter.go
@@ -335,6 +335,8 @@ func (e *PostfixExporter) CollectFromLogLine(line string) {
e.cleanupProcesses.Inc()
} else if strings.Contains(remainder, ": reject: ") {
e.cleanupRejects.Inc()
+ } else if strings.Contains(remainder, ": milter-reject: ") {
+ e.cleanupRejects.Inc()
} else {
e.addToUnsupportedLine(line, subprocess, level)
}
--
2.44.0

View file

@ -1,21 +0,0 @@
{ isPy3k, buildPythonPackage, pkgs, service-identity, ldap3, twisted, ldaptor, mock }:
buildPythonPackage rec {
pname = "matrix-synapse-ldap3";
version = "0.2.2";
format = "pyproject";
src = pkgs.fetchFromGitHub {
owner = "matrix-org";
repo = "matrix-synapse-ldap3";
rev = "2584736204165f16c176567183f9c350ee253f74";
sha256 = "gMsC5FpC2zt5hypPdGgPbWT/Rwz38EoQz3tj5dQ9BQ8=";
};
propagatedBuildInputs = [ service-identity ldap3 twisted ];
# ldaptor is not ready for py3 yet
doCheck = !isPy3k;
checkInputs = [ ldaptor mock ];
}

View file

@ -1,10 +0,0 @@
{ stdenvNoCC, ... }:
stdenvNoCC.mkDerivation {
name = "padlister";
src = ./.;
phases = [ "unpackPhase" "installPhase" ];
installPhase = ''
mkdir -p $out
cp -r $src/index.php $out
'';
}

View file

@ -1,79 +0,0 @@
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$host = '/run/postgresql';
$dbname = 'hedgedoc';
$user = 'hedgedoc';
try {
$dbh = new PDO("pgsql:host=$host;dbname=$dbname", $user);
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
die();
}
$query = 'SELECT "Notes".title, "Notes"."updatedAt", "Notes"."shortid", "Users".profile FROM "Notes" JOIN "Users" ON "Notes"."ownerId" = "Users".id WHERE (permission = \'freely\' OR permission = \'editable\' OR permission = \'limited\') AND strpos(content, \'tags: listed\')>0 ORDER BY "Notes"."updatedAt" DESC';
try {
$stmt = $dbh->query($query);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
die();
}
function formatDateString($stringDate)
{
$datetime = DateTime::createFromFormat('Y-m-d H:i:s.uP', $stringDate);
$formattedDate = $datetime->format('d.m.Y H:i');
return $formattedDate;
}
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Pad lister</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@picocss/pico@1/css/pico.min.css">
</head>
<body>
<div class="container">
<br><br>
<table>
<tr>
<th>Titel</th>
<th>Owner</th>
<th>Last edit</th>
</tr>
<?php
foreach ($rows as $row) {
?>
<tr>
<td>
<a href="https://pad.ifsr.de/<?= $row['shortid'] ?>"><?= $row['title'] ?></a>
</td>
<td>
<?= json_decode($row['profile'])->username ?>
</td>
<td>
<?= formatDateString($row['updatedAt']) ?>
</td>
</tr>
<?php
}
?>
</table>
<br><br>
</div>
</body>
</html>

View file

@ -1,135 +1,147 @@
cachix_password: ENC[AES256_GCM,data:7SleCWYfyhlde2vuIr6hGtAwuSbiz5W8PpUHd8TIh4I=,iv:mAr67t4jvLc7cUn7WQaY/oU3AN1w28tCBJBI1ZfeS3U=,tag:Dodk7V+nnswtSuEH6R5LGw==,type:str]
cachix_password: ENC[AES256_GCM,data:SjzpKHIFRvXDARjidS03eA0EmzXtsNjfkSnPTsafNhc=,iv:mAr67t4jvLc7cUn7WQaY/oU3AN1w28tCBJBI1ZfeS3U=,tag:VSPF158J1iP5x6qkytGeGA==,type:str]
sops:
kms: []
gcp_kms: []
azure_kv: []
hc_vault: []
age: []
lastmodified: "2023-08-14T09:08:46Z"
mac: ENC[AES256_GCM,data:Vb5iZpE0D0kQrhrtm18y4WQj7W4c8oT+oFeFPgQBCJ1EJyHemREgn2RskCZeevad896qjWAR3xtk2uGc9SOEqFhWX4OkyhTGAo5h66YygNw3LbCsarfUcYQ7Jthdw2rnozLLIOEZ0yykeaayWEULbdHZjgaJwI+DIwOyTkBgmK8=,iv:96/Ph7+HDjT8su+vmtUB7d24OVY4h4BmfiTudwW+7DQ=,tag:F9JfGnSZOMN3GHdMXCVRPg==,type:str]
lastmodified: "2023-12-26T17:03:43Z"
mac: ENC[AES256_GCM,data:RJ1qczvz9tRPf0krPFbSDURZJSx5Bx/K7Pz3urNYn8wt4/M1B9EJI0nlHMuun/QjCDYMmiOzvvJMEdOBI/OeRZaQrp9+9LBB+9r4jOhU8BIP5czzKaGpDpZ9o/6avZf38SfrjR0M8NHVuTRGW8vzstu92KyeXaIRqfJ1JX+ucbo=,iv:93dkoIJHFVQaGqNBW/9/QxobRLiv+hd73lsV2ZXJHX4=,tag:H7IJVW+c4EaMPdmJDr+7oA==,type:str]
pgp:
- created_at: "2023-08-14T09:08:12Z"
enc: |
- created_at: "2024-02-29T15:23:18Z"
enc: |-
-----BEGIN PGP MESSAGE-----
hF4DntlvaG5T7wcSAQdASuJ50zZbRm83JgWvBkhhqb9CYA7I5b4erFYEG4YAugMw
r0nWOEVjWhMiYuvgQkNbD2QLioNbmYrElL7zRpLW66HhXX0F+SSF07SGxBY3DFX5
0l4BqOepz3eG9yUO3rWewZZmdFmtgSSgutCqHSA3Z/3dmNupSoScGUl2qVTFTZ0n
pZqfDRnLrrRLGdqQ8ChgyzkaD4g6wQULApScmewit/QlRi4s84JBvqVcro6OXXof
=8TRl
hF4DntlvaG5T7wcSAQdAnAE456PXzGekxSnrumXHqeCY5tm0/20vrPDDidjy3Wcw
k4WIu4Sglhukn5LrQkzzcskoFpGHrPj5tN84jilNDjMz8nVR1zniAlrKTP59C/fQ
0l4BIQYlqkqkEDc+kuWzy2O0mteKrlo86Byv6NryvY5DseXUFd6pVde8n8ns5tSZ
/jSh5Fo3/xkmJ+aS2SturNqUixHYbGBHUpfQ/IakxriSfLdtkf3N82M8e5jJUWB3
=ZaVg
-----END PGP MESSAGE-----
fp: B8E1727497FC48AA14158BDF947F769D7B95EC2B
- created_at: "2023-08-14T09:08:12Z"
enc: |
- created_at: "2024-02-29T15:23:18Z"
enc: |-
-----BEGIN PGP MESSAGE-----
hQIMA/YLzOYaRIJJAQ//aIBDcdbJwRjT0xgiRjmMIpiM9ZXfipl/UGP6N3y9Xndx
IaVp4trITGXIIvChYo0WylCvPPrXdnUdwthu7sR7P7yjF/ZyDorYnSGB856/bUaV
nX6to+zNnk6Zo7VBXW9HIqH+nG1JQW2kv8uF7hZSIvXVTYuuS2FfZMV3Vye1eQJ+
5hbraPc0ioJFZe+sz9vLICGGdS7aY73lGrWllgpOgmtKc+S6OAHSH6zSkJ0rGzxq
AhkaVytNeB6Wc9QZw0YETwRv5ZKEZNCuMLDsB6OvP11T5Bod+SK59uFk4qFyHk40
AcZ/FpdVPyH38rpBEjR68ARypLCXQqcTCUcVMtqW3+xm+msOF5Oax7psqBFLd1C3
C1X7MnXNWIcUiqm0Cl/d8DQUB4SNoKLwKMFGH9voPmpcht/1aqudMuloiSJrR8ia
B7out4PhQh4UGtdqilbEsntWmoiDmftvYKQiK+iA2PaNZPvFaDET6a21L9Ezk4mW
XVZ8AiSxyQRH2c7l2jVPZZ3KZa40EOvdP1lIiCvlrp2KBlj+r+lqduFR/qG7vr/E
avRT2qxqR4y+wVlXGcPONyTrb9qGZrn1bnwkZ5at4O0QYYyiOt2PTe16WBgEhOyd
WDT2dnb7lG7fDSiY6iVzhYmnywEOREDEZ7ZoGzfGpgz9fDwrVvfpWgWkfLayHDLS
XgEGvE2F1rGyAQVrAaLWNH01WL/7waZd8C/M3R0tbvyNVl+cEWnVmtz/LhRQuji1
qVXKzZSkc/YKuDLoJnIl4x9pVoi42AWf23YGltdk8osyq5b4eOMmoExhsdXItLg=
=dCdG
hQIMA/YLzOYaRIJJAQ/9F9PE1/Dpehh2HvyzkbBMxar0ZrWItB9UpMN4VJjipI7x
8cMU7iIp3gDrVfwEzdARzXOUGugoxYPttJMe4ZRrIHtjnQBWf+e0TcDy4eqdHqYH
COAWRBctYAWqSU7n4Gq/mqtNGe1VDY9Q5rhpDqhPc01KWO72AgLUwH6zoyGM4YBN
7u7eF0vqcaZGQyzo4IjasnYlPjgIDehVzdl8Zpy/yYOFNozLFBV7HLqItEl7vdEq
DPGzz7vKAK1pHK0Qie5MBTbEMJ2yIBiGIJ/rZv5h9RvAuVu0uqjFbehis5yK2N4s
hEBVaECXfvuvc0wP7EIgxdUoDeh+o4OUL6OneQRXeMqdlsw+oq8WnKywi4bf8dDl
1gNs7PLa0ROQKyOiB/LAZn4GmnNLSD2KnlTYoyrt3s8tgfRCHOhoWxGmBGfV3Z2C
KjbucxT0Wz0gSSBr6ht0lL0DD0UFQ9WJbz2Dns82CCr5T+ehHk5YVGQPSSxPaDlz
qnNdS+OvrgbofKAk7JcR9Po/ajoOAEvv6GfA0ujFi3FxyjwgaPS6Je4fC2gUVrwb
2z7OCzmpp3vGrFB0BvKSwrCQLIeffWl8M4bOoCDKM+XyMEUML7TsTrFkoQ+wzvqN
V53askywgCRfSkfBsEWV1Aoms4QmPnvkuoD0N4F40MRtD2HmhxrgqwmSh3Iu9qPS
XgGkJ/TnuWJ0KkBePo8xBqokVTfbhiGufYXXz6B80tHl6Xrmd5rcz8km0tCc/GUZ
R8yygpt4uFujJEQzaCdT7Y8kt+WRXaNq7pZ0lsQF7lYtpusZhPBv3pDkb4/6ALs=
=nVIs
-----END PGP MESSAGE-----
fp: 91EBE87016391323642A6803B966009D57E69CC6
- created_at: "2023-08-14T09:08:12Z"
enc: |
- created_at: "2024-02-29T15:23:18Z"
enc: |-
-----BEGIN PGP MESSAGE-----
hQIMA8uqUsBLHj6XAQ//b1bA73WQ0H2rYX/scP68fDjnkeIRq227YW6sY3Fm/ob1
4vmllEgZBTlzQwZb84fc0FBIP2xBzHXgKCmzt/+EEb0VUAc0KvNyJwa65apOV1MV
juzNYzL1rPph+rlk0NVkWQvop6OTGZ1rsq8GgJoffm3dYUAZysoyKJFwn+zy2sh6
Q9kbWCsX8O/6ImLp6WgJXGUGt2MkkXUkMTdIvWHQntNuQtgh2E4Fz/HCdSW5TT3z
FoV/FaVNPMP1JiG3ym+q4p9zRQTynWb8JqGlWgt86vKdyqf/sBDMZHpjbZeX5O4m
RKiTpjAgDoJJYCB7WrnHhHJkVo2E0vi8bM86BJ0G4rubWTYhYlpLOMNIl+iVo1j5
H11vtJ/dphat1/8006dpeyA7xlw6Woq09Org6dRGV43sBK2oiNNznbigt6BCKylw
m2sUY/VyAEqkd2knYsfkfiVUy6R/yHkgGUJo94QUtfEs7Yw0VMwx8U/N7Gwrx5zB
8CUxxOnCNeynDPP3sPsei61RXretbJ0wXxoOv8P1GHIPYhAbEX9Oi3u81FnAmykJ
NxM+Ip9RbeS9lRvuasMJSFawqJU10v7XLp6EjB+Ed+vNDzxPBnhbUYNKJRE/Gq4k
Phx/ySn900r+MX/1097TvL0GQH5TDK94R/Pip6K+iAeZPoFQFbhh0r4aYlARTpnU
aAEJAhCiPLz6o+/CDSsM7HQuATjywPk487/2PZ7SVYXNl1mXPgTfQJaDvOHjlinU
yPO2XNwDkKQwtq72AY1oSEODJvFQyTLHSNNCt3Wbfm7LNbzp3UAarQ8g8dFOfCuY
p6vOQwd0oQ4B
=ZwoK
hQIMA8uqUsBLHj6XAQ/+Ofo4GZUZEca+ThmZmF8g5OlPOfgPxRUHuTHoiOthXTuS
IO7BSCYPHdZlnDqNMELdQfKZHRFirehibMIFedfoiKEuhJaQ1p9go0CnIhcX7tzA
aNaBbbJBmAYxUfPdExkJK9SqDxV7aXC8OHzXHwcZqCc/G38E4fOMVsvUVdD+Nymf
lEXmgXpU1ib5vRaH1oCOf8d1C6LFFC+peBBbyzwhNgFgVYP8NrXWkeIiRSiKpFpx
3lsLODLIYXteoO0DkkuT2z/0G86EYo+bmSx5Ubi0waxfO3sLdUnDaIIC/6pJqbS8
QM3HtEL1kQaAFure/r+K7Ck8l0eTKbfnd52jLoMFK+1g5587KjV70fpx4QBvyq0X
d0xJAfJSRptkIlMOS5+tYOXd2SOtoG7XwprrUs+lleE/Z4SaOjyGWkLE0L1D+Qhp
/8jw0cU46O69ig0p47H1klvJ5TkZkSroCkarVRUS4AHhpnLLnDMYDkuVoZeKM+rz
tOF8Sj/ySF3PA0W5cGf8dK8u8EXgIlApLbo4ZOBHff9yJJvuDJjt2b3hWPZh/uHF
ASxPF26cz6+ysGLl8COvWLRlxDD22aP27P2A7+9LYi9p1csNL+wuYwfnF7/rrrLx
Suv2InJqsUV5JkLlhoTYnv6kIwrz0oVSnTOFIBgQ3dex3T0DUn/eEdFO1BHY7BfU
aAEJAhDp5eds7PB2IJhFuHuYcsYquRDlwlQ6CY0fWTR3cI3bzNTLAe+ITv19CBUV
eGi9XUc05QDgUapvUewGXZXlFxo7iDDw1H7S1exSeRY/sbmeDE1G8beZxEqD2Rbq
Rlwq7HypFnxX
=M/ss
-----END PGP MESSAGE-----
fp: F8634A1CFF7D61608503A70B24363525EA0E8A99
- created_at: "2023-08-14T09:08:12Z"
- created_at: "2024-02-29T15:23:18Z"
enc: |-
-----BEGIN PGP MESSAGE-----
wcFMAzUXo8ZPJwGLAQ//YGciouPJhSuo1gEi8A31dsuXM0ka9INVTCtOP1kcZmAT
4ov/00GfaCd0XkoX43ZEV7lZrpQ8zW1iBFNi2Ojknu3HRJrmiRtTj2wv6ZOtsyvz
2Ac2ADp91AMaACibt+XzEPGtnU9FitVEl0MM7pbllcu6jqcV/sa8CNf2564OTTQ0
6Fy1NsvbpAwJ5lyk5fXxsUlR/SGN8HWJRjytal0DLwyhgQZpnbZro+pMfM771x6U
5JztJVTILMGhfomSa5Tjotkncfilymjhg4eVGoD2MVbc9pjmze+pLzH2cjP8NyyA
4zrp7UgNT/EQM8RNgYg1KxIPGYYIEa+83253bjfCexR2gh0xlyVqc5o0Ql2xBUVY
LckLYVFAowgxuTOFDLIEgs5t0qFotHbLxQsfy1grFShhp/4p+vPRq8UgAHBjTzTJ
NKw69yaJySeZ47hR7p+AUODTfjyZ0UrdFraI8qT16LRa9xPH7S8+F50dj8aeeEU+
ss+3g1ionuNGztLWJOK7yIm3ZHh/RIP6DyLp7r+PAII9jyWQLOOWZ1+Ugo8irevb
xGBMxt7FhqWAxzGMBL+x7qSOGAh+hDv4aIP2692nBjSOwmao5LF5A5jsLk7JbJ3e
6DJz435wCdbNklHu09oSn6hoD5LuTFNP1K/q+FmOd8GZKhaqR6SXJuTN6RfPwyHS
UQHZexhIfUx4aUQFzY/PbFxjI6QnHoW8PgaZ8vrL598Mpb5Sqd8Dx+NSnN8ifEXz
ophXLjNmlamF0wyx8z9bEitGwZvckt5rSdu+KxkF+duVAQ==
=QRWO
hQIMAzUXo8ZPJwGLAQ/+Jbtq6OyOcXYHWj6T74BDA1hcilHrP7yp5w3Za7DwKWpp
sLTcXo1ZywokwSBH8lm1zmhnho5BN968YTbwqb/y4FMX2MJP/VIgjgpkl9KoiZHM
py818xRsVttggsqoTnN6mtOYIEOu9lQCtA8zXgc5BIr1xDpRlVmz8VyeG70a32vI
PaG6BAmOoIQXNikNqhzyinSKkHHzDFGyxfdYGR2bMuGNSbpIr42DHOHVKWd7mzHW
Wm3BOaFHe76aYUByXujBPJ1oXm3PYLAPxXVudc4GCj23V3fj7oczCU74ggmmFLGk
PJkRRIRHHqAjb3C6LZ2V1sF2+eazlpSLcvf/KVRc12wFMzoPSpEb+Ft3MHYEhBn6
o+7+BC94RhGUzu7OI2dK0oMUMZaeByLqFLHH0iZ171TuD3Tqr3NnsUBTJWT7hPw+
FN/yFsf0ZbRiShv4Vvxyib3NRZZfZ3VTG11qlV1xEBEsBnA3QzUr+J923FxPwOkj
jBzxv9EJX/imXCj965R3vevCbc/6xf8Hy4x4GlqtTTFsw8uKwaQgoqL9eSejEcpU
TXrMaKN4zUEgT/ZPI76teU7HKBxNfS+1yocznaZ6dr3SN5IwX0tX9q3k9Y7D0DyR
LI1U0Wrx7JmbXQa/6ArKzp3fuwNFVkfQNbjvNFh7ghBTWQ8rWXtOU920KzAKwL/S
XgHlxl1gj7/YMrifU01zjSOerzzLetDRBtBQkl0DKeTUXwIjM82Hd8CP2yFaTAFx
AqjVgiJBB5ffCnKLz2wB8QP7BX0IzbVaNAgxwM+dx1tBH5riSXuzCIgrPnuEq8c=
=0rd1
-----END PGP MESSAGE-----
fp: 116987A8DD3F78FF8601BF4DB95E8FE6B11C4D09
- created_at: "2023-08-14T09:08:12Z"
enc: |
-----BEGIN PGP MESSAGE-----
hQIMA30JDs8MiK29AQ//bWhIT9dYWez0pXeu/NGoMFBa2OxsxxRiJh4Yz0FPTpBl
meDjRhVgg5avcGQT30bFzN8YAxFjoLns0/eWTZvoXWA2boSIwGbH9Yi5tmXp2OKD
mKxtxOQzBsDnzCR5wdUYNbgDX7ebgeRL4dodDpG3MSzWaydSLogCvhDgCE6Spfyc
N/ZvdN4pFzeylQUMgtMinfuAnqSplU1mgkE6Fpzi/BG1mUZyqDEIwlEzJ8uxQqMj
DbiE0aZkt7tOoYaSaX6X/wCkncToIjoVBm3Vvy4nVD/U3HwJMWW+xxZKHEyg3bwm
jySJ8bSoj3u9B0OVn3x/CQpRbGfYvWleCgSR/AbB8x7ccL49x+n5U72q3zsijSGJ
NmS8HZfEvYCEP82Zp7pCZOphrjZg1TKgHB3MXkRdo6tmy/jtznnMbQyobYkj6lFB
NsLg9wcGwG9nK5PK0kB3YrBTi+wSsu8ExxD0MaNpOm12v9ygMbNU0n+bNyUyEseI
KZLapICHWSLSRuQWbbk682CadXmqLlzzzF/FP+4mhx1z+S7f6nuzbariK+ccI4XY
JeeIE9M0vX1foO782WBYI3TvGUAA/MCWdrze3j304RgTxSOl6m3IKq7e89HCt0xo
PUQyfD/e7lsC46dxhuqI62ikKrTgtadVEjTCSUqRlVkJ4DGCkGae5BPsPcF7GpvS
XgHm3czu9w4jda9Qhqv3aqNZhletlYeyJEbY8/7V+mSDvvgjRTZxrxfDcPslraLm
WqqT1IAZRL339pJnPXtPnvAZyjxU6INTzGQfV8j0AAZbIzCGqMU6xkuaStugASY=
=vPdd
-----END PGP MESSAGE-----
fp: BF37903AE6FD294C4C674EE24472A20091BFA792
- created_at: "2023-08-14T09:08:12Z"
- created_at: "2024-02-29T15:23:18Z"
enc: |-
-----BEGIN PGP MESSAGE-----
wV4DNffZWjBmO5ASAQdAKSKcjuQ4oCCz1foAgnTSXiRz5FRTE8kGfFMVnZxOpF0w
FCTf4e/KeNBkkHs3fU8KikPirMmbO57MxU+w578efXrM8LRgJFvvkkxLr6tMpfkh
0lEB6rCNiRb0PzqkowhMZqL6vwqBA7TF0hog1BGkdQPjac7V52oIVdqMyMJU1le2
lb6NWDgi4mqYlrX/6+cTHnXC9Mub75r5iYzKV935PmUb3JA=
=U9Xi
hQIMA30JDs8MiK29ARAAvPwNXd3KkiVXNtNsOg1udXh08URE59ZJJUPBbe/XOHZI
aUlrU5kwfswTcpmbHok1Faw8ppw9u9HMmL5HoUQ3LpdYBoZFDUmnu2AAhWjEilMB
EoQ/Er+Nq+EfZ1XDufZT3DkHydPVHEIPrau3U+Lf92xzOi6Gqcdx655orHrZSyXl
Z7xRUZi/Py43olmJm3jaLhhju3nVTOPJWAr/im+lVEtTL0jEw/OuSo+63GFmkILi
bESz682YVL4ZtrPwQKZpdoIzsqwTGUSEO4yjuLEshM5QDL1HFE2E9whtehBAfOt+
4wTt756hHFpaweQDUm9e+Ce3sA7lifTVjX/h4ZJ55etW53EPP59bTW327mk4Sxxj
X85wo2kD7CaUxwrk01QBkAptuSdUf9d03cw6t3EH/uXYER2mc0BNPdlJB44eYtXE
mwUIk1UZ5rZ2tUPKIdUj0xFNywbTJPN+FKgW44y7k1/PcEKQpwndK1Xoi45HemY7
cMxMptNSldv1DAQank0CG3xYdCLfkLXfixOrI64Cqx8owTPLvUCic29e7Rw3+vAw
LOR6+mSpF2bGMt1NvpZAP0nHTijWWuGg4V8eMyJcdQ6eHnhFjVaq+EVqQlYas9ym
gPHLZ+eQ2Zy39nutaV/CgmgeniXS45l/H1K6QFhJahg7bpa4Z/qWRAkF/jaUfBbS
XgFhjoVIe3SO2E8YUh+Z0pFyHo5GlKkgENBeO7KJbiOYzwLoIpvpO1baIhHGPyrj
Th/Qj0uYyPYknrwgNivl/c+1nZbkNU4Btsp22+bw+4vq8c8jHKgtvMCwKsNbU4Y=
=beaI
-----END PGP MESSAGE-----
fp: B1A16011B86BACB56ADB713DB712039D23133661
- created_at: "2023-08-14T09:08:12Z"
enc: |
fp: BF37903AE6FD294C4C674EE24472A20091BFA792
- created_at: "2024-02-29T15:23:18Z"
enc: |-
-----BEGIN PGP MESSAGE-----
hQIMA6MARpDCLIz2AQ/7Bvm+qrO0UdHN3goHTwAcy2TKmthBOrknBjTN12ZVPV0L
21fmywd1MAJrARYnshhUkaaZrjd/hkeRfk2GfRAM58sHQi7J16xVxhvurqErVTTF
3vOyDeZ1VkscmB9kWYpg9B6dkffs87Yq17N6wTPh/bxStYImRuHx1TmzhdsEZ+9k
QmBeOY1nEGeaHYcXsVLNrfHwcL+VX8kCG9f5W0voR5wOcoJwOEQzz8URzKlzgV8L
uRAhtEt6zWmXv7BiVW39r1JnWNgTjVwp9PhJI6knghiIfibXndGc9pDhJRuWnSQK
d9SrCEPmtWfQxzhdAlFobLI3XkagrZvSj1fIyYbT1dwEiR+4p+FoOp4YuN87xs0I
WeDPUoEMABVpYG6PoICWxCvaFU1cv9yqAc7TKhM8vDFQn1tJ4Ante4U9dLZ+iEbw
LxFr2XdQXLiqYUOI4dtEWO8IQqjyxva3AxU92clN7LIi3CeCDoEJZcg3l4eCtwyP
NUOXozZjnEixw4Q+1EVZZACCTPyAb5Gd994JqtjYmb5575xApWWiQNXf4hGo/WGn
zV0ZIfvohRBKxpWvgv3KUZwwHzz13AbWlBjrPIextRDdnQRZWv9jU6xRUFLM99XO
PlYbAPp5amaYRmwvG86opjcqmPuUTT/W+ss/aK8ddU69KYM+YI7OzqUXC0zPg4bS
XgGpDo6bqCP2YYkSzLYwKzMUHgHz9Ml0IyL5DQw3DMvu54IGL9nkgEd3DyIHdvsn
roJxHvGw18eBhHT0mXuWi9iK0vVMJW8tPw7CVZVSKuLFFsm+3LgkC1UftLvT2yY=
=NSHU
hF4DNffZWjBmO5ASAQdAluq9PmE0yZUumm/G4UtwQpohy8vpNzAh8D1EWVj2KgIw
CkO+UYwhgB0Sl4rqYYgyGI1FK0aVQQYEV8jlvVpzWvaKga2bm3yT7kAp1o8b5Nv4
1GgBCQIQp3OqASoqHK2MGQURJr/NY3aHQVBltEe2bkgXj4FgBXu9a1L5hwxow9Ze
YMDBVLkDaH8oCBBwvQVdqBmQe+LEwyr5eb/r0PtTksOfuQQ1TV3kX1Gj1XN31ilQ
LHXyhm6gI7zslw==
=zVpt
-----END PGP MESSAGE-----
fp: A4F92BC7B792108A463995827C1F2DA2BC929412
fp: B1A16011B86BACB56ADB713DB712039D23133661
- created_at: "2024-02-29T15:23:18Z"
enc: |-
-----BEGIN PGP MESSAGE-----
hQIMA1tId/HHLgxAARAAkoe0CqLnz2Nythjm3wnMVrwv+U/ZeaVGemBJCaS9MWXd
inmKUj9fmGdrbqoIhxwgbMBjuHFWrHWO10ahMjQ+X8qOH22SJEDYhZ7H3I+KkuFa
dBrubZizjI7STYSC4vsLftcgNkVtaIWNhc34t4Gv5Dk5rjSXuM3WORm9xrIvJ0N1
KXBUP6JF9LF0JZTwn86EWeb7Fa3QDKuQ3T7tM+8kypqyh40gd7sKLx7onXLRacbq
U6fcls4Z3m2N+NayNyi+EoKDCUOkDJfms49I21acq7wiigGE/pIDA6MFhL2X5N82
lj1V3SySHNXfm3QeHi0HvWiNtLp5W7yDoN/T2kLf76gIsiXlrnSR9BnvY0LrnYTR
wY+j9q+942eG3QL0g9gG7L0mM8wZ8QcvdVmbgw3WpbValHSEXwfg4kSuCroZH38e
XEzSgqbuBMrEprGnH8/+gp2VxxDcOnpUQApe6tvrSk0d3GmGxoIriIQonrvEPnNJ
B/25jIns9X3DK3FxL2tYzUSIXv00plLLuy5P0Sl1fvD3/J3faTJ1uX8xB0z4c9Nv
/GG88hE4Al+2da5XRdDhgrS8L5YX0gxKPvwFcALO58v4YU9UxNjp12kEnteqbfPh
0X57Tin/2cvPdH3e3g7CDi1RPHK7mcxqpcshmuiPNVhou7I7tTh7BGJpP6vpJB7S
XgHwQVfKx/rmB//dUZ3ZcZ6IXActfAxm+F1uXjhRi3hbctLV4GlMAV2/ijLX92Ob
WZv+zdCH1fioicsObmRgYuyk6gPlpMyAA9u915MH12o0G/AwZaquIfocmRlDwuU=
=zv+X
-----END PGP MESSAGE-----
fp: FB44F0746DF25F0B24A2EAE586C8A257C3EC82AB
- created_at: "2024-02-29T15:23:18Z"
enc: |-
-----BEGIN PGP MESSAGE-----
hF4Da5T//DC6DJkSAQdAtDsm8pgrR36jWw5qeWr2Ezxa0Y/feoC5R2rDatrPySsw
rXez9HoJLmHPJf5iFMxpEhgO8LAeRkSOUVDoMQAKnwP76CRAI+Y6uDa9qlWvWFDQ
0l4Byo0ib5MviXkFCy0ZslKpwAL5NR4VllC87HhndwkynizQgRevmB+ITU4QeNZo
+eNJaGphJdn0CuAO1F4vOw/qTHSzVxrLaux9J7Ovy1oM/jbFcAbUIelfkLZc13xR
=5kVn
-----END PGP MESSAGE-----
fp: FBBFAC260D9283D1EF2397DD3CA65E9DD6EB319D
unencrypted_suffix: _unencrypted
version: 3.7.3

File diff suppressed because one or more lines are too long

162
secrets/tomate.yaml Normal file
View file

@ -0,0 +1,162 @@
portunus:
search-password: ENC[AES256_GCM,data:lUG8qGioYZOAQHRhDMCBq6rRRFOs9R4ohMHEctxi/f6soE4aQZHyENEW,iv:6wgDgre5wr630SkRlT2kHak4nnOkx3DVFbNcq4FehGw=,tag:S5EiXEsoId+pGYaQ8lq7JA==,type:str]
print:
smtp-password: ENC[AES256_GCM,data:XoaLiEpqAdKapeS9YoBfh2w7HFuTCV9rHIciH+qUbhHcdsgVpnPMsSlC,iv:WxfP5d2K9soJPoRPuS6O6PbNvo4TBQjPGiV0e+a501Q=,tag:ZsTdR+b/oYFAYz/MN73PFg==,type:str]
sssd:
env: ENC[AES256_GCM,data:9IbU7uaElmemQHVUvsM88hcyNl3WFehgQeLZPtUxt2Sd0IECm8qNkQhWJ4kuvoBnQsdsUrFm/0QuW7AfDFOeE7FxMxg0,iv:dyzsYHlqClWbfzsoJ36iYjaXWpidB1ZqHXI7RP7js2Y=,tag:97FMOeVwAEy8Ka79uZKC8Q==,type:str]
ifsr-apb-auth: ENC[AES256_GCM,data:hxJOvRbgjB//YU3wy04P7yrQbV0Ggoi18wQxwy4hHgbXizTHbmlfiZ/MstITrZQ6qEPVBEW41/iGU3DO2Cg2ofpWvFU5Gr8FM1AC9DKq8SppLGqzel1mEejPfrh4RbQUMe0zZlc/YfhCah5sM0oPnBQNg8bPpveEO+5/bRq5S24jkkv7w6/AAS8tGvjALVf/g95jsCrQO2MYg9jCCEkdhORU0bowGD8cjTr6wnPkNhwzn5tiKoPn6eH6TFBkqNC+Q/5E+os10i9F1c3z/sv8Snrcl7V5higqrQekhEvGRDmax/4lE8Yb3AoxC/2M4/+9x+OPi0JUkkhC6rghETXpmYkuaD7E8+eEtLeSbiJPlPijq2HTtbtsHcSoMUdoGO8644TVe/jDxaEe54p9OWEFjRRpONijQKsfH3wENlUXmqDQDLfMSpoANxIHMh+RmRzktGIvTgvs6rlKXsWp7/gggFVxdM/5QPbE3pUvGr+JPWz4,iv:6c1HxYGrItPwKzAnQ0zUvO3TSejVZ/aWF9zs99ufzl4=,tag:fELOskceJWKmkm74MCsfoA==,type:str]
sops:
kms: []
gcp_kms: []
azure_kv: []
hc_vault: []
age:
- recipient: age18lwgjazaxujqgcc5j0gjllnykhtjn6p0q44jzrsk4au2a5k6nd9s77kd6d
enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB4bW5yM1o5SHNXZldjcWtO
NkxENWNqTlpVeXVRS0MvNFhCUnNlWmVDSkZJCi9KNiszcUZHTXl0WXdJMExtcGYw
WFZVNGJkZVRrdkNRV3llUEJjay83NmMKLS0tIEhWNGRkREJuYWhaamFWQ2lEZUo2
TXVrMHZCNU5zOG5hVnNkdEoxcTZqWXMKA9eG1zM6HeLAAOpIo8Z5+5KD4Z5P3rdc
kE8sUXHD3d8SMmSKcTYe6gGVzFuw0xxnMb/AmjAQosvDFTQsWy1sTw==
-----END AGE ENCRYPTED FILE-----
lastmodified: "2024-04-16T08:58:21Z"
mac: ENC[AES256_GCM,data:2aOOVZK7kshJFBWphvW/BqRUXht4p80Q15nGJNA1EbjT05f3tYdrr8QuM5Xd1vJO07rgmokWv4XwbzodRIwqidEXD5xuJ1v+kHC/jJnO3yrBKY7kVMHkia2Wq00bcN/iwdW6G6AP5D4HQbmFNo+rLHyjIVwPvtu9jutKpz12NH0=,iv:YCBX2gSEmiUa6HrHi0VEcRGWDJrXGajD8ZbOZcppFnM=,tag:FK2E4hukl8oL5aZNTCQESA==,type:str]
pgp:
- created_at: "2024-02-29T15:23:28Z"
enc: |-
-----BEGIN PGP MESSAGE-----
hF4DntlvaG5T7wcSAQdAVYr0vThE6byTzCZiUrErtuouL9k2b3uTQKR3pnk1qmcw
Pw8+vdUOal5i/M9jFWexJzJ1nenzhIogFWry4FdXRX7V39/nRJQ1mbF3+3T/yldD
0l4BdQ3xmtVUiz+PYCzazHC5+wPB4iCVs3fkTiLvNBNzUDEHvj6T7w72eKhld9VT
NFcOI2lSDea9EYksEdLef4VnE8gI1DeYxJAc60GXydmBJZO30xeOFMru+XE2N7Cy
=S7ex
-----END PGP MESSAGE-----
fp: B8E1727497FC48AA14158BDF947F769D7B95EC2B
- created_at: "2024-02-29T15:23:28Z"
enc: |-
-----BEGIN PGP MESSAGE-----
hQIMA/YLzOYaRIJJARAA0fWU9NbHhvooG/4gYcadlwNPtQqOIw+6g/L9Gx8wKEhR
i9451S9oez3ElkwIeiF1YPCzokF6TuKv/++nV5SjC9PZVSHnrixrQscdN1FtMvH9
ad2dC4GD69fXebq3f1vj77fAZxif6OMcEMpDiRRXHHJetzuUDkLpk0YSR/ZM23m/
ag/JrHNUNgSJPLFRjvSNqX/DO/Etf/RfEwuMoPmwpGrQFhBTwtcIjjrJ2zT38q21
PhWrjAL0Mxjnt1zFOGLLXwV5wkpmLOj2GGIBJJ+/B1zEawkbOx/ROuzPFKrDmrrh
xz29AVi7Ok9JanwgPGRNytnUHmxToisIH+FZqwpDTsop0ZQOCtiUWIZot+i8XGxs
rJhHTKxetJfsJCQUe4K2RJtHnVKIluzLDFyxoOb5SVmXoslY/EIQEYJz2lFPG2sc
PbP6XUh5ObZTK3IRIFqeQzjjLI1eaLdYjEOr+a4Do98Dd7+vJ1nLwkC9Wo7JLaaR
yd4emYpyB8R72Zf5+TPhN6ZWAL97OQdCZCSxyh3hDUZt4Wckg3I2yjw1mh56yVJF
fFOCOA/nXWpYXyRTbxuPuvCqjVsmVDEh+STZLIFsARzvz+yrlpEFoQw0G+Xa/XfO
aUt+HWGYji15+KVZJnSOXHhN4z4amsg8mtAEKfhCU7pl3jyrxa2MvArPBIU8FB/S
XgG8vs/FjyRkm+BvmHHEHmh8JkC9B9Lx1kmMpHw+fMis90IqZ52I82RmA6aO5jqR
ywlIrtvDLC/5STZaBdTt6EJwf3OAvRY+H1Br+SLtz9xXUxgzV9JOHWTefzRH2JQ=
=3Wnv
-----END PGP MESSAGE-----
fp: 91EBE87016391323642A6803B966009D57E69CC6
- created_at: "2024-02-29T15:23:28Z"
enc: |-
-----BEGIN PGP MESSAGE-----
hQIMA8uqUsBLHj6XAQ//SVU6B8zLxtpp1gQ/U+EGpgbP8N3IrIcUPrPVx72dIu+y
7acCmdgralvEe/MLG4vNSnkrJdCCk7piBG2JFTMUFbqbFkUVSyZyG1yRsyezB3AZ
czSdffSQ0SbxWL73ANO7Z4asRwXkqjDTTKTl3xL3Iw8tDu22INeFwmcZPFV9F19J
K/BanSBuofUOiQB73BNv/8lA6ssxqufj+9pDDoutzF5XWpd8wUPn2hIcNWtr6NyY
wl9U/Jb/gkhnUR/UHGO2Nz5kAWz1lhysa/dur6I1mrxBJ0mO9I0j8A6U2cBPxdG5
JBiTuKlFi4RhKUAraPDC+c3fM3Zp6zIOWhZgRNGlnR0Tu3fTeqdt7DwYh0bCOpJy
tTtj779hRj+cnleKG0QB89MY3XFpHQR60iBEMnqg522LLlTzLbvu6BEUvM/4jv+j
2aq45zyYyIHC99k8xG9vl5Ou+3XhDqqVRUQ3qCRbavupWRKdibaNqjcaMr/zDqQ3
TxmDluLnsbCGnyYmZDocwAqVvTVorHEr8yumjViFpXPImRe+na/0JCuxRHbBcVt+
9WynLgKy83rHY3tWKhqYobh20mLXNNcCiUvdGFYI2X/wyUmSRMkuNpT8fsvdr179
BtERX0a3VpzaBV41pMsEIj7okx1MScMxXEmAktnDEQgyPBwV2CZpp2lM3YJajVjU
aAEJAhBKMkW8iDDTeG/ISzhGv3Qz4B2ujOvb22N1j/LVH6HUcq/Kg9tNJ3nDuT0v
zP1O6zxkwZsm23at68ZkfxXdBm6Qwf/sblfxYi2SOvWn+fXSmkSfGPVgw0vDG3+G
0DskmbWWbRuD
=9+VA
-----END PGP MESSAGE-----
fp: F8634A1CFF7D61608503A70B24363525EA0E8A99
- created_at: "2024-02-29T15:23:28Z"
enc: |-
-----BEGIN PGP MESSAGE-----
hQIMAzUXo8ZPJwGLAQ/+MGbYqzJX74UDkNrAC1QUvA54pROBzoKnI45ODtT9gp/5
9Cv5Hx3d/1UA/IGjGh6Wjv7ljCjH335R47bWBDmnE4WmrD9O2gopjBqAuF/k/tIs
Vc4+8AD7F85PTSSdb1t/2hu/gYO/FAmwpwxLBmWD7iwAwpDZoPB3lBYwvqNOlnmX
8cFYALyacBBMskwp5ydNEUtQO02ycHUfr3WVC3TponHva971Bsif2Lq4aQW2jCfm
0a+RvO9cdv4RjVkd0/eKXnjpsFRkmggTAmXrlrer1hydENbdq9Fl9QHPxRG/jp6b
SjzqSEc38wbxX2zo9GihPWRHPNjXEJbXGWfwAA6MZpHpI16NEU98+B3OOsrFZ6D7
Zr7BAhVqYXgriICx9K/czFN+oDp5Dpsy1/9NGhx2mg+KJXx6F66MN4ZB24u/rgTR
iC3YGoXfx9vq0tbv2m8zPOoJ3PjmmLzfSwXQszK/GOFvu89r57Hz92K4UpyFiLPf
jUoT7GDfEnU+4OFKdmBDzqFV2xm5TCnoCpjCfi+kbpszThoaF2L3ZvgypxK5K4cf
SkPoU2HgXwL79sXfFknajKKtBFcE55eLggtKmANoBN2NOf+yUQuqwnJRaN+ELtKp
1HJ+ztoPEcrEG3zljNZ77/n8B8kprVA+E4sxzLrNHM+sRzoiDixq+nEB7p5F6+zS
XgH/wanI8NFYgP4w48mM50rboUeeadwGoju7XNNoEcaLzCaGWkoUWNbtH+NGnaAR
OGux0gslpa4mPnHWySU7b/1LZiIop9PyXCqGDyUzjBCaNKQypMMO3BhmvdHf0ug=
=oRNh
-----END PGP MESSAGE-----
fp: 116987A8DD3F78FF8601BF4DB95E8FE6B11C4D09
- created_at: "2024-02-29T15:23:28Z"
enc: |-
-----BEGIN PGP MESSAGE-----
hQIMA30JDs8MiK29AQ/+JcDqCXFj6/8NsrMx+mv92Xgqo5b8hQC92DxOEVd2kBrE
aqe7LPbhpm8ujuR5rRRNKmnJX1QQXn7GHAua8tA2+7oYVhVJfpIp1m3FlOkv6Jt0
Mz2FMotFfts/Lq5MGUB2WU1fkXMcZ2J9gXZGoEwVRFFATu4lHy6IZKtbYHm8onlM
WXuhX3+uM1Tw4TCaqnyfi8fEGvocpwD1kT4Y2F7VipNVoSbP9DNf9rVIuKfTzLMX
NxueFmfUcLt3Z1/HSV40KkYseaZcLhWOtKbpFTwG/zdzdSIWzCjxPGwcK+nVBDeS
OhFdcoKC7c9GKb1bbxaPq5BwSpy29/PBv7SBM2vfUvyc9MrKvXdh1VzOgTkSAjdH
DxeEtFNMIhrCeCuMZwjBrIckSr3dFh73YqvEbSV/1Z2nK8qLBWKEy4noAOhI0Kxe
T05cCaGFHVJxy34lmb1AMHATLt6ZDDUn+kgiOD13SozMAsS9045MSnJgcVCb953/
cxx5LfyN3KJO/17YFgNlq28yVavFTp5h5en/DexY35nvvACBi7uah5WQh8Y3fbB6
5Eb0t2FcsHY3L11tbjnVz16oFRE/SuS2NK+k20QEo36eBc272cKjkj9CS1w6D3lq
7qFQCBD4NWITn1FgHDNfDVNZI3rocMMp8VgBzpknvBZmRc2PQlW1+jIt/7x+JP3S
XgFd5m3vvtbLhJVG5X0GMbFHC4QaBTou6buKdfvuQ8ZqUb8o52MPNXKmTDW99ywM
5pItfzPtHZ7q8T+rZKEnNcL2TBhgfHsuFzqC06D2jeC/tulvbhw0VtBcnJzSlSg=
=ihPC
-----END PGP MESSAGE-----
fp: BF37903AE6FD294C4C674EE24472A20091BFA792
- created_at: "2024-02-29T15:23:28Z"
enc: |-
-----BEGIN PGP MESSAGE-----
hF4DNffZWjBmO5ASAQdAD+Em/15kuzC0vIaYSkTGQS5SwwCGRmBc9V5u5ChsunAw
RiXIlOl3EhpR6qzxCfUgLSr+WEXK20AFGo8gEfCpKqAVE3orPGh4btwcV/AzZyID
1GgBCQIQO4OYcDhulX1kReGuRHVJWLsjvWlUJQjlYPXPaS7QD6vCmie986wNEOAN
kqDyuSsoetM3OdZgTvyj0tmTdNNm9X90xKjyV+wcYKlAkVL82PbnEwIqQhlMoZv/
0Uhdu9hQ3VXC1Q==
=0iem
-----END PGP MESSAGE-----
fp: B1A16011B86BACB56ADB713DB712039D23133661
- created_at: "2024-02-29T15:23:28Z"
enc: |-
-----BEGIN PGP MESSAGE-----
hQIMA1tId/HHLgxAAQ/+P7hzNKzSA3JVSSAqfAV5umI1hACWf3ticSkT9tlfGYx6
+xWvkwmtLBAumPYwIrVVvKSG2KBdiD/p0CugbpMUA2164IGrJVQsnBpeyV3fgaNQ
GMbb+Jq1Nfh5QsmI0X+D4xcNcPae3Ml+4TXtjXkDlowG2c4x7AHiHKnQj9Agszry
F+IUdlVt4dESbMGv+ck6fz6AqJ3OiQaesRps+FTrWtVhzuu9DIuup4E+nb7qaADz
knmjPfPxX7rSwfAVbvgmGZ0hRM4KaIqt26Fyd0pnnxc37KslgBcQDl2bIu214SKT
vmaSwqCOF1JXe3MAKJjFu0e1Rq+6/Dt9sZxWcXi+uKVqXaQznHXrxXywG8dmV2jZ
SS1rLoHKZ7Sk+3EG9WAfNA0SDNpcRQ11TXCXKYaNkbhsNucKBa3ipGO+l3ypFWNj
zmJMHR9mZuH/cV/DRC7eyWihbcYSAVfOuNYp61KUsW5Z4aYN/yrBZIDi8wqbN2J5
TNI13Opj/3Xvu8mVC4fipORvwRpwlFX5hT1ioDZ/vmtgufWWPNSc7XEN6HIie3OY
8nljJqPOhdYuTStejtBkt/qvqWWGlpPILCKndqTEFoMv5h7ussNV/+6eGUIx3+1Q
G1Hj0Dptw+w9dx/CAh6BVjSCF05892o8UNljOzr0mdxvZYfOrnrMjm2aqWLYO37S
XgGHuVKMpj8zFhIERSZj9q5ZZuH4f7AFgEzeRBghNZCGeMlA9T8BW1ctZ7v20wpL
q5F3s6h/Vpif4WrdcuVwxrsF5Sar08mJaVRQdJrps6hFENwy0qs0zn55gKIae/Q=
=HZ7i
-----END PGP MESSAGE-----
fp: FB44F0746DF25F0B24A2EAE586C8A257C3EC82AB
- created_at: "2024-02-29T15:23:28Z"
enc: |-
-----BEGIN PGP MESSAGE-----
hF4Da5T//DC6DJkSAQdALa6lkOmkWCMYVZj7SE95wbejf6w18ouzh0NeKx1SeTEw
NoAN13YgKuk1b30zfSbjbr1LeGvk4xvDF+1nk+8dLccUPFQO8svT0/L2DhAQ8EV3
0l4Bf3h1T3Hoc28my9LvjvMo7brUGqX6TDRsZiLdOe/wk/EbnuGnTUCtHytxGUIy
dtQa263hpVrA1xRIxHyhHRKACp+4PD3SvmDpQ2u33bVfZ9F9vzRPGXvE6E3Rw8jD
=Dxdr
-----END PGP MESSAGE-----
fp: FBBFAC260D9283D1EF2397DD3CA65E9DD6EB319D
unencrypted_suffix: _unencrypted
version: 3.8.1