Merge branch 'master' of git.2li.ch:Nebucatnetzer/nixos

This commit is contained in:
Andreas Zweili 2022-11-05 17:38:29 +01:00
commit c95ce87a34
92 changed files with 1786 additions and 410 deletions

View File

@ -24,13 +24,16 @@ However this requires some prerequisites.
3. Flash it to the SD card with `sudo dd if=$(ls
nixos-sd-image-*-aarch64-linux.img) of=/dev/mmcblk0 bs=4M`
4. After booting create a password for the `nixos` user.
5. SSH into the system.
6. `curl https://git.2li.ch/Nebucatnetzer/nixos/archive/master.tar.gz | tar xz`
7. `sudo cp nixos/systems/raspi4/init_config.nix /etc/nixos/configuration.nix`
8. `sudo nixos-rebuild switch`
9. Mount the `FIRMWARE` partition `sudo mount /dev/disk/by-label/FIRMWARE /mnt`
5. Get the system key and add it to `scrts/secrets.nix`. Use `ssh-keyscan
nixos.2li.local`.
6. SSH into the system.
7. `curl https://git.2li.ch/Nebucatnetzer/nixos/archive/master.tar.gz | tar xz`
8. `sudo cp nixos/systems/raspi4/init_config.nix /etc/nixos/configuration.nix`
9. `sudo nixos-rebuild switch`
10. Mount the `FIRMWARE` partition `sudo mount /dev/disk/by-label/FIRMWARE /mnt`
and make sure that your `config.txt` looks like [./systems/raspi4/config.txt](./systems/raspi4/config.txt)
10. Install the system `./scripts/install_new_system.sh`
11. Install the system by running this command on your computer:
`./scripts/install_new_system.sh`
## x86 installation

View File

@ -1,4 +1,5 @@
{
{ inputs }: {
username = "andreas";
version = "22.05";
inputs = inputs;
}

View File

@ -42,11 +42,11 @@
]
},
"locked": {
"lastModified": 1665996265,
"narHash": "sha256-/k9og6LDBQwT+f/tJ5ClcWiUl8kCX5m6ognhsAxOiCY=",
"lastModified": 1667299227,
"narHash": "sha256-vAJPFSDYUq3DdCL8OzTg4xObRNW+yA1Pt+NzbhGu1f8=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "b81e128fc053ab3159d7b464d9b7dedc9d6a6891",
"rev": "f0ecd4b1db5e15103e955b18cb94bea4296e5c45",
"type": "github"
},
"original": {
@ -80,11 +80,11 @@
},
"nixos-hardware": {
"locked": {
"lastModified": 1665987993,
"narHash": "sha256-MvlaIYTRiqefG4dzI5p6vVCfl+9V8A1cPniUjcn6Ngc=",
"lastModified": 1667283320,
"narHash": "sha256-qHvB/6XBKVjjJJCUM+z6/t9HzUC7J55wdY3KJ/ZWSHo=",
"owner": "nixos",
"repo": "nixos-hardware",
"rev": "0e6593630071440eb89cd97a52921497482b22c6",
"rev": "18934557eeba8fa2e575b0fd4ab95186e2e3bde3",
"type": "github"
},
"original": {
@ -95,11 +95,11 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1666056570,
"narHash": "sha256-e7EkIY68Tp7NKyp9JSHh6CgPPdsKYYWxiL4wZQN8Cwg=",
"lastModified": 1667254466,
"narHash": "sha256-YrMQzDVOo+uz5gg1REj2q/uVhJE3WcpkqGiMzh3Da3o=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "47edaa313fc3767ce3026037a5b62352f22f3602",
"rev": "1b4722674c315de0e191d0d79790b4eac51570a1",
"type": "github"
},
"original": {
@ -111,11 +111,11 @@
},
"nixpkgs-unstable": {
"locked": {
"lastModified": 1665940183,
"narHash": "sha256-cPe3F7CtnxU9YbJpc3Adl4d9kX+turqTv5FxM98i8vg=",
"lastModified": 1667231093,
"narHash": "sha256-RERXruzBEBuf0c7OfZeX1hxEKB+PTCUNxWeB6C1jd8Y=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "104e8082de1b20f9d0e1f05b1028795ed0e0e4bc",
"rev": "d40fea9aeb8840fea0d377baa4b38e39b9582458",
"type": "github"
},
"original": {

View File

@ -34,79 +34,79 @@
, home-manager
}:
let
custom = import ./custom;
mkComputer = import "${inputs.self}/lib/mk_computer.nix";
mkRaspi = import "${inputs.self}/lib/mk_raspi.nix";
custom = import ./custom { inherit inputs; };
mkComputer = import "${custom.inputs.self}/lib/mk_computer.nix";
mkRaspi = import "${custom.inputs.self}/lib/mk_raspi.nix";
in
{
nixosConfigurations = {
gwyn = mkComputer {
hostname = "gwyn";
home-module = "desktop";
inherit custom inputs;
inherit custom;
};
desktop-vm = mkComputer {
hostname = "desktop-vm";
home-module = "desktop";
inherit custom inputs;
inherit custom;
};
staubfinger = mkComputer {
hostname = "staubfinger";
home-module = "desktop";
inherit custom inputs;
inherit custom;
};
# Servers
git = mkComputer {
git = mkRaspi {
hostname = "git";
inherit custom inputs;
inherit custom;
};
loki-test = mkRaspi {
hostname = "loki-test";
inherit custom inputs;
inherit custom;
};
mail = mkComputer {
hostname = "mail";
inherit custom inputs;
inherit custom;
};
nextcloud = mkComputer {
hostname = "nextcloud";
inherit custom inputs;
inherit custom;
};
pihole = mkComputer {
hostname = "pihole";
inherit custom inputs;
inherit custom;
};
plex = mkComputer {
hostname = "plex";
home-module = "plex";
inherit custom inputs;
inherit custom;
};
proxy = mkRaspi {
hostname = "proxy";
inherit custom inputs;
inherit custom;
};
management = mkRaspi {
hostname = "management";
home-module = "management";
inherit custom inputs;
inherit custom;
};
restic-server = mkComputer {
hostname = "restic-server";
inherit custom inputs;
inherit custom;
};
ttrss = mkComputer {
hostname = "ttrss";
inherit custom inputs;
inherit custom;
};
};
homeConfigurations = {
"${custom.username}@co-ws-con4" = home-manager.lib.homeManagerConfiguration {
configuration = import "${inputs.self}/home-manager/work-wsl.nix";
configuration = import "${custom.inputs.self}/home-manager/work-wsl.nix";
system = "x86_64-linux";
username = custom.username;
homeDirectory = "/home/${custom.username}";
extraSpecialArgs = {
inherit custom inputs;
inherit custom;
};
};
};

View File

@ -1,4 +1,4 @@
{ pkgs, ... }:
{ ... }:
{
# Blueooth support in general
@ -10,11 +10,6 @@
# Blueman applet
services.blueman.enable = true;
# aptx/LDAC support
hardware.pulseaudio = {
package = pkgs.pulseaudioFull;
};
systemd.user.services.blueman-applet = {
partOf = [ "graphical-session.target" ];
wantedBy = [ "graphical-session.target" ];

View File

@ -1,4 +1,4 @@
{ inputs, custom, ... }:
{ custom }: { ... }:
{
# Home Manager needs a bit of information about you and the
# paths it should manage.

View File

@ -1,34 +1,32 @@
{ inputs, custom, pkgs, ... }:
{ custom }: { config, pkgs, ... }:
{
imports = [
"${inputs.self}/home-manager/software/ansible"
(import "${inputs.self}/home-manager/common" { inherit custom inputs; })
"${inputs.self}/home-manager/software/calibre"
"${inputs.self}/home-manager/software/czkawka"
"${inputs.self}/home-manager/software/dunst"
(import "${inputs.self}/home-manager/software/emacs" { inherit custom pkgs; })
"${inputs.self}/home-manager/software/email"
"${inputs.self}/home-manager/software/evince"
"${inputs.self}/home-manager/software/fzf"
"${inputs.self}/home-manager/software/git"
"${inputs.self}/home-manager/software/grobi"
"${inputs.self}/home-manager/software/keeweb"
"${inputs.self}/home-manager/software/mime-apps"
"${inputs.self}/home-manager/software/mpv"
"${inputs.self}/home-manager/software/nitrogen"
"${inputs.self}/home-manager/software/obsidian"
(import "${inputs.self}/home-manager/software/podget" {
"${custom.inputs.self}/home-manager/software/ansible"
(import "${custom.inputs.self}/home-manager/common" { inherit custom; })
"${custom.inputs.self}/home-manager/software/calibre"
"${custom.inputs.self}/home-manager/software/czkawka"
"${custom.inputs.self}/home-manager/software/dunst"
"${custom.inputs.self}/home-manager/software/emacs"
"${custom.inputs.self}/home-manager/software/evince"
"${custom.inputs.self}/home-manager/software/fzf"
"${custom.inputs.self}/home-manager/software/git"
"${custom.inputs.self}/home-manager/software/grobi"
"${custom.inputs.self}/home-manager/software/keeweb"
"${custom.inputs.self}/home-manager/software/mime-apps"
"${custom.inputs.self}/home-manager/software/mpv"
"${custom.inputs.self}/home-manager/software/nitrogen"
"${custom.inputs.self}/home-manager/software/obsidian"
(import "${custom.inputs.self}/home-manager/software/podget" {
downloadDir = "/home/andreas/Downloads";
inherit custom inputs pkgs;
})
"${inputs.self}/home-manager/software/pycharm"
"${inputs.self}/home-manager/software/rapid-photo-downloader"
"${inputs.self}/home-manager/software/signal"
"${inputs.self}/home-manager/software/ssh"
"${inputs.self}/home-manager/software/starship"
"${inputs.self}/home-manager/software/telegram"
"${inputs.self}/home-manager/software/vim"
"${inputs.self}/home-manager/software/work-desktop"
"${custom.inputs.self}/home-manager/software/pycharm"
"${custom.inputs.self}/home-manager/software/rapid-photo-downloader"
"${custom.inputs.self}/home-manager/software/signal"
"${custom.inputs.self}/home-manager/software/ssh"
"${custom.inputs.self}/home-manager/software/starship"
"${custom.inputs.self}/home-manager/software/telegram"
"${custom.inputs.self}/home-manager/software/vim"
"${custom.inputs.self}/home-manager/software/work-desktop"
];
home.packages = with pkgs; [
arc-theme
@ -48,9 +46,9 @@
programs.git.userEmail = "andreas@zweili.ch";
# raw config files
home.file.".config/qtile/config.py".source = "${inputs.self}/home-manager/configs/qtile/config.py";
home.file.".config/qtile/autostart.sh".source = "${inputs.self}/home-manager/configs/qtile/autostart.sh";
home.file.".config/terminator".source = "${inputs.self}/home-manager/configs/terminator";
home.file.".config/qtile/config.py".source = "${custom.inputs.self}/home-manager/configs/qtile/config.py";
home.file.".config/qtile/autostart.sh".source = "${custom.inputs.self}/home-manager/configs/qtile/autostart.sh";
home.file.".config/terminator".source = "${custom.inputs.self}/home-manager/configs/terminator";
programs.bash = {
enable = true;
@ -74,6 +72,12 @@
gtk.theme.name = "Arc-Darker";
xdg.userDirs = {
enable = true;
pictures = "${config.home.homeDirectory}/nextcloud/20_pictures";
createDirectories = true;
};
xsession = {
numlock.enable = true;
};

View File

@ -1,11 +1,11 @@
{ inputs, custom, pkgs, ... }:
{ custom }: { ... }:
{
imports = [
(import "${inputs.self}/home-manager/common" { inherit custom inputs; })
"${inputs.self}/home-manager/software/fzf"
"${inputs.self}/home-manager/software/git"
"${inputs.self}/home-manager/software/vim"
"${inputs.self}/home-manager/software/starship"
(import "${custom.inputs.self}/home-manager/common" { inherit custom; })
"${custom.inputs.self}/home-manager/software/fzf"
"${custom.inputs.self}/home-manager/software/git"
"${custom.inputs.self}/home-manager/software/vim"
"${custom.inputs.self}/home-manager/software/starship"
];
programs.git.userEmail = "andreas@zweili.ch";

View File

@ -1,13 +1,13 @@
{ inputs, custom, pkgs, ... }:
{ custom }: { ... }:
{
imports = [
(import "${inputs.self}/home-manager/common" { inherit custom inputs; })
"${inputs.self}/home-manager/software/emacs"
"${inputs.self}/home-manager/software/fzf"
"${inputs.self}/home-manager/software/git"
"${inputs.self}/home-manager/software/ssh"
"${inputs.self}/home-manager/software/starship"
"${inputs.self}/home-manager/software/vim"
(import "${custom.inputs.self}/home-manager/common" { inherit custom; })
"${custom.inputs.self}/home-manager/software/emacs"
"${custom.inputs.self}/home-manager/software/fzf"
"${custom.inputs.self}/home-manager/software/git"
"${custom.inputs.self}/home-manager/software/ssh"
"${custom.inputs.self}/home-manager/software/starship"
"${custom.inputs.self}/home-manager/software/vim"
];
programs.git.userEmail = "andreas@zweili.ch";

View File

@ -1,10 +1,9 @@
{ inputs, custom, pkgs, ... }:
{ custom }: { ... }:
{
imports = [
(import "${inputs.self}/home-manager/headless.nix" { inherit custom inputs pkgs; })
(import "${inputs.self}/home-manager/software/podget" {
(import "${custom.inputs.self}/home-manager/headless.nix" { inherit custom; })
(import "${custom.inputs.self}/home-manager/software/podget" {
downloadDir = "/mnt/media/podcasts";
inherit custom inputs pkgs;
})
];
}

View File

@ -1,4 +1,4 @@
{ custom, pkgs, ... }:
{ pkgs, ... }:
{
home.packages = with pkgs; [
multimarkdown

View File

@ -60,7 +60,7 @@
("PHP" prettier)
("Protocol Buffer" clang-format)
("PureScript" purty)
("Python" autopep8)
("Python" black)
("R" styler)
("Reason" bsrefmt)
("ReScript" rescript)

View File

@ -7,6 +7,7 @@
:config
(setq elpy-rpc-python-command "python3")
(setq elpy-test-runner 'elpy-test-pytest-runner)
(setq elpy-formatter 'black)
(setq eldoc-idle-delay 1)
(add-hook 'python-mode-hook (lambda () (highlight-indentation-mode -1)))
(elpy-enable))

View File

@ -1,10 +1,11 @@
(use-package vterm
:config
(setq vterm-kill-buffer-on-exit t
vterm-disable-bold t)
(global-set-key (kbd "M-RET") 'vterm)
(evil-set-initial-state 'vterm-mode 'emacs))
(when (is-linux-p)
(use-package vterm
:config
(setq vterm-kill-buffer-on-exit t
vterm-disable-bold t)
(global-set-key (kbd "M-RET") 'vterm)
(evil-set-initial-state 'vterm-mode 'emacs))
(use-package multi-vterm
:config
(global-set-key (kbd "M-S-RET") 'multi-vterm))
(use-package multi-vterm
:config
(global-set-key (kbd "M-S-RET") 'multi-vterm)))

View File

@ -1,36 +0,0 @@
{ pkgs, ... }:
{
accounts.email.accounts."personal" = {
address = "andreas@zweili.ch";
realName = "Andreas Zweili";
userName = "andreas@zweili.ch";
primary = true;
passwordCommand = "cat /home/andreas/.nixos/secrets/passwords/personal_email.key";
aliases = [
"andreas.zweili@gmail.com"
"andreas@2li.ch"
];
msmtp.enable = true;
mu.enable = true;
offlineimap = {
enable = true;
extraConfig = {
account = { autorefresh = 15; };
local = { sync_deletes = true; };
};
};
imap = {
host = "mail.zweili.org";
port = 993;
tls.enable = true;
};
smtp = {
host = "mail.zweili.org";
port = 465;
tls.enable = true;
};
};
programs.mu.enable = true;
programs.offlineimap.enable = true;
programs.msmtp.enable = true;
}

View File

@ -3,17 +3,6 @@
services.grobi = {
enable = true;
rules = [
{
name = "docked-with-notebook";
outputs_connected = [ "eDP-1" "DP-1-1" "DP-1-2" ];
atomic = true;
configure_row = [ "DP-1-2" "DP-1-1" "eDP-1" ];
primary = "DP-1-1";
execute_after = [
"${pkgs.nitrogen}/bin/nitrogen --restore"
"${pkgs.qtile}/bin/qtile cmd-obj -o cmd -f restart"
];
}
{
name = "docked";
outputs_connected = [ "DP-1-1" "DP-1-2" ];

View File

@ -1,4 +1,4 @@
{ custom, downloadDir, inputs, pkgs, ... }:
{ downloadDir }: { pkgs, ... }:
let
podget = pkgs.writeScriptBin "podget"
"${builtins.readFile (pkgs.fetchurl {

View File

@ -1,4 +1,5 @@
{ ... }: {
{ ... }:
{
programs.ssh = {
enable = true;
extraConfig = ''

View File

@ -1,8 +1,8 @@
{ ... }:
{ custom, inputs }: { ... }:
{
imports = [
"${inputs.self}/home-manager/common"
"${inputs.self}/home-manager/software/git"
(import "${custom.inputs.self}/home-manager/common" { inherit custom; })
"${custom.inputs.self}/home-manager/software/git"
];
programs.git.userEmail = "andreas@zweili.ch";

View File

@ -1,14 +1,14 @@
{ inputs, custom, pkgs, ... }:
{ custom }: { pkgs, ... }:
{
imports = [
"${inputs.self}/home-manager/common"
"${inputs.self}/home-manager/software/ansible"
"${inputs.self}/home-manager/software/emacs"
"${inputs.self}/home-manager/software/fzf"
"${inputs.self}/home-manager/software/git"
"${inputs.self}/home-manager/software/starship"
"${inputs.self}/home-manager/software/vagrant-wsl"
"${inputs.self}/home-manager/software/vim"
(import "${custom.inputs.self}/home-manager/common" { inherit custom; })
"${custom.inputs.self}/home-manager/software/ansible"
"${custom.inputs.self}/home-manager/software/emacs"
"${custom.inputs.self}/home-manager/software/fzf"
"${custom.inputs.self}/home-manager/software/git"
"${custom.inputs.self}/home-manager/software/starship"
"${custom.inputs.self}/home-manager/software/vagrant-wsl"
"${custom.inputs.self}/home-manager/software/vim"
];
programs.git.userEmail = "zweili@contria.com";

View File

@ -1,47 +1,57 @@
{ custom, hostname, inputs, system ? "x86_64-linux", home-module ? "headless" }:
{ custom, hostname, system ? "x86_64-linux", home-module ? "headless" }:
let
overlay-unstable = final: prev: {
unstable = import inputs.nixpkgs-unstable {
unstable = import custom.inputs.nixpkgs-unstable {
inherit system;
config.allowUnfree = true;
};
};
pkgs = import inputs.nixpkgs {
pkgs = import custom.inputs.nixpkgs {
inherit system;
config = {
allowUnfree = true;
};
overlays = [
overlay-unstable
inputs.nix-alien.overlay
custom.inputs.nix-alien.overlay
# (final: prev: {
# nextcloud-client = prev.nextcloud-client.overrideAttrs (_: rec {
# version = "3.6.0";
# src = pkgs.fetchFromGitHub {
# owner = "nextcloud";
# repo = "desktop";
# rev = "v${version}";
# sha256 = "sha256-wAxq5xFlofn2xEguvewMvGcel9O+CN/1AycR3tv/xMA=";
# };
# });
# })
];
};
in
inputs.nixpkgs.lib.nixosSystem
custom.inputs.nixpkgs.lib.nixosSystem
{
inherit system pkgs;
specialArgs = { inherit custom inputs; };
specialArgs = { inherit custom; };
modules = (
[
# System configuration for this host
(import "${inputs.self}/systems/${hostname}" {
lib = pkgs.lib;
inherit custom inputs hostname pkgs;
(import "${custom.inputs.self}/systems/${hostname}" {
inherit custom hostname;
})
# Common configuration
"${inputs.self}/modules/common-x86"
(import "${custom.inputs.self}/modules/common-x86" { inherit custom; })
inputs.agenix.nixosModules.age
{ environment.systemPackages = [ inputs.agenix.defaultPackage.${system} ]; }
custom.inputs.agenix.nixosModules.age
{ environment.systemPackages = [ custom.inputs.agenix.defaultPackage.${system} ]; }
inputs.home-manager.nixosModules.home-manager
custom.inputs.home-manager.nixosModules.home-manager
{
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.users.${custom.username}.imports = [
(import "${inputs.self}/home-manager/${home-module}.nix" { inherit custom pkgs inputs; })
(import "${custom.inputs.self}/home-manager/${home-module}.nix" { inherit custom; })
];
}
]);

View File

@ -1,44 +1,45 @@
{ custom, hostname, inputs, system ? "aarch64-linux", home-module ? "headless" }:
{ custom, hostname, system ? "aarch64-linux", home-module ? "headless" }:
let
overlay-unstable = final: prev: {
unstable = import inputs.nixpkgs-unstable {
unstable = import custom.inputs.nixpkgs-unstable {
inherit system;
config.allowUnfree = true;
};
};
pkgs = import inputs.nixpkgs {
pkgs = import custom.inputs.nixpkgs {
inherit system;
config = {
allowUnfree = true;
};
overlays = [
overlay-unstable
inputs.nix-alien.overlay
custom.inputs.nix-alien.overlay
];
};
in
inputs.nixpkgs.lib.nixosSystem {
inherit system;
specialArgs = { inherit custom inputs; };
custom.inputs.nixpkgs.lib.nixosSystem {
inherit pkgs system;
specialArgs = { inherit custom; };
modules = (
[
# System configuration for this host
(import "${inputs.self}/systems/${hostname}"
{ inherit custom hostname inputs pkgs; })
(import "${custom.inputs.self}/systems/${hostname}"
{ inherit custom hostname; })
# Common configuration
"${inputs.self}/modules/common"
(import "${custom.inputs.self}/modules/common" { inherit custom; })
inputs.agenix.nixosModules.age
{ environment.systemPackages = [ inputs.agenix.defaultPackage.${system} ]; }
custom.inputs.agenix.nixosModules.age
{ environment.systemPackages = [ custom.inputs.agenix.defaultPackage.${system} ]; }
inputs.home-manager.nixosModules.home-manager
custom.inputs.home-manager.nixosModules.home-manager
{
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.users.${custom.username}.imports = [
(import "${inputs.self}/home-manager/${home-module}.nix" { inherit custom pkgs inputs; })
(import "${custom.inputs.self}/home-manager/${home-module}.nix" { inherit custom; })
];
}
]);

View File

@ -1,5 +1,4 @@
{ pkgs, ... }:
{
environment.systemPackages = with pkgs; [
git

View File

@ -1,4 +1,4 @@
{ inputs, custom, pkgs, ... }:
{ custom }: { pkgs, ... }:
{
services.code-server = {
enable = true;

View File

@ -1,7 +1,7 @@
{ inputs, ... }:
{ custom }: { ... }:
{
imports = [
"${inputs.self}/modules/common"
(import "${custom.inputs.self}/modules/common" { inherit custom; })
];
# Use the systemd-boot EFI boot loader.

View File

@ -1,7 +1,7 @@
{ inputs, custom, pkgs, ... }:
{ custom }: { pkgs, ... }:
{
imports = [
(import "${inputs.self}/modules/cli" { inherit inputs pkgs; })
"${custom.inputs.self}/modules/cli"
];
# The rough location
@ -71,10 +71,10 @@
nixpkgs.config.allowUnfree = true;
nix = {
nixPath = [ "nixpkgs=${inputs.nixpkgs}" ];
nixPath = [ "nixpkgs=${custom.inputs.nixpkgs}" ];
registry = {
nixpkgs.flake = inputs.nixpkgs;
nix-config.flake = inputs.self;
nixpkgs.flake = custom.inputs.nixpkgs;
nix-config.flake = custom.inputs.self;
};
autoOptimiseStore = true;

View File

@ -1,4 +1,4 @@
{ pkgs, ... }:
{ ... }:
{
fileSystems."/mnt/data" = {
device = "10.7.89.108:server_data";

View File

@ -1,9 +1,9 @@
{ inputs, custom, pkgs, ... }:
{ custom }: { pkgs, ... }:
{
imports = [
"${inputs.self}/modules/hunspell"
"${inputs.self}/modules/nix-alien"
"${inputs.self}/modules/libimobiledevice"
"${custom.inputs.self}/modules/hunspell"
"${custom.inputs.self}/modules/nix-alien"
(import "${custom.inputs.self}/modules/libimobiledevice" { inherit custom; })
];
networking = {
networkmanager.enable = true;
@ -43,7 +43,6 @@
# Enable sound.
sound.enable = true;
hardware.pulseaudio.enable = true;
# Enable dconf to be able to save Nautilus settings
programs.dconf.enable = true;

View File

@ -0,0 +1,47 @@
{ custom }: { config, pkgs, ... }:
let
mailserver-setup = (pkgs.writeScriptBin "mailserver-setup"
"${builtins.readFile (pkgs.fetchurl {
url = "https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/v11.2.0/setup.sh";
sha256 = "sha256-V4NFapoU3thbPzhSX5DGR3cZAW1kCYZpAKsFeSjMGPY=";
})
}").overrideAttrs (old: {
buildCommand = "${old.buildCommand}\n patchShebangs $out";
});
in
{
environment.systemPackages = [
mailserver-setup
];
virtualisation.oci-containers = {
backend = "docker";
containers."mailserver" = {
image = "docker.io/mailserver/docker-mailserver:11.2.0";
autoStart = true;
environmentFiles = [
./mailserver.env
];
ports = [
"25:25"
"143:143"
"465:465"
"587:587"
"993:993"
];
volumes = [
"/etc/localtime:/etc/localtime:ro"
"/var/lib/acme/mail.zweili.org:/etc/letsencrypt/live/mail.zweili.org:ro"
"${custom.inputs.self}/modules/docker-mailserver/sa-learn:/etc/cron.d/sa-learn"
];
extraOptions = [
''--mount=type=volume,source=maildata,target=/var/mail,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/server_data/docker-mailserver/maildata,"volume-opt=o=addr=10.7.89.108,rw,nfsvers=4.0,nolock,hard,noatime"''
''--mount=type=volume,source=mailstate,target=/var/mail-state,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/server_data/docker-mailserver/mailstate,"volume-opt=o=addr=10.7.89.108,rw,nfsvers=4.0,nolock,hard,noatime"''
''--mount=type=volume,source=maillogs,target=/var/log/mail,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/server_data/docker-mailserver/maillogs,"volume-opt=o=addr=10.7.89.108,rw,nfsvers=4.0,nolock,hard,noatime"''
''--mount=type=volume,source=config,target=/tmp/docker-mailserver,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/server_data/docker-mailserver/config,"volume-opt=o=addr=10.7.89.108,rw,nfsvers=4.0,nolock,hard,noatime"''
"--add-host=host.docker.internal:host-gateway"
"--cap-add=NET_ADMIN"
"--cap-add=SYS_PTRACE"
];
};
};
}

View File

@ -0,0 +1,535 @@
# -----------------------------------------------
# --- Mailserver Environment Variables ----------
# -----------------------------------------------
# DOCUMENTATION FOR THESE VARIABLES IS FOUND UNDER
# https://docker-mailserver.github.io/docker-mailserver/edge/config/environment/
# -----------------------------------------------
# --- General Section ---------------------------
# -----------------------------------------------
# empty => uses the `hostname` command to get the mail server's canonical hostname
# => Specify a fully-qualified domainname to serve mail for. This is used for many of the config features so if you can't set your hostname (e.g. you're in a container platform that doesn't let you) specify it in this environment variable.
OVERRIDE_HOSTNAME=mail.zweili.org
# Set the log level for DMS.
# This is mostly relevant for container startup scripts and change detection event feedback.
#
# Valid values (in order of increasing verbosity) are: `error`, `warn`, `info`, `debug` and `trace`.
# The default log level is `info`.
LOG_LEVEL=info
# critical => Only show critical messages
# error => Only show erroneous output
# **warn** => Show warnings
# info => Normal informational output
# debug => Also show debug messages
SUPERVISOR_LOGLEVEL=
# 0 => mail state in default directories
# 1 => consolidate all states into a single directory (`/var/mail-state`) to allow persistence using docker volumes
ONE_DIR=0
# empty => postmaster@domain.com
# => Specify the postmaster address
POSTMASTER_ADDRESS=postmaster@2li.ch
# Check for updates on container start and then once a day
# If an update is available, a mail is sent to POSTMASTER_ADDRESS
# 0 => Update check disabled
# 1 => Update check enabled
ENABLE_UPDATE_CHECK=1
# Customize the update check interval.
# Number + Suffix. Suffix must be 's' for seconds, 'm' for minutes, 'h' for hours or 'd' for days.
UPDATE_CHECK_INTERVAL=1d
# Set different options for mynetworks option (can be overwrite in postfix-main.cf)
# **WARNING**: Adding the docker network's gateway to the list of trusted hosts, e.g. using the `network` or
# `connected-networks` option, can create an open relay
# https://github.com/docker-mailserver/docker-mailserver/issues/1405#issuecomment-590106498
# The same can happen for rootless podman. To prevent this, set the value to "none" or configure slirp4netns
# https://github.com/docker-mailserver/docker-mailserver/issues/2377
#
# none => Explicitly force authentication
# container => Container IP address only
# host => Add docker container network (ipv4 only)
# network => Add all docker container networks (ipv4 only)
# connected-networks => Add all connected docker networks (ipv4 only)
PERMIT_DOCKER=none
# Set the timezone. If this variable is unset, the container runtime will try to detect the time using
# `/etc/localtime`, which you can alternatively mount into the container. The value of this variable
# must follow the pattern `AREA/ZONE`, i.e. of you want to use Germany's time zone, use `Europe/Berlin`.
# You can lookup all available timezones here: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List
TZ=
# In case you network interface differs from 'eth0', e.g. when you are using HostNetworking in Kubernetes,
# you can set NETWORK_INTERFACE to whatever interface you want. This interface will then be used.
# - **empty** => eth0
NETWORK_INTERFACE=
# empty => modern
# modern => Enables TLSv1.2 and modern ciphers only. (default)
# intermediate => Enables TLSv1, TLSv1.1 and TLSv1.2 and broad compatibility ciphers.
TLS_LEVEL=
# Configures the handling of creating mails with forged sender addresses.
#
# empty => (not recommended, but default for backwards compatibility reasons)
# Mail address spoofing allowed. Any logged in user may create email messages with a forged sender address.
# See also https://en.wikipedia.org/wiki/Email_spoofing
# 1 => (recommended) Mail spoofing denied. Each user may only send with his own or his alias addresses.
# Addresses with extension delimiters(http://www.postfix.org/postconf.5.html#recipient_delimiter) are not able to send messages.
SPOOF_PROTECTION=
# Enables the Sender Rewriting Scheme. SRS is needed if your mail server acts as forwarder. See [postsrsd](https://github.com/roehling/postsrsd/blob/master/README.md#sender-rewriting-scheme-crash-course) for further explanation.
# - **0** => Disabled
# - 1 => Enabled
ENABLE_SRS=0
# 1 => Enables POP3 service
# empty => disables POP3
ENABLE_POP3=
ENABLE_CLAMAV=1
# Amavis content filter (used for ClamAV & SpamAssassin)
# 0 => Disabled
# 1 => Enabled
ENABLE_AMAVIS=1
# -1/-2/-3 => Only show errors
# **0** => Show warnings
# 1/2 => Show default informational output
# 3/4/5 => log debug information (very verbose)
AMAVIS_LOGLEVEL=0
# This enables the [zen.spamhaus.org](https://www.spamhaus.org/zen/) DNS block list in postfix
# and various [lists](https://github.com/docker-mailserver/docker-mailserver/blob/f7465a50888eef909dbfc01aff4202b9c7d8bc00/target/postfix/main.cf#L58-L66) in postscreen.
# Note: Emails will be rejected, if they don't pass the block list checks!
# **0** => DNS block lists are disabled
# 1 => DNS block lists are enabled
ENABLE_DNSBL=0
# If you enable Fail2Ban, don't forget to add the following lines to your `docker-compose.yml`:
# cap_add:
# - NET_ADMIN
# Otherwise, `nftables` won't be able to ban IPs.
ENABLE_FAIL2BAN=0
# Fail2Ban blocktype
# drop => drop packet (send NO reply)
# reject => reject packet (send ICMP unreachable)
FAIL2BAN_BLOCKTYPE=drop
# 1 => Enables Managesieve on port 4190
# empty => disables Managesieve
ENABLE_MANAGESIEVE=
# **enforce** => Allow other tests to complete. Reject attempts to deliver mail with a 550 SMTP reply, and log the helo/sender/recipient information. Repeat this test the next time the client connects.
# drop => Drop the connection immediately with a 521 SMTP reply. Repeat this test the next time the client connects.
# ignore => Ignore the failure of this test. Allow other tests to complete. Repeat this test the next time the client connects. This option is useful for testing and collecting statistics without blocking mail.
POSTSCREEN_ACTION=enforce
# empty => all daemons start
# 1 => only launch postfix smtp
SMTP_ONLY=
# Please read [the SSL page in the documentation](https://docker-mailserver.github.io/docker-mailserver/edge/config/security/ssl) for more information.
#
# empty => SSL disabled
# letsencrypt => Enables Let's Encrypt certificates
# custom => Enables custom certificates
# manual => Let's you manually specify locations of your SSL certificates for non-standard cases
# self-signed => Enables self-signed certificates
SSL_TYPE=letsencrypt
# These are only supported with `SSL_TYPE=manual`.
# Provide the path to your cert and key files that you've mounted access to within the container.
SSL_CERT_PATH=
SSL_KEY_PATH=
# Optional: A 2nd certificate can be supported as fallback (dual cert support), eg ECDSA with an RSA fallback.
# Useful for additional compatibility with older MTA and MUA (eg pre-2015).
SSL_ALT_CERT_PATH=
SSL_ALT_KEY_PATH=
# Set how many days a virusmail will stay on the server before being deleted
# empty => 7 days
VIRUSMAILS_DELETE_DELAY=
# This Option is activating the Usage of POSTFIX_DAGENT to specify a lmtp client different from default dovecot socket.
# empty => disabled
# 1 => enabled
ENABLE_POSTFIX_VIRTUAL_TRANSPORT=
# Enabled by ENABLE_POSTFIX_VIRTUAL_TRANSPORT. Specify the final delivery of postfix
#
# empty => fail
# `lmtp:unix:private/dovecot-lmtp` (use socket)
# `lmtps:inet:<host>:<port>` (secure lmtp with starttls, take a look at https://sys4.de/en/blog/2014/11/17/sicheres-lmtp-mit-starttls-in-dovecot/)
# `lmtp:<kopano-host>:2003` (use kopano as mailstore)
# etc.
POSTFIX_DAGENT=
# Set the mailbox size limit for all users. If set to zero, the size will be unlimited (default).
#
# empty => 0
POSTFIX_MAILBOX_SIZE_LIMIT=
# See https://docker-mailserver.github.io/docker-mailserver/edge/config/user-management/accounts/#notes
# 0 => Dovecot quota is disabled
# 1 => Dovecot quota is enabled
ENABLE_QUOTAS=1
# Set the message size limit for all users. If set to zero, the size will be unlimited (not recommended!)
#
# empty => 10240000 (~10 MB)
POSTFIX_MESSAGE_SIZE_LIMIT=
# Mails larger than this limit won't be scanned.
# ClamAV must be enabled (ENABLE_CLAMAV=1) for this.
#
# empty => 25M (25 MB)
CLAMAV_MESSAGE_SIZE_LIMIT=
# Enables regular pflogsumm mail reports.
# This is a new option. The old REPORT options are still supported for backwards compatibility. If this is not set and reports are enabled with the old options, logrotate will be used.
#
# not set => No report
# daily_cron => Daily report for the previous day
# logrotate => Full report based on the mail log when it is rotated
PFLOGSUMM_TRIGGER=daily_cron
# Recipient address for pflogsumm reports.
#
# not set => Use REPORT_RECIPIENT or POSTMASTER_ADDRESS
# => Specify the recipient address(es)
PFLOGSUMM_RECIPIENT=andreas@zweili.ch
# Sender address (`FROM`) for pflogsumm reports if pflogsumm reports are enabled.
#
# not set => Use REPORT_SENDER
# => Specify the sender address
PFLOGSUMM_SENDER=
# Interval for logwatch report.
#
# none => No report is generated
# daily => Send a daily report
# weekly => Send a report every week
LOGWATCH_INTERVAL=daily
# Recipient address for logwatch reports if they are enabled.
#
# not set => Use REPORT_RECIPIENT or POSTMASTER_ADDRESS
# => Specify the recipient address(es)
LOGWATCH_RECIPIENT=
# Sender address (`FROM`) for logwatch reports if logwatch reports are enabled.
#
# not set => Use REPORT_SENDER
# => Specify the sender address
LOGWATCH_SENDER=
# Defines who receives reports if they are enabled.
# **empty** => ${POSTMASTER_ADDRESS}
# => Specify the recipient address
REPORT_RECIPIENT=andreas@zweili.ch
# Defines who sends reports if they are enabled.
# **empty** => mailserver-report@${DOMAINNAME}
# => Specify the sender address
REPORT_SENDER=
# Changes the interval in which log files are rotated
# **weekly** => Rotate log files weekly
# daily => Rotate log files daily
# monthly => Rotate log files monthly
#
# Note: This Variable actually controls logrotate inside the container
# and rotates the log files depending on this setting. The main log output is
# still available in its entirety via `docker logs mail` (Or your
# respective container name). If you want to control logrotation for
# the Docker-generated logfile see:
# https://docs.docker.com/config/containers/logging/configure/
#
# Note: This variable can also determine the interval for Postfix's log summary reports, see [`PFLOGSUMM_TRIGGER`](#pflogsumm_trigger).
LOGROTATE_INTERVAL=weekly
# Choose TCP/IP protocols for postfix to use
# **all** => All possible protocols.
# ipv4 => Use only IPv4 traffic. Most likely you want this behind Docker.
# ipv6 => Use only IPv6 traffic.
#
# Note: More details at http://www.postfix.org/postconf.5.html#inet_protocols
POSTFIX_INET_PROTOCOLS=all
# Choose TCP/IP protocols for dovecot to use
# **all** => Listen on all interfaces
# ipv4 => Listen only on IPv4 interfaces. Most likely you want this behind Docker.
# ipv6 => Listen only on IPv6 interfaces.
#
# Note: More information at https://dovecot.org/doc/dovecot-example.conf
DOVECOT_INET_PROTOCOLS=all
# -----------------------------------------------
# --- SpamAssassin Section ----------------------
# -----------------------------------------------
ENABLE_SPAMASSASSIN=1
# deliver spam messages in the inbox (eventually tagged using SA_SPAM_SUBJECT)
SPAMASSASSIN_SPAM_TO_INBOX=1
# KAM is a 3rd party SpamAssassin ruleset, provided by the McGrail Foundation.
# If SpamAssassin is enabled, KAM can be used in addition to the default ruleset.
# - **0** => KAM disabled
# - 1 => KAM enabled
#
# Note: only has an effect if `ENABLE_SPAMASSASSIN=1`
ENABLE_SPAMASSASSIN_KAM=1
# spam messages will be moved in the Junk folder (SPAMASSASSIN_SPAM_TO_INBOX=1 required)
MOVE_SPAM_TO_JUNK=1
# add spam info headers if at, or above that level:
SA_TAG=2.0
# add 'spam detected' headers at that level
SA_TAG2=6.31
# triggers spam evasive actions
SA_KILL=6.31
# add tag to subject if spam detected
SA_SPAM_SUBJECT=***SPAM*****
# -----------------------------------------------
# --- Fetchmail Section -------------------------
# -----------------------------------------------
ENABLE_FETCHMAIL=0
# The interval to fetch mail in seconds
FETCHMAIL_POLL=300
# -----------------------------------------------
# --- LDAP Section ------------------------------
# -----------------------------------------------
# A second container for the ldap service is necessary (i.e. https://github.com/osixia/docker-openldap)
# For preparing the ldap server to use in combination with this container this article may be helpful: http://acidx.net/wordpress/2014/06/installing-a-mailserver-with-postfix-dovecot-sasl-ldap-roundcube/
# empty => LDAP authentification is disabled
# 1 => LDAP authentification is enabled
ENABLE_LDAP=
# empty => no
# yes => LDAP over TLS enabled for Postfix
LDAP_START_TLS=
# If you going to use the mailserver in combination with docker-compose you can set the service name here
# empty => mail.domain.com
# Specify the dns-name/ip-address where the ldap-server
LDAP_SERVER_HOST=
# empty => ou=people,dc=domain,dc=com
# => e.g. LDAP_SEARCH_BASE=dc=mydomain,dc=local
LDAP_SEARCH_BASE=
# empty => cn=admin,dc=domain,dc=com
# => take a look at examples of SASL_LDAP_BIND_DN
LDAP_BIND_DN=
# empty** => admin
# => Specify the password to bind against ldap
LDAP_BIND_PW=
# e.g. `"(&(mail=%s)(mailEnabled=TRUE))"`
# => Specify how ldap should be asked for users
LDAP_QUERY_FILTER_USER=
# e.g. `"(&(mailGroupMember=%s)(mailEnabled=TRUE))"`
# => Specify how ldap should be asked for groups
LDAP_QUERY_FILTER_GROUP=
# e.g. `"(&(mailAlias=%s)(mailEnabled=TRUE))"`
# => Specify how ldap should be asked for aliases
LDAP_QUERY_FILTER_ALIAS=
# e.g. `"(&(|(mail=*@%s)(mailalias=*@%s)(mailGroupMember=*@%s))(mailEnabled=TRUE))"`
# => Specify how ldap should be asked for domains
LDAP_QUERY_FILTER_DOMAIN=
# -----------------------------------------------
# --- Dovecot Section ---------------------------
# -----------------------------------------------
# empty => no
# yes => LDAP over TLS enabled for Dovecot
DOVECOT_TLS=
# e.g. `"(&(objectClass=PostfixBookMailAccount)(uniqueIdentifier=%n))"`
DOVECOT_USER_FILTER=
# e.g. `"(&(objectClass=PostfixBookMailAccount)(uniqueIdentifier=%n))"`
DOVECOT_PASS_FILTER=
# Define the mailbox format to be used
# default is maildir, supported values are: sdbox, mdbox, maildir
DOVECOT_MAILBOX_FORMAT=maildir
# empty => no
# yes => Allow bind authentication for LDAP
# https://wiki.dovecot.org/AuthDatabase/LDAP/AuthBinds
DOVECOT_AUTH_BIND=
# -----------------------------------------------
# --- Postgrey Section --------------------------
# -----------------------------------------------
ENABLE_POSTGREY=0
# greylist for N seconds
POSTGREY_DELAY=300
# delete entries older than N days since the last time that they have been seen
POSTGREY_MAX_AGE=35
# response when a mail is greylisted
POSTGREY_TEXT="Delayed by Postgrey"
# whitelist host after N successful deliveries (N=0 to disable whitelisting)
POSTGREY_AUTO_WHITELIST_CLIENTS=5
# -----------------------------------------------
# --- SASL Section ------------------------------
# -----------------------------------------------
ENABLE_SASLAUTHD=0
# empty => pam
# `ldap` => authenticate against ldap server
# `shadow` => authenticate against local user db
# `mysql` => authenticate against mysql db
# `rimap` => authenticate against imap server
# Note: can be a list of mechanisms like pam ldap shadow
SASLAUTHD_MECHANISMS=
# empty => None
# e.g. with SASLAUTHD_MECHANISMS rimap you need to specify the ip-address/servername of the imap server ==> xxx.xxx.xxx.xxx
SASLAUTHD_MECH_OPTIONS=
# empty => Use value of LDAP_SERVER_HOST
# Note: since version 10.0.0, you can specify a protocol here (like ldaps://); this deprecates SASLAUTHD_LDAP_SSL.
SASLAUTHD_LDAP_SERVER=
# empty => Use value of LDAP_BIND_DN
# specify an object with priviliges to search the directory tree
# e.g. active directory: SASLAUTHD_LDAP_BIND_DN=cn=Administrator,cn=Users,dc=mydomain,dc=net
# e.g. openldap: SASLAUTHD_LDAP_BIND_DN=cn=admin,dc=mydomain,dc=net
SASLAUTHD_LDAP_BIND_DN=
# empty => Use value of LDAP_BIND_PW
SASLAUTHD_LDAP_PASSWORD=
# empty => Use value of LDAP_SEARCH_BASE
# specify the search base
SASLAUTHD_LDAP_SEARCH_BASE=
# empty => default filter `(&(uniqueIdentifier=%u)(mailEnabled=TRUE))`
# e.g. for active directory: `(&(sAMAccountName=%U)(objectClass=person))`
# e.g. for openldap: `(&(uid=%U)(objectClass=person))`
SASLAUTHD_LDAP_FILTER=
# empty => no
# yes => LDAP over TLS enabled for SASL
# If set to yes, the protocol in SASLAUTHD_LDAP_SERVER must be ldap:// or missing.
SASLAUTHD_LDAP_START_TLS=
# empty => no
# yes => Require and verify server certificate
# If yes you must/could specify SASLAUTHD_LDAP_TLS_CACERT_FILE or SASLAUTHD_LDAP_TLS_CACERT_DIR.
SASLAUTHD_LDAP_TLS_CHECK_PEER=
# File containing CA (Certificate Authority) certificate(s).
# empty => Nothing is added to the configuration
# Any value => Fills the `ldap_tls_cacert_file` option
SASLAUTHD_LDAP_TLS_CACERT_FILE=
# Path to directory with CA (Certificate Authority) certificates.
# empty => Nothing is added to the configuration
# Any value => Fills the `ldap_tls_cacert_dir` option
SASLAUTHD_LDAP_TLS_CACERT_DIR=
# Specify what password attribute to use for password verification.
# empty => Nothing is added to the configuration but the documentation says it is `userPassword` by default.
# Any value => Fills the `ldap_password_attr` option
SASLAUTHD_LDAP_PASSWORD_ATTR=
# empty => No sasl_passwd will be created
# string => `/etc/postfix/sasl_passwd` will be created with the string as password
SASL_PASSWD=
# empty => `bind` will be used as a default value
# `fastbind` => The fastbind method is used
# `custom` => The custom method uses userPassword attribute to verify the password
SASLAUTHD_LDAP_AUTH_METHOD=
# Specify the authentication mechanism for SASL bind
# empty => Nothing is added to the configuration
# Any value => Fills the `ldap_mech` option
SASLAUTHD_LDAP_MECH=
# -----------------------------------------------
# --- SRS Section -------------------------------
# -----------------------------------------------
# envelope_sender => Rewrite only envelope sender address (default)
# header_sender => Rewrite only header sender (not recommended)
# envelope_sender,header_sender => Rewrite both senders
# An email has an "envelope" sender (indicating the sending server) and a
# "header" sender (indicating who sent it). More strict SPF policies may require
# you to replace both instead of just the envelope sender.
SRS_SENDER_CLASSES=envelope_sender
# empty => Envelope sender will be rewritten for all domains
# provide comma separated list of domains to exclude from rewriting
SRS_EXCLUDE_DOMAINS=
# empty => generated when the image is built
# provide a secret to use in base64
# you may specify multiple keys, comma separated. the first one is used for
# signing and the remaining will be used for verification. this is how you
# rotate and expire keys
SRS_SECRET=
# -----------------------------------------------
# --- Default Relay Host Section ----------------
# -----------------------------------------------
# Setup relaying all mail through a default relay host
#
# empty => don't configure default relay host
# default host and optional port to relay all mail through
DEFAULT_RELAY_HOST=mail.infomaniak.com
# -----------------------------------------------
# --- Multi-Domain Relay Section ----------------
# -----------------------------------------------
# Setup relaying for multiple domains based on the domain name of the sender
# optionally uses usernames and passwords in postfix-sasl-password.cf and relay host mappings in postfix-relaymap.cf
#
# empty => don't configure relay host
# default host to relay mail through
RELAY_HOST=mail.infomaniak.com
# empty => 25
# default port to relay mail
RELAY_PORT=465
# empty => no default
# default relay username (if no specific entry exists in postfix-sasl-password.cf)
RELAY_USER=
# empty => no default
# password for default relay user
RELAY_PASSWORD=

View File

@ -0,0 +1,15 @@
# This assumes you're having `environment: ONE_DIR=1` in the env-mailserver,
# with a consolidated config in `/var/mail-state`
#
# m h dom mon dow user command
#
# Everyday 3:00AM, learn spam from all users of a domain
# spam: junk directory
0 8 * * * root sa-learn --spam /var/mail/2li.ch/*/.Junk --dbpath /var/mail-state/lib-amavis/.spamassassin
15 8 * * * root sa-learn --spam /var/mail/zweili.ch/*/.Junk --dbpath /var/mail-state/lib-amavis/.spamassassin
# ham: archive directories
30 8 * * * root sa-learn --ham /var/mail/2li.ch/*/.Archive* --dbpath /var/mail-state/lib-amavis/.spamassassin
45 8 * * * root sa-learn --ham /var/mail/zweili.ch/*/.Archive* --dbpath /var/mail-state/lib-amavis/.spamassassin
# ham: inbox subdirectories
00 9 * * * root sa-learn --ham /var/mail/2li.ch/*/cur* --dbpath /var/mail-state/lib-amavis/.spamassassin
15 9 * * * root sa-learn --ham /var/mail/zweili.ch/*/cur* --dbpath /var/mail-state/lib-amavis/.spamassassin

View File

@ -1,4 +1,4 @@
{ inputs, custom, pkgs, ... }:
{ custom }: { pkgs, ... }:
{
virtualisation.docker =
{

View File

@ -1,4 +1,4 @@
{ inputs, custom, pkgs, ... }:
{ custom }: { pkgs, ... }:
{
programs.droidcam.enable = true;
# required for USB connection

46
modules/email/default.nix Normal file
View File

@ -0,0 +1,46 @@
{ custom }: { config, ... }:
{
age.secrets.personalEmailKey =
{
file = "${custom.inputs.self}/scrts/personal_email.key.age";
mode = "600";
owner = custom.username;
group = "users";
};
home-manager.users.${custom.username} = {
accounts.email.accounts."personal" = {
address = "andreas@zweili.ch";
realName = "Andreas Zweili";
userName = "andreas@zweili.ch";
primary = true;
passwordCommand = "cat ${config.age.secrets.personalEmailKey.path}";
aliases = [
"andreas.zweili@gmail.com"
"andreas@2li.ch"
];
msmtp.enable = true;
mu.enable = true;
offlineimap = {
enable = true;
extraConfig = {
account = { autorefresh = 15; };
local = { sync_deletes = true; };
};
};
imap = {
host = "mail.zweili.org";
port = 993;
tls.enable = true;
};
smtp = {
host = "mail.zweili.org";
port = 465;
tls.enable = true;
};
};
programs.mu.enable = true;
programs.offlineimap.enable = true;
programs.msmtp.enable = true;
};
}

View File

@ -1,4 +1,4 @@
{ inputs, custom, pkgs, ... }:
{ custom }: { pkgs, ... }:
{
environment.systemPackages = with pkgs; [
gnome.eog

View File

@ -1,4 +1,4 @@
{ inputs, custom, pkgs, ... }:
{ custom }: { ... }:
{
services.espanso.enable = true;
home-manager.users.${custom.username} = {

36
modules/gitea/default.nix Normal file
View File

@ -0,0 +1,36 @@
{ custom, domain }: { config, ... }:
{
age.secrets.giteaEnv.file = "${custom.inputs.self}/scrts/gitea_env.age";
virtualisation.oci-containers = {
backend = "docker";
containers."gitea" = {
image = "gitea/gitea:1.17.3";
autoStart = true;
environment = {
PUID = "1000";
PGID = "100";
DB_TYPE = "mysql";
DB_HOST = "host.docker.internal:3306";
DB_NAME = "giteadb";
DB_USER = "gitea";
ROOT_URL = "${domain}";
INSTALL_LOCK = "true";
DISABLE_REGISTRATION = "true";
};
environmentFiles = [ config.age.secrets.giteaEnv.path ];
ports = [
"2222:22"
"8080:3000"
];
volumes = [
"/etc/timezone:/etc/timezone:ro"
"/etc/localtime:/etc/localtime:ro"
];
extraOptions = [
''--mount=type=volume,source=gitea_data,target=/data,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/server_data/gitea/data,"volume-opt=o=addr=10.7.89.108,rw,nfsvers=4.0,nolock,hard,noatime"''
"--add-host=host.docker.internal:host-gateway"
];
};
};
}

26
modules/grav/default.nix Normal file
View File

@ -0,0 +1,26 @@
{ ... }:
{
virtualisation.oci-containers = {
backend = "docker";
containers."grav" = {
image = "lscr.io/linuxserver/grav:latest";
autoStart = true;
environment = {
TZ = "Europe/Zurich";
PUID = "100";
PGID = "101";
};
ports = [
"8080:80"
];
volumes = [
"/etc/timezone:/etc/timezone:ro"
"/etc/localtime:/etc/localtime:ro"
];
extraOptions = [
''--mount=type=volume,source=grav,target=/config,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/server_data/grav,"volume-opt=o=addr=10.7.89.108,rw,nfsvers=4.0,nolock,hard,noatime"''
];
};
};
}

View File

@ -0,0 +1,22 @@
{ ... }:
{
virtualisation.oci-containers = {
backend = "docker";
containers."heimdall" = {
image = "linuxserver/heimdall";
autoStart = true;
environment = {
TZ = "Europe/Zurich";
PUID = "1000";
PGID = "100";
};
ports = [
"8081:80"
];
extraOptions = [
''--mount=type=volume,source=heimdall,target=/config,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/server_data/heimdall,"volume-opt=o=addr=10.7.89.108,rw,nfsvers=4.0,nolock,hard,noatime"''
];
};
};
}

View File

@ -1,4 +1,4 @@
{ custom, pkgs, ... }:
{ custom }: { pkgs, ... }:
{
services.usbmuxd.enable = true;
environment.systemPackages = with pkgs;

View File

@ -1,4 +1,4 @@
{ pkgs, ... }:
{ ... }:
{
fileSystems."/var/log" = {
device = "none";

View File

@ -1,11 +1,11 @@
{ pkgs, ... }:
{
environment.systemPackages = with pkgs; [
lnav
unstable.lnav
];
fileSystems."/mnt/server_logs" = {
device = "10.7.89.108:logs";
fsType = "nfs";
options = [ "x-systemd.automount" "noauto" "x-systemd.idle-timeout=300" "noatime" "nfsvers=4.0" ];
options = [ "x-systemd.automount" "noauto" "x-systemd.idle-timeout=300" "noatime" "nfsvers=4.0" "ro" ];
};
}

View File

@ -1,4 +1,4 @@
{ pkgs, ... }:
{ ... }:
{
fileSystems."/mnt/media" = {
device = "10.7.89.108:media";

View File

@ -0,0 +1,5 @@
upload_max_filesize=20G
post_max_size=20G
max_input_time=3600
max_execution_time=3600
memory_limit=2G

View File

@ -0,0 +1,63 @@
{ custom, domain }: { config, pkgs, ... }:
let
nextcloudEnvironment = {
MYSQL_DATABASE = "nextcloud";
MYSQL_USER = "nextcloud";
MYSQL_HOST = "172.17.0.1";
NEXTCLOUD_TRUSTED_DOMAINS = "nextcloud.2li.ch nextcloud2.2li.local 10.7.89.103";
REDIS_HOST = "redis";
SMTP_HOST = "mail.infomaniak.com";
SMTP_SECURE = "ssl";
SMTP_PORT = "465";
};
networkName = "nextcloud";
in
{
age.secrets.nextcloudEnv.file = "${custom.inputs.self}/scrts/nextcloud_env.age";
virtualisation.oci-containers = {
backend = "docker";
containers."nextcloud" = {
image = "nextcloud:25.0.0-apache@sha256:c65b3a099746f9168a594adc84f586a6a40719f50889d7814a6b68f6e183b26b";
autoStart = true;
environment = nextcloudEnvironment;
environmentFiles = [ config.age.secrets.nextcloudEnv.path ];
ports = [
"8080:80"
];
volumes = [
"${custom.inputs.self}/modules/nextcloud/custom-php.ini:/usr/local/etc/php/conf.d/zzz-custom.ini"
];
dependsOn = [ "redis" ];
extraOptions = [
''--mount=type=volume,source=nextcloud_data,target=/var/www/html,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/server_data/nextcloud/data,"volume-opt=o=addr=10.7.89.108,rw,nfsvers=4.0,nolock,hard,noatime"''
"--add-host=host.docker.internal:host-gateway"
"--net=${networkName}"
];
};
containers."cron" = {
image = "nextcloud:25.0.0-apache@sha256:c65b3a099746f9168a594adc84f586a6a40719f50889d7814a6b68f6e183b26b";
autoStart = true;
environment = nextcloudEnvironment;
environmentFiles = [ config.age.secrets.nextcloudEnv.path ];
entrypoint = "/cron.sh";
dependsOn = [ "redis" ];
extraOptions = [
''--mount=type=volume,source=nextcloud_data,target=/var/www/html,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/server_data/nextcloud/data,"volume-opt=o=addr=10.7.89.108,rw,nfsvers=4.0,nolock,hard,noatime"''
"--add-host=host.docker.internal:host-gateway"
"--net=nextcloud"
];
};
containers."redis" = {
image = "redis:alpine";
autoStart = true;
extraOptions = [
"--net=${networkName}"
];
};
};
system.activationScripts.makeDokerNetwork = ''
${pkgs.docker}/bin/docker network ls | ${pkgs.gnugrep}/bin/grep ${networkName} || {pkgs.docker}/bin/docker network create ${networkName}
'';
}

View File

@ -1,7 +1,8 @@
{ dataDir, documentRoot ? "/var/www/html", domain, inputs, pkgs, port ? "9000", ... }:
{ custom, dataDir, documentRoot ? "/var/www/html", domain, port ? "9000", }:
{ pkgs, ... }:
{
imports = [
"${inputs.self}/modules/nginx-acme-base"
"${custom.inputs.self}/modules/nginx-acme-base"
];
services.nginx = {
appendHttpConfig = ''

View File

@ -1,6 +1,6 @@
{ domain, inputs, port ? "8080", ... }: {
{ custom, domain, port ? "8080" }: { ... }: {
imports = [
"${inputs.self}/modules/nginx-acme-base"
"${custom.inputs.self}/modules/nginx-acme-base"
];
services.nginx = {
appendHttpConfig = ''

View File

@ -1,4 +1,4 @@
{ inputs, pkgs, ... }:
{ pkgs, ... }:
{
programs.nix-ld.enable = true;
environment.systemPackages = with pkgs; [

View File

@ -1,4 +1,4 @@
{ inputs, custom, pkgs, ... }:
{ custom, }: { ... }:
{
nix.extraOptions = ''
keep-outputs = true

View File

@ -1,4 +1,4 @@
{ ... }:
{ custom }: { config, ... }:
{
networking = {
firewall.allowedTCPPorts = [
@ -11,4 +11,27 @@
67 # DHCP
];
};
age.secrets.piholeEnv.file = "${custom.inputs.self}/scrts/pihole_env.age";
virtualisation.oci-containers = {
backend = "docker";
containers."pihole" = {
image = "pihole/pihole";
autoStart = true;
environment = {
TZ = "Europe/Zurich";
ServerIP = "10.7.89.2";
DNS1 = "127.0.0.1#5335"; # we're using the local unboud server here
RATE_LIMIT = "10000/60";
};
environmentFiles = [ config.age.secrets.piholeEnv.path ];
volumes = [
"/var/lib/pihole/etc-pihole:/etc/pihole/"
"/var/lib/pihole/etc-dnsmasq.d:/etc/dnsmasq.d/"
];
extraOptions = [
"--network=host"
"--cap-add=NET_ADMIN"
];
};
};
}

View File

@ -1,4 +1,4 @@
{ pkgs, ... }:
{ custom }: { ... }:
{
security.rtkit.enable = true;
services.pipewire = {
@ -7,5 +7,7 @@
alsa.support32Bit = true;
pulse.enable = true;
};
environment.systemPackages = with pkgs; [ easyeffects ];
home-manager.users.${custom.username} = {
services.easyeffects.enable = true;
};
}

View File

@ -1,5 +1,6 @@
{ ... }:
{ custom }: { config, ... }:
{
age.secrets.plexClaim.file = "${custom.inputs.self}/scrts/plex_claim.age";
networking = {
firewall.allowedTCPPorts = [
32400 # Web Interface/ Remote Access
@ -14,4 +15,23 @@
32469 # Plex DLNA Server
];
};
virtualisation.oci-containers = {
backend = "docker";
containers."plex" = {
image = "plexinc/pms-docker";
autoStart = true;
environment = {
TZ = "Europe/Zurich";
};
environmentFiles = [ config.age.secrets.plexClaim.path ];
volumes = [
"/var/lib/plex/config:/config"
"/var/lib/plex/tmp:/transcode"
];
extraOptions = [
''--mount=type=volume,source=media,target=/mnt/media,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/media,"volume-opt=o=addr=10.7.89.108,rw,nfsvers=4.0,nolock,hard,noatime"''
"--network=host"
];
};
};
}

View File

@ -0,0 +1,9 @@
{ pkgs, ... }:
{
services.postgresql = {
enable = true;
enableTCPIP = true;
settings.listen_adresses = pkgs.lib.mkForce "127.0.0.1,172.17.0.1";
};
networking.firewall.extraCommands = "iptables -A INPUT -p tcp --destination-port 3306 -s 172.16.0.0/12 -j ACCEPT";
}

View File

@ -1,34 +1,41 @@
{ hostname, inputs, custom, pkgs, time, ... }:
{ custom
, path
, tag ? "home-dir"
, time
}: { config, pkgs, ... }:
{
imports = [
"${inputs.self}/modules/telegram-notifications"
(import "${custom.inputs.self}/modules/telegram-notifications" { inherit custom; })
];
systemd.timers."restic-backups-${custom.username}" = {
age.secrets.resticKey.file = "${custom.inputs.self}/scrts/restic.key.age";
systemd.timers."restic-backups" = {
wantedBy = [ "timers.target" ];
partOf = [ "restic-backups-${custom.username}.service" ];
partOf = [ "restic-backups.service" ];
timerConfig = {
OnCalendar = time;
};
};
systemd.services."restic-backups-${custom.username}" = {
systemd.services."restic-backups" = {
serviceConfig = {
User = "root";
Type = "oneshot";
};
environment = {
RESTIC_PASSWORD_FILE = "/home/${custom.username}/.nixos/secrets/passwords/restic.key";
RESTIC_PASSWORD_FILE = config.age.secrets.resticKey.path;
RESTIC_REPOSITORY = "rest:http://10.7.89.30:8000";
};
onFailure = [ "unit-status-telegram@%n.service" ];
script = ''
${pkgs.restic}/bin/restic backup \
--exclude-file=${inputs.self}/modules/restic/excludes.txt \
--tag home-dir /home/${custom.username}
--exclude-file=${custom.inputs.self}/modules/restic/excludes.txt \
--tag ${tag} ${path}
${pkgs.restic}/bin/restic forget \
--tag home-dir \
--host ${hostname} \
--host ${config.networking.hostName} \
--keep-daily 7 \
--keep-weekly 5 \
--keep-monthly 12 \

View File

@ -1,30 +1,37 @@
{ hostname, inputs, custom, pkgs, time, ... }:
{ custom
, path
, tag ? "home-dir"
, time
}: { config, pkgs, ... }:
{
imports = [
"${inputs.self}/modules/telegram-notifications"
(import "${custom.inputs.self}/modules/telegram-notifications" { inherit custom; })
];
systemd.timers."restic-backups-${custom.username}" = {
age.secrets.resticKey.file = "${custom.inputs.self}/scrts/restic.key.age";
systemd.timers."restic-backups" = {
wantedBy = [ "timers.target" ];
partOf = [ "restic-backups-${custom.username}.service" ];
partOf = [ "restic-backups.service" ];
timerConfig = {
OnCalendar = time;
};
};
systemd.services."restic-backups-${custom.username}" = {
systemd.services."restic-backups" = {
serviceConfig = {
User = "root";
Type = "oneshot";
};
environment = {
RESTIC_PASSWORD_FILE = "/home/${custom.username}/.nixos/secrets/passwords/restic.key";
RESTIC_PASSWORD_FILE = config.age.secrets.resticKey.path;
RESTIC_REPOSITORY = "rest:http://10.7.89.30:8000";
};
onFailure = [ "unit-status-telegram@%n.service" ];
script = ''
${pkgs.restic}/bin/restic backup \
--exclude-file=${inputs.self}/modules/restic/excludes.txt \
--tag home-dir /home/${custom.username}
--exclude-file=${custom.inputs.self}/modules/restic/excludes.txt \
--tag ${tag} ${path}
${pkgs.mariadb}/bin/mysqldump --single-transaction --all-databases | \
${pkgs.restic}/bin/restic backup \
@ -34,7 +41,7 @@
${pkgs.restic}/bin/restic forget \
--tag home-dir \
--host ${hostname} \
--host ${config.networking.hostName} \
--keep-daily 7 \
--keep-weekly 5 \
--keep-monthly 12 \
@ -42,7 +49,7 @@
${pkgs.restic}/bin/restic forget \
--tag mariadb \
--host ${hostname} \
--host ${config.networking.hostName} \
--keep-daily 7 \
--keep-weekly 5 \
--keep-monthly 12 \

View File

@ -1,8 +1,10 @@
{ inputs, custom, pkgs, ... }:
{ custom }: { config, pkgs, ... }:
let
repository = "/mnt/restic-server";
in
{
age.secrets.resticKey.file = "${custom.inputs.self}/scrts/restic.key.age";
environment.systemPackages = with pkgs; [
restic
];
@ -27,7 +29,7 @@ in
script = ''
${pkgs.restic}/bin/restic \
--repo ${repository} \
--password-file "/etc/restic/restic.key" \
--password-file ${config.age.secrets.resticKey.path} \
prune \
'';
};

View File

@ -1,6 +1,6 @@
{ hostname, inputs, custom, pkgs, ... }:
{ custom }: { config, pkgs, ... }:
let
password_file = "/home/${custom.username}/.nixos/secrets/passwords/restic.key";
password_file = config.age.secrets.resticKey.path;
repository = "rest:http://10.7.89.30:8000";
restic-mount = pkgs.writeShellScriptBin "restic-mount" ''
@ -8,7 +8,7 @@ let
${pkgs.restic}/bin/restic \
--repo ${repository} \
--password-file ${password_file} \
--host ${hostname} \
--host ${config.networking.hostName} \
mount /tmp/restic'';
restic-mount-all = pkgs.writeShellScriptBin "restic-mount-all" ''
@ -18,7 +18,7 @@ let
--password-file ${password_file} \
mount /tmp/restic'';
infomaniak-env = "/home/${custom.username}/.nixos/secrets/passwords/infomaniak-env";
infomaniak-env = config.age.secrets.infomaniakEnv.path;
infomaniak-repo = "swift:default:/";
infomaniak-auth-url = "https://swiss-backup02.infomaniak.com/identity/v3";
@ -44,9 +44,23 @@ let
in
{
imports = [
"${inputs.self}/modules/telegram-notifications"
(import "${custom.inputs.self}/modules/telegram-notifications"
{ inherit custom; })
];
age.secrets.infomaniakEnv = {
file = "${custom.inputs.self}/scrts/infomaniak_env.age";
mode = "600";
owner = custom.username;
group = "users";
};
age.secrets.resticKey = {
file = "${custom.inputs.self}/scrts/restic.key.age";
mode = "600";
owner = custom.username;
group = "users";
};
systemd.timers."restic-backups-${custom.username}" = {
wantedBy = [ "timers.target" ];
partOf = [ "restic-backups-${custom.username}.service" ];
@ -69,13 +83,13 @@ in
onFailure = [ "unit-status-telegram@%n.service" ];
script = ''
${pkgs.restic}/bin/restic \
--exclude-file=${inputs.self}/modules/restic/excludes.txt \
--exclude-file=${custom.inputs.self}/modules/restic/excludes.txt \
--tag home-dir \
backup /home/${custom.username}
${pkgs.restic}/bin/restic \
forget \
--host ${hostname} \
--host ${config.networking.hostName} \
--tag home-dir \
--keep-hourly 25 \
--keep-daily 7 \
@ -90,7 +104,7 @@ in
${pkgs.restic}/bin/restic \
--repo ${repository} \
--password-file ${password_file} \
snapshots --host ${hostname}'';
snapshots --host ${config.networking.hostName}'';
restic-unlock = ''
${pkgs.restic}/bin/restic \
--repo ${repository} \

View File

@ -0,0 +1,19 @@
{ ... }:
let
whitelist = builtins.toFile "whitelist.txt" ''*'';
in
{
virtualisation.oci-containers = {
backend = "docker";
containers."rss-brige" = {
image = "rssbridge/rss-bridge:latest";
autoStart = true;
ports = [
"8082:80"
];
volumes = [
"${whitelist}:/app/whitelist.txt"
];
};
};
}

View File

@ -1,4 +1,4 @@
{ inputs, custom, ... }:
{ custom }: { ... }:
{
programs.steam.enable = true;
hardware.steam-hardware.enable = true;

View File

@ -1,9 +1,7 @@
{ custom, pkgs, ... }:
{ custom }: { config, pkgs, ... }:
let
telegram-notify-env = "/home/${custom.username}/.nixos/secrets/passwords/telegram_notify_env";
send-to-telegram = pkgs.writeShellScript "send-to-telegram" ''
export $(${pkgs.gnugrep}/bin/grep -v '^#' ${telegram-notify-env} | ${pkgs.findutils}/bin/xargs)
export $(${pkgs.gnugrep}/bin/grep -v '^#' ${config.age.secrets.telegramNotifyEnv.path} | ${pkgs.findutils}/bin/xargs)
URL="https://api.telegram.org/bot$TELEGRAM_KEY/sendMessage"
${pkgs.curl}/bin/curl -s -d "chat_id=$CHAT_ID&disable_web_page_preview=1&text=$1" $URL > /dev/null'';
@ -18,6 +16,7 @@ let
$UNITSTATUS"'';
in
{
age.secrets.telegramNotifyEnv.file = "${custom.inputs.self}/scrts/telegram_notify_env.age";
systemd.services."unit-status-telegram@" = {
description = "Unit Status Telegram Service";
unitConfig = {

View File

@ -1,4 +1,4 @@
{ pkgs, ... }:
{ ... }:
{
programs.tmux = {
enable = true;

View File

@ -0,0 +1,46 @@
{ custom, domain }: { config, pkgs, ... }:
let
domain = "test.2li.ch";
in
{
imports = [
(import "${custom.inputs.self}/modules/nginx-fpm" {
dataDir = "/mnt/data/ttrss/app";
inherit custom domain pkgs;
})
"${custom.inputs.self}/modules/postgresql"
];
age.secrets.ttrssEnv.file = "${custom.inputs.self}/scrts/ttrss_env.age";
services.postgresql = {
ensureDatabases = [ "ttrssdb" ];
initialScript = pkgs.writeText "postgresql-initScript" ''
CREATE ROLE ttrss WITH LOGIN PASSWORD 'ttrss' CREATEDB;
GRANT ALL PRIVILEGES ON DATABASE ttrssdb TO ttrss;
'';
};
virtualisation.oci-containers = {
backend = "docker";
containers."ttrss" = {
image = "ghcr.io/nebucatnetzer/tt-rss-aarch64/ttrss-fpm-pgsql-static";
autoStart = false;
environment = {
TZ = "Europe/Zurich";
TTRSS_DB_USER = "ttrss";
TTRSS_DB_NAME = "ttrssdb";
TTRSS_DB_PASS = "ttrss";
TTRSS_DB_HOST = "host.docker.internal";
TTRSS_SELF_URL_PATH = "https://${domain}";
};
environmentFiles = [ config.age.secrets.ttrssEnv.path ];
ports = [
"8080:80"
];
volumes = [
"/var/lib/ttrss/config:/config"
];
extraOptions = [ "--add-host=host.docker.internal:host-gateway" ];
};
};
}

31
modules/ttrss/default.nix Normal file
View File

@ -0,0 +1,31 @@
{ custom, domain }: { config, ... }:
{
age.secrets.ttrssEnv.file = "${custom.inputs.self}/scrts/ttrss_env.age";
virtualisation.oci-containers = {
backend = "docker";
containers."ttrss" = {
image = "registry.gitlab.com/lunik1/docker-tt-rss";
autoStart = true;
environment = {
PUID = "1000";
PGID = "1000";
TZ = "Europe/Zurich";
TTRSS_DB_TYPE = "mysql";
TTRSS_DB_USER = "ttrss";
TTRSS_DB_NAME = "ttrssdb";
TTRSS_DB_PORT = "3306";
TTRSS_DB_HOST = "host.docker.internal";
TTRSS_SELF_URL_PATH = "https://${domain}";
};
environmentFiles = [ config.age.secrets.ttrssEnv.path ];
ports = [
"8080:80"
];
volumes = [
"/var/lib/ttrss/config:/config"
];
extraOptions = [ "--add-host=host.docker.internal:host-gateway" ];
};
};
}

View File

@ -1,15 +1,14 @@
#!/usr/bin/env bash
hosts=(
"mail"
"nextcloud"
"plex"
"management"
"restic-server"
"ttrss"
"git"
"proxy"
"pihole"
cd /home/andreas/.nixos
hosts=($(echo `nix eval .#nixosConfigurations --apply 'pkgs: builtins.concatStringsSep " " (builtins.attrNames pkgs)'` | xargs ))
skip=(
"desktop-vm"
"gwyn"
"loki-test"
"pihole"
"staubfinger"
)
rsa_key="$HOME/.nixos/secrets/ssh_keys/ansible/ansible.key"
@ -17,11 +16,19 @@ export NIX_SSHOPTS="-t -i $rsa_key"
for host in "${hosts[@]}"
do
# Check if the host is in the skip list
if [[ " ${skip[*]} " =~ " ${host} " ]];then
continue
fi
fqdn="$host.2li.local"
echo $fqdn
nixos-rebuild switch -j auto --use-remote-sudo --build-host localhost --target-host $fqdn --flake ".#$host"
echo "reboot $fqdn"
nixos-rebuild switch -j auto --use-remote-sudo --build-host localhost --target-host $fqdn --flake ".#$host" &&
ssh -i $rsa_key $fqdn 'sudo reboot'
echo
echo
done
pihole="pihole.2li.local"
echo $pihole
nixos-rebuild switch -j auto --use-remote-sudo --build-host localhost --target-host $pihole --flake ".#pihole" &&
ssh -i $rsa_key $pihole 'sudo reboot'

14
scripts/test_build.sh Executable file
View File

@ -0,0 +1,14 @@
#!/usr/bin/env bash
set -e
cd /home/andreas/.nixos
hosts=($(echo `nix eval .#nixosConfigurations --apply 'pkgs: builtins.concatStringsSep " " (builtins.attrNames pkgs)'` | xargs ))
for host in "${hosts[@]}"
do
echo $host
nixos-rebuild switch -j auto dry-build --flake ".#$host"
echo
echo
done

34
scrts/gitea_env.age Normal file
View File

@ -0,0 +1,34 @@
age-encryption.org/v1
-> ssh-rsa 7S8lxw
eUJEdmny0JQHP6KX4S1FyNstKolylk5/SDtoK+WRgNpKNNFrTZndzCvQY53VtAnm
FV9rZnqmTZ9M/FauItSxSj5ZKWZnDEH1hn1VS/fHQFN9Hb2I4URuxwX4nfA7VabV
aiKGobwOkLhr+RsJ99kAhMhgQVIZ/9pkC5X5qZr/ASaviydvILzDsGQMW5QVls1b
GWFSvi42njrqB2L/LxQZi12jfH0oVph8zzJXmb9h6KMDf/OL1l8ruPZwAnbBU8na
TLQSOJWj/08ef8uKciVrDry2QPDmgrZAVYp86xUSUQ3NrKbvOfYSlddZeBqIGOLP
CNERmiK3QF+jCWV/fENGNwrSLTa3iMEVdyp+NzId3Z/sRWNtAysumz4aEQr+h7oy
xO++/lE8W9HPPv5mLDRKqsycD1ka6OI/IsEIrCK87fKMOdda0I+JNEZQN7vpm1nj
8VgrmB+ToZ33xUaDMmH50//T+n+7F0FFINmr2ntCxB4A0EyLozLS2q23Pe5S5hPE
-> ssh-rsa Ws+JZA
s1mePHU63casuW4I56NP7FtjDMv99GsMErX3tyXv0X2PhqbauDHrLlAFD26SuPUn
icV87d6SNQbFqXSwgBu7DzhQ3Deb4gKGZ4Qsi1IaT5S/zuqINqD22E5GmNAmKrxj
CcY+zB/1kiwFnyyG4S1A1UBk58q4fU/J+YWNgXQ/qL/GQsU23WehqeqphnVbJz1l
RjDmrZxONcYTRP+8tUiTiGFyx9DVR81/ehJ2rHpMFQz1vNt00BF7uZHV4/L0pXe1
YWcKk6zZFoPZhaCFrZKCK5zpv2qJ2kMzA5e2alEK3G7FswV/p2c46uAG+Gd6OykI
aAq+1A9UDxClrO0vszC+GoZFA/4IDpqTqvw5IPE4E93aHrhiHX10b+T0mMXnKTSR
IhisikG1q3OD9UtkdQWCQ5mGS4tOgpDbF0W+rz7vnZFOyFgzsKONw0LVY6dmz+f+
ioGbiLRtoBsmkX/pMc+P2qA3XVdy+eJzIDWTnaxoh2A6TIjN2grvdRVSTG+cmt/l
-> ssh-ed25519 skmU/w YAV6m14KtiYbS6ApkGEgIAuDJOhalGCyNkNU1k0AXic
j9nhqAXkuP7iY0UMY/6dBiRQ6kbZhbhxNbOUlzcW8i4
-> ssh-ed25519 MpFwoA 6Xfj/ZgHNGizGIMh6EqgTtIfH68JP2nldxpBlvUfRzM
Kgf9DH2qKg3dpya8HTZyS/W+lJ4sCAQzPCBQgXAZeQ0
-> ssh-ed25519 KXqA9w PNtxKpE6vDRvNHMBZiq7PmNmCGf0l6ounGagBYECGSc
NCPKFoP713I1yKgaJywpln/MiGPLMS1gveQ7Zm+mcbk
-> ssh-ed25519 p9NsdQ vzO8SmJaCgXaPb+eddmBgA3GXlj0wZD/ZFNEyvHcVGk
6okBw3t/0E2rq/1L5WQA7Dp52jIfRmoQAoopxJo58Ss
-> N(i&ox-grease a9 |,
dEjWO10QTSK83XvkhmRfPyr0MwjmP47LIudXwGDObK7cK7JQJVK2348dua0ROiUf
dbN7IVFWAGoBFF4
--- qk6DjHjnADg7e9whoT7TGT0jhkKwvbN8NbyjrsxVeNs
¼àÔ>Àhý2?ý<>è:ƼÚä´##0uރ䓪áyŠSƒuÏëGñ”÷•úê ¦§š¤öÎÈÒí–¤l#„¯?NhÄjoÊ_¿n-ÐO^äÏßR=0ª"Y ˜

BIN
scrts/infomaniak_env.age Normal file

Binary file not shown.

34
scrts/nextcloud_env.age Normal file
View File

@ -0,0 +1,34 @@
age-encryption.org/v1
-> ssh-rsa 7S8lxw
LdtLRHa5lpaXExtqkC8s2hJ20P+9YI4f2ZZFEkqc0/JozqzEFiP1xeAs8kXXpknf
czC0AJpTVbovZysY1CCj+ApPprkjSde/RDFVyaa2DQrncKQdeubAY2GcmGpDup1p
McuSIrZ92FuVU/yiBZGSzNeqoujCLoKUra3Y1P+ycrQ04ZBj+sxATAJ92Yba5hJy
n2+/Mjdk00VfbZ+Z9oYejTuWNynCmKGhmAfVwFd/PwCN0lZoIxBucY1IwgtR928A
v5g3i6pkzPXNMwlBbq5DkuEK6V5Lq3uAad0VeNKqyaDFSURLF4yrSqmdlW4iDm2+
IlKtTEHpy7mLK59T8jyZFywDJ+DWywirOC7aZoYZ9UydrrWUyLoDjtfT3+7CTHHU
IhODxMWi6/VeHzpSWNayQcCAviSzsHggHPDYsE4kgI5vBUbMn7wy0GfG5sdH7VsO
6rVLdEoPk3Y2HYverzarnaeQBuIocgOFT6kLvUdVQYBdl9ttxjNRlCtw1yE9ZENY
-> ssh-rsa Ws+JZA
L2AEPNYGbXZFjyB6mY4I/JMaNWqpa8OObhRXFt8WnugS+U4JCENlJDbrpppTSmn+
W0r26wfUyr1di8XSweyhKcVtdgUoFtR/VKuNEKMRK6d1OJ3umRYT3e/sQmM1nIr+
2ZPs7aB705MF61zDz1JEdtwh8aH/+/19XnImatLm0Mz6ImoxE8Fn3elm55SEHcs3
0bM/06pAkSIWbOgP9iArFkbswG0jPzump5W9tS+UrNCNolaMjitIuSfGR1D41G29
kAloVh/iQ5qiWUHSz7NSGQeCVfKNpMC1v1QWWn2Vr9UMXkCiz/1sFOsem/V7PCU6
zajq4/E0K5mOXQlIPA0DRKJz9OgsrIB1eGB/bM2KoZzJYDnEiBcL6kRJ8MpQhP1I
/2i/fDC7tLu+wOndcgyBfXffCBWADg57JJ70YIanNh05rCeV2+5SgnjcxZxMy4hm
mNkpiFAVGdv5XVwcdgYLnhhZjrYnS2gBedwfRDsFKOQHiH2YCbMKcjKHr4daoNWk
-> ssh-ed25519 skmU/w nuyq5npptM5bas+M3jqpReL/hloZs3g6Kqub0uhrTkE
ZmZ2h++VAwAzo9WrM+1XNLOcf1xkhsCXrfxpfs4+fwE
-> ssh-ed25519 MpFwoA XOQyrApMRyzujgyiHbZxjOIVHqj9DuJ/at4VK1b4syg
0Hz9Z376UtxMQn9WXl8CT/YYC4XSRuywWMTVjwplO+E
-> ssh-ed25519 KXqA9w 0KnMs8WH07Quji6wNZDPYd1engQ3Y29BbpT0AryyqVk
2ANzfISoBrt0mkeWt89PBaWrKIv0YgVr80upG1f2JyM
-> ssh-ed25519 aGyD+A pdzvGvRlUkzv5ZQ8ichKbvRiwFQEK9ATRWcA3oX3Jno
tX0gFk+0RXPki7HbIHMj97NQCZfDPCibZ7PWn+E8C9I
-> Q:-grease S`l _Ta<]e& (PT)~\
vgI4o9Su/jk
--- nnHLB07Gyv5bDviSDUjsR4VWuXV6M0UabD56bmGcu24
\æ"ÃŒ•„”ýO«°æ}¢ÔžbÇÖÇM>ÞfèÐ[£æ]׶¶/ç]xfLô±X8^á†5'†æ73”䊯^8Vw»c×Aó—Xzzð-QíNŽöW ¨sÀå!iÿ;»=|Q';{ÌÀ]"ŽÒ¼|`dØRÕ +Þ[ˆ5j(O¢ù«¢Úºñ>ÁÏŠ¢ÕCŸ7/"Æî¾vAJº’ÆôiL'ÚÒ—ˆ¶Å}2ìÏPÆ+ÜîX(Ùè®óUęܺ5IG© Єò¶œb´„ö5žN}
äS(ÇÞnº­0nîlêk,{a<>?>›æÈ;]“=óuãné‰B£†aU³ `ß­î9o

View File

@ -0,0 +1,31 @@
age-encryption.org/v1
-> ssh-rsa 7S8lxw
V6036PaCKhBVJ/IDknAx9NAfUbkHgi3puse24+nQrI+zU6e6ayVI/etbji3Kn/5Q
r5nOHGMbgKQOxth/gy+ZklFeuKjD5TNLFrga7Jh3as96GH4hUD0sHlLOexXz7SLB
o73kiKONOVzMR338xHfI8L2vsUrL4fIUmb5aAOD1RwMJkfa+ubThErTrT824tKzp
+QSpl11cUs2IgjsznocMTC/vTMoTu5MlvUeh5iQfFtfLNLV8czyUwXPkn8lQK2Ep
3ELBy3mU5bHKeE2RKGbbzVZ1LXzXKufOy/U/V7SOH/Y9ZkRw7p67ykyAJq9J/Bgc
lt0Xg5h300ul5ZhTId9Ec+6gTyhrJ93C1Hq1JFtyXvWjgpE3XI0vyFBZ8VzCzPV8
vGPwJiYEGRTpGWK0nFdHCC2s4PODfZTueCSycXvgmg+v5WMbZdLRwcgoH2TnMVuL
LESg9qyDtMSm+DRLOrmmlM/J53yzPUCVD/bCJt99Q4Nv79risckWXkMd5v6QhZ2U
-> ssh-rsa Ws+JZA
OguhPBP9phPhKveo2d06OSpqde+xTBY53KbvWCHUnomQHf8h+pYFJKWPCLs4C6kz
6HZ8TujGo6kEpi0eFwk3AKRojVaicu8h/ks/zu/5ZO4vmTdh1AEBM3CwubnTJN5J
c/jc0pZO34J3J1Q84n0nDiHTXhd6vAzuPPW3nC9eAIPdlsjiVCL5NsRPchC+NqzE
wwr5aHXu9rfaqdumqi6VS9F3VfxtCyb3xnij9YBiuk57Y8agKd/SING1GIlKtOlb
Q+tcEW0AZs/DrzS/DmNGDGG4KRUlrcqbBLztgU/SsptIEdWSy2aYMyctkltgly4e
5v2QVwUO4vWRzxCOs3ky2mcWkjF5YAsngwO12kANGpWFgzKSHuIxq84QLLSMfVro
zhfiRDM20ejdznQnlusuonH5q9ch0gtbNGMt5qDNtSo0rytvWCdayTvBBb+XjSDr
StQDZkuGqW3OJiDO6jB9xaYoefxZyWoDVTF0zVCkaHZtZI+FvKrvNdg63D8JTFio
-> ssh-ed25519 skmU/w f3CXnwxPd0EYnH47v5edS81yhHu95tROVPcwGQtfLiQ
2XzA7YpThQOj6qvADOCsSq+/C3lWbh8E5BH3Na05CN0
-> ssh-ed25519 MpFwoA 6WyGoFcW1FQNOPMjh7EKlVnVVH26z7xwYT3WbePFZ2U
L97BTdJ0baPDWMWzH01gh760m1Ft7HzNSqjcelSfJOY
-> ssh-ed25519 KXqA9w AgScCBkFH1idk+pIzQ5ZmyFGATxwOGODXIN0SrjapyU
wDbYnfopVIt1IFOsHnodEHmjVnF8JWlk9ow8x0KQc3I
-> jJg-grease ,o0,V_,Y #
8dXYOAMc6HiaDQQldIMQJ2k
--- CYIwI6/JyZmHlBBDbZamOzqGHE7mZh7DJhBaExYQUko
.<2E>゙捌ニタヌ<EFBE80>ラY。TサネXロ竿<EFBE9B>ュヌヘ濵ォム QQ憙RQ_ソ碵$<24><>

33
scrts/pihole_env.age Normal file
View File

@ -0,0 +1,33 @@
age-encryption.org/v1
-> ssh-rsa 7S8lxw
WotXeHj1Xtb33rvM5UwMKl/L7n0FTZxNdVeoM5rU2KejUjpLskjkcA3ITEGuo04c
vA43quWGT1/T4qYnhdj5hUnPdqHR/8XbqGtAlBYuoARdzikmKSnBymeKdfIcpBYg
ED5OHKk+SObKcUYaLDK5JFcCxSPUGYRl1WNPSfFzdlzgrWyIxx9R6ROOz9Fce0qq
ai4Wpu6h29RcVSHXDEGyd5iZLLcCixkf46aHN7kWhB2d2Kr2SCeFj1BxrUId7mG2
urWTcRShjnXGMDi5J3DGajwcsb2vbA4G2TdMrlyrRCUcFazSKA267HPwmq4Nhubc
mlEtSqXKzgGatkl6iISpSOtxQNSOcjgWnkQhwLWRF9jWdpmAvAuzgYp5mHAuqKlX
pp+44vllVGogdDnLrw+AYkgnqkkt/5svfcMBnMk1EMYa6eYde+MdDJkyVT/o3pbw
oxxXMXr8F0PEpEmRUU7lyD9K+lJ7XtJix8DEqUtiFGMMpsgdJTXiqM1r7NEpAtrr
-> ssh-rsa Ws+JZA
nDlzMqYCb3artzEFbH0d79J9yaeftEfHP/K+uj9IXri1u2rn3qeYHbShP2AF+oSN
Tq3kGJGqHsDLaEeqRrRvUQlNLnV4P2bGpwE+Z62T0Fr9TlMivT2IFOvW/LyVeeFm
WtHI0rlwx9Aj8ZzCxQvJvH6lVZDa/apWOZ0HR6fH0QO8sZ/+tY0XT/++e/0E4Jps
4y6kaztCyDXsZNt7+HS9WnMSHSzC87HOinLBdGw2KU8+N1GR+5eIYJf66HnDJ9/H
vFT2ZO7DhKmMqIjTvbDNHU8OBN0ZT7UWR3tKk3Q206B9Y6jTGXeDIX/PBPCtz8Fl
vpH2V1OKIo2aWcUsHeFQuR3AwHdA7H+prxdZZ1cRCcHhb/s13F4FJjUU+wEv03Fp
gzp6GEaUmmFfbWnKhZsF3pZMnSLeS3nmf94ChiHZCZmTOodRD/9QI/lIgSJSAH4l
/jPYB257v17LIZrHVyPzlPSXdgpera6IEJP9KCjG2oNEprI9L3FVlUtPyaHGGlPf
-> ssh-ed25519 skmU/w G6tufaaSQmZxnYrObzL/LTd1gQS+dwe1Px6dLWWU3wk
JMS7TnquvVLSqiip9fURTCe1CP2MPMyLWaZJB4xS9QI
-> ssh-ed25519 MpFwoA P8PH6M8eh9trWpqzbDCkS4LgTQK/HYBfCNIYI04GEyo
VWC1SGylwy8Aq71z7cSbK0j6ulrBFrHlICQ6ZjTYn8E
-> ssh-ed25519 KXqA9w xpdWGYuDksLrTfpdj2WA4O8zNPZx/tmjwOyRFh+ZA1g
YQMiXam8ZCGFMg82JKGf+vreluSoGZU0z9WRUx+WyCk
-> ssh-ed25519 f6vWeA IJR8a4Vu6l0GpH4VDCNsD8//ndQx3Vu/5+U7Xrd7+Rk
5/PNZp99GbFn5gF61G2dXzTw+a089uIpiV3mS22W5zw
-> q-grease 7'Cs1 w*a3RY8* QAZdP"
--- nts6pn0cfgPglHpX+tmnE7yIUYSymhjvInlsGzvUh7c
ヘシA4ラニ ィ`1ヤ澎<EFBE94>ホW@オテセ。pj7€産ラソ<EFBE97><EFBFBD>ィ5妲<35><E5A6B2><EFBFBD>コ9濘wモxO

34
scrts/plex_claim.age Normal file
View File

@ -0,0 +1,34 @@
age-encryption.org/v1
-> ssh-rsa 7S8lxw
QXmjN7KSh8xKhsKseiCvSLy4KxIgvakGIosUzWHX5rJOxTJLMc58v/aRQnO4+D0i
42NU7D6BwLST93dyzu66zDrvPLfZOzkaKoXTUlkRhBn10llvxq0bFCwp385+rZJ+
KVSE6IAZ1JZUxC572LgNsET+0kfdfPzR+XWha+Xpzm8bNz6WI1wLeXVvDtLvzKtG
pwQwUOCIzm4k0P2aZJtOVWnC0DUC5cR/Ax8uH5p2/FkjIZ9H0FB8dpDG5AKo//uT
m26+OKkfEA87Ah4tmWe9FRHAnUl+Fq/UhmUBuLulMROymhV8C4ODESy6fyFB0c8p
gs81tTl1n3gdzRdD0beWuriu6nraEvLVlTn5zqKdeex/OJM7/+eMt6LnMzcSRjNC
74OJZ6LBOb53hVaikrfZy/q5YwzbRjYb7gLjGMIHhCltFLN5TmfhcAf/jof8c5G8
C08+OovkBrlEsArjD5/5Cra6p+HHzFX9jxm6UUyTrrWKJ6c5bP9fijL3AhcFHkhu
-> ssh-rsa Ws+JZA
jLLohASY7wCI1I9KUoFMBG5R5Vj1iE9mt8bYn7TlWmrrInwLJs9CVTJtn8ZoTaVB
O5IQ6rhJfNqjp15kuItpIXxYLPwvVSgFqInr8F5ZqgQWijlwtCboB303bFBqLbEE
95TpBwmFgSd1W3ezbX++BILS6Up55sLoTOJFR1KZKutyxNpNoj/PgqjpWj5HTn/2
+yTkNVZvb1fmyPZK3IbG7U/nDpg9Z9c1kZE0Xe31jlEl0f4e/zgcM/eNodpmM4Hf
WrA6uPxpNxNO8y20AoLd+RCruMhoZ36tZM8zJQ5ok5hMZYmdy1Hb72AwngstwX2e
LWUFbj1s3CwdS/GyDQtNNTffw1YN8mmtbvMzPR30NqqkE1qevEku4hiCtnz9RuN/
7P6BSFqE8hD73BwazmzKSDZ6GpFet0FBwecb62gxchmkxJzibH4qwJjr5H0OPi48
2yhnEpvAXQmwkRMJR15V/dZBsdjUtF5Sp5KmIxuba3txy7HCkSfTtxaidSK0oP5e
-> ssh-ed25519 skmU/w KgemDpOZ3lZY3eZCeqJyH7TFRhmmCvMc8q8Omdn3+Cg
kUScyUCHiaGvPp3uwe5ySLdmaMlPz1r5Ki+6HqKZAVE
-> ssh-ed25519 MpFwoA Kn8Rof7GbbksOXN2OkWfSPZxnSPi3WFRwZ9FiyC1d3s
MLJps7Yynm+trJcZZdEWAIxylqcSpcqB8DChOLfi9TA
-> ssh-ed25519 KXqA9w gni4SRyS1MVNNoaVkEvNk+hUZCO+rDaiXLBCkbJFIU8
I2VBMycX5aG/BW6F62lt6mZeQVZHPDt0aKxA75V/pQM
-> ssh-ed25519 6EZJNg Z73LcSsQxreI3Q4EvSL5FbjhSrAiBMux4Y3LZT9/RyE
8Ot7jRTf5lClzkrFTTAgeGcvgcXk22vfpLEcgO3zZpc
-> (HhY;-grease r#H!8* B >a@/9
4N5XJE9Lu2xzNr8ax7WvGW5bTved7vGTLBZX
--- EinUd/E6DNahonGhpkx6fYCi6wUcXxwc7H8JizFgEdc
 t¸>È#5 DÂÙ
 Â|*4²=+ž©AÃ#µþeái@X;˜ÓàŽŽ( ØS0°À¬È*´ŸY†³…<C2B3>¤ÄÑqªÀõ¾ÜR±

50
scrts/restic.key.age Normal file
View File

@ -0,0 +1,50 @@
age-encryption.org/v1
-> ssh-rsa 7S8lxw
OzFzBC1L014yJHeHbcprvvHFrSGGVvDYbSGL0zhz9zU9QVdavrF1Vjiau8uqKw89
BWgGsxkgdalzb99kds21tpX2dW9oVUCC5Utb4WSsOzTD6YvbW8D+XlsNsTPTb9iG
LQAvfe3W7xGCVn1vk87e1lKk21VngsvivaAU1ZUfZLRGTAs16ES9aOQoPN5nmV8x
DqnoApkbxUa3MhM45ZTl6mFXzEJxyBdX6wTs8e2A2BKsdTKTFFSuOamMN1v2b/Et
rnYFSxVNaH/2/lVYcOm4cY9K3IY2T/pgeJXXehg02w0kaaULNh8IqNcLnRygj/XD
tyQdJ3Xgg3bgVAYo8YTeG9+e9CYgLvyxGN4sJ5pa1QE5qAebpy9okCzATxI4quVt
QF//zYPnnLxIw4Vd66a2avySt0JcytjFCuhluOcEpyUb5Nsycieto0tX9bVMRwDb
DQtjDKRafYquLVExVrjfvR1x7MBBtLwVqdIhgAYYFTPGyOEPINAOZgIGub5Q1cZF
-> ssh-rsa Ws+JZA
r6k1X2MNk2nqjyYCjgn1H0C470BNkqJ6m+q4tNtYSmG7jPI/5xXZ6hCOi0eGMypT
ysleDwgW/BuM5o7SKfrx9URVAUe435IO/FTYqO7qOh2hU2nE01TFcjEp3qE47YA7
lzCAlwN5YcMn9ELRbhFmjWt8p8XjSjcRyma1urHQjKa0ggls5VUyGhdn2Sko8ed6
52lwy6bNj/CnrsLycMj1ib1QvrG0o7VqbY/l9I4+x2kqryPgOTqH4Uy/pD1/XFVc
JAUQeAJMdUCPFczGmDQojtPXRgBjACNBDffLL9GB0MPf7rpC5Das/YkoU+b0yzsM
veWeIxovtJLbcNyIbmSQgap4gGT0+6Wb3FKsYDm3cgHft0o31sTQHHe00LV5kpc1
AXz2EANCPMxtauKDzu+v1uOmnckjBH3i7MQKMDV1C5oqhbd7zussHsd9l9S3hu2J
xCJWSY9Os1KlGhkJvJyjeegOr34LGI65dWJQO+QbjQESXmIPOw7aoEz3J8HLDdr0
-> ssh-ed25519 p9NsdQ WL1/YPZGXNiL4fq1q0NQjZSNPGLSDLMlpyOp9Qv82kk
XF8E3iG2x2xn2fYl/QWDkBtUnUSqC3Df9IRZ8ScTMEk
-> ssh-ed25519 skmU/w lL8if8HD/7QHG5rTmrAuZ/Mvlf5ugWy6mMMdN1znOBY
0ne2zhnCV0BJ9gh7E4gRgonRM5IGT8iDXCf3fFsEaSM
-> ssh-ed25519 L7IrhA tMYUDRPI5jUaUk2v2/cJ2PfF9vFZLR3lxUosLPx6z38
TvZsKBkb1ss3KmkFqL3YXzEeADtKMbrbanUFkZRCedY
-> ssh-ed25519 ASE6tQ dWh338rCCoy90kGWAuzAXApaQSUnX5mc0faa1pQPKRw
IEptFLmlBQOh8F6QpI/kx4Fjsbd+RZ0r+ZPVnZpkN90
-> ssh-ed25519 MpFwoA 2LxQdhrQwahXu8sPByC7Iat1UDW2HTCrBy99E3WU5Fw
x3hU+nNhdOeCwB/vDfJuOtv/Ku1wdasvw5ITCVvUL2g
-> ssh-ed25519 aGyD+A DrG2z4JqXFC70cDXoHSKKvO+5jH0HSQ1E6AF6o12JEc
SXuuFi6z8ukei4GZpdcVKasZJzjqXVJCf6LKBsu1J9E
-> ssh-ed25519 KXqA9w vzLJx/+kTAIiuKDN/I4WJ0dNgr1C4gsMEvz77wRI/yg
jEqXDIBVcOhVZERxynTQzQ5EQUTLFafNLG6jQT+2zag
-> ssh-ed25519 f6vWeA oijUvlyY9l6cXr2eXuEqV+cUr4EF32rGsEd7ewa1hQs
NcuR16Msc8GxavitVBSVYXTzg51F/U+J82UE1V3kpSI
-> ssh-ed25519 6EZJNg 84hGgnr/Qwshnnyq9I9uj1onQG7lJ3KTQsBxNbB3slg
4sf6zyReKAsOE82dpJplxPV2Pqygbe3AGbvMwd+dQMg
-> ssh-ed25519 6TvZbg D0bfdLAmX+E7/kRXHCtkLTAaY004cynq1LLuMu0dcks
rVOArYhUaF4+RgAh28BrS2wWetskLFUOKrihZpG3Un0
-> ssh-ed25519 BycpnQ 5MwWmzm0lNRGBrwz3dSQ/bYdn3zVc87aouCifCTnTQU
7PXd9CuMyex61PTrHnTgULJj2Y7iV366K4pQ0KjtxSA
-> ssh-ed25519 pCmz5A o2ZYdBuAfGG5VDRwB11Q5CjCLT4hBUQ6Q59zKIf513E
PYz4Gf9Np1kkc8qG2J6YM7w3+E/raD1q+310aI1xdys
-> D,C-grease #P3fP{ [,?%}
tbwJ6/FEVeNe9AYCNCYRxfbcaAm1qeNNLFNI6aY6C7gmU9403oSmdEWBm0WLt0KP
JYs
--- WBUozPqy+aDm4mj36Q9N4y3uNSZiVZDdwGIyEsvH1Ho
žÕÈÏþOÃ-BA <0B>ª.ÊÈIò¸ó÷²$Mÿi[DÿI ÓWªÛÿë 2„÷í;öW+¼Óþ!ˆW

46
scrts/secrets.nix Normal file
View File

@ -0,0 +1,46 @@
let
andreas = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCR+JXNHSAEQamn2QiaKV0vejCPy6OmzOePXoaQF6CEknXyvBO4j7+qpgZ5RAhe7ups8xZrEpBKdtxRMf7OdQQEXg1PLlfWZSJTC8EGu1TbMltbwwHizgsK/15LkDhJ0Gk/GFz9O9GvGqjizik8Kvvqz8XWY0tEtYs5Riq8bB5D5Ctwl10iultqnIQkdaX0bNa/2X57XKeutWdbqhuSC/C7awC1aVDIdfy1BNT3weHhQhFVAeAlH7Fy4rx3gYPclICfzu27lulLeXKJj9F+NdeY84zEy7E8IkE7eqdo1zfdJJpXSIh3FqekWen5njzWJsXqZCa2Ynk1poK/Rv/ti+ySE+4XicyXp0VJM8fDz6iUI0S/pjumHwzpoN9CeNe5PDK3Y7iQzSlO9REvkj/+v7r2s6XKslk9B7hTKunvH5JgHlIeYymzXb4r2LggNrP/1KUgNk1Ztu+s1c5onXYfBNul1iQOFU3+kgTk8Oh/UFK3FA0dYeWrOLA02TdH2S7U6yE= andreas@gwyn";
andreas-nixos-vm = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDA3/7NfN0GSFq4CCZa1BSizm95tFx7Ogz4IS2SaIosZ7xdjVpqAQ7iK/UG5GRKvBjhUnrGUwU9CRt6wYLhs47/qj20pMlnpvLb/0yDUwvY+2SfH6taZeLArL/o4d6jFrPuOGxP5Lt213qe/hZA0hnc6f7gZY13vXJ37Wm4K+st3N8qtk3lcTncb9aPrPoYBfrm7DGWBczdJtPPp/eJmgKATDHsy95hUuUYm17Pu2uzSVRaXIZnuevfySgRHi9qsk962GdC7CcWlctMGry7++1D0lzXdollseZQaKf40wRzMQJrOb7OueI0s5hlKsVNJR9SXbZm0rJhTeUJOzh3v+b5nNzcjqG4Cx6BOOg400ayvTxBC5pH7GRBO1Pgpj3+r2mWFOlPYwfIYS0EjoQIdKYQBefrqRrzDavancIFlqyifs8XQIru7PnF6IP6EmyQwIoybUlZzLPAWXSTXyyx7F0+w181+hYLnbHd7+u6ddVLXbUKfZ77SXiPThep9Tfw3J8= andreas@nixos";
users = [ andreas andreas-nixos-vm ];
git = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDO40In82pEqQJexG9nlXOsYb4T/sYrb/4EVtGc0bfEb";
gwyn = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGNmtdodpXHcwEsX2x89RyxjX5F6eERanzM4OXlNDx50";
loki-test = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKqCmY9F2nWasFtmBpk401lacclXeddDm+OTZ4+tNM94";
mail = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG1SpBpTmpUymwjkevYttnOAS4xkzu7wtQYRHTK6XRgQ";
management = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDXLCjTgxnu2WHt6AtEeJ0a0H3x6dc3Cb+GN8GAJPqRO";
nextcloud = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAII4k14NXzaM5AqM9OfsFERnCT2ZMYXIaPrt34H2Jq5tx";
nixos-vm = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOcmWE9b7GQKOOq61gYLdFA5uZ+hhpBYePmmdRDGwIVu";
pihole = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJ18YfLmcINwuPcqlAPJTLkNM4/JvA8MrKutlyzKYJtA";
plex = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDsIpx4uigis0II6BW0s5Huum+sOnuS/R11MaNPh3qFm";
proxy = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIACtJWes3zBh0Hs0BEC2ZC+9+ddLALlzuAxyNjLgf5Fh";
restic-server = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPsjf063cd2QPTTRRP6s+VvAkDal1pHbVxBIycv5ntz+";
ttrss = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILWQKvlLbat4Bp3iu4oFpdHSaiyi6x/efCMmYtCNfgfb";
systems = [
git
gwyn
loki-test
mail
management
nextcloud
nixos-vm
pihole
plex
proxy
restic-server
ttrss
];
defaultKeys = [ andreas andreas-nixos-vm gwyn management nixos-vm ];
all = users ++ systems;
in
{
"gitea_env.age".publicKeys = defaultKeys ++ [ git ];
"infomaniak_env.age".publicKeys = all;
"nextcloud_env.age".publicKeys = defaultKeys ++ [ nextcloud ];
"pihole_env.age".publicKeys = defaultKeys ++ [ pihole ];
"personal_email.key.age".publicKeys = defaultKeys;
"plex_claim.age".publicKeys = defaultKeys ++ [ plex ];
"restic.key.age".publicKeys = all;
"telegram_notify_env.age".publicKeys = all;
"ttrss_env.age".publicKeys = defaultKeys ++ [ ttrss ];
}

View File

@ -0,0 +1,50 @@
age-encryption.org/v1
-> ssh-rsa 7S8lxw
Axd10RxXzvKlK1nzAfNrc+pE1SynakRuzk7ORdFyahQbh9BFRyj3RGoYTdNzAVya
g+w8xrSvo6pMhRSFus/Qc/DsEMcRtDNJbaHRGjWS/xCEJ/yOOX21X3A4rATnkl9R
2Hgm7LeimiKeOJTkINtLgq51ZX9RXnBMejcQ4qE6PN9xh4HIV33KfUt61Mn6kaqC
IctP2i1T2/D/N3yrOJ/dvJuEFdKIRr6fsp70cwjLDls26fRoCepz2aAo0o5gu5kX
pQk6xuenTE5jBWjoiyveTynNONV0trHFenaOKElbzyRJKvX5xrjRQR5/TiSC1fBl
NWDBicgTG4Q8AHtnNFrDkjSAf5ofWWggQKGeQiq5/U1X5yOZVnpb2eJ/SPK83FhG
84CfUdimxLkpFtSOwbXuH45K8wtNT+4D1zep5bO3n0XuLGOkNYfcFaxKt6eFz6CP
mvpI+x4/sYp2CobI9UhEfXIdZkfTRXswkDoNtyFjGQxfpyawoFEFL7DUFObOg7XE
-> ssh-rsa Ws+JZA
f+NUe9D1le+wjjfuk6vQ8hjAVvqzha2/IFBHoVPGdRjBEYarJI7wbi14+LcHhW8V
3ouJj2j4jMhd7tWsvwNsSso1MHSpg3ZG13DvDxCVNJjb4wIs+XCqTYJHr2phaPdA
gF11HM1cZp3S4hFrnxLf3J6f+dkckn2IRnKzqcP7ubbwow4/UZekax4by/3WvPxk
BSuhxgXNevIlGyrrKzu9+7Fd4okgX1V4+UvBUJWmFrd+QcgGcQHfAgsHqd80X+zh
sI98XPJMI3HOcfJaG0HkfAYcrNCaoXHDFRb8ifXcg7Q+WHiX4OooHjDcMvT1jWmN
/+a0MYXe9ARLEs02DIVmAaHe8JTNLIuJGrjTdlaRua2y8JAV1EuOfv0fURF7rCIt
HZp7szYftbnF33qANbxcbcFhPQ9jA9/EQau2PkRRfErNgUJnn2Hqvba1Z0ZmDYQI
jjj8/lfBVhR6TQA7Dgb7X9mRdphCSNIa/YvATTkQ7ruuJNGsEGGBkzqZfOYhtU8O
-> ssh-ed25519 p9NsdQ FLRlGjfACWEX+TGM6pZEZsu4P19/A/4L5wIiI2UggEo
nEFfCZiThclxSFhXDi/r0ITXRZLpjiBbVcpHM5/xBgY
-> ssh-ed25519 skmU/w 0nZPm3fP/jzIQU0RhsH5OR02BtISPHSTTUq68kw+SUM
GlWBzvJ1no+zycfBLHeuNpYZSczqCstD7cWAjvN4vSQ
-> ssh-ed25519 L7IrhA i8+ae0tnND6dPqFxjMyQPh6+rSlgBs6h00D/TdIZoFo
uzeEEiH31pPpWnRN80MUhCCyggx5DOra7dtwYNZrkys
-> ssh-ed25519 ASE6tQ Qsbw9rXUOENE8+I/l0xtaafDlIB5mcTZ0fsG9YuNjCk
GyJZp77tywZf5PGYEz48n29kEiNde3AsJwWniJRZRew
-> ssh-ed25519 MpFwoA 8xaEQRjQblkRdwkULoRNQE4i3ttbz0gUtvcsZjFuinM
s3FyD4FcPH2VcgwfP5cj3RENtkkz4l6Z/494CpLYDFY
-> ssh-ed25519 aGyD+A H/sq7RSG/oDaosjLUX0yamHrFjIRppv0dYBgplSupwc
z4FqPxJO3uXXFsHwx7ZSiLbXEpt+pT3c1jW+hVl5PzM
-> ssh-ed25519 KXqA9w 6UKpAMVjEwa9WjiPhwKFkb4TKppGnlKU91k05i6kD0A
BKBJXbOv/Wv3R5T1zZ2tGg8MldFJAybdxmSB4Q0r19s
-> ssh-ed25519 f6vWeA DPKcfb0mlYN5rttp0tc9j+01qXJqEEEqUsfol1NMvw4
04z3yLiLS0uCr/vnCvh/TK6WtT9SpivEpfRXt1uQ0Vg
-> ssh-ed25519 6EZJNg 3EX7lZhmTb2bPZPFpZF1vbmbmmfp560O92UXw8BtfTU
B1U6ZPdG1vtJBggA39P8/YcE1D8xkZcQ5o84gG+5QgY
-> ssh-ed25519 6TvZbg 3cSvm0LFxB/tobLMZgqoOZRfUEFzEgvw1goQo4OQzVU
RzI95P5iwiaQpcz//QtnK3gq12x6+xlpK/cYJJ4zQc8
-> ssh-ed25519 BycpnQ Z48vG8C+hGh4RMvRuy4ESXo0JCrMPPc08PUVHF4QXg0
X6vIufKlKEdHDIeSa3dSqTWJcBzlGUJeUO45OIEhul4
-> ssh-ed25519 pCmz5A xo8MvI8C8VvyMXlg6hFljS9jIIpfg68CSznK0PsuEQs
rBqe+3MhQQFcgRjBHG8dA1WrfL719nns7Gh7UlJht98
-> *;A"jOF-grease OpO/CuCJ
4A/2jWunNXDPgZoh38qXJcAKw+4jfsdhRaJiVp2Qfyc6X3r9y+MZg/nDeBAETSCj
2PV280bY1iXOQxiwLY0Jg8baKuAWIaQh4Qx8
--- YhdR13OJ7tCbOkO3fcHFtZ0dxpHXoQ6XtcYrHkbfLxs
¹{…Xv„cgøƳb'€a;6Ü<sÜûÕáîƒCmt¢MßËòî½Prš7é=²OwFñ}¢<1D>¢â3<¼§šþi¼!aÉ(Õ\a ¬ þ•xî&x©…íúDLlõs¹<73>¬ €rªÅ:ê}wÀ

33
scrts/ttrss_env.age Normal file
View File

@ -0,0 +1,33 @@
age-encryption.org/v1
-> ssh-rsa 7S8lxw
Mmalhpd4yRgRU3/dIpM3lRAS1G6OubRYdWP4UsmvkcqYTY3uKJKCGcnDgNAl/Ty6
pudhqywq2Cb2UM1NVX582a1dkT1BYIumLkR0gp+6P6nHu90YFwEAIv00O8n/SSfU
TsHBztBsp/QeCG8r8HeiYUWXTN/qfSldUxPC/fffp+ooEGV2FfaiQEsOac4aNYZg
5UzhVbz5GoODTbjrTjVG+m/V7aLP4WyjFyUq8Y+K6XH2/jWbKHAEDABXIP9nA6P0
r2ZMOiubLYsdwRfTefIpP33pzaWGgRgYEqHLqr9qxm/kiKgE0Wq/8Cs3MpRONRpl
/6chdq0cm3ea5oUVprNOAcdW3JCErH6dgs64zN42FgT1u1LqW5qFyc1H0HUmNOhx
Ruz1K9MSIEj8ACBwsRk2Xzzn/Fn44aVIKUZIn3QEPIlWWZUCFCUTCdgiM2QqlsAT
OkHDaCLTgfeDSu0h61/Eok2rxL3ycN/nuDYYNFeN1xSMnLSoTRdDPSQgqJNFONmS
-> ssh-rsa Ws+JZA
TSF7JTlv3SWC/GZ17OLf3dr4E0S4mlmW6feq13GpJLJr7X2legPFGQfzdcoGJkny
eqJVKSkKLoe3nr+iaI839bEEKRisLi6BEFOD2ARHWNQItyCnjK7XUk60ylddn13a
fP2vy+jNFvGfXyqNqgLxxUzm3lM+ev3E5XTe2BowEfV4S/q4oX6VkbwqEL6aw7Fa
rqXegWmGIXj5Gu9wEZVLnq+WFE/Li6Lw1xUUJn/iOsWmQb6sz+bOSi+ElWaVb86X
3Z1IOJ+XAZxTljvN04bOaWO9oy3QhsmW2kGatms2xDS72RAMeg014fDDO5TSPxkd
wnpKy3mp2tMVJidoPmdCTnFbtelvUX6zlXi1sX7MhlcgnW9kpTgAla4v97jHoNRT
Dm9+/r1odO93V/nKr2I7w28YyNB4pDGHMH8rc3s7F3FPMFvimxbObZusSCpaZo2g
x7nPKz6qjQ6ws86AmOE7s7K9m1ScQ7Bt2ZvE4fS9vdh7NxR/4Fn+EzZaZjfptBge
-> ssh-ed25519 skmU/w 1thu7Lb+GVAsTho7mWgOZ2IvDTlEWLaYl+oRvxBGB10
+3stgY+1C19cuIYy4Ecl1d6JrJwjb6oYc4uMbrGiiZs
-> ssh-ed25519 MpFwoA qGO9cqAZ/0IC13X5Wz0cKxyRm+CYVgapWlJFb4VOMwE
xyEXu3T+9IatJGgU0/YJrs/GUOUyTQz64k0KkMBCJKc
-> ssh-ed25519 KXqA9w Iy0bYcwKvFKJUEEwNhD4Qinp174cS3WO3UorqlWNBz4
oxxtu19lON3NmJtmnU7rKcy77T6P8p9oz7kPXGVdaqI
-> ssh-ed25519 pCmz5A WHKp2zI5R9CjIcK9y6pYLFlPGdRw8vAWn2E4xlZUB1U
fFva31QXPLZeRE32EA2av/kt5OtWitOK9kEY1dKoJsw
-> GspYm-grease OmOD[ c7o
Ei4pZIKC1k1GtgQyjr3EBqJcmh+O2A1H89Ahr8o8sJ/7lcWuWCW8DWES
--- e/XgzLW6tWfyDOVXl1WkH/thiD27assg3HGFDFb+dZc
6°žBã¼’¼'3ˆÓÅÖÄÕxJ!CkWŸú/@ç;IdŽð¥©HÝoÑ8˜kAIÑLÜš`Úá/~g êu•„<E280A2>dpR6©î5w

@ -1 +1 @@
Subproject commit 5e8acd3f4b15414e99d8e4ab9cc16f0db2844c6c
Subproject commit ccb7f913c327409bc8ec4785ee9c33adc2b9708d

View File

@ -1,12 +1,12 @@
{ hostname, inputs, ... }:
{ custom, hostname }: { ... }:
{
imports = [
"${inputs.self}/modules/desktop"
"${inputs.self}/modules/docker"
"${inputs.self}/modules/espanso"
"${inputs.self}/modules/logs-share"
"${inputs.self}/modules/nix-direnv"
"${inputs.self}/modules/tmux"
(import "${custom.inputs.self}/modules/desktop" { inherit custom; })
(import "${custom.inputs.self}/modules/docker" { inherit custom; })
(import "${custom.inputs.self}/modules/espanso" { inherit custom; })
"${custom.inputs.self}/modules/logs-share"
(import "${custom.inputs.self}/modules/nix-direnv" { inherit custom; })
"${custom.inputs.self}/modules/tmux"
];
boot.initrd.availableKernelModules = [
"ata_piix"

View File

@ -1,17 +1,24 @@
{ custom, hostname, inputs, pkgs, ... }:
{ custom, hostname }: { pkgs, ... }:
let
domain = "git.2li.ch";
in
{
imports = [
(import "${inputs.self}/systems/proxmox-vm" {
(import "${custom.inputs.self}/systems/raspi4" {
ip = "10.7.89.109";
inherit hostname inputs;
inherit custom hostname;
})
(import "${inputs.self}/modules/restic-server-mysql-client" {
time = "03:00"; inherit custom hostname inputs pkgs;
(import "${custom.inputs.self}/modules/restic-server-mysql-client" {
path = "/home/andreas";
time = "03:00"; inherit custom;
})
(import "${inputs.self}/modules/nginx-proxy" {
domain = "git.2li.ch"; inherit inputs;
(import "${custom.inputs.self}/modules/nginx-proxy" {
inherit custom domain;
})
"${inputs.self}/modules/docker"
"${inputs.self}/modules/mariadb"
(import "${custom.inputs.self}/modules/gitea" {
inherit custom domain;
})
(import "${custom.inputs.self}/modules/docker" { inherit custom; })
"${custom.inputs.self}/modules/mariadb"
];
}

View File

@ -1,25 +1,26 @@
{ custom, hostname, inputs, lib, pkgs, ... }:
{ custom, hostname }: { lib, ... }:
{
imports = [
inputs.nixos-hardware.nixosModules.dell-precision-5530
inputs.nixos-hardware.nixosModules.common-gpu-nvidia
inputs.nixos-hardware.nixosModules.common-gpu-intel
"${inputs.self}/hardware/bluetooth"
"${inputs.self}/hardware/nvidia"
"${inputs.self}/hardware/dvd"
"${inputs.self}/modules/data-share"
"${inputs.self}/modules/desktop"
"${inputs.self}/modules/docker"
"${inputs.self}/modules/droidcam"
"${inputs.self}/modules/eog"
"${inputs.self}/modules/espanso"
"${inputs.self}/modules/lockscreen"
"${inputs.self}/modules/logs-share"
"${inputs.self}/modules/nix-direnv"
"${inputs.self}/modules/scripts"
"${inputs.self}/modules/tlp"
"${inputs.self}/modules/tmux"
(import "${inputs.self}/modules/restic" { inherit custom hostname inputs pkgs; })
custom.inputs.nixos-hardware.nixosModules.dell-precision-5530
custom.inputs.nixos-hardware.nixosModules.common-gpu-nvidia
custom.inputs.nixos-hardware.nixosModules.common-gpu-intel
"${custom.inputs.self}/hardware/bluetooth"
"${custom.inputs.self}/hardware/nvidia"
"${custom.inputs.self}/hardware/dvd"
(import "${custom.inputs.self}/modules/desktop" { inherit custom; })
(import "${custom.inputs.self}/modules/docker" { inherit custom; })
(import "${custom.inputs.self}/modules/droidcam" { inherit custom; })
(import "${custom.inputs.self}/modules/email" { inherit custom; })
(import "${custom.inputs.self}/modules/eog" { inherit custom; })
(import "${custom.inputs.self}/modules/espanso" { inherit custom; })
"${custom.inputs.self}/modules/lockscreen"
"${custom.inputs.self}/modules/logs-share"
(import "${custom.inputs.self}/modules/nix-direnv" { inherit custom; })
(import "${custom.inputs.self}/modules/pipewire" { inherit custom; })
"${custom.inputs.self}/modules/scripts"
"${custom.inputs.self}/modules/tlp"
"${custom.inputs.self}/modules/tmux"
(import "${custom.inputs.self}/modules/restic" { inherit custom; })
];
boot.initrd.availableKernelModules = [
"aesni_intel"

View File

@ -1,14 +1,14 @@
{ hostname, inputs, pkgs, ... }:
{ custom, hostname }: { pkgs, ... }:
{
imports = [
(import "${inputs.self}/systems/raspi4" {
(import "${custom.inputs.self}/systems/raspi4" {
ip = "10.7.89.10";
inherit hostname inputs pkgs;
inherit hostname custom;
})
"${inputs.self}/modules/docker"
"${inputs.self}/modules/pihole" # needs to be limited to lan interface
"${inputs.self}/modules/router"
"${inputs.self}/modules/tmux"
"${inputs.self}/modules/unbound" # needs to be limited to lan interface
(import "${custom.inputs.self}/modules/docker" { inherit custom; })
(import "${custom.inputs.self}/modules/pihole" { inherit custom; }) # needs to be limited to lan interface
"${custom.inputs.self}/modules/router"
"${custom.inputs.self}/modules/tmux"
"${custom.inputs.self}/modules/unbound" # needs to be limited to lan interface
];
}

View File

@ -1,18 +1,21 @@
{ custom, hostname, inputs, pkgs, ... }:
{ custom, hostname }: { pkgs, ... }:
{
imports = [
(import "${inputs.self}/systems/proxmox-vm" {
(import "${custom.inputs.self}/systems/proxmox-vm" {
ip = "10.7.89.123";
inherit hostname inputs;
inherit hostname custom;
})
(import "${inputs.self}/modules/restic-server-client" {
time = "04:30"; inherit custom hostname inputs pkgs;
(import "${custom.inputs.self}/modules/restic-server-client" {
path = "/home/andreas";
time = "04:30";
inherit custom;
})
(import "${inputs.self}/modules/nginx-proxy" {
domain = "mail.zweili.org"; inherit inputs;
(import "${custom.inputs.self}/modules/nginx-proxy" {
domain = "mail.zweili.org"; inherit custom;
})
"${inputs.self}/modules/docker"
"${inputs.self}/modules/mariadb"
(import "${custom.inputs.self}/modules/docker" { inherit custom; })
(import "${custom.inputs.self}/modules/docker-mailserver" { inherit custom; })
"${custom.inputs.self}/modules/mariadb"
];
}

View File

@ -1,23 +1,22 @@
{ hostname, inputs, pkgs, ... }:
{ custom, hostname }: { ... }:
let
domain = "test.2li.ch";
in
{
imports = [
(import "${inputs.self}/systems/raspi4" {
(import "${custom.inputs.self}/systems/raspi4" {
ip = "10.7.89.150";
inherit hostname inputs pkgs;
inherit custom hostname;
})
(import "${inputs.self}/modules/nginx-fpm" {
dataDir = "/var/www/ttrss/app";
inherit domain inputs pkgs;
(import "${custom.inputs.self}/modules/docker" { inherit custom; })
"${custom.inputs.self}/modules/logs-share"
(import "${custom.inputs.self}/modules/restic-server-client" {
path = "/home/andreas";
tag = "management";
time = "23:30";
inherit custom;
})
"${inputs.self}/modules/docker"
# "${inputs.self}/modules/logs-share"
# I currently can't install lnav because it is not building on aarch64
# https://github.com/NixOS/nixpkgs/issues/197512
"${inputs.self}/modules/nix-direnv"
"${inputs.self}/modules/tmux"
"${custom.inputs.self}/modules/tmux"
];
services.nginx.virtualHosts."${domain}".locations = {
"/".extraConfig = ''

View File

@ -1,16 +1,23 @@
{ custom, hostname, inputs, pkgs, ... }:
{ custom, hostname }: { pkgs, ... }:
let
domain = "nextcloud.2li.ch";
in
{
imports = [
(import "${inputs.self}/systems/proxmox-vm" {
(import "${custom.inputs.self}/systems/proxmox-vm" {
ip = "10.7.89.103";
inherit hostname inputs;
inherit custom hostname;
})
(import "${inputs.self}/modules/restic-server-mysql-client" {
time = "04:00"; inherit custom hostname inputs pkgs;
(import "${custom.inputs.self}/modules/restic-server-mysql-client" {
path = "/home/andreas";
time = "04:00"; inherit custom;
})
"${inputs.self}/modules/docker"
"${inputs.self}/modules/mariadb"
"${inputs.self}/modules/nginx-acme-base"
(import "${custom.inputs.self}/modules/docker" { inherit custom; })
"${custom.inputs.self}/modules/mariadb"
(import "${custom.inputs.self}/modules/nextcloud" {
inherit custom domain;
})
"${custom.inputs.self}/modules/nginx-acme-base"
];
services.nginx = {
@ -19,7 +26,7 @@
add_header X-Frame-Options SAMEORIGIN;
'';
clientMaxBodySize = "20G";
virtualHosts."nextcloud.2li.ch" = {
virtualHosts."${domain}" = {
enableACME = true;
forceSSL = true;
locations."/" = {

View File

@ -1,15 +1,17 @@
{ custom, hostname, inputs, pkgs, ... }:
{ custom, hostname }: { pkgs, ... }:
{
imports = [
(import "${inputs.self}/systems/proxmox-vm" {
(import "${custom.inputs.self}/systems/proxmox-vm" {
ip = "10.7.89.2";
inherit hostname inputs;
inherit custom hostname;
})
(import "${inputs.self}/modules/restic-server-client" {
time = "05:00"; inherit custom hostname inputs pkgs;
(import "${custom.inputs.self}/modules/restic-server-client" {
path = "/var/lib/pihole";
tag = "pihole";
time = "05:00"; inherit custom;
})
"${inputs.self}/modules/docker"
"${inputs.self}/modules/pihole"
"${inputs.self}/modules/unbound"
(import "${custom.inputs.self}/modules/docker" { inherit custom; })
(import "${custom.inputs.self}/modules/pihole" { inherit custom; })
"${custom.inputs.self}/modules/unbound"
];
}

View File

@ -1,15 +1,18 @@
{ custom, hostname, inputs, pkgs, ... }:
{ custom, hostname }: { pkgs, ... }:
{
imports = [
(import "${inputs.self}/systems/proxmox-vm" {
(import "${custom.inputs.self}/systems/proxmox-vm" {
ip = "10.7.89.112";
inherit hostname inputs;
inherit custom hostname;
})
(import "${inputs.self}/modules/restic-server-client" {
time = "03:30"; inherit custom hostname inputs pkgs;
(import "${custom.inputs.self}/modules/restic-server-client" {
path = "/var/lib/plex";
tag = "plex";
time = "03:30";
inherit custom;
})
"${inputs.self}/modules/docker"
"${inputs.self}/modules/media-share"
"${inputs.self}/modules/plex"
(import "${custom.inputs.self}/modules/docker" { inherit custom; })
"${custom.inputs.self}/modules/media-share"
(import "${custom.inputs.self}/modules/plex" { inherit custom; })
];
}

View File

@ -1,9 +1,9 @@
{ inputs, hostname, ip, ... }:
{ custom, hostname, ip }: { ... }:
{
imports = [
"${inputs.self}/modules/log-to-ram"
"${inputs.self}/modules/ntp"
"${inputs.self}/modules/syslog"
"${custom.inputs.self}/modules/log-to-ram"
"${custom.inputs.self}/modules/ntp"
"${custom.inputs.self}/modules/syslog"
];
networking = {

View File

@ -1,16 +1,21 @@
{ custom, hostname, inputs, pkgs, ... }:
{ custom, hostname }: { pkgs, ... }:
{
imports = [
(import "${inputs.self}/systems/raspi4" {
(import "${custom.inputs.self}/systems/raspi4" {
ip = "10.7.89.99";
inherit hostname inputs pkgs;
inherit custom hostname;
})
(import "${inputs.self}/modules/restic-server-client" {
time = "00:00"; inherit custom hostname inputs pkgs;
(import "${custom.inputs.self}/modules/restic-server-client" {
path = "/home/andreas";
time = "00:00";
inherit custom;
})
"${inputs.self}/modules/nginx-acme-base"
"${inputs.self}/modules/docker"
"${inputs.self}/modules/haproxy"
"${custom.inputs.self}/modules/nginx-acme-base"
(import "${custom.inputs.self}/modules/docker" { inherit custom; })
"${custom.inputs.self}/modules/grav"
"${custom.inputs.self}/modules/haproxy"
"${custom.inputs.self}/modules/heimdall"
"${custom.inputs.self}/modules/rss-bridge"
];
services.nginx = {
@ -41,6 +46,7 @@
# This might create errors
proxy_cookie_path / "/; secure; HttpOnly; SameSite=strict";
'';
recommendedProxySettings = true;
virtualHosts = {
"2li.ch" = {
serverAliases = [ "www.2li.ch" ];
@ -55,7 +61,12 @@
"heimdall.2li.ch" = {
enableACME = true;
forceSSL = true;
listen = [{ port = 4433; addr = "127.0.0.1"; ssl = true; }];
listen = [{
port = 4433;
addr = "
127.0.0.1";
ssl = true;
}];
locations."/" = {
proxyPass = "http://127.0.0.1:8081";
proxyWebsockets = true; # needed if you need to use WebSocket

View File

@ -1,10 +1,10 @@
{ inputs, hostname, ip, pkgs, ... }:
{ custom, hostname, ip }: { pkgs, ... }:
{
imports = [
inputs.nixos-hardware.nixosModules.raspberry-pi-4
"${inputs.self}/modules/log-to-ram"
"${inputs.self}/modules/ntp"
"${inputs.self}/modules/syslog"
custom.inputs.nixos-hardware.nixosModules.raspberry-pi-4
"${custom.inputs.self}/modules/log-to-ram"
"${custom.inputs.self}/modules/ntp"
"${custom.inputs.self}/modules/syslog"
];
fileSystems = {

View File

@ -12,6 +12,7 @@
environment.systemPackages = with pkgs; [
raspberrypi-eeprom
vim
];
system.stateVersion = "22.05";
@ -33,6 +34,35 @@
isNormalUser = true;
initialPassword = "password";
extraGroups = [ "wheel" ];
openssh.authorizedKeys.keys = [
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCR+JXNHSAEQamn2QiaKV0vejCPy6OmzOePXoaQF6CEknXyvBO4j7+qpgZ5RAhe7ups8xZrEpBKdtxRMf7OdQQEXg1PLlfWZSJTC8EGu1TbMltbwwHizgsK/15LkDhJ0Gk/GFz9O9GvGqjizik8Kvvqz8XWY0tEtYs5Riq8bB5D5Ctwl10iultqnIQkdaX0bNa/2X57XKeutWdbqhuSC/C7awC1aVDIdfy1BNT3weHhQhFVAeAlH7Fy4rx3gYPclICfzu27lulLeXKJj9F+NdeY84zEy7E8IkE7eqdo1zfdJJpXSIh3FqekWen5njzWJsXqZCa2Ynk1poK/Rv/ti+ySE+4XicyXp0VJM8fDz6iUI0S/pjumHwzpoN9CeNe5PDK3Y7iQzSlO9REvkj/+v7r2s6XKslk9B7hTKunvH5JgHlIeYymzXb4r2LggNrP/1KUgNk1Ztu+s1c5onXYfBNul1iQOFU3+kgTk8Oh/UFK3FA0dYeWrOLA02TdH2S7U6yE= andreas@gwyn"
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDxBun0BYQaz/WjiP+g5+Hs9/JZnWAuLTpTVYgx/9shJwKS5Zu9K3I115DYOro/lpu0AMeeJca5We2AICcxYcM0lIZvsJqfOnFOHFjgmHxHc6IuzrUPM7msoLneF5lxfJ8ko2/LcFq8EtGlzjkllRpFpp2FtxDviD1lr4mJda4cOuQES4ujH3HP5Shpwa96oqnDENWCL+XPFe+Ur+88tuKTQ2MIX5Iqhs2sMIwsMI1o8HjBi4sMd+kd7qb232XcwWTlP3iIWvq/0D3OxZ6J6uSNyC4UCl781lupLOKrC6ml58RUrYP8nrF0a53+i0hgLuDiCWhj0vkY7W9nJW1no425 andreas@python"
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDg03JFE6TzMT3mZw0OJtcBwUHCB+3AHwtS981jEd/6wFQPoFrmR48yu5RWh2ikjy8axIIVRz8pX50GNRXzGLuqI8nS9Kb5CSKs4uPE7OxSbZqO+qeTiuZ00QXudUosu5w5mJ+mRYlBZw6nrLOIZjgXbfMOsRtZFWVHWr011DO/ROXYQrG5xCG8wVJgE08R4njPlwb9EiYJD9CATttX3ryejhzYEloLg+ucbfcvs85hyyuCryIB7bIyCPim4ys6/GaTr2O2jAUXsE3Vvdiybg0UAuV0t94OQvtyHAs+yvIawt4LV7WBPYFkNuZ1ahG23hZb2IcU2YX9XvAQc2NOMEDJy76WBoXHlFa4LUaRFeVkv71xvRnWBlE2zSTiA/G+1qqkD7SN6I/MV4fMxF2mpbsfoGODhqrrmpvLNQoqxgWS1kvA4g94zLFXU+8I2Oy/kRIi9rGIDESHpuImdjXfYdpRfLyLRcDhxK2BIawerDJJ4iTFRHOSXWRlEiLdWDm2WFpRQWKkJ/lMu16n78hJfc1Ga/s/70yJi2GOcQN/nvETjrNG82gyxohNAOoMMkZP2AeC0mrPRi3dEqzc4ZUq4lcPAS/WjpQC9qNDxhQJXHmreSHG+qdEJaSQLlzFEwtVPYTFh8C/l/goVI3/moRlG3Cv+FQjAulVx/xck680PHN/GQ== flunder@blink"
];
};
};
security.sudo = {
extraRules = [
{
users = [ "nixos" ];
commands = [
{
command = "${pkgs.nixos-rebuild}/bin/nixos-rebuild -j auto switch";
options = [ "NOPASSWD" ];
}
{
command = "/run/current-system/sw/bin/nixos-rebuild";
options = [ "NOPASSWD" ];
}
{
command = "ALL";
options = [ "SETENV" ];
}
];
}
];
};
}

View File

@ -1,10 +1,10 @@
{ custom, hostname, inputs, pkgs, ... }:
{ custom, hostname }: { pkgs, ... }:
{
imports = [
(import "${inputs.self}/systems/proxmox-vm" {
(import "${custom.inputs.self}/systems/proxmox-vm" {
ip = "10.7.89.30";
inherit hostname inputs;
inherit custom hostname;
})
"${inputs.self}/modules/restic-server"
(import "${custom.inputs.self}/modules/restic-server" { inherit custom; })
];
}

View File

@ -1,18 +1,18 @@
{ hostname, inputs, ... }:
{ custom, hostname }: { ... }:
{
imports = [
inputs.nixos-hardware.nixosModules.common-gpu-intel
inputs.nixos-hardware.nixosModules.common-pc-laptop
inputs.nixos-hardware.nixosModules.common-pc-laptop-ssd
"${inputs.self}/hardware/bluetooth"
"${inputs.self}/modules/desktop"
"${inputs.self}/modules/docker"
"${inputs.self}/modules/droidcam"
"${inputs.self}/modules/espanso"
"${inputs.self}/modules/lockscreen"
"${inputs.self}/modules/restic"
"${inputs.self}/modules/tlp"
"${inputs.self}/modules/tmux"
custom.inputs.nixos-hardware.nixosModules.common-gpu-intel
custom.inputs.nixos-hardware.nixosModules.common-pc-laptop
custom.inputs.nixos-hardware.nixosModules.common-pc-laptop-ssd
"${custom.inputs.self}/hardware/bluetooth"
(import "${custom.inputs.self}/modules/desktop" { inherit custom; })
(import "${custom.inputs.self}/modules/docker" { inherit custom; })
(import "${custom.inputs.self}/modules/droidcam" { inherit custom; })
(import "${custom.inputs.self}/modules/espanso" { inherit custom; })
"${custom.inputs.self}/modules/lockscreen"
(import "${custom.inputs.self}/modules/restic" { inherit custom; })
"${custom.inputs.self}/modules/tlp"
"${custom.inputs.self}/modules/tmux"
];
boot.initrd.availableKernelModules = [
"aesni_intel"

View File

@ -1,17 +1,22 @@
{ custom, hostname, inputs, pkgs, ... }:
{ custom, hostname }: { pkgs, ... }:
let
domain = "ttrss.2li.ch";
in
{
imports = [
(import "${inputs.self}/systems/proxmox-vm" {
(import "${custom.inputs.self}/systems/proxmox-vm" {
ip = "10.7.89.115";
inherit hostname inputs;
inherit custom hostname;
})
(import "${inputs.self}/modules/nginx-proxy" {
domain = "ttrss.2li.ch"; inherit inputs;
(import "${custom.inputs.self}/modules/nginx-proxy" { inherit custom domain; })
(import "${custom.inputs.self}/modules/restic-server-mysql-client" {
path = "/var/lib/ttrss";
tag = "ttrss";
time = "23:00";
inherit custom;
})
(import "${inputs.self}/modules/restic-server-mysql-client" {
time = "23:00"; inherit custom hostname inputs pkgs;
})
"${inputs.self}/modules/docker"
"${inputs.self}/modules/mariadb"
(import "${custom.inputs.self}/modules/ttrss" { inherit custom domain; })
(import "${custom.inputs.self}/modules/docker" { inherit custom; })
"${custom.inputs.self}/modules/mariadb"
];
}