move hosts to separate flakes
This commit is contained in:
parent
20c827e8f2
commit
664e542de6
|
@ -1,10 +0,0 @@
|
|||
{
|
||||
pkgs,
|
||||
config,
|
||||
...
|
||||
}: {
|
||||
security.acme = {
|
||||
acceptTerms = true;
|
||||
defaults.email = "hensoko@gssws.de";
|
||||
};
|
||||
}
|
|
@ -1,114 +0,0 @@
|
|||
{
|
||||
pkgs,
|
||||
config,
|
||||
flake,
|
||||
...
|
||||
}: let
|
||||
containerStateDir = "/var/lib/authelia-gssws";
|
||||
hostStateDir = "/opt/authelia";
|
||||
domain = "auth.gssws.de";
|
||||
redirectDomain = "home.gssws.de";
|
||||
servicePort = 9091;
|
||||
in {
|
||||
age.secrets.authelia_users = {
|
||||
file = "${flake.self}/secrets/chonk_authelia_users.age";
|
||||
owner = "999";
|
||||
group = "999";
|
||||
};
|
||||
|
||||
age.secrets.authelia_storage_encryption_key = {
|
||||
file = "${flake.self}/secrets/chonk_authelia_storage_encryption_key.age";
|
||||
owner = "999";
|
||||
group = "999";
|
||||
};
|
||||
|
||||
age.secrets.authelia_jwt_secret = {
|
||||
file = "${flake.self}/secrets/chonk_authelia_jwt_secret.age";
|
||||
owner = "999";
|
||||
group = "999";
|
||||
};
|
||||
|
||||
services.nginx.virtualHosts."${domain}" = {
|
||||
forceSSL = true;
|
||||
enableACME = true;
|
||||
locations."/" = {
|
||||
proxyPass = "http://127.0.0.1:${toString servicePort}";
|
||||
};
|
||||
};
|
||||
|
||||
containers."authelia" = {
|
||||
autoStart = true;
|
||||
ephemeral = true;
|
||||
bindMounts = {
|
||||
"${containerStateDir}" = {
|
||||
hostPath = hostStateDir;
|
||||
isReadOnly = false;
|
||||
};
|
||||
|
||||
"/run/agenix" = {
|
||||
hostPath = "/run/agenix";
|
||||
isReadOnly = false;
|
||||
};
|
||||
|
||||
"/run/agenix.d" = {
|
||||
hostPath = "/run/agenix.d";
|
||||
isReadOnly = false;
|
||||
};
|
||||
};
|
||||
|
||||
config = {
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
networking.firewall.enable = false;
|
||||
|
||||
services.authelia.instances."gssws" = {
|
||||
enable = true;
|
||||
|
||||
secrets = {
|
||||
jwtSecretFile = "/run/agenix/authelia_jwt_secret";
|
||||
storageEncryptionKeyFile = "/run/agenix/authelia_storage_encryption_key";
|
||||
};
|
||||
|
||||
settings = {
|
||||
theme = "dark";
|
||||
server.port = servicePort;
|
||||
|
||||
session.domain = domain;
|
||||
default_redirection_url = "https://${redirectDomain}/";
|
||||
|
||||
access_control.default_policy = "two_factor";
|
||||
|
||||
authentication_backend = {
|
||||
password_reset.disable = true;
|
||||
file = {
|
||||
path = "/run/agenix/authelia_users";
|
||||
};
|
||||
};
|
||||
|
||||
storage.local.path = "/var/lib/authelia-gssws/db.sqlite3";
|
||||
|
||||
totp = {
|
||||
issuer = "auth.gssws.de";
|
||||
algorithm = "SHA512";
|
||||
digits = 8;
|
||||
};
|
||||
|
||||
webauthn = {
|
||||
display_name = "auth.gssws.de";
|
||||
};
|
||||
|
||||
notifier.smtp = {
|
||||
host = "mail.gssws.de";
|
||||
port = 25;
|
||||
sender = "Authelia <authelia@gssws.de>";
|
||||
identifier = "auth.gssws.de";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
system.stateVersion = "23.05";
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,37 +0,0 @@
|
|||
{
|
||||
config,
|
||||
lib,
|
||||
flake,
|
||||
...
|
||||
}: {
|
||||
age.secrets.restic_repository_password.file = "${flake.self}/secrets/chonk_restic_repository_password.age";
|
||||
age.secrets.restic_nextcloud_password.file = "${flake.self}/secrets/chonk_restic_nextcloud_password.age";
|
||||
|
||||
programs.ssh.extraConfig = ''
|
||||
Host backup
|
||||
HostName 10.0.1.12
|
||||
Port 32222
|
||||
User backup
|
||||
IdentityFile /run/agenix/restic_ssh_private_key
|
||||
'';
|
||||
|
||||
services.postgresqlBackup = {
|
||||
enable = true;
|
||||
backupAll = true;
|
||||
compression = "zstd";
|
||||
};
|
||||
|
||||
services.restic.backups = {
|
||||
cox = {
|
||||
passwordFile = "/run/agenix/restic_repository_password";
|
||||
paths = [
|
||||
"/mnt/internal/nextcloud"
|
||||
"/var/backup/postgresql"
|
||||
];
|
||||
repositoryFile = "/run/agenix/restic_nextcloud_password";
|
||||
timerConfig = {
|
||||
OnCalendar = "02:00";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,33 +0,0 @@
|
|||
{
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
flake,
|
||||
...
|
||||
}: let
|
||||
psCfg = config.pub-solar;
|
||||
in {
|
||||
age.secrets.nix-builder-private-key = {
|
||||
owner = "builder";
|
||||
group = "builder";
|
||||
file = "${flake.self}/secrets/chonk_nix_builder_private_key.age";
|
||||
};
|
||||
|
||||
nix = {
|
||||
gc.automatic = lib.mkForce false;
|
||||
settings.trusted-users = ["builder"];
|
||||
};
|
||||
|
||||
boot.binfmt.emulatedSystems = ["aarch64-linux"];
|
||||
|
||||
users.groups."builder" = {};
|
||||
|
||||
users.users."builder" = {
|
||||
isNormalUser = true;
|
||||
group = "builder";
|
||||
shell = pkgs.bashInteractive;
|
||||
openssh.authorizedKeys.keys = ["ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN8hTdDTA+LVlHkOm5IBjT32PvAdCxYfUfFFRx+JGeS6 root@norman"];
|
||||
};
|
||||
|
||||
nix.settings.secret-key-files = "/run/agenix/nix-builder-private-key";
|
||||
}
|
|
@ -1,27 +0,0 @@
|
|||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
boot.loader.systemd-boot.enable = lib.mkForce false;
|
||||
|
||||
#pub-solar.concourse-server.enable = true;
|
||||
|
||||
time.timeZone = "Europe/Berlin";
|
||||
|
||||
services.openssh.ports = [2222];
|
||||
|
||||
networking.nat.enable = true;
|
||||
networking.nat.internalIPs = ["10.10.42.0/24" "10.0.1.1"];
|
||||
networking.nat.externalInterface = "br0";
|
||||
|
||||
networking.firewall.enable = lib.mkForce true;
|
||||
networking.firewall.allowedTCPPorts = [80 443 2222];
|
||||
networking.firewall.allowedUDPPorts = [51899];
|
||||
|
||||
pub-solar.server.enable = true;
|
||||
hardware.ksm.enable = true;
|
||||
|
||||
system.stateVersion = "21.05"; # Did you read the comment?
|
||||
}
|
|
@ -1,25 +0,0 @@
|
|||
{ ... }: {
|
||||
imports = [
|
||||
./configuration.nix
|
||||
./hardware-configuration.nix
|
||||
|
||||
./acme.nix
|
||||
./backup.nix
|
||||
./drone.nix
|
||||
./home-assistant.nix
|
||||
./nextcloud.nix
|
||||
./wireguard.nix
|
||||
./builder.nix
|
||||
./invidious.nix
|
||||
./factorio.nix
|
||||
|
||||
./invoiceplane.nix
|
||||
#./tang.nix
|
||||
#./whiteboard.nix
|
||||
|
||||
./libvirt-container.nix
|
||||
./monitoring.nix
|
||||
|
||||
./authelia.nix
|
||||
];
|
||||
}
|
|
@ -1,24 +0,0 @@
|
|||
{
|
||||
config,
|
||||
pkgs,
|
||||
flake,
|
||||
...
|
||||
}: {
|
||||
age.secrets.drone_exec_runner_config = {
|
||||
file = "${flake.self}/secrets/chonk_drone_exec_runner_config.age";
|
||||
owner = "999";
|
||||
};
|
||||
|
||||
pub-solar.docker-ci-runner = {
|
||||
enable = true;
|
||||
enableKvm = true;
|
||||
nixCacheLocation = "/srv/drone-nix-cache/nix";
|
||||
|
||||
runnerEnvironment = {
|
||||
DRONE_RUNNER_CAPACITY = "10";
|
||||
DRONE_RUNNER_LABELS = "hosttype:baremetal";
|
||||
};
|
||||
|
||||
runnerVarsFile = "/run/agenix/drone_exec_runner_config";
|
||||
};
|
||||
}
|
|
@ -1,180 +0,0 @@
|
|||
{
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
with pkgs; let
|
||||
modDrv = pkgs.factorio-utils.modDrv {
|
||||
allRecommendedMods = true;
|
||||
allOptionalMods = false;
|
||||
};
|
||||
|
||||
# Krastorio
|
||||
flib = modDrv {
|
||||
src = fetchurl {
|
||||
urls = [
|
||||
"https://cloud.pub.solar/s/EsrBq2XpR9bTp7b/download/flib_0.12.6.zip"
|
||||
];
|
||||
sha256 = "Wf/w3Bh4jT5DDEp6GCVdg181DxEjiWe1iN3h5X7/oAw=";
|
||||
};
|
||||
};
|
||||
|
||||
krastorio2Assets = modDrv {
|
||||
src = fetchurl {
|
||||
urls = [
|
||||
"https://cloud.pub.solar/s/czsmnaiis25TX8m/download/Krastorio2Assets_1.2.1.zip"
|
||||
];
|
||||
sha256 = "1Y8I40I8EQLdLuiWDr+aty8p7PNh1pY6IPkRVz2pi5E=";
|
||||
};
|
||||
};
|
||||
|
||||
krastorio2 = modDrv {
|
||||
src = fetchurl {
|
||||
urls = [
|
||||
"https://cloud.pub.solar/s/DepN4zWWjiEJpZt/download/Krastorio2_1.3.18.zip"
|
||||
];
|
||||
sha256 = "wuMVVW7SbDdBxcUmJLT9MzpC9W1RRJaTs2cYylt6ilU=";
|
||||
};
|
||||
|
||||
deps = [flib krastorio2Assets];
|
||||
};
|
||||
|
||||
# Alien Biomes
|
||||
alienBiomes = modDrv {
|
||||
src = fetchurl {
|
||||
urls = [
|
||||
"https://cloud.pub.solar/s/FH22nM54PfcTios/download/alien-biomes_0.6.8.zip"
|
||||
];
|
||||
sha256 = "oy7VeSIxJmTNmpu/0tGqhbrfPFoJRQc5eS6eI/Epp1A=";
|
||||
};
|
||||
};
|
||||
|
||||
# Auto Deconstruct
|
||||
autoDeconstruct = modDrv {
|
||||
src = fetchurl {
|
||||
urls = [
|
||||
"https://cloud.pub.solar/s/fSLQCfRGFKTbQSw/download/AutoDeconstruct_0.3.7.zip"
|
||||
];
|
||||
sha256 = "VYgLhfWSaWtbY8l+c+9v498IPA/Q7XdRveEsw/pxuJw=";
|
||||
};
|
||||
};
|
||||
|
||||
# Cargo Ships
|
||||
cargoShips = modDrv {
|
||||
src = fetchurl {
|
||||
urls = [
|
||||
"https://cloud.pub.solar/s/tcYXBymFT8idCdb/download/cargo-ships_0.1.22.zip"
|
||||
];
|
||||
sha256 = "pfP97myiibmp00o75Yo9rVYS6cYKgflGiRNsP+FTjFU=";
|
||||
};
|
||||
};
|
||||
|
||||
# Electrical Trains
|
||||
electricalTrains = modDrv {
|
||||
src = fetchurl {
|
||||
urls = [
|
||||
"https://cloud.pub.solar/s/oHXWpoi7kD52Dzt/download/Realistic_Electric_Trains_Krastorio_2_1.0.0.zip"
|
||||
];
|
||||
sha256 = "ujO5qRHzKgxX/vsYYvoBjh1UKukGD31FvjLQZzCqxlk=";
|
||||
};
|
||||
};
|
||||
|
||||
# far reach
|
||||
farReach = modDrv {
|
||||
src = fetchurl {
|
||||
urls = [
|
||||
"https://cloud.pub.solar/s/KAqfr826ccHHRpG/download/far-reach_1.1.2.zip"
|
||||
];
|
||||
sha256 = "y1XuduS9WKMtGKLj7hQgh7wOy8l3l5WWlLTm6BJ1yxA=";
|
||||
};
|
||||
};
|
||||
|
||||
# Fluid Must Flow
|
||||
fluidMustFlow = modDrv {
|
||||
src = fetchurl {
|
||||
urls = [
|
||||
"https://cloud.pub.solar/s/J2XA4jPNNWxSSti/download/FluidMustFlow_1.3.1.zip"
|
||||
];
|
||||
sha256 = "X2dGJCFL1dRRP7BFhFKI7mgtFd4zjHYWO8ehII6aaDc=";
|
||||
};
|
||||
};
|
||||
|
||||
# Recipe Book
|
||||
recipeBook = modDrv {
|
||||
src = fetchurl {
|
||||
urls = [
|
||||
"https://cloud.pub.solar/s/oRQYJ4H7xkc3rtq/download/RecipeBook_3.5.2.zip"
|
||||
];
|
||||
sha256 = "dPj9FH0r4dXtdrXyAkVIwXveECCBzcVGlJmQsF0oSpE=";
|
||||
};
|
||||
};
|
||||
|
||||
# Regenerate Terrain
|
||||
regenerateTerrain = modDrv {
|
||||
src = fetchurl {
|
||||
urls = [
|
||||
"https://cloud.pub.solar/s/YWTEB6rQeptmxGL/download/regenerate-terrain_0.3.1.zip"
|
||||
];
|
||||
sha256 = "EIZQeTzHAvSEFAOh6pN0Xd5GbqV9O/wI2QA5YtR8GxU=";
|
||||
};
|
||||
};
|
||||
|
||||
# Space Exploration
|
||||
spaceExploration = modDrv {
|
||||
src = fetchurl {
|
||||
urls = [
|
||||
"https://cloud.pub.solar/s/yy79DMAQtqCcWYW/download/space-exploration_0.6.104.zip"
|
||||
];
|
||||
sha256 = "5vFD+6R4jqp2PH6ASa1JJ0+acXi+dBwyrM/xil8RyU0=";
|
||||
};
|
||||
};
|
||||
|
||||
# Todo List
|
||||
todoList = modDrv {
|
||||
src = fetchurl {
|
||||
urls = [
|
||||
"https://cloud.pub.solar/s/bJjpgSMamwex7pF/download/Todo-List_19.3.0.zip"
|
||||
];
|
||||
sha256 = "0QPp7W2OOrkpLs+fOvTxut+6rV0heZdfEA4sbvyb+rs=";
|
||||
};
|
||||
};
|
||||
|
||||
# Vehicle Snap
|
||||
vehicleSnap = modDrv {
|
||||
src = fetchurl {
|
||||
urls = [
|
||||
"https://cloud.pub.solar/s/ZgDTAgY4dxiwZ3d/download/VehicleSnap_1.18.5.zip"
|
||||
];
|
||||
sha256 = "VRo2feta/CZGXGHbOwLOWdXZUoiqwlLPne0dC3YPyDA=";
|
||||
};
|
||||
};
|
||||
in rec
|
||||
{
|
||||
nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
|
||||
"factorio-headless"
|
||||
];
|
||||
|
||||
services.factorio = {
|
||||
enable = true;
|
||||
package = pkgs.factorio-headless-experimental;
|
||||
openFirewall = true;
|
||||
game-name = "pub.solar Factorio";
|
||||
game-password = "pub.solar";
|
||||
admins = ["hensoko"];
|
||||
mods = [
|
||||
krastorio2
|
||||
alienBiomes
|
||||
autoDeconstruct
|
||||
cargoShips
|
||||
electricalTrains
|
||||
farReach
|
||||
fluidMustFlow
|
||||
recipeBook
|
||||
regenerateTerrain
|
||||
spaceExploration
|
||||
todoList
|
||||
vehicleSnap
|
||||
];
|
||||
};
|
||||
}
|
|
@ -1,40 +0,0 @@
|
|||
{ pkgs, config, lib, self, ... }:
|
||||
|
||||
{
|
||||
age.secrets.garage_rpc_token = {
|
||||
file = "${self}/secrets/chonk_garage_rpc_secret.age";
|
||||
owner = "garage";
|
||||
group = "garage";
|
||||
};
|
||||
|
||||
networking.firewall.interfaces.wg0.allowedTCPPorts = [ 3900 3901 ];
|
||||
|
||||
users.groups.garage = {};
|
||||
users.users.garage = {
|
||||
group = "garage";
|
||||
isSystemUser = true;
|
||||
};
|
||||
|
||||
# overwrite dynamicuser
|
||||
systemd.services.garage.serviceConfig = {
|
||||
User = "garage";
|
||||
Group = "garage";
|
||||
DynamicUser = false;
|
||||
StateDirectory = lib.mkForce null;
|
||||
};
|
||||
|
||||
services.garage = {
|
||||
enable = true;
|
||||
package = pkgs.garage_0_8;
|
||||
settings = {
|
||||
replication_mode = "1";
|
||||
rpc_bind_addr = "[::]:3901";
|
||||
rpc_secret_file = config.age.secrets.garage_rpc_token.path;
|
||||
s3_api = {
|
||||
api_bind_addr = "[::]:3900";
|
||||
s3_region = "garage";
|
||||
root_domain = ".s3.gssws.de";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,119 +0,0 @@
|
|||
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||
# and may be overwritten by future invocations. Please make changes
|
||||
# to /etc/nixos/configuration.nix instead.
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
boot.initrd.availableKernelModules = ["ehci_pci" "ahci" "nvme" "usbhid" "usb_storage" "sd_mod"];
|
||||
boot.kernelModules = ["kvm-intel"];
|
||||
boot.extraModulePackages = [];
|
||||
boot.extraModprobeConfig = "options kvm_intel nested=1";
|
||||
|
||||
boot.kernelPackages = pkgs.linuxPackages_6_1;
|
||||
boot.kernelParams = [ "ip=80.244.242.2::80.244.242.1:255.255.255.248:chonk::off" ];
|
||||
|
||||
boot.loader.grub = {
|
||||
enable = true;
|
||||
device = "/dev/disk/by-id/usb-SanDisk_Cruzer_Blade_03025429121421051300-0:0";
|
||||
};
|
||||
|
||||
boot.supportedFilesystems = [ "zfs" ];
|
||||
|
||||
boot.initrd = {
|
||||
systemd.enable = true;
|
||||
|
||||
luks = {
|
||||
forceLuksSupportInInitrd = true;
|
||||
devices."cryptroot" = {
|
||||
device = "/dev/disk/by-uuid/9e13c8ea-96d3-45b1-85f4-d1a61233da6f";
|
||||
};
|
||||
};
|
||||
|
||||
network = {
|
||||
enable = true;
|
||||
ssh = {
|
||||
enable = true;
|
||||
port = 2234;
|
||||
authorizedKeys = ["ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAqkqMYgncrnczcW/0PY+Z+FmNXXpgw6D9JWTTwiainy hensoko@hensoko-tp-work"];
|
||||
hostKeys = [/etc/secrets/initrd/ssh_host_ed25519_key];
|
||||
};
|
||||
postCommands = ''
|
||||
echo 'cryptsetup-askpass' >> /root/.profile
|
||||
'';
|
||||
};
|
||||
services.swraid = {
|
||||
enable = true;
|
||||
mdadmConf = ''
|
||||
ARRAY /dev/md/debian:0 metadata=1.2 name=debian:0 UUID=1156202f:835af09b:2e05e02a:a1869d1c
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
fileSystems = {
|
||||
"/" = {
|
||||
device = "/dev/disk/by-label/root";
|
||||
fsType = "ext4";
|
||||
};
|
||||
|
||||
"/boot" = {
|
||||
device = "/dev/disk/by-label/boot";
|
||||
fsType = "ext4";
|
||||
};
|
||||
|
||||
"/mnt/internal" = {
|
||||
device = "/dev/disk/by-uuid/3563f624-f8ed-4664-95d0-ca8b9db1c60a";
|
||||
fsType = "ext4";
|
||||
};
|
||||
};
|
||||
|
||||
swapDevices = [
|
||||
{device = "/dev/disk/by-label/swap";}
|
||||
];
|
||||
|
||||
networking.bonds."bond0" = {
|
||||
interfaces = ["eno1" "eno2"];
|
||||
driverOptions = {
|
||||
miimon = "100";
|
||||
mode = "balance-xor";
|
||||
xmit_hash_policy = "layer3+4";
|
||||
};
|
||||
};
|
||||
|
||||
networking = {
|
||||
hostId = "c418ba82";
|
||||
defaultGateway = {
|
||||
address = "80.244.242.1";
|
||||
interface = "br0";
|
||||
};
|
||||
|
||||
defaultGateway6 = {
|
||||
address = "2001:4d88:1ffa:26::1";
|
||||
interface = "br0";
|
||||
};
|
||||
|
||||
nameservers = ["95.129.51.51" "80.244.244.244"];
|
||||
|
||||
bridges."br0".interfaces = ["bond0"];
|
||||
|
||||
interfaces."br0" = {
|
||||
ipv4.addresses = [
|
||||
{
|
||||
address = "80.244.242.2";
|
||||
prefixLength = 29;
|
||||
}
|
||||
];
|
||||
ipv6.addresses = [
|
||||
{
|
||||
address = "2001:4d88:1ffa:26::2";
|
||||
prefixLength = 64;
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||
}
|
|
@ -1,25 +0,0 @@
|
|||
{
|
||||
pkgs,
|
||||
config,
|
||||
...
|
||||
}: {
|
||||
# HTTP
|
||||
services.nginx.virtualHosts = let
|
||||
makeVirtualHost = target: {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
locations."/" = {
|
||||
proxyPass = target;
|
||||
proxyWebsockets = true;
|
||||
extraConfig = ''
|
||||
proxy_ssl_server_name on;
|
||||
proxy_pass_header Authorization;
|
||||
'';
|
||||
};
|
||||
};
|
||||
in {
|
||||
"ha.gssws.de" = makeVirtualHost "http://10.0.1.11:8123";
|
||||
"ha2.gssws.de" = makeVirtualHost "http://10.0.1.11:8123";
|
||||
"ha.karinsokolowski.de" = makeVirtualHost "http://10.0.1.13:8123";
|
||||
};
|
||||
}
|
|
@ -1,23 +0,0 @@
|
|||
{
|
||||
flake,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
domain = "yt.gssws.de";
|
||||
in {
|
||||
age.secrets.invidious_db_password.file = "${flake.self}/secrets/chonk_invidious_db_password.age";
|
||||
|
||||
services.invidious = {
|
||||
inherit domain;
|
||||
enable = true;
|
||||
nginx.enable = true;
|
||||
database = {
|
||||
createLocally = true;
|
||||
passwordFile = "/run/agenix/invidious_db_password";
|
||||
};
|
||||
settings = {
|
||||
https_only = true;
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,62 +0,0 @@
|
|||
{
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
hostAddress = "10.10.42.1";
|
||||
serviceAddress = "10.10.42.11";
|
||||
|
||||
domain = "inv.gssws.de";
|
||||
hostStateDir = "/mnt/internal/invoiceplane";
|
||||
containerStateDir = "/var/lib/invoiceplane";
|
||||
in {
|
||||
# nginx
|
||||
services.nginx.virtualHosts."${domain}" = {
|
||||
forceSSL = true;
|
||||
enableACME = true;
|
||||
locations = {
|
||||
"/" = {
|
||||
proxyPass = "http://${serviceAddress}:80";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
# invoiceplane
|
||||
containers."invoiceplane" = {
|
||||
privateNetwork = true;
|
||||
hostAddress = "10.10.42.1";
|
||||
localAddress = serviceAddress;
|
||||
|
||||
bindMounts."${containerStateDir}" = {
|
||||
hostPath = hostStateDir;
|
||||
isReadOnly = false;
|
||||
};
|
||||
|
||||
config = {
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
networking.firewall.allowedTCPPorts = [80];
|
||||
|
||||
services.rsyslogd.enable = true;
|
||||
|
||||
services.phpfpm.pools."invoiceplane-${domain}".phpOptions = ''
|
||||
date.timezone = Europe/Berlin
|
||||
'';
|
||||
services.caddy.virtualHosts."http://${domain}".listenAddresses = ["0.0.0.0"];
|
||||
|
||||
services.invoiceplane.sites."${domain}" = {
|
||||
enable = true;
|
||||
stateDir = containerStateDir;
|
||||
|
||||
database = {
|
||||
user = "invoiceplane";
|
||||
name = "invoiceplane";
|
||||
};
|
||||
};
|
||||
|
||||
system.stateVersion = "22.11";
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,66 +0,0 @@
|
|||
{
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
networking.firewall.allowedTCPPorts = [4222];
|
||||
|
||||
containers."libvirt-container" = {
|
||||
autoStart = true;
|
||||
|
||||
bindMounts."/dev/kvm" = {
|
||||
hostPath = "/dev/kvm";
|
||||
isReadOnly = false;
|
||||
};
|
||||
|
||||
allowedDevices = [
|
||||
{
|
||||
node = "/dev/kvm";
|
||||
modifier = "rw";
|
||||
}
|
||||
{
|
||||
node = "/dev/net/tun";
|
||||
modifier = "rw";
|
||||
}
|
||||
{
|
||||
node = "/dev/vnet*";
|
||||
modifier = "rw";
|
||||
}
|
||||
];
|
||||
|
||||
forwardPorts = [
|
||||
{
|
||||
hostPort = 4222;
|
||||
}
|
||||
];
|
||||
|
||||
enableTun = true;
|
||||
|
||||
#extraFlags = [ "-U" ];
|
||||
|
||||
config = {
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
networking.firewall.enable = false;
|
||||
|
||||
virtualisation.libvirtd.enable = true;
|
||||
security.polkit.enable = true;
|
||||
|
||||
services.openssh = {
|
||||
enable = true;
|
||||
ports = [4222];
|
||||
};
|
||||
|
||||
users.users.root = {
|
||||
openssh.authorizedKeys.keys = [
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAqkqMYgncrnczcW/0PY+Z+FmNXXpgw6D9JWTTwiainy hensoko@hensoko-tp-work"
|
||||
"ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBFro/k4Mgqyh8yV/7Zwjc0dv60ZM7bROBU9JNd99P/4co6fxPt1pJiU/pEz2Dax/HODxgcO+jFZfvPEuLMCeAl0= YubiKey #10593996 PIV Slot 9a @teutat3s"
|
||||
];
|
||||
};
|
||||
|
||||
system.stateVersion = "22.11";
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,92 +0,0 @@
|
|||
{
|
||||
config,
|
||||
lib,
|
||||
flake,
|
||||
...
|
||||
}: {
|
||||
pub-solar.monitoring-server = {
|
||||
enable = true;
|
||||
listenAddress = "10.0.1.6";
|
||||
grafana.enable = true;
|
||||
node_exporter = {
|
||||
enable = true;
|
||||
hosts = [
|
||||
"10.0.1.11:9002"
|
||||
"10.0.1.12:9002"
|
||||
"10.0.1.13:9002"
|
||||
"10.0.1.254:9100"
|
||||
];
|
||||
};
|
||||
snmp = {
|
||||
enable = true;
|
||||
hosts = [
|
||||
"192.168.42.1"
|
||||
#"10.0.1.254:9116" = [
|
||||
# {
|
||||
# targets = [ "192.168.42.1" ];
|
||||
# auth = [ "public_v2" ];
|
||||
# modules = [ "if_mib" ];
|
||||
# }
|
||||
#];
|
||||
];
|
||||
};
|
||||
smokeping = {
|
||||
enable = true;
|
||||
hosts = [
|
||||
"mail.gssws.de"
|
||||
"cust.gssws.de"
|
||||
"data.gssws.de"
|
||||
"mail.hosting.de"
|
||||
"blog.fefe.de"
|
||||
|
||||
# hosting.de
|
||||
"ovh2.goekal.de"
|
||||
"83.151.16.16"
|
||||
"83.151.16.17"
|
||||
"83.151.16.51"
|
||||
"r2backup17.masterlogin.de"
|
||||
"demo.routing.net"
|
||||
"vsrv07344.customer.vlinux.de"
|
||||
"213.160.76.43"
|
||||
"185.11.139.27"
|
||||
"185.11.137.4"
|
||||
"83.151.30.176"
|
||||
"83.151.28.246"
|
||||
"83.151.21.204"
|
||||
"79.140.42.4"
|
||||
"31.15.67.23"
|
||||
"31.15.64.79"
|
||||
"80.244.244.244"
|
||||
"95.129.51.51"
|
||||
"185.11.137.122"
|
||||
"79.140.41.12"
|
||||
|
||||
# pub.solar
|
||||
"pub.solar"
|
||||
"git.pub.solar"
|
||||
"auth.pub.solar"
|
||||
"cloud.pub.solar"
|
||||
"collabora.pub.solar"
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
# wireguard exporter
|
||||
networking.firewall.allowedTCPPorts = [9585];
|
||||
services.prometheus = {
|
||||
exporters.wireguard = {
|
||||
enable = true;
|
||||
withRemoteIp = true;
|
||||
};
|
||||
scrapeConfigs = [
|
||||
{
|
||||
job_name = "chonk-wireguard";
|
||||
static_configs = [
|
||||
{
|
||||
targets = ["10.0.1.6:9586"];
|
||||
}
|
||||
];
|
||||
}
|
||||
];
|
||||
};
|
||||
}
|
|
@ -1,28 +0,0 @@
|
|||
{
|
||||
pkgs,
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}: {
|
||||
services.nextcloud.extraApps = with pkgs.nextcloud27Packages.apps; {
|
||||
inherit bookmarks
|
||||
calendar
|
||||
contacts
|
||||
files_markdown
|
||||
impersonate
|
||||
keeweb
|
||||
maps
|
||||
news
|
||||
notes
|
||||
notify_push
|
||||
tasks
|
||||
#twofactor_totp
|
||||
twofactor_webauthn
|
||||
user_saml;
|
||||
|
||||
"twofactor_totp" = pkgs.fetchzip {
|
||||
sha256 = "zAPNugbvngXcpgWJLD78YAg4G1QtGaphx1bhhg7mLKE=";
|
||||
url = "https://github.com/nextcloud-releases/twofactor_totp/releases/download/v6.4.1/twofactor_totp-v6.4.1.tar.gz";
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,39 +0,0 @@
|
|||
{...}: {
|
||||
# Collabora Code server
|
||||
virtualisation.oci-containers.containers."nextcloud-collabora-code" = {
|
||||
image = "collabora/code";
|
||||
autoStart = true;
|
||||
ports = ["127.0.0.1:9980:9980"];
|
||||
environment.domain = "data\\.gssws\\.de";
|
||||
extraOptions = ["--cap-add" "MKNOD"];
|
||||
};
|
||||
|
||||
services.nginx.virtualHosts."office.gssws.de" = let
|
||||
proxyPass = "https://127.0.0.1:9980";
|
||||
extraConfig = "proxy_ssl_verify off;";
|
||||
in {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
|
||||
locations."^~ /browser" = {
|
||||
inherit proxyPass extraConfig;
|
||||
};
|
||||
locations."^~ /hosting/discovery" = {
|
||||
inherit proxyPass extraConfig;
|
||||
};
|
||||
locations."^~ /hosting/capabilities" = {
|
||||
inherit proxyPass extraConfig;
|
||||
};
|
||||
locations."~ ^/cool/(.*)/ws''$" = {
|
||||
inherit proxyPass extraConfig;
|
||||
proxyWebsockets = true;
|
||||
};
|
||||
locations."~ ^/(c|l)ool" = {
|
||||
inherit proxyPass extraConfig;
|
||||
};
|
||||
locations."^~ /cool/adminws" = {
|
||||
inherit proxyPass extraConfig;
|
||||
proxyWebsockets = true;
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,124 +0,0 @@
|
|||
{
|
||||
flake,
|
||||
pkgs,
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}: let
|
||||
notifyPushPort = 7867;
|
||||
in {
|
||||
imports = [
|
||||
./nextcloud-apps.nix
|
||||
./nextcloud-collabora.nix
|
||||
];
|
||||
|
||||
age.secrets.nextcloud_db_pass = {
|
||||
owner = "nextcloud";
|
||||
group = "nextcloud";
|
||||
file = "${flake.self}/secrets/chonk_nextcloud_db_pass.age";
|
||||
};
|
||||
|
||||
age.secrets.nextcloud_admin_pass = {
|
||||
owner = "nextcloud";
|
||||
group = "nextcloud";
|
||||
file = "${flake.self}/secrets/chonk_nextcloud_admin_pass.age";
|
||||
};
|
||||
|
||||
# HTTP
|
||||
services.nginx = {
|
||||
enable = true;
|
||||
recommendedGzipSettings = true;
|
||||
recommendedOptimisation = true;
|
||||
recommendedProxySettings = true;
|
||||
recommendedTlsSettings = true;
|
||||
sslCiphers = "AES256+EECDH:AES256+EDH:!aNULL";
|
||||
virtualHosts."data.gssws.de" = {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
};
|
||||
};
|
||||
|
||||
# DATABASES
|
||||
services.postgresql = {
|
||||
enable = true;
|
||||
package = pkgs.postgresql_11;
|
||||
|
||||
settings = {
|
||||
max_connections = "200";
|
||||
};
|
||||
|
||||
ensureDatabases = ["nextcloud"];
|
||||
ensureUsers = [
|
||||
{
|
||||
name = "nextcloud";
|
||||
ensurePermissions."DATABASE nextcloud" = "ALL PRIVILEGES";
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
# NOTIFY PUSH
|
||||
services.nextcloud.notify_push.enable = true;
|
||||
|
||||
# REDIS
|
||||
services.redis.servers."nextcloud".enable = true;
|
||||
users.groups."redis-nextcloud".members = ["nextcloud"];
|
||||
|
||||
# NEXTCLOUD
|
||||
systemd.services."nextcloud-setup" = {
|
||||
requires = ["postgresql.service"];
|
||||
after = ["postgresql.service"];
|
||||
};
|
||||
|
||||
services.nextcloud = {
|
||||
enable = true;
|
||||
package = pkgs.nextcloud27;
|
||||
enableBrokenCiphersForSSE = false;
|
||||
hostName = "data.gssws.de";
|
||||
https = true;
|
||||
datadir = "/mnt/internal/nextcloud";
|
||||
|
||||
caching.apcu = true;
|
||||
caching.redis = true;
|
||||
|
||||
phpPackage = lib.mkForce pkgs.php82;
|
||||
|
||||
poolSettings = {
|
||||
"pm" = "dynamic";
|
||||
"pm.max_children" = "128";
|
||||
"pm.start_servers" = "64";
|
||||
"pm.min_spare_servers" = "32";
|
||||
"pm.max_spare_servers" = "76";
|
||||
"pm.max_requests" = "500";
|
||||
};
|
||||
|
||||
phpOptions = {
|
||||
short_open_tag = "Off";
|
||||
expose_php = "Off";
|
||||
error_reporting = "E_ALL & ~E_DEPRECATED & ~E_STRICT";
|
||||
display_errors = "stderr";
|
||||
"opcache.enable_cli" = "1";
|
||||
"opcache.interned_strings_buffer" = "32";
|
||||
"opcache.max_accelerated_files" = "100000";
|
||||
"opcache.memory_consumption" = "256";
|
||||
"opcache.revalidate_freq" = "1";
|
||||
"opcache.fast_shutdown" = "1";
|
||||
"openssl.cafile" = "/etc/ssl/certs/ca-certificates.crt";
|
||||
catch_workers_output = "yes";
|
||||
};
|
||||
|
||||
config = {
|
||||
overwriteProtocol = "https";
|
||||
|
||||
dbtype = "pgsql";
|
||||
dbuser = "nextcloud";
|
||||
dbhost = "127.0.0.1:5432";
|
||||
dbname = "nextcloud";
|
||||
dbpassFile = "/run/agenix/nextcloud_db_pass";
|
||||
adminpassFile = "/run/agenix/nextcloud_admin_pass";
|
||||
adminuser = "admin";
|
||||
|
||||
trustedProxies = ["80.244.242.2"];
|
||||
defaultPhoneRegion = "DE";
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,68 +0,0 @@
|
|||
{
|
||||
pkgs,
|
||||
config,
|
||||
...
|
||||
}: let
|
||||
containerStateDir = "/data";
|
||||
hostStateDir = "/opt/tangd";
|
||||
domain = "";
|
||||
serviceAddress = "10.10.42.12";
|
||||
in {
|
||||
services.nginx.virtualHosts."${domain}" = {
|
||||
forceSSL = true;
|
||||
enableACME = true;
|
||||
locations."/" = {
|
||||
proxyPass = "http://${serviceAddress}:${toString servicePort}";
|
||||
};
|
||||
};
|
||||
|
||||
containers."tang" = {
|
||||
autoStart = true;
|
||||
ephemeral = true;
|
||||
bindMounts."${containerStateDir}" = {
|
||||
hostPath = hostStateDir;
|
||||
isReadOnly = false;
|
||||
};
|
||||
|
||||
config = {
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
networking.firewall.enable = false;
|
||||
|
||||
users.groups."_tang" = {};
|
||||
|
||||
users.users."_tang" = {
|
||||
group = "_tang";
|
||||
isSystemUser = true;
|
||||
};
|
||||
|
||||
environment.systemPackages = ["${pkgs.jose}"];
|
||||
|
||||
systemd.services."tangd@" = {
|
||||
enable = true;
|
||||
serviceConfig = {
|
||||
ExecStartPre = "${pkgs.bash}/bin/bash -c \"mkdir -p ${containerStateDir}/tang-db\"";
|
||||
ExecStart = "${pkgs.tang}/libexec/tangd ${containerStateDir}/tang-db";
|
||||
StandardInput = "socket";
|
||||
StandardOutput = "socket";
|
||||
StandardError = "journal";
|
||||
User = "_tang";
|
||||
Group = "_tang";
|
||||
};
|
||||
};
|
||||
|
||||
systemd.sockets."tangd" = {
|
||||
enable = true;
|
||||
listenStreams = ["${toString servicePort}"];
|
||||
wantedBy = ["sockets.target"];
|
||||
socketConfig = {
|
||||
Accept = true;
|
||||
};
|
||||
};
|
||||
|
||||
system.stateVersion = "22.11";
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,24 +0,0 @@
|
|||
{
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
domain = "t.gssws.de";
|
||||
servicePort = 63080;
|
||||
in {
|
||||
services.nginx.virtualHosts."${domain}" = {
|
||||
forceSSL = true;
|
||||
enableACME = true;
|
||||
locations."/" = {
|
||||
proxyPass = "http://127.0.0.1:${builtins.toString servicePort}";
|
||||
};
|
||||
};
|
||||
|
||||
virtualisation.oci-containers.containers."tang" = {
|
||||
image = "cloggo/tangd";
|
||||
ports = ["127.0.0.1:${builtins.toString servicePort}:8080"];
|
||||
environment = {
|
||||
IP_WHITELIST = "172.17.0.1";
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,66 +0,0 @@
|
|||
{
|
||||
flake,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
age.secrets.home_controller_wireguard.file = "${flake.self}/secrets/chonk_wireguard_key.age";
|
||||
|
||||
systemd.services.wireguard-wg0.serviceConfig.Restart = "on-failure";
|
||||
systemd.services.wireguard-wg0.serviceConfig.RestartSec = "5s";
|
||||
|
||||
# Enable WireGuard
|
||||
networking.wireguard.interfaces = {
|
||||
wg0 = {
|
||||
ips = ["10.0.1.6"];
|
||||
listenPort = 51899;
|
||||
|
||||
privateKeyFile = "/run/agenix/home_controller_wireguard";
|
||||
|
||||
peers = [
|
||||
{
|
||||
# router
|
||||
publicKey = "xqifcPfCgLNQ1M3w6zfoWVMkkz2lO5GZ/LlOECnPQFc=";
|
||||
allowedIPs = ["10.0.1.1/32"];
|
||||
|
||||
persistentKeepalive = 25;
|
||||
}
|
||||
{
|
||||
# giggles
|
||||
publicKey = "i5kiTSPGR2jrdHl+s/S6D0YWb+xkbPudczG2RWmWwCg=";
|
||||
allowedIPs = ["10.0.1.11/32"];
|
||||
|
||||
persistentKeepalive = 25;
|
||||
}
|
||||
{
|
||||
# cox
|
||||
publicKey = "VogQYYYNdXLhPKY9/P2WAn6gfEX9ojN3VD+DKx4gl0k=";
|
||||
allowedIPs = ["10.0.1.12/32"];
|
||||
|
||||
persistentKeepalive = 25;
|
||||
}
|
||||
{
|
||||
# companion
|
||||
publicKey = "7EUcSUckw/eLiWFHD+AzfcoKWstjr+cL70SupOJ6zC0=";
|
||||
allowedIPs = ["10.0.1.13/32"];
|
||||
|
||||
persistentKeepalive = 25;
|
||||
}
|
||||
{
|
||||
# norman
|
||||
publicKey = "FRNg+bJWPn4vAA2Fw8PXYsTpxdEKdVE+b7eTtl8ORxM=";
|
||||
allowedIPs = ["10.0.1.121/32"];
|
||||
|
||||
persistentKeepalive = 25;
|
||||
}
|
||||
{
|
||||
# hsha
|
||||
publicKey = "sC0wWHE/tvNaVYX3QQTHQUmSTTjZMOjkQ5x/qy6qjTc=";
|
||||
allowedIPs = ["10.0.1.254/32"];
|
||||
|
||||
persistentKeepalive = 25;
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,44 +0,0 @@
|
|||
# Edit this configuration file to define what should be installed on
|
||||
# your system. Help is available in the configuration.nix(5) man page
|
||||
# and in the NixOS manual (accessible by running ‘nixos-help’).
|
||||
{
|
||||
flake,
|
||||
pkgs,
|
||||
builtins,
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}: {
|
||||
imports = [
|
||||
./home-controller.nix
|
||||
./home-assistant.nix
|
||||
];
|
||||
|
||||
pub-solar.server.enable = true;
|
||||
hardware.ksm.enable = true;
|
||||
boot.loader.timeout = lib.mkForce 0;
|
||||
|
||||
boot.loader.generic-extlinux-compatible.enable = lib.mkForce false;
|
||||
|
||||
boot.loader.grub = {
|
||||
enable = lib.mkForce true;
|
||||
efiSupport = true;
|
||||
efiInstallAsRemovable = true;
|
||||
device = "nodev";
|
||||
|
||||
extraInstallCommands = ''
|
||||
cp -r ${flake.inputs.nixpkgs-hensoko.packages.aarch64-linux.raspberrypi4_firmware_uefi}/share/raspberrypi4-firmware-uefi/* /boot/
|
||||
'';
|
||||
};
|
||||
|
||||
# Set your time zone.
|
||||
time.timeZone = "Europe/Berlin";
|
||||
|
||||
networking.useDHCP = false;
|
||||
networking.interfaces.enabcm6e4ei0.useDHCP = true;
|
||||
networking.networkmanager.enable = lib.mkForce false;
|
||||
|
||||
boot.loader.systemd-boot.enable = lib.mkForce false;
|
||||
|
||||
system.stateVersion = "22.11"; # Did you read the comment?
|
||||
}
|
|
@ -1,6 +0,0 @@
|
|||
{ ... }: {
|
||||
imports = [
|
||||
./configuration.nix
|
||||
./hardware-configuration.nix
|
||||
];
|
||||
}
|
|
@ -1,61 +0,0 @@
|
|||
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||
# and may be overwritten by future invocations. Please make changes
|
||||
# to /etc/nixos/configuration.nix instead.
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
modulesPath,
|
||||
...
|
||||
}: {
|
||||
boot.initrd.availableKernelModules = ["xhci_pci" "usbhid" "usb_storage" "uas"];
|
||||
|
||||
#boot.kernelParams = [ "usb-storage.quirks=2109:0716:u,174c:55aa:u" ];
|
||||
|
||||
boot.kernelPackages = pkgs.linuxPackages_latest;
|
||||
|
||||
boot.loader.grub = {
|
||||
enable = true;
|
||||
efiSupport = true;
|
||||
efiInstallAsRemovable = true;
|
||||
device = "nodev";
|
||||
};
|
||||
|
||||
boot.loader.efi.canTouchEfiVariables = false;
|
||||
|
||||
boot.loader.systemd-boot.enable = false;
|
||||
boot.loader.generic-extlinux-compatible.enable = false;
|
||||
boot.loader.timeout = 0;
|
||||
|
||||
boot.initrd.luks.devices."cryptroot" = {
|
||||
device = "/dev/disk/by-uuid/2538df0f-9d17-4651-a7ee-26d6f28e4e71";
|
||||
keyFile = "/dev/disk/by-id/usb-SanDisk_Cruzer_Blade_04017028021722045451-0:0-part1";
|
||||
fallbackToPassword = true;
|
||||
bypassWorkqueues = true;
|
||||
};
|
||||
|
||||
fileSystems."/" = {
|
||||
device = "/dev/disk/by-label/root";
|
||||
fsType = "ext4";
|
||||
};
|
||||
|
||||
fileSystems."/boot" = {
|
||||
device = "/dev/disk/by-uuid/5552-1B21";
|
||||
fsType = "vfat";
|
||||
};
|
||||
|
||||
swapDevices = [
|
||||
{device = "/dev/disk/by-label/swap";}
|
||||
];
|
||||
|
||||
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
||||
# (the default) this is the recommended approach. When using systemd-networkd it's
|
||||
# still possible to use this option, but it's recommended to use it in conjunction
|
||||
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
|
||||
networking.useDHCP = lib.mkDefault true;
|
||||
# networking.interfaces.eth0.useDHCP = lib.mkDefault true;
|
||||
# networking.interfaces.wlan0.useDHCP = lib.mkDefault true;
|
||||
|
||||
nixpkgs.hostPlatform = lib.mkDefault "aarch64-linux";
|
||||
powerManagement.cpuFreqGovernor = lib.mkDefault "ondemand";
|
||||
}
|
|
@ -1,96 +0,0 @@
|
|||
{
|
||||
flake,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
pub-solar.home-assistant = {
|
||||
enable = true;
|
||||
|
||||
extraComponents = ["androidtv" "brother" "ffmpeg" "fritz" "fritzbox" "fritzbox_callmonitor" "met" "mqtt" "zeroconf"];
|
||||
extraPackages = python3Packages:
|
||||
with python3Packages; [
|
||||
# androidtv
|
||||
adb-shell
|
||||
aiofiles
|
||||
androidtv
|
||||
|
||||
# deutsche bahn
|
||||
schiene
|
||||
|
||||
# dwd
|
||||
markdownify
|
||||
|
||||
# hacs
|
||||
aiogithubapi
|
||||
|
||||
# totop
|
||||
pyotp
|
||||
];
|
||||
|
||||
mqtt = {
|
||||
enable = true;
|
||||
users = {
|
||||
ha = {
|
||||
acl = [
|
||||
"readwrite #"
|
||||
];
|
||||
hashedPassword = "$7$101$jLA9PReG5btNSvw8$O0c3UzCfcBcvqVH8kMZIwEims7p1L4o/DmOTHO9w9731ggC5SyUpJGQIDiUbv+IrTl/H0+Fz9QF/jvY0QCuxuA==";
|
||||
};
|
||||
nono = {
|
||||
acl = [
|
||||
"readwrite #"
|
||||
];
|
||||
hashedPassword = "$7$101$votbflBI1KrRRzBy$hCC/qo7Ggaf2vaLv7lo5uPnyrTCb0i6hPQvXuL/OrrUpzP+KNl6efEU7yQ0cDH6/rJ16Fe2PWSTcW+pL8dlgmg==";
|
||||
};
|
||||
z2m = {
|
||||
acl = [
|
||||
"readwrite #"
|
||||
];
|
||||
hashedPassword = "$7$101$iZE7WOCQIaLtuoVN$M7AAB/mMmhkuXQVmu2RPoJzm744bmwxGTJwE0eoqlPAjyQHbjmOWfEuKoo9jnQCoQu2T96gS8znsUNizGgPWiQ==";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
zigbee2mqtt = {
|
||||
enable = true;
|
||||
device = "/dev/ttyS0";
|
||||
adapter = "deconz";
|
||||
};
|
||||
|
||||
config = {
|
||||
homeassistant = {
|
||||
name = "Berrendorf";
|
||||
time_zone = "Europe/Berlin";
|
||||
temperature_unit = "C";
|
||||
unit_system = "metric";
|
||||
latitude = "50.9279036523298";
|
||||
longitude = "6.583225751885932";
|
||||
country = "DE";
|
||||
external_url = "https://ha.karinsokolowski.de";
|
||||
internal_url = "http://192.168.178.254:8123";
|
||||
};
|
||||
http = {
|
||||
ip_ban_enabled = false;
|
||||
use_x_forwarded_for = true;
|
||||
trusted_proxies = [
|
||||
"127.0.0.1"
|
||||
"10.254.0.21"
|
||||
"10.0.1.5"
|
||||
"10.0.1.6"
|
||||
];
|
||||
};
|
||||
|
||||
default_config = {};
|
||||
energy = {};
|
||||
|
||||
"automation ui" = "!include automations.yaml";
|
||||
|
||||
map = {};
|
||||
mobile_app = {};
|
||||
network = {};
|
||||
notify = {};
|
||||
person = {};
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,16 +0,0 @@
|
|||
{
|
||||
flake,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
config = {
|
||||
age.secrets.home_controller_wireguard.file = "${flake.self}/secrets/home_controller_companion_wireguard_key.age";
|
||||
|
||||
pub-solar.home-controller = {
|
||||
enable = true;
|
||||
ownIp = "10.0.1.13";
|
||||
wireguardPrivateKeyFile = "/run/agenix/home_controller_wireguard";
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,65 +0,0 @@
|
|||
{
|
||||
flake,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
|
||||
let
|
||||
resticListenPort = 18000;
|
||||
in
|
||||
{
|
||||
age.secrets.backup_restic_htpasswd = {
|
||||
file = "${flake.self}/secrets/cox_backup_restic_htpasswd.age";
|
||||
owner = "${toString config.ids.uids.restic}";
|
||||
};
|
||||
|
||||
networking.firewall.allowedTCPPorts = [ resticListenPort ];
|
||||
|
||||
systemd.mounts = [
|
||||
{
|
||||
what = "/dev/mapper/crypt-backup";
|
||||
where = "/opt/backup/hdd";
|
||||
type = "ext4";
|
||||
}
|
||||
];
|
||||
|
||||
systemd.services."container@backup".unitConfig.RequiresMountsFor = ["/opt/backup/hdd"];
|
||||
|
||||
containers."backup" = {
|
||||
autoStart = true;
|
||||
ephemeral = true;
|
||||
bindMounts = {
|
||||
"/var/lib/restic" = {
|
||||
hostPath = "/opt/backup/hdd/restic";
|
||||
isReadOnly = false;
|
||||
};
|
||||
"/var/lib/restic/.htpasswd" = {
|
||||
hostPath = "/run/agenix/backup_restic_htpasswd";
|
||||
isReadOnly = false;
|
||||
};
|
||||
};
|
||||
|
||||
config = {
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
networking.firewall.enable = false;
|
||||
|
||||
services.restic.server = {
|
||||
enable = true;
|
||||
listenAddress = "0.0.0.0:${toString resticListenPort}";
|
||||
privateRepos = true;
|
||||
extraFlags = [
|
||||
"--append-only"
|
||||
"--prometheus"
|
||||
"--prometheus-no-auth"
|
||||
];
|
||||
};
|
||||
|
||||
time.timeZone = "Europe/Berlin";
|
||||
system.stateVersion = "22.11";
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,68 +0,0 @@
|
|||
# Edit this configuration file to define what should be installed on
|
||||
# your system. Help is available in the configuration.nix(5) man page
|
||||
# and in the NixOS manual (accessible by running ‘nixos-help’).
|
||||
{
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}: {
|
||||
imports = [
|
||||
./backup.nix
|
||||
./home-controller.nix
|
||||
./paperless.nix
|
||||
./owntone.nix
|
||||
./jellyfin.nix
|
||||
./photoprism.nix
|
||||
];
|
||||
|
||||
time.timeZone = "Europe/Berlin";
|
||||
|
||||
boot.plymouth.enable = lib.mkForce false;
|
||||
pub-solar.nextcloud.enable = lib.mkForce false;
|
||||
|
||||
networking = {
|
||||
vlans = {
|
||||
vlan102 = {
|
||||
id = 102;
|
||||
interface = "eth0";
|
||||
}; # iot vlan
|
||||
vlan104 = {
|
||||
id = 104;
|
||||
interface = "eth0";
|
||||
}; # media vlan
|
||||
};
|
||||
interfaces = {
|
||||
eth0 = {
|
||||
useDHCP = true;
|
||||
mtu = 1460;
|
||||
};
|
||||
|
||||
vlan102 = {
|
||||
mtu = 1460;
|
||||
ipv4.addresses = [{
|
||||
address = "172.16.0.12";
|
||||
prefixLength = 24;
|
||||
}];
|
||||
};
|
||||
|
||||
vlan104 = {
|
||||
mtu = 1460;
|
||||
ipv4.addresses = [{
|
||||
address = "10.42.0.12";
|
||||
prefixLength = 24;
|
||||
}];
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
networking.networkmanager.enable = false;
|
||||
|
||||
networking.firewall = {
|
||||
allowedUDPPorts = [1900];
|
||||
};
|
||||
|
||||
virtualisation.podman.enable = true;
|
||||
|
||||
system.stateVersion = "22.11";
|
||||
}
|
|
@ -1,6 +0,0 @@
|
|||
{ ... }: {
|
||||
imports = [
|
||||
./configuration.nix
|
||||
./hardware-configuration.nix
|
||||
];
|
||||
}
|
|
@ -1,70 +0,0 @@
|
|||
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||
# and may be overwritten by future invocations. Please make changes
|
||||
# to /etc/nixos/configuration.nix instead.
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
modulesPath,
|
||||
...
|
||||
}: {
|
||||
imports = [
|
||||
(modulesPath + "/installer/scan/not-detected.nix")
|
||||
];
|
||||
|
||||
boot.initrd.availableKernelModules = ["xhci_pci" "usbhid" "usb_storage" "uas"];
|
||||
boot.kernelPackages = pkgs.linuxPackages_latest;
|
||||
boot.kernelParams = ["usb-storage.quirks=2109:0716:ouw,174c:55aa:u,2109:2813:ouw,2109:0813:ouw"];
|
||||
|
||||
boot.loader = {
|
||||
timeout = 0;
|
||||
efi.canTouchEfiVariables = false;
|
||||
|
||||
systemd-boot.enable = false;
|
||||
generic-extlinux-compatible.enable = false;
|
||||
|
||||
grub = {
|
||||
enable = true;
|
||||
efiSupport = true;
|
||||
efiInstallAsRemovable = true;
|
||||
device = "nodev";
|
||||
};
|
||||
};
|
||||
|
||||
boot.initrd.luks.devices."cryptroot" = {
|
||||
device = "/dev/disk/by-uuid/d86a20a6-686c-4bf8-bd3b-911901272742";
|
||||
keyFile = "/dev/disk/by-id/usb-SanDisk_Cruzer_Blade_03024516121421043657-0:0-part1";
|
||||
fallbackToPassword = true;
|
||||
bypassWorkqueues = true;
|
||||
};
|
||||
|
||||
fileSystems."/" = {
|
||||
device = "/dev/disk/by-label/root";
|
||||
fsType = "ext4";
|
||||
};
|
||||
|
||||
fileSystems."/boot" = {
|
||||
device = "/dev/disk/by-label/boot";
|
||||
fsType = "vfat";
|
||||
};
|
||||
|
||||
swapDevices = [
|
||||
{device = "/dev/disk/by-label/swap";}
|
||||
];
|
||||
|
||||
hardware = {
|
||||
raspberry-pi."4".apply-overlays-dtmerge.enable = true;
|
||||
deviceTree = {
|
||||
enable = true;
|
||||
filter = "*rpi-4-*.dtb";
|
||||
};
|
||||
};
|
||||
|
||||
environment.systemPackages = with pkgs; [
|
||||
libraspberrypi
|
||||
raspberrypi-eeprom
|
||||
];
|
||||
|
||||
nixpkgs.hostPlatform = lib.mkDefault "aarch64-linux";
|
||||
powerManagement.cpuFreqGovernor = lib.mkDefault "ondemand";
|
||||
}
|
|
@ -1,17 +0,0 @@
|
|||
{
|
||||
flake,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
config = {
|
||||
age.secrets.home_controller_wireguard.file = "${flake.self}/secrets/home_controller_cox_wireguard_key.age";
|
||||
|
||||
pub-solar.home-controller = {
|
||||
enable = true;
|
||||
ownIp = "10.0.1.12";
|
||||
|
||||
wireguardPrivateKeyFile = "/run/agenix/home_controller_wireguard";
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,41 +0,0 @@
|
|||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
#boot.kernelModules = [ "v4l2loopback" ];
|
||||
#boot.extraModulePackages = with config.boot.kernelPackages; [ v4l2loopback ];
|
||||
|
||||
systemd.mounts = [
|
||||
{
|
||||
what = "/dev/mapper/crypt-media";
|
||||
where = "/opt/media";
|
||||
type = "ext4";
|
||||
}
|
||||
|
||||
{
|
||||
what = "/dev/mapper/crypt-movies";
|
||||
where = "/opt/media/media/video/movies";
|
||||
type = "ext4";
|
||||
}
|
||||
|
||||
{
|
||||
what = "/dev/mapper/crypt-tvshows";
|
||||
where = "/opt/media/media/video/tv-shows";
|
||||
type = "ext4";
|
||||
}
|
||||
];
|
||||
|
||||
systemd.services.jellyfin.unitConfig.RequiresMountsFor = [
|
||||
"/opt/media"
|
||||
"/opt/media/media/video/movies"
|
||||
"/opt/media/media/video/tv-shows"
|
||||
];
|
||||
|
||||
users.users.jellyfin.extraGroups = [ "video" ];
|
||||
|
||||
environment.systemPackages = [ pkgs.jellyfin-ffmpeg ];
|
||||
|
||||
services.jellyfin = {
|
||||
enable = true;
|
||||
openFirewall = true;
|
||||
};
|
||||
}
|
|
@ -1,37 +0,0 @@
|
|||
{ config, ... }:
|
||||
|
||||
let
|
||||
owntoneConfigDir = "/opt/media/config/owntone";
|
||||
owntoneMusicDir = "/opt/media/media";
|
||||
in
|
||||
{
|
||||
networking.firewall.allowedTCPPorts = [
|
||||
3688 # websocket
|
||||
3689 # http
|
||||
6600 # mpd
|
||||
13988 # airplay
|
||||
13989 # airplay
|
||||
];
|
||||
|
||||
systemd.services."podman-owntone".unitConfig.RequiresMountsFor = [
|
||||
owntoneConfigDir
|
||||
owntoneMusicDir
|
||||
];
|
||||
|
||||
virtualisation.oci-containers.containers."owntone" = {
|
||||
image = "linuxserver/daapd";
|
||||
autoStart = true;
|
||||
extraOptions = ["--network=host"];
|
||||
|
||||
environment = {
|
||||
PUID = "1000";
|
||||
PGID = "1000";
|
||||
TZ = "Europe/Berlin";
|
||||
};
|
||||
|
||||
volumes = [
|
||||
"${owntoneConfigDir}:/config"
|
||||
"${owntoneMusicDir}:/music"
|
||||
];
|
||||
};
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
{
|
||||
pkgs,
|
||||
config,
|
||||
...
|
||||
}: {
|
||||
systemd.mounts = [
|
||||
{
|
||||
what = "/dev/mapper/crypt-documents";
|
||||
where = "/opt/documents";
|
||||
type = "ext4";
|
||||
}
|
||||
];
|
||||
|
||||
pub-solar.paperless = {
|
||||
enable = true;
|
||||
hostStateDir = "/opt/documents/paperless";
|
||||
domain = "cox.lan";
|
||||
path = "/paperless";
|
||||
|
||||
ftp = {
|
||||
enable = true;
|
||||
listenPort = 20021;
|
||||
};
|
||||
|
||||
nextcloud = {
|
||||
enable = true;
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,37 +0,0 @@
|
|||
{ lib, ... }:
|
||||
|
||||
{
|
||||
systemd.services.photoprism = {
|
||||
unitConfig.RequiresMountsFor = [ "/opt/media/photoprism" ];
|
||||
serviceConfig = {
|
||||
DynamicUser = lib.mkForce false;
|
||||
User = "photoprism";
|
||||
Group = "photoprism";
|
||||
};
|
||||
};
|
||||
|
||||
services.nginx.virtualHosts."cox.lan".locations."/photoprism" = {
|
||||
proxyPass = "http://127.0.0.1:18899";
|
||||
proxyWebsockets = true;
|
||||
};
|
||||
|
||||
users.users.photoprism = {
|
||||
group = "photoprism";
|
||||
isSystemUser = true;
|
||||
};
|
||||
users.groups.photoprism = {};
|
||||
|
||||
services.photoprism = {
|
||||
enable = true;
|
||||
originalsPath = "/opt/media/photoprism/originals";
|
||||
storagePath = "/opt/media/photoprism/data";
|
||||
importPath = "/opt/media/photoprism/import";
|
||||
port = 18899;
|
||||
address = "127.0.0.1";
|
||||
settings = {
|
||||
PHOTOPRISM_DEFAULT_LOCALE = "de";
|
||||
PHOTOPRISM_SITE_URL = "http://cox.lan/photoprism";
|
||||
PHOTOPRISM_TRUSTED_PROXY = "127.0.0.1/8";
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,34 +0,0 @@
|
|||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
pub-solar.server.enable = true;
|
||||
hardware.ksm.enable = true;
|
||||
pub-solar.core.disk-encryption-active = false;
|
||||
|
||||
networking.networkmanager.enable = lib.mkForce false;
|
||||
|
||||
# Use the GRUB 2 boot loader.
|
||||
boot.loader.grub.enable = true;
|
||||
boot.loader.grub.version = 2;
|
||||
boot.loader.grub.device = "/dev/disk/by-id/usb-HP_iLO_Internal_SD-CARD_000002660A01-0:0";
|
||||
|
||||
boot.loader.systemd-boot.enable = lib.mkForce false;
|
||||
|
||||
time.timeZone = "Europe/Berlin";
|
||||
|
||||
networking.interfaces.eno1.useDHCP = true;
|
||||
|
||||
networking.nat.enable = true;
|
||||
networking.nat.internalIPs = ["10.10.42.0/24"];
|
||||
networking.nat.externalInterface = "eno1";
|
||||
|
||||
networking.firewall.allowedTCPPorts = [80 443 22];
|
||||
networking.firewall.allowedUDPPorts = [51899];
|
||||
|
||||
networking.firewall.enable = lib.mkForce true;
|
||||
|
||||
system.stateVersion = "21.05"; # Did you read the comment?
|
||||
}
|
|
@ -1,6 +0,0 @@
|
|||
{ ... }: {
|
||||
imports = [
|
||||
./configuration.nix
|
||||
./hardware-configuration.nix
|
||||
];
|
||||
}
|
|
@ -1,56 +0,0 @@
|
|||
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||
# and may be overwritten by future invocations. Please make changes
|
||||
# to /etc/nixos/configuration.nix instead.
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
modulesPath,
|
||||
...
|
||||
}: {
|
||||
imports = [
|
||||
(modulesPath + "/installer/scan/not-detected.nix")
|
||||
];
|
||||
|
||||
boot.loader.grub = {
|
||||
enable = true;
|
||||
device = "/dev/disk/by-id/usb-HP_iLO_Internal_SD-CARD_000002660A01-0:0";
|
||||
};
|
||||
|
||||
boot.initrd.availableKernelModules = ["ehci_pci" "ahci" "uhci_hcd" "xhci_pci" "megaraid_sas" "usb_storage" "usbhid" "sd_mod"];
|
||||
boot.initrd.kernelModules = ["dm-snapshot"];
|
||||
boot.kernelModules = ["kvm-intel"];
|
||||
boot.extraModulePackages = [];
|
||||
|
||||
boot.initrd.luks.devices."cryptroot" = {
|
||||
device = "/dev/disk/by-uuid/24ddd650-e9fc-4407-ba4c-cc237de4c484";
|
||||
keyFile = "/dev/disk/by-id/usb-Kingston_DataTraveler_3.0_E0D55E625BE3E72078790030-0:0-part1";
|
||||
fallbackToPassword = true;
|
||||
bypassWorkqueues = true;
|
||||
};
|
||||
|
||||
fileSystems."/" = {
|
||||
device = "/dev/disk/by-uuid/c47cdc43-d77c-4a01-87b3-a289fa97ef14";
|
||||
fsType = "ext4";
|
||||
};
|
||||
|
||||
fileSystems."/boot" = {
|
||||
device = "/dev/disk/by-uuid/3ee236cc-c4a6-423b-ba77-7a15ba642123";
|
||||
fsType = "ext4";
|
||||
};
|
||||
|
||||
swapDevices = [
|
||||
{device = "/dev/disk/by-uuid/0ddcb856-f39e-45d6-bde3-4fbf9c81fe6c";}
|
||||
];
|
||||
|
||||
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
||||
# (the default) this is the recommended approach. When using systemd-networkd it's
|
||||
# still possible to use this option, but it's recommended to use it in conjunction
|
||||
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
|
||||
networking.useDHCP = lib.mkDefault true;
|
||||
# networking.interfaces.eno1.useDHCP = lib.mkDefault true;
|
||||
# networking.interfaces.eno2.useDHCP = lib.mkDefault true;
|
||||
|
||||
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||
}
|
|
@ -1,63 +0,0 @@
|
|||
{ self, config, pkgs, ... }:
|
||||
|
||||
{
|
||||
age.secrets.home_controller_wireguard.file = "${self}/secrets/home_controller_cube_wireguard_key.age";
|
||||
|
||||
|
||||
systemd.services.wireguard-wg0.serviceConfig.Restart = "on-failure";
|
||||
systemd.services.wireguard-wg0.serviceConfig.RestartSec = "5s";
|
||||
|
||||
# Enable WireGuard
|
||||
networking.wireguard.interfaces = {
|
||||
wg1 = {
|
||||
# Determines the IP address and subnet of the client's end of the tunnel interface.
|
||||
ips = [ "10.0.1.5" ];
|
||||
listenPort = 51899; # to match firewall allowedUDPPorts (without this wg uses random port numbers)
|
||||
|
||||
# Path to the private key file.
|
||||
#
|
||||
# Note: The private key can also be included inline via the privateKey option,
|
||||
# but this makes the private key world-readable; thus, using privateKeyFile is
|
||||
# recommended.
|
||||
privateKeyFile = "/run/agenix/home_controller_wireguard";
|
||||
|
||||
peers = [
|
||||
# For a client configuration, one peer entry for the server will suffice.
|
||||
|
||||
{
|
||||
# giggles
|
||||
publicKey = "i5kiTSPGR2jrdHl+s/S6D0YWb+xkbPudczG2RWmWwCg=";
|
||||
allowedIPs = [ "10.0.1.11/32" ];
|
||||
|
||||
# Send keepalives every 25 seconds. Important to keep NAT tables alive.
|
||||
persistentKeepalive = 25;
|
||||
}
|
||||
{
|
||||
# cox
|
||||
publicKey = "VogQYYYNdXLhPKY9/P2WAn6gfEX9ojN3VD+DKx4gl0k=";
|
||||
allowedIPs = [ "10.0.1.12/32" ];
|
||||
|
||||
# Send keepalives every 25 seconds. Important to keep NAT tables alive.
|
||||
persistentKeepalive = 25;
|
||||
}
|
||||
{
|
||||
# companion
|
||||
publicKey = "7EUcSUckw/eLiWFHD+AzfcoKWstjr+cL70SupOJ6zC0=";
|
||||
allowedIPs = [ "10.0.1.13/32" ];
|
||||
|
||||
# Send keepalives every 25 seconds. Important to keep NAT tables alive.
|
||||
persistentKeepalive = 25;
|
||||
}
|
||||
|
||||
{
|
||||
# hsha
|
||||
publicKey = "sC0wWHE/tvNaVYX3QQTHQUmSTTjZMOjkQ5x/qy6qjTc=";
|
||||
allowedIPs = [ "10.0.1.254/32" ];
|
||||
|
||||
# Send keepalives every 25 seconds. Important to keep NAT tables alive.
|
||||
persistentKeepalive = 25;
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
|
@ -7,7 +7,7 @@ let
|
|||
networking.hostName = host;
|
||||
imports = [
|
||||
self.nixosModules.base
|
||||
./${host}
|
||||
inputs.nixos-config.nixosHosts.${host}
|
||||
self.nixosModules.${user}
|
||||
];
|
||||
};
|
||||
|
|
|
@ -1,45 +0,0 @@
|
|||
# Edit this configuration file to define what should be installed on
|
||||
# your system. Help is available in the configuration.nix(5) man page
|
||||
# and in the NixOS manual (accessible by running ‘nixos-help’).
|
||||
|
||||
{ inputs, pkgs, builtins, config, lib, ... }:
|
||||
|
||||
{
|
||||
boot.plymouth.enable = lib.mkForce false;
|
||||
pub-solar.nextcloud.enable = lib.mkForce false;
|
||||
pub-solar.core.disk-encryption-active = false;
|
||||
|
||||
boot.loader.grub.enable = lib.mkForce false;
|
||||
boot.loader.systemd-boot.enable = lib.mkForce false;
|
||||
boot.loader.generic-extlinux-compatible.enable = lib.mkForce true;
|
||||
|
||||
# Set your time zone.
|
||||
time.timeZone = "Europe/Berlin";
|
||||
|
||||
# The global useDHCP flag is deprecated, therefore explicitly set to false here.
|
||||
# Per-interface useDHCP will be mandatory in the future, so this generated config
|
||||
# replicates the default behaviour.
|
||||
networking.useDHCP = false;
|
||||
networking.interfaces.eth0.useDHCP = true;
|
||||
networking.networkmanager.enable = lib.mkForce false;
|
||||
|
||||
boot.initrd.network = {
|
||||
enable = true;
|
||||
};
|
||||
|
||||
|
||||
# Open ports in the firewall.
|
||||
#networking.firewall.allowedTCPPorts = [ ];
|
||||
# networking.firewall.allowedUDPPorts = [ ... ];
|
||||
# Or disable the firewall altogether.
|
||||
# networking.firewall.enable = false;
|
||||
|
||||
# This value determines the NixOS release from which the default
|
||||
# settings for stateful data, like file locations and database versions
|
||||
# on your system were taken. It‘s perfectly fine and recommended to leave
|
||||
# this value at the release version of the first install of this system.
|
||||
# Before changing this value read the documentation for this option
|
||||
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
||||
system.stateVersion = "22.11"; # Did you read the comment?
|
||||
}
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
{ ... }: {
|
||||
imports = [
|
||||
./configuration.nix
|
||||
./hardware-configuration.nix
|
||||
];
|
||||
}
|
|
@ -1,41 +0,0 @@
|
|||
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||
# and may be overwritten by future invocations. Please make changes
|
||||
# to /etc/nixos/configuration.nix instead.
|
||||
{ config, lib, pkgs, modulesPath, ... }:
|
||||
|
||||
{
|
||||
imports =
|
||||
[
|
||||
(modulesPath + "/installer/scan/not-detected.nix")
|
||||
];
|
||||
|
||||
boot.initrd.availableKernelModules = [ "xhci_pci" "uas" ];
|
||||
boot.initrd.kernelModules = [ ];
|
||||
boot.kernelModules = [ ];
|
||||
boot.extraModulePackages = [ ];
|
||||
#boot.initrd.supportedFilesystems = [ "zfs" ];
|
||||
#boot.supportedFilesystems = [ "zfs" ];
|
||||
|
||||
boot.kernelPackages = lib.mkForce pkgs.linuxPackages;
|
||||
|
||||
fileSystems."/" =
|
||||
{
|
||||
device = "/dev/disk/by-uuid/9f3208ae-ee05-44b8-a0bc-dc1e7499bdb8";
|
||||
fsType = "ext4";
|
||||
};
|
||||
|
||||
fileSystems."/boot" =
|
||||
{
|
||||
device = "/dev/disk/by-uuid/997A-7FBA";
|
||||
fsType = "vfat";
|
||||
};
|
||||
|
||||
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
||||
# (the default) this is the recommended approach. When using systemd-networkd it's
|
||||
# still possible to use this option, but it's recommended to use it in conjunction
|
||||
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
|
||||
networking.useDHCP = false;
|
||||
networking.interfaces.eth0.useDHCP = lib.mkDefault true;
|
||||
|
||||
powerManagement.cpuFreqGovernor = lib.mkDefault "ondemand";
|
||||
}
|
|
@ -1,27 +0,0 @@
|
|||
{ pkgs, python311 }:
|
||||
let
|
||||
pycryptodomex = python311.pkgs.buildPythonPackage rec {
|
||||
pname = "pycryptodomex";
|
||||
version = "3.18.0";
|
||||
src = pkgs.fetchPypi {
|
||||
inherit pname version;
|
||||
sha256 = "Pj7LX+l558G7ACflGDQKz37mBBXXkpXlJR0Txo3eV24=";
|
||||
};
|
||||
};
|
||||
in
|
||||
python311.pkgs.buildPythonPackage rec {
|
||||
pname = "aioairctrl";
|
||||
version = "0.2.4";
|
||||
|
||||
src = pkgs.fetchFromGitHub {
|
||||
owner = "kongo09";
|
||||
repo = "aioairctrl";
|
||||
rev = "v${version}";
|
||||
sha256 = "JBXh590wu85ig+LZCgG9S7y9uLOKednFJ/1UfDLz5Fo=";
|
||||
};
|
||||
|
||||
propagatedBuildInputs = [
|
||||
python311.pkgs.aiocoap
|
||||
pycryptodomex
|
||||
];
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
{...}: {
|
||||
services.avahi = {
|
||||
enable = true;
|
||||
openFirewall = true;
|
||||
allowInterfaces = ["eth0" "vlan104"];
|
||||
reflector = true;
|
||||
publish.enable = true;
|
||||
extraConfig = ''
|
||||
reflect-filters=_googlecast._tcp.local
|
||||
'';
|
||||
};
|
||||
}
|
|
@ -1,39 +0,0 @@
|
|||
{
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}: {
|
||||
imports = [
|
||||
./network.nix
|
||||
./network-dhcp.nix
|
||||
./avahi-reflector.nix
|
||||
./unifi.nix
|
||||
|
||||
./home-controller.nix
|
||||
./home-assistant.nix
|
||||
|
||||
./frigate.nix
|
||||
|
||||
# ./tang-container.nix
|
||||
];
|
||||
|
||||
pub-solar.server.enable = true;
|
||||
hardware.ksm.enable = true;
|
||||
boot.loader.timeout = 0;
|
||||
boot.loader.systemd-boot.enable = lib.mkForce false;
|
||||
boot.loader.generic-extlinux-compatible.enable = lib.mkForce false;
|
||||
boot.loader.grub = {
|
||||
enable = true;
|
||||
efiSupport = true;
|
||||
efiInstallAsRemovable = true;
|
||||
device = "nodev";
|
||||
};
|
||||
|
||||
boot.plymouth.enable = lib.mkForce false;
|
||||
pub-solar.nextcloud.enable = lib.mkForce false;
|
||||
|
||||
time.timeZone = "Europe/Berlin";
|
||||
|
||||
system.stateVersion = "22.11"; # Did you read the comment?
|
||||
}
|
|
@ -1,6 +0,0 @@
|
|||
{ ... }: {
|
||||
imports = [
|
||||
./configuration.nix
|
||||
./hardware-configuration.nix
|
||||
];
|
||||
}
|
|
@ -1,21 +0,0 @@
|
|||
{ pkgs, python311 }:
|
||||
|
||||
python311.pkgs.buildPythonPackage rec {
|
||||
pname = "forecast_solar";
|
||||
version = "3.0.0";
|
||||
src = pkgs.fetchFromGitHub {
|
||||
owner = "home-assistant-libs";
|
||||
repo = "forecast_solar";
|
||||
rev = version;
|
||||
sha256 = "Go0DF2qyVyGVYEeoEEuxsSR9Ge8Pg4S77zM1HL83ELc=";
|
||||
};
|
||||
|
||||
pythonImportsCheck = [ "pytest" "flake8" ];
|
||||
|
||||
propagatedBuildInputs = with python311.pkgs; [
|
||||
aiodns
|
||||
aiohttp
|
||||
flake8
|
||||
pytest
|
||||
];
|
||||
}
|
|
@ -1,76 +0,0 @@
|
|||
{ ... }:
|
||||
|
||||
let
|
||||
camIp = "10.0.42.31";
|
||||
in
|
||||
{
|
||||
networking.firewall.allowedTCPPorts = [80 5000 8554 8555];
|
||||
|
||||
#services.go2rtc = {
|
||||
# enable = true;
|
||||
# settings = {
|
||||
# streams = {
|
||||
# burgi_cam = [
|
||||
# "rtsp://admin:XpkFk5Df912VWSwM@${camIp}:554/Streaming/Channels/101/?transportmode=unicast"
|
||||
# "ffmpeg:burgi_cam_sub#audio=opus"
|
||||
# ];
|
||||
# burgi_cam_sub = [
|
||||
# "rtsp://admin:XpkFk5Df912VWSwM@${camIp}:554/Streaming/Channels/102/?transportmode=unicast"
|
||||
# ];
|
||||
# };
|
||||
# webrtc = {
|
||||
# candidates = [ "192.168.42.11:8555" ];
|
||||
# };
|
||||
# };
|
||||
#};
|
||||
|
||||
services.frigate = {
|
||||
enable = false;
|
||||
hostname = "frigate";
|
||||
settings = {
|
||||
cameras.burgi = {
|
||||
ffmpeg = {
|
||||
inputs = [
|
||||
{
|
||||
path = "rtsp://admin:XpkFk5Df912VWSwM@${camIp}:554/Streaming/Channels/101/?transportmode=unicast";
|
||||
#path = "rtsp://127.0.0.1:8554/burgi_cam";
|
||||
#input_args = "preset-rtsp-restream";
|
||||
roles = [
|
||||
"record"
|
||||
"rtmp"
|
||||
];
|
||||
}
|
||||
{
|
||||
path = "rtsp://admin:XpkFk5Df912VWSwM@${camIp}:554/Streaming/Channels/102/?transportmode=unicast";
|
||||
#path = "rtsp://127.0.0.1:8554/burgi_cam_sub";
|
||||
#input_args = "preset-rtsp-restream";
|
||||
roles = [
|
||||
"detect"
|
||||
];
|
||||
}
|
||||
];
|
||||
};
|
||||
detect = {
|
||||
width = 1280;
|
||||
height = 720;
|
||||
fps = 5;
|
||||
};
|
||||
};
|
||||
objects.track = [ "person" "dog" ];
|
||||
|
||||
mqtt = {
|
||||
enabled = true;
|
||||
host = "127.0.0.1";
|
||||
user = "frigate";
|
||||
password = "rDAnboXJhW8K2OJlPI5KpZhggPJusA==";
|
||||
};
|
||||
|
||||
rtmp.enabled = true;
|
||||
|
||||
#detectors.coral = {
|
||||
# type = "edgetpu";
|
||||
# device = "usb";
|
||||
#};
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,56 +0,0 @@
|
|||
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||
# and may be overwritten by future invocations. Please make changes
|
||||
# to /etc/nixos/configuration.nix instead.
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
modulesPath,
|
||||
...
|
||||
}: {
|
||||
imports = [
|
||||
(modulesPath + "/installer/scan/not-detected.nix")
|
||||
];
|
||||
|
||||
boot.initrd.availableKernelModules = ["xhci_pci" "usbhid" "usb_storage" "uas"];
|
||||
boot.kernelPackages = pkgs.linuxPackages_latest;
|
||||
|
||||
boot.loader.grub = {
|
||||
enable = true;
|
||||
efiSupport = true;
|
||||
efiInstallAsRemovable = true;
|
||||
device = "nodev";
|
||||
};
|
||||
|
||||
boot.loader.efi.canTouchEfiVariables = false;
|
||||
|
||||
boot.loader.systemd-boot.enable = false;
|
||||
boot.loader.generic-extlinux-compatible.enable = false;
|
||||
boot.loader.timeout = 0;
|
||||
|
||||
boot.initrd.luks.devices."cryptroot" = {
|
||||
device = "/dev/disk/by-uuid/5edec8af-5f84-4d9f-9755-8abbb55e00af";
|
||||
keyFile = "/dev/disk/by-id/usb-SanDisk_Cruzer_Blade_04020116120721075123-0:0-part1";
|
||||
fallbackToPassword = true;
|
||||
bypassWorkqueues = true;
|
||||
};
|
||||
|
||||
fileSystems."/" = {
|
||||
device = "/dev/disk/by-label/root";
|
||||
fsType = "ext4";
|
||||
};
|
||||
|
||||
fileSystems."/boot" = {
|
||||
device = "/dev/disk/by-label/boot";
|
||||
fsType = "vfat";
|
||||
};
|
||||
|
||||
swapDevices = [
|
||||
{device = "/dev/disk/by-label/swap";}
|
||||
];
|
||||
|
||||
networking.interfaces.enabcm6e4ei0.useDHCP = true;
|
||||
|
||||
nixpkgs.hostPlatform = lib.mkDefault "aarch64-linux";
|
||||
powerManagement.cpuFreqGovernor = lib.mkDefault "ondemand";
|
||||
}
|
|
@ -1,58 +0,0 @@
|
|||
{
|
||||
action = rec {
|
||||
callService = service: entity: {
|
||||
service = service;
|
||||
target.entity_id = entity;
|
||||
};
|
||||
|
||||
delayed = f: delay: [
|
||||
{delay.seconds = delay;}
|
||||
(f)
|
||||
];
|
||||
|
||||
turnOn = entity: callService "homeassistant.turn_on" entity;
|
||||
turnOff = entity: callService "homeassistant.turn_off" entity;
|
||||
};
|
||||
|
||||
condition = {
|
||||
state = entity: state: {
|
||||
condition = "state";
|
||||
entity_id = entity;
|
||||
state = state;
|
||||
};
|
||||
|
||||
stateNot = entity: state: {
|
||||
condition = "not";
|
||||
conditions = [{
|
||||
condition = "state";
|
||||
entity_id = entity;
|
||||
state = state;
|
||||
}];
|
||||
};
|
||||
};
|
||||
|
||||
trigger = {
|
||||
state = entity: {
|
||||
platform = "state";
|
||||
entity_id = entity;
|
||||
};
|
||||
|
||||
stateFrom = entity: stateFrom: {
|
||||
platform = "state";
|
||||
entity_id = entity;
|
||||
from = stateFrom;
|
||||
};
|
||||
|
||||
stateTo = entity: stateTo: {
|
||||
platform = "state";
|
||||
entity_id = entity;
|
||||
to = stateTo;
|
||||
};
|
||||
|
||||
stateNotTo = entity: stateNotTo: {
|
||||
platform = "state";
|
||||
entity_id = entity;
|
||||
not_to = stateNotTo;
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
let
|
||||
mapSegments = [
|
||||
{id = 1; name = "Hendrik";}
|
||||
{id = 2; name = "Schlafzimmer";}
|
||||
{id = 3; name = "Badezimmer";}
|
||||
{id = 4; name = "Toilette";}
|
||||
{id = 5; name = "Flur";}
|
||||
{id = 6; name = "Vorratsraum";}
|
||||
{id = 7; name = "Küche";}
|
||||
{id = 8; name = "Caro";}
|
||||
{id = 9; name = "Wohnzimmer";}
|
||||
];
|
||||
|
||||
mkCustomize = id: [
|
||||
{
|
||||
name = "input_boolean.vacuum_segment_${toString id}";
|
||||
value = {
|
||||
room_id = id;
|
||||
};
|
||||
}
|
||||
];
|
||||
|
||||
mkCustomizes = ms: builtins.concatMap (s: (mkCustomize s.id)) ms;
|
||||
|
||||
in
|
||||
builtins.listToAttrs (mkCustomizes mapSegments)
|
|
@ -1,95 +0,0 @@
|
|||
let
|
||||
helper = import ./home-assistant-automation-helpers.nix;
|
||||
|
||||
entityLightSleepingHoursNotBefore = "light_sleeping_hours_not_before";
|
||||
entityLightSleepingHoursNotAfter = "light_sleeping_hours_not_after";
|
||||
entityLightDarkHoursNotBefore = "light_dark_hours_not_before";
|
||||
entityLightDarkHoursNotAfter = "light_dark_hours_not_after";
|
||||
|
||||
conditionalAutomation = slug: triggers: conditions: actions: {
|
||||
alias = "Light: ${slug}";
|
||||
id = "light_automation_${slug}";
|
||||
trigger = triggers;
|
||||
condition = conditions;
|
||||
action = actions;
|
||||
};
|
||||
automation = slug: triggers: actions: (conditionalAutomation slug triggers [] actions);
|
||||
|
||||
lightOnOnMovement = room: opts: (conditionalAutomation
|
||||
"${room}_movement_turn_on"
|
||||
(map (e: helper.trigger.stateTo e "on") opts.triggers)
|
||||
opts.conditions
|
||||
(map (e: helper.action.turnOn e) opts.entities)
|
||||
);
|
||||
|
||||
# switch off light when trigger entity switches to off and all given trigger
|
||||
# entities are not in state "on" (prevents hassle with unavailable state)
|
||||
lightOffAfterMovement = room: opts: (conditionalAutomation
|
||||
"${room}_movement_turn_off"
|
||||
(map (e: helper.trigger.stateTo e "off") opts.triggers)
|
||||
(map (e: helper.condition.stateNot e "on") opts.triggers)
|
||||
(map (e: helper.action.turnOff e) opts.entities)
|
||||
);
|
||||
|
||||
outsideSleepingHoursCondition = [{
|
||||
condition = "not";
|
||||
conditions = [{
|
||||
condition = "time";
|
||||
after = "input_datetime.${entityLightSleepingHoursNotBefore}";
|
||||
before = "input_datetime.${entityLightSleepingHoursNotAfter}";
|
||||
}];
|
||||
}];
|
||||
withinDarkHoursCondition = [{
|
||||
condition = "time";
|
||||
after = "input_datetime.${entityLightDarkHoursNotBefore}";
|
||||
before = "input_datetime.${entityLightDarkHoursNotAfter}";
|
||||
}];
|
||||
|
||||
roomEntitiesMap = {
|
||||
# should switch on when its dark outside but not when someone sleeps
|
||||
flur = {
|
||||
triggers = ["binary_sensor.pir_flur_1_occupancy" "binary_sensor.pir_flur_2_occupancy"];
|
||||
entities = ["light.flur_deckenlicht"];
|
||||
conditions = [] ++ withinDarkHoursCondition ++ outsideSleepingHoursCondition;
|
||||
};
|
||||
#kueche = {
|
||||
# triggers = [];
|
||||
# entites = [];
|
||||
# conditions = [] ++ withinDarkHoursCondition;
|
||||
#};
|
||||
# should switch on every time
|
||||
vorratsraum = {
|
||||
triggers = ["binary_sensor.pir_vorratsraum_occupancy"];
|
||||
entities = ["light.vorratsraum_deckenlicht"];
|
||||
conditions = [];
|
||||
};
|
||||
};
|
||||
in
|
||||
{
|
||||
input_datetime = {
|
||||
"${entityLightDarkHoursNotBefore}" = {
|
||||
name = "TIME Light: Dark hours start not before";
|
||||
has_date = false;
|
||||
has_time = true;
|
||||
};
|
||||
"${entityLightDarkHoursNotAfter}" = {
|
||||
name = "TIME Light: Dark hours start not after";
|
||||
has_date = false;
|
||||
has_time = true;
|
||||
};
|
||||
"${entityLightSleepingHoursNotBefore}" = {
|
||||
name = "TIME Light: Sleeping hours start not before";
|
||||
has_date = false;
|
||||
has_time = true;
|
||||
};
|
||||
"${entityLightSleepingHoursNotAfter}" = {
|
||||
name = "TIME Light: Sleeping hours start not after";
|
||||
has_date = false;
|
||||
has_time = true;
|
||||
};
|
||||
};
|
||||
|
||||
automation = [] ++
|
||||
(builtins.attrValues (builtins.mapAttrs (r: o: lightOnOnMovement r o) roomEntitiesMap)) ++
|
||||
(builtins.attrValues (builtins.mapAttrs (r: o: lightOffAfterMovement r o) roomEntitiesMap));
|
||||
}
|
|
@ -1,67 +0,0 @@
|
|||
let
|
||||
vacuumName = "IdenticalVeneratedCat";
|
||||
entityVacuum = "vacuum.valetudo_identicalveneratedcat";
|
||||
mapSegments = [
|
||||
{id = 1; name = "Hendrik";}
|
||||
{id = 2; name = "Schlafzimmer";}
|
||||
{id = 3; name = "Badezimmer";}
|
||||
{id = 4; name = "Toilette";}
|
||||
{id = 5; name = "Flur";}
|
||||
{id = 6; name = "Vorratsraum";}
|
||||
{id = 7; name = "Küche";}
|
||||
{id = 8; name = "Caro";}
|
||||
{id = 9; name = "Wohnzimmer";}
|
||||
];
|
||||
|
||||
mkBooleanHelper = id: name: [
|
||||
{
|
||||
name = "vacuum_segment_${toString id}";
|
||||
value = {
|
||||
name = name;
|
||||
};
|
||||
}
|
||||
];
|
||||
|
||||
mkBooleanHelpers = ms: builtins.concatMap (s: (mkBooleanHelper s.id s.name)) ms;
|
||||
in
|
||||
{
|
||||
input_boolean = builtins.listToAttrs (mkBooleanHelpers mapSegments);
|
||||
|
||||
group = {
|
||||
vacuum_rooms = {
|
||||
name = "Vacuum Rooms";
|
||||
entities = builtins.concatMap (s: ["input_boolean.vacuum_segment_${toString s.id}"]) mapSegments;
|
||||
};
|
||||
};
|
||||
|
||||
script = {
|
||||
vacuum_clean_segments = {
|
||||
mode = "single";
|
||||
alias = "vacuum_clean_segments";
|
||||
icon = "mdi:arrow-right";
|
||||
sequence = [{
|
||||
service = "script.turn_on";
|
||||
target = {
|
||||
entity_id = "script.vacuum_clean_segments_message";
|
||||
};
|
||||
data = {
|
||||
variables = {
|
||||
segments = "{{expand(\"group.vacuum_rooms\") | selectattr(\"state\",\"eq\",\"on\") | map(attribute=\"attributes.room_id\") | list | to_json}}";
|
||||
};
|
||||
};
|
||||
}];
|
||||
};
|
||||
|
||||
vacuum_clean_segments_message = {
|
||||
alias = "vacuum_clean_segments_message";
|
||||
mode = "single";
|
||||
sequence = [{
|
||||
service = "mqtt.publish";
|
||||
data = {
|
||||
topic = "valetudo/${vacuumName}/MapSegmentationCapability/clean/set";
|
||||
payload_template = ''{"segment_ids": {{segments}}}'';
|
||||
};
|
||||
}];
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,246 +0,0 @@
|
|||
let
|
||||
helper = import ./home-assistant-automation-helpers.nix;
|
||||
|
||||
entityMediaplayerFireTV = "media_player.wohnzimmer_firetv";
|
||||
entityMediaplayerXBOX = "media_player.wohnzimmer_xbox";
|
||||
entityMediaplayerZeppelin = "media_player.wohnzimmer_zeppelin";
|
||||
|
||||
entitySwitchTV = "switch.wohnzimmer_tv_steckdosenleiste_tv";
|
||||
entitySwitchFireTV = "switch.wohnzimmer_tv_steckdosenleiste_firetv";
|
||||
entitySwitchXBOX = "switch.wohnzimmer_tv_steckdosenleiste_xbox";
|
||||
entitySwitchZeppelin = "switch.wohnzimmer_tv_steckdosenleiste_zeppelin";
|
||||
|
||||
entityActivitySelect = "wohnzimmer_tv_activity";
|
||||
entityVolumeMute = "wohnzimmer_tv_volume_mute";
|
||||
entityVolumeLevel = "wohnzimmer_tv_volume_level";
|
||||
|
||||
entityHarmonyActivitySelect = "select.wohnzimmer_harmony_activities";
|
||||
|
||||
activityOptionOff = "Aus";
|
||||
activityOptionOffHarmony = "power_off";
|
||||
activityOptionMusic = "Musik";
|
||||
activityOptionFireTV = "FireTV";
|
||||
activityOptionXBOX = "XBOX";
|
||||
|
||||
# because of tasmota
|
||||
switchDelaySecondsZeppelin = 1;
|
||||
switchDelaySecondsTV = 2;
|
||||
switchDelaySecondsFireTV = 3;
|
||||
switchDelaySecondsXBOXOn = 4;
|
||||
switchDelaySecondsXBOXOff = 60; # because it needs longer to shut down
|
||||
|
||||
mkAutomationCondition = slug: triggers: conditions: actions: {
|
||||
alias = "Wohnzimmer TV: ${slug}";
|
||||
id = "wohnzimmer_tv_automation_${slug}";
|
||||
trigger = triggers;
|
||||
condition = conditions;
|
||||
action = actions;
|
||||
};
|
||||
mkAutomation = slug: triggers: actions: (mkAutomationCondition slug triggers [] actions);
|
||||
|
||||
rokuButtonPressed = key: {
|
||||
platform = "event";
|
||||
event_type = "roku_command";
|
||||
event_data = {
|
||||
type = "keypress";
|
||||
key = key;
|
||||
};
|
||||
};
|
||||
|
||||
mkRokuVolumeAutomation = key: action: mkAutomation
|
||||
"roku_vol_${action}"
|
||||
[(rokuButtonPressed key)]
|
||||
[(helper.action.callService "input_number.${action}" "input_number.${entityVolumeLevel}")];
|
||||
|
||||
tvSelect = option: {
|
||||
service = "input_select.select_option";
|
||||
target.entity_id = "input_select.${entityActivitySelect}";
|
||||
data.option = option;
|
||||
};
|
||||
|
||||
harmonySelect = option: {
|
||||
service = "select.select_option";
|
||||
target.entity_id = entityHarmonyActivitySelect;
|
||||
data.option = option;
|
||||
};
|
||||
|
||||
tvChangedTo = stateTo: (helper.trigger.stateTo "input_select.${entityActivitySelect}" stateTo);
|
||||
tvChangedNotTo = stateNotTo: (helper.trigger.stateNotTo "input_select.${entityActivitySelect}" stateNotTo);
|
||||
|
||||
harmonyChangedTo = stateTo: (helper.trigger.stateTo entityHarmonyActivitySelect stateTo);
|
||||
harmonyChangedNotTo = stateNotTo: (helper.trigger.stateNotTo entityHarmonyActivitySelect stateNotTo);
|
||||
in
|
||||
{
|
||||
input_boolean = {
|
||||
"${entityVolumeMute}" = {
|
||||
name = "Wohnzimmer TV Mute";
|
||||
icon = "mdi:volume-mute";
|
||||
};
|
||||
};
|
||||
|
||||
input_number = {
|
||||
"${entityVolumeLevel}" = {
|
||||
name = "Wohnzimmer TV Lautstärke";
|
||||
icon = "mdi:volume-high";
|
||||
unit_of_measurement = "%";
|
||||
min = "0.0";
|
||||
max = "1.0";
|
||||
step = "0.01";
|
||||
};
|
||||
};
|
||||
|
||||
input_select = {
|
||||
"${entityActivitySelect}" = {
|
||||
name = "Wohnzimmer TV Aktivität";
|
||||
options = [
|
||||
activityOptionOff
|
||||
activityOptionMusic
|
||||
activityOptionFireTV
|
||||
activityOptionXBOX
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
media_player = [
|
||||
{
|
||||
platform = "universal";
|
||||
name = "Wohnzimmer TV Universal";
|
||||
device_class = "tv";
|
||||
unique_id = "media_player_universal_wohnzimmer_tv";
|
||||
|
||||
children = [
|
||||
entityMediaplayerFireTV
|
||||
entityMediaplayerXBOX
|
||||
entityMediaplayerZeppelin
|
||||
];
|
||||
|
||||
active_child_template = ''
|
||||
{% if is_state('input_select.${entityActivitySelect}', '${activityOptionMusic}') %}
|
||||
${entityMediaplayerZeppelin}
|
||||
{% elif is_state('input_select.${entityActivitySelect}', '${activityOptionFireTV}') %}
|
||||
${entityMediaplayerFireTV}
|
||||
{% elif is_state('input_select.${entityActivitySelect}', '${activityOptionXBOX}') %}
|
||||
${entityMediaplayerXBOX}
|
||||
{% endif %}
|
||||
'';
|
||||
state_template = ''
|
||||
{% if is_state('input_select.${entityActivitySelect}', '${activityOptionMusic}') %}
|
||||
{{ states('${entityMediaplayerZeppelin}') }}
|
||||
{% elif is_state('input_select.${entityActivitySelect}', '${activityOptionFireTV}') %}
|
||||
{{ states('${entityMediaplayerFireTV}') }}
|
||||
{% elif is_state('input_select.${entityActivitySelect}', '${activityOptionXBOX}') %}
|
||||
{{ states('${entityMediaplayerXBOX}') }}
|
||||
{% else %}
|
||||
off
|
||||
{% endif %}
|
||||
'';
|
||||
|
||||
commands = {
|
||||
turn_on = tvSelect activityOptionFireTV;
|
||||
turn_off = tvSelect activityOptionOff;
|
||||
volume_set = helper.action.callService "input_number.set_value" "input_number.${entityVolumeLevel}" // {data.value = "{{ volume_level }}";};
|
||||
volume_up = helper.action.callService "input_number.increment" "input_number.${entityVolumeLevel}";
|
||||
volume_down = helper.action.callService "input_number.decrement" "input_number.${entityVolumeLevel}";
|
||||
volume_mute = helper.action.callService "input_boolean.toggle" "input_boolean.${entityVolumeMute}";
|
||||
};
|
||||
|
||||
attributes = {
|
||||
is_volume_muted = "input_boolean.${entityVolumeMute}";
|
||||
volume_level = "input_number.${entityVolumeLevel}";
|
||||
};
|
||||
}
|
||||
];
|
||||
|
||||
automation = [
|
||||
(mkRokuVolumeAutomation "Up" "increment")
|
||||
(mkRokuVolumeAutomation "Down" "decrement")
|
||||
(mkAutomation "roku_vol_mute" [(rokuButtonPressed "Right")] [(helper.action.callService "input_boolean.toggle" "input_boolean.${entityVolumeMute}")])
|
||||
(mkAutomation "sync_off_to_harmony" [(tvChangedTo activityOptionOff)] [(harmonySelect activityOptionOffHarmony)])
|
||||
(mkAutomation "sync_activity_to_harmony" [(tvChangedNotTo activityOptionOff)] [(harmonySelect "{{ trigger.to_state.state }}")])
|
||||
(mkAutomation "sync_off_from_harmony" [(harmonyChangedTo activityOptionOffHarmony)] [(tvSelect activityOptionOff)])
|
||||
(mkAutomation "sync_activity_from_harmony" [(harmonyChangedNotTo activityOptionOffHarmony)] [(tvSelect "{{ trigger.to_state.state }}")])
|
||||
(
|
||||
mkAutomationCondition
|
||||
"set_speaker_volume"
|
||||
[
|
||||
(helper.trigger.state "input_number.${entityVolumeLevel}")
|
||||
(helper.trigger.stateTo "input_boolean.${entityVolumeMute}" "off")
|
||||
(helper.trigger.stateFrom entityMediaplayerZeppelin "unavailable")
|
||||
]
|
||||
[{
|
||||
condition = "state";
|
||||
entity_id = "input_boolean.${entityVolumeMute}";
|
||||
state = "off";
|
||||
}]
|
||||
[(helper.action.callService "media_player.volume_set" entityMediaplayerZeppelin // {data.volume_level = "{{ states(\"input_number.${entityVolumeLevel}\") }}";})]
|
||||
)
|
||||
(
|
||||
mkAutomation
|
||||
"mute_speaker"
|
||||
[(helper.trigger.stateTo "input_boolean.${entityVolumeMute}" "on")]
|
||||
[(helper.action.callService "media_player.volume_set" entityMediaplayerZeppelin // {data.volume_level = "0";})]
|
||||
)
|
||||
(
|
||||
mkAutomation
|
||||
"switch_off_tv"
|
||||
[
|
||||
(tvChangedTo activityOptionOff)
|
||||
(tvChangedTo activityOptionMusic)
|
||||
]
|
||||
(helper.action.delayed (helper.action.turnOff entitySwitchTV) switchDelaySecondsTV)
|
||||
)
|
||||
(
|
||||
mkAutomation
|
||||
"switch_off_firetv"
|
||||
[
|
||||
(tvChangedTo activityOptionOff)
|
||||
(tvChangedTo activityOptionMusic)
|
||||
(tvChangedTo activityOptionXBOX)
|
||||
]
|
||||
(helper.action.delayed (helper.action.turnOff entitySwitchFireTV) switchDelaySecondsFireTV)
|
||||
)
|
||||
(
|
||||
mkAutomation
|
||||
"switch_off_xbox"
|
||||
[
|
||||
(tvChangedTo activityOptionOff)
|
||||
(tvChangedTo activityOptionMusic)
|
||||
(tvChangedTo activityOptionFireTV)
|
||||
]
|
||||
(helper.action.delayed (helper.action.turnOff entitySwitchXBOX) switchDelaySecondsXBOXOff)
|
||||
)
|
||||
(
|
||||
mkAutomation
|
||||
"switch_off_zeppelin"
|
||||
[(tvChangedTo activityOptionOff)]
|
||||
(helper.action.delayed (helper.action.turnOff entitySwitchZeppelin) switchDelaySecondsZeppelin)
|
||||
)
|
||||
(
|
||||
mkAutomation
|
||||
"switch_on_tv"
|
||||
[
|
||||
(tvChangedTo activityOptionFireTV)
|
||||
(tvChangedTo activityOptionXBOX)
|
||||
]
|
||||
(helper.action.delayed (helper.action.turnOn entitySwitchTV) switchDelaySecondsTV)
|
||||
)
|
||||
(
|
||||
mkAutomation
|
||||
"switch_on_firetv"
|
||||
[(tvChangedTo activityOptionFireTV)]
|
||||
(helper.action.delayed (helper.action.turnOn entitySwitchFireTV) switchDelaySecondsFireTV)
|
||||
)
|
||||
(
|
||||
mkAutomation
|
||||
"switch_on_xbox"
|
||||
[(tvChangedTo activityOptionXBOX)]
|
||||
(helper.action.delayed (helper.action.turnOn entitySwitchXBOX) switchDelaySecondsXBOXOn)
|
||||
)
|
||||
(
|
||||
mkAutomation
|
||||
"switch_on_zeppelin"
|
||||
[(tvChangedNotTo activityOptionOff)]
|
||||
(helper.action.delayed (helper.action.turnOn entitySwitchZeppelin) switchDelaySecondsZeppelin)
|
||||
)
|
||||
];
|
||||
}
|
|
@ -1,304 +0,0 @@
|
|||
{
|
||||
flake,
|
||||
config,
|
||||
pkgs,
|
||||
python3Packages,
|
||||
inputs,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
|
||||
{
|
||||
age.secrets.home-assistant_giggles_secrets = {
|
||||
file = "${flake.self}/secrets/home-assistant_giggles_secrets.age";
|
||||
path = "${config.services.home-assistant.configDir}/secrets.yaml";
|
||||
owner = config.systemd.services.home-assistant.serviceConfig.User;
|
||||
group = config.systemd.services.home-assistant.serviceConfig.Group;
|
||||
mode = "0644";
|
||||
};
|
||||
|
||||
users.users."hass".extraGroups = ["dialout"];
|
||||
|
||||
networking.firewall.allowedTCPPortRanges = [{from = 40000; to = 41000;}];
|
||||
networking.firewall.allowedUDPPortRanges = [{from = 40000; to = 41000;}];
|
||||
|
||||
pub-solar.home-assistant = {
|
||||
enable = true;
|
||||
extraComponents = [
|
||||
"default_config"
|
||||
"homeassistant_hardware"
|
||||
"homeassistant_sky_connect"
|
||||
|
||||
"apcupsd"
|
||||
"androidtv"
|
||||
"androidtv_remote"
|
||||
"cast"
|
||||
"esphome"
|
||||
"emulated_hue"
|
||||
"emulated_roku"
|
||||
"harmony"
|
||||
"homekit_controller"
|
||||
"icloud"
|
||||
"ipp"
|
||||
"jellyfin"
|
||||
"luci"
|
||||
"met"
|
||||
"nina"
|
||||
"python_script"
|
||||
"radio_browser"
|
||||
"rpi_power"
|
||||
"shopping_list"
|
||||
"spotify"
|
||||
"tasmota"
|
||||
"unifi"
|
||||
"upnp"
|
||||
"wyoming"
|
||||
"vacuum"
|
||||
"xbox"
|
||||
"xiaomi_aqara"
|
||||
"xiaomi_miio"
|
||||
"zeroconf"
|
||||
];
|
||||
|
||||
extraPackages = python311Packages:
|
||||
with python311Packages; [
|
||||
# esphome
|
||||
aiodiscover
|
||||
scapy
|
||||
|
||||
# deutsche bahn
|
||||
schiene
|
||||
|
||||
# dwd
|
||||
dwdwfsapi
|
||||
|
||||
# forecast_solar
|
||||
(callPackage ./forecast-solar.nix {})
|
||||
|
||||
# hacs
|
||||
aiogithubapi
|
||||
|
||||
# owntone
|
||||
pyatv
|
||||
(callPackage ./pyforked-daapd.nix {})
|
||||
|
||||
# philips_airpurifier_coap
|
||||
(callPackage ./aioairctrl.nix {})
|
||||
|
||||
# totp
|
||||
pyotp
|
||||
pyqrcode
|
||||
];
|
||||
|
||||
config = {
|
||||
homeassistant = {
|
||||
name = "Wohnung";
|
||||
|
||||
country = "DE";
|
||||
currency = "EUR";
|
||||
language = "de";
|
||||
temperature_unit = "C";
|
||||
time_zone = "Europe/Berlin";
|
||||
unit_system = "metric";
|
||||
|
||||
latitude = "52.31501090166047";
|
||||
longitude = "8.910633035293603";
|
||||
elevation = "59";
|
||||
|
||||
external_url = "https://ha2.gssws.de";
|
||||
internal_url = "http://192.168.42.11:8123";
|
||||
|
||||
packages = {
|
||||
package_light = (import ./home-assistant-package-light.nix);
|
||||
package_vacuum = (import ./home-assistant-package-vacuum.nix);
|
||||
package_wohnzimmer_tv = (import ./home-assistant-package-wohnzimmer-tv.nix);
|
||||
};
|
||||
|
||||
customize = (import ./home-assistant-customize-vacuum.nix) // { };
|
||||
};
|
||||
|
||||
http = {
|
||||
ip_ban_enabled = false;
|
||||
use_x_forwarded_for = true;
|
||||
trusted_proxies = [
|
||||
"127.0.0.1"
|
||||
"10.254.0.21"
|
||||
"10.0.1.5"
|
||||
"10.0.1.6"
|
||||
];
|
||||
};
|
||||
|
||||
default_config = {};
|
||||
energy = {};
|
||||
|
||||
"automation ui" = "!include automations.yaml";
|
||||
|
||||
device_tracker = [
|
||||
{
|
||||
platform = "luci";
|
||||
host = "192.168.42.1";
|
||||
username = "!secret router_admin_username";
|
||||
password = "!secret router_admin_password";
|
||||
}
|
||||
];
|
||||
|
||||
emulated_hue = {
|
||||
host_ip = "172.16.0.11";
|
||||
listen_port = 40000;
|
||||
expose_by_default = false;
|
||||
entities = {
|
||||
"light.light_wohnzimmer_kugel_links" = {
|
||||
name = "Kugel links";
|
||||
};
|
||||
"light.light_wohnzimmer_kugel_rechts" = {
|
||||
name = "Kugel rechts";
|
||||
};
|
||||
"light.light_wohnzimmer_klemmlampe" = {
|
||||
name = "Klemmlampe";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
emulated_roku = {
|
||||
servers = [{
|
||||
name = "Home Assistant";
|
||||
host_ip = "172.16.0.11";
|
||||
listen_port = 40001;
|
||||
}];
|
||||
};
|
||||
|
||||
python_script = {};
|
||||
|
||||
waste_collection_schedule = {
|
||||
sources = [
|
||||
{
|
||||
name = "jumomind_de";
|
||||
args = {
|
||||
service_id = "sbm";
|
||||
city = "Minden";
|
||||
street = "Schwerinstr.";
|
||||
house_number = "17b";
|
||||
};
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
zone = [
|
||||
{
|
||||
name = "Home";
|
||||
latitude = "52.31501090166047";
|
||||
longitude = "8.910633035293603";
|
||||
radius = "50";
|
||||
}
|
||||
{
|
||||
name = "DKSB";
|
||||
latitude = "52.31249954762553";
|
||||
longitude = "8.910920619964601";
|
||||
radius = "60";
|
||||
}
|
||||
{
|
||||
name = "Hainweg";
|
||||
latitude = "52.3176809501406";
|
||||
longitude = "8.890610933303835";
|
||||
radius = "60";
|
||||
}
|
||||
{
|
||||
name = "Lande";
|
||||
latitude = "52.35688908037632";
|
||||
longitude = "8.898582458496096";
|
||||
radius = "87";
|
||||
}
|
||||
{
|
||||
name = "Rürups";
|
||||
latitude = "52.317152702118655";
|
||||
longitude = "8.89446449221293";
|
||||
radius = "70";
|
||||
}
|
||||
{
|
||||
name = "Schule";
|
||||
latitude = "52.30213492276748";
|
||||
longitude = "8.88126075267792";
|
||||
radius = "200";
|
||||
}
|
||||
{
|
||||
name = "Sokos";
|
||||
latitude = "50.92777444599559";
|
||||
longitude = "6.583169284373658";
|
||||
radius = "50";
|
||||
}
|
||||
{
|
||||
name = "Wohnung Aachen";
|
||||
latitude = "50.7800954893528";
|
||||
longitude = "6.154607534408569";
|
||||
radius = "13";
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
mqtt = {
|
||||
enable = true;
|
||||
users = {
|
||||
ha = {
|
||||
acl = [
|
||||
"readwrite #"
|
||||
];
|
||||
hashedPassword = "$7$101$lFt8hQl3O8aKF+bO$pcZuI18IT5t4/fpKZmLZQwQs+vcbxZdAQAYJOxRwXGYsxCRjb8jUSU+ZRlpqokOGqf/Cgvymfvml+yoGaC8eaw==";
|
||||
};
|
||||
z2m = {
|
||||
acl = [
|
||||
"readwrite #"
|
||||
];
|
||||
hashedPassword = "$7$101$M0Q/s9ReWPaMy+pT$Y8t9DwmW3y74lyvYrCE+sqEcz9yGG9VaHw8vt4wVZgUVVV9muY00ymjkwsTNtaTIlnQyB7z7POPLT3PURtQfeg==";
|
||||
};
|
||||
|
||||
frigate = {
|
||||
acl = [
|
||||
"readwrite #"
|
||||
];
|
||||
hashedPassword = "$7$101$BZvoqhiaWo8TbFEv$KlE8XiE9dhfNV50SoUiBjTgnvSRaCwWdouuVcN4ZeHkR7/4JufQ7adW0VhVmtpv+6V9KOPDlN3wRaV+5eVlF3Q==";
|
||||
};
|
||||
nuki_wohnung = {
|
||||
acl = [
|
||||
"readwrite #"
|
||||
];
|
||||
hashedPassword = "$7$101$21wWveYvOyQKNuhd$rXD8d4F+Wf4k6LDkM09bsfkQfc+iXakRaH2sygYgOQqfrJ5Egt8D+9LVKa9ZQ12HLPSHDo0bP8ygVmY6iVJCjQ==";
|
||||
};
|
||||
poffertjes = {
|
||||
acl = [
|
||||
"readwrite #"
|
||||
];
|
||||
hashedPassword = "$7$101$n5J9RKGzFF7bOsOH$YNPQawxsfuDZk/N6NrNzkE5rEfTRlCW5Fjpk6kgwyTg4C6Peyz4I79ii4UMSANJ8DFNsPRL1KohCcXK07SMW2w==";
|
||||
};
|
||||
shelly1_flur_deckenlicht = {
|
||||
acl = [
|
||||
"readwrite #"
|
||||
];
|
||||
hashedPassword = "$7$101$n0PyELB9214BiluQ$P24lJlXDpKLaGSerrp51z5UUl3wYSek9SbJN+buqoS9acrCn7s3mtSLZfeMP0JT8zXx83GJrNwlDaA0BOu00xg==";
|
||||
};
|
||||
shelly25_abstellraum = {
|
||||
acl = [
|
||||
"readwrite #"
|
||||
];
|
||||
hashedPassword = "$7$101$n9IcybeGEAhnoWv5$RSnkEJFgDsrKUzEaLfNIa/5v4gkTMZSAq2bb7KzWSG6zaufHdnvtDZT+q7dZ3pkBFXndKtoelmuvm7XJLJC1mg==";
|
||||
};
|
||||
shelly25_badezimmer = {
|
||||
acl = [
|
||||
"readwrite #"
|
||||
];
|
||||
hashedPassword = "$7$101$PNWBSZUE4Ar5dOhx$2u6dneedx7OLOjH1auoax2AC1GP4oVcXe4OAmO3riNpzXZF9V1cJ7k/GREx9/vO/ONt5PuUygilk3X4SIYnf9A==";
|
||||
};
|
||||
tasmota_wohnzimmer_tv_steckdosenleiste = {
|
||||
acl = [
|
||||
"readwrite #"
|
||||
];
|
||||
hashedPassword = "$7$101$cywQWWzxPUUpUqdC$Q9tjqE4bW0VaNMVKIuts/wuyFetC//PyLVcRtpaK02HxwlTPY7jWivXUBA/t8l0wGZsS8lsiOIAu8e6bHb+7Xw==";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
zigbee2mqtt = {
|
||||
enable = true;
|
||||
device = "/dev/serial/by-id/usb-Nabu_Casa_SkyConnect_v1.0_aaf7050fdb42ed11bb2843ab2a61ed69-if00-port0";
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,17 +0,0 @@
|
|||
{
|
||||
flake,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
config = {
|
||||
age.secrets.home_controller_wireguard.file = "${flake.self}/secrets/home_controller_giggles_wireguard_key.age";
|
||||
|
||||
pub-solar.home-controller = {
|
||||
enable = true;
|
||||
ownIp = "10.0.1.11";
|
||||
|
||||
wireguardPrivateKeyFile = "/run/agenix/home_controller_wireguard";
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,51 +0,0 @@
|
|||
{
|
||||
pkgs,
|
||||
config,
|
||||
...
|
||||
}: let
|
||||
serviceAddress = "10.10.41.11";
|
||||
containerStateDir = "/data";
|
||||
hostStateDir = "/srv/container/lrad";
|
||||
in {
|
||||
containers."lrad" = {
|
||||
privateNetwork = true;
|
||||
hostAddress = "10.10.41.1";
|
||||
localAddress = serviceAddress;
|
||||
|
||||
bindMounts."${containerStateDir}" = {
|
||||
hostPath = hostStateDir;
|
||||
isReadOnly = false;
|
||||
};
|
||||
|
||||
config = {
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
networking.firewall.allowedTCPPorts = [63080];
|
||||
|
||||
#users.users."tang".isSystemUser = true;
|
||||
|
||||
systemd.services."tangd" = {
|
||||
enable = true;
|
||||
# TODO: require data/tangd to exist
|
||||
serviceConfig = {
|
||||
ExecStart = "${pkgs.tang}/bin/tangd ${containerStateDir}/data/tangd";
|
||||
StandardInput = "socket";
|
||||
StandardOutput = "socket";
|
||||
StandardError = "journal";
|
||||
User = "tang";
|
||||
};
|
||||
};
|
||||
|
||||
systemd.sockets."tangd" = {
|
||||
enable = true;
|
||||
listenStreams = ["63080"];
|
||||
wantedBy = ["sockets.target"];
|
||||
socketConfig = {
|
||||
Accept = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,150 +0,0 @@
|
|||
{...}:
|
||||
|
||||
let
|
||||
vlan101Hosts = [
|
||||
# switches
|
||||
{mac = "28:80:88:72:ae:60"; ip = "10.0.42.15"; hostname = "sw-wohnung";} # statically configured
|
||||
{mac = "28:87:ba:24:6a:2b"; ip = "10.0.42.16"; hostname = "sw-wohnzimmer";} # statically configured
|
||||
|
||||
# access points
|
||||
{mac = "18:e8:29:c6:29:84"; ip = "10.0.42.21"; hostname = "ap-caro";}
|
||||
{mac = "e4:38:83:e7:00:10"; ip = "10.0.42.22"; hostname = "ap-hendrik";}
|
||||
{mac = "e4:38:83:e7:0a:c4"; ip = "10.0.42.23"; hostname = "ap-wohnzimmer";}
|
||||
|
||||
# security devices
|
||||
{mac = "e0:ca:3c:7d:37:5b"; ip = "10.0.42.31"; hostname = "cam-wohnzimmer";}
|
||||
];
|
||||
|
||||
vlan102Hosts = [
|
||||
{mac = "38:1a:52:04:37:d8"; ip = "172.16.0.15"; hostname = "printer";}
|
||||
|
||||
{mac = "3c:e9:0e:87:d2:1c"; ip = "172.16.0.21"; hostname = "nspanel-hendrik";}
|
||||
{mac = "3c:e9:0e:87:ef:d0"; ip = "172.16.0.22"; hostname = "nspanel-schlafzimmer";}
|
||||
{mac = "98:0c:33:fe:3d:a8"; ip = "172.16.0.23"; hostname = "nuki-wohnung";}
|
||||
{mac = "c8:5c:cc:5c:54:06"; ip = "172.16.0.24"; hostname = "presence-wohnzimmer";}
|
||||
{mac = "c8:5c:cc:5c:28:7b"; ip = "172.16.0.25"; hostname = "presence-hendrik";}
|
||||
{mac = "04:78:63:7f:0e:bb"; ip = "172.16.0.26"; hostname = "airpurifier-wohnzimmer";}
|
||||
{mac = "48:e7:29:c1:a3:f0"; ip = "172.16.0.27"; hostname = "nspanel-caro";}
|
||||
{mac = "5c:c5:63:eb:e8:b8"; ip = "172.16.0.28"; hostname = "poffertjes";}
|
||||
{mac = "d0:ba:e4:e7:7d:d5"; ip = "172.16.0.29"; hostname = "airpurifier-hendrik";}
|
||||
{mac = "98:f4:ab:f2:43:98"; ip = "172.16.0.30"; hostname = "shelly1-flur-deckenlicht";}
|
||||
{mac = "a4:cf:12:ba:72:c1"; ip = "172.16.0.31"; hostname = "shelly25-abstellraum";}
|
||||
{mac = "c8:2b:96:11:10:46"; ip = "172.16.0.32"; hostname = "shelly25-badezimmer";}
|
||||
{mac = "24:62:ab:41:06:f2"; ip = "172.16.0.33"; hostname = "tasmota-tv-steckdosenleiste";}
|
||||
{mac = "c8:db:26:0d:4f:f4"; ip = "172.16.0.34"; hostname = "harmonyhub-tv";}
|
||||
];
|
||||
|
||||
vlan104Hosts = [
|
||||
{mac = "30:58:90:1a:3b:ef"; ip = "10.42.0.21"; hostname = "box-hendrik";}
|
||||
{mac = "30:58:90:19:b5:03"; ip = "10.42.0.22"; hostname = "box-schlafzimmer";}
|
||||
{mac = "30:58:90:28:7e:30"; ip = "10.42.0.23"; hostname = "box-esstisch";}
|
||||
|
||||
{mac = "1c:53:f9:23:d7:c4"; ip = "10.42.0.31"; hostname = "nh-hendrik";}
|
||||
{mac = "1c:53:f9:14:7b:65"; ip = "10.42.0.32"; hostname = "nh-kueche";}
|
||||
{mac = "1c:53:f9:1c:9e:22"; ip = "10.42.0.33"; hostname = "nh-wohnzimmer";}
|
||||
{mac = "20:1f:3b:96:9f:29"; ip = "10.42.0.34"; hostname = "nm-schlafzimmer";}
|
||||
{mac = "6c:ad:f8:73:a0:94"; ip = "10.42.0.35"; hostname = "cc-wohnzimmer";}
|
||||
{mac = "ec:66:d1:8a:79:71"; ip = "10.42.0.36"; hostname = "zeppelin-wohnzimmer";}
|
||||
{mac = "c0:91:b9:1e:2b:80"; ip = "10.42.0.37"; hostname = "firetv-wohnzimmer";}
|
||||
{mac = "cc:60:c8:14:26:2c"; ip = "10.42.0.38"; hostname = "xbox-wohnzimmer";}
|
||||
];
|
||||
|
||||
mkDnsmasqHosts = hosts : map (h : "${h.mac},${h.hostname},${h.ip}") hosts;
|
||||
|
||||
mkKeaHosts = hosts : map (h : { hw-address = h.mac; ip-address = h.ip; }) hosts;
|
||||
mkKeaOptions = router: dns: mtu:
|
||||
[
|
||||
{
|
||||
name = "routers";
|
||||
data = "${router}";
|
||||
}
|
||||
{
|
||||
name = "domain-name-servers";
|
||||
data = "${dns}";
|
||||
}
|
||||
{
|
||||
name = "interface-mtu";
|
||||
data = "${toString mtu}";
|
||||
}
|
||||
];
|
||||
mkKeaSubnet = interface : subnet : pool : options : hosts : {
|
||||
subnet = subnet;
|
||||
interface = interface;
|
||||
pools = [{ pool = pool; }];
|
||||
option-data = mkKeaOptions options.router options.dns options.mtu;
|
||||
reservations = mkKeaHosts hosts;
|
||||
};
|
||||
|
||||
enableKea = true;
|
||||
enableDnsmasq = false;
|
||||
|
||||
mtu = 1500;
|
||||
in
|
||||
{
|
||||
networking.firewall.checkReversePath = false;
|
||||
networking.firewall.allowedUDPPorts = [67]; # allow dhcp request
|
||||
|
||||
services.kea.dhcp4 = {
|
||||
enable = enableKea;
|
||||
settings = {
|
||||
authoritative = true;
|
||||
interfaces-config = {
|
||||
interfaces = ["vlan101" "vlan102" "vlan104"];
|
||||
dhcp-socket-type = "raw";
|
||||
};
|
||||
valid-lifetime = 3600;
|
||||
host-reservation-identifiers = [ "hw-address" ];
|
||||
|
||||
subnet4 = [
|
||||
(mkKeaSubnet "vlan101" "10.0.42.0/24" "10.0.42.100 - 10.0.42.200" {router = "10.0.42.1"; dns = "10.0.42.1"; mtu = mtu;} vlan101Hosts)
|
||||
(mkKeaSubnet "vlan102" "172.16.0.0/24" "172.16.0.100 - 172.16.0.200" {router = "172.16.0.1"; dns = "172.16.0.1"; mtu = mtu;} vlan102Hosts)
|
||||
(mkKeaSubnet "vlan104" "10.42.0.0/24" "10.42.0.100 - 10.42.0.200" {router = "10.42.0.1"; dns = "10.42.0.1"; mtu = mtu;} vlan104Hosts)
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
services.dnsmasq = {
|
||||
enable = enableDnsmasq;
|
||||
settings = {
|
||||
interface = [
|
||||
"vlan101" # network
|
||||
"vlan102" # iot
|
||||
"vlan104" # media
|
||||
];
|
||||
|
||||
no-resolv = true;
|
||||
no-poll = true;
|
||||
|
||||
server = [
|
||||
"1.1.1.1"
|
||||
"9.9.9.9"
|
||||
];
|
||||
|
||||
dhcp-authoritative = true;
|
||||
|
||||
dhcp-host = (mkDnsmasqHosts vlan101Hosts) ++
|
||||
(mkDnsmasqHosts vlan102Hosts) ++
|
||||
(mkDnsmasqHosts vlan104Hosts);
|
||||
|
||||
dhcp-range = [
|
||||
"vlan101,10.0.42.51,10.0.42.100"
|
||||
"vlan102,172.16.0.101,172.16.0.150"
|
||||
"vlan104,10.42.0.51,10.42.0.100"
|
||||
];
|
||||
|
||||
dhcp-option = [
|
||||
"option:dns-server,1.1.1.1"
|
||||
"option:mtu,${mtu}"
|
||||
|
||||
# vlan101
|
||||
"vlan101,option:router,10.0.42.1"
|
||||
|
||||
# vlan102
|
||||
"vlan102,option:router,172.16.0.1"
|
||||
|
||||
# vlan104
|
||||
"vlan104,option:router,10.42.0.1"
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,55 +0,0 @@
|
|||
{lib, ...}: {
|
||||
networking = {
|
||||
enableIPv6 = false;
|
||||
useDHCP = false;
|
||||
vlans = {
|
||||
vlan101 = {
|
||||
id = 101;
|
||||
interface = "eth0";
|
||||
}; # network vlan
|
||||
vlan102 = {
|
||||
id = 102;
|
||||
interface = "eth0";
|
||||
}; # iot vlan
|
||||
vlan104 = {
|
||||
id = 104;
|
||||
interface = "eth0";
|
||||
}; # media vlan
|
||||
};
|
||||
interfaces = {
|
||||
eth0 = {
|
||||
useDHCP = true;
|
||||
mtu = 1460;
|
||||
};
|
||||
|
||||
vlan101 = {
|
||||
mtu = 1460;
|
||||
ipv4.addresses = [
|
||||
{
|
||||
address = "10.0.42.11";
|
||||
prefixLength = 24;
|
||||
}
|
||||
];
|
||||
};
|
||||
vlan102 = {
|
||||
mtu = 1460;
|
||||
ipv4.addresses = [
|
||||
{
|
||||
address = "172.16.0.11";
|
||||
prefixLength = 24;
|
||||
}
|
||||
];
|
||||
};
|
||||
vlan104 = {
|
||||
mtu = 1460;
|
||||
ipv4.addresses = [
|
||||
{
|
||||
address = "10.42.0.11";
|
||||
prefixLength = 24;
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
networkmanager.enable = lib.mkForce false;
|
||||
};
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
{ pkgs, python311 }:
|
||||
|
||||
let
|
||||
pyLibrespotJava = python311.pkgs.buildPythonPackage rec {
|
||||
pname = "pylibrespot-java";
|
||||
version = "0.1.0";
|
||||
src = pkgs.fetchPypi {
|
||||
inherit pname version;
|
||||
sha256 = "DbKPW3mB5IMhj0EqLhQpZ66wGjOGWxhaXM39IjkN/yA=";
|
||||
};
|
||||
|
||||
propagatedBuildInputs = [
|
||||
python311.pkgs.aiohttp
|
||||
];
|
||||
};
|
||||
in
|
||||
python311.pkgs.buildPythonPackage rec {
|
||||
pname = "pyforked-daapd";
|
||||
version = "0.1.14";
|
||||
src = pkgs.fetchPypi {
|
||||
inherit pname version;
|
||||
sha256 = "v1NOlwP8KtBsQiqwbx1y8p8lABEuEJdNhvR2kGzLxKs=";
|
||||
};
|
||||
|
||||
propagatedBuildInputs = [
|
||||
pyLibrespotJava
|
||||
python311.pkgs.aiohttp
|
||||
];
|
||||
}
|
|
@ -1,27 +0,0 @@
|
|||
{ pkgs, python311 }:
|
||||
let
|
||||
pycryptodomex = python311.pkgs.buildPythonPackage rec {
|
||||
pname = "pycryptodomex";
|
||||
version = "3.18.0";
|
||||
src = pkgs.fetchPypi {
|
||||
inherit pname version;
|
||||
sha256 = "Pj7LX+l558G7ACflGDQKz37mBBXXkpXlJR0Txo3eV24=";
|
||||
};
|
||||
};
|
||||
in
|
||||
python311.pkgs.buildPythonPackage rec {
|
||||
pname = "aioairctrl";
|
||||
version = "0.2.4";
|
||||
|
||||
src = pkgs.fetchFromGitHub {
|
||||
owner = "kongo09";
|
||||
repo = "aioairctrl";
|
||||
rev = "v${version}";
|
||||
sha256 = "JBXh590wu85ig+LZCgG9S7y9uLOKednFJ/1UfDLz5Fo=";
|
||||
};
|
||||
|
||||
propagatedBuildInputs = [
|
||||
python311.pkgs.aiocoap
|
||||
pycryptodomex
|
||||
];
|
||||
}
|
|
@ -1,58 +0,0 @@
|
|||
{
|
||||
pkgs,
|
||||
config,
|
||||
...
|
||||
}: let
|
||||
containerStateDir = "/data";
|
||||
hostStateDir = "/opt/tangd";
|
||||
servicePort = 8081;
|
||||
in {
|
||||
networking.firewall.allowedTCPPorts = [servicePort];
|
||||
|
||||
containers."tang" = {
|
||||
autoStart = true;
|
||||
ephemeral = true;
|
||||
bindMounts."${containerStateDir}" = {
|
||||
hostPath = hostStateDir;
|
||||
isReadOnly = false;
|
||||
};
|
||||
|
||||
config = {
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
networking.firewall.enable = false;
|
||||
|
||||
users.groups."_tang" = {};
|
||||
|
||||
users.users."_tang" = {
|
||||
group = "_tang";
|
||||
isSystemUser = true;
|
||||
};
|
||||
|
||||
environment.systemPackages = with pkgs; [jose tang];
|
||||
|
||||
systemd.services."tangd@" = {
|
||||
enable = true;
|
||||
serviceConfig = {
|
||||
ExecStartPre = "${pkgs.bash}/bin/bash -c \"mkdir -p ${containerStateDir}/tang-db\"";
|
||||
ExecStart = "${pkgs.tang}/libexec/tangd ${containerStateDir}/tang-db";
|
||||
User = "_tang";
|
||||
Group = "_tang";
|
||||
};
|
||||
};
|
||||
|
||||
systemd.sockets."tangd" = {
|
||||
enable = true;
|
||||
listenStreams = ["${toString servicePort}"];
|
||||
wantedBy = ["sockets.target"];
|
||||
socketConfig = {
|
||||
Accept = true;
|
||||
};
|
||||
};
|
||||
|
||||
system.stateVersion = "22.11";
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
{ pkgs, lib, ...}:
|
||||
|
||||
{
|
||||
nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [ "mongodb" "unifi-controller" ];
|
||||
|
||||
networking.firewall.allowedTCPPorts = [8443]; # open unifi web interface port
|
||||
|
||||
services.unifi = {
|
||||
enable = true;
|
||||
unifiPackage = pkgs.unifi7;
|
||||
openFirewall = true;
|
||||
};
|
||||
}
|
|
@ -1,19 +0,0 @@
|
|||
set $left 'Dell Inc. DELL S2721DS D0SVQ43'
|
||||
set $middle 'Samsung Electric Company SMBX2450L 0x00003231'
|
||||
set $right 'Eizo Nanao Corporation EV2316W 39117013'
|
||||
|
||||
output $left {
|
||||
scale 1
|
||||
pos 0 0
|
||||
transform 270
|
||||
}
|
||||
|
||||
output $middle {
|
||||
scale 1
|
||||
pos 1440 1150
|
||||
}
|
||||
|
||||
output $right {
|
||||
scale 1
|
||||
pos 3360 1150
|
||||
}
|
|
@ -1,102 +0,0 @@
|
|||
# Edit this configuration file to define what should be installed on
|
||||
# your system. Help is available in the configuration.nix(5) man page
|
||||
# and in the NixOS manual (accessible by running ‘nixos-help’).
|
||||
|
||||
{ config, pkgs, lib, ... }:
|
||||
|
||||
let
|
||||
psCfg = config.pub-solar;
|
||||
in
|
||||
{
|
||||
# work
|
||||
pub-solar.docker.enable = true;
|
||||
pub-solar.nextcloud.enable = true;
|
||||
pub-solar.social.enable = true;
|
||||
pub-solar.office.enable = true;
|
||||
|
||||
systemd.enableUnifiedCgroupHierarchy = true;
|
||||
|
||||
environment.systemPackages = with pkgs; [
|
||||
jetbrains.goland
|
||||
minicom
|
||||
openjdk11
|
||||
putty
|
||||
remmina
|
||||
thunderbird
|
||||
vscode
|
||||
vscode-extensions.golang.go
|
||||
vscode-extensions.ms-python.python
|
||||
wireshark
|
||||
go_1_20
|
||||
meld
|
||||
|
||||
ardour
|
||||
helm
|
||||
];
|
||||
|
||||
# unfree
|
||||
hardware.enableRedistributableFirmware = true;
|
||||
|
||||
# graphical
|
||||
pub-solar.graphical.enable = true;
|
||||
pub-solar.sway.enable = true;
|
||||
|
||||
# daw
|
||||
pub-solar.audio.enable = lib.mkForce true;
|
||||
musnix.enable = true;
|
||||
services.pipewire.jack.enable = true;
|
||||
|
||||
# gaming
|
||||
pub-solar.gaming.enable = true;
|
||||
|
||||
# emulated building for raspi
|
||||
boot.binfmt.emulatedSystems = [ "aarch64-linux" ];
|
||||
|
||||
home-manager.users."${psCfg.user.name}".xdg.configFile = lib.mkIf psCfg.sway.enable {
|
||||
"sway/config.d/10-screens.conf".source = ./.config/sway/config.d/screens.conf;
|
||||
};
|
||||
|
||||
pub-solar.paranoia.enable = true;
|
||||
|
||||
programs.ausweisapp.enable = true;
|
||||
services.pcscd = {
|
||||
enable = true;
|
||||
plugins = [ pkgs.pcsc-cyberjack ];
|
||||
};
|
||||
|
||||
# Set your time zone.
|
||||
time.timeZone = "Europe/Berlin";
|
||||
time.hardwareClockInLocalTime = true; # easiest quirk for windows time offset feature
|
||||
|
||||
# The global useDHCP flag is deprecated, therefore explicitly set to false here.
|
||||
# Per-interface useDHCP will be mandatory in the future, so this generated config
|
||||
# replicates the default behaviour.
|
||||
networking.dhcpcd.wait = "background";
|
||||
networking.useDHCP = false;
|
||||
networking.interfaces.eno1 = {
|
||||
useDHCP = true;
|
||||
wakeOnLan = {
|
||||
enable = true;
|
||||
};
|
||||
};
|
||||
networking.networkmanager.enable = lib.mkForce false;
|
||||
|
||||
nixpkgs.config.allowUnsupportedSystem = true;
|
||||
|
||||
# List services that you want to enable:
|
||||
|
||||
# Open ports in the firewall.
|
||||
networking.firewall.allowedTCPPorts = [ 22 ];
|
||||
# networking.firewall.allowedUDPPorts = [ ... ];
|
||||
# Or disable the firewall altogether.
|
||||
# networking.firewall.enable = false;
|
||||
|
||||
# This value determines the NixOS release from which the default
|
||||
# settings for stateful data, like file locations and database versions
|
||||
# on your system were taken. It‘s perfectly fine and recommended to leave
|
||||
# this value at the release version of the first install of this system.
|
||||
# Before changing this value read the documentation for this option
|
||||
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
||||
system.stateVersion = "21.05"; # Did you read the comment?
|
||||
}
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
{ ... }: {
|
||||
imports = [
|
||||
./configuration.nix
|
||||
./hardware-configuration.nix
|
||||
];
|
||||
}
|
|
@ -1,70 +0,0 @@
|
|||
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||
# and may be overwritten by future invocations. Please make changes
|
||||
# to /etc/nixos/configuration.nix instead.
|
||||
{ config, lib, pkgs, modulesPath, ... }:
|
||||
|
||||
{
|
||||
imports =
|
||||
[
|
||||
(modulesPath + "/installer/scan/not-detected.nix")
|
||||
];
|
||||
|
||||
boot.initrd.availableKernelModules = [ "xhci_pci" "ehci_pci" "usb_storage" "usbhid" "sd_mod" "raid1" ];
|
||||
boot.initrd.kernelModules = [ "dm-snapshot" ];
|
||||
boot.kernelModules = [ "kvm-intel" ];
|
||||
boot.extraModulePackages = [ ];
|
||||
|
||||
boot.initrd.luks.devices."cryptroot" = {
|
||||
device = "/dev/disk/by-uuid/e3a0394d-8bb5-4049-bf65-90d7202163cd";
|
||||
keyFile = "/dev/disk/by-id/usb-SanDisk_Cruzer_Blade_04011806021722115743-0:0-part1";
|
||||
fallbackToPassword = true;
|
||||
bypassWorkqueues = true;
|
||||
};
|
||||
|
||||
boot.loader.systemd-boot.enable = lib.mkForce false;
|
||||
boot.loader.efi = {
|
||||
canTouchEfiVariables = true;
|
||||
efiSysMountPoint = "/boot";
|
||||
};
|
||||
boot.loader.grub = {
|
||||
efiSupport = true;
|
||||
enable = lib.mkForce true;
|
||||
extraEntries = ''
|
||||
menuentry "Windows" {
|
||||
insmod part_gpt
|
||||
insmod fat
|
||||
insmod search_fs_uuid
|
||||
insmod chain
|
||||
search --fs-uuid --set=root 02DB-F12C
|
||||
chainloader /efi/Microsoft/Boot/bootmgfw.efi
|
||||
}
|
||||
'';
|
||||
devices = [ "nodev" ];
|
||||
};
|
||||
|
||||
|
||||
fileSystems = {
|
||||
"/" =
|
||||
{
|
||||
device = "/dev/disk/by-uuid/4ad4db6d-543e-4cc5-a781-396e3b527a05";
|
||||
fsType = "ext4";
|
||||
};
|
||||
|
||||
"/boot" =
|
||||
{
|
||||
device = "/dev/disk/by-uuid/4B4A-B1B4";
|
||||
fsType = "vfat";
|
||||
};
|
||||
|
||||
"/boot2" =
|
||||
{
|
||||
device = "/dev/disk/by-uuid/4B2C-385A";
|
||||
fsType = "vfat";
|
||||
};
|
||||
};
|
||||
|
||||
swapDevices =
|
||||
[{ device = "/dev/mapper/vg0-swap"; }];
|
||||
|
||||
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||
}
|
|
@ -1,16 +0,0 @@
|
|||
# Screen brightness controls
|
||||
bindsym XF86MonBrightnessUp exec "brightnessctl -d intel_backlight set +10%; notify-send $(brightnessctl -d intel_backlight i | awk '/Current/ {print $4}')"
|
||||
bindsym XF86MonBrightnessDown exec "brightnessctl -d intel_backlight set 10%-; notify-send $(brightnessctl -d intel_backlight i | awk '/Current/ { print $4}')"
|
||||
|
||||
# Keyboard backlight brightness controls
|
||||
bindsym XF86KbdBrightnessDown exec "brightnessctl -d smc::kbd_backlight set 10%-; notify-send $(brightnessctl -d smc::kbd_backlight i | awk '/Current/ { print $4}')"
|
||||
bindsym XF86KbdBrightnessUp exec "brightnessctl -d smc::kbd_backlight set +10%; notify-send $(brightnessctl -d smc::kbd_backlight i | awk '/Current/ { print $4}')"
|
||||
|
||||
# Pulse Audio controls
|
||||
bindsym XF86AudioRaiseVolume exec pactl set-sink-volume @DEFAULT_SINK@ +5%; exec pactl set-sink-mute @DEFAULT_SINK@ 0 && notify-send 'Vol. up' #increase sound volume
|
||||
bindsym XF86AudioLowerVolume exec pactl set-sink-volume @DEFAULT_SINK@ -5%; exec pactl set-sink-mute @DEFAULT_SINK@ 0 && notify-send 'Vol. down' #decrease sound volume
|
||||
bindsym XF86AudioMute exec pactl set-sink-mute @DEFAULT_SINK@ toggle && notify-send 'Mute sound' # mute sound
|
||||
# Media player controls
|
||||
bindsym XF86AudioPlay exec "playerctl play-pause; notify-send 'Play/Pause'"
|
||||
bindsym XF86AudioNext exec "playerctl next; notify-send 'Next'"
|
||||
bindsym XF86AudioPrev exec "playerctl previous; notify-send 'Prev.'"
|
|
@ -1 +0,0 @@
|
|||
input 2:7:SynPS/2_Synaptics_TouchPad events disabled
|
|
@ -1,19 +0,0 @@
|
|||
set $left 'Dell Inc. DELL S3222DGM G1FFT63'
|
||||
set $right 'Dell Inc. DELL S2721DS D0SVQ43'
|
||||
set $bottom 'Chimei Innolux Corporation 0x14D4'
|
||||
|
||||
output $left {
|
||||
scale 1
|
||||
pos 0 690
|
||||
}
|
||||
|
||||
output $right {
|
||||
scale 1
|
||||
pos 2560 0
|
||||
transform 90
|
||||
}
|
||||
|
||||
output $bottom {
|
||||
scale 1
|
||||
pos 0 2130
|
||||
}
|
|
@ -1,27 +0,0 @@
|
|||
{self, ...}: {
|
||||
programs.ssh.extraConfig = ''
|
||||
Host builder
|
||||
Hostname data.gssws.de
|
||||
Port 2222
|
||||
User builder
|
||||
IdentitiesOnly yes
|
||||
IdentityFile /root/.ssh/id_ed25519-builder
|
||||
'';
|
||||
|
||||
nix.buildMachines = [
|
||||
{
|
||||
hostName = "builder";
|
||||
systems = ["x86_64-linux" "aarch64-linux" "i686-linux"];
|
||||
maxJobs = 40;
|
||||
speedFactor = 20;
|
||||
supportedFeatures = ["nixos-test" "benchmark" "big-parallel" "kvm"];
|
||||
mandatoryFeatures = [];
|
||||
}
|
||||
];
|
||||
|
||||
nix.distributedBuilds = true;
|
||||
nix.settings = {
|
||||
trusted-public-keys = ["chonk:1b/yLBRW2ZeL9jErW1ogMRUTq/hidJnZOxopx363JSo="];
|
||||
builders-use-substitutes = true;
|
||||
};
|
||||
}
|
|
@ -1,100 +0,0 @@
|
|||
# Edit this configuration file to define what should be installed on
|
||||
# your system. Help is available in the configuration.nix(5) man page
|
||||
# and in the NixOS manual (accessible by running ‘nixos-help’).
|
||||
{
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
let
|
||||
psCfg = config.pub-solar;
|
||||
in
|
||||
{
|
||||
imports = [
|
||||
./wireguard.nix
|
||||
./builder.nix
|
||||
];
|
||||
|
||||
pub-solar.docker.enable = true;
|
||||
pub-solar.nextcloud.enable = true;
|
||||
pub-solar.social.enable = true;
|
||||
pub-solar.office.enable = true;
|
||||
|
||||
systemd.enableUnifiedCgroupHierarchy = true;
|
||||
|
||||
nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
|
||||
"goland"
|
||||
];
|
||||
|
||||
environment.systemPackages = with pkgs; [
|
||||
jetbrains.goland
|
||||
minicom
|
||||
openjdk11
|
||||
putty
|
||||
remmina
|
||||
thunderbird
|
||||
vscode
|
||||
vscode-extensions.golang.go
|
||||
vscode-extensions.ms-python.python
|
||||
wireshark
|
||||
go_1_20
|
||||
meld
|
||||
|
||||
factorio-experimental
|
||||
];
|
||||
hardware.enableRedistributableFirmware = true;
|
||||
pub-solar.graphical.enable = true;
|
||||
pub-solar.sway.enable = true;
|
||||
|
||||
boot.binfmt.emulatedSystems = ["aarch64-linux"];
|
||||
|
||||
|
||||
pub-solar.audio.bluetooth.enable = false;
|
||||
|
||||
home-manager.users."${psCfg.user.name}".xdg.configFile = lib.mkIf psCfg.sway.enable {
|
||||
"sway/config.d/10-inputs.conf".source = ./.config/sway/config.d/inputs.conf;
|
||||
"sway/config.d/10-screens.conf".source = ./.config/sway/config.d/screens.conf;
|
||||
"sway/config.d/10-custom-keybindings.conf".source = ./.config/sway/config.d/custom-keybindings.conf;
|
||||
};
|
||||
# Set your time zone.
|
||||
time.timeZone = "Europe/Berlin";
|
||||
|
||||
# The global useDHCP flag is deprecated, therefore explicitly set to false here.
|
||||
# Per-interface useDHCP will be mandatory in the future, so this generated config
|
||||
# replicates the default behaviour.
|
||||
networking.firewall = {
|
||||
allowedUDPPorts = [
|
||||
51820
|
||||
51821
|
||||
]; # Clients and peers can use the same port, see listenport
|
||||
};
|
||||
|
||||
services.tlp = {
|
||||
enable = true;
|
||||
settings = {
|
||||
CPU_SCALING_GOVERNOR_ON_AC = "performance";
|
||||
CPU_SCALING_GOVERNOR_ON_BAT = "powersave";
|
||||
|
||||
# The following prevents the battery from charging fully to
|
||||
# preserve lifetime. Run `tlp fullcharge` to temporarily force
|
||||
# full charge.
|
||||
# https://linrunner.de/tlp/faq/battery.html#how-to-choose-good-battery-charge-thresholds
|
||||
START_CHARGE_THRESH_BAT0 = 40;
|
||||
STOP_CHARGE_THRESH_BAT0 = 80;
|
||||
|
||||
# 100 being the maximum, limit the speed of my CPU to reduce
|
||||
# heat and increase battery usage:
|
||||
CPU_MAX_PERF_ON_AC = 100;
|
||||
CPU_MAX_PERF_ON_BAT = 50;
|
||||
};
|
||||
};
|
||||
|
||||
# This value determines the NixOS release from which the default
|
||||
# settings for stateful data, like file locations and database versions
|
||||
# on your system were taken. It‘s perfectly fine and recommended to leave
|
||||
# this value at the release version of the first install of this system.
|
||||
# Before changing this value read the documentation for this option
|
||||
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
||||
system.stateVersion = "21.11"; # Did you read the comment?
|
||||
}
|
|
@ -1,6 +0,0 @@
|
|||
{ ... }: {
|
||||
imports = [
|
||||
./configuration.nix
|
||||
./hardware-configuration.nix
|
||||
];
|
||||
}
|
|
@ -1,52 +0,0 @@
|
|||
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||
# and may be overwritten by future invocations. Please make changes
|
||||
# to /etc/nixos/configuration.nix instead.
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
modulesPath,
|
||||
...
|
||||
}: {
|
||||
imports = [];
|
||||
|
||||
boot.initrd.availableKernelModules = ["xhci_pci" "nvme" "usbhid" "uas" "sdhci_pci"];
|
||||
boot.initrd.kernelModules = ["dm-snapshot"];
|
||||
boot.kernelModules = ["kvm-intel"];
|
||||
boot.extraModulePackages = [];
|
||||
|
||||
boot.kernelPackages = pkgs.linuxPackages_latest;
|
||||
|
||||
hardware.bluetooth.enable = true;
|
||||
hardware.bluetooth.powerOnBoot = true;
|
||||
services.blueman.enable = true;
|
||||
|
||||
boot.initrd.luks.devices."cryptroot" = {
|
||||
device = "/dev/disk/by-uuid/cdc29f0f-5b18-4ee7-8d38-1f4bac80b1e6";
|
||||
allowDiscards = true;
|
||||
bypassWorkqueues = true;
|
||||
};
|
||||
|
||||
fileSystems."/" = {
|
||||
device = "/dev/disk/by-uuid/5b441f8f-d7eb-44f8-8df2-7354b3314a61";
|
||||
fsType = "ext4";
|
||||
options = [ "discard" ];
|
||||
};
|
||||
|
||||
fileSystems."/boot" = {
|
||||
device = "/dev/disk/by-uuid/84CD-91B6";
|
||||
fsType = "vfat";
|
||||
};
|
||||
|
||||
swapDevices = [{device = "/dev/disk/by-uuid/54162798-9017-4b59-afd7-ab9578da4bb9";}];
|
||||
|
||||
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||
|
||||
hardware.trackpoint = {
|
||||
enable = true;
|
||||
device = "TPPS/2 ALPS TrackPoint";
|
||||
emulateWheel = true;
|
||||
sensitivity = 100; # default 128
|
||||
speed = 64; # default 97
|
||||
};
|
||||
}
|
|
@ -1,95 +0,0 @@
|
|||
{
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
systemd.services.wireguard-wg0.serviceConfig.Restart = "on-failure";
|
||||
systemd.services.wireguard-wg0.serviceConfig.RestartSec = "5s";
|
||||
systemd.services.wireguard-wg1.serviceConfig.Restart = "on-failure";
|
||||
systemd.services.wireguard-wg1.serviceConfig.RestartSec = "5s";
|
||||
|
||||
# Enable WireGuard
|
||||
networking.wireguard.interfaces = {
|
||||
# "wg0" is the network interface name. You can name the interface arbitrarily.
|
||||
wg0 = {
|
||||
# Determines the IP address and subnet of the client's end of the tunnel interface.
|
||||
ips = [
|
||||
"10.0.0.13/32"
|
||||
"fc00:200::13/128"
|
||||
];
|
||||
mtu = 1400;
|
||||
listenPort = 51820; # to match firewall allowedUDPPorts (without this wg uses random port numbers)
|
||||
|
||||
# Path to the private key file.
|
||||
#
|
||||
# Note: The private key can also be included inline via the privateKey option,
|
||||
# but this makes the private key world-readable; thus, using privateKeyFile is
|
||||
# recommended.
|
||||
privateKeyFile = "/home/hensoko/.config/wireguard/hosting-de.private";
|
||||
|
||||
peers = [
|
||||
# For a client configuration, one peer entry for the server will suffice.
|
||||
|
||||
{
|
||||
# Public key of the server (not a file path).
|
||||
publicKey = "02/MRPduMGx1as7yS4G7GpL4+pQjsjpyS/tD9iPu8X0=";
|
||||
|
||||
# Forward all the traffic via VPN.
|
||||
allowedIPs = [
|
||||
"10.0.0.0/24"
|
||||
"192.168.50.0/24"
|
||||
"192.168.200.0/24"
|
||||
"10.20.30.0/24"
|
||||
"10.20.50.0/24"
|
||||
"fc00:200::/120"
|
||||
"95.129.51.5"
|
||||
"95.129.54.43"
|
||||
"134.0.28.89"
|
||||
"134.0.27.108"
|
||||
"134.0.25.181"
|
||||
];
|
||||
|
||||
# Set this to the server IP and port.
|
||||
endpoint = "134.0.30.154:51820"; # ToDo: route to endpoint not automatically configured https://wiki.archlinux.org/index.php/WireGuard#Loop_routing https://discourse.nixos.org/t/solved-minimal-firewall-setup-for-wireguard-client/7577
|
||||
|
||||
# Send keepalives every 25 seconds. Important to keep NAT tables alive.
|
||||
persistentKeepalive = 25;
|
||||
}
|
||||
];
|
||||
};
|
||||
wg1 = {
|
||||
# Determines the IP address and subnet of the client's end of the tunnel interface.
|
||||
ips = [
|
||||
"10.0.1.121"
|
||||
];
|
||||
mtu = 1400;
|
||||
listenPort = 51821; # to match firewall allowedUDPPorts (without this wg uses random port numbers)
|
||||
|
||||
# Path to the private key file.
|
||||
#
|
||||
# Note: The private key can also be included inline via the privateKey option,
|
||||
# but this makes the private key world-readable; thus, using privateKeyFile is
|
||||
# recommended.
|
||||
privateKeyFile = "/home/hensoko/.config/wireguard/data-gssws-de.private";
|
||||
|
||||
peers = [
|
||||
# For a client configuration, one peer entry for the server will suffice.
|
||||
|
||||
{
|
||||
# Public key of the server (not a file path).
|
||||
publicKey = "t1DS0y6eVzyGwomKAEWTWVsHK3xB7M/fNQ3wLgE3+B8=";
|
||||
|
||||
allowedIPs = [
|
||||
"10.0.1.0/24"
|
||||
];
|
||||
|
||||
# Set this to the server IP and port.
|
||||
endpoint = "80.244.242.2:51899";
|
||||
|
||||
# Send keepalives every 25 seconds. Important to keep NAT tables alive.
|
||||
persistentKeepalive = 25;
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,105 +0,0 @@
|
|||
# Edit this configuration file to define what should be installed on
|
||||
# your system. Help is available in the configuration.nix(5) man page
|
||||
# and in the NixOS manual (accessible by running ‘nixos-help’).
|
||||
|
||||
{ config, pkgs, lib, ... }:
|
||||
|
||||
{
|
||||
boot.binfmt.emulatedSystems = [ "aarch64-linux" ];
|
||||
boot.loader.systemd-boot.enable = lib.mkForce false;
|
||||
|
||||
# Use the GRUB 2 boot loader.
|
||||
boot.loader.grub.enable = true;
|
||||
boot.loader.grub.version = 2;
|
||||
# boot.loader.grub.efiSupport = true;
|
||||
# boot.loader.grub.efiInstallAsRemovable = true;
|
||||
# boot.loader.efi.efiSysMountPoint = "/boot/efi";
|
||||
# Define on which hard drive you want to install Grub.
|
||||
boot.loader.grub.device = "/dev/sda"; # or "nodev" for efi only
|
||||
|
||||
# networking.hostName = "nixos"; # Define your hostname.
|
||||
# networking.wireless.enable = true; # Enables wireless support via wpa_supplicant.
|
||||
|
||||
# Set your time zone.
|
||||
# time.timeZone = "Europe/Amsterdam";
|
||||
|
||||
# The global useDHCP flag is deprecated, therefore explicitly set to false here.
|
||||
# Per-interface useDHCP will be mandatory in the future, so this generated config
|
||||
# replicates the default behaviour.
|
||||
networking.useDHCP = false;
|
||||
networking.interfaces.enp0s3.useDHCP = true;
|
||||
|
||||
# Configure network proxy if necessary
|
||||
# networking.proxy.default = "http://user:password@proxy:port/";
|
||||
# networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain";
|
||||
|
||||
nix = {
|
||||
#package = pkgs.nixFlakes;
|
||||
extraOptions = lib.optionalString (config.nix.package == pkgs.nixFlakes) "experimental-features = nix-command flakes";
|
||||
};
|
||||
|
||||
# Select internationalisation properties.
|
||||
# i18n.defaultLocale = "en_US.UTF-8";
|
||||
# console = {
|
||||
# font = "Lat2-Terminus16";
|
||||
# keyMap = "us";
|
||||
# };
|
||||
|
||||
# Enable the X11 windowing system.
|
||||
# services.xserver.enable = true;
|
||||
|
||||
# Configure keymap in X11
|
||||
# services.xserver.layout = "us";
|
||||
# services.xserver.xkbOptions = "eurosign:e";
|
||||
|
||||
# Enable CUPS to print documents.
|
||||
# services.printing.enable = true;
|
||||
|
||||
# Enable sound.
|
||||
# sound.enable = true;
|
||||
# hardware.pulseaudio.enable = true;
|
||||
|
||||
# Enable touchpad support (enabled default in most desktopManager).
|
||||
# services.xserver.libinput.enable = true;
|
||||
|
||||
# Define a user account. Don't forget to set a password with ‘passwd’.
|
||||
# users.users.jane = {
|
||||
# isNormalUser = true;
|
||||
# extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user.
|
||||
# };
|
||||
|
||||
# List packages installed in system profile. To search, run:
|
||||
# $ nix search wget
|
||||
environment.systemPackages = with pkgs; [
|
||||
vim
|
||||
wget
|
||||
firefox
|
||||
];
|
||||
|
||||
# Some programs need SUID wrappers, can be configured further or are
|
||||
# started in user sessions.
|
||||
# programs.mtr.enable = true;
|
||||
# programs.gnupg.agent = {
|
||||
# enable = true;
|
||||
# enableSSHSupport = true;
|
||||
# };
|
||||
|
||||
# List services that you want to enable:
|
||||
|
||||
# Open ports in the firewall.
|
||||
networking.firewall.allowedTCPPorts = [ 22 ];
|
||||
# networking.firewall.allowedUDPPorts = [ ... ];
|
||||
# Or disable the firewall altogether.
|
||||
# networking.firewall.enable = false;
|
||||
|
||||
# This value determines the NixOS release from which the default
|
||||
# settings for stateful data, like file locations and database versions
|
||||
# on your system were taken. It‘s perfectly fine and recommended to leave
|
||||
# this value at the release version of the first install of this system.
|
||||
# Before changing this value read the documentation for this option
|
||||
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
||||
system.stateVersion = "21.05"; # Did you read the comment?
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
{ ... }: {
|
||||
imports = [
|
||||
./configuration.nix
|
||||
./hardware-configuration.nix
|
||||
];
|
||||
}
|
|
@ -1,21 +0,0 @@
|
|||
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||
# and may be overwritten by future invocations. Please make changes
|
||||
# to /etc/nixos/configuration.nix instead.
|
||||
{ config, lib, pkgs, modulesPath, ... }:
|
||||
|
||||
{
|
||||
imports = [ ];
|
||||
|
||||
boot.initrd.availableKernelModules = [ "ohci_pci" "virtio_pci" "sd_mod" "sr_mod" "virtio_scsi" ];
|
||||
boot.initrd.kernelModules = [ ];
|
||||
boot.kernelModules = [ ];
|
||||
boot.extraModulePackages = [ ];
|
||||
|
||||
fileSystems."/" =
|
||||
{
|
||||
device = "/dev/disk/by-label/nixos";
|
||||
fsType = "ext4";
|
||||
};
|
||||
|
||||
#virtualisation.virtualbox.guest.enable = true;
|
||||
}
|
|
@ -1,31 +0,0 @@
|
|||
# Edit this configuration file to define what should be installed on
|
||||
# your system. Help is available in the configuration.nix(5) man page
|
||||
# and in the NixOS manual (accessible by running ‘nixos-help’).
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
pub-solar.core.lite = true;
|
||||
|
||||
# Use the systemd-boot EFI boot loader.
|
||||
boot.loader.systemd-boot.enable = true;
|
||||
boot.loader.efi.canTouchEfiVariables = true;
|
||||
|
||||
# Set your time zone.
|
||||
time.timeZone = "Europe/Berlin";
|
||||
|
||||
# The global useDHCP flag is deprecated, therefore explicitly set to false here.
|
||||
# Per-interface useDHCP will be mandatory in the future, so this generated config
|
||||
# replicates the default behaviour.
|
||||
networking.useDHCP = false;
|
||||
networking.interfaces.enp0s25.useDHCP = true;
|
||||
|
||||
# This value determines the NixOS release from which the default
|
||||
# settings for stateful data, like file locations and database versions
|
||||
# on your system were taken. It‘s perfectly fine and recommended to leave
|
||||
# this value at the release version of the first install of this system.
|
||||
# Before changing this value read the documentation for this option
|
||||
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
||||
system.stateVersion = "21.11"; # Did you read the comment?
|
||||
}
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
{ ... }: {
|
||||
imports = [
|
||||
./configuration.nix
|
||||
./hardware-configuration.nix
|
||||
];
|
||||
}
|
|
@ -1,41 +0,0 @@
|
|||
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||
# and may be overwritten by future invocations. Please make changes
|
||||
# to /etc/nixos/configuration.nix instead.
|
||||
{ config, lib, pkgs, modulesPath, ... }:
|
||||
|
||||
{
|
||||
boot.initrd.availableKernelModules = [ "xhci_pci" "ehci_pci" "ahci" "usb_storage" "sd_mod" "sdhci_pci" ];
|
||||
boot.initrd.kernelModules = [ ];
|
||||
boot.kernelModules = [ "kvm-intel" ];
|
||||
boot.extraModulePackages = [ ];
|
||||
|
||||
boot.initrd.luks.devices."cryptroot" = {
|
||||
device = "/dev/disk/by-uuid/bd1ebf98-adc1-4868-842f-3d2c6ee04e13";
|
||||
keyFile = "/dev/disk/by-partuuid/9ff6ebf7-01";
|
||||
fallbackToPassword = true;
|
||||
bypassWorkqueues = true;
|
||||
};
|
||||
|
||||
fileSystems."/" =
|
||||
{
|
||||
device = "/dev/disk/by-uuid/1999ec2e-4564-4f5a-8333-6eb23ae03c8b";
|
||||
fsType = "ext4";
|
||||
};
|
||||
|
||||
fileSystems."/boot" =
|
||||
{
|
||||
device = "/dev/disk/by-uuid/47ED-2F0B";
|
||||
fsType = "vfat";
|
||||
};
|
||||
|
||||
fileSystems."/home" =
|
||||
{
|
||||
device = "/dev/disk/by-uuid/69c89392-be11-4bd4-8f3b-6b7db20c716e";
|
||||
fsType = "ext4";
|
||||
};
|
||||
|
||||
swapDevices =
|
||||
[{ device = "/dev/disk/by-uuid/4ef0cdbc-38f4-4dcb-8fe8-553bbdb06192"; }];
|
||||
|
||||
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||
}
|
|
@ -1,17 +0,0 @@
|
|||
{
|
||||
self,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
config = {
|
||||
age.secrets.home_controller_wireguard.file = "${self}/secrets/home_controller_ringo_wireguard_key.age";
|
||||
|
||||
pub-solar.home-controller = {
|
||||
enable = true;
|
||||
ownIp = "10.0.1.21";
|
||||
|
||||
wireguardPrivateKeyFile = "/run/agenix/home_controller_wireguard";
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,32 +0,0 @@
|
|||
# Edit this configuration file to define what should be installed on
|
||||
# your system. Help is available in the configuration.nix(5) man page
|
||||
# and in the NixOS manual (accessible by running ‘nixos-help’).
|
||||
|
||||
{ inputs, pkgs, builtins, config, lib, ... }:
|
||||
|
||||
{
|
||||
time.timeZone = "Europe/Berlin";
|
||||
|
||||
pub-solar.social.enable = true;
|
||||
hardware.enableRedistributableFirmware = true;
|
||||
pub-solar.graphical.enable = true;
|
||||
pub-solar.sway.enable = true;
|
||||
|
||||
boot.loader.systemd-boot.enable = true;
|
||||
boot.loader.efi.canTouchEfiVariables = true;
|
||||
|
||||
networking.networkmanager.enable = true;
|
||||
|
||||
#boot.loader.systemd-boot.enable = lib.mkForce false;
|
||||
|
||||
# Enable the OpenSSH daemon.
|
||||
services.openssh.enable = true;
|
||||
|
||||
# This value determines the NixOS release from which the default
|
||||
# settings for stateful data, like file locations and database versions
|
||||
# on your system were taken. It‘s perfectly fine and recommended to leave
|
||||
# this value at the release version of the first install of this system.
|
||||
# Before changing this value read the documentation for this option
|
||||
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
||||
system.stateVersion = "22.11"; # Did you read the comment?
|
||||
}
|
|
@ -1,6 +0,0 @@
|
|||
{ ... }: {
|
||||
imports = [
|
||||
./configuration.nix
|
||||
./hardware-configuration.nix
|
||||
];
|
||||
}
|
|
@ -1,50 +0,0 @@
|
|||
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||
# and may be overwritten by future invocations. Please make changes
|
||||
# to /etc/nixos/configuration.nix instead.
|
||||
{
|
||||
inputs,
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
modulesPath,
|
||||
...
|
||||
}: {
|
||||
imports = [
|
||||
#(modulesPath + "/installer/scan/not-detected.nix")
|
||||
#inputs.nixos-hardware.nixosModules.raspberry-pi-4
|
||||
];
|
||||
|
||||
boot.initrd.availableKernelModules = ["xhci_pci" "nvme" "usb_storage" "sd_mod"];
|
||||
boot.extraModulePackages = [config.boot.kernelPackages.rtl88x2bu];
|
||||
|
||||
#microsoft-surface.kernelVersion = "6.5.5";
|
||||
|
||||
fileSystems."/" = {
|
||||
device = "/dev/disk/by-label/root";
|
||||
fsType = "ext4";
|
||||
encrypted = {
|
||||
enable = true;
|
||||
label = "cryptroot";
|
||||
blkDev = "/dev/disk/by-uuid/77829967-0c52-4a52-a65c-cfc093d18776";
|
||||
};
|
||||
};
|
||||
|
||||
fileSystems."/boot" = {
|
||||
device = "/dev/disk/by-uuid/2697-F70A";
|
||||
fsType = "vfat";
|
||||
};
|
||||
|
||||
swapDevices = [
|
||||
{device = "/dev/disk/by-label/swap";}
|
||||
];
|
||||
|
||||
powerManagement.cpuFreqGovernor = lib.mkDefault "powersave";
|
||||
|
||||
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||
|
||||
systemd.services."iptsd" = {
|
||||
serviceConfig = {
|
||||
RestartAfter = "5s";
|
||||
};
|
||||
};
|
||||
}
|
Loading…
Reference in a new issue