initial(ish) commit
This commit is contained in:
commit
b744693f0e
88 changed files with 4925 additions and 0 deletions
25
darwin-common.nix
Normal file
25
darwin-common.nix
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
{config, pkgs, ...}: {
|
||||||
|
programs.gnupg.agent.enable = true;
|
||||||
|
services.nix-daemon.enable = true;
|
||||||
|
nix.package = pkgs.nixFlakes;
|
||||||
|
nix.buildCores = 0; # use all cores
|
||||||
|
nix.maxJobs = 10; # use all cores
|
||||||
|
|
||||||
|
system.defaults = {
|
||||||
|
NSGlobalDomain.AppleShowAllExtensions = true;
|
||||||
|
NSGlobalDomain.InitialKeyRepeat = 25;
|
||||||
|
NSGlobalDomain.KeyRepeat = 4;
|
||||||
|
NSGlobalDomain.NSNavPanelExpandedStateForSaveMode = true;
|
||||||
|
NSGlobalDomain.PMPrintingExpandedStateForPrint = true;
|
||||||
|
NSGlobalDomain."com.apple.mouse.tapBehavior" = 1;
|
||||||
|
NSGlobalDomain."com.apple.trackpad.trackpadCornerClickBehavior" = 1;
|
||||||
|
dock.autohide = true;
|
||||||
|
dock.mru-spaces = false;
|
||||||
|
dock.show-recents = false;
|
||||||
|
dock.static-only = true;
|
||||||
|
finder.AppleShowAllExtensions = true;
|
||||||
|
finder.FXEnableExtensionChangeWarning = false;
|
||||||
|
loginwindow.GuestEnabled = false;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
31
data/monitoring.toml
Normal file
31
data/monitoring.toml
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
[master]
|
||||||
|
hostname = "ds9"
|
||||||
|
ip = "10.0.0.2"
|
||||||
|
|
||||||
|
[hostOverrides]
|
||||||
|
wormhole = "10.0.0.1"
|
||||||
|
picard = "ragon.xyz"
|
||||||
|
|
||||||
|
[exporters.nginx]
|
||||||
|
hosts = [
|
||||||
|
"ds9",
|
||||||
|
"wormhole"
|
||||||
|
]
|
||||||
|
|
||||||
|
[exporters.node]
|
||||||
|
hosts = [ "ds9", "wormhole" ]
|
||||||
|
|
||||||
|
[exporters.smartctl]
|
||||||
|
hosts = [ "ds9" ]
|
||||||
|
|
||||||
|
[exporters.dnsmasq]
|
||||||
|
hosts = [ "wormhole" ]
|
||||||
|
|
||||||
|
[exporters.wireguard]
|
||||||
|
hosts = [ "wormhole"]
|
||||||
|
|
||||||
|
[exporters.smokeping]
|
||||||
|
hosts = [ "wormhole"]
|
||||||
|
|
||||||
|
[promtail]
|
||||||
|
hosts = [ "wormhole", "ds9" ]
|
||||||
26
data/pubkeys.nix
Normal file
26
data/pubkeys.nix
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
let
|
||||||
|
ragon =
|
||||||
|
let
|
||||||
|
user = [
|
||||||
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEJwOH1b6xWmEr1VZh48kBIYhW11vtPFR3my8stAHlSi" # saurier
|
||||||
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIuwQJY0H/fdu1UmGXAut7VfcvAk2Dm78tJpkyyv2in2" # daedalus
|
||||||
|
];
|
||||||
|
server = user ++ hosts.ds9 ++ hosts.wormhole ++ hosts.picard ++ hosts.octopi;
|
||||||
|
client = user ++ hosts.enterprise ++ hosts.voyager;
|
||||||
|
hosts = {
|
||||||
|
wormhole = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINzR5dq/2UosH3nLrc9PvJi3rzX917K2wICeOUAiDnl6" ];
|
||||||
|
daedalusvm = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL9gTeFNEO+Puf8j0rxq0qyR+OgH0eSqDYBR20aACkpP" ];
|
||||||
|
ds9 = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJ+BBXufXAJhyUHVfhqlk8Y4zEKJbKXgJQvsdE482lpV" ];
|
||||||
|
picard = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAm3UXZaN95WBUaS9SiHLNEuI1tP1x1w07qnYxPe+vdr" ];
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
inherit user server client;
|
||||||
|
computers = user ++ (builtins.foldl' (a: b: a ++ b) [ ] (builtins.attrValues hosts)); # everything
|
||||||
|
host = hn: (hosts.${hn} ++ user);
|
||||||
|
hosts = hn: ((map (x: hosts.${x}) hn) ++ user);
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
inherit ragon;
|
||||||
|
}
|
||||||
417
flake.lock
generated
Normal file
417
flake.lock
generated
Normal file
|
|
@ -0,0 +1,417 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"agenix": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1646105662,
|
||||||
|
"narHash": "sha256-jdXCZbGZL0SWWi29GnAOFHUh/QvvP0IyaVLv1ZTDkBI=",
|
||||||
|
"owner": "ryantm",
|
||||||
|
"repo": "agenix",
|
||||||
|
"rev": "297cd58b418249240b9f1f155d52b1b17f292884",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "ryantm",
|
||||||
|
"ref": "main",
|
||||||
|
"repo": "agenix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"agkozak-zsh-prompt": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1636940431,
|
||||||
|
"narHash": "sha256-II7+pwMpXPB3MhYScALZcs/28CPQltEt1FCwen7CxSE=",
|
||||||
|
"owner": "agkozak",
|
||||||
|
"repo": "agkozak-zsh-prompt",
|
||||||
|
"rev": "87ea6db9375032a6a26496a7f4a6266804f6929a",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "agkozak",
|
||||||
|
"repo": "agkozak-zsh-prompt",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"coc-nvim": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1646003439,
|
||||||
|
"narHash": "sha256-9YYILWjYyEaNJPePkqEhBGlTPZ79zFb/p94TPlbq3pQ=",
|
||||||
|
"owner": "neoclide",
|
||||||
|
"repo": "coc.nvim",
|
||||||
|
"rev": "f1a027298cb58b8ddf12ff1193b9e2706b4909a2",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "neoclide",
|
||||||
|
"ref": "release",
|
||||||
|
"repo": "coc.nvim",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"dart-vim": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1643154552,
|
||||||
|
"narHash": "sha256-f4h4nWbAm6wL7c6gCVRvyXvzGwj0I4PAij579RoFitI=",
|
||||||
|
"owner": "dart-lang",
|
||||||
|
"repo": "dart-vim-plugin",
|
||||||
|
"rev": "42e6f57f2404b882cb7e491d50e525f8a8eb7f1f",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "dart-lang",
|
||||||
|
"ref": "master",
|
||||||
|
"repo": "dart-vim-plugin",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"darwin": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1645293039,
|
||||||
|
"narHash": "sha256-PwdDu+SkX8dreeuJ/4av1sEluNZdrpdXv8JsRKKg1Yc=",
|
||||||
|
"owner": "lnl7",
|
||||||
|
"repo": "nix-darwin",
|
||||||
|
"rev": "1df878b6f8351795a3bebfbe4fd2d02e1e8b29d6",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "lnl7",
|
||||||
|
"ref": "master",
|
||||||
|
"repo": "nix-darwin",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-compat": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1641205782,
|
||||||
|
"narHash": "sha256-4jY7RCWUoZ9cKD8co0/4tFARpWB+57+r1bLLvXNJliY=",
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"rev": "b7547d3eed6f32d06102ead8991ec52ab0a4f1a7",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-utils": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1629481132,
|
||||||
|
"narHash": "sha256-JHgasjPR0/J1J3DRm4KxM4zTyAj4IOJY8vIl75v/kPI=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "997f7efcb746a9c140ce1f13c72263189225f482",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"home-manager": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1645970334,
|
||||||
|
"narHash": "sha256-6nn4YF9bPtkxkB7bM6yJO3m//p3sGilxNQFjm1epLEM=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "home-manager",
|
||||||
|
"rev": "ea85f4b1fdf3f25cf97dc49f4a9ec4eafda2ea25",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "home-manager",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"impermanence": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1644791231,
|
||||||
|
"narHash": "sha256-iDihsF1fUMK4xXiUudPnDM3veH1LXbbxfP9Lzekw9iU=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "impermanence",
|
||||||
|
"rev": "635bcd2d88739197a0b584aa9fadaa53c717a853",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "impermanence",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"naersk": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"rnix-lsp",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1639947939,
|
||||||
|
"narHash": "sha256-pGsM8haJadVP80GFq4xhnSpNitYNQpaXk4cnA796Cso=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "naersk",
|
||||||
|
"rev": "2fc8ce9d3c025d59fee349c1f80be9785049d653",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "naersk",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"neovim-flake": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils",
|
||||||
|
"nixpkgs": [
|
||||||
|
"neovim-nightly-overlay",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"dir": "contrib",
|
||||||
|
"lastModified": 1646012280,
|
||||||
|
"narHash": "sha256-rgx3+Xkqm6E9oR1hXKmipyTmMQb8kyXEklDuHHplD/I=",
|
||||||
|
"owner": "neovim",
|
||||||
|
"repo": "neovim",
|
||||||
|
"rev": "e383543342db8e9dcf40f7d5237edeab29638880",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"dir": "contrib",
|
||||||
|
"owner": "neovim",
|
||||||
|
"repo": "neovim",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"neovim-nightly-overlay": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-compat": "flake-compat",
|
||||||
|
"neovim-flake": "neovim-flake",
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1646036082,
|
||||||
|
"narHash": "sha256-dRTzOZszaNupxRUkEX11K4hzRCzcB2apNsyGx0WsmbU=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "neovim-nightly-overlay",
|
||||||
|
"rev": "c5d3b328cfe9c7414363f70d583dce6584a72251",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "neovim-nightly-overlay",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixos-hardware": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1645855197,
|
||||||
|
"narHash": "sha256-0FvBpX/9n69vg+XgcMow0RIRYbTHav1uCbL9Xt9HvcA=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixos-hardware",
|
||||||
|
"rev": "c3c66f6db4ac74a59eb83d83e40c10046ebc0b8c",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "master",
|
||||||
|
"repo": "nixos-hardware",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1645433236,
|
||||||
|
"narHash": "sha256-4va4MvJ076XyPp5h8sm5eMQvCrJ6yZAbBmyw95dGyw4=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "7f9b6e2babf232412682c09e57ed666d8f84ac2d",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs-master": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1646109749,
|
||||||
|
"narHash": "sha256-09nJZGDSoy+1LWX3AqjjQUJPpx9pYYhwOOI32sx7+Fg=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "13e74fc7ff2f691da0791db67fe65930403b391d",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "master",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nnn-vim": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1641252513,
|
||||||
|
"narHash": "sha256-ZWvTTioLoA+/HXTghp1EH2PH4A0mLDLtqzPKGsGB+ZY=",
|
||||||
|
"owner": "mcchrish",
|
||||||
|
"repo": "nnn.vim",
|
||||||
|
"rev": "169951733371abd152d76d1ce65e2dd867156e2d",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "mcchrish",
|
||||||
|
"repo": "nnn.vim",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"rnix-lsp": {
|
||||||
|
"inputs": {
|
||||||
|
"naersk": "naersk",
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
],
|
||||||
|
"utils": "utils"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1643586450,
|
||||||
|
"narHash": "sha256-BRIAc3+zavSlJPYSbov2n1W9/a4Iuh2swFPYRWjCm1g=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "rnix-lsp",
|
||||||
|
"rev": "41eb2f3366e3f351bf2563c2a7c46fd17e78dfe0",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "rnix-lsp",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"agenix": "agenix",
|
||||||
|
"agkozak-zsh-prompt": "agkozak-zsh-prompt",
|
||||||
|
"coc-nvim": "coc-nvim",
|
||||||
|
"dart-vim": "dart-vim",
|
||||||
|
"darwin": "darwin",
|
||||||
|
"home-manager": "home-manager",
|
||||||
|
"impermanence": "impermanence",
|
||||||
|
"neovim-nightly-overlay": "neovim-nightly-overlay",
|
||||||
|
"nixos-hardware": "nixos-hardware",
|
||||||
|
"nixpkgs": "nixpkgs",
|
||||||
|
"nixpkgs-master": "nixpkgs-master",
|
||||||
|
"nnn-vim": "nnn-vim",
|
||||||
|
"rnix-lsp": "rnix-lsp",
|
||||||
|
"utils": "utils_2",
|
||||||
|
"zsh-completions": "zsh-completions",
|
||||||
|
"zsh-syntax-highlighting": "zsh-syntax-highlighting",
|
||||||
|
"zsh-vim-mode": "zsh-vim-mode"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"utils": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1638122382,
|
||||||
|
"narHash": "sha256-sQzZzAbvKEqN9s0bzWuYmRaA03v40gaJ4+iL1LXjaeI=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "74f7e4319258e287b0f9cb95426c9853b282730b",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"utils_2": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1644229661,
|
||||||
|
"narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"zsh-completions": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1645684485,
|
||||||
|
"narHash": "sha256-4ny89Dlop6ZekKGcMHTSu9ltR2FP1Ymb8rhDS1cc1+M=",
|
||||||
|
"owner": "zsh-users",
|
||||||
|
"repo": "zsh-completions",
|
||||||
|
"rev": "6fbf5fc9a7033bc47d4c61b2d6b97fe0c74d9c45",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "zsh-users",
|
||||||
|
"repo": "zsh-completions",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"zsh-syntax-highlighting": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1645642093,
|
||||||
|
"narHash": "sha256-UqeK+xFcKMwdM62syL2xkV8jwkf/NWfubxOTtczWEwA=",
|
||||||
|
"owner": "zsh-users",
|
||||||
|
"repo": "zsh-syntax-highlighting",
|
||||||
|
"rev": "c5ce0014677a0f69a10b676b6038ad127f40c6b1",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "zsh-users",
|
||||||
|
"ref": "master",
|
||||||
|
"repo": "zsh-syntax-highlighting",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"zsh-vim-mode": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1616290526,
|
||||||
|
"narHash": "sha256-a+6EWMRY1c1HQpNtJf5InCzU7/RphZjimLdXIXbO6cQ=",
|
||||||
|
"owner": "softmoth",
|
||||||
|
"repo": "zsh-vim-mode",
|
||||||
|
"rev": "1f9953b7d6f2f0a8d2cb8e8977baa48278a31eab",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "softmoth",
|
||||||
|
"repo": "zsh-vim-mode",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
||||||
132
flake.nix
Normal file
132
flake.nix
Normal file
|
|
@ -0,0 +1,132 @@
|
||||||
|
{
|
||||||
|
description = "ragons nix/nixos configs";
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||||
|
nixpkgs-master.url = "github:NixOS/nixpkgs/master";
|
||||||
|
agenix.url = "github:ryantm/agenix/main";
|
||||||
|
agenix.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
home-manager.url = "github:nix-community/home-manager";
|
||||||
|
home-manager.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
impermanence.url = "github:nix-community/impermanence";
|
||||||
|
impermanence.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
nixos-hardware.url = "github:NixOS/nixos-hardware/master";
|
||||||
|
darwin.url = "github:lnl7/nix-darwin/master";
|
||||||
|
darwin.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
utils.url = "github:numtide/flake-utils";
|
||||||
|
## vim
|
||||||
|
neovim-nightly-overlay.url = "github:nix-community/neovim-nightly-overlay";
|
||||||
|
neovim-nightly-overlay.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
coc-nvim.url = "github:neoclide/coc.nvim/release";
|
||||||
|
coc-nvim.flake = false;
|
||||||
|
nnn-vim.url = "github:mcchrish/nnn.vim";
|
||||||
|
nnn-vim.flake = false;
|
||||||
|
dart-vim.url = "github:dart-lang/dart-vim-plugin/master";
|
||||||
|
dart-vim.flake = false;
|
||||||
|
rnix-lsp.url = "github:nix-community/rnix-lsp";
|
||||||
|
rnix-lsp.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
## zsh
|
||||||
|
zsh-completions.url = "github:zsh-users/zsh-completions";
|
||||||
|
zsh-completions.flake = false;
|
||||||
|
zsh-syntax-highlighting.url = "github:zsh-users/zsh-syntax-highlighting/master";
|
||||||
|
zsh-syntax-highlighting.flake = false;
|
||||||
|
zsh-vim-mode.url = "github:softmoth/zsh-vim-mode";
|
||||||
|
zsh-vim-mode.flake = false;
|
||||||
|
agkozak-zsh-prompt.url = "github:agkozak/agkozak-zsh-prompt";
|
||||||
|
agkozak-zsh-prompt.flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = inputs @ { self, nixpkgs, nixpkgs-master, agenix, home-manager, impermanence, darwin, utils, neovim-nightly-overlay, ... }:
|
||||||
|
let
|
||||||
|
extraSystems = [ ];
|
||||||
|
lib = nixpkgs.lib.extend (self: super: {
|
||||||
|
my = import ./lib { inherit inputs; lib = self; };
|
||||||
|
});
|
||||||
|
|
||||||
|
genPkgs = system: import nixpkgs {
|
||||||
|
inherit system;
|
||||||
|
config.allowUnfree = true;
|
||||||
|
overlays = [
|
||||||
|
self.overlay
|
||||||
|
neovim-nightly-overlay.overlay
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
hmConfig = { pkgs, inputs, config, ...}: {
|
||||||
|
imports = lib.my.mapModulesRec' ./hm-imports (x: x);
|
||||||
|
};
|
||||||
|
|
||||||
|
nixosSystem = system: extraModules: let
|
||||||
|
pkgs = genPkgs system;
|
||||||
|
in nixpkgs.lib.nixosSystem
|
||||||
|
rec {
|
||||||
|
inherit system;
|
||||||
|
specialArgs = { inherit lib inputs pkgs system; };
|
||||||
|
modules = [
|
||||||
|
agenix.nixosModules.age
|
||||||
|
impermanence.nixosModules.impermanence
|
||||||
|
home-manager.nixosModules.home-manager
|
||||||
|
({ config, ...}: lib.mkMerge [{
|
||||||
|
system.configurationRevision = self.sourceInfo.rev;
|
||||||
|
services.getty.greetingLine =
|
||||||
|
"<<< Welcome to NixOS ${config.system.nixos.label} @ ${self.sourceInfo.rev} - \\l >>>";
|
||||||
|
home-manager.useGlobalPkgs = true;
|
||||||
|
home-manager.useUserPackages = true;
|
||||||
|
home-manager.extraSpecialArgs = { inherit inputs; };
|
||||||
|
}
|
||||||
|
|
||||||
|
(lib.mkIf (config.users.extraUsers.ragon != null) { # import hm stuff if enabled
|
||||||
|
home-manager.users.ragon = hmConfig;
|
||||||
|
})
|
||||||
|
])
|
||||||
|
./nixos-common.nix
|
||||||
|
] ++ self.nixosModules ++ extraModules;
|
||||||
|
};
|
||||||
|
darwinSystem = system: extraModules:
|
||||||
|
let
|
||||||
|
pkgs = genPkgs system;
|
||||||
|
in darwin.lib.darwinSystem
|
||||||
|
{
|
||||||
|
inherit system;
|
||||||
|
specialArgs = { inherit darwin lib pkgs inputs self; };
|
||||||
|
modules = [
|
||||||
|
home-manager.darwinModules.home-manager
|
||||||
|
({ config, inputs, self, ...}: lib.mkMerge [{
|
||||||
|
system.configurationRevision = (lib.traceVal (self.sourceInfo)).rev;
|
||||||
|
home-manager.useGlobalPkgs = true;
|
||||||
|
home-manager.useUserPackages = true;
|
||||||
|
home-manager.extraSpecialArgs = { inherit inputs; };
|
||||||
|
}
|
||||||
|
(lib.mkIf (config.users.extraUsers.ragon != null) { # import hm stuff if enabled
|
||||||
|
home-manager.users.ragon = hmConfig;
|
||||||
|
})
|
||||||
|
])
|
||||||
|
./darwin-common.nix
|
||||||
|
] ++ extraModules;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
in
|
||||||
|
{
|
||||||
|
lib = lib.my;
|
||||||
|
overlay = final: prev: {
|
||||||
|
unstable = import nixpkgs-master {
|
||||||
|
system = prev.system;
|
||||||
|
config.allowUnfree = true;
|
||||||
|
};
|
||||||
|
my = self.packages."${prev.system}";
|
||||||
|
};
|
||||||
|
packages = [];
|
||||||
|
nixosModules = lib.my.mapModulesRec ./nixos-modules import;
|
||||||
|
darwinModules = [];
|
||||||
|
#darwinModules = lib.my.mapModulesRec ./darwin-modules import;
|
||||||
|
nixosConfigurations = {
|
||||||
|
picard = nixosSystem "x86-64-linux" [ ./hosts/picard/default.nix ]; # TODO
|
||||||
|
wormhole = nixosSystem "aarch64-linux" [ ./hosts/wormhole/default.nix ]; # TODO
|
||||||
|
ds9 = nixosSystem "x86-64-linux" [ ./hosts/ds9/default.nix ]; # TODO
|
||||||
|
};
|
||||||
|
darwinConfigurations = {
|
||||||
|
daedalus = darwinSystem "aarch64-darwin" [ ./hosts/daedalus/default.nix ]; # TODO
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
118
hm-imports/cli.nix
Normal file
118
hm-imports/cli.nix
Normal file
|
|
@ -0,0 +1,118 @@
|
||||||
|
{ inputs, config, lib, pkgs, ... }:
|
||||||
|
{
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
|
||||||
|
nnn
|
||||||
|
bat
|
||||||
|
htop
|
||||||
|
exa
|
||||||
|
curl
|
||||||
|
fd
|
||||||
|
file
|
||||||
|
lorri
|
||||||
|
fzf
|
||||||
|
git
|
||||||
|
neofetch
|
||||||
|
ripgrep
|
||||||
|
direnv # needed for lorri
|
||||||
|
unzip
|
||||||
|
pv
|
||||||
|
killall
|
||||||
|
lefthook
|
||||||
|
yt-dlp
|
||||||
|
aria2
|
||||||
|
libqalculate
|
||||||
|
]
|
||||||
|
home.shellAliases = {
|
||||||
|
v = "nvim";
|
||||||
|
vim = "nvim";
|
||||||
|
gpl = "git pull";
|
||||||
|
gp = "git push";
|
||||||
|
lg = "lazygit";
|
||||||
|
gc = "git commit -v";
|
||||||
|
kb = "git commit -m \"\$(curl -s http://whatthecommit.com/index.txt)\"";
|
||||||
|
gs = "git status -v";
|
||||||
|
gfc = "git fetch && git checkout";
|
||||||
|
gl = "git log --graph";
|
||||||
|
l = "exa -la --git";
|
||||||
|
la = "exa -la --git";
|
||||||
|
ls = "exa";
|
||||||
|
ll = "exa -l --git";
|
||||||
|
cat = "bat";
|
||||||
|
};
|
||||||
|
|
||||||
|
programs = {
|
||||||
|
gpg = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
cert-digest-algo = "SHA512";
|
||||||
|
charset = "utf-8";
|
||||||
|
default-preference-list = "SHA512 SHA384 SHA256 AES256 AES192 AES ZLIB BZIP2 ZIP Uncompressed";
|
||||||
|
fixed-list-mode = true;
|
||||||
|
keyserver = "hkps://keyserver.ubuntu.com:443";
|
||||||
|
list-options = [ "show-uid-validity" "show-unusable-subkeys" ];
|
||||||
|
no-comments = true;
|
||||||
|
no-emit-version = true;
|
||||||
|
no-greeting = true;
|
||||||
|
no-symkey-cache = true;
|
||||||
|
personal-cipher-preferences = "AES256 AES192 AES";
|
||||||
|
personal-compress-preferences = "ZLIB BZIP2 ZIP Uncompressed";
|
||||||
|
personal-digest-preferences = "SHA512 SHA384 SHA256";
|
||||||
|
require-cross-certification = true;
|
||||||
|
s2k-cipher-algo = "AES256";
|
||||||
|
s2k-digest-algo = "SHA512";
|
||||||
|
throw-keyids = true;
|
||||||
|
use-agent = true;
|
||||||
|
verbose = true;
|
||||||
|
verify-options = "show-uid-validity";
|
||||||
|
with-fingerprint = true;
|
||||||
|
with-key-origin = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
bat = {
|
||||||
|
enable = true;
|
||||||
|
config.theme = "gruvbox-dark";
|
||||||
|
};
|
||||||
|
fzf = {
|
||||||
|
enable = true;
|
||||||
|
enableZshIntegration = true;
|
||||||
|
defaultOptions = [
|
||||||
|
"--height 40%"
|
||||||
|
"--layout=reverse"
|
||||||
|
"--border"
|
||||||
|
"--inline-info"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
git = {
|
||||||
|
enable = true;
|
||||||
|
lfs.enable = true;
|
||||||
|
|
||||||
|
# Default configs
|
||||||
|
extraConfig = {
|
||||||
|
commit.gpgSign = true;
|
||||||
|
|
||||||
|
user.name = "Philipp Hochkamp";
|
||||||
|
user.email = "git@phochkamp.de";
|
||||||
|
user.signingKey = "DA5D9235BD5BD4BD6F4C2EA868066BFF4EA525F1";
|
||||||
|
|
||||||
|
# Set default "git pull" behaviour so it doesn't try to default to
|
||||||
|
# either "git fetch; git merge" (default) or "git fetch; git rebase".
|
||||||
|
pull.ff = "only";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
# Htop configurations
|
||||||
|
htop = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
hide_userland_threads = true;
|
||||||
|
highlight_base_name = true;
|
||||||
|
shadow_other_users = true;
|
||||||
|
show_program_path = false;
|
||||||
|
tree_view = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
12
hm-imports/files.nix
Normal file
12
hm-imports/files.nix
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
{ inputs, config, lib, pkgs, ... }:
|
||||||
|
{
|
||||||
|
home.file = {
|
||||||
|
# Home nix config.
|
||||||
|
".config/nixpkgs/config.nix".text = "{ allowUnfree = true; }";
|
||||||
|
".local/share/pandoc/templates/default.latex".source = "${inputs.pandoc-latex-template}/eisvogel.tex";
|
||||||
|
|
||||||
|
# empty zshrc to stop zsh-newuser-install from running
|
||||||
|
".zshrc".text = "";
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
51
hm-imports/nvim/config/coc-settings.json
Normal file
51
hm-imports/nvim/config/coc-settings.json
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
{
|
||||||
|
"suggest.triggerCompletionWait": 50,
|
||||||
|
"suggest.enablePreview": true,
|
||||||
|
"html.enable": true,
|
||||||
|
"python.linting.enabled": true,
|
||||||
|
"html.format.enable": true,
|
||||||
|
"html.suggest.html5": true,
|
||||||
|
"html.suggest.ionic": true,
|
||||||
|
"html.validate.html": true,
|
||||||
|
"html.validate.styles": true,
|
||||||
|
"diagnostic-languageserver.mergeConfig": true,
|
||||||
|
"diagnostic-languageserver.filetypes": {
|
||||||
|
"vim": "vint",
|
||||||
|
"sh": "shellcheck",
|
||||||
|
"markdown": "write-good"
|
||||||
|
},
|
||||||
|
"diagnostic-languageserver.formatFiletypes": {
|
||||||
|
"sh": "shfmt"
|
||||||
|
},
|
||||||
|
"tabnine.disable_filetypes": ["pandoc"],
|
||||||
|
"flutter.provider.hot-reload": true,
|
||||||
|
"flutter.provider.enableSnippet": true,
|
||||||
|
"snippets.ultisnips.direcories": ["snippets"],
|
||||||
|
"rust-analyzer.procMacro.enable": true,
|
||||||
|
"rust-analyzer.cargo.allFeatures": true,
|
||||||
|
"rust-analyzer.inlayHints.refreshOnInsertMode": true,
|
||||||
|
"rust-analyzer.updates.channel": "nightly",
|
||||||
|
"html.validate.scripts": true,
|
||||||
|
"git.gitlab.hosts": [
|
||||||
|
"gitlab.com"
|
||||||
|
],
|
||||||
|
"git.addGBlameToVirtualText": true,
|
||||||
|
"languageserver": {
|
||||||
|
"nix": {
|
||||||
|
"command": "rnix-lsp",
|
||||||
|
"filetypes": [
|
||||||
|
"nix"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"terraform": {
|
||||||
|
"command": "terraform-ls",
|
||||||
|
"args": ["serve"],
|
||||||
|
"filetypes": [
|
||||||
|
"terraform",
|
||||||
|
"tf"
|
||||||
|
],
|
||||||
|
"initializationOptions": {},
|
||||||
|
"settings": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
145
hm-imports/nvim/config/coc.vim
Normal file
145
hm-imports/nvim/config/coc.vim
Normal file
|
|
@ -0,0 +1,145 @@
|
||||||
|
if system('id -u') > 500
|
||||||
|
let g:coc_global_extensions = [ 'coc-markdownlint', 'coc-diagnostic', 'coc-angular', 'coc-css', 'coc-docker', 'coc-flutter-tools', 'coc-git', 'coc-homeassistant', 'coc-html', 'coc-json', 'coc-marketplace', 'coc-prettier', 'coc-pyright', 'coc-rls', 'coc-rust-analyzer', 'coc-scssmodules', 'coc-sh', 'coc-snippets', 'coc-stylelintplus', 'coc-swagger', 'coc-tabnine', 'coc-eslint', 'coc-tsserver', 'coc-webpack', 'coc-yaml' ]
|
||||||
|
endif
|
||||||
|
" \coc Some servers have issues with backup files, see #649.
|
||||||
|
set nobackup
|
||||||
|
set nowritebackup
|
||||||
|
" \coc Don't pass messages to |ins-completion-menu|.
|
||||||
|
set shortmess+=c
|
||||||
|
" \coc Always show the signcolumn, otherwise it would shift the text each time
|
||||||
|
" diagnostics appear/become resolved.
|
||||||
|
set signcolumn=number
|
||||||
|
function! s:check_back_space() abort
|
||||||
|
let col = col('.') - 1
|
||||||
|
return !col || getline('.')[col - 1] =~# '\s'
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" c-space to trigger completion
|
||||||
|
inoremap <silent><expr> <c-space> coc#refresh()
|
||||||
|
" Make <CR> auto-select the first completion item and notify coc.nvim to
|
||||||
|
" format on enter, <cr> could be remapped by other vim plugin
|
||||||
|
inoremap <silent><expr> <cr> pumvisible() ? coc#_select_confirm()
|
||||||
|
\: "\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"
|
||||||
|
|
||||||
|
" Use `[g` and `]g` to navigate diagnostics
|
||||||
|
" Use `:CocDiagnostics` to get all diagnostics of current buffer in location list.
|
||||||
|
nmap <silent> [g <Plug>(coc-diagnostic-prev)
|
||||||
|
nmap <silent> ]g <Plug>(coc-diagnostic-next)
|
||||||
|
|
||||||
|
inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : "\<Tab>"
|
||||||
|
inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"
|
||||||
|
|
||||||
|
" GoTo code navigation.
|
||||||
|
nmap <silent> gd <Plug>(coc-definition)
|
||||||
|
nmap <silent> gy <Plug>(coc-type-definition)
|
||||||
|
nmap <silent> gi <Plug>(coc-implementation)
|
||||||
|
nmap <silent> gr <Plug>(coc-references)
|
||||||
|
" Use K to show documentation in preview window.
|
||||||
|
nnoremap <silent> K :call <SID>show_documentation()<CR>
|
||||||
|
function! s:show_documentation()
|
||||||
|
if (index(['vim','help'], &filetype) >= 0)
|
||||||
|
execute 'h '.expand('<cword>')
|
||||||
|
elseif (coc#rpc#ready())
|
||||||
|
call CocActionAsync('doHover')
|
||||||
|
else
|
||||||
|
execute '!' . &keywordprg . " " . expand('<cword>')
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
" Highlight the symbol and its references when holding the cursor.
|
||||||
|
autocmd CursorHold * silent call CocActionAsync('highlight')
|
||||||
|
" Symbol renaming.
|
||||||
|
nmap <leader>rn <Plug>(coc-rename)
|
||||||
|
|
||||||
|
" coc snippets
|
||||||
|
" Use <C-l> for trigger snippet expand.
|
||||||
|
imap <C-l> <Plug>(coc-snippets-expand)
|
||||||
|
|
||||||
|
" Use <C-j> for select text for visual placeholder of snippet.
|
||||||
|
vmap <C-j> <Plug>(coc-snippets-select)
|
||||||
|
|
||||||
|
" Use <C-j> for jump to next placeholder, it's default of coc.nvim
|
||||||
|
let g:coc_snippet_next = '<c-j>'
|
||||||
|
|
||||||
|
" Use <C-k> for jump to previous placeholder, it's default of coc.nvim
|
||||||
|
let g:coc_snippet_prev = '<c-k>'
|
||||||
|
|
||||||
|
" Use <C-j> for both expand and jump (make expand higher priority.)
|
||||||
|
imap <C-j> <Plug>(coc-snippets-expand-jump)
|
||||||
|
|
||||||
|
" Use <leader>x for convert visual selected code to snippet
|
||||||
|
xmap <leader>x <Plug>(coc-convert-snippet)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
" Formatting selected code.
|
||||||
|
xmap <leader>f <Plug>(coc-format-selected)
|
||||||
|
nmap <leader>f <Plug>(coc-format-selected)
|
||||||
|
augroup mygroup
|
||||||
|
autocmd!
|
||||||
|
" Setup formatexpr specified filetype(s).
|
||||||
|
autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected')
|
||||||
|
" Update signature help on jump placeholder.
|
||||||
|
autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp')
|
||||||
|
augroup end
|
||||||
|
|
||||||
|
" Applying codeAction to the selected region.
|
||||||
|
" Example: `<leader>aap` for current paragraph
|
||||||
|
xmap <leader>a <Plug>(coc-codeaction-selected)
|
||||||
|
nmap <leader>a <Plug>(coc-codeaction-selected)
|
||||||
|
|
||||||
|
" Remap keys for applying codeAction to the current buffer.
|
||||||
|
nmap <leader>ac <Plug>(coc-codeaction)
|
||||||
|
" Apply AutoFix to problem on the current line.
|
||||||
|
nmap <leader>qf <Plug>(coc-fix-current)
|
||||||
|
nmap <leader>f :CocFix<CR>
|
||||||
|
|
||||||
|
" Map function and class text objects
|
||||||
|
" NOTE: Requires 'textDocument.documentSymbol' support from the language server.
|
||||||
|
xmap if <Plug>(coc-funcobj-i)
|
||||||
|
omap if <Plug>(coc-funcobj-i)
|
||||||
|
xmap af <Plug>(coc-funcobj-a)
|
||||||
|
omap af <Plug>(coc-funcobj-a)
|
||||||
|
xmap ic <Plug>(coc-classobj-i)
|
||||||
|
omap ic <Plug>(coc-classobj-i)
|
||||||
|
xmap ac <Plug>(coc-classobj-a)
|
||||||
|
omap ac <Plug>(coc-classobj-a)
|
||||||
|
|
||||||
|
" Remap <C-f> and <C-b> for scroll float windows/popups.
|
||||||
|
nnoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? coc#float#scroll(1) : "\<C-f>"
|
||||||
|
nnoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? coc#float#scroll(0) : "\<C-b>"
|
||||||
|
inoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? "\<c-r>=coc#float#scroll(1)\<cr>" : "\<Right>"
|
||||||
|
inoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? "\<c-r>=coc#float#scroll(0)\<cr>" : "\<Left>"
|
||||||
|
vnoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? coc#float#scroll(1) : "\<C-f>"
|
||||||
|
vnoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? coc#float#scroll(0) : "\<C-b>"
|
||||||
|
|
||||||
|
" Use CTRL-S for selections ranges.
|
||||||
|
" Requires 'textDocument/selectionRange' support of language server.
|
||||||
|
nmap <silent> <C-a> <Plug>(coc-range-select)
|
||||||
|
xmap <silent> <C-a> <Plug>(coc-range-select)
|
||||||
|
|
||||||
|
" Add `:Format` command to format current buffer.
|
||||||
|
command! -nargs=0 Format :call CocAction('format')
|
||||||
|
|
||||||
|
" Add `:Fold` command to fold current buffer.
|
||||||
|
command! -nargs=? Fold :call CocAction('fold', <f-args>)
|
||||||
|
|
||||||
|
" Add `:OR` command for organize imports of the current buffer.
|
||||||
|
command! -nargs=0 OR :call CocAction('runCommand', 'editor.action.organizeImport')
|
||||||
|
|
||||||
|
" Mappings for CoCList
|
||||||
|
" Show all diagnostics.
|
||||||
|
nnoremap <silent><nowait> <space>a :<C-u>CocList diagnostics<cr>
|
||||||
|
" Manage extensions.
|
||||||
|
nnoremap <silent><nowait> <space>e :<C-u>CocList extensions<cr>
|
||||||
|
" Show commands.
|
||||||
|
nnoremap <silent><nowait> <space>c :<C-u>CocList commands<cr>
|
||||||
|
" Find symbol of current document.
|
||||||
|
nnoremap <silent><nowait> <space>o :<C-u>CocList outline<cr>
|
||||||
|
" Search workspace symbols.
|
||||||
|
nnoremap <silent><nowait> <space>s :<C-u>CocList -I symbols<cr>
|
||||||
|
" Do default action for next item.
|
||||||
|
nnoremap <silent><nowait> <space>j :<C-u>CocNext<CR>
|
||||||
|
" Do default action for previous item.
|
||||||
|
nnoremap <silent><nowait> <space>k :<C-u>CocPrev<CR>
|
||||||
|
" Resume latest coc list.
|
||||||
|
nnoremap <silent><nowait> <space>p :<C-u>CocListResume<CR>
|
||||||
47
hm-imports/nvim/config/init.lua
Normal file
47
hm-imports/nvim/config/init.lua
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
require('utils')
|
||||||
|
require('keybindings')
|
||||||
|
require('filetypes')
|
||||||
|
local opt = vim.opt
|
||||||
|
|
||||||
|
-- load plugin luas (idk how to do that autmagically)
|
||||||
|
require('plugin.nnn')
|
||||||
|
require('plugin.rainbow')
|
||||||
|
require('plugin.terminal')
|
||||||
|
|
||||||
|
-- plugins - coc
|
||||||
|
vim.cmd 'source /etc/nvim/coc.vim' -- too lazy to convert all the shit to lua
|
||||||
|
-- terminal
|
||||||
|
vim.cmd 'source /etc/nvim/terminal.vim' -- too lazy to convert all the shit to lua
|
||||||
|
|
||||||
|
-- color stuff
|
||||||
|
vim.g.gruvbox_italic = 1
|
||||||
|
vim.cmd ':colorscheme gruvbox'
|
||||||
|
opt.termguicolors = true -- 24bit color
|
||||||
|
opt.background = 'dark' -- dark gruvbox
|
||||||
|
|
||||||
|
-- general settings
|
||||||
|
vim.cmd [[
|
||||||
|
filetype plugin on
|
||||||
|
filetype indent plugin on
|
||||||
|
filetype plugin indent on
|
||||||
|
syntax on
|
||||||
|
]]
|
||||||
|
opt.encoding = 'utf-8'
|
||||||
|
opt.number = true
|
||||||
|
opt.relativenumber = true
|
||||||
|
opt.undofile = true -- save undo chages even after computer restart
|
||||||
|
opt.showcmd = true -- show (partial) command in status line
|
||||||
|
opt.showmatch = true -- show match brackets
|
||||||
|
opt.wildmenu = true -- visual autocomplete for command menu
|
||||||
|
-- Splits open at the bottom and right, which is non-retarded, unlike vim defaults.
|
||||||
|
opt.splitbelow = true
|
||||||
|
opt.splitright = true
|
||||||
|
-- indents
|
||||||
|
opt.expandtab = true
|
||||||
|
opt.shiftwidth = 2
|
||||||
|
opt.softtabstop = 2
|
||||||
|
-- buffers don't get unloaded when hidden
|
||||||
|
opt.hidden = true
|
||||||
|
-- low updatetime so it isnt as slow
|
||||||
|
opt.updatetime = 200
|
||||||
|
require('plugin.lualine')
|
||||||
3
hm-imports/nvim/config/lua/filetypes.lua
Normal file
3
hm-imports/nvim/config/lua/filetypes.lua
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
vim.cmd [[
|
||||||
|
autocmd FileType yaml setlocal ts=2 sts=2 sw=2 expandtab
|
||||||
|
]]
|
||||||
45
hm-imports/nvim/config/lua/keybindings.lua
Normal file
45
hm-imports/nvim/config/lua/keybindings.lua
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
local map = require('utils').map
|
||||||
|
|
||||||
|
-- split binds
|
||||||
|
map { 'n', '<A-h>', ':vertical resize -5<CR>', noremap = true, silent = true}
|
||||||
|
map { 'n', '<A-l>', ':vertical resize +5<CR>', noremap = true, silent = true}
|
||||||
|
map { 'n', '<A-j>', ':resize -5<CR>', noremap = true, silent = true}
|
||||||
|
map { 'n', '<A-k>', ':resize +5<CR>', noremap = true, silent = true}
|
||||||
|
map { 'n', '<A-=>', '<C-w> =', noremap = true, silent = true}
|
||||||
|
|
||||||
|
map { 'n', '<A-s>', ':vsp<CR>', noremap = true, silent = true}
|
||||||
|
map { 'n', '<C-s>', ':split<CR>', noremap = true, silent = true}
|
||||||
|
|
||||||
|
map { 'n', '<C-h>', '<C-w>h', noremap = true, silent = true}
|
||||||
|
map { 'n', '<C-j>', '<C-w>j', noremap = true, silent = true}
|
||||||
|
map { 'n', '<C-k>', '<C-w>k', noremap = true, silent = true}
|
||||||
|
map { 'n', '<C-l>', '<C-w>l', noremap = true, silent = true}
|
||||||
|
|
||||||
|
-- buffer binds
|
||||||
|
map { 'n', ',q', ':bd<CR>', noremap = false, silent = true}
|
||||||
|
map { 'n', ',b', ':Buffers<CR>', noremap = false, silent = true}
|
||||||
|
-- tab binds
|
||||||
|
map { 'n', '<C-t>', ':tabnew<CR>', noremap = false, silent = true}
|
||||||
|
|
||||||
|
-- copy paste
|
||||||
|
map { 'v', '<C-c>', '"+y', noremap = true, silent = true}
|
||||||
|
map { 'n', '<C-b>', '"+P', noremap = false, silent = true}
|
||||||
|
map { 'n', '<C-p>', ':registers<CR>', noremap = true, silent = true}
|
||||||
|
|
||||||
|
-- sudo :w
|
||||||
|
map { 'c', 'w!!', 'w !sudo tee > /dev/null %', noremap = false, silent = false}
|
||||||
|
|
||||||
|
|
||||||
|
-- terminal
|
||||||
|
map { 'n', '<leader>t', ':term<CR>', noremap = false, silent = true}
|
||||||
|
map { 't', '<C-b>', '<C-\\><C-n>', noremap = true, silent = true}
|
||||||
|
|
||||||
|
-- plugins - commentary
|
||||||
|
map { 'n', '<leader>c', ':Commentary<CR>', noremap = false, silent = true}
|
||||||
|
-- plugins - vista
|
||||||
|
map { 'n', '<leader>v', ':Vista!!<CR>', noremap = false, silent = true}
|
||||||
|
-- plugins - nnn
|
||||||
|
map { 'n', '<tab>', '::NnnPicker %:p:h<CR>', noremap = true, silent = true}
|
||||||
|
|
||||||
|
-- plugins - terminal
|
||||||
|
map {"n", "<leader>l", "<cmd>lua _lazygit_toggle()<CR>", {noremap = true, silent = true}}
|
||||||
28
hm-imports/nvim/config/lua/plugin/lualine.lua
Normal file
28
hm-imports/nvim/config/lua/plugin/lualine.lua
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
require('lualine').setup {
|
||||||
|
options = {
|
||||||
|
icons_enabled = true,
|
||||||
|
theme = 'gruvbox',
|
||||||
|
component_separators = { left = '', right = ''},
|
||||||
|
section_separators = { left = '', right = ''},
|
||||||
|
disabled_filetypes = {},
|
||||||
|
always_divide_middle = true,
|
||||||
|
},
|
||||||
|
sections = {
|
||||||
|
lualine_a = {'mode'},
|
||||||
|
lualine_b = {'branch', 'diff', 'diagnostics'},
|
||||||
|
lualine_c = {'filename'},
|
||||||
|
lualine_x = {'encoding', 'fileformat', 'filetype'},
|
||||||
|
lualine_y = {'progress'},
|
||||||
|
lualine_z = {'location'}
|
||||||
|
},
|
||||||
|
inactive_sections = {
|
||||||
|
lualine_a = {},
|
||||||
|
lualine_b = {},
|
||||||
|
lualine_c = {'filename'},
|
||||||
|
lualine_x = {'location'},
|
||||||
|
lualine_y = {},
|
||||||
|
lualine_z = {}
|
||||||
|
},
|
||||||
|
tabline = {},
|
||||||
|
extensions = {}
|
||||||
|
}
|
||||||
11
hm-imports/nvim/config/lua/plugin/nnn.lua
Normal file
11
hm-imports/nvim/config/lua/plugin/nnn.lua
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
require('nnn').setup({
|
||||||
|
set_default_mappings = 0,
|
||||||
|
replace_netrw = 1,
|
||||||
|
layout = {
|
||||||
|
window = {
|
||||||
|
width = 0.9,
|
||||||
|
height = 0.6,
|
||||||
|
highlight = 'Debug'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
1
hm-imports/nvim/config/lua/plugin/rainbow.lua
Normal file
1
hm-imports/nvim/config/lua/plugin/rainbow.lua
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
vim.g.rainbow_active = 1
|
||||||
22
hm-imports/nvim/config/lua/plugin/terminal.lua
Normal file
22
hm-imports/nvim/config/lua/plugin/terminal.lua
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
require('toggleterm').setup {
|
||||||
|
direction = 'window',
|
||||||
|
open_mapping = [[<c-n>]],
|
||||||
|
}
|
||||||
|
local Terminal = require('toggleterm.terminal').Terminal
|
||||||
|
|
||||||
|
local lazygit = Terminal:new {
|
||||||
|
cmd = "lazygit",
|
||||||
|
hidden = true,
|
||||||
|
direction = 'float'
|
||||||
|
}
|
||||||
|
|
||||||
|
function _lazygit_toggle()
|
||||||
|
lazygit:toggle()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- local pipeline = Terminal:new {
|
||||||
|
-- cmd = "glab ci view",
|
||||||
|
-- hidden = true,
|
||||||
|
-- direction = 'float'
|
||||||
|
-- }
|
||||||
|
|
||||||
21
hm-imports/nvim/config/lua/utils.lua
Normal file
21
hm-imports/nvim/config/lua/utils.lua
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
-- cool map funciton from https://vonheikemen.github.io/devlog/tools/configuring-neovim-using-lua/
|
||||||
|
utils = {}
|
||||||
|
utils.map = function(key)
|
||||||
|
-- get the extra options
|
||||||
|
local opts = {noremap = false}
|
||||||
|
for i, v in pairs(key) do
|
||||||
|
if (i) == 'string' then opts[i] = v end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- basic support for buffer-scoped keybindings
|
||||||
|
local buffer = opts.buffer
|
||||||
|
opts.buffer = nil
|
||||||
|
|
||||||
|
if buffer then
|
||||||
|
vim.api.nvim_buf_set_keymap(0, key[1], key[2], key[3], opts)
|
||||||
|
else
|
||||||
|
vim.api.nvim_set_keymap(key[1], key[2], key[3], opts)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return utils
|
||||||
121
hm-imports/nvim/config/snippets/all.snippets
Normal file
121
hm-imports/nvim/config/snippets/all.snippets
Normal file
|
|
@ -0,0 +1,121 @@
|
||||||
|
# This file contains snippets that are always defined. I personally
|
||||||
|
# have snippets for signatures and often needed texts
|
||||||
|
|
||||||
|
# sligthly lower priority than everything else since specialized versions
|
||||||
|
# should overwrite. The user needs to adjust her priority in her snippets to
|
||||||
|
# ~-55 so that other filetypes will still overwrite.
|
||||||
|
priority -60
|
||||||
|
|
||||||
|
global !p
|
||||||
|
def _parse_comments(s):
|
||||||
|
""" Parses vim's comments option to extract comment format """
|
||||||
|
i = iter(s.split(","))
|
||||||
|
|
||||||
|
rv = []
|
||||||
|
try:
|
||||||
|
while True:
|
||||||
|
# get the flags and text of a comment part
|
||||||
|
flags, text = next(i).split(':', 1)
|
||||||
|
|
||||||
|
if len(flags) == 0:
|
||||||
|
rv.append(('OTHER', text, text, text, ""))
|
||||||
|
# parse 3-part comment, but ignore those with O flag
|
||||||
|
elif 's' in flags and 'O' not in flags:
|
||||||
|
ctriple = ["TRIPLE"]
|
||||||
|
indent = ""
|
||||||
|
|
||||||
|
if flags[-1] in string.digits:
|
||||||
|
indent = " " * int(flags[-1])
|
||||||
|
ctriple.append(text)
|
||||||
|
|
||||||
|
flags, text = next(i).split(':', 1)
|
||||||
|
assert flags[0] == 'm'
|
||||||
|
ctriple.append(text)
|
||||||
|
|
||||||
|
flags, text = next(i).split(':', 1)
|
||||||
|
assert flags[0] == 'e'
|
||||||
|
ctriple.append(text)
|
||||||
|
ctriple.append(indent)
|
||||||
|
|
||||||
|
rv.append(ctriple)
|
||||||
|
elif 'b' in flags:
|
||||||
|
if len(text) == 1:
|
||||||
|
rv.insert(0, ("SINGLE_CHAR", text, text, text, ""))
|
||||||
|
except StopIteration:
|
||||||
|
return rv
|
||||||
|
|
||||||
|
def get_comment_format():
|
||||||
|
""" Returns a 4-element tuple (first_line, middle_lines, end_line, indent)
|
||||||
|
representing the comment format for the current file.
|
||||||
|
It first looks at the 'commentstring', if that ends with %s, it uses that.
|
||||||
|
Otherwise it parses '&comments' and prefers single character comment
|
||||||
|
markers if there are any.
|
||||||
|
"""
|
||||||
|
commentstring = vim.eval("&commentstring")
|
||||||
|
if commentstring.endswith("%s"):
|
||||||
|
c = commentstring[:-2]
|
||||||
|
return (c, c, c, "")
|
||||||
|
comments = _parse_comments(vim.eval("&comments"))
|
||||||
|
for c in comments:
|
||||||
|
if c[0] == "SINGLE_CHAR":
|
||||||
|
return c[1:]
|
||||||
|
return comments[0][1:]
|
||||||
|
endglobal
|
||||||
|
|
||||||
|
##########################
|
||||||
|
# LOREM IPSUM GENERATORS #
|
||||||
|
##########################
|
||||||
|
snippet lorem "Lorem Ipsum - 50 Words" b
|
||||||
|
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
|
||||||
|
tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At
|
||||||
|
vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren,
|
||||||
|
no sea takimata sanctus est Lorem ipsum dolor sit amet.
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
##########################
|
||||||
|
# VIM MODELINE GENERATOR #
|
||||||
|
##########################
|
||||||
|
# See advice on `:help 'tabstop'` for why these values are set. Uses second
|
||||||
|
# modeline form ('set') to work in languages with comment terminators
|
||||||
|
# (/* like C */).
|
||||||
|
snippet modeline "Vim modeline"
|
||||||
|
vim`!v ':set '. (&expandtab ? printf('et sw=%i ts=%i', &sw, &ts) : printf('noet sts=%i sw=%i ts=%i', &sts, &sw, &ts)) . (&tw ? ' tw='. &tw : '') . ':'`
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
|
||||||
|
#########
|
||||||
|
# DATES #
|
||||||
|
#########
|
||||||
|
snippet date "YYYY-MM-DD" w
|
||||||
|
`!v strftime("%Y-%m-%d")`
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet ddate "DD.MM.YYYY" w
|
||||||
|
`!v strftime("%d.%m.%Y")`
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet diso "ISO format datetime" w
|
||||||
|
`!v strftime("%Y-%m-%d %H:%M:%S%z")`
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet time "hh:mm" w
|
||||||
|
`!v strftime("%H:%M")`
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet datetime "YYYY-MM-DD hh:mm" w
|
||||||
|
`!v strftime("%Y-%m-%d %H:%M")`
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet todo "TODO comment" bw
|
||||||
|
`!p snip.rv=get_comment_format()[0]` ${2:TODO}: $1 ${3: <${4:`!v strftime('%d.%m.%y %H:%M')`}${5:, `git config --get user.name`}>} `!p snip.rv=get_comment_format()[2]`
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
|
||||||
|
##########
|
||||||
|
# Misc #
|
||||||
|
##########
|
||||||
|
snippet uuid "Random UUID" w
|
||||||
|
`!p if not snip.c: import uuid; snip.rv = uuid.uuid4()`
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
# vim:ft=snippets:
|
||||||
115
hm-imports/nvim/config/snippets/go.snippets
Normal file
115
hm-imports/nvim/config/snippets/go.snippets
Normal file
|
|
@ -0,0 +1,115 @@
|
||||||
|
# Snippets for Go
|
||||||
|
|
||||||
|
priority -50
|
||||||
|
|
||||||
|
# when to abbriviate and when not?
|
||||||
|
# b doesn't work here, because it ignores whitespace
|
||||||
|
# optional local name?
|
||||||
|
snippet /^import/ "Import declaration" r
|
||||||
|
import (
|
||||||
|
"${1:package}"
|
||||||
|
)
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet /^package/ "Package declaration" r
|
||||||
|
// Package $1 provides ...
|
||||||
|
package ${1:main}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
# Mostly converted from: https://github.com/AlanQuatermain/go-tmbundle
|
||||||
|
snippet /^cons/ "Constants declaration" r
|
||||||
|
const (
|
||||||
|
${1:constant}${2/(.+)/ /}${2:type} = ${0:value}
|
||||||
|
)
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet /^con/ "Constant declaration" r
|
||||||
|
const ${1:name}${2/(.+)/ /}${2:type} = ${0:value}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet iota "Iota constant generator" b
|
||||||
|
const (
|
||||||
|
${1:constant}${2/(.+)/ /}${2:type} = iota
|
||||||
|
)
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet struct "Struct declaration" b
|
||||||
|
type ${1:Struct} struct {
|
||||||
|
${0:${VISUAL}}
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet interface "Interface declaration" b
|
||||||
|
type ${1:Interface} interface {
|
||||||
|
${0:${VISUAL}}
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet if "If statement" b
|
||||||
|
if ${1:condition}${1/(.+)/ /}{
|
||||||
|
${0:${VISUAL}}
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet switch "Switch statement" b
|
||||||
|
switch ${1:expression}${1/(.+)/ /}{
|
||||||
|
case$0
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
# functions
|
||||||
|
snippet /^main/ "Main function" r
|
||||||
|
func main() {
|
||||||
|
${0:${VISUAL}}
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet /^meth/ "Method" r
|
||||||
|
func (${1:receiver} ${2:type}) ${3:name}(${4:params})${5/(.+)/ /}${5:type} {
|
||||||
|
${0:${VISUAL}}
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet func "Function" b
|
||||||
|
func ${1:name}(${2:params})${3/(.+)/ /}${3:type} {
|
||||||
|
${0:${VISUAL}}
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet funch "HTTP handler" b
|
||||||
|
func ${1:handler}(${2:w} http.ResponseWriter, ${3:r} *http.Request) {
|
||||||
|
${0:${VISUAL}}
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
# types and variables
|
||||||
|
snippet map "Map type" b
|
||||||
|
map[${1:keytype}]${2:valtype}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet : "Variable declaration :=" b
|
||||||
|
${1:name} := ${0:value}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet var "Variable declaration" b
|
||||||
|
var ${1:name}${2/(.+)/ /}${2:type}${3: = ${0:value}}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet vars "Variables declaration" b
|
||||||
|
var (
|
||||||
|
${1:name}${2/(.+)/ /}${2:type}${3: = ${0:value} }
|
||||||
|
)
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet json "JSON field"
|
||||||
|
\`json:"${1:displayName}"\`
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
# vim:ft=snippets:
|
||||||
|
|
||||||
|
# error handling
|
||||||
|
snippet err "Basic error handling" b
|
||||||
|
if err != nil {
|
||||||
|
log.${1:Fatal}(err)
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
399
hm-imports/nvim/config/snippets/java.snippets
Normal file
399
hm-imports/nvim/config/snippets/java.snippets
Normal file
|
|
@ -0,0 +1,399 @@
|
||||||
|
###########################################################################
|
||||||
|
# TEXTMATE SNIPPETS #
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
# Many of the snippets here use a global option called
|
||||||
|
# "g:ultisnips_java_brace_style" which, if set to "nl" will put a newline
|
||||||
|
# before '{' braces.
|
||||||
|
|
||||||
|
global !p
|
||||||
|
def junit(snip):
|
||||||
|
if snip.opt("g:ultisnips_java_junit", "") == "3":
|
||||||
|
snip += ""
|
||||||
|
else:
|
||||||
|
snip.rv += "@Test\n\t"
|
||||||
|
|
||||||
|
def nl(snip):
|
||||||
|
if snip.opt("g:ultisnips_java_brace_style", "") == "nl":
|
||||||
|
snip += ""
|
||||||
|
else:
|
||||||
|
snip.rv += " "
|
||||||
|
def getArgs(group):
|
||||||
|
import re
|
||||||
|
word = re.compile('[a-zA-Z><.]+ \w+')
|
||||||
|
return [i.split(" ") for i in word.findall(group) ]
|
||||||
|
|
||||||
|
def camel(word):
|
||||||
|
return word[0].upper() + word[1:]
|
||||||
|
|
||||||
|
endglobal
|
||||||
|
|
||||||
|
snippet sleep "try sleep catch" !b
|
||||||
|
try {
|
||||||
|
Thread.sleep(${1:1000});
|
||||||
|
} catch (InterruptedException e){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet /i|n/ "new primitive or int" !br
|
||||||
|
${1:int} ${2:i} = ${3:1};
|
||||||
|
$0
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet /o|v/ "new Object or variable" !br
|
||||||
|
${1:Object} ${2:var} = new $1(${3});
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet f "field" !b
|
||||||
|
${1:private} ${2:String} ${3:`!p snip.rv = t[2].lower()`};
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet ab "abstract" b
|
||||||
|
abstract
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet as "assert" b
|
||||||
|
assert ${1:test}${2/(.+)/(?1: \: ")/}${2:Failure message}${2/(.+)/(?1:")/};$0
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet at "assert true" !b
|
||||||
|
assertTrue(${1:actual});
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet af "assert false" !b
|
||||||
|
assertFalse(${1:actual});$0
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet ae "assert equals" !b
|
||||||
|
assertEquals(${1:expected}, ${2:actual});
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet br "break"
|
||||||
|
break;
|
||||||
|
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet cs "case" b
|
||||||
|
case $1:
|
||||||
|
$2
|
||||||
|
$0
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet ca "catch" b
|
||||||
|
catch (${1:Exception} ${2:e})`!p nl(snip)`{
|
||||||
|
$0
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet cle "class extends" b
|
||||||
|
public class ${1:`!p
|
||||||
|
snip.rv = snip.basename or "untitled"`} ${2:extends ${3:Parent} }${4:implements ${5:Interface} }{
|
||||||
|
$0
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet clc "class with constructor, fields, setter and getters"
|
||||||
|
public class `!p
|
||||||
|
snip.rv = snip.basename or "untitled"` {
|
||||||
|
`!p
|
||||||
|
import re
|
||||||
|
args = getArgs(t[1])
|
||||||
|
if len(args) == 0: snip.rv = ""
|
||||||
|
for i in args:
|
||||||
|
snip.rv += "\n\tprivate " + i[0] + " " + i[1]+ ";"
|
||||||
|
if len(args) > 0:
|
||||||
|
snip.rv += "\n"`
|
||||||
|
public `!p snip.rv = snip.basename or "unknown"`($1) { `!p
|
||||||
|
args = getArgs(t[1])
|
||||||
|
for i in args:
|
||||||
|
snip.rv += "\n\t\tthis." + i[1] + " = " + i[1] + ";"
|
||||||
|
if len(args) == 0:
|
||||||
|
snip.rv += "\n"`
|
||||||
|
}$0
|
||||||
|
`!p
|
||||||
|
args = getArgs(t[1])
|
||||||
|
if len(args) == 0: snip.rv = ""
|
||||||
|
for i in args:
|
||||||
|
snip.rv += "\n\tpublic void set" + camel(i[1]) + "(" + i[0] + " " + i[1] + ") {\n" + "\
|
||||||
|
\tthis." + i[1] + " = " + i[1] + ";\n\t}\n"
|
||||||
|
|
||||||
|
snip.rv += "\n\tpublic " + i[0] + " get" + camel(i[1]) + "() {\
|
||||||
|
\n\t\treturn " + i[1] + ";\n\t}\n"
|
||||||
|
`
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet cl "class" b
|
||||||
|
public class ${1:`!p
|
||||||
|
snip.rv = snip.basename or "untitled"`} {
|
||||||
|
$0
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet cos "constant string" b
|
||||||
|
public static final String ${1:var} = "$2";$0
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet co "constant" b
|
||||||
|
public static final ${1:String} ${2:var} = $3;$0
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet de "default" b
|
||||||
|
default:
|
||||||
|
$0
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet elif "else if" b
|
||||||
|
else if ($1)`!p nl(snip)`{
|
||||||
|
$0
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet else "else" b
|
||||||
|
else`!p nl(snip)`{
|
||||||
|
$0
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet fi "final" b
|
||||||
|
final
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet fore "for (each)" b
|
||||||
|
for ($1 : $2)`!p nl(snip)`{
|
||||||
|
$0
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet fori "for with int i" b
|
||||||
|
for (int ${1:i} = 0; $1 < ${2:10}; $1++)`!p nl(snip)`{
|
||||||
|
$0
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet for "for" b
|
||||||
|
for ($1; $2; $3)`!p nl(snip)`{
|
||||||
|
$0
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet if "if" b
|
||||||
|
if ($1)`!p nl(snip)`{
|
||||||
|
$0
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet imt "import junit_framework_TestCase;" b
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
$0
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet im "import" b
|
||||||
|
import ${1:java}.${2:util}.$0
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet in "interface" b
|
||||||
|
interface ${1:`!p snip.rv = snip.basename or "untitled"`} ${2:extends ${3:Parent} }{
|
||||||
|
$0
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet cc "constuctor call or setter body"
|
||||||
|
this.${1:var} = $1;
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet list "Collections List" b
|
||||||
|
List<${1:String}> ${2:list} = new ${3:Array}List<$1>();
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet map "Collections Map" b
|
||||||
|
Map<${1:String}, ${2:String}> ${3:map} = new ${4:Hash}Map<$1, $2>();
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet set "Collections Set" !b
|
||||||
|
Set<${1:String}> ${2:set} = new ${3:Hash}Set<$1>();
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet /Str?|str/ "String" !br
|
||||||
|
String
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
|
||||||
|
snippet cn "constructor, \w fields + assigments" b
|
||||||
|
`!p
|
||||||
|
import re
|
||||||
|
args = getArgs(t[1])
|
||||||
|
for i in args:
|
||||||
|
snip.rv += "\n\tprivate " + i[0] + " " + i[1]+ ";"
|
||||||
|
if len(args) > 0:
|
||||||
|
snip.rv += "\n"`
|
||||||
|
public `!p snip.rv = snip.basename or "unknown"`($1) { `!p
|
||||||
|
args = getArgs(t[1])
|
||||||
|
for i in args:
|
||||||
|
snip.rv += "\n\t\tthis." + i[1] + " = " + i[1]
|
||||||
|
if len(args) == 0:
|
||||||
|
snip.rv += "\n"`
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet j.b "java_beans_" i
|
||||||
|
java.beans.
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet j.i "java_io" i
|
||||||
|
java.io.
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet j.m "java_math" i
|
||||||
|
java.math.
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet j.n "java_net_" i
|
||||||
|
java.net.
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet j.u "java_util_" i
|
||||||
|
java.util.
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet main "method (main)" b
|
||||||
|
public static void main(String[] args)`!p nl(snip)`{
|
||||||
|
$0
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet try "try/catch" !b
|
||||||
|
try {
|
||||||
|
$1
|
||||||
|
} catch(${2:Exception} ${3:e}){
|
||||||
|
${4:e.printStackTrace();}
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet mt "method throws" b!
|
||||||
|
${1:private} ${2:void} ${3:method}(${4}) ${5:throws $6 }{
|
||||||
|
$0
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet m "method" b
|
||||||
|
${1:private} ${2:void} ${3:method}(${4}) {
|
||||||
|
$0
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet md "Method With javadoc" !b
|
||||||
|
/**
|
||||||
|
* ${7:Short Description}`!p
|
||||||
|
for i in getArgs(t[4]):
|
||||||
|
snip.rv += "\n\t * @param " + i[1] + " usage..."`
|
||||||
|
* `!p
|
||||||
|
if "throws" in t[5]:
|
||||||
|
snip.rv = "\n\t * @throws " + t[6]
|
||||||
|
else:
|
||||||
|
snip.rv = ""` `!p
|
||||||
|
if not "void" in t[2]:
|
||||||
|
snip.rv = "\n\t * @return object"
|
||||||
|
else:
|
||||||
|
snip.rv = ""`
|
||||||
|
**/
|
||||||
|
${1:public} ${2:void} ${3:method}($4) ${5:throws $6 }{
|
||||||
|
$0
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet getter "getter"
|
||||||
|
public ${1:String} get${2:Name}() {
|
||||||
|
return `!p snip.rv = t[2].lower()`;
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet setter "setter"
|
||||||
|
public void set${1:Name}(${2:String} $1) {
|
||||||
|
return this.`!p snip.rv = t[1].lower()` = `!p snip.rv = t[1].lower()`;
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet setget "setter and getter"
|
||||||
|
public void set${1:Name}(${2:String} `!p snip.rv = t[1].lower()`) {
|
||||||
|
this.`!p snip.rv = t[1].lower()` = `!p snip.rv = t[1].lower()`;
|
||||||
|
}
|
||||||
|
|
||||||
|
public $2 get$1() {
|
||||||
|
return `!p snip.rv = t[1].lower()`;
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet pa "package" b
|
||||||
|
package
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet p "print" b
|
||||||
|
System.out.print($1);$0
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet pl "println" b
|
||||||
|
System.out.println($1);$0
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet pr "private" b
|
||||||
|
private
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet po "protected" b
|
||||||
|
protected
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet pu "public" b
|
||||||
|
public
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet re "return" b
|
||||||
|
return
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet st "static"
|
||||||
|
static
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet sw "switch" b
|
||||||
|
switch ($1)`!p nl(snip)`{
|
||||||
|
case $2: $0
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet sy "synchronized"
|
||||||
|
synchronized
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet tc "test case"
|
||||||
|
public class ${1:`!p snip.rv = snip.basename or "untitled"`} extends ${2:TestCase}`!p nl(snip)`{
|
||||||
|
$0
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet t "test" b
|
||||||
|
`!p junit(snip)`public void test${1:Name}() {
|
||||||
|
$0
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet tt "test throws" b
|
||||||
|
`!p junit(snip)`public void test${1:Name}() ${2:throws Exception }{
|
||||||
|
$0
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet th "throw" b
|
||||||
|
throw new $0
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet wh "while" b
|
||||||
|
while ($1)`!p nl(snip)`{
|
||||||
|
$0
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
# vim:ft=snippets:
|
||||||
|
|
||||||
172
hm-imports/nvim/config/snippets/pandoc.snippets
Normal file
172
hm-imports/nvim/config/snippets/pandoc.snippets
Normal file
|
|
@ -0,0 +1,172 @@
|
||||||
|
snippet limxa "lim from x to a" i
|
||||||
|
\lim_{${2:x} \rightarrow ${1:a}} $0
|
||||||
|
endsnippet
|
||||||
|
snippet liminf "lim from x to infinity" i
|
||||||
|
\lim_{${1:x} \rightarrow \infty} $0
|
||||||
|
endsnippet
|
||||||
|
snippet ddx "fr d dx" i
|
||||||
|
\frac{d}{dx}
|
||||||
|
endsnippet
|
||||||
|
snippet pm "Generate pmatrix" i
|
||||||
|
\begin{pmatrix} $0 \end{pmatrix}
|
||||||
|
endsnippet
|
||||||
|
snippet cd "cdot" i
|
||||||
|
\cdot
|
||||||
|
endsnippet
|
||||||
|
snippet lra "leftrightarrow" i
|
||||||
|
\leftrightarrow
|
||||||
|
endsnippet
|
||||||
|
snippet Lra "Leftrightarrow" i
|
||||||
|
\Leftrightarrow
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
|
||||||
|
snippet la "leftarrow" i
|
||||||
|
\leftarrow
|
||||||
|
endsnippet
|
||||||
|
snippet La "Leftarrow" i
|
||||||
|
\Leftarrow
|
||||||
|
endsnippet
|
||||||
|
snippet ra "rightarrow" i
|
||||||
|
\rightarrow
|
||||||
|
endsnippet
|
||||||
|
snippet Ra "Rightarrow" i
|
||||||
|
\Rightarrow
|
||||||
|
endsnippet
|
||||||
|
snippet gm "Generate pmatrix" i
|
||||||
|
\begin{gmatrix} $0 \end{gmatrix}
|
||||||
|
endsnippet
|
||||||
|
snippet bm "Creates a BMatrix" i
|
||||||
|
\begin{bmatrix} $0 \end{bmatrix}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet ta "add a tag"
|
||||||
|
\tag{${1:Tag Text}}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet fr "Fraction" i
|
||||||
|
\frac{$1}{$2}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet p "Programmiersprache" i
|
||||||
|
\`\`\`{${1:mips}}
|
||||||
|
$2
|
||||||
|
\`\`\`
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet pi "Include Code from other file" i
|
||||||
|
\`\`\`{.${1:mips}include=${2:source.asm}}
|
||||||
|
\`\`\`
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet head "Generates header with everything" b
|
||||||
|
---
|
||||||
|
title: '`!p pwd = os.getcwd()
|
||||||
|
if "mafi1" in pwd:
|
||||||
|
snip.rv = "Mafi1 Übung " + snip.basename[1:3] +" (Gruppe 10)"
|
||||||
|
elif "rs" in pwd:
|
||||||
|
snip.rv = "RS Übung " + snip.basename[1:3] + " (Gruppe 3)"
|
||||||
|
`'
|
||||||
|
date: `date +%d.%m.%Y`
|
||||||
|
author:
|
||||||
|
- 'Philipp Hochkamp (Mat. Nr. 211011)'
|
||||||
|
- 'Jonas Röger (Mat. Nr. 210435)'
|
||||||
|
- 'Nico Jansen (Mat. Nr. 210175)'
|
||||||
|
titlepage: true
|
||||||
|
---
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet new "New Note"
|
||||||
|
- [${1:Title}](`!p
|
||||||
|
def getCategory():
|
||||||
|
w = vim.current.buffer
|
||||||
|
i = vim.current.window.cursor[0]-1
|
||||||
|
while i >= 0:
|
||||||
|
if w[i].split(" ")[0] == "##":
|
||||||
|
return w[i].split(" ")[1].lower()+"/"
|
||||||
|
i = i-1
|
||||||
|
return os.path.basename(w.name).split(".md")[0]+"/"
|
||||||
|
|
||||||
|
|
||||||
|
snip.rv = getCategory() + t[1].replace(" ", "-").lower()`.md)
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet al "Align Block" i
|
||||||
|
\begin{align*}
|
||||||
|
${1:${VISUAL}}
|
||||||
|
\end{align*}
|
||||||
|
endsnippet
|
||||||
|
snippet eq "Equation Block" i
|
||||||
|
\begin{equation}
|
||||||
|
${1:${VISUAL}}
|
||||||
|
\end{equation}
|
||||||
|
endsnippet
|
||||||
|
snippet bl "Custom Block" i
|
||||||
|
\begin{${1:tabluar}}$2
|
||||||
|
$3
|
||||||
|
\end{$1}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
|
||||||
|
snippet tab "tabular (or arbitrary) environment" i
|
||||||
|
\begin{${1:tabular}}{${2:c}}
|
||||||
|
${0:${VISUAL}}
|
||||||
|
\end{$1}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet mb "Math bold font text" i
|
||||||
|
\mathbb{${1:R}}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet mf "Math Fraktur text" i
|
||||||
|
\mathfrak{${1:P}}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet nt "No Tag and end line" i
|
||||||
|
\notag \\\\
|
||||||
|
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet sum "\sum^{}_{}" i
|
||||||
|
\sum^{${1:n}}_{${2:i=1}} ${0}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet lr( "left( right)" i
|
||||||
|
\left( ${1:${VISUAL}} \right) ${0}
|
||||||
|
endsnippet
|
||||||
|
snippet lr| "left| right|" i
|
||||||
|
\left| ${1:${VISUAL}} \right| ${0}
|
||||||
|
endsnippet
|
||||||
|
snippet lr{ "left\{ right\}" i
|
||||||
|
\left\{ ${1:${VISUAL}} \right\} ${0}
|
||||||
|
endsnippet
|
||||||
|
snippet lr[ "left\[ right\]" i
|
||||||
|
\left [ ${0:${VISUAL}} \right ]
|
||||||
|
endsnippet
|
||||||
|
snippet refl "Reference Link" i
|
||||||
|
[${1:${VISUAL:Text}}][${2:id}]$0
|
||||||
|
|
||||||
|
[$2]:${4:http://${3:www.url.com}} "${5:$4}"
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet fnt "Footnote" i
|
||||||
|
[^${1:${VISUAL:Footnote}}]$0
|
||||||
|
|
||||||
|
[^$1]:${2:Text}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet link "Link to something" i
|
||||||
|
[${1:${VISUAL:Text}}](${3:http://${2:www.url.com}})$0
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet img "Image" i
|
||||||
|
$0
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet ilc "Inline Code" i
|
||||||
|
\`$1\`$0
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet sqrt "square root" i
|
||||||
|
\sqrt{${1}} $2
|
||||||
|
endsnippet
|
||||||
3
hm-imports/nvim/config/snippets/python.snippets
Normal file
3
hm-imports/nvim/config/snippets/python.snippets
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
snippet sh "Shebang" EndStuff
|
||||||
|
#!/usr/bin/env python
|
||||||
|
endsnippet
|
||||||
5
hm-imports/nvim/config/snippets/snippets.snippets
Normal file
5
hm-imports/nvim/config/snippets/snippets.snippets
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
snippet sn "Snippet"
|
||||||
|
`echo snippet` ${1:Keys} "${2:Description}" ${3:EndStuff}
|
||||||
|
$4
|
||||||
|
`echo endsnippet`
|
||||||
|
endsnippet
|
||||||
9
hm-imports/nvim/config/terminal.vim
Normal file
9
hm-imports/nvim/config/terminal.vim
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
augroup neovim_terminal
|
||||||
|
autocmd!
|
||||||
|
" Enter Terminal-mode (insert) automatically
|
||||||
|
autocmd TermOpen * startinsert
|
||||||
|
" Disables number lines on terminal buffers
|
||||||
|
autocmd TermOpen * :set nonumber norelativenumber
|
||||||
|
" allows you to use Ctrl-c on terminal window
|
||||||
|
autocmd TermOpen * nnoremap <buffer> <C-c> i<C-c>
|
||||||
|
augroup END
|
||||||
84
hm-imports/nvim/default.nix
Normal file
84
hm-imports/nvim/default.nix
Normal file
|
|
@ -0,0 +1,84 @@
|
||||||
|
{pkgs, config, inputs, lib, ...}:
|
||||||
|
with lib;
|
||||||
|
with lib.my;
|
||||||
|
{
|
||||||
|
home.packages = [
|
||||||
|
python3 # ultisnips
|
||||||
|
lazygit
|
||||||
|
nodejs
|
||||||
|
inputs.rnix-lsp.packages."${pkgs.system}".rnix-lsp
|
||||||
|
shfmt
|
||||||
|
shellcheck
|
||||||
|
vim-vint
|
||||||
|
nodePackages.write-good
|
||||||
|
ctags
|
||||||
|
];
|
||||||
|
home.file.".config/nvim".source = ./config;
|
||||||
|
programs.neovim =
|
||||||
|
let
|
||||||
|
conf = inputs.self.nixosConfigurations.enterprise.config.programs.neovim.configure;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.neovim-nightly;
|
||||||
|
vimAlias = true;
|
||||||
|
viAlias = true;
|
||||||
|
extraConfig = ''
|
||||||
|
set runtimepath^=~/.config/nvim
|
||||||
|
lua dofile('~/.config/nvim/init.lua')
|
||||||
|
'';
|
||||||
|
plugins =
|
||||||
|
let
|
||||||
|
nnn-vim = pkgs.vimUtils.buildVimPlugin {
|
||||||
|
name = "nnn-vim";
|
||||||
|
src = inputs.nnn-vim;
|
||||||
|
};
|
||||||
|
coc-nvim = pkgs.vimUtils.buildVimPlugin {
|
||||||
|
name = "coc-nvim";
|
||||||
|
src = inputs.coc-nvim;
|
||||||
|
};
|
||||||
|
dart-vim = pkgs.vimUtils.buildVimPlugin {
|
||||||
|
name = "dart-vim";
|
||||||
|
src = inputs.dart-vim;
|
||||||
|
};
|
||||||
|
vim-pandoc-live-preview = pkgs.vimUtils.buildVimPlugin {
|
||||||
|
name = "vim-pandoc-live-preview";
|
||||||
|
src = inputs.vim-pandoc-live-preview;
|
||||||
|
};
|
||||||
|
orgmode-nvim = pkgs.vimUtils.buildVimPlugin {
|
||||||
|
name = "orgmode-nvim";
|
||||||
|
src = inputs.orgmode-nvim;
|
||||||
|
dontBuild = true;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
map (x: { plugin = x; }) (with pkgs.vimPlugins; [
|
||||||
|
vim-tmux-navigator
|
||||||
|
galaxyline-nvim
|
||||||
|
nvim-web-devicons
|
||||||
|
nnn-vim
|
||||||
|
rainbow
|
||||||
|
vista-vim
|
||||||
|
polyglot
|
||||||
|
vim-commentary
|
||||||
|
vim-table-mode
|
||||||
|
vim-speeddating
|
||||||
|
vim-nix
|
||||||
|
gruvbox
|
||||||
|
incsearch-vim
|
||||||
|
vim-highlightedyank
|
||||||
|
vim-fugitive
|
||||||
|
fzf-vim
|
||||||
|
lualine-nvim
|
||||||
|
fzfWrapper
|
||||||
|
vim-devicons
|
||||||
|
toggleterm-nvim
|
||||||
|
undotree
|
||||||
|
vim-pandoc
|
||||||
|
vim-pandoc-live-preview
|
||||||
|
vim-pandoc-syntax
|
||||||
|
ultisnips
|
||||||
|
coc-nvim
|
||||||
|
dart-vim
|
||||||
|
]);
|
||||||
|
};
|
||||||
|
}
|
||||||
16
hm-imports/tmux/default.nix
Normal file
16
hm-imports/tmux/default.nix
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
{ config, pkgs,...}:{
|
||||||
|
programs.tmux = {
|
||||||
|
enable = true;
|
||||||
|
keyMode = "vi";
|
||||||
|
clock24 = true;
|
||||||
|
historyLimit = 10000;
|
||||||
|
plugins = with pkgs.tmuxPlugins; [
|
||||||
|
vim-tmux-navigator
|
||||||
|
gruvbox
|
||||||
|
];
|
||||||
|
extraConfig = ''
|
||||||
|
new-session -s main
|
||||||
|
bind-key -n C-a send-prefix
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
||||||
34
hm-imports/zsh/default.nix
Normal file
34
hm-imports/zsh/default.nix
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
{ inputs, config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.ragon.cli;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
programs.zsh = {
|
||||||
|
enable = true;
|
||||||
|
histSize = 10000;
|
||||||
|
enableCompletion = true;
|
||||||
|
initExtra =
|
||||||
|
let
|
||||||
|
zshrc = builtins.readFile ./zshrc;
|
||||||
|
|
||||||
|
sources = [
|
||||||
|
"${inputs.agkozak-zsh-prompt}/agkozak-zsh-prompt.plugin.zsh"
|
||||||
|
"${pkgs.oh-my-zsh}/share/oh-my-zsh/plugins/git/git.plugin.zsh"
|
||||||
|
"${pkgs.oh-my-zsh}/share/oh-my-zsh/plugins/globalias/globalias.plugin.zsh"
|
||||||
|
"${inputs.zsh-vim-mode}/zsh-vim-mode.plugin.zsh"
|
||||||
|
"${inputs.zsh-syntax-highlighting}/zsh-syntax-highlighting.plugin.zsh"
|
||||||
|
"${inputs.zsh-completions}/zsh-completions.plugin.zsh"
|
||||||
|
];
|
||||||
|
|
||||||
|
source = map (x: "source " + x) sources;
|
||||||
|
|
||||||
|
plugins = builtins.concatStringsSep "\n" (source);
|
||||||
|
|
||||||
|
in
|
||||||
|
''
|
||||||
|
${zshrc}
|
||||||
|
${plugins}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
62
hm-imports/zsh/zshrc
Normal file
62
hm-imports/zsh/zshrc
Normal file
|
|
@ -0,0 +1,62 @@
|
||||||
|
AGKOZAK_MULTILINE=0
|
||||||
|
AGKOZAK_PROMPT_CHAR=( ❯ ❯ "%F{red}N%f")
|
||||||
|
autoload -Uz history-search-end
|
||||||
|
|
||||||
|
zle -N history-beginning-search-backward-end history-search-end
|
||||||
|
zle -N history-beginning-search-forward-end history-search-end
|
||||||
|
|
||||||
|
bindkey -M vicmd '^[[A' history-beginning-search-backward-end \
|
||||||
|
'^[OA' history-beginning-search-backward-end \
|
||||||
|
'^[[B' history-beginning-search-forward-end \
|
||||||
|
'^[OB' history-beginning-search-forward-end
|
||||||
|
bindkey -M viins '^[[A' history-beginning-search-backward-end \
|
||||||
|
'^[OA' history-beginning-search-backward-end \
|
||||||
|
'^[[B' history-beginning-search-forward-end \
|
||||||
|
'^[OB' history-beginning-search-forward-end
|
||||||
|
|
||||||
|
hash go 2>/dev/null && export PATH=$PATH:$(go env GOPATH)/bin
|
||||||
|
hash yarn 2>/dev/null && export PATH=$PATH:$HOME/.yarn/bin
|
||||||
|
hash direnv 2>/dev/null && eval "$(direnv hook zsh)" # needed for lorri
|
||||||
|
export PATH=$PATH:$HOME/scripts
|
||||||
|
export PATH=$PATH:$HOME/.config/rofi/bins
|
||||||
|
export PATH=$PATH:$HOME/.local/bin
|
||||||
|
export PATH=$PATH:$HOME/flutter/flutter/bin
|
||||||
|
hash kitty 2>/dev/null && alias ssh="kitty kitten ssh"
|
||||||
|
hash helm 2>/dev/null && . <(helm completion zsh)
|
||||||
|
hash kubectl 2>/dev/null && . <(kubectl completion zsh)
|
||||||
|
export NNN_ARCHIVE="\\.(7z|a|ace|alz|arc|arj|bz|bz2|cab|cpio|deb|gz|jar|lha|lz|lzh|lzma|lzo|rar|rpm|rz|t7z|tar|tbz|tbz2|tgz|tlz|txz|tZ|tzo|war|xpi|xz|Z|zip)$"
|
||||||
|
|
||||||
|
ssh() {
|
||||||
|
if [ -v TMUX ]; then
|
||||||
|
tmux set-option allow-rename off 1>/dev/null
|
||||||
|
tmux rename-window "ssh/$*"
|
||||||
|
command ssh "$@"
|
||||||
|
tmux set-option allow-rename on 1>/dev/null
|
||||||
|
else
|
||||||
|
command ssh "$@"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
n ()
|
||||||
|
{
|
||||||
|
# Block nesting of nnn in subshells
|
||||||
|
if [ -n $NNNLVL ] && [ "${NNNLVL:-0}" -ge 1 ]; then
|
||||||
|
echo "nnn is already running"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
export NNN_TMPFILE="$HOME/.config/nnn/.lastd"
|
||||||
|
|
||||||
|
# Unmask ^Q (, ^V etc.) (if required, see `stty -a`) to Quit nnn
|
||||||
|
# stty start undef
|
||||||
|
# stty stop undef
|
||||||
|
# stty lwrap undef
|
||||||
|
# stty lnext undef
|
||||||
|
|
||||||
|
nnn -d "$@"
|
||||||
|
|
||||||
|
if [ -f "$NNN_TMPFILE" ]; then
|
||||||
|
. "$NNN_TMPFILE"
|
||||||
|
rm -f "$NNN_TMPFILE" > /dev/null
|
||||||
|
fi
|
||||||
|
}
|
||||||
62
hosts/daedalus/default.nix
Normal file
62
hosts/daedalus/default.nix
Normal file
|
|
@ -0,0 +1,62 @@
|
||||||
|
{ pkgs, inputs, lib, ... }:
|
||||||
|
with lib;
|
||||||
|
with lib.my;
|
||||||
|
{
|
||||||
|
|
||||||
|
users.users.ragon = {
|
||||||
|
name = "ragon";
|
||||||
|
home = "/Users/ragon";
|
||||||
|
};
|
||||||
|
programs.gnupg.agent.enable = true;
|
||||||
|
home-manager.users.ragon = { pkgs, lib, inputs, config, ... }: {
|
||||||
|
programs.home-manager.enable = true;
|
||||||
|
home.stateVersion = "21.11";
|
||||||
|
|
||||||
|
home.sessionVariables = {
|
||||||
|
EDITOR = "nvim";
|
||||||
|
VISUAL = "nvim";
|
||||||
|
PATH = "$PATH:$HOME/development/flutter/bin:/Applications/Android Studio.app/Contents/bin/:/Applications/Docker.app/Contents/Resources/bin:/Applications/Android Studio.app/Contents/jre/Contents/Home/bin:$HOME/.nix-profile/bin:/nix/var/nix/profiles/system/sw/bin";
|
||||||
|
JAVA_HOME = "/Applications/Android Studio.app/Contents/jre/Contents/Home/";
|
||||||
|
};
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
terraform-ls
|
||||||
|
terraform
|
||||||
|
|
||||||
|
#tectonic
|
||||||
|
pandoc
|
||||||
|
|
||||||
|
yabai
|
||||||
|
|
||||||
|
google-cloud-sdk
|
||||||
|
];
|
||||||
|
|
||||||
|
home.activation = {
|
||||||
|
aliasApplications =
|
||||||
|
let
|
||||||
|
apps = pkgs.buildEnv {
|
||||||
|
name = "home-manager-applications";
|
||||||
|
paths = config.home.packages;
|
||||||
|
pathsToLink = "/Applications";
|
||||||
|
};
|
||||||
|
in
|
||||||
|
lib.hm.dag.entryAfter [ "writeBoundary" ] ''
|
||||||
|
# Install MacOS applications to the user environment.
|
||||||
|
HM_APPS="$HOME/Applications/Home Manager Apps"
|
||||||
|
|
||||||
|
# Reset current state
|
||||||
|
[ -e "$HM_APPS" ] && $DRY_RUN_CMD rm -r "$HM_APPS"
|
||||||
|
$DRY_RUN_CMD mkdir -p "$HM_APPS"
|
||||||
|
|
||||||
|
# .app dirs need to be actual directories for Finder to detect them as Apps.
|
||||||
|
# The files inside them can be symlinks though.
|
||||||
|
$DRY_RUN_CMD cp --recursive --symbolic-link --no-preserve=mode -H ${apps}/Applications/* "$HM_APPS" || true # can fail if no apps exist
|
||||||
|
# Modes need to be stripped because otherwise the dirs wouldn't have +w,
|
||||||
|
# preventing us from deleting them again
|
||||||
|
# In the env of Apps we build, the .apps are symlinks. We pass all of them as
|
||||||
|
# arguments to cp and make it dereference those using -H
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
213
hosts/ds9/default.nix
Normal file
213
hosts/ds9/default.nix
Normal file
|
|
@ -0,0 +1,213 @@
|
||||||
|
# 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, inputs, pkgs, lib, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports =
|
||||||
|
[
|
||||||
|
# Include the results of the hardware scan.
|
||||||
|
./hardware-configuration.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
# Don't Use the systemd-boot EFI boot loader.
|
||||||
|
boot.loader.systemd-boot.enable = true;
|
||||||
|
|
||||||
|
services.syncthing.enable = true;
|
||||||
|
services.syncthing.user = "ragon";
|
||||||
|
|
||||||
|
security.sudo.wheelNeedsPassword = false;
|
||||||
|
networking.useDHCP = true;
|
||||||
|
networking.bridges."br0".interfaces = [ ];
|
||||||
|
networking.hostId = "7b4c2932";
|
||||||
|
boot.binfmt.emulatedSystems = [ "aarch64-linux" "armv7l-linux" ];
|
||||||
|
boot.initrd.network = {
|
||||||
|
enable = true;
|
||||||
|
postCommands = ''
|
||||||
|
zpool import rpool
|
||||||
|
echo "zfs load-key -a; killall zfs" >> /root/.profile
|
||||||
|
'';
|
||||||
|
ssh = {
|
||||||
|
enable = true;
|
||||||
|
port = 2222;
|
||||||
|
hostKeys = [
|
||||||
|
"/persistent/etc/nixos/secrets/initrd/ssh_host_rsa_key"
|
||||||
|
"/persistent/etc/nixos/secrets/initrd/ssh_host_ed25519_key"
|
||||||
|
];
|
||||||
|
authorizedKeys = pkgs.pubkeys.ragon.computers;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
# services.restic.backups."ds9" = {
|
||||||
|
# rcloneConfigFile = "/run/secrets/ds9rcloneConfig";
|
||||||
|
# passwordFile = "/run/secrets/ds9resticPassword";
|
||||||
|
# pruneOpts = [
|
||||||
|
# "--keep-daily 7"
|
||||||
|
# "--keep-weekly 5"
|
||||||
|
# "--keep-monthly 12"
|
||||||
|
# "--keep-yearly 75"
|
||||||
|
# ];
|
||||||
|
# initialize = true;
|
||||||
|
# repository = "rclone:ds9:/ds9";
|
||||||
|
# paths = [
|
||||||
|
# "/data"
|
||||||
|
# "/persistent/var/lib"
|
||||||
|
# ];
|
||||||
|
|
||||||
|
# };
|
||||||
|
|
||||||
|
ragon.agenix.secrets."ds9rcloneConfig" = { };
|
||||||
|
ragon.agenix.secrets."ds9resticPassword" = { };
|
||||||
|
|
||||||
|
|
||||||
|
# Enable Scanning
|
||||||
|
hardware.sane.enable = true;
|
||||||
|
hardware.sane.extraBackends = [ pkgs.sane-airscan ];
|
||||||
|
services.avahi.enable = true;
|
||||||
|
services.avahi.nssmdns = true;
|
||||||
|
services.avahi.publish.enable = true;
|
||||||
|
services.avahi.extraServiceFiles.smb = ''
|
||||||
|
<?xml version="1.0" standalone='no'?>
|
||||||
|
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
|
||||||
|
<service-group>
|
||||||
|
<name replace-wildcards="yes">%h</name>
|
||||||
|
<service>
|
||||||
|
<type>_smb._tcp</type>
|
||||||
|
<port>445</port>
|
||||||
|
<host-name>ds9.hailsatan.eu</host-name>
|
||||||
|
</service>
|
||||||
|
<service>
|
||||||
|
<type>_device-info._tcp</type>
|
||||||
|
<port>0</port>
|
||||||
|
<txt-record>model=MacPro7,1@ECOLOR=226,226,224</txt-record>
|
||||||
|
</service>
|
||||||
|
<service>
|
||||||
|
<type>_adisk._tcp</type>
|
||||||
|
<txt-record>sys=waMa=0,adVF=0x100</txt-record>
|
||||||
|
<txt-record>dk0=adVN=TimeMachine,adVF=0x82</txt-record>
|
||||||
|
<host-name>ds9.hailsatan.eu</host-name>
|
||||||
|
</service>
|
||||||
|
</service-group>
|
||||||
|
'';
|
||||||
|
# Webhook service to trigger scanning the ADF from HomeAssistant
|
||||||
|
systemd.services.scanhook = {
|
||||||
|
description = "webhook go server to trigger scanning";
|
||||||
|
documentation = [ "https://github.com/adnanh/webhook" ];
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
path = with pkgs; [ bash ];
|
||||||
|
serviceConfig = {
|
||||||
|
TemporaryFileSystem = "/:ro";
|
||||||
|
BindReadOnlyPaths = [
|
||||||
|
"/nix/store"
|
||||||
|
"-/etc/resolv.conf"
|
||||||
|
"-/etc/nsswitch.conf"
|
||||||
|
"-/etc/hosts"
|
||||||
|
"-/etc/localtime"
|
||||||
|
];
|
||||||
|
BindPaths = [
|
||||||
|
"/data/applications/paperless-consumption"
|
||||||
|
];
|
||||||
|
LockPersonality = true;
|
||||||
|
NoNewPrivileges = true;
|
||||||
|
PrivateMounts = true;
|
||||||
|
PrivateTmp = true;
|
||||||
|
PrivateUsers = true;
|
||||||
|
ProcSubset = "pid";
|
||||||
|
ProtectHome = true;
|
||||||
|
ProtectControlGroups = true;
|
||||||
|
ProtectKernelLogs = true;
|
||||||
|
ProtectKernelModules = true;
|
||||||
|
ProtectKernelTunables = true;
|
||||||
|
ProtectProc = "invisible";
|
||||||
|
RestrictNamespaces = true;
|
||||||
|
RestrictRealtime = true;
|
||||||
|
RestrictSUIDSGID = true;
|
||||||
|
DynamicUser = true;
|
||||||
|
ExecStart =
|
||||||
|
let
|
||||||
|
scanScript = pkgs.writeScript "plscan.sh" ''
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
export PATH=${lib.makeBinPath [ pkgs.strace pkgs.gnugrep pkgs.coreutils pkgs.sane-backends pkgs.sane-airscan pkgs.imagemagick ]}
|
||||||
|
export LD_LIBRARY_PATH=${config.environment.sessionVariables.LD_LIBRARY_PATH} # Adds SANE Libraries to the ld library path of this script
|
||||||
|
set -x
|
||||||
|
date="''$(date --iso-8601=seconds)"
|
||||||
|
filename="Scan ''$date.pdf"
|
||||||
|
tmpdir="''$(mktemp -d)"
|
||||||
|
pushd "''$tmpdir"
|
||||||
|
scanimage --batch=out%d.jpg --format=jpeg --mode Gray -d "airscan:e0:Canon MB5100 series" --source "ADF Duplex" --resolution 300
|
||||||
|
for i in $(ls out*.jpg | grep 'out.*[24680]\.jpg'); do convert $i -rotate 180 $i; done # rotate even stuff
|
||||||
|
convert out*.jpg /data/applications/paperless-consumption/"''$filename"
|
||||||
|
chmod 666 /data/applications/paperless-consumption/"''$filename"
|
||||||
|
popd
|
||||||
|
rm -r "''$tmpdir"
|
||||||
|
'';
|
||||||
|
hooksFile = pkgs.writeText "webhook.json" (builtins.toJSON [
|
||||||
|
{
|
||||||
|
id = "scan-webhook";
|
||||||
|
execute-command = "${scanScript}";
|
||||||
|
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
in
|
||||||
|
"${pkgs.webhook}/bin/webhook -hooks ${hooksFile} -verbose";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
networking.firewall.allowedTCPPorts = [ 9000 ];
|
||||||
|
|
||||||
|
# Immutable users due to tmpfs
|
||||||
|
users.mutableUsers = false;
|
||||||
|
|
||||||
|
services.samba.extraConfig = ''
|
||||||
|
min protocol = SMB3
|
||||||
|
vfs objects = acl_xattr catia fruit streams_xattr
|
||||||
|
fruit:nfs_aces = no
|
||||||
|
inherit permissions = yes
|
||||||
|
fruit:posix_rename = yes
|
||||||
|
fruit:model = MacPro7,1@ECOLOR=226,226,224
|
||||||
|
fruit:veto_appledouble = no
|
||||||
|
fruit:wipe_intentionally_left_blank_rfork = yes
|
||||||
|
fruit:delete_empty_adfiles = yes
|
||||||
|
fruit:metadata = stream
|
||||||
|
'';
|
||||||
|
|
||||||
|
ragon = {
|
||||||
|
cli.enable = true;
|
||||||
|
user.enable = true;
|
||||||
|
home-manager.enable = true;
|
||||||
|
persist.enable = true;
|
||||||
|
persist.extraDirectories = [ "/var/lib/syncthing" ];
|
||||||
|
|
||||||
|
services = {
|
||||||
|
samba.enable = true;
|
||||||
|
samba.shares = {
|
||||||
|
TimeMachine = {
|
||||||
|
path = "/backups/DaedalusTimeMachine";
|
||||||
|
comment = "DaedalusTimeMachine";
|
||||||
|
"write list" = "@wheel";
|
||||||
|
"fruit:time machine" = "yes";
|
||||||
|
"fruit:time machine max size" = "2050G";
|
||||||
|
"vfs objects" = "acl_xattr fruit streams_xattr";
|
||||||
|
"inherit acls" = "yes";
|
||||||
|
};
|
||||||
|
data = {
|
||||||
|
path = "/data";
|
||||||
|
comment = "some data for the people";
|
||||||
|
"write list" = "@wheel";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
docker.enable = true;
|
||||||
|
ssh.enable = true;
|
||||||
|
nginx.enable = true;
|
||||||
|
jellyfin.enable = true;
|
||||||
|
tailscale.enable = true;
|
||||||
|
grafana.enable = true;
|
||||||
|
libvirt.enable = true;
|
||||||
|
paperless.enable = true;
|
||||||
|
unifi.enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
52
hosts/ds9/hardware-configuration.nix
Normal file
52
hosts/ds9/hardware-configuration.nix
Normal file
|
|
@ -0,0 +1,52 @@
|
||||||
|
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||||
|
# and may be overwritten by future invocations. Please make changes
|
||||||
|
# to /etc/nixos/configuration.nix instead.
|
||||||
|
{ config, lib, pkgs, modulesPath, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [ "${modulesPath}/installer/scan/not-detected.nix" ];
|
||||||
|
|
||||||
|
boot.initrd.availableKernelModules = [ "r8169" "ahci" "vfio-pci" "xhci_pci" "ehci_pci" "nvme" "usbhid" "sd_mod" "sr_mod" ];
|
||||||
|
boot.kernelModules = [ "kvm-amd" ];
|
||||||
|
nix.maxJobs = lib.mkDefault 12;
|
||||||
|
powerManagement.cpuFreqGovernor = "performance";
|
||||||
|
|
||||||
|
services.zfs.autoScrub.enable = true;
|
||||||
|
ragon.system.fs = {
|
||||||
|
enable = true;
|
||||||
|
mediadata = false;
|
||||||
|
swap = false;
|
||||||
|
persistentSnapshot = false;
|
||||||
|
nix = "rpool/content/local/nix";
|
||||||
|
varlog = "rpool/content/local/journal";
|
||||||
|
persistent = "rpool/content/safe/persist";
|
||||||
|
arcSize = 8;
|
||||||
|
};
|
||||||
|
services.syncoid.enable = false; # TODO setup offsite backups
|
||||||
|
|
||||||
|
services.sanoid.datasets."rpool/content/safe".recursive = true;
|
||||||
|
services.sanoid.datasets."rpool/content/local/backups" = { };
|
||||||
|
services.sanoid.enable = true;
|
||||||
|
|
||||||
|
swapDevices = [ { device = "/dev/disk/by-id/nvme-eui.000000000000000100a075202c247839-part1"; randomEncryption = true; } ];
|
||||||
|
fileSystems."/boot".device = "/dev/disk/by-uuid/149F-23AA";
|
||||||
|
|
||||||
|
fileSystems."/data" = {
|
||||||
|
device = "rpool/content/safe/data";
|
||||||
|
fsType = "zfs";
|
||||||
|
};
|
||||||
|
fileSystems."/data/media" = {
|
||||||
|
device = "rpool/content/safe/data/media";
|
||||||
|
fsType = "zfs";
|
||||||
|
};
|
||||||
|
fileSystems."/backups" = {
|
||||||
|
device = "rpool/content/local/backups";
|
||||||
|
fsType = "zfs";
|
||||||
|
};
|
||||||
|
fileSystems."/data/media/nzbr" = {
|
||||||
|
device = "10.0.1.2:/storage/media";
|
||||||
|
fsType = "nfs";
|
||||||
|
options = [ "x-systemd.automount" "noauto" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
63
hosts/picard/default.nix
Normal file
63
hosts/picard/default.nix
Normal file
|
|
@ -0,0 +1,63 @@
|
||||||
|
# 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, config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports =
|
||||||
|
[
|
||||||
|
# Include the results of the hardware scan.
|
||||||
|
./hardware-configuration.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.loader.grub.enable = true;
|
||||||
|
boot.loader.grub.version = 2;
|
||||||
|
boot.loader.grub.device = "/dev/sda";
|
||||||
|
boot.loader.systemd-boot.enable = false;
|
||||||
|
|
||||||
|
services.syncthing.enable = true;
|
||||||
|
|
||||||
|
|
||||||
|
networking.interfaces."ens3" = {
|
||||||
|
ipv6 = {
|
||||||
|
addresses = [
|
||||||
|
{
|
||||||
|
address = "2a03:4000:54:a98::1";
|
||||||
|
prefixLength = 64;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
networking.defaultGateway6 = { address = "fe80::1"; interface = "enp0s3"; };
|
||||||
|
networking.nameservers = [ "1.1.1.1" "8.8.8.8" ];
|
||||||
|
# networking.interfaces.eno1.useDHCP = true;
|
||||||
|
networking.hostId = "7c21236a";
|
||||||
|
|
||||||
|
# Immutable users due to tmpfs
|
||||||
|
users.mutableUsers = false;
|
||||||
|
|
||||||
|
services.postgresql.package = pkgs.postgresql_13;
|
||||||
|
|
||||||
|
ragon = {
|
||||||
|
cli.enable = true;
|
||||||
|
user.enable = true;
|
||||||
|
home-manager.enable = true;
|
||||||
|
persist.enable = true;
|
||||||
|
persist.extraDirectories = [ "/var/lib/syncthing" ];
|
||||||
|
|
||||||
|
services = {
|
||||||
|
ssh.enable = true;
|
||||||
|
bitwarden.enable = true;
|
||||||
|
gitlab.enable = true; # TODO gitlab-runner
|
||||||
|
synapse.enable = true;
|
||||||
|
tailscale.enable = true;
|
||||||
|
hedgedoc.enable = true;
|
||||||
|
ts3.enable = true;
|
||||||
|
nginx.enable = true;
|
||||||
|
nginx.domain = "ragon.xyz";
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
42
hosts/picard/hardware-configuration.nix
Normal file
42
hosts/picard/hardware-configuration.nix
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||||
|
# and may be overwritten by future invocations. Please make changes
|
||||||
|
# to /etc/nixos/configuration.nix instead.
|
||||||
|
{ config, lib, pkgs, modulesPath, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [ "${modulesPath}/profiles/qemu-guest.nix" ];
|
||||||
|
boot.zfs.requestEncryptionCredentials = true;
|
||||||
|
ragon.system.fs.enable = true;
|
||||||
|
ragon.system.fs.nix = "rpool/nix";
|
||||||
|
ragon.system.fs.varlog = "rpool/varlog";
|
||||||
|
ragon.system.fs.persistent = "rpool/persist";
|
||||||
|
ragon.system.fs.swap = false;
|
||||||
|
ragon.system.fs.mediadata = false;
|
||||||
|
swapDevices = [
|
||||||
|
{ device = "/dev/sda2"; randomEncryption.enable = true; }
|
||||||
|
];
|
||||||
|
services.syncoid.enable = false; # disable failing zfs syncing
|
||||||
|
boot.initrd = {
|
||||||
|
network = {
|
||||||
|
enable = true;
|
||||||
|
postCommands = ''
|
||||||
|
zpool import rpool
|
||||||
|
echo "zfs load-key -a; killall zfs" >> /root/.profile
|
||||||
|
'';
|
||||||
|
ssh = {
|
||||||
|
enable = true;
|
||||||
|
port = 2222;
|
||||||
|
hostKeys = [
|
||||||
|
"/persistent/etc/nixos/secrets/initrd/ssh_host_rsa_key"
|
||||||
|
"/persistent/etc/nixos/secrets/initrd/ssh_host_ed25519_key"
|
||||||
|
];
|
||||||
|
authorizedKeys = pkgs.pubkeys.ragon.user;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
powerManagement.cpuFreqGovernor = "performance";
|
||||||
|
}
|
||||||
92
hosts/wormhole/default.nix
Normal file
92
hosts/wormhole/default.nix
Normal file
|
|
@ -0,0 +1,92 @@
|
||||||
|
{ config, inputs, pkgs, lib, ... }:
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
"${inputs.nixpkgs}/nixos/modules/installer/sd-card/sd-image-aarch64.nix"
|
||||||
|
"${inputs.nixos-hardware}/raspberry-pi/4/default.nix"
|
||||||
|
./router.nix
|
||||||
|
];
|
||||||
|
nixpkgs.overlays = [
|
||||||
|
(final: super: {
|
||||||
|
makeModulesClosure = x:
|
||||||
|
super.makeModulesClosure (x // { allowMissing = true; });
|
||||||
|
})
|
||||||
|
];
|
||||||
|
boot.loader.systemd-boot.enable = false;
|
||||||
|
boot.kernelPackages = pkgs.linuxPackages_rpi4;
|
||||||
|
boot.supportedFilesystems = lib.mkForce [ "reiserfs" "vfat" "zfs" "ext4" ]; # we dont need zfs here
|
||||||
|
boot.inird.supportedFilesystems = lib.mkForce [ "reiserfs" "vfat" "zfs" "ext4" ]; # we dont need zfs here
|
||||||
|
networking.hostId = "eec43f51";
|
||||||
|
# networking.usePredictableInterfaceNames = false;
|
||||||
|
documentation.enable = false;
|
||||||
|
documentation.nixos.enable = false;
|
||||||
|
|
||||||
|
nix = {
|
||||||
|
autoOptimiseStore = true;
|
||||||
|
gc = {
|
||||||
|
automatic = true;
|
||||||
|
dates = "weekly";
|
||||||
|
options = "--delete-older-than 30d";
|
||||||
|
};
|
||||||
|
# Free up to 1GiB whenever there is less than 100MiB left.
|
||||||
|
extraOptions = ''
|
||||||
|
min-free = ${toString (100 * 1024 * 1024)}
|
||||||
|
max-free = ${toString (1024 * 1024 * 1024)}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
powerManagement.cpuFreqGovernor = "ondemand";
|
||||||
|
|
||||||
|
# Assuming this is installed on top of the disk image.
|
||||||
|
fileSystems = {
|
||||||
|
"/" = {
|
||||||
|
device = "/dev/disk/by-label/NIXOS_SD";
|
||||||
|
fsType = "ext4";
|
||||||
|
options = [ "noatime" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
ragon.networking.router.enable = true;
|
||||||
|
ragon.services.ssh.enable = true;
|
||||||
|
ragon.cli.enable = true;
|
||||||
|
ragon.cli.maximal = false;
|
||||||
|
services.lorri.enable = false;
|
||||||
|
ragon.services.ddns.enable = true;
|
||||||
|
ragon.services.tailscale.enable = true;
|
||||||
|
ragon.services.nginx.enable = true;
|
||||||
|
services.nginx.virtualHosts."h.hailsatan.eu" = {
|
||||||
|
forceSSL = true;
|
||||||
|
useACMEHost = "hailsatan.eu";
|
||||||
|
extraConfig = ''
|
||||||
|
proxy_buffering off;
|
||||||
|
'';
|
||||||
|
locations."/".proxyPass = "http://10.0.0.20:8123";
|
||||||
|
locations."/".proxyWebsockets = true;
|
||||||
|
};
|
||||||
|
services.nginx.virtualHosts."hailsatan.eu" = {
|
||||||
|
forceSSL = true;
|
||||||
|
useACMEHost = "hailsatan.eu";
|
||||||
|
root = pkgs.runCommand "homepage" { } ''
|
||||||
|
mkdir -p $out
|
||||||
|
echo "Hail Satan" > $out/index.html
|
||||||
|
echo "User-agent: *" > $out/robots.txt
|
||||||
|
echo "Disallow: /" >> $out/robots.txt
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
services.nginx.virtualHosts."j.hailsatan.eu" = {
|
||||||
|
forceSSL = true;
|
||||||
|
useACMEHost = "hailsatan.eu";
|
||||||
|
extraConfig = ''
|
||||||
|
proxy_buffering off;
|
||||||
|
'';
|
||||||
|
locations."/".proxyPass = "https://j.hailsatan.eu";
|
||||||
|
locations."/".proxyWebsockets = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
users.users.root.openssh.autorizedKeys = [
|
||||||
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDiKJEYNUU+ZpbOyJf9k9ZZdTTL0qLiZ6fXEBVCjNfas"
|
||||||
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIkFgHr6OMwsnGhdG4TwKdthlJC/B9ELqZfrmJ9Sf7qk"
|
||||||
|
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCJVa1zAjR6stS4qIEysQbR9n0/AV2h62QRfsRvNfQiL19ExKFR7ZHaUFBr6jnGjzl5eyK0DtwZMlyaDlTR/AXiTZHJrvEPL1lna42wK252uZb66DXAG23L+iFeXySq3f+a6Prw8NU3HvIvC/YkEYwjjbqPKEjvnIHd2dJ1FZ9T9FeoKup3nMWYGDRqrja8NcRwCY9OpPd3ZKZJlNJcPfbfAipGAuQ6EGgGi0GzqoYP9OqZx9PBQQEY7a5+cUgYYEI75NJNuk4/WBm8fkFKrcOmvhTOEb90kbNmpHusDOrFEo8LATdpmJSG013DpPb1W7pMxMq+YgFF4INqIxrhBGht"
|
||||||
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIH8RjUQ6DDDDgsVbqq+6zz1q6cBkus/BLUGa9JoWsqB4"
|
||||||
|
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCWwrrROqkBEZi8t7Czu1jDDJjSqomGXx7dhIx73GTb3bBlgThqUSsrG+NpP9mxNl4sYgmJYQ9idpUW/RTX3/sXBvNQi4rOqv9z1qdEyzF86CcyWGk4f+D2hJffLlcIbvbDCJ92PF+k5NbH+PC/yVZKSIRC3ENBHf38l8n25ABuBcpCI16bPCIbqbpekqStXClug//uAyENuS6+orHFQg3muUihEedEhJly1QAfDhOzZRlBxTGQcDvZA/XMaIyjAqbXaNVRsDLmKezm/Dg5M3jMIRxApUd9hcuZlfemxUgD0qqnJSTahb9rMxUKk5jdY95EthAp0s2e6tc2O76sYPqb"
|
||||||
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIH99QITZa3hSa+7sMo4M5IC5mXWEjsRqXUSaYKKRyQfE"
|
||||||
|
];
|
||||||
|
}
|
||||||
422
hosts/wormhole/router.nix
Normal file
422
hosts/wormhole/router.nix
Normal file
|
|
@ -0,0 +1,422 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
with lib;
|
||||||
|
with lib.my;
|
||||||
|
let
|
||||||
|
wgEnabled = hasAttrByPath [ "hosts" config.networking.hostName ] (importTOML ../../data/wireguard.toml);
|
||||||
|
cfg = config.ragon.networking.router;
|
||||||
|
waninterface = cfg.waninterface;
|
||||||
|
laninterface = cfg.laninterface;
|
||||||
|
prefixSize = cfg.prefixSize;
|
||||||
|
statics = cfg.statics;
|
||||||
|
domain = cfg.domain;
|
||||||
|
disableFirewallFor = cfg.disableFirewallFor;
|
||||||
|
lan = {
|
||||||
|
name = "lan";
|
||||||
|
internet = true;
|
||||||
|
allowipv6 = true;
|
||||||
|
ipv4addr = "10.0.0.1";
|
||||||
|
netipv4addr = "10.0.0.0";
|
||||||
|
dhcpv4start = "10.0.10.1";
|
||||||
|
dhcpv4end = "10.0.255.240";
|
||||||
|
routes = [
|
||||||
|
{ address = "10.12.0.0"; prefixLength = 16; via = "10.0.1.2"; }
|
||||||
|
{ address = "10.13.0.0"; prefixLength = 16; via = "10.0.1.2"; }
|
||||||
|
];
|
||||||
|
ipv4size = 16;
|
||||||
|
vlan = 4;
|
||||||
|
};
|
||||||
|
iot = {
|
||||||
|
name = "iot";
|
||||||
|
internet = false;
|
||||||
|
allowipv6 = false;
|
||||||
|
ipv4addr = "10.1.0.1";
|
||||||
|
netipv4addr = "10.1.0.0";
|
||||||
|
dhcpv4start = "10.1.1.1";
|
||||||
|
dhcpv4end = "10.1.255.240";
|
||||||
|
routes = [ ];
|
||||||
|
ipv4size = 16;
|
||||||
|
vlan = 2;
|
||||||
|
};
|
||||||
|
guest = {
|
||||||
|
name = "guest";
|
||||||
|
internet = true;
|
||||||
|
allowipv6 = false;
|
||||||
|
ipv4addr = "192.168.2.1";
|
||||||
|
netipv4addr = "192.168.2.0";
|
||||||
|
dhcpv4start = "192.168.2.10";
|
||||||
|
dhcpv4end = "192.168.2.240";
|
||||||
|
routes = [ ];
|
||||||
|
ipv4size = 24;
|
||||||
|
vlan = 3;
|
||||||
|
};
|
||||||
|
nets = [ lan iot guest ];
|
||||||
|
ipv6nets = builtins.filter (a: a.allowipv6) nets;
|
||||||
|
interfaceGenerator = obj: {
|
||||||
|
"${obj.name}".ipv4 = {
|
||||||
|
addresses = [{
|
||||||
|
address = obj.ipv4addr;
|
||||||
|
prefixLength = obj.ipv4size;
|
||||||
|
}];
|
||||||
|
routes = [{
|
||||||
|
address = obj.netipv4addr;
|
||||||
|
prefixLength = obj.ipv4size;
|
||||||
|
}] ++ obj.routes;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.ragon.networking.router.enable = mkBoolOpt false;
|
||||||
|
options.ragon.networking.router.waninterface =
|
||||||
|
lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "eth1";
|
||||||
|
};
|
||||||
|
options.ragon.networking.router.laninterface =
|
||||||
|
lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "eth0";
|
||||||
|
};
|
||||||
|
options.ragon.networking.router.domain =
|
||||||
|
lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "hailsatan.eu";
|
||||||
|
};
|
||||||
|
options.ragon.networking.router.prefixSize =
|
||||||
|
lib.mkOption {
|
||||||
|
type = lib.types.int;
|
||||||
|
default = 59;
|
||||||
|
};
|
||||||
|
options.ragon.networking.router.statics =
|
||||||
|
lib.mkOption {
|
||||||
|
type = lib.types.listOf lib.types.attrs;
|
||||||
|
default = [
|
||||||
|
{ name = "j.hailsatan.eu"; ip = "10.0.0.2"; }
|
||||||
|
{ name = "paperless.hailsatan.eu"; ip = "10.0.0.2"; }
|
||||||
|
{ name = "unifi.hailsatan.eu"; ip = "10.0.0.2"; }
|
||||||
|
{ name = "nix.hailsatan.eu"; ip = "10.0.0.2"; }
|
||||||
|
{ name = "h.hailsatan.eu"; ip = "10.0.0.1"; }
|
||||||
|
{ name = "grafana.hailsatan.eu"; ip = "10.0.0.2"; }
|
||||||
|
{ name = "nzbr.de"; ip = "10.0.1.2"; }
|
||||||
|
{ name = "storm.nzbr.de"; ip = "45.9.63.165"; }
|
||||||
|
{ name = "avalanche.nzbr.de"; ip = "202.61.247.0"; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
options.ragon.networking.router.disableFirewallFor =
|
||||||
|
lib.mkOption {
|
||||||
|
type = lib.types.listOf lib.types.attrs;
|
||||||
|
default = [
|
||||||
|
{ hostname = "enterprise"; mac = "d8:cb:8a:76:09:0a"; tcpports = [ 22 ]; udpports = [ ]; }
|
||||||
|
{ hostname = "earthquake"; mac = "78:24:af:bc:0c:07"; tcpports = [ 22 22000 ]; udpports = [ 22000 51820 ]; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
options.ragon.networking.router.staticDHCPs =
|
||||||
|
lib.mkOption {
|
||||||
|
type = lib.types.listOf lib.types.attrs;
|
||||||
|
default = [
|
||||||
|
# ragon - machines
|
||||||
|
{ name = "enterprise"; ip = "10.0.0.9"; mac = "d8:cb:8a:76:09:0a"; }
|
||||||
|
{ name = "ds9"; ip = "10.0.0.2"; mac = "f4:b5:20:0e:21:d5"; }
|
||||||
|
# ragon - vms
|
||||||
|
{ name = "homeassistant"; ip = "10.0.0.20"; mac = "52:54:00:a1:04:14"; }
|
||||||
|
{ name = "enterprise-win"; ip = "10.0.0.201"; mac = "52:54:00:f3:ab:dd"; }
|
||||||
|
# ragon - iot
|
||||||
|
{ name = "zbbridge"; ip = "10.1.0.5"; mac = "98:f4:ab:e2:b6:a3"; }
|
||||||
|
{ name = "wled-Schrank-Philipp"; ip = "10.1.0.10"; mac = "2c:f4:32:20:74:60"; }
|
||||||
|
{ name = "wled-Betthintergrund-Phi"; ip = "10.1.0.11"; mac = "2c:3a:e8:0e:ab:71"; }
|
||||||
|
|
||||||
|
# nzbr - machines
|
||||||
|
{ name = "earthquake"; ip = "10.0.1.2"; mac = "78:24:af:bc:0c:07"; }
|
||||||
|
{ name = "comet"; ip = "10.0.1.4"; mac = "0c:98:38:d3:16:8f"; }
|
||||||
|
{ name = "meteor"; ip = "10.0.1.8"; mac = "54:27:1e:5c:1f:ed"; } # Wireless
|
||||||
|
{ name = "meteor"; ip = "10.0.1.16"; mac = "00:21:cc:5c:f5:dc"; } # Wired
|
||||||
|
{ name = "hurricane"; ip = "10.0.1.32"; mac = "f0:2f:74:1b:af:e0"; }
|
||||||
|
|
||||||
|
# nzbr - vms
|
||||||
|
{ name = "earthquake-macos"; ip = "10.0.1.201"; mac = "52:54:00:8e:e2:66"; }
|
||||||
|
{ name = "earthquake-win"; ip = "10.0.1.202"; mac = "52:54:00:97:37:69"; }
|
||||||
|
|
||||||
|
# nzbr - consoles
|
||||||
|
{ name = "xbox"; ip = "10.0.2.1"; mac = "58:82:a8:30:2d:1c"; }
|
||||||
|
{ name = "wii"; ip = "10.0.2.2"; mac = "00:23:cc:50:78:00"; }
|
||||||
|
{ name = "switch"; ip = "10.0.2.3"; mac = "dc:68:eb:bb:01:fc"; } # Wireless
|
||||||
|
];
|
||||||
|
};
|
||||||
|
options.ragon.networking.router.forwardedPorts =
|
||||||
|
lib.mkOption {
|
||||||
|
type = lib.types.listOf lib.types.attrs;
|
||||||
|
default = [
|
||||||
|
#{ proto = "tcp"; sourcePort = "5060-5061"; destination = "10.0.0.11"; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
config = {
|
||||||
|
# https://www.willghatch.net/blog/2020/06/22/nixos-raspberry-pi-4-google-fiber-router/
|
||||||
|
|
||||||
|
# You’d better forward packets if you actually want a router.
|
||||||
|
boot.kernel.sysctl = {
|
||||||
|
"net.ipv4.ip_forward" = 1;
|
||||||
|
"net.ipv6.conf.all.forwarding" = 1;
|
||||||
|
"net.ipv6.conf.default.forwarding" = 1;
|
||||||
|
"net.ipv6.conf.6rdtun.forwarding" = 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.vlans =
|
||||||
|
let
|
||||||
|
genVlan = obj: {
|
||||||
|
"${obj.name}" = {
|
||||||
|
id = obj.vlan;
|
||||||
|
interface = laninterface;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in
|
||||||
|
lib.foldl (a: b: a // b) { } (map genVlan nets);
|
||||||
|
|
||||||
|
networking.interfaces =
|
||||||
|
let
|
||||||
|
genVlanConf = lib.foldl (a: b: a // b) { } (map interfaceGenerator nets);
|
||||||
|
in
|
||||||
|
{
|
||||||
|
"${waninterface}" = {
|
||||||
|
useDHCP = true;
|
||||||
|
};
|
||||||
|
} // genVlanConf;
|
||||||
|
networking.dhcpcd = {
|
||||||
|
enable = true;
|
||||||
|
allowInterfaces = [
|
||||||
|
"${waninterface}"
|
||||||
|
] ++ (map (a: a.name) ipv6nets);
|
||||||
|
extraConfig =
|
||||||
|
let
|
||||||
|
genDesc = obj: ''
|
||||||
|
# We don’t want dhcpcd to give us an address on the ${obj.name} interface.
|
||||||
|
interface ${obj.name}
|
||||||
|
noipv4
|
||||||
|
|
||||||
|
'';
|
||||||
|
allGenIntDescs = builtins.concatStringsSep "\n" (map genDesc ipv6nets);
|
||||||
|
in
|
||||||
|
''
|
||||||
|
# The man page says that ipv6rs should be disabled globally when
|
||||||
|
# using a prefix delegation.
|
||||||
|
noipv6rs
|
||||||
|
|
||||||
|
interface ${waninterface}
|
||||||
|
# On the wan interface, we want to ask for a prefix delegation.
|
||||||
|
iaid 0
|
||||||
|
ipv6rs
|
||||||
|
ia_pd 0/::/${toString prefixSize} lan/0/${toString prefixSize}
|
||||||
|
|
||||||
|
${allGenIntDescs}
|
||||||
|
'';
|
||||||
|
runHook = ''
|
||||||
|
if [[ "$reason" == "BOUND6" ]] || [[ "$reason" == "REBIND6" ]]; then
|
||||||
|
${pkgs.python3}/bin/python3 ${pkgs.writeScript "dhcpcd-runHook.py" ''
|
||||||
|
import json
|
||||||
|
import sys
|
||||||
|
import subprocess
|
||||||
|
import os
|
||||||
|
|
||||||
|
prefix = os.environ.get("new_dhcp6_ia_pd1_prefix1")[:-1]
|
||||||
|
|
||||||
|
# https://stackoverflow.com/a/37316533/12852285
|
||||||
|
def mac2ipv6(mac):
|
||||||
|
# only accept MACs separated by a colon
|
||||||
|
parts = mac.split(":")
|
||||||
|
|
||||||
|
# modify parts to match IPv6 value
|
||||||
|
parts.insert(3, "ff")
|
||||||
|
parts.insert(4, "fe")
|
||||||
|
parts[0] = "%x" % (int(parts[0], 16) ^ 2)
|
||||||
|
|
||||||
|
# format output
|
||||||
|
ipv6Parts = []
|
||||||
|
for i in range(0, len(parts), 2):
|
||||||
|
ipv6Parts.append("".join(parts[i:i+2]))
|
||||||
|
ipv6 = "%s%s" % (prefix, ":".join(ipv6Parts))
|
||||||
|
return ipv6
|
||||||
|
|
||||||
|
data = json.loads("""${builtins.toJSON disableFirewallFor}""")
|
||||||
|
for host in data:
|
||||||
|
print('setting firewall rules for ' + host["hostname"])
|
||||||
|
IP = mac2ipv6(host["mac"])
|
||||||
|
if len(host["tcpports"]) > 0:
|
||||||
|
subprocess.run(["${pkgs.nftables}/bin/nft", "insert", "rule", "inet", "filter", "forward", "ip6", "daddr", IP, "tcp", "dport", f'{{ {", ".join(map(str, host["tcpports"]))} }}', "accept" ])
|
||||||
|
if len(host["udpports"]) > 0:
|
||||||
|
subprocess.run(["${pkgs.nftables}/bin/nft", "insert", "rule", "inet", "filter", "forward", "ip6", "daddr", IP, "udp", "dport", f'{{ {", ".join(map(str, host["udpports"]))} }}', "accept" ])
|
||||||
|
subprocess.run(["${pkgs.nftables}/bin/nft", "insert", "rule", "inet", "filter", "forward", "ip6", "daddr", IP, "icmpv6", "type", "{ destination-unreachable, packet-too-big, time-exceeded, parameter-problem, echo-request, echo-reply, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert }", "accept"])
|
||||||
|
''}
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.firewall.enable = false; # disable iptables cause it's ass to set up
|
||||||
|
networking.nftables.enable = true;
|
||||||
|
networking.nftables.ruleset =
|
||||||
|
let
|
||||||
|
unsafeInterfaces = (map (x: x.name) (filter (x: x.internet == false) nets));
|
||||||
|
safeInterfaces = (map (x: x.name) (filter (x: x.internet == true) nets)) ++ [ "lo" ] ++ (optionals (wgEnabled) [ "wg0" ]);
|
||||||
|
allInternalInterfaces = (map (x: x.name) nets) ++ [ "lo" ];
|
||||||
|
portForwards = concatStringsSep "\n" (map (x: "iifname ${waninterface} ${x.proto} dport ${toString x.sourcePort} dnat ${x.destination}") cfg.forwardedPorts);
|
||||||
|
dropUnsafe = concatStringsSep "\n" (map (x: "iifname ${x} drop") unsafeInterfaces);
|
||||||
|
allowSafe = concatStringsSep "\n" (map (x: "iifname ${x} accept") safeInterfaces);
|
||||||
|
allowSafeOif = concatStringsSep "\n" (map (x: "oifname ${x} ct state { established, related } accept") safeInterfaces);
|
||||||
|
allowAll = concatStringsSep "\n" (map (x: "iifname ${x} accept") (allInternalInterfaces ++ (optionals (wgEnabled) [ "wg0" ])));
|
||||||
|
in
|
||||||
|
''
|
||||||
|
define unsafe_interfaces = {
|
||||||
|
${concatStringsSep ",\n" unsafeInterfaces}
|
||||||
|
}
|
||||||
|
define safe_interfaces = {
|
||||||
|
lo,
|
||||||
|
${concatStringsSep ",\n" safeInterfaces}
|
||||||
|
}
|
||||||
|
define all_interfaces = {
|
||||||
|
lo,
|
||||||
|
${concatStringsSep ",\n" allInternalInterfaces}
|
||||||
|
}
|
||||||
|
table inet filter {
|
||||||
|
chain input {
|
||||||
|
type filter hook input priority 0;
|
||||||
|
|
||||||
|
# allow established/related connections
|
||||||
|
ct state { established, related } accept
|
||||||
|
|
||||||
|
# early drop of invalid connections
|
||||||
|
ct state invalid drop
|
||||||
|
|
||||||
|
# allow from loopback and internal nic
|
||||||
|
${allowAll}
|
||||||
|
|
||||||
|
# allow icmp
|
||||||
|
ip protocol icmp icmp type echo-request limit rate over 1/second burst 5 packets drop
|
||||||
|
ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate over 1/second burst 5 packets drop
|
||||||
|
ip protocol icmp icmp type { destination-unreachable, echo-reply, echo-request, source-quench, time-exceeded } accept
|
||||||
|
ip6 nexthdr icmpv6 icmpv6 type { destination-unreachable, echo-reply, echo-request, nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert, packet-too-big, parameter-problem, time-exceeded } accept
|
||||||
|
|
||||||
|
# open port 22, but only allow 2 new connections per minute from each ip
|
||||||
|
tcp dport 22 ct state new flow table ssh-ftable { ip saddr limit rate 2/minute } accept
|
||||||
|
tcp dport 80 accept
|
||||||
|
tcp dport 443 accept
|
||||||
|
udp dport 51820 accept
|
||||||
|
|
||||||
|
# everything else
|
||||||
|
reject with icmp type port-unreachable
|
||||||
|
}
|
||||||
|
chain forward {
|
||||||
|
type filter hook forward priority 0;
|
||||||
|
|
||||||
|
# allow from loopback and internal nic
|
||||||
|
${allowSafe}
|
||||||
|
|
||||||
|
# allow established/related connections
|
||||||
|
${allowSafeOif}
|
||||||
|
|
||||||
|
# Drop everything else
|
||||||
|
drop
|
||||||
|
}
|
||||||
|
chain output {
|
||||||
|
type filter hook output priority 0
|
||||||
|
# dont allow any trafic from iot and stuff to escape to the wild
|
||||||
|
${dropUnsafe}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
table ip nat {
|
||||||
|
chain prerouting {
|
||||||
|
type nat hook prerouting priority 0
|
||||||
|
${portForwards}
|
||||||
|
}
|
||||||
|
|
||||||
|
chain postrouting {
|
||||||
|
type nat hook postrouting priority 0
|
||||||
|
|
||||||
|
oifname ${waninterface} masquerade
|
||||||
|
}
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
|
||||||
|
services.dnsmasq = {
|
||||||
|
enable = true;
|
||||||
|
alwaysKeepRunning = true;
|
||||||
|
extraConfig =
|
||||||
|
let
|
||||||
|
inherit (pkgs) runCommand;
|
||||||
|
gen = obj: ''
|
||||||
|
interface=${obj.name}
|
||||||
|
dhcp-range=${obj.name},${obj.dhcpv4start},${obj.dhcpv4end},12h
|
||||||
|
'';
|
||||||
|
|
||||||
|
genHosts = obj: ''
|
||||||
|
dhcp-host=${obj.mac},${obj.ip},${obj.name}
|
||||||
|
'';
|
||||||
|
genall = builtins.concatStringsSep "\n" (map gen nets);
|
||||||
|
genallHosts = builtins.concatStringsSep "\n" (map genHosts cfg.staticDHCPs);
|
||||||
|
genstatics = builtins.concatStringsSep "\n" (map (a: "address=/${a.name}/${a.ip}") statics);
|
||||||
|
netbootxyz = builtins.fetchurl {
|
||||||
|
url = "https://github.com/netbootxyz/netboot.xyz/releases/download/2.0.40/netboot.xyz.efi";
|
||||||
|
sha256 = "1gvgvlaxhjkr9i0b2bjq85h12ni9h5fn6r8nphsag3il9kificcc";
|
||||||
|
};
|
||||||
|
netbootxyzpath = runCommand "netbootpath" { } ''
|
||||||
|
mkdir $out
|
||||||
|
ln -s ${netbootxyz} $out/netbootxyz.efi
|
||||||
|
'';
|
||||||
|
in
|
||||||
|
''
|
||||||
|
no-resolv
|
||||||
|
# unbound broke
|
||||||
|
# server=127.0.0.1#5353 # unbound
|
||||||
|
server=1.1.1.1
|
||||||
|
server=1.0.0.1
|
||||||
|
|
||||||
|
# https://hveem.no/using-dnsmasq-for-dhcpv6
|
||||||
|
|
||||||
|
# don't ever listen to anything on wan and stuff
|
||||||
|
except-interface=${waninterface},${laninterface}
|
||||||
|
|
||||||
|
listen-address=0.0.0.0,::
|
||||||
|
|
||||||
|
# don't send bogus requests out on the internets
|
||||||
|
bogus-priv
|
||||||
|
|
||||||
|
# enable IPv6 Route Advertisements
|
||||||
|
enable-ra
|
||||||
|
|
||||||
|
# Construct a valid IPv6 range from reading the address set on the interface. The :: part refers to the ifid in dhcp6c.conf. Make sure you get this right or dnsmasq will get confused.
|
||||||
|
dhcp-range=lan,::,constructor:lan, ra-names,slaac, 12h
|
||||||
|
|
||||||
|
# ra-names enables a mode which gives DNS names to dual-stack hosts which do SLAAC for IPv6.
|
||||||
|
# Add your local-only LAN domain
|
||||||
|
local=/${domain}/
|
||||||
|
|
||||||
|
# have your simple hosts expanded to domain
|
||||||
|
expand-hosts
|
||||||
|
|
||||||
|
# set your domain for expand-hosts
|
||||||
|
domain=${domain}
|
||||||
|
|
||||||
|
# forward .kube domains to coredns
|
||||||
|
server=/kube/10.13.0.10
|
||||||
|
|
||||||
|
|
||||||
|
${genall}
|
||||||
|
'' +
|
||||||
|
optionalString wgEnabled ''
|
||||||
|
interface=wg0
|
||||||
|
no-dhcp-interface=wg0
|
||||||
|
addn-hosts=/run/wireguard-hosts
|
||||||
|
'' + ''
|
||||||
|
interface=lo # otherwise localhost dns does not work
|
||||||
|
${genstatics}
|
||||||
|
${genallHosts}
|
||||||
|
|
||||||
|
dhcp-boot=netbootxyz.efi
|
||||||
|
|
||||||
|
enable-tftp
|
||||||
|
tftp-root=${netbootxyzpath}
|
||||||
|
|
||||||
|
# set authoritative mode
|
||||||
|
dhcp-authoritative
|
||||||
|
|
||||||
|
'';
|
||||||
|
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
26
lib/attrs.nix
Normal file
26
lib/attrs.nix
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
{ lib, ... }:
|
||||||
|
|
||||||
|
with builtins;
|
||||||
|
with lib;
|
||||||
|
rec {
|
||||||
|
# attrsToList
|
||||||
|
attrsToList = attrs:
|
||||||
|
mapAttrsToList (name: value: { inherit name value; }) attrs;
|
||||||
|
|
||||||
|
# mapFilterAttrs ::
|
||||||
|
# (name -> value -> bool)
|
||||||
|
# (name -> value -> { name = any; value = any; })
|
||||||
|
# attrs
|
||||||
|
mapFilterAttrs = pred: f: attrs: filterAttrs pred (mapAttrs' f attrs);
|
||||||
|
|
||||||
|
# Generate an attribute set by mapping a function over a list of values.
|
||||||
|
genAttrs' = values: f: listToAttrs (map f values);
|
||||||
|
|
||||||
|
# anyAttrs :: (name -> value -> bool) attrs
|
||||||
|
anyAttrs = pred: attrs:
|
||||||
|
any (attr: pred attr.name attr.value) (attrsToList attrs);
|
||||||
|
|
||||||
|
# countAttrs :: (name -> value -> bool) attrs
|
||||||
|
countAttrs = pred: attrs:
|
||||||
|
count (attr: pred attr.name attr.value) (attrsToList attrs);
|
||||||
|
}
|
||||||
18
lib/default.nix
Normal file
18
lib/default.nix
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
{ darwin, inputs, lib, pkgsBySystem, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (lib) makeExtensible attrValues foldr;
|
||||||
|
inherit (modules) mapModules;
|
||||||
|
|
||||||
|
modules = import ./modules.nix {
|
||||||
|
inherit lib;
|
||||||
|
self.attrs = import ./attrs.nix { inherit lib; self = { }; };
|
||||||
|
};
|
||||||
|
|
||||||
|
mylib = makeExtensible (self:
|
||||||
|
with self; mapModules ./.
|
||||||
|
(file: import file { inherit self lib inputs; }));
|
||||||
|
in
|
||||||
|
mylib.extend
|
||||||
|
(self: super:
|
||||||
|
foldr (a: b: a // b) { } (attrValues super))
|
||||||
54
lib/modules.nix
Normal file
54
lib/modules.nix
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
{ self, lib, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (builtins) attrValues readDir pathExists concatLists;
|
||||||
|
inherit (lib) id mapAttrsToList filterAttrs hasPrefix hasSuffix nameValuePair removeSuffix;
|
||||||
|
inherit (self.attrs) mapFilterAttrs;
|
||||||
|
in
|
||||||
|
rec {
|
||||||
|
mapModules = dir: fn:
|
||||||
|
mapFilterAttrs
|
||||||
|
(n: v:
|
||||||
|
v != null &&
|
||||||
|
!(hasPrefix "_" n))
|
||||||
|
(n: v:
|
||||||
|
let path = "${toString dir}/${n}"; in
|
||||||
|
if v == "directory" && pathExists "${path}/default.nix"
|
||||||
|
then nameValuePair n (fn path)
|
||||||
|
else if v == "regular" &&
|
||||||
|
n != "default.nix" &&
|
||||||
|
hasSuffix ".nix" n
|
||||||
|
then nameValuePair (removeSuffix ".nix" n) (fn path)
|
||||||
|
else nameValuePair "" null)
|
||||||
|
(readDir dir);
|
||||||
|
|
||||||
|
mapModules' = dir: fn:
|
||||||
|
attrValues (mapModules dir fn);
|
||||||
|
|
||||||
|
mapModulesRec = dir: fn:
|
||||||
|
mapFilterAttrs
|
||||||
|
(n: v:
|
||||||
|
v != null &&
|
||||||
|
!(hasPrefix "_" n))
|
||||||
|
(n: v:
|
||||||
|
let path = "${toString dir}/${n}"; in
|
||||||
|
if v == "directory"
|
||||||
|
then nameValuePair n (mapModulesRec path fn)
|
||||||
|
else if v == "regular" && n != "default.nix" && hasSuffix ".nix" n
|
||||||
|
then nameValuePair (removeSuffix ".nix" n) (fn path)
|
||||||
|
else nameValuePair "" null)
|
||||||
|
(readDir dir);
|
||||||
|
|
||||||
|
mapModulesRec' = dir: fn:
|
||||||
|
let
|
||||||
|
dirs =
|
||||||
|
mapAttrsToList
|
||||||
|
(k: _: "${dir}/${k}")
|
||||||
|
(filterAttrs
|
||||||
|
(n: v: v == "directory" && !(hasPrefix "_" n))
|
||||||
|
(readDir dir));
|
||||||
|
files = attrValues (mapModules dir id);
|
||||||
|
paths = files ++ concatLists (map (d: mapModulesRec' d id) dirs);
|
||||||
|
in
|
||||||
|
map fn paths;
|
||||||
|
}
|
||||||
18
lib/options.nix
Normal file
18
lib/options.nix
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
{ lib, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (lib) mkOption types;
|
||||||
|
in
|
||||||
|
rec {
|
||||||
|
mkOpt = type: default:
|
||||||
|
mkOption { inherit type default; };
|
||||||
|
|
||||||
|
mkOpt' = type: default: description:
|
||||||
|
mkOption { inherit type default description; };
|
||||||
|
|
||||||
|
mkBoolOpt = default: mkOption {
|
||||||
|
inherit default;
|
||||||
|
type = types.bool;
|
||||||
|
example = true;
|
||||||
|
};
|
||||||
|
}
|
||||||
64
nixos-common.nix
Normal file
64
nixos-common.nix
Normal file
|
|
@ -0,0 +1,64 @@
|
||||||
|
{ inputs, config, lib, pkgs, ... }:
|
||||||
|
with lib;
|
||||||
|
with lib.my;
|
||||||
|
let
|
||||||
|
pubkeys = import ./data/pubkeys.nix {};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
# Set your time zone.
|
||||||
|
time.timeZone = "Europe/Berlin";
|
||||||
|
console.font = "Lat2-Terminus16";
|
||||||
|
console.keyMap = "us";
|
||||||
|
|
||||||
|
users.users.root.openssh.authorizedKeys.keys = pubkeys.ragon.user;
|
||||||
|
|
||||||
|
# Select internationalisation properties.
|
||||||
|
i18n = {
|
||||||
|
defaultLocale = "en_DK.UTF-8";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Configure nix and nixpkgs
|
||||||
|
environment.variables.NIXPKGS_ALLOW_UNFREE = "1";
|
||||||
|
nix =
|
||||||
|
let
|
||||||
|
filteredInputs = filterAttrs (n: _: n != "self") inputs;
|
||||||
|
nixPathInputs = mapAttrsToList (n: v: "${n}=${v}") filteredInputs;
|
||||||
|
registryInputs = mapAttrs (_: v: { flake = v; }) filteredInputs;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
package = pkgs.unstable.nixFlakes;
|
||||||
|
settings = {
|
||||||
|
trusted-users = mkDefault [ "root" "@wheel" ];
|
||||||
|
allowed-users = mkDefault [ "root" "@wheel" ];
|
||||||
|
substituters = [
|
||||||
|
"https://nix-community.cachix.org"
|
||||||
|
];
|
||||||
|
trusted-public-keys = [
|
||||||
|
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
|
||||||
|
];
|
||||||
|
auto-optimise-store = true;
|
||||||
|
|
||||||
|
};
|
||||||
|
extraOptions = "experimental-features = nix-command flakes";
|
||||||
|
nixPath = nixPathInputs ++ [
|
||||||
|
"nixpkgs-overlays=${config.conf.dir}/overlays"
|
||||||
|
"conf=${config.conf.dir}"
|
||||||
|
];
|
||||||
|
registry = registryInputs // { conf.flake = inputs.self; };
|
||||||
|
};
|
||||||
|
system.configurationRevision = with inputs; mkIf (self ? rev) self.rev;
|
||||||
|
system.stateVersion = "21.05";
|
||||||
|
|
||||||
|
|
||||||
|
## Some reasonable, global defaults
|
||||||
|
# This is here to appease 'nix flake check' for generic hosts with no
|
||||||
|
# hardware-configuration.nix or fileSystem config.
|
||||||
|
fileSystems."/".device = mkDefault "/dev/disk/by-label/nixos";
|
||||||
|
|
||||||
|
boot = {
|
||||||
|
loader = {
|
||||||
|
efi.canTouchEfiVariables = mkDefault true;
|
||||||
|
systemd-boot.configurationLimit = 5;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
62
nixos-modules/cli/default.nix
Normal file
62
nixos-modules/cli/default.nix
Normal file
|
|
@ -0,0 +1,62 @@
|
||||||
|
{ config, lib, pkgs, inputs, ... }:
|
||||||
|
with lib;
|
||||||
|
with lib.my;
|
||||||
|
let
|
||||||
|
cfg = config.ragon.cli;
|
||||||
|
ragon = config.ragon;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.ragon.cli.enable = lib.mkEnableOption "Enables ragons CLI stuff";
|
||||||
|
options.ragon.cli.maximal = mkBoolOpt true;
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
security.sudo.extraConfig = "Defaults lecture = never";
|
||||||
|
# root shell
|
||||||
|
users.extraUsers.root.shell = pkgs.zsh;
|
||||||
|
|
||||||
|
environment.shellAliases = {
|
||||||
|
v = "nvim";
|
||||||
|
vim = "nvim";
|
||||||
|
gpl = "git pull";
|
||||||
|
gp = "git push";
|
||||||
|
lg = "lazygit";
|
||||||
|
gc = "git commit -v";
|
||||||
|
kb = "git commit -m \"\$(curl -s http://whatthecommit.com/index.txt)\"";
|
||||||
|
gs = "git status -v";
|
||||||
|
gfc = "git fetch && git checkout";
|
||||||
|
gl = "git log --graph";
|
||||||
|
l = "exa -la --git";
|
||||||
|
la = "exa -la --git";
|
||||||
|
ls = "exa";
|
||||||
|
ll = "exa -l --git";
|
||||||
|
cat = "bat";
|
||||||
|
};
|
||||||
|
environment.variables = {
|
||||||
|
EDITOR = "nvim";
|
||||||
|
VISUAL = "nvim";
|
||||||
|
};
|
||||||
|
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
nnn
|
||||||
|
bat
|
||||||
|
htop
|
||||||
|
exa
|
||||||
|
curl
|
||||||
|
fd
|
||||||
|
file
|
||||||
|
fzf
|
||||||
|
git
|
||||||
|
neofetch
|
||||||
|
tmux
|
||||||
|
ripgrep
|
||||||
|
pv
|
||||||
|
direnv # needed for lorri
|
||||||
|
unzip
|
||||||
|
tmux
|
||||||
|
aria2
|
||||||
|
yt-dlp
|
||||||
|
neovim
|
||||||
|
];
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
53
nixos-modules/cli/zsh/zsh.nix
Normal file
53
nixos-modules/cli/zsh/zsh.nix
Normal file
|
|
@ -0,0 +1,53 @@
|
||||||
|
{ inputs, config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.ragon.cli;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
ragon.user.persistent = {
|
||||||
|
extraDirectories = [
|
||||||
|
".config/zsh"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.zsh = {
|
||||||
|
enable = true;
|
||||||
|
histSize = 10000;
|
||||||
|
histFile = "$HOME/.config/zsh/history";
|
||||||
|
# autosuggestions.enable = true;
|
||||||
|
enableCompletion = true;
|
||||||
|
setOptions = [
|
||||||
|
"HIST_IGNORE_DUPS"
|
||||||
|
"SHARE_HISTORY"
|
||||||
|
"HIST_FCNTL_LOCK"
|
||||||
|
"AUTO_CD"
|
||||||
|
"AUTO_MENU"
|
||||||
|
];
|
||||||
|
|
||||||
|
# interactiveShellInit broke agkozak-zsh-prompt for some reaaaaaaaason
|
||||||
|
promptInit =
|
||||||
|
let
|
||||||
|
zshrc = builtins.readFile ./zshrc;
|
||||||
|
|
||||||
|
sources = [
|
||||||
|
"${inputs.agkozak-zsh-prompt}/agkozak-zsh-prompt.plugin.zsh"
|
||||||
|
"${pkgs.oh-my-zsh}/share/oh-my-zsh/plugins/git/git.plugin.zsh"
|
||||||
|
"${pkgs.oh-my-zsh}/share/oh-my-zsh/plugins/globalias/globalias.plugin.zsh"
|
||||||
|
"${inputs.zsh-vim-mode}/zsh-vim-mode.plugin.zsh"
|
||||||
|
"${inputs.zsh-syntax-highlighting}/zsh-syntax-highlighting.plugin.zsh"
|
||||||
|
"${inputs.zsh-completions}/zsh-completions.plugin.zsh"
|
||||||
|
];
|
||||||
|
|
||||||
|
source = map (x: "source " + x) sources;
|
||||||
|
|
||||||
|
plugins = builtins.concatStringsSep "\n" (source);
|
||||||
|
|
||||||
|
in
|
||||||
|
''
|
||||||
|
${zshrc}
|
||||||
|
${plugins}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
46
nixos-modules/cli/zsh/zshrc
Normal file
46
nixos-modules/cli/zsh/zshrc
Normal file
|
|
@ -0,0 +1,46 @@
|
||||||
|
AGKOZAK_MULTILINE=0
|
||||||
|
AGKOZAK_PROMPT_CHAR=( ❯ ❯ "%F{red}N%f")
|
||||||
|
autoload -Uz history-search-end
|
||||||
|
|
||||||
|
zle -N history-beginning-search-backward-end history-search-end
|
||||||
|
zle -N history-beginning-search-forward-end history-search-end
|
||||||
|
|
||||||
|
bindkey -M vicmd '^[[A' history-beginning-search-backward-end \
|
||||||
|
'^[OA' history-beginning-search-backward-end \
|
||||||
|
'^[[B' history-beginning-search-forward-end \
|
||||||
|
'^[OB' history-beginning-search-forward-end
|
||||||
|
bindkey -M viins '^[[A' history-beginning-search-backward-end \
|
||||||
|
'^[OA' history-beginning-search-backward-end \
|
||||||
|
'^[[B' history-beginning-search-forward-end \
|
||||||
|
'^[OB' history-beginning-search-forward-end
|
||||||
|
|
||||||
|
hash go 2>/dev/null && export PATH=$PATH:$(go env GOPATH)/bin
|
||||||
|
hash yarn 2>/dev/null && export PATH=$PATH:$HOME/.yarn/bin
|
||||||
|
hash direnv 2>/dev/null && eval "$(direnv hook zsh)" # needed for lorri
|
||||||
|
hash helm 2>/dev/null && . <(helm completion zsh)
|
||||||
|
hash kubectl 2>/dev/null && . <(kubectl completion zsh)
|
||||||
|
export NNN_ARCHIVE="\\.(7z|a|ace|alz|arc|arj|bz|bz2|cab|cpio|deb|gz|jar|lha|lz|lzh|lzma|lzo|rar|rpm|rz|t7z|tar|tbz|tbz2|tgz|tlz|txz|tZ|tzo|war|xpi|xz|Z|zip)$"
|
||||||
|
|
||||||
|
n ()
|
||||||
|
{
|
||||||
|
# Block nesting of nnn in subshells
|
||||||
|
if [ -n $NNNLVL ] && [ "${NNNLVL:-0}" -ge 1 ]; then
|
||||||
|
echo "nnn is already running"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
export NNN_TMPFILE="$HOME/.config/nnn/.lastd"
|
||||||
|
|
||||||
|
# Unmask ^Q (, ^V etc.) (if required, see `stty -a`) to Quit nnn
|
||||||
|
# stty start undef
|
||||||
|
# stty stop undef
|
||||||
|
# stty lwrap undef
|
||||||
|
# stty lnext undef
|
||||||
|
|
||||||
|
nnn -d "$@"
|
||||||
|
|
||||||
|
if [ -f "$NNN_TMPFILE" ]; then
|
||||||
|
. "$NNN_TMPFILE"
|
||||||
|
rm -f "$NNN_TMPFILE" > /dev/null
|
||||||
|
fi
|
||||||
|
}
|
||||||
24
nixos-modules/hardware/bluetooth.nix
Normal file
24
nixos-modules/hardware/bluetooth.nix
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.ragon.hardware.bluetooth;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.ragon.hardware.bluetooth.enable = lib.mkEnableOption "Enables bluetooth stuff (tlp,...)";
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
hardware.bluetooth.enable = true;
|
||||||
|
services.blueman.enable = true;
|
||||||
|
hardware.pulseaudio = {
|
||||||
|
extraModules = [ pkgs.pulseaudio-modules-bt ];
|
||||||
|
package = pkgs.pulseaudioFull;
|
||||||
|
};
|
||||||
|
ragon.gui.autostart = [
|
||||||
|
[ "${pkgs.blueberry}/bin/blueberry-tray" ]
|
||||||
|
];
|
||||||
|
environment.systemPackages = (if config.ragon.gui.enable then [ pkgs.blueberry ] else [ ]);
|
||||||
|
|
||||||
|
ragon.persist.extraDirectories = [
|
||||||
|
"/var/lib/bluetooth"
|
||||||
|
];
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
23
nixos-modules/hardware/laptop.nix
Normal file
23
nixos-modules/hardware/laptop.nix
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.ragon.hardware.laptop;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.ragon.hardware.laptop.enable = lib.mkEnableOption "Enables laptop stuff (tlp,...)";
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
services.tlp = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
CPU_ENERGY_PERF_POLICY_ON_AC = "performance";
|
||||||
|
CPU_ENERGY_PERF_POLICY_ON_BAT = "poversave";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
services.xserver.libinput = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
hardware.acpilight.enable = true;
|
||||||
|
services.thermald.enable = true;
|
||||||
|
ragon.gui.laptop = true;
|
||||||
|
ragon.hardware.bluetooth.enable = true; # laptops normally have BT
|
||||||
|
};
|
||||||
|
}
|
||||||
12
nixos-modules/hardware/nvidia.nix
Normal file
12
nixos-modules/hardware/nvidia.nix
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.ragon.hardware.nvidia;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.ragon.hardware.nvidia.enable = lib.mkEnableOption "Enables nvidia stuff (why didnt i buy amd?)";
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
# nivea
|
||||||
|
services.xserver.videoDrivers = [ "nvidia" ];
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
36
nixos-modules/hardware/rpi3.nix
Normal file
36
nixos-modules/hardware/rpi3.nix
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.ragon.hardware.rpi3;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.ragon.hardware.rpi3.enable = lib.mkEnableOption "Enables rpi3 quirks";
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
boot.loader.raspberryPi = {
|
||||||
|
enable = true;
|
||||||
|
version = 3;
|
||||||
|
};
|
||||||
|
boot.extraModprobeConfig = ''
|
||||||
|
options cfg80211 ieee80211_regdom="DE"
|
||||||
|
'';
|
||||||
|
hardware.firmware = [ pkgs.wireless-regdb ];
|
||||||
|
#boot.kernelPackages = pkgs.linux_rpi3;
|
||||||
|
nixpkgs.overlays = [
|
||||||
|
(self: super: {
|
||||||
|
firmwareLinuxNonfree = super.firmwareLinuxNonfree.overrideAttrs (old: {
|
||||||
|
version = "2020-12-18";
|
||||||
|
src = pkgs.fetchgit {
|
||||||
|
url =
|
||||||
|
"https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git";
|
||||||
|
rev = "b79d2396bc630bfd9b4058459d3e82d7c3428599";
|
||||||
|
sha256 = "1rb5b3fzxk5bi6kfqp76q1qszivi0v1kdz1cwj2llp5sd9ns03b5";
|
||||||
|
};
|
||||||
|
outputHash = "1p7vn2hfwca6w69jhw5zq70w44ji8mdnibm1z959aalax6ndy146";
|
||||||
|
});
|
||||||
|
})
|
||||||
|
];
|
||||||
|
networking.wireless.enable = true;
|
||||||
|
hardware.enableRedistributableFirmware = true;
|
||||||
|
networking.wireless.interfaces = [ "wlan0" ];
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
45
nixos-modules/networking/tailscale.nix
Normal file
45
nixos-modules/networking/tailscale.nix
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.ragon.services.tailscale;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.ragon.services.tailscale.enable = lib.mkEnableOption "Enables tailscale";
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
# enable the tailscale service
|
||||||
|
services.tailscale.enable = true;
|
||||||
|
ragon.agenix.secrets.tailscaleKey = {};
|
||||||
|
networking.firewall = {
|
||||||
|
# always allow traffic from your Tailscale network
|
||||||
|
trustedInterfaces = [ "tailscale0" ];
|
||||||
|
|
||||||
|
# allow the Tailscale UDP port through the firewall
|
||||||
|
allowedUDPPorts = [ config.services.tailscale.port ];
|
||||||
|
};
|
||||||
|
systemd.services.tailscale-autoconnect = {
|
||||||
|
description = "Automatic connection to Tailscale";
|
||||||
|
|
||||||
|
# make sure tailscale is running before trying to connect to tailscale
|
||||||
|
after = [ "network-pre.target" "tailscale.service" ];
|
||||||
|
wants = [ "network-pre.target" "tailscale.service" ];
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
|
||||||
|
# set this service as a oneshot job
|
||||||
|
serviceConfig.Type = "oneshot";
|
||||||
|
|
||||||
|
# have the job run this shell script
|
||||||
|
script = with pkgs; ''
|
||||||
|
# wait for tailscaled to settle
|
||||||
|
sleep 2
|
||||||
|
|
||||||
|
# check if we are already authenticated to tailscale
|
||||||
|
status="$(${tailscale}/bin/tailscale status -json | ${jq}/bin/jq -r .BackendState)"
|
||||||
|
if [ $status = "Running" ]; then # if so, then do nothing
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
key=$(<${config.age.secrets.tailscaleKey.path})
|
||||||
|
# otherwise authenticate with tailscale
|
||||||
|
${tailscale}/bin/tailscale up -authkey $key
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
49
nixos-modules/services/bitwarden.nix
Normal file
49
nixos-modules/services/bitwarden.nix
Normal file
|
|
@ -0,0 +1,49 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.ragon.services.bitwarden;
|
||||||
|
domain = config.ragon.services.nginx.domain;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.ragon.services.bitwarden.enable = lib.mkEnableOption "Enables the vaultwarden BitWarden Server";
|
||||||
|
options.ragon.services.bitwarden.domainPrefix =
|
||||||
|
lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "bw";
|
||||||
|
};
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
services.vaultwarden = {
|
||||||
|
enable = true;
|
||||||
|
# backupDir = "/backups/vaultwarden";
|
||||||
|
config = {
|
||||||
|
domain = "https://${cfg.domainPrefix}.${domain}";
|
||||||
|
signupsAllowed = false;
|
||||||
|
rocketPort = 8222;
|
||||||
|
rocketAddress = "127.0.0.1";
|
||||||
|
databaseUrl = "postgresql://%2Frun%2Fpostgresql/vaultwarden";
|
||||||
|
webVaultEnabled = true;
|
||||||
|
};
|
||||||
|
dbBackend = "postgresql";
|
||||||
|
|
||||||
|
};
|
||||||
|
services.nginx.virtualHosts."${cfg.domainPrefix}.${domain}" = {
|
||||||
|
forceSSL = true;
|
||||||
|
useACMEHost = "${domain}";
|
||||||
|
locations."/".proxyPass = "http://${config.services.vaultwarden.config.rocketAddress}:${toString config.services.vaultwarden.config.rocketPort}";
|
||||||
|
};
|
||||||
|
services.postgresql = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
# Ensure the database, user, and permissions always exist
|
||||||
|
ensureDatabases = [ "vaultwarden" ];
|
||||||
|
ensureUsers = [
|
||||||
|
{
|
||||||
|
name = "vaultwarden";
|
||||||
|
ensurePermissions."DATABASE vaultwarden" = "ALL PRIVILEGES";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
ragon.persist.extraDirectories = [
|
||||||
|
"/var/lib/vaultwarden"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
60
nixos-modules/services/ddns.nix
Normal file
60
nixos-modules/services/ddns.nix
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
with lib;
|
||||||
|
with lib.my;
|
||||||
|
let
|
||||||
|
cfg = config.ragon.services.ddns;
|
||||||
|
domain = config.ragon.services.nginx.domain;
|
||||||
|
dataDir = "/var/lib/inadyn";
|
||||||
|
cacheDir = "/var/cache/inadyn";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.ragon.services.ddns.enable = mkEnableOption "Enables CloudFlare DDNS to the domain specified in ragon.services.nginx.domain and all subdomains";
|
||||||
|
options.ragon.services.ddns.ipv4 = mkBoolOpt true;
|
||||||
|
options.ragon.services.ddns.ipv6 = mkBoolOpt true;
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
systemd.services.inadyn = {
|
||||||
|
description = "inadyn DDNS Client";
|
||||||
|
after = [ "network.target" ];
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
serviceConfig = rec {
|
||||||
|
Type = "simple";
|
||||||
|
ExecStart =
|
||||||
|
pkgs.writeScript "run-inadyn.sh" ''
|
||||||
|
#!${pkgs.bash}/bin/bash
|
||||||
|
export PATH=$PATH:${pkgs.bash}/bin/bash # idk if that helps
|
||||||
|
source ${config.age.secrets.cloudflareAcme.path}
|
||||||
|
cat >/run/${RuntimeDirectory}/inadyn.cfg <<EOF
|
||||||
|
period = 180
|
||||||
|
user-agent = Mozilla/5.0
|
||||||
|
allow-ipv6 = true
|
||||||
|
${optionalString cfg.ipv4 ''
|
||||||
|
# ipv4
|
||||||
|
provider cloudflare.com:1 {
|
||||||
|
checkip-server = ipv4.icanhazip.com
|
||||||
|
username = ${domain}
|
||||||
|
password = $CLOUDFLARE_DNS_API_TOKEN
|
||||||
|
hostname = ${domain}
|
||||||
|
}
|
||||||
|
''}
|
||||||
|
${optionalString cfg.ipv6 ''
|
||||||
|
# ipv6
|
||||||
|
provider cloudflare.com:2 {
|
||||||
|
checkip-server = ipv6.icanhazip.com
|
||||||
|
username = ${domain}
|
||||||
|
password = $CLOUDFLARE_DNS_API_TOKEN
|
||||||
|
hostname = ${domain}
|
||||||
|
}
|
||||||
|
''}
|
||||||
|
EOF
|
||||||
|
exec ${pkgs.inadyn}/bin/inadyn -n --cache-dir=${cacheDir} -f /run/${RuntimeDirectory}/inadyn.cfg
|
||||||
|
'';
|
||||||
|
RuntimeDirectory = StateDirectory;
|
||||||
|
StateDirectory = builtins.baseNameOf dataDir;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
systemd.tmpfiles.rules = [
|
||||||
|
"d ${cacheDir} 1777 root root 10m"
|
||||||
|
];
|
||||||
|
ragon.agenix.secrets.cloudflareAcme = { };
|
||||||
|
};
|
||||||
|
}
|
||||||
16
nixos-modules/services/docker.nix
Normal file
16
nixos-modules/services/docker.nix
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.ragon.services.docker;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.ragon.services.docker.enable = lib.mkEnableOption "Enables docker";
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
virtualisation.oci-containers.backend = "docker";
|
||||||
|
virtualisation.docker.enable = true;
|
||||||
|
ragon.user.extraGroups = [ "docker" "podman" ];
|
||||||
|
ragon.persist.extraDirectories = [
|
||||||
|
"/var/lib/docker"
|
||||||
|
"/var/cache/docker"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
49
nixos-modules/services/gitlab.nix
Normal file
49
nixos-modules/services/gitlab.nix
Normal file
|
|
@ -0,0 +1,49 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
with lib;
|
||||||
|
with lib.my;
|
||||||
|
let
|
||||||
|
cfg = config.ragon.services.gitlab;
|
||||||
|
domain = config.ragon.services.nginx.domain;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.ragon.services.gitlab.enable = mkEnableOption "Enables gitlab";
|
||||||
|
options.ragon.services.gitlab.domainPrefix =
|
||||||
|
mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "gitlab";
|
||||||
|
};
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
services.gitlab = {
|
||||||
|
enable = true;
|
||||||
|
https = true;
|
||||||
|
initialRootPasswordFile = "${config.age.secrets.gitlabInitialRootPassword.path}";
|
||||||
|
port = 443;
|
||||||
|
host = "${cfg.domainPrefix}.${domain}";
|
||||||
|
secrets = {
|
||||||
|
dbFile = "${config.age.secrets.gitlabDBFile.path}";
|
||||||
|
jwsFile = "${config.age.secrets.gitlabJWSFile.path}";
|
||||||
|
otpFile = "${config.age.secrets.gitlabOTPFile.path}";
|
||||||
|
secretFile = "${config.age.secrets.gitlabSecretFile.path}";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
ragon.agenix.secrets = foldl (a: b: a // b) { } (map (a: { ${a} = { owner = "gitlab"; }; }) [
|
||||||
|
"gitlabDBFile"
|
||||||
|
"gitlabInitialRootPassword"
|
||||||
|
"gitlabJWSFile"
|
||||||
|
"gitlabOTPFile"
|
||||||
|
"gitlabSecretFile"
|
||||||
|
]);
|
||||||
|
|
||||||
|
services.nginx.virtualHosts."${cfg.domainPrefix}.${domain}" = {
|
||||||
|
useACMEHost = "${domain}";
|
||||||
|
forceSSL = true;
|
||||||
|
locations."/".proxyPass = "http://unix:/run/gitlab/gitlab-workhorse.socket";
|
||||||
|
locations."/".extraConfig = "client_max_body_size 4G;";
|
||||||
|
};
|
||||||
|
ragon.persist.extraDirectories = [
|
||||||
|
"${config.services.postgresql.dataDir}"
|
||||||
|
"${config.services.gitlab.statePath}"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
32
nixos-modules/services/grafana.nix
Normal file
32
nixos-modules/services/grafana.nix
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.ragon.services.grafana;
|
||||||
|
domain = config.ragon.services.nginx.domain;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.ragon.services.grafana.enable = lib.mkEnableOption "Enables grafana";
|
||||||
|
options.ragon.services.grafana.domainPrefix =
|
||||||
|
lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "grafana";
|
||||||
|
};
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
services.grafana = {
|
||||||
|
enable = true;
|
||||||
|
domain = "${cfg.domainPrefix}.${domain}";
|
||||||
|
rootUrl = "https://${cfg.domainPrefix}.${domain}/";
|
||||||
|
};
|
||||||
|
services.nginx.virtualHosts."${cfg.domainPrefix}.${domain}" = {
|
||||||
|
useACMEHost = "${domain}";
|
||||||
|
addSSL = true;
|
||||||
|
locations = {
|
||||||
|
"/".proxyPass = "http://127.0.0.1:${toString config.services.grafana.port}";
|
||||||
|
"/".proxyWebsockets = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
ragon.persist.extraDirectories = [
|
||||||
|
"${config.services.grafana.dataDir}"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
55
nixos-modules/services/hedgedoc.nix
Normal file
55
nixos-modules/services/hedgedoc.nix
Normal file
|
|
@ -0,0 +1,55 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.ragon.services.hedgedoc;
|
||||||
|
domain = config.ragon.services.nginx.domain;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.ragon.services.hedgedoc.enable = lib.mkEnableOption "Enables the hedgedoc BitWarden Server";
|
||||||
|
options.ragon.services.hedgedoc.domainPrefix =
|
||||||
|
lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "md";
|
||||||
|
};
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
services.hedgedoc = {
|
||||||
|
enable = true;
|
||||||
|
environmentFile = "${config.age.secrets.hedgedocSecret.path}";
|
||||||
|
configuration = {
|
||||||
|
protocolUseSSL = true;
|
||||||
|
sessionSecret = "$SESSION_SECRET";
|
||||||
|
allowEmailRegister = false;
|
||||||
|
domain = "${cfg.domainPrefix}.${domain}";
|
||||||
|
db = {
|
||||||
|
dialect = "postgres";
|
||||||
|
host = "/run/postgresql";
|
||||||
|
database = "hedgedoc";
|
||||||
|
};
|
||||||
|
allowAnonymousEdits = false;
|
||||||
|
allowFreeURL = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
ragon.agenix.secrets.hedgedocSecret.owner = "hedgedoc";
|
||||||
|
services.nginx.virtualHosts."${cfg.domainPrefix}.${domain}" = {
|
||||||
|
forceSSL = true;
|
||||||
|
useACMEHost = "${domain}";
|
||||||
|
locations."/".proxyWebsockets = true;
|
||||||
|
locations."/".proxyPass = "http://127.0.0.1:${toString config.services.hedgedoc.configuration.port}";
|
||||||
|
};
|
||||||
|
services.postgresql = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
# Ensure the database, user, and permissions always exist
|
||||||
|
ensureDatabases = [ "hedgedoc" ];
|
||||||
|
ensureUsers = [
|
||||||
|
{
|
||||||
|
name = "hedgedoc";
|
||||||
|
ensurePermissions."DATABASE hedgedoc" = "ALL PRIVILEGES";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
ragon.persist.extraDirectories = [
|
||||||
|
"${config.services.hedgedoc.workDir}"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
68
nixos-modules/services/jellyfin.nix
Normal file
68
nixos-modules/services/jellyfin.nix
Normal file
|
|
@ -0,0 +1,68 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.ragon.services.jellyfin;
|
||||||
|
domain = config.ragon.services.nginx.domain;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.ragon.services.jellyfin.enable = lib.mkEnableOption "Enables jellyfin";
|
||||||
|
options.ragon.services.jellyfin.domainPrefix =
|
||||||
|
lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "j";
|
||||||
|
};
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
services.jellyfin.enable = true;
|
||||||
|
services.jellyfin.openFirewall = true;
|
||||||
|
services.nginx.virtualHosts."${cfg.domainPrefix}.${domain}" = {
|
||||||
|
useACMEHost = "${domain}";
|
||||||
|
addSSL = true;
|
||||||
|
locations = {
|
||||||
|
"= /".extraConfig = "return 302 https://$host/web/;";
|
||||||
|
"/" = {
|
||||||
|
extraConfig = ''
|
||||||
|
proxy_pass http://127.0.0.1:8096;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
proxy_set_header X-Forwarded-Protocol $scheme;
|
||||||
|
proxy_set_header X-Forwarded-Host $http_host;
|
||||||
|
|
||||||
|
# Disable buffering when the nginx proxy gets very resource heavy upon streaming
|
||||||
|
proxy_buffering off;
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
"= /web/" = {
|
||||||
|
extraConfig = ''
|
||||||
|
proxy_pass http://127.0.0.1:8096/web/index.html;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
proxy_set_header X-Forwarded-Protocol $scheme;
|
||||||
|
proxy_set_header X-Forwarded-Host $http_host;
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
"/socket" = {
|
||||||
|
extraConfig = ''
|
||||||
|
proxy_pass http://127.0.0.1:8096;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
proxy_set_header X-Forwarded-Protocol $scheme;
|
||||||
|
proxy_set_header X-Forwarded-Host $http_host;
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
ragon.persist.extraDirectories = [
|
||||||
|
"/var/cache/jellyfin"
|
||||||
|
"/var/lib/jellyfin"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
17
nixos-modules/services/libvirt.nix
Normal file
17
nixos-modules/services/libvirt.nix
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.ragon.services.libvirt;
|
||||||
|
domain = config.ragon.services.nginx.domain;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.ragon.services.libvirt.enable = lib.mkEnableOption "Enables libvirt and stuff";
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
virtualisation.libvirtd = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
ragon.user.extraGroups = [ "kvm" "libvirtd" ];
|
||||||
|
ragon.persist.extraDirectories = [
|
||||||
|
"/var/lib/libvirt"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
162
nixos-modules/services/monitoring.nix
Normal file
162
nixos-modules/services/monitoring.nix
Normal file
|
|
@ -0,0 +1,162 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
with lib;
|
||||||
|
with lib.my;
|
||||||
|
let
|
||||||
|
cfg = importTOML ../../data/monitoring.toml;
|
||||||
|
hostName = config.networking.hostName;
|
||||||
|
getHost = (y:
|
||||||
|
if (y == hostName)
|
||||||
|
then "127.0.0.1"
|
||||||
|
else
|
||||||
|
(
|
||||||
|
if (builtins.elem y (builtins.attrNames cfg.hostOverrides))
|
||||||
|
then cfg.hostOverrides.${y}
|
||||||
|
else "${y}.hailsatan.eu"
|
||||||
|
)
|
||||||
|
);
|
||||||
|
in
|
||||||
|
{
|
||||||
|
config = mkMerge ([
|
||||||
|
(mkIf (cfg.master.hostname == hostName) {
|
||||||
|
services.loki.enable = true;
|
||||||
|
networking.firewall.allowedTCPPorts = [ 3100 ];
|
||||||
|
services.loki.configFile = pkgs.writeText "loki.yml" ''
|
||||||
|
auth_enabled: false
|
||||||
|
server:
|
||||||
|
http_listen_port: 3100
|
||||||
|
grpc_listen_port: 9096
|
||||||
|
|
||||||
|
ingester:
|
||||||
|
wal:
|
||||||
|
enabled: true
|
||||||
|
dir: /tmp/wal
|
||||||
|
lifecycler:
|
||||||
|
address: 127.0.0.1
|
||||||
|
ring:
|
||||||
|
kvstore:
|
||||||
|
store: inmemory
|
||||||
|
replication_factor: 1
|
||||||
|
final_sleep: 0s
|
||||||
|
chunk_idle_period: 1h # Any chunk not receiving new logs in this time will be flushed
|
||||||
|
max_chunk_age: 1h # All chunks will be flushed when they hit this age, default is 1h
|
||||||
|
chunk_target_size: 1048576 # Loki will attempt to build chunks up to 1.5MB, flushing first if chunk_idle_period or max_chunk_age is reached first
|
||||||
|
chunk_retain_period: 30s # Must be greater than index read cache TTL if using an index cache (Default index read cache TTL is 5m)
|
||||||
|
max_transfer_retries: 0 # Chunk transfers disabled
|
||||||
|
|
||||||
|
schema_config:
|
||||||
|
configs:
|
||||||
|
- from: 2020-10-24
|
||||||
|
store: boltdb-shipper
|
||||||
|
object_store: filesystem
|
||||||
|
schema: v11
|
||||||
|
index:
|
||||||
|
prefix: index_
|
||||||
|
period: 24h
|
||||||
|
|
||||||
|
storage_config:
|
||||||
|
boltdb_shipper:
|
||||||
|
active_index_directory: /tmp/loki/boltdb-shipper-active
|
||||||
|
cache_location: /tmp/loki/boltdb-shipper-cache
|
||||||
|
cache_ttl: 24h # Can be increased for faster performance over longer query periods, uses more disk space
|
||||||
|
shared_store: filesystem
|
||||||
|
filesystem:
|
||||||
|
directory: /tmp/loki/chunks
|
||||||
|
|
||||||
|
compactor:
|
||||||
|
working_directory: /tmp/loki/boltdb-shipper-compactor
|
||||||
|
shared_store: filesystem
|
||||||
|
|
||||||
|
limits_config:
|
||||||
|
reject_old_samples: true
|
||||||
|
reject_old_samples_max_age: 168h
|
||||||
|
|
||||||
|
chunk_store_config:
|
||||||
|
max_look_back_period: 0s
|
||||||
|
|
||||||
|
table_manager:
|
||||||
|
retention_deletes_enabled: false
|
||||||
|
retention_period: 0s
|
||||||
|
|
||||||
|
ruler:
|
||||||
|
storage:
|
||||||
|
type: local
|
||||||
|
local:
|
||||||
|
directory: /tmp/loki/rules
|
||||||
|
rule_path: /tmp/loki/rules-temp
|
||||||
|
alertmanager_url: http://localhost:9093
|
||||||
|
ring:
|
||||||
|
kvstore:
|
||||||
|
store: inmemory
|
||||||
|
enable_api: true
|
||||||
|
'';
|
||||||
|
services.prometheus = {
|
||||||
|
enable = true;
|
||||||
|
scrapeConfigs = foldl (a: b: a ++ b) [ ] (map
|
||||||
|
(x: (map
|
||||||
|
(y: {
|
||||||
|
job_name = "${x}_${y}";
|
||||||
|
static_configs = [
|
||||||
|
{
|
||||||
|
targets = [
|
||||||
|
''${getHost y}:${toString config.services.prometheus.exporters.${x}.port}''
|
||||||
|
];
|
||||||
|
}
|
||||||
|
];
|
||||||
|
})
|
||||||
|
cfg.exporters.${x}.hosts))
|
||||||
|
(builtins.attrNames cfg.exporters));
|
||||||
|
};
|
||||||
|
ragon.persist.extraDirectories = [
|
||||||
|
"/var/lib/${config.services.prometheus.stateDir}"
|
||||||
|
"${config.services.loki.dataDir}"
|
||||||
|
];
|
||||||
|
})
|
||||||
|
{
|
||||||
|
# some global settings
|
||||||
|
services.prometheus.exporters.node.enabledCollectors = [ "systemd" ];
|
||||||
|
services.prometheus.exporters.dnsmasq.leasesPath = "/var/lib/dnsmasq/dnsmasq.leases";
|
||||||
|
services.prometheus.exporters.smartctl.user = "root";
|
||||||
|
services.prometheus.exporters.smokeping.hosts = [ "1.1.1.1" ];
|
||||||
|
services.nginx.statusPage = true;
|
||||||
|
}
|
||||||
|
(mkIf (builtins.elem hostName cfg.promtail.hosts) {
|
||||||
|
services.promtail = {
|
||||||
|
enable = true;
|
||||||
|
configuration = {
|
||||||
|
server.http_listen_port = 28183;
|
||||||
|
positions.filename = "/tmp/positions.yaml";
|
||||||
|
clients = [{ url = "http://${getHost cfg.master.hostname}:3100/loki/api/v1/push"; }];
|
||||||
|
scrape_configs = [
|
||||||
|
{
|
||||||
|
job_name = "journal";
|
||||||
|
journal = {
|
||||||
|
max_age = "12h";
|
||||||
|
labels = {
|
||||||
|
job = "systemd-journal";
|
||||||
|
host = hostName;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
relabel_configs = [{
|
||||||
|
source_labels = [ "__journal__systemd_unit" ];
|
||||||
|
target_label = "unit";
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
})
|
||||||
|
] ++
|
||||||
|
(map
|
||||||
|
(x: {
|
||||||
|
services.prometheus.exporters.${x} = {
|
||||||
|
enable = (builtins.elem hostName cfg.exporters.${x}.hosts);
|
||||||
|
openFirewall = (hostName != cfg.master.hostname);
|
||||||
|
firewallFilter = if (hostName != cfg.master.hostname) then "-p tcp -s ${cfg.master.ip} -m tcp --dport ${toString config.services.prometheus.exporters.${x}.port}" else null;
|
||||||
|
};
|
||||||
|
})
|
||||||
|
(builtins.attrNames cfg.exporters))
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
38
nixos-modules/services/nginx.nix
Normal file
38
nixos-modules/services/nginx.nix
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.ragon.services.nginx;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.ragon.services.nginx.enable = lib.mkEnableOption "Enables nginx";
|
||||||
|
options.ragon.services.nginx.domain =
|
||||||
|
lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "hailsatan.eu";
|
||||||
|
};
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
networking.firewall.allowedTCPPorts = [ 80 443 ];
|
||||||
|
services.nginx = {
|
||||||
|
enable = true;
|
||||||
|
recommendedProxySettings = true;
|
||||||
|
recommendedTlsSettings = true;
|
||||||
|
recommendedGzipSettings = true;
|
||||||
|
recommendedOptimisation = true;
|
||||||
|
};
|
||||||
|
security.acme.defaults.email = "nixosacme@phochkamp.de";
|
||||||
|
security.acme.acceptTerms = true;
|
||||||
|
security.acme.certs."${cfg.domain}" = {
|
||||||
|
dnsProvider = "cloudflare";
|
||||||
|
dnsResolver = "1.1.1.1:53";
|
||||||
|
group = "nginx";
|
||||||
|
extraDomainNames = [
|
||||||
|
"*.${cfg.domain}"
|
||||||
|
];
|
||||||
|
credentialsFile = "${config.age.secrets.cloudflareAcme.path}";
|
||||||
|
|
||||||
|
};
|
||||||
|
ragon.agenix.secrets.cloudflareAcme = { group = "nginx"; mode = "0440"; };
|
||||||
|
ragon.persist.extraDirectories = [
|
||||||
|
"/var/lib/acme"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
39
nixos-modules/services/paperless.nix
Normal file
39
nixos-modules/services/paperless.nix
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
{ config, inputs, lib, pkgs, ... }:
|
||||||
|
with lib;
|
||||||
|
with lib.my;
|
||||||
|
let
|
||||||
|
cfg = config.ragon.services.paperless;
|
||||||
|
domain = config.ragon.services.nginx.domain;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.ragon.services.paperless.enable = mkEnableOption "Enables paperless ng";
|
||||||
|
options.ragon.services.paperless.domainPrefix =
|
||||||
|
lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "paperless";
|
||||||
|
};
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
services.paperless-ng = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.paperless-ng.overrideAttrs (oldAttrs: rec { doCheck = false; doInstallCheck = false; });
|
||||||
|
mediaDir = mkDefault "/data/documents/paperless";
|
||||||
|
consumptionDir = mkDefault "/data/applications/paperless-consumption";
|
||||||
|
consumptionDirIsPublic = true;
|
||||||
|
passwordFile = "${config.age.secrets.paperlessAdminPW.path}";
|
||||||
|
extraConfig = {
|
||||||
|
PAPERLESS_OCR_LANGUAGE = "deu+eng";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
ragon.agenix.secrets.paperlessAdminPW = { group = "${config.services.paperless-ng.user}"; mode = "0440"; };
|
||||||
|
services.nginx.clientMaxBodySize = "100m";
|
||||||
|
services.nginx.virtualHosts."${cfg.domainPrefix}.${domain}" = {
|
||||||
|
useACMEHost = "${domain}";
|
||||||
|
addSSL = true;
|
||||||
|
locations."/".proxyPass = "http://${config.services.paperless-ng.address}:${toString config.services.paperless-ng.port}";
|
||||||
|
locations."/".proxyWebsockets = true;
|
||||||
|
};
|
||||||
|
ragon.persist.extraDirectories = [
|
||||||
|
"${config.services.paperless-ng.dataDir}"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
28
nixos-modules/services/samba.nix
Normal file
28
nixos-modules/services/samba.nix
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
with lib;
|
||||||
|
with lib.my;
|
||||||
|
with builtins;
|
||||||
|
let
|
||||||
|
cfg = config.ragon.services.samba;
|
||||||
|
allowedIPs = cfg.allowedIPs;
|
||||||
|
cfgExports = cfg.exports;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.ragon.services.samba.enable = mkEnableOption "Enables Samba";
|
||||||
|
options.ragon.services.samba.shares = mkOption {
|
||||||
|
type = lib.types.attrs;
|
||||||
|
default = {};
|
||||||
|
};
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
services.samba = {
|
||||||
|
enable = true;
|
||||||
|
shares = cfg.shares;
|
||||||
|
};
|
||||||
|
ragon.persist.extraDirectories = [
|
||||||
|
"/var/lib/samba"
|
||||||
|
];
|
||||||
|
|
||||||
|
networking.firewall.allowedTCPPorts = [ 139 445 ];
|
||||||
|
networking.firewall.allowedUDPPorts = [ 137 138 ];
|
||||||
|
};
|
||||||
|
}
|
||||||
12
nixos-modules/services/ssh.nix
Normal file
12
nixos-modules/services/ssh.nix
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.ragon.services.ssh;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.ragon.services.ssh.enable = lib.mkEnableOption "Enables sshd";
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
services.openssh.permitRootLogin = "no";
|
||||||
|
services.openssh.enable = true;
|
||||||
|
services.openssh.passwordAuthentication = false;
|
||||||
|
};
|
||||||
|
}
|
||||||
130
nixos-modules/services/synapse.nix
Normal file
130
nixos-modules/services/synapse.nix
Normal file
|
|
@ -0,0 +1,130 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
with lib;
|
||||||
|
with lib.my;
|
||||||
|
let
|
||||||
|
cfg = config.ragon.services.synapse;
|
||||||
|
fqdn = cfg.fqdn;
|
||||||
|
serverName = cfg.serverName;
|
||||||
|
domain = config.ragon.services.nginx.domain;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.ragon.services.synapse.enable = mkEnableOption "Enables synapse";
|
||||||
|
options.ragon.services.synapse.fqdn =
|
||||||
|
lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "m.ragon.xyz";
|
||||||
|
};
|
||||||
|
options.ragon.services.synapse.enableElement = mkBoolOpt true; # TODO fix
|
||||||
|
options.ragon.services.synapse.elementFqdn =
|
||||||
|
lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "e.ragon.xyz";
|
||||||
|
};
|
||||||
|
options.ragon.services.synapse.serverName =
|
||||||
|
lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "ragon.xyz";
|
||||||
|
};
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
services.matrix-synapse = {
|
||||||
|
enable = true;
|
||||||
|
server_name = serverName;
|
||||||
|
listeners = [
|
||||||
|
{
|
||||||
|
port = 8008;
|
||||||
|
bind_address = "::1";
|
||||||
|
type = "http";
|
||||||
|
tls = false;
|
||||||
|
x_forwarded = true;
|
||||||
|
resources = [
|
||||||
|
{
|
||||||
|
names = [ "client" "federation" ];
|
||||||
|
compress = false;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
services.postgresql = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
services.postgresql.initialScript = pkgs.writeText "synapse-init.sql" ''
|
||||||
|
CREATE ROLE "matrix-synapse" WITH LOGIN PASSWORD 'synapse';
|
||||||
|
CREATE DATABASE "matrix-synapse" WITH OWNER "matrix-synapse"
|
||||||
|
TEMPLATE template0
|
||||||
|
LC_COLLATE = "C"
|
||||||
|
LC_CTYPE = "C";
|
||||||
|
'';
|
||||||
|
services.nginx.virtualHosts = {
|
||||||
|
"${cfg.elementFqdn}" = {
|
||||||
|
useACMEHost = "${domain}";
|
||||||
|
forceSSL = true;
|
||||||
|
|
||||||
|
root = pkgs.element-web.override {
|
||||||
|
conf = {
|
||||||
|
default_server_config."m.homeserver" = {
|
||||||
|
"base_url" = "https://${fqdn}";
|
||||||
|
"server_name" = "${domain}";
|
||||||
|
};
|
||||||
|
default_theme = "dark";
|
||||||
|
jitsi.preferredDomain = "${config.ragon.services.jitsi.domainPrefix}.${domain}";
|
||||||
|
}; # TODO make this less shit
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
"${cfg.serverName}" = {
|
||||||
|
forceSSL = true;
|
||||||
|
useACMEHost = "${domain}";
|
||||||
|
locations."= /.well-known/matrix/server".extraConfig =
|
||||||
|
let
|
||||||
|
# use 443 instead of the default 8448 port to unite
|
||||||
|
# the client-server and server-server port for simplicity
|
||||||
|
server = { "m.server" = "${fqdn}:443"; };
|
||||||
|
in
|
||||||
|
''
|
||||||
|
add_header Content-Type application/json;
|
||||||
|
return 200 '${builtins.toJSON server}';
|
||||||
|
'';
|
||||||
|
locations."= /.well-known/matrix/client".extraConfig =
|
||||||
|
let
|
||||||
|
client = {
|
||||||
|
"m.homeserver" = { "base_url" = "https://${fqdn}"; };
|
||||||
|
"m.identity_server" = { "base_url" = "https://vector.im"; };
|
||||||
|
"im.vector.riot.jitsi" = { "preferredDomain" = "jitsi.${domain}"; };
|
||||||
|
};
|
||||||
|
# ACAO required to allow element-web on any URL to request this json file
|
||||||
|
in
|
||||||
|
''
|
||||||
|
add_header Content-Type application/json;
|
||||||
|
add_header Access-Control-Allow-Origin *;
|
||||||
|
return 200 '${builtins.toJSON client}';
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
# Reverse proxy for Matrix client-server and server-server communication
|
||||||
|
"${fqdn}" = {
|
||||||
|
forceSSL = true;
|
||||||
|
useACMEHost = "${domain}";
|
||||||
|
|
||||||
|
# Or do a redirect instead of the 404, or whatever is appropriate for you.
|
||||||
|
# But do not put a Matrix Web client here! See the Element web section below.
|
||||||
|
locations."/".extraConfig = ''
|
||||||
|
return 404;
|
||||||
|
'';
|
||||||
|
|
||||||
|
# forward all Matrix API calls to the synapse Matrix homeserver
|
||||||
|
locations."/_matrix" = {
|
||||||
|
proxyPass = "http://[::1]:8008"; # without a trailing /
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
ragon.persist.extraDirectories = [
|
||||||
|
"${config.services.postgresql.dataDir}"
|
||||||
|
"${config.services.matrix-synapse.dataDir}"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
22
nixos-modules/services/ts3.nix
Normal file
22
nixos-modules/services/ts3.nix
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.ragon.services.ts3;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.ragon.services.ts3.enable = lib.mkEnableOption "Enables the Teamspeak 3 Server";
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
services.teamspeak3 = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
networking.firewall.allowedTCPPorts = [
|
||||||
|
config.services.teamspeak3.queryPort
|
||||||
|
config.services.teamspeak3.fileTransferPort
|
||||||
|
];
|
||||||
|
networking.firewall.allowedUDPPorts = [
|
||||||
|
config.services.teamspeak3.defaultVoicePort
|
||||||
|
];
|
||||||
|
ragon.persist.extraDirectories = [
|
||||||
|
"${config.services.teamspeak3.dataDir}"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
26
nixos-modules/services/unifi.nix
Normal file
26
nixos-modules/services/unifi.nix
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.ragon.services.unifi;
|
||||||
|
domain = config.ragon.services.nginx.domain;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.ragon.services.unifi.enable = lib.mkEnableOption "Enables the unifi console";
|
||||||
|
options.ragon.services.unifi.domainPrefix =
|
||||||
|
lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "unifi";
|
||||||
|
};
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
services.unifi = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
services.nginx.virtualHosts."${cfg.domainPrefix}.${domain}" = {
|
||||||
|
forceSSL = true;
|
||||||
|
useACMEHost = "${domain}";
|
||||||
|
locations."/".proxyPass = "https://127.0.0.1:8443";
|
||||||
|
};
|
||||||
|
ragon.persist.extraDirectories = [
|
||||||
|
"/var/lib/unifi"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
39
nixos-modules/system/agenix.nix
Normal file
39
nixos-modules/system/agenix.nix
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
{ options, config, inputs, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
with builtins;
|
||||||
|
with lib;
|
||||||
|
with lib.my;
|
||||||
|
let
|
||||||
|
inherit (inputs) agenix;
|
||||||
|
secretsDir = "${toString ../../secrets}";
|
||||||
|
secretsFile = "${secretsDir}/secrets.nix";
|
||||||
|
cfg = config.ragon.agenix;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
imports = [ agenix.nixosModules.age ];
|
||||||
|
options.ragon.agenix = {
|
||||||
|
enable = mkBoolOpt true;
|
||||||
|
secrets = mkOption {
|
||||||
|
type = types.attrs;
|
||||||
|
default = { };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
environment.systemPackages = [ agenix.defaultPackage.${pkgs.system} ];
|
||||||
|
# Set passwords
|
||||||
|
users.users.root.passwordFile = config.age.secrets.rootPasswd.path;
|
||||||
|
age.identityPaths =
|
||||||
|
[
|
||||||
|
"/persistent/etc/ssh/ssh_host_ed25519_key"
|
||||||
|
];
|
||||||
|
age.secrets = mapAttrs (name: obj: ({ file = "${secretsDir}/${name}.age"; } // obj))
|
||||||
|
(cfg.secrets //
|
||||||
|
{
|
||||||
|
rootPasswd = { };
|
||||||
|
}
|
||||||
|
);
|
||||||
|
assertions = [
|
||||||
|
{ assertion = (pathExists secretsFile); message = "${secretsFile} does not exist"; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
92
nixos-modules/system/fs.nix
Normal file
92
nixos-modules/system/fs.nix
Normal file
|
|
@ -0,0 +1,92 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
with lib;
|
||||||
|
with lib.my;
|
||||||
|
let
|
||||||
|
cfg = config.ragon.system.fs;
|
||||||
|
nix = cfg.nix;
|
||||||
|
varlog = cfg.varlog;
|
||||||
|
persistent = cfg.persistent;
|
||||||
|
persistentSnapshot = cfg.persistentSnapshot;
|
||||||
|
arcSize = cfg.arcSize;
|
||||||
|
hostName = config.networking.hostName;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.ragon.system.fs = {
|
||||||
|
enable = lib.mkEnableOption "Enables ragons fs stuff, (tmpfs,zfs,backups,...)";
|
||||||
|
mediadata = mkBoolOpt true;
|
||||||
|
swap = mkBoolOpt true;
|
||||||
|
persistentSnapshot = mkBoolOpt true;
|
||||||
|
nix = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "pool/nix";
|
||||||
|
};
|
||||||
|
varlog = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "pool/varlog";
|
||||||
|
};
|
||||||
|
persistent = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "pool/persist";
|
||||||
|
};
|
||||||
|
arcSize = lib.mkOption {
|
||||||
|
type = lib.types.int;
|
||||||
|
default = 2;
|
||||||
|
description = "Sets the ZFS Arc Size (in GB)";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
services.zfs.autoScrub.enable = true;
|
||||||
|
services.sanoid = {
|
||||||
|
enable = mkDefault persistentSnapshot;
|
||||||
|
} // (if persistentSnapshot then { datasets."${persistent}" = { }; } else { });
|
||||||
|
services.syncoid = {
|
||||||
|
user = "root";
|
||||||
|
group = "root";
|
||||||
|
sshKey = /persistent/root/.ssh/id_rsa;
|
||||||
|
enable = mkDefault true;
|
||||||
|
commonArgs = [
|
||||||
|
];
|
||||||
|
commands."${persistent}" = {
|
||||||
|
target = "ragon@ds9:rpool/content/local/backups/${hostName}"; # FIXME extra user
|
||||||
|
recvOptions = "x encryption";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
boot.kernelParams = [ "zfs.zfs_arc_max=${toString (arcSize * 1024 * 1024 * 1024)}" ];
|
||||||
|
fileSystems."/" =
|
||||||
|
{
|
||||||
|
device = "none";
|
||||||
|
fsType = "tmpfs";
|
||||||
|
options = [ "size=8G" "defaults" "mode=755" ];
|
||||||
|
};
|
||||||
|
fileSystems."/nix" =
|
||||||
|
{
|
||||||
|
device = "${nix}";
|
||||||
|
fsType = "zfs";
|
||||||
|
neededForBoot = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/persistent" =
|
||||||
|
{
|
||||||
|
device = "${persistent}";
|
||||||
|
fsType = "zfs";
|
||||||
|
neededForBoot = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/var/log" =
|
||||||
|
{
|
||||||
|
device = "${varlog}";
|
||||||
|
fsType = "zfs";
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/boot" =
|
||||||
|
{
|
||||||
|
device = mkDefault "/dev/disk/by-label/boot";
|
||||||
|
fsType = "vfat";
|
||||||
|
options = [ "noauto" "x-systemd.automount" ];
|
||||||
|
};
|
||||||
|
swapDevices = mkIf cfg.swap [
|
||||||
|
{ device = "/persistent/pagefile.sys"; }
|
||||||
|
];
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
34
nixos-modules/system/persist.nix
Normal file
34
nixos-modules/system/persist.nix
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
{ config, lib, pkgs, inputs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.ragon.persist;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.ragon.persist.enable = lib.mkEnableOption "Enables persistence";
|
||||||
|
options.ragon.persist.extraFiles = lib.mkOption {
|
||||||
|
type = lib.types.listOf lib.types.str;
|
||||||
|
default = [ ];
|
||||||
|
};
|
||||||
|
options.ragon.persist.extraDirectories = lib.mkOption {
|
||||||
|
type = lib.types.listOf lib.types.str;
|
||||||
|
default = [ ];
|
||||||
|
};
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
|
||||||
|
environment.persistence."/persistent" = {
|
||||||
|
directories = [
|
||||||
|
"/etc/nixos"
|
||||||
|
"/etc/NetworkManager/system-connections"
|
||||||
|
"/root/.ssh"
|
||||||
|
] ++ (lib.unique cfg.extraDirectories);
|
||||||
|
files = [
|
||||||
|
"/etc/machine-id"
|
||||||
|
"/etc/ssh/ssh_host_rsa_key"
|
||||||
|
"/etc/ssh/ssh_host_rsa_key.pub"
|
||||||
|
"/etc/ssh/ssh_host_ed25519_key"
|
||||||
|
"/etc/ssh/ssh_host_ed25519_key.pub"
|
||||||
|
] ++ cfg.extraFiles;
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
27
nixos-modules/system/security.nix
Normal file
27
nixos-modules/system/security.nix
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
with lib;
|
||||||
|
with lib.my;
|
||||||
|
let
|
||||||
|
cfg = config.ragon.system.security;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.ragon.system.security = {
|
||||||
|
enable = mkBoolOpt true;
|
||||||
|
};
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
security.sudo.execWheelOnly = true;
|
||||||
|
services.openssh = {
|
||||||
|
passwordAuthentication = false;
|
||||||
|
allowSFTP = false; # just use rsync, lol
|
||||||
|
kbdInteractiveAuthentication = false;
|
||||||
|
extraConfig = ''
|
||||||
|
AllowTcpForwarding yes
|
||||||
|
X11Forwarding no
|
||||||
|
AllowAgentForwarding no
|
||||||
|
AllowStreamLocalForwarding no
|
||||||
|
AuthenticationMethods publickey
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
65
nixos-modules/user/default.nix
Normal file
65
nixos-modules/user/default.nix
Normal file
|
|
@ -0,0 +1,65 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.ragon.user;
|
||||||
|
uid = cfg.uid;
|
||||||
|
username = cfg.username;
|
||||||
|
extraGroups = cfg.extraGroups;
|
||||||
|
extraAuthorizedKeys = cfg.extraAuthorizedKeys;
|
||||||
|
pubkeys = import ../../data/pubkeys.nix {};
|
||||||
|
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.ragon.user = {
|
||||||
|
enable = lib.mkEnableOption "Enables my user.";
|
||||||
|
uid = lib.mkOption {
|
||||||
|
type = lib.types.nullOr lib.types.int;
|
||||||
|
default = 1000;
|
||||||
|
};
|
||||||
|
username = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "ragon";
|
||||||
|
description = "My username for this system.";
|
||||||
|
};
|
||||||
|
extraGroups = lib.mkOption {
|
||||||
|
type = lib.types.listOf lib.types.str;
|
||||||
|
default = [ ];
|
||||||
|
};
|
||||||
|
extraAuthorizedKeys = lib.mkOption {
|
||||||
|
type = lib.types.listOf lib.types.str;
|
||||||
|
default = [ ];
|
||||||
|
description = "Additional authorized keys";
|
||||||
|
};
|
||||||
|
persistent = {
|
||||||
|
homeDir = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "/persistent/home/${username}";
|
||||||
|
description = "Location of persistent home files";
|
||||||
|
};
|
||||||
|
extraFiles = lib.mkOption {
|
||||||
|
type = lib.types.listOf lib.types.str;
|
||||||
|
default = [ ];
|
||||||
|
};
|
||||||
|
extraDirectories = lib.mkOption {
|
||||||
|
type = lib.types.listOf lib.types.str;
|
||||||
|
default = [ ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
# Let ~/bin/ be in $PATH
|
||||||
|
environment.homeBinInPath = true;
|
||||||
|
|
||||||
|
# Define my user account
|
||||||
|
users.extraUsers.${username} = {
|
||||||
|
isNormalUser = true;
|
||||||
|
uid = uid;
|
||||||
|
extraGroups = [ "wheel" ] ++ extraGroups;
|
||||||
|
shell = pkgs.zsh;
|
||||||
|
openssh.authorizedKeys.keys = pubkeys.ragon.computers ++ extraAuthorizedKeys;
|
||||||
|
passwordFile = config.age.secrets.ragonPasswd.path;
|
||||||
|
};
|
||||||
|
ragon.agenix.secrets.ragonPasswd = { };
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
23
secrets/cloudflareAcme.age
Normal file
23
secrets/cloudflareAcme.age
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
age-encryption.org/v1
|
||||||
|
-> ssh-ed25519 EYWzzw s1ga0W2GlpxvKpJ5Kx9/mrpXuD4k/V/1uyfbFUcEdwU
|
||||||
|
ZIdAidep1f/sFMjHZdAjB1saoLQUctcOUx1XQGq1Q/U
|
||||||
|
-> ssh-ed25519 ugHWWw sCuDEuxoovkiU6b6Ww/pdvLmWsKOwoviTGGi62kmkyk
|
||||||
|
u3N+jIsrTQSwADhD4QcCPJ2jBt2/A0aiIK9L0Bn0e3U
|
||||||
|
-> ssh-ed25519 UDK5aw KYVDBaHIOdx0FpOjPPoDTS6diaufODfUYMke6wcMLis
|
||||||
|
hZK8nGvGrnMQNph+7zbF+LNG6W8UPNAMlOLvPLKDPY8
|
||||||
|
-> ssh-ed25519 UU9RSA yr2M8vpo3cHxTOv8JhnLj1qQiBMG4XZVQEimEEjqOXI
|
||||||
|
bsncvUeAodUjeUXA6h+r+DYdSWMn9Lp8bPRQuOdUj9M
|
||||||
|
-> ssh-ed25519 IbXxfw DjdQxpVTLUvha7TVaYBDrCTOZVrvKvxfUCoD2ZdMuAY
|
||||||
|
pRMtuOxmqRHC7TYBXX+MKW0fbD1qAzV4HBGtTTZQeJ0
|
||||||
|
-> ssh-ed25519 rQk6HA DJiT9I5C7KuzkQ3XwzjfFZSKHDPXGgbVfBcY1c9QJGE
|
||||||
|
TvvCAZkd8Mo+oxmwr5zXiwGdc0PynDpYI/1cnHxjcfQ
|
||||||
|
-> ssh-ed25519 WceKOQ UzyJi0AJRLXE3Jhgkee5NdAB2qFrykwZz9FUhWObC2M
|
||||||
|
vdCqdMB0+k+aLMIQFU0TjCZ80MnqWpnqzwuhNqH5sFI
|
||||||
|
-> ssh-ed25519 LUZRUw bFixT06NSFkfLHoOhuWzC7jUXAwwww+il1uZbfogGE8
|
||||||
|
eKP12b9v9TYNw0F1wfnAk7BgypUfsYMZVZGJLswP+FI
|
||||||
|
-> R5?8K38S-grease
|
||||||
|
HpSifTD/jnLUvi4PEfP4aWDuuiCUeZKN/RsP3P7C/8p/cipmpdcKOKDvi3AAeZ9V
|
||||||
|
8As01hN4UuHzSzaOc5CeVROrsA
|
||||||
|
--- HkOPg3vXo158UyTD+VNTkMpH6bkXWOXOMLtuuvVG06I
|
||||||
|
ÌÌHc}.úVNiÓ¢…Sóú…Ea]Aíküy%K?™&g›Õ
|
||||||
|
[êêçÌ{$ª>C®ó×3)mu¥þöQ i¯,BÏøç!‚¦È0<0C>›ÜA™¤Èý¹å #õ¸
|
||||||
BIN
secrets/ds9rcloneConfig.age
Normal file
BIN
secrets/ds9rcloneConfig.age
Normal file
Binary file not shown.
16
secrets/ds9resticPassword.age
Normal file
16
secrets/ds9resticPassword.age
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
age-encryption.org/v1
|
||||||
|
-> ssh-ed25519 IbXxfw XK4JR/3v6N7eW9xCvt4yxZj2zAhnqo1b6ou0v82gOzA
|
||||||
|
Tag0cu4RUD8LdqBqQcX8tjbCpDIqC2rK1+zG/F2kB04
|
||||||
|
-> ssh-ed25519 EYWzzw RVwN1oUaYweuKCGvcHuq2H3kUjNJmlnC0u6ZDLYk8VA
|
||||||
|
dOei5ZouQ/2tWCu5fjWD4VqaEod7ag8p3y3Yo4E+R3U
|
||||||
|
-> ssh-ed25519 ugHWWw 9O+v/f9NYZED2havMCBQI3aFk2+lkBl9O8O7Wny0Gmk
|
||||||
|
iPHKN5W4OEJqXKXTsil2mTcdsbG3CCSgQodhqBQCi2Y
|
||||||
|
-> ssh-ed25519 UDK5aw DBCXaQWwhk1GOFxZQcckAQ+QhJI9xc74J2x249RJMQM
|
||||||
|
RaoiO3QYjFY6CGAEGff1KLsaKqzRJc42UitJfGKe25U
|
||||||
|
-> ssh-ed25519 UU9RSA dwDPtrzsuxLOZ0gbIzQswfX6fqbtfgRY1WhX6rhP8D0
|
||||||
|
RcIeHO1535EbQKBU72EgaulDohMZbO4vM3VoSUBnIQ8
|
||||||
|
-> (cz;R:-grease i .rY6u!
|
||||||
|
gJQ8wOQJ6lBS7wnMZ1cu+mSDWxedwi0PUU8O6lZlnhyAqf5RQsfrvpWzNO3BrPx7
|
||||||
|
1cmlFDMkAFtNhWlDDEFVk/rV0jBSbOy1I+/oTTOn8d8karnmI6kaB+I
|
||||||
|
--- MCSRxrB6r/ju9i8A6cvglUNFhHOicaeeb38fsIa2ArU
|
||||||
|
楳fz─ヌフ梟朦ョ殊オ衰スnルcミヘナワb蛮#C訪汢峺オr<ク2[トヌ繕テ鵲メ憂。u1ェヘ
|
||||||
BIN
secrets/gitlabDBFile.age
Normal file
BIN
secrets/gitlabDBFile.age
Normal file
Binary file not shown.
16
secrets/gitlabInitialRootPassword.age
Normal file
16
secrets/gitlabInitialRootPassword.age
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
age-encryption.org/v1
|
||||||
|
-> ssh-ed25519 WceKOQ O3wwFkrDb9osW2SXJqJGfEr9fi2rXmussWoM0+OUzyM
|
||||||
|
suoJbwFbIKxn7rslfzhZpNc7Pp6C9wkmPlE9GgBlZtY
|
||||||
|
-> ssh-ed25519 EYWzzw P9AGXvkFAjucxdoeD5qM2w5HfBwFG+FxZHDr9uyDFl0
|
||||||
|
oep6yVm9PxtRciEv9ILK0n2bH6x8KEl7eH/gjmCIef0
|
||||||
|
-> ssh-ed25519 ugHWWw om4WnbKKwkycHyNcivPBQEs6WB5KjEc/ZcF4Gsc94TM
|
||||||
|
fzwdcr78HfvlEgQscUvlKosetpF6pYAykwM8zgaxpYw
|
||||||
|
-> ssh-ed25519 UDK5aw ztMz33oaFDgY4V/KSJWLu7sYzZeNM8eesoKCcLVj2mg
|
||||||
|
J74Fe7dGPTceGjcLp+nwMewaiuu8kSFo1qVxvlMNmkI
|
||||||
|
-> ssh-ed25519 UU9RSA hiji4Kfll9Yhpj3BOuYf9argzE/GiIJUH5hDvFG60WE
|
||||||
|
SRPPaOnnALmcUjvt819IAuF1bRJjDaYmDvu5OGC2N+4
|
||||||
|
-> +e#q&Lk-grease LkPbm`t mB) O;V\6xU
|
||||||
|
sm/woJ9+G0+TIxfPi0MYAnZvSq/hnwaMYLhlNvkZNR1H8suywEy5CDPgcETNHGhD
|
||||||
|
jsJ9PMfW4ih1m1d21vo
|
||||||
|
--- WxnJsQtYXlF+FCYeK88SLwDiKSXhzrKBhomyPVrpqzI
|
||||||
|
•P dÙ@ÈÒ$ÖÖᜠd£ÞÅÅ£T”H;ó[|]Œu›-‡¾å,mùªôf°¸>•<>q
|
||||||
BIN
secrets/gitlabJWSFile.age
Normal file
BIN
secrets/gitlabJWSFile.age
Normal file
Binary file not shown.
16
secrets/gitlabOTPFile.age
Normal file
16
secrets/gitlabOTPFile.age
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
age-encryption.org/v1
|
||||||
|
-> ssh-ed25519 WceKOQ R+pOKGMX6Uing364chthIWXmTJ3sQIL0hlXq0qxoGS8
|
||||||
|
gQLfoQGS9BQSn80qWmMzOVEcrCrHJ70/njWs2dcJs9s
|
||||||
|
-> ssh-ed25519 EYWzzw xXm/A3xntlVTDXqD2oQ/gFDGNT8H5PCQK834iO2RZTc
|
||||||
|
Qpon9sEGFzfWxeVltgZOfwhejrs8AWavgqDaquPPPig
|
||||||
|
-> ssh-ed25519 ugHWWw qEeU19yDAJaQOkv3hJLDZcs4xtKKOnMJzjEz9cZzeXc
|
||||||
|
yWFJrCJAX0qBJ9LPTUH/mVWAJAjyxPESNQJomGMjx7I
|
||||||
|
-> ssh-ed25519 UDK5aw /7QjG660+ZykYWsk0A12DxOKaUcSV7cqM2DA+bu4pzI
|
||||||
|
0aVVXQWcuOtCBg5HplO5VF2P2a/mIdPoBW+s+X8LRHk
|
||||||
|
-> ssh-ed25519 UU9RSA KCS1HxNT9Txrq05pL38j3oQQrrV/4qrPicV/UazgNXQ
|
||||||
|
9VvHtDp3ZXk8IYlyM80O+auJVTBf17qttbm6GAGyVT4
|
||||||
|
-> 6)BN-grease Jd1zY?T 4jN4F
|
||||||
|
Bmeg810ybQHwsjiCN7fwFxsLzmEkzSYFQzTtVtDq6PYRGIGGaHTnFPYxuWW8MsL2
|
||||||
|
V5A1aA
|
||||||
|
--- X+gMieEzMKcX50sXGVGL275TFp3ptHkMXQsDkQ2udsA
|
||||||
|
ÎÉb´™<C2B4>œ¨ º“ž¿|´)3ZI™/ž¥°w\³mÎÔ¼\ao<'òÙìW’ÇëZb]¶|äxÑÞ‘/þbà¸y1#ÜTä¬ÏÒÙÿ:7§ÇÞ˜¸H²\Ie#òX§“¤µ©Šcú<$B•}ç
|
||||||
BIN
secrets/gitlabSecretFile.age
Normal file
BIN
secrets/gitlabSecretFile.age
Normal file
Binary file not shown.
16
secrets/hedgedocSecret.age
Normal file
16
secrets/hedgedocSecret.age
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
age-encryption.org/v1
|
||||||
|
-> ssh-ed25519 WceKOQ qPy80JxSrqMnprxN5RkVCzVPZi6C43sypfUc4rZ6li8
|
||||||
|
QTWC2VuFrpiByU9bsBkK2FnPnEcKRhd0w9EkT/MOrYI
|
||||||
|
-> ssh-ed25519 EYWzzw KWKmPzo3exCUCE/PMiPmrjcECpyAf3xF/hctVtnWmFE
|
||||||
|
SWAI3ypZqaBRLsOLGNiEqK17BweqgdB8/e5vbVy3ieI
|
||||||
|
-> ssh-ed25519 ugHWWw GfcgCYxD9rSrvYYmscVuvbVNKOtYrm2I1BikMf1vg3A
|
||||||
|
ZEugKdyNcNNxD4w6ea/Xz1Ab2UybvJXA4+F19NT0lfE
|
||||||
|
-> ssh-ed25519 UDK5aw EK0m2andEafwy5amZKIUeP5LZXjdlO60RkeTgf9+DlU
|
||||||
|
J59Tced+MQwDwiZhzOMTJwbRtoQpS8E2ElogX7qzqX4
|
||||||
|
-> ssh-ed25519 UU9RSA cbMRnpYp2ormxzmeqIuxUTh3BPU+tN/ETa+bf9KRBCE
|
||||||
|
POXnGDH+R2iIOUD1li9JIu01nBe1FJx+8bd1KVmAy0M
|
||||||
|
-> BP-grease
|
||||||
|
3dvL7FFeZerLMpkT8a7S6RW8KzmLAV4RmtbeA+r6+N2FoFLO2cdFlSbuPLThEmxB
|
||||||
|
yIreuiiiz2AwHCdLJgiwsL5HvgWffhv6b3bLUhmiG6EZKK3aaO6FtqfBU3b4Qg
|
||||||
|
--- UiMKeSciiCqOkSVKuwLbn1nnFDITH8+Ujj2f2tkiYJE
|
||||||
|
¶ñ?å¸ÄÙu÷Ï0<î}•w@µÀOáNëPî«K¥Aã( ½m ˆ/6æÕB¿ùýéØÃ/oàäøþl7±õ`à
z"Þ—L ‚êáEoXé
|
||||||
15
secrets/nextcloudAdminPass.age
Normal file
15
secrets/nextcloudAdminPass.age
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
age-encryption.org/v1
|
||||||
|
-> ssh-ed25519 WceKOQ MbkajkkIy0oXTeZ/bSCEQztAUzyMJgEP7TeKqecFEH0
|
||||||
|
M/xDTLw3p66CXUrWNYymb/Rcx6zSJqtdwlCXqNKzfHU
|
||||||
|
-> ssh-ed25519 EYWzzw o2aUcPNvoAtmZL/KE2thMEmRGE87NazSaZQV1JfA81E
|
||||||
|
oy67nzTRX14GUgJPUFdBF9yRM5OAH0WKOqDCfE112z8
|
||||||
|
-> ssh-ed25519 ugHWWw xxY7ev4r58S7JAAu1L2dIMJAEqbj1sJgCBwvdetWoks
|
||||||
|
NCMrYUg9eJ41Era/85y0H3b6m3RogCK5FceJ2X/K/fA
|
||||||
|
-> ssh-ed25519 UDK5aw jKQWY0Odh882Q2NYjhg1wrXOEb/4KGKyRAhwcbmsWVI
|
||||||
|
U0F2g+Yt898YBM9P7uFpVAtkKEkJuGRhiv64jHL3mx8
|
||||||
|
-> ssh-ed25519 UU9RSA 4LSOqIvpui2kU8TypqZ/dbKSh9VfZYvjxCv7xg/faXo
|
||||||
|
QTOsnrpCaEofvDxg7oMnn1gK93ReF/6SFCpSrWpwcm8
|
||||||
|
-> "-grease
|
||||||
|
G4cNBeH2EPobBiBiU6BPy00FiFULUhedZxH8tFvrJqsyH2+p+cV4MznhAg
|
||||||
|
--- sQZVwEZzBiHlKnrj37A8DSYPPoJGav3TVIdxLOUi9C8
|
||||||
|
¬©D|"b9{ö]{ѶÐâ8inèÖ'“Š‚ì<E2809A>ž¿j‹qüçqC€Þ<E282AC>ï ¼ÊáJاÌ@<40>Á•4f>½ŽÀÚD
Õª
|
||||||
21
secrets/nextshot.age
Normal file
21
secrets/nextshot.age
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
age-encryption.org/v1
|
||||||
|
-> ssh-ed25519 EYWzzw tj5NW5ng7yfhKRm4dncnJ2xZ3o5pVAxqzQivvQ6mXDQ
|
||||||
|
ATihm128mF4HaeNbxplkrE7rdBV7A/VIlD11j79IhAE
|
||||||
|
-> ssh-ed25519 ugHWWw jVRjWi9tydm104QR2cs19taFWxi/zvxaXaLdIcAlyGs
|
||||||
|
8q3m4QoxhRZ11als4FJUjf9NUTqYGmndZnjc2vM077M
|
||||||
|
-> ssh-ed25519 UDK5aw 8mZY2owpK1lQIqLfMwjcXavVj8ScHG34isEA7l8vzF8
|
||||||
|
iwcZ6cNsmcWyDUTvnosBV8maNo0Fq0IGEDfri2/VooA
|
||||||
|
-> ssh-ed25519 UU9RSA Jbve4bnS4wfsIogRcntp9gOIAR4Zy1clQOpYYZ343h0
|
||||||
|
Y+kYG6bQzcYadkH5uhtwRCyVTPyPKcyLdSrZk27bXrE
|
||||||
|
-> ssh-ed25519 TCMRjQ cpzssF435zpqKx2ygNZhvq4DTvgL2f6RuWUsEbOQ9SE
|
||||||
|
FP1C3M8j1JvlJeOk7+ZXrMtqYn0u35ybt5Ri0rutREc
|
||||||
|
-> ssh-ed25519 A1vEZQ 5OtnAWr4AC6hhBKuh26uaLHhQvRkyMjnAF6gAsLwdmE
|
||||||
|
SU6IZ6yuZ5rcEQU26xFJ0jdr9/OdpGOdBn74Lfieu0I
|
||||||
|
-> i]-grease z7o| %'2
|
||||||
|
jJyVYxDbM0UrKXN29te7RrL1x60VX1119PmeW09g4nCd+YTCdD5u+U+T96EwkrIX
|
||||||
|
ndI0wzLzogzte7ARWi9TeSc
|
||||||
|
--- x06Im9OXtUo6qGrnJzQONcnHt+Id4qDsDWJ3KoMkVZw
|
||||||
|
&,¿¬ìcéÔwuÐ<75>
|
||||||
|
–ßžÿ ÝÝ8Dš¹)›(K¬r[ËR?ª–…<E28093>nè·\g °1ébþ5òÉÞ¿…²YÚžn$žÓ{Ï‘×é@-ïùž[hŠØó±SdxïÊfÌ}O_<>ã·}
|
||||||
|
<EFBFBD>Éí5æËRía†O´îj•Èÿ‹8ç¸)Èòž€¢QÕ&)¹?La†óø<C3B3>ÎÎaBsEˆîCð÷3Ä\qÕ
|
||||||
|
О7„)Tç`†Õ,Ó,¬(öPä<>
|
||||||
16
secrets/paperlessAdminPW.age
Normal file
16
secrets/paperlessAdminPW.age
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
age-encryption.org/v1
|
||||||
|
-> ssh-ed25519 IbXxfw 0vBEJFvcwF7hzeeRQzfDcEhKbzbxpjzO3YC/Sv1fJFE
|
||||||
|
UrHnc3CuXuUcl9K/K91K7lWdk/zdMaQ73f81G9PrmvE
|
||||||
|
-> ssh-ed25519 EYWzzw Zd8oNVysYcx1EpWyMj3ph4jYaB7Eq3gzC7v2GQbEfAA
|
||||||
|
g6jQnLAwHgprVuJWC/OUqQL8G1lpp0Nlc9auzfr4IqY
|
||||||
|
-> ssh-ed25519 ugHWWw Oi86lLhVSDcWwmZkw6q3s3IMWwUQbUHL/czBy3TFgC0
|
||||||
|
Wda3sTOmEaDZAhmb15XmClYCxc5/OaE5cpGvhs4Gj1g
|
||||||
|
-> ssh-ed25519 UDK5aw 7eMa9eCptwXJNa+oDE06kuLDLbZpA/MObAEC3v3fQU0
|
||||||
|
UbJW7NW8QFDqbbcqtWOzAggl1dwKfYItW2DqIwpstes
|
||||||
|
-> ssh-ed25519 UU9RSA 981DT5jhUQWsMRTtQeaIODB/2QhHbpnVTYXMUo4VTDI
|
||||||
|
L2WGEDRaw+9kk1BEcqlWiHuJ6blE5rQH7ft3zfU9lgU
|
||||||
|
-> 7KMg-grease }Bi!Bu
|
||||||
|
e3nIsNcarX6rZxTQUNvcKXNIBdLzaoq9pEujDdrz3d419fZcho4DFzfL9tH6KCTQ
|
||||||
|
0wxY6xHRWaceuScbLw3/Xp0eGTSKJCu2DgQEIlq2P+GsfI7UEzYzhyDMIbrfHdA
|
||||||
|
--- yVntoj9MmoKBcgku2dwseEuYKblBHOsnMdnJAQIweqg
|
||||||
|
3ª»•™\ZªàWlSS-ÜŽ}&Àf’ëîÀéö0¨bU%¡úÑüÖ‹N$jŒ>רÉÊtË__
|
||||||
BIN
secrets/pulseLaunch.age
Normal file
BIN
secrets/pulseLaunch.age
Normal file
Binary file not shown.
30
secrets/ragonPasswd.age
Normal file
30
secrets/ragonPasswd.age
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
age-encryption.org/v1
|
||||||
|
-> ssh-ed25519 EYWzzw LbEHSAdVBebfazL1rZjf5GyzMf1yP47mIP0LmhZwalE
|
||||||
|
o42K++wV+1LdVqpxMARnQwvBpeNl9rqjhTrMA9snHC8
|
||||||
|
-> ssh-ed25519 ugHWWw ajZwDkSl0AsFcC8D4J8wCi2M3zRTzaoHh91L/Hcl9kQ
|
||||||
|
HUxAdisSCHo7HU7zmCHdrB9RzLJzsvBViltf1jpnApA
|
||||||
|
-> ssh-ed25519 UDK5aw Y9o2xBOWsnNzh7aNSLpZ475Lpeejzj59CuHcCLLWVjE
|
||||||
|
lpojh/7y9sGhTDNIa0n4hPgzD7k21nN9Dy4AMuf6VU0
|
||||||
|
-> ssh-ed25519 UU9RSA LfaWl7nuN2GOwZIAHVyuN6ugAH5hQbXwoV4XVZs5Xys
|
||||||
|
VXM3UeUshSONLLtk4/u/+1ehFF87oQizAjZuyZmKrNg
|
||||||
|
-> ssh-ed25519 +5moNA U7Xc/WZNU9fG3N0F2FItc2N2DRjhctESKldopfYE8G8
|
||||||
|
ZJO8kKWKESx7SWCC9ov0Fl8id3G7p3fKkOpXfb+wj/0
|
||||||
|
-> ssh-ed25519 IbXxfw IuxBXiZDSMw1Z7UHkud2cZ8D0ODLgjFy6shfVooEWGA
|
||||||
|
agKSGMAhd2ddFqXRgyN3rXCkWy5YwZxORoMbpVVVLV4
|
||||||
|
-> ssh-ed25519 TCMRjQ M5C/XXI7ewoj3gR8OThBinECnnsJubtnQDjXi6TZIkA
|
||||||
|
bqwd+jfwHAXrvA4HNWk1kgBuOG027Jb39gN1A8cG8ac
|
||||||
|
-> ssh-ed25519 LUZRUw pcTrQk3BV6ybiye0SUdVRlEcCrBHYMGzbI/LVhZPDik
|
||||||
|
nmD5/hsc8tPIt89H1Rj9adS/Qs9LJxiOlvBA+eTKASc
|
||||||
|
-> ssh-ed25519 JiyliQ x4Eu+fH+AH1rOvzU4WT/2hLhMwuTd8ti9CmAPcoki1s
|
||||||
|
4vPL0xx5pAPzXqeORfrx0T5U/h+8O7ilDYB9/Njv3wM
|
||||||
|
-> ssh-ed25519 WceKOQ W3iu4XgTFLulYokT9KNYE/Msh9nGmz3qvC0L1uPQuDo
|
||||||
|
YpNMGLYJBQniMhYFuTT2LQyh/MtyxxpkKpbOW/ydU54
|
||||||
|
-> ssh-ed25519 A1vEZQ hgTnHuA5JYoFb2SgP6g2b1JdJUGmeOd4bXQjYT+3EAY
|
||||||
|
raawl2Q1vE8aapZtQPx8F6z8xjXefg6sGUq5GEJy6LQ
|
||||||
|
-> ssh-ed25519 rQk6HA 8g14/ad3zsoWVVpHsabC1G8fQGc1/zgdXn5vddy9sHo
|
||||||
|
I3osCkU8TRPSj8Q2pnKahKfb/pW45604RT+WUpSn6cA
|
||||||
|
-> WMXV_pP-grease mfm`1 K H58g1@ G#jL
|
||||||
|
|
||||||
|
--- zIvDzBi7eG6xi72O9H7PgwHhLmd632NULQixvMTIkfA
|
||||||
|
µŠ<EFBFBD>þ§0¶1éü¨‡,MNÙ\<5C>"/Uu¨˜J1(…Eâ<45><C3A2>Ì
|
||||||
|
_ò©àÉsíXüÍÇo<C387>³‚¼øw ]Ñú†,…`
g {ðûä¹POL
Aô›I¹%^ÒZTðžfyÓÆ^àLâÈ—%®{ $žë:¬ÿ¤@«ú
'n¥ï³Rfø˜ ý“Œ×
|
||||||
30
secrets/rootPasswd.age
Normal file
30
secrets/rootPasswd.age
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
age-encryption.org/v1
|
||||||
|
-> ssh-ed25519 EYWzzw dZmQekgsKFafQQhp7PwxDNqZDeaebBcWFKdvVu9kNHA
|
||||||
|
kVo8BSe/TspDiSrlY6c96pTDYKWI10W3eLmX7xFxaGo
|
||||||
|
-> ssh-ed25519 ugHWWw kJUdRcAS6A6DDBPIarIqOggxg/eEXh+jxH8LJSUTsQE
|
||||||
|
27in5J/hHjq+3jbYZcnEnHnjicEQAugZgb9TiqcJYPE
|
||||||
|
-> ssh-ed25519 UDK5aw ktCg7oNhGxECw6q8M8/JKXud1DhmDHD+xv0CfZ5Qwyg
|
||||||
|
9JlW/TozHaUbgBe1nLCHih/zj0vevp27O8TSNnrRvgs
|
||||||
|
-> ssh-ed25519 UU9RSA Tl1dJB11BCY9lcP1P0SsfLK/QSJfEX3dGHIT8UyIeDM
|
||||||
|
s2Buc+kl6x2OQ2r84SKgo9PpC+Eiejf/2AW8GRCd+Wo
|
||||||
|
-> ssh-ed25519 +5moNA 8UUbmm2Fa0GqH5gFWXtqX7E7aXcXVQk7xlqoV8xyDEM
|
||||||
|
PfdKnfMiuQFaEdHcn2cOh8WvrTygJfwm6BvOMrbQg5k
|
||||||
|
-> ssh-ed25519 IbXxfw 3GbBo0aiHormx1vaWepMNOxo5MMwfZY63SkpMsaYcy8
|
||||||
|
uatK0JPADzjsrsHBNw1Vk929lLGy6Xk66X6f4TzMwM8
|
||||||
|
-> ssh-ed25519 TCMRjQ ezup1/sMk6PVqAvB3M+GhrVQ8tv/NDKaH7+GYS8LBAQ
|
||||||
|
j3aISluVVvBKH+3Am4E8fitt60OoXNRl+fVccpK+o/0
|
||||||
|
-> ssh-ed25519 LUZRUw GcNbGgIb/hD7iKWOaHrcDVpSsL3WU4spuz+Vc4/10UY
|
||||||
|
79nb2p60oLD5Wk3zPhgtu+jzWKSC+5yLSntL8k1ifjU
|
||||||
|
-> ssh-ed25519 JiyliQ hhKOdm1yh5p20dmx2u7UN1jMe4do/DX7JABuG9ZWYVs
|
||||||
|
vjXNjwDRrKoblD+YvUZ5I5m3WiKhPVel5bVhq9oXAPg
|
||||||
|
-> ssh-ed25519 WceKOQ /nHYPRaI7sZ9n/Uwu+29G22eutdtFFbSpznCI6OvCSc
|
||||||
|
xPX2vM6DvY4qufPz5qBttlaP0+8T76q702RTBXzGO6I
|
||||||
|
-> ssh-ed25519 A1vEZQ xycFO6K3nIi5snUvFJuvaGF3jz494XEQgg4FNdKYlxU
|
||||||
|
8PIB1GitMv02dDN9/m8sL4Akky9G+urXBnmyd5FWseA
|
||||||
|
-> ssh-ed25519 rQk6HA duhoJYbtWugdP1mLfO+kwoJKJQJ25fO7xEPM+ggPaVM
|
||||||
|
nY3yWU9U2zOgpiR7LRHOF+xlIO/Un8axMcBA80TtwS0
|
||||||
|
-> k-grease "\MEjtT TJcP!x (s[ZZi
|
||||||
|
9LSNSacH0dnlqlFcH9KjOTv1vssUaQfnuYXWgAZDX/TCv8OIDlz3eSbGf19xZUhT
|
||||||
|
uvMMqWgj7pX568TcBSwB
|
||||||
|
--- h0XAcn8PIMXq9lHfZidKzvAMF4UfvVGs9uznenpCjFs
|
||||||
|
yÇSè€q¸jx‘ˆénš>9™;±jP¡¾Nsfº\Îxó=pÉLƒì<,ÂSY‘8°cƵ·êå·ëOÚmZÄ\Ï-Sã†þL]]ιF§»pvã]œSx³]û\&›l¬¯}YîÏ`X#]þ~,„’xò«äíqd0VÈ^B#‡M\,&S’
|
||||||
23
secrets/secrets.nix
Normal file
23
secrets/secrets.nix
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
let
|
||||||
|
pubkeys = import ../data/pubkeys.nix;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
"cloudflareAcme.age".publicKeys = pubkeys.ragon.server;
|
||||||
|
"nextshot.age".publicKeys = pubkeys.ragon.client;
|
||||||
|
"pulseLaunch.age".publicKeys = pubkeys.ragon.client;
|
||||||
|
"rootPasswd.age".publicKeys = pubkeys.ragon.computers;
|
||||||
|
"ragonPasswd.age".publicKeys = pubkeys.ragon.computers;
|
||||||
|
"tailscaleKey.age".publicKeys = pubkeys.ragon.computers;
|
||||||
|
"paperlessAdminPW.age".publicKeys = pubkeys.ragon.host "ds9";
|
||||||
|
"ds9rcloneConfig.age".publicKeys = pubkeys.ragon.host "ds9";
|
||||||
|
"ds9resticPassword.age".publicKeys = pubkeys.ragon.host "ds9";
|
||||||
|
"hedgedocSecret.age".publicKeys = pubkeys.ragon.host "picard";
|
||||||
|
"gitlabInitialRootPassword.age".publicKeys = pubkeys.ragon.host "picard";
|
||||||
|
"gitlabSecretFile.age".publicKeys = pubkeys.ragon.host "picard";
|
||||||
|
"gitlabDBFile.age".publicKeys = pubkeys.ragon.host "picard";
|
||||||
|
"gitlabOTPFile.age".publicKeys = pubkeys.ragon.host "picard";
|
||||||
|
"gitlabJWSFile.age".publicKeys = pubkeys.ragon.host "picard";
|
||||||
|
"nextcloudAdminPass.age".publicKeys = pubkeys.ragon.host "picard";
|
||||||
|
"wireguardwormhole.age".publicKeys = pubkeys.ragon.host "wormhole";
|
||||||
|
"wireguardvoyager.age".publicKeys = pubkeys.ragon.host "voyager";
|
||||||
|
}
|
||||||
29
secrets/tailscaleKey.age
Normal file
29
secrets/tailscaleKey.age
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
age-encryption.org/v1
|
||||||
|
-> ssh-ed25519 EYWzzw LqSrDXtVPoZ2wV/jLp61ffmZ97tdel5osqMHKJtqGkU
|
||||||
|
dEptsiFGUnChsdQ1e6zY1xy314jV2hM8mxT7DVTHixk
|
||||||
|
-> ssh-ed25519 ugHWWw UmcrgVBZh0Exi6nfSbVcoE7H/vShI5uH9YmwPZzJ2Fc
|
||||||
|
vwP7W4328N78+JB/0Pmf0bqaynObPJnqjldjykJoZkI
|
||||||
|
-> ssh-ed25519 UDK5aw lZziE8KVejhi9SGffw7ugATxpkkhjH0sK8mSsqtRDAw
|
||||||
|
/vIpnMLVME5BfXp9Htrx8BgwKdSmz+IaIE+CAfg3RWg
|
||||||
|
-> ssh-ed25519 UU9RSA mrr+VnPBczJzPDUXuiEB/xMsgobwLMJmzC+CkIhTODo
|
||||||
|
Ww0R9CWpBcIdhkMCmrwNZEwwGUUkQwaS39kZHkZg9Ok
|
||||||
|
-> ssh-ed25519 +5moNA 28WI14I3xfIaxAqR30V2IC/2plACYkPH+FdOZxsnj1Y
|
||||||
|
h1l07zNtcmuhA4JwsY3z4bK4f8zBj6fSE16G26OmWmc
|
||||||
|
-> ssh-ed25519 IbXxfw ShOPZhuck88CV1GW1JwFIEzrHhqowVWudQBJfFaYEzA
|
||||||
|
OGt4XWcsrEulshgktz29eRWUJjPhBK90JkrXML7gU2I
|
||||||
|
-> ssh-ed25519 TCMRjQ B6wbeY4htaQNbHoMj54Vm5u2Nv3/+hZJk0QJZYOPImE
|
||||||
|
/UXZlqF/Q1ZvdaHzxeaTNGe8NkUIF7mRA4qzL/JNVQM
|
||||||
|
-> ssh-ed25519 LUZRUw JiB/nTYhBCeiSoSCwJFnCf9hW1OGA4Y5KQpGzpzE72o
|
||||||
|
yVhuA50na8KM/pT/zPA0g23yYo3meJzsFPAodKsECh8
|
||||||
|
-> ssh-ed25519 JiyliQ fy2KrCXS9ufecu+NAY1Wv4dbcylOOLKs/UApA02V3Xc
|
||||||
|
Khn43o6SclqN7QJ7olSGa13KpaHe+EeKlXLkZiFMx5s
|
||||||
|
-> ssh-ed25519 WceKOQ eLn08w0EuZ3WQR0jQwwMLLaZ8/0S8dLSxc6ukzpJUj4
|
||||||
|
0A3UfxLcS0xkyrHZrPHU1K3/mEsph8f7fXJLOMNyvhs
|
||||||
|
-> ssh-ed25519 A1vEZQ 3IPoXmWMEHxXGJkIcgc+jNincRgmxjUR1w8lT67tkHI
|
||||||
|
QtupNb9H2SDsZ7SeLwim582KT3j2WYT97OKDWyghCw8
|
||||||
|
-> ssh-ed25519 rQk6HA pqCVNRPeh8DcQv688AmVfGVH9vFaO1ljCjZdQnmuLAs
|
||||||
|
UMFmukMw95sH94nMrIDCxA+Wu9rFqu/+HeaTSBAKk/w
|
||||||
|
-> s'-grease Vh0 HZ
|
||||||
|
eV4
|
||||||
|
--- v3hiCSVCZBClieGN5cbms9savGrjF5eJe2CX45+YisU
|
||||||
|
ÐxÎ
›‰J óTö…“;ÓAEûÊ"Ù¡õbˆ<62>×W¼¤ÏRñ´‘„)%Ú©õx9e«w×}ð®+Ív¨Ü’Bj<13>¿_
|
||||||
15
secrets/wireguardvoyager.age
Normal file
15
secrets/wireguardvoyager.age
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
age-encryption.org/v1
|
||||||
|
-> ssh-ed25519 A1vEZQ 8WLhLDth0HYHsCpG9cE866tkxFtzw6PzJUNflx+iOjU
|
||||||
|
9i2/G8aJhu8WQCAVbYtlgMAuYj9Qgo0PEkATat6x0Lk
|
||||||
|
-> ssh-ed25519 EYWzzw mrxn2Mn3wPuUOE8usd2Q/NdyI/y+d8wURa4EzY9euBE
|
||||||
|
T8aonRzVP3HpMYLdj8Cs1ALDlf7StSqRqiOy02qCR9w
|
||||||
|
-> ssh-ed25519 ugHWWw DpCKx/h6Ys+XNqcIlYG8gcA7enZhE9zxOHDSR9zJYgI
|
||||||
|
TUAy5ZMoU6kr4g/+Ys3PYTQp00r0yk7B/+VpdFprsNQ
|
||||||
|
-> ssh-ed25519 UDK5aw iiIeZTy6eDMcekJyils7kJZWMRpO7pLi62lRPveoKg8
|
||||||
|
TnSrdTlda9O+0yhBytnY5VVmthU52L/nMCi9/aFiu1s
|
||||||
|
-> ssh-ed25519 UU9RSA M6ItkG991s5U2K1E70ruUP2iRL9+nB8p2eyDL9kX+TQ
|
||||||
|
HeoZW6BtgHcI3Qe/VUCUrcyhUbcMXlKa3HqNacv7uwc
|
||||||
|
-> kX_-grease f\e\ Rj+~oX7M 1
|
||||||
|
ewJ+jXh0vEgbDhpO0nmX+V+UwZSqkafKRoIB3hMrAwE+R5iuZSDWAx4XR0c
|
||||||
|
--- SiWIor3ehrAC3KTcgLCN+mYvsM+gOGAwj1e8Wud388M
|
||||||
|
±©?Æ`Yûõ"P‰ˆ½È]Èe´}WHŸØ+±!ŸfÅ ¼CsÉFšmcMôî:Øù2oQì6aM<61>ˆ† Õæ~=sµóšžœÅÛ
|
||||||
17
secrets/wireguardwormhole.age
Normal file
17
secrets/wireguardwormhole.age
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
age-encryption.org/v1
|
||||||
|
-> ssh-ed25519 rQk6HA YDPQBl0whrw1zR+swhb+SExxqZ1dAyH/2VUaWSFpF2k
|
||||||
|
MYf8ZmjcHtZrBIvpTPgTpX4AxZb25RIwFnRmPA5HSsY
|
||||||
|
-> ssh-ed25519 EYWzzw uq0tQEgeKJ0QF8Gj+6Q3VKUX+4eZhaYZdn5ue7iVAE8
|
||||||
|
OhXcoh9inDGGs4pUMp4SJsBs9Wgof0Zasp2YDdNbYnU
|
||||||
|
-> ssh-ed25519 ugHWWw mCnwqprJ1LljTL7WMUWs+PAB1TIiTJJnS2H57WlGBxQ
|
||||||
|
6Dic87CJmMyNUb9cMLFb7X1b9OwKODGYDT4XJu79vPM
|
||||||
|
-> ssh-ed25519 UDK5aw llva4i1xwHbr2ObkMRKOL8nlKKHUAVngcI9YnSxQRwY
|
||||||
|
3Arn7SHDV549W9buHN1W178BZZI+LalSVONipZCJvrk
|
||||||
|
-> ssh-ed25519 UU9RSA roR+hhpCHjRWIhCMXE3Z2X8yY+UxmTh2CmzizUfPNA0
|
||||||
|
jSkLFAGZM4mwkAnNBhMqA37XFdEaIFLFo8CjtXFzpQc
|
||||||
|
-> 9P-grease lR x)Ox-
|
||||||
|
6cl7heMeTkRgUkm6tpeysLWDPf+ka5rPGlzvMZSkp5D7q3wzCq4vCXuq6EQHSxbi
|
||||||
|
vsN4NiAXQoBhrOz0lJnDZuH4zerlIdNwoUZzSiqkFJ26SbkVP3xPIYbCKrsBMbox
|
||||||
|
|
||||||
|
--- BfY866qs6AK/LY+dtGMfcsvQP/wiAO5fmRP4eZDORwY
|
||||||
|
÷%ó
ßå+`4Nlœ¶ÊW{þ0äö¶Q»W«×üQ[¢ÊŽVëÿy„~lwtõÊF9œœ&î®
âˆ%¡Ô…FW.ŠÏuª5wÆD
|
||||||
Loading…
Add table
Add a link
Reference in a new issue