miniserver setup
This commit is contained in:
parent
c9c154410e
commit
90714fdb61
222
dotfiles/unpackerr.conf
Normal file
222
dotfiles/unpackerr.conf
Normal file
@ -0,0 +1,222 @@
|
||||
## Unpackerr Example Configuration File ##
|
||||
## The following values are application defaults. ##
|
||||
## Environment Variables may override all values. ##
|
||||
####################################################
|
||||
|
||||
# [true/false] Turn on debug messages in the output. Do not wrap this in quotes.
|
||||
# Recommend trying this so you know what it looks like. I personally leave it on.
|
||||
debug = false
|
||||
|
||||
# Disable writing messages to stdout. This silences the app. You should set a log
|
||||
# file below if you set this to true. Recommended when starting with systemctl.
|
||||
quiet = false
|
||||
|
||||
# Setting activity to true will silence all app queue log lines with only zeros.
|
||||
# Set this to true when you want less log spam.
|
||||
activity = false
|
||||
|
||||
# The application queue data is logged on an interval. Adjust that interval with this setting.
|
||||
# Default is a minute. 2m, 5m, 10m, 30m, 1h are also perfectly acceptable.
|
||||
log_queues = "1m"
|
||||
|
||||
# Write messages to a log file. This is the same data that is normally output to stdout.
|
||||
# This setting is great for Docker users that want to export their logs to a file.
|
||||
# The alternative is to use syslog to log the output of the application to a file.
|
||||
# Default is no log file; this is unset. log_files=0 turns off auto-rotation.
|
||||
# Default files is 10 and size(mb) is 10 Megabytes; both doubled if debug is true.
|
||||
#log_file = '/downloads/unpackerr.log'
|
||||
log_files = 10
|
||||
log_file_mb = 10
|
||||
|
||||
# How often to poll sonarr and radarr.
|
||||
# Recommend 1m-5m. Uses Go Duration.
|
||||
interval = "5m"
|
||||
|
||||
# How long an item must be queued (download complete) before extraction will start.
|
||||
# One minute is the historic default and works well. Set higher if your downloads
|
||||
# take longer to finalize (or transfer locally). Uses Go Duration.
|
||||
start_delay = "1m"
|
||||
|
||||
# How long to wait before removing the history for a failed extraction.
|
||||
# Once the history is deleted the item will be recognized as new and
|
||||
# extraction will start again. Uses Go Duration.
|
||||
retry_delay = "5m"
|
||||
|
||||
# How many files may be extracted in parallel. 1 works fine.
|
||||
# Do not wrap the number in quotes. Raise this only if you have fast disks and CPU.
|
||||
parallel = 1
|
||||
|
||||
# Use these configurations to control the file modes used for newly extracted
|
||||
# files and folders. Recommend 0644/0755 or 0666/0777.
|
||||
file_mode = "0664"
|
||||
dir_mode = "0775"
|
||||
|
||||
[webserver]
|
||||
## The web server currently only supports metrics; set this to true if you wish to use it.
|
||||
metrics = false
|
||||
## This may be set to a port or an ip:port to bind a specific IP. 0.0.0.0 binds ALL IPs.
|
||||
listen_addr = "0.0.0.0:5656"
|
||||
## Recommend setting a log file for HTTP requests. Otherwise, they go with other logs.
|
||||
log_file = ""
|
||||
## This app automatically rotates logs. Set these to the size and number to keep.
|
||||
log_files = 10
|
||||
log_file_mb = 10
|
||||
## Set both of these to valid file paths to enable HTTPS/TLS.
|
||||
ssl_cert_file = ""
|
||||
ssl_key_file = ""
|
||||
## Base URL from which to serve content.
|
||||
urlbase = "/"
|
||||
## Upstreams should be set to the IP or CIDR of your trusted upstream proxy.
|
||||
## Setting this correctly allows X-Forwarded-For to be used in logs.
|
||||
## In the future it may control auth proxy trust. Must be a list of strings.
|
||||
upstreams = [ ] # example: upstreams = [ "127.0.0.1/32", "10.1.2.0/24" ]
|
||||
|
||||
##-Notes-#######-READ THIS!!!-##################################################
|
||||
## The following sections can be repeated if you have more than one Sonarr, ##
|
||||
## Radarr or Lidarr, Readarr, Folder, Webhook, or Command Hook. ##
|
||||
## You MUST uncomment the [[header]] and api_key at a minimum for Starr apps. ##
|
||||
## ALL LINES BEGINNING WITH A HASH # ARE IGNORED ##
|
||||
## REMOVE THE HASH # FROM CONFIG LINES YOU WANT TO CHANGE ##
|
||||
################################################################################
|
||||
|
||||
[[sonarr]]
|
||||
url = "http://localhost:8989"
|
||||
api_key = "52869fe7bec4482dafb21c4053fe71e4"
|
||||
## File system path where downloaded Sonarr items are located.
|
||||
paths = ['/mnt/pool/multimedia/downloads/torrent']
|
||||
## Default protocols is torrent. Alternative: "torrent,usenet"
|
||||
protocols = "torrent"
|
||||
## How long to wait for a reply from the backend.
|
||||
timeout = "10s"
|
||||
## How long to wait after import before deleting the extracted items.
|
||||
delete_delay = "5m"
|
||||
## If you use this app with NZB you may wish to delete archives after extraction.
|
||||
## General recommendation is: do not enable this for torrent use.
|
||||
## Setting this to true deletes the entire original download folder after import.
|
||||
# delete_orig = false
|
||||
## If you use Syncthing, setting this to true will make unpackerr wait for syncs to finish.
|
||||
# syncthing = false
|
||||
|
||||
[[radarr]]
|
||||
url = "http://127.0.0.1:7878"
|
||||
api_key = "a987ac45ca2c47bc88e762031ea33296"
|
||||
## File system path where downloaded Radarr items are located.
|
||||
paths = ['/mnt/pool/multimedia/downloads/torrent']
|
||||
## Default protocols is torrents. Alternative: "torrent,usenet"
|
||||
protocols = "torrent"
|
||||
## How long to wait for a reply from the backend.
|
||||
timeout = "10s"
|
||||
## How long to wait after import before deleting the extracted items.
|
||||
delete_delay = "5m"
|
||||
## If you use this app with NZB you may wish to delete archives after extraction.
|
||||
## General recommendation is: do not enable this for torrent use.
|
||||
## Setting this to true deletes the entire original download folder after import.
|
||||
# delete_orig = false
|
||||
## If you use Syncthing, setting this to true will make unpackerr wait for syncs to finish.
|
||||
# syncthing = false
|
||||
|
||||
#[[lidarr]]
|
||||
# url = "http://127.0.0.1:8686"
|
||||
# api_key = "0123456789abcdef0123456789abcdef"
|
||||
## File system path where downloaded Lidarr items are located.
|
||||
# paths = ['/downloads']
|
||||
## Default protocols is torrent. Alternative: "torrent,usenet"
|
||||
# protocols = "torrent"
|
||||
## How long to wait for a reply from the backend.
|
||||
# timeout = "10s"
|
||||
## How long to wait after import before deleting the extracted items.
|
||||
# delete_delay = "5m"
|
||||
## If you use this app with NZB you may wish to delete archives after extraction.
|
||||
## General recommendation is: do not enable this for torrent use.
|
||||
## Setting this to true deletes the entire original download folder after import.
|
||||
# delete_orig = false
|
||||
## If you use Syncthing, setting this to true will make unpackerr wait for syncs to finish.
|
||||
# syncthing = false
|
||||
|
||||
#[[readarr]]
|
||||
# url = "http://127.0.0.1:8787"
|
||||
# api_key = "0123456789abcdef0123456789abc"
|
||||
## File system path where downloaded Readarr items are located.
|
||||
# paths = ['/downloads']
|
||||
## Default protocols is torrent. Alternative: "torrent,usenet"
|
||||
# protocols = "torrent"
|
||||
## How long to wait for a reply from the backend.
|
||||
# timeout = "10s"
|
||||
## How long to wait after import before deleting the extracted items.
|
||||
# delete_delay = "5m"
|
||||
## If you use this app with NZB you may wish to delete archives after extraction.
|
||||
## General recommendation is: do not enable this for torrent use.
|
||||
## Setting this to true deletes the entire original download folder after import.
|
||||
# delete_orig = false
|
||||
## If you use Syncthing, setting this to true will make unpackerr wait for syncs to finish.
|
||||
# syncthing = false
|
||||
|
||||
|
||||
##################################################################################
|
||||
### ### STOP HERE ### STOP HERE ### STOP HERE ### STOP HERE #### STOP HERE ### #
|
||||
### Only using Starr apps? The things above. The below configs are OPTIONAL. ### #
|
||||
##################################################################################
|
||||
|
||||
##-Folders-#######################################################################
|
||||
## This application can also watch folders for things to extract. If you copy a ##
|
||||
## subfolder into a watched folder (defined below) any extractable items in the ##
|
||||
## folder will be decompressed. This has nothing to do with Starr applications. ##
|
||||
##################################################################################
|
||||
#[[folder]]
|
||||
# path = '/some/folder/to/watch'
|
||||
## Path to extract files to. The default (leaving this blank) is the same as `path` (above).
|
||||
# extract_path = ""
|
||||
## Delete extracted or original files this long after extraction.
|
||||
## The default is 0. Set to 0 to disable all deletes. Uncomment it to enable deletes. Uses Go Duration.
|
||||
# delete_after = "10m"
|
||||
## Delete extracted files after successful extraction? true/false, no quotes. Honors delete_after.
|
||||
# delete_files = false
|
||||
## Delete original items after successful extraction? true/false, no quotes. Honors delete_after.
|
||||
# delete_original = false
|
||||
## Disable extraction log (unpackerred.txt) file creation? true/false, no quotes.
|
||||
# disable_log = false
|
||||
## Move extracted files into original folder? If false, files go into an _unpackerred folder.
|
||||
# move_back = false
|
||||
## Set this to true if you want this app to extract ISO files with .iso extension.
|
||||
# extract_isos = false
|
||||
|
||||
|
||||
################
|
||||
### Webhooks ###
|
||||
################
|
||||
# Sends a webhook when an extraction queues, starts, finishes, and/or is deleted.
|
||||
# Created to integrate with notifiarr.com.
|
||||
# Also works natively with Discord.com, Telegram.org, and Slack.com webhooks.
|
||||
# Can possibly be used with other services by providing a custom template_path.
|
||||
###### Don't forget to uncomment [[webhook]] and url at a minimum !!!!
|
||||
#[[webhook]]
|
||||
# url = "https://notifiarr.com/api/v1/notification/unpackerr/api_key_from_notifiarr_com"
|
||||
# name = "" # Set this to hide the URL in logs.
|
||||
# silent = false # do not log success (less log spam)
|
||||
# events = [0] # list of event ids to include, 0 == all.
|
||||
## Advanced Optional Webhook Configuration
|
||||
# nickname = "" # Used in Discord and Slack templates as bot name, in Telegram as chat_id.
|
||||
# channel = "" # Also passed into templates. Used in Slack templates for destination channel.
|
||||
# exclude = [] # list of apps to exclude, ie. ["radarr", "lidarr"]
|
||||
# template_path = "" # Override internal webhook template for discord.com or other hooks.
|
||||
# template = "" # Override automatic template detection. Values: notifiarr, discord, telegram, gotify, pushover, slack
|
||||
# ignore_ssl = false # Set this to true to ignore the SSL certificate on the server.
|
||||
# timeout = "10s" # You can adjust how long to wait for a server response.
|
||||
# content_type = "application/json" # If your custom template uses another MIME type, set this.
|
||||
|
||||
|
||||
#####################
|
||||
### Command Hooks ###
|
||||
#####################
|
||||
# Executes a script or command when an extraction queues, starts, finishes, and/or is deleted.
|
||||
# All data is passed in as environment variables. Try /usr/bin/env to see what variables are available.
|
||||
###### Don't forget to uncomment [[cmdhook]] and url at a minimum !!!!
|
||||
#[[cmdhook]]
|
||||
# command = '/my/cool/app' # Path to command or script.
|
||||
# shell = false # Runs the command inside /bin/sh ('nix) or cmd.exe (Windows).
|
||||
# name = "" # Provide an optional name for logging.
|
||||
# silent = false # Hides command output from logs.
|
||||
# events = [0] # list of event ids to include, 0 == all.
|
||||
## Optional Command Hook Configuration
|
||||
# exclude = [] # list of apps to exclude, ie. ["radarr", "lidarr"]
|
||||
# timeout = "10s" # You can adjust how long to wait for a server response.
|
||||
690
miniserver/configuration.nix
Normal file
690
miniserver/configuration.nix
Normal file
@ -0,0 +1,690 @@
|
||||
{ config, pkgs, lib, ... }:
|
||||
let
|
||||
version = "23.11";
|
||||
myEmail = "CaptainJawZ@outlook.com";
|
||||
myName = "Danilo Reyes";
|
||||
cpuArchitecture = "alderlake";
|
||||
home-manager = builtins.fetchTarball
|
||||
# "https://github.com/nix-community/home-manager/archive/master.tar.gz";
|
||||
"https://github.com/nix-community/home-manager/archive/release-${version}.tar.gz";
|
||||
unstable = import
|
||||
(builtins.fetchTarball "https://github.com/nixos/nixpkgs/tarball/master") {
|
||||
config = config.nixpkgs.config;
|
||||
};
|
||||
jawzManageLibrary = pkgs.writeScriptBin
|
||||
"manage-library" (builtins.readFile ../scripts/manage-library.sh);
|
||||
jawzTasks = pkgs.writeScriptBin
|
||||
"tasks" (builtins.readFile ../scripts/tasks.sh);
|
||||
jawzSubs = pkgs.writeScriptBin
|
||||
"sub-sync" (builtins.readFile ../scripts/sub-sync.sh);
|
||||
jawzStream = pkgs.writeScriptBin
|
||||
"stream-dl" (builtins.readFile ../scripts/stream-dl.sh);
|
||||
in
|
||||
{ # Remember to close this bracket at the end of the document
|
||||
|
||||
imports = [
|
||||
./fstab.nix
|
||||
./servers.nix
|
||||
./docker.nix
|
||||
# ./mail.nix
|
||||
# ./openldap.nix
|
||||
# <agenix/modules/age.nix>
|
||||
(import "${home-manager}/nixos")
|
||||
];
|
||||
|
||||
powerManagement.cpuFreqGovernor = lib.mkDefault "performance";
|
||||
networking = {
|
||||
useDHCP = lib.mkDefault true;
|
||||
enableIPv6 = false;
|
||||
hostName = "miniserver";
|
||||
networkmanager.enable = true;
|
||||
extraHosts = ''
|
||||
192.168.1.64 workstation
|
||||
192.168.1.69 server
|
||||
'';
|
||||
firewall = let
|
||||
open_firewall_ports = [
|
||||
51413 # torrent sedding
|
||||
9091 # qbittorrent
|
||||
2049 # nfs
|
||||
];
|
||||
open_firewall_port_ranges = [ ];
|
||||
in
|
||||
{
|
||||
enable = true;
|
||||
allowPing = true;
|
||||
allowedTCPPorts = open_firewall_ports;
|
||||
allowedUDPPorts = open_firewall_ports;
|
||||
allowedTCPPortRanges = open_firewall_port_ranges;
|
||||
allowedUDPPortRanges = open_firewall_port_ranges;
|
||||
};
|
||||
};
|
||||
|
||||
time.timeZone = "America/Mexico_City";
|
||||
i18n = {
|
||||
defaultLocale = "en_CA.UTF-8";
|
||||
extraLocaleSettings = {
|
||||
LC_MONETARY = "es_MX.UTF-8";
|
||||
};
|
||||
};
|
||||
console = {
|
||||
font = "Lat2-Terminus16";
|
||||
keyMap = "us";
|
||||
# useXkbConfig = true; # use xkbOptions in tty.
|
||||
};
|
||||
|
||||
system = {
|
||||
copySystemConfiguration = true;
|
||||
stateVersion = "${version}";
|
||||
};
|
||||
nix = let featuresList = [
|
||||
"nixos-test"
|
||||
"benchmark"
|
||||
"big-parallel"
|
||||
"kvm"
|
||||
"gccarch-${cpuArchitecture}"
|
||||
"gccarch-znver3"
|
||||
];
|
||||
in
|
||||
{
|
||||
gc = {
|
||||
automatic = true;
|
||||
dates = "weekly";
|
||||
};
|
||||
buildMachines = [ {
|
||||
hostName = "workstation";
|
||||
system = "x86_64-linux";
|
||||
sshUser = "nixremote";
|
||||
maxJobs = 14;
|
||||
speedFactor = 1;
|
||||
supportedFeatures = featuresList;
|
||||
} ];
|
||||
distributedBuilds = true;
|
||||
settings = {
|
||||
cores = 3;
|
||||
auto-optimise-store = true;
|
||||
trusted-users = [ "nixremote" ];
|
||||
system-features = featuresList;
|
||||
substituters = [
|
||||
"https://nix-gaming.cachix.org"
|
||||
"https://nixpkgs-python.cachix.org"
|
||||
"https://devenv.cachix.org"
|
||||
"https://cuda-maintainers.cachix.org"
|
||||
];
|
||||
trusted-public-keys = [
|
||||
"nix-gaming.cachix.org-1:nbjlureqMbRAxR1gJ/f3hxemL9svXaZF/Ees8vCUUs4="
|
||||
"nixpkgs-python.cachix.org-1:hxjI7pFxTyuTHn2NkvWCrAUcNZLNS3ZAvfYNuYifcEU="
|
||||
"devenv.cachix.org-1:w1cLUi8dv3hnoSPGAuibQv+f9TZLr6cv/Hm9XgU50cw="
|
||||
"cuda-maintainers.cachix.org-1:0dq3bujKpuEPMCX6U4WylrUDZ9JyUG0VpVZa7CNfq5E="
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
security = {
|
||||
acme = {
|
||||
acceptTerms = true;
|
||||
defaults.email = myEmail;
|
||||
};
|
||||
rtkit.enable = true;
|
||||
sudo = {
|
||||
enable = true;
|
||||
wheelNeedsPassword = false;
|
||||
};
|
||||
pam.loginLimits = [{
|
||||
domain = "*";
|
||||
type = "soft";
|
||||
item = "nofile";
|
||||
value = "8192";
|
||||
}];
|
||||
};
|
||||
|
||||
nixpkgs = {
|
||||
hostPlatform = lib.mkDefault "x86_64-linux";
|
||||
config = {
|
||||
allowUnfree = true;
|
||||
permittedInsecurePackages = [
|
||||
"openssl-1.1.1w"
|
||||
];
|
||||
};
|
||||
# localSystem = {
|
||||
# gcc.arch = cpuArchitecture;
|
||||
# gcc.tune = cpuArchitecture;
|
||||
# system = "x86_64-linux";
|
||||
# };
|
||||
};
|
||||
|
||||
users = {
|
||||
groups.nixremote = {
|
||||
name = "nixremote";
|
||||
gid = 555;
|
||||
};
|
||||
users.nixremote = {
|
||||
isNormalUser = true;
|
||||
createHome = true;
|
||||
group = "nixremote";
|
||||
home = "/var/nixremote/";
|
||||
openssh.authorizedKeys.keys = [
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICiyTwryzw8CblPldplDpVUkXD9C1fXVgO8LeXdE5cuR root@workstation"
|
||||
""
|
||||
];
|
||||
};
|
||||
};
|
||||
users.users.jawz = {
|
||||
isNormalUser = true;
|
||||
extraGroups = [ "wheel" "networkmanager" "docker"
|
||||
"scanner" "lp" "piracy" "kavita"
|
||||
"render" "video"
|
||||
];
|
||||
initialPassword = "password";
|
||||
openssh = {
|
||||
authorizedKeys.keys = [
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB5GaQM4N+yGAByibOFQOBVMV/6TjOfaGIP+NunMiK76 gpodeacero\cdreyes@100CDREYES"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMkpeIV9G26W2/e9PsjBx3sNwPGoicJ807ExRGh4KjhW jawz@server"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIH2wtsaMvfEUm//2YnFHyrc16o+TOXXBfIGPJ9nL8RMp jawz@workstation"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINBEblxSDhWPEo33crSjooeUg4W02ruENxHLmmBqCuIo jawz@galaxy"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN6HsajaTL+nTJtSIu00M5WJwgt/7fyU59gBr2R7tbnv root@server"
|
||||
];
|
||||
};
|
||||
|
||||
packages = (with pkgs; [
|
||||
|
||||
hunspell
|
||||
hunspellDicts.it_IT
|
||||
hunspellDicts.es_MX
|
||||
hunspellDicts.en_CA
|
||||
|
||||
symbola
|
||||
|
||||
unstable.yt-dlp # downloads videos from most video websites
|
||||
unstable.gallery-dl # similar to yt-dlp but for most image gallery websites
|
||||
|
||||
fd # modern find, faster searches
|
||||
fzf # fuzzy finder! super cool and useful
|
||||
gdu # disk-space utility, somewhat useful
|
||||
du-dust # rusty du
|
||||
trash-cli # oop! didn't meant to delete that
|
||||
eza # like ls but with colors
|
||||
rmlint # probably my favourite app, amazing dupe finder that integrates well with BTRFS
|
||||
smartmontools # check hard drie health
|
||||
|
||||
jawzManageLibrary
|
||||
jawzTasks
|
||||
jawzSubs
|
||||
jawzStream
|
||||
(writeScriptBin "ffmpeg4discord" (builtins.readFile ../scripts/ffmpeg4discord.py))
|
||||
(writeScriptBin "ffmpreg" (builtins.readFile ../scripts/ffmpreg.sh))
|
||||
(writeScriptBin "split-dir" (builtins.readFile ../scripts/split-dir.sh))
|
||||
(writeScriptBin "pika-list" (builtins.readFile ../scripts/pika-list.sh))
|
||||
(writeScriptBin "run" (builtins.readFile ../scripts/run.sh))
|
||||
(writeScriptBin "find-dup-episodes" (builtins.readFile ../scripts/find-dup-episodes.sh))
|
||||
|
||||
tldr # man for retards
|
||||
|
||||
# SH
|
||||
bats # testing system, required by Exercism
|
||||
bashdb # autocomplete
|
||||
shellcheck # linting
|
||||
shfmt # a shell parser and formatter
|
||||
|
||||
# NIX
|
||||
expect # keep color when nom'ing
|
||||
nix-output-monitor # autistic nix builds
|
||||
nixfmt # linting
|
||||
cachix # why spend time compiling?
|
||||
|
||||
# PYTHON.
|
||||
(python3.withPackages (ps: with ps; [
|
||||
flake8 # wraper for pyflakes, pycodestyle and mccabe
|
||||
isort # sort Python imports
|
||||
nose # testing and running python scripts
|
||||
pyflakes # checks source code for errors
|
||||
pytest # framework for writing tests
|
||||
speedtest-cli # check internet speed from the comand line
|
||||
editorconfig # follow rules of contributin
|
||||
black # Python code formatter
|
||||
pylint # bug and style checker for python
|
||||
])) # base language
|
||||
|
||||
]) ++ (with pkgs.python3Packages; [
|
||||
(buildPythonApplication rec {
|
||||
pname = "download";
|
||||
version = "1.5";
|
||||
src = ../scripts/download/.;
|
||||
doCheck = false;
|
||||
buildInputs = [ setuptools ];
|
||||
propagatedBuildInputs =
|
||||
[ pyyaml types-pyyaml ];
|
||||
})
|
||||
(buildPythonApplication rec {
|
||||
pname = "ffpb";
|
||||
version = "0.4.1";
|
||||
src = fetchPypi {
|
||||
inherit pname version;
|
||||
sha256 = "sha256-7eVqbLpMHS1sBw2vYS4cTtyVdnnknGtEI8190VlXflk=";
|
||||
};
|
||||
doCheck = false;
|
||||
buildInputs = [ setuptools ];
|
||||
propagatedBuildInputs =
|
||||
[ tqdm ];
|
||||
})
|
||||
# (buildPythonApplication rec {
|
||||
# pname = "qbit_manage";
|
||||
# version = "4.0.3";
|
||||
# src = fetchPypi {
|
||||
# inherit pname version;
|
||||
# sha256 = "sha256-7eVqbLpMHS1sBw2vYS4cTtyVdnnknGtEI8190VlXflk=";
|
||||
# };
|
||||
# doCheck = true;
|
||||
# buildInputs = [ setuptools ];
|
||||
# propagatedBuildInputs =
|
||||
# [ gitpython requests retrying ruamel-yaml schedule unstable.qbittorrent-api ];
|
||||
# })
|
||||
|
||||
]) ++ (with pkgs.nodePackages; [
|
||||
# Language servers
|
||||
dockerfile-language-server-nodejs
|
||||
yaml-language-server
|
||||
bash-language-server
|
||||
vscode-json-languageserver
|
||||
pyright
|
||||
|
||||
markdownlint-cli # Linter
|
||||
prettier # Linter
|
||||
pnpm # Package manager
|
||||
|
||||
]); }; # <--- end of package list
|
||||
|
||||
home-manager = {
|
||||
useUserPackages = true;
|
||||
useGlobalPkgs = true;
|
||||
users.jawz = { config, pkgs, ... }:{
|
||||
home.stateVersion = "${version}";
|
||||
|
||||
programs.bash = {
|
||||
enable = true;
|
||||
historyFile = "\${XDG_STATE_HOME}/bash/history";
|
||||
historyControl = [ "erasedups" "ignorespace" ];
|
||||
shellAliases = {
|
||||
hh = "hstr";
|
||||
ls = "eza --icons --group-directories-first";
|
||||
edit = "emacsclient -t";
|
||||
comic = "download -u jawz -i \"$(cat $LC | fzf --multi --exact -i)\"";
|
||||
gallery = "download -u jawz -i \"$(cat $LW | fzf --multi --exact -i)\"";
|
||||
cp = "cp -i";
|
||||
mv = "mv -i";
|
||||
mkcd = "mkdir -pv \"$1\" && cd \"$1\" || exit";
|
||||
mkdir = "mkdir -p";
|
||||
rm = "trash";
|
||||
".." = "cd ..";
|
||||
"..." = "cd ../..";
|
||||
".3" = "cd ../../..";
|
||||
".4" = "cd ../../../..";
|
||||
".5" = "cd ../../../../..";
|
||||
dl = "download -u jawz -i";
|
||||
e = "edit";
|
||||
c = "cat";
|
||||
f = "fzf --multi --exact -i";
|
||||
sc = "systemctl --user";
|
||||
jc = "journalctl --user -xefu";
|
||||
open-gallery = "cd /mnt/pool/scrapping/JawZ/gallery-dl &&
|
||||
xdg-open $(fd . ./ Husbands -tdirectory -d 1 | fzf -i)\"";
|
||||
unique-extensions = "fd -tf | rev | cut -d. -f1 | rev |
|
||||
tr '[:upper:]' '[:lower:]' | sort |
|
||||
uniq --count | sort -rn";
|
||||
};
|
||||
enableVteIntegration = true;
|
||||
initExtra = ''
|
||||
$HOME/.local/bin/pokemon-colorscripts -r --no-title
|
||||
# Lists
|
||||
list_root="${config.xdg.configHome}"/jawz/lists/jawz
|
||||
export LW=$list_root/watch.txt
|
||||
export LI=$list_root/instant.txt
|
||||
export LC=$list_root/comic.txt
|
||||
export command_timeout=30
|
||||
|
||||
if command -v fzf-share >/dev/null; then
|
||||
source "$(fzf-share)/key-bindings.bash"
|
||||
source "$(fzf-share)/completion.bash"
|
||||
fi
|
||||
|
||||
nixos-reload () {
|
||||
nixfmt /home/jawz/Development/NixOS/miniserver/*.nix
|
||||
sudo unbuffer nixos-rebuild switch -I nixos-config=/home/jawz/Development/NixOS/miniserver/configuration.nix |& nom
|
||||
}
|
||||
'';
|
||||
};
|
||||
|
||||
xdg = {
|
||||
enable = true;
|
||||
userDirs = {
|
||||
enable = true;
|
||||
createDirectories = false;
|
||||
desktop = "${config.home.homeDirectory}";
|
||||
documents = "${config.home.homeDirectory}/Documents";
|
||||
download = "${config.home.homeDirectory}/Downloads";
|
||||
music = "${config.home.homeDirectory}/Music";
|
||||
pictures = "${config.home.homeDirectory}/Pictures";
|
||||
templates = "${config.xdg.dataHome}/Templates";
|
||||
videos = "${config.home.homeDirectory}/Videos";
|
||||
};
|
||||
configFile = {
|
||||
"wgetrc".source = ../dotfiles/wget/wgetrc;
|
||||
"configstore/update-notifier-npm-check.json".source = ../dotfiles/npm/update-notifier-npm-check.json;
|
||||
"npm/npmrc".source = ../dotfiles/npm/npmrc;
|
||||
"gallery-dl/config.json".source = ../dotfiles/gallery-dl/config.json;
|
||||
"htop/htoprc".source = ../dotfiles/htop/htoprc;
|
||||
"python/pythonrc".source = ../dotfiles/pythonrc;
|
||||
"unpackerr.conf".source = ../dotfiles/unpackerr.conf;
|
||||
};
|
||||
};
|
||||
|
||||
programs = {
|
||||
helix = {
|
||||
enable = true;
|
||||
};
|
||||
hstr.enable = true;
|
||||
emacs.enable = true;
|
||||
direnv = {
|
||||
enable = true;
|
||||
enableBashIntegration = true;
|
||||
nix-direnv.enable = true;
|
||||
};
|
||||
bat = {
|
||||
enable = true;
|
||||
config = {
|
||||
pager = "less -FR";
|
||||
theme = "base16";
|
||||
};
|
||||
extraPackages = with pkgs.bat-extras; [
|
||||
batman # man pages
|
||||
batpipe # piping
|
||||
batgrep # ripgrep
|
||||
batdiff # this is getting crazy!
|
||||
batwatch # probably my next best friend
|
||||
prettybat # trans your sourcecode!
|
||||
];
|
||||
};
|
||||
git = {
|
||||
enable = true;
|
||||
userName = "${myName}";
|
||||
userEmail = "${myEmail}";
|
||||
};
|
||||
htop = {
|
||||
enable = true;
|
||||
package = pkgs.htop-vim;
|
||||
};
|
||||
};
|
||||
|
||||
services = {
|
||||
lorri.enable = true;
|
||||
emacs = {
|
||||
enable = true;
|
||||
defaultEditor = true;
|
||||
package = pkgs.emacs;
|
||||
startWithUserSession = "graphical";
|
||||
};
|
||||
};
|
||||
|
||||
}; };
|
||||
|
||||
environment = {
|
||||
systemPackages = with pkgs; [
|
||||
wget
|
||||
jellyfin-ffmpeg # coolest video converter!
|
||||
mediainfo
|
||||
dlib
|
||||
fd
|
||||
ripgrep
|
||||
];
|
||||
variables = rec {
|
||||
# PATH
|
||||
XDG_CACHE_HOME = "\${HOME}/.cache";
|
||||
XDG_CONFIG_HOME = "\${HOME}/.config";
|
||||
XDG_BIN_HOME = "\${HOME}/.local/bin";
|
||||
XDG_DATA_HOME = "\${HOME}/.local/share";
|
||||
XDG_STATE_HOME = "\${HOME}/.local/state";
|
||||
|
||||
# DEV PATH
|
||||
CABAL_DIR = "${XDG_CACHE_HOME}/cabal";
|
||||
CARGO_HOME = "${XDG_DATA_HOME}/cargo";
|
||||
GEM_HOME = "${XDG_DATA_HOME}/ruby/gems";
|
||||
GEM_PATH = "${XDG_DATA_HOME}/ruby/gems";
|
||||
GEM_SPEC_CACHE = "${XDG_DATA_HOME}/ruby/specs";
|
||||
GOPATH = "${XDG_DATA_HOME}/go";
|
||||
NPM_CONFIG_USERCONFIG = "${XDG_CONFIG_HOME}/npm/npmrc";
|
||||
PNPM_HOME = "${XDG_DATA_HOME}/pnpm";
|
||||
PSQL_HISTORY="${XDG_DATA_HOME}/psql_history";
|
||||
REDISCLI_HISTFILE="${XDG_DATA_HOME}/redis/rediscli_history";
|
||||
WINEPREFIX="${XDG_DATA_HOME}/wine";
|
||||
PYTHONSTARTUP="${XDG_CONFIG_HOME}/python/pythonrc";
|
||||
STACK_ROOT="${XDG_DATA_HOME}/stack";
|
||||
|
||||
# OPTIONS
|
||||
HISTFILE = "${XDG_STATE_HOME}/bash/history";
|
||||
LESSHISTFILE = "-";
|
||||
GHCUP_USE_XDG_DIRS = "true";
|
||||
RIPGREP_CONFIG_PATH = "${XDG_CONFIG_HOME}/ripgrep/ripgreprc";
|
||||
ELECTRUMDIR = "${XDG_DATA_HOME}/electrum";
|
||||
VISUAL = "emacsclient -ca emacs";
|
||||
WGETRC = "${XDG_CONFIG_HOME}/wgetrc";
|
||||
XCOMPOSECACHE = "${XDG_CACHE_HOME}/X11/xcompose";
|
||||
"_JAVA_OPTIONS" = "-Djava.util.prefs.userRoot=${XDG_CONFIG_HOME}/java";
|
||||
DOCKER_CONFIG="${XDG_CONFIG_HOME}/docker";
|
||||
|
||||
# NVIDIA
|
||||
CUDA_CACHE_PATH = "${XDG_CACHE_HOME}/nv";
|
||||
|
||||
# Themes
|
||||
# WEBKIT_DISABLE_COMPOSITING_MODE = "1";
|
||||
CALIBRE_USE_SYSTEM_THEME = "1";
|
||||
|
||||
PATH = [
|
||||
"\${HOME}/.local/bin"
|
||||
"\${XDG_CONFIG_HOME}/emacs/bin"
|
||||
"\${XDG_DATA_HOME}/npm/bin"
|
||||
"\${XDG_DATA_HOME}/pnpm"
|
||||
];
|
||||
|
||||
# needed for tensorflow
|
||||
# CUDA_PATH = "${pkgs.cudatoolkit}";
|
||||
# # LD_LIBRARY_PATH = "${pkgs.linuxPackages.nvidia_x11}/lib:${pkgs.ncurses5}/lib";
|
||||
# EXTRA_LDFLAGS = "-L/lib -L${pkgs.linuxPackages.nvidia_x11}/lib";
|
||||
# EXTRA_CCFLAGS = "-I/usr/include";
|
||||
};
|
||||
};
|
||||
|
||||
programs = {
|
||||
starship.enable = true;
|
||||
tmux.enable = true;
|
||||
fzf.fuzzyCompletion = true;
|
||||
neovim = {
|
||||
enable = true;
|
||||
vimAlias = true;
|
||||
};
|
||||
gnupg.agent = {
|
||||
enable = true;
|
||||
enableSSHSupport = true;
|
||||
};
|
||||
};
|
||||
|
||||
services = {
|
||||
# minidlna = {
|
||||
# enable = true;
|
||||
# openFirewall = true;
|
||||
# settings = {
|
||||
# inotify = "yes";
|
||||
# media_dir = [
|
||||
# "/mnt/pool/glue"
|
||||
# ];
|
||||
# };
|
||||
# };
|
||||
avahi = {
|
||||
enable = true;
|
||||
nssmdns = true;
|
||||
};
|
||||
fstrim.enable = true;
|
||||
smartd.enable = true;
|
||||
btrfs.autoScrub = {
|
||||
enable = true;
|
||||
fileSystems = [
|
||||
"/"
|
||||
"/mnt/pool"
|
||||
];
|
||||
};
|
||||
openssh = {
|
||||
enable = true;
|
||||
openFirewall = true;
|
||||
startWhenNeeded = true;
|
||||
settings = {
|
||||
PasswordAuthentication = false;
|
||||
KbdInteractiveAuthentication = false;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
systemd = {
|
||||
packages = let
|
||||
pkgs = import (builtins.fetchTarball {
|
||||
url = "https://github.com/NixOS/nixpkgs/archive/9957cd48326fe8dbd52fdc50dd2502307f188b0d.tar.gz";
|
||||
}) {};
|
||||
|
||||
myPkg = pkgs.qbittorrent-nox;
|
||||
in [ myPkg ];
|
||||
services = {
|
||||
"qbittorrent-nox@jawz" = {
|
||||
enable = true;
|
||||
overrideStrategy = "asDropin";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
};
|
||||
};
|
||||
timers = {
|
||||
};
|
||||
user = {
|
||||
services = {
|
||||
"stream@" = {
|
||||
description = "monitors a stream channel for online streams.";
|
||||
restartIfChanged = true;
|
||||
wantedBy = [ "default.target" ];
|
||||
path = [
|
||||
pkgs.nix
|
||||
jawzStream
|
||||
];
|
||||
serviceConfig = {
|
||||
Restart = "on-failure";
|
||||
RestartSec = 30;
|
||||
ExecStart = "${jawzStream}/bin/stream-dl %I";
|
||||
};
|
||||
};
|
||||
unpackerr = {
|
||||
enable = true;
|
||||
restartIfChanged = true;
|
||||
description = "Run unpackerr";
|
||||
wantedBy = [ "default.target" ];
|
||||
serviceConfig = {
|
||||
Restart = "on-failure";
|
||||
RestartSec = 30;
|
||||
ExecStart = "${pkgs.unpackerr}/bin/unpackerr -c /home/jawz/.config/unpackerr.conf";
|
||||
};
|
||||
};
|
||||
# manage-library = {
|
||||
# enable = true;
|
||||
# restartIfChanged = true;
|
||||
# description = "Run the manage library bash script";
|
||||
# wantedBy = [ "default.target" ];
|
||||
# path = [
|
||||
# pkgs.bash
|
||||
# pkgs.nix
|
||||
# jawzManageLibrary
|
||||
# ];
|
||||
# serviceConfig = {
|
||||
# Restart = "on-failure";
|
||||
# RestartSec = 30;
|
||||
# ExecStart = "${jawzManageLibrary}/bin/manage-library";
|
||||
# };
|
||||
# };
|
||||
# tasks = {
|
||||
# restartIfChanged = true;
|
||||
# description = "Run a tasks script which keeps a lot of things organized";
|
||||
# wantedBy = [ "default.target" ];
|
||||
# path = [
|
||||
# pkgs.bash
|
||||
# pkgs.nix
|
||||
# jawzTasks
|
||||
# ];
|
||||
# serviceConfig = {
|
||||
# Restart = "on-failure";
|
||||
# RestartSec = 30;
|
||||
# ExecStart = "${jawzTasks}/bin/tasks";
|
||||
# };
|
||||
# };
|
||||
# qbit_manage = let qbit_dir = "/home/jawz/Development/Git/qbit_manage"; in {
|
||||
# restartIfChanged = true;
|
||||
# description = "Tidy up my torrents";
|
||||
# wantedBy = [ "default.target" ];
|
||||
# path = [
|
||||
# pkgs.python3
|
||||
# pkgs.pipenv
|
||||
# ];
|
||||
# serviceConfig = {
|
||||
# Restart = "on-failure";
|
||||
# RestartSec = 30;
|
||||
# ExecStart = "${qbit_dir}/.venv/bin/python3 ${qbit_dir}/qbit_manage.py -r -c ${qbit_dir}/config.yml";
|
||||
# };
|
||||
# };
|
||||
};
|
||||
timers = let
|
||||
streamTimer = {
|
||||
enable = true;
|
||||
description = "monitors a stream channel for online streams.";
|
||||
wantedBy = [ "timers.target" ];
|
||||
timerConfig = {
|
||||
OnBootSec = "5min";
|
||||
OnUnitActiveSec = "65min";
|
||||
RandomizedDelaySec = 30;
|
||||
};
|
||||
};
|
||||
in {
|
||||
"stream@johnneal911" = streamTimer // { };
|
||||
"stream@uk2011boy" = streamTimer // { };
|
||||
"stream@tomayto\\x20picarto" = streamTimer // { };
|
||||
"stream@retrohurricaneLIVE\\x20picarto" = streamTimer // { };
|
||||
# tasks = {
|
||||
# enable = true;
|
||||
# description = "Run a tasks script which keeps a lot of things organized";
|
||||
# wantedBy = [ "timers.target" ];
|
||||
# timerConfig = {
|
||||
# OnCalendar = "*:0/10";
|
||||
# };
|
||||
# };
|
||||
# manage-library = {
|
||||
# enable = true;
|
||||
# description = "Run the manage library bash script";
|
||||
# wantedBy = [ "timers.target" ];
|
||||
# timerConfig = {
|
||||
# OnCalendar = "00:30";
|
||||
# };
|
||||
# };
|
||||
# qbit_manage = {
|
||||
# enable = true;
|
||||
# description = "Tidy up my torrents";
|
||||
# wantedBy = [ "timers.target" ];
|
||||
# timerConfig = {
|
||||
# OnCalendar = "*:0/10";
|
||||
# };
|
||||
# };
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
fonts.fontconfig.enable = true;
|
||||
|
||||
hardware = {
|
||||
cpu.intel.updateMicrocode = lib.mkDefault true;
|
||||
opengl = {
|
||||
enable = true;
|
||||
driSupport = true;
|
||||
driSupport32Bit = true;
|
||||
};
|
||||
};
|
||||
|
||||
}
|
||||
956
miniserver/configuration.org
Normal file
956
miniserver/configuration.org
Normal file
@ -0,0 +1,956 @@
|
||||
#+TITLE: JawZ NixOS server configuration
|
||||
#+AUTHOR: Danilo Reyes
|
||||
#+PROPERTY: header-args :tangle configuration.nix
|
||||
#+auto_tangle: t
|
||||
|
||||
* TODO [0/6]
|
||||
- [ ] System configurations [0/8]
|
||||
- [ ] fail2ban
|
||||
- [ ] Misc [0/3]
|
||||
- [ ] Figure out how to get rid of xterm
|
||||
|
||||
|
||||
* DECLARATION
|
||||
Here I will declare the dependencies and variables that I call multiple times
|
||||
through the config file, such as the current version of NixOS, repositories and
|
||||
even some scripts that I reuse on systemd configurations.
|
||||
|
||||
- version: used by both NixOS and home-manager to dictate the state repository
|
||||
from which to pull configurations, modules and packages.
|
||||
- myEmail myName: used by git and acme
|
||||
- cpuArchitecture: used by NixOS to optimize the compiled binaries to my current
|
||||
CPU specifications.
|
||||
- home-manager: the channel containing the packages matching the NixOS state
|
||||
version, with a commented out to the unstable master.
|
||||
- unstable: a sort of overlay that allows to prepend "unstable" to a package,
|
||||
to pull from the unstable channel rather than precompiled binaries on a case
|
||||
by case use.
|
||||
- jawz*: scripts that will reuse multiple times through the config, such as
|
||||
on systemd, and as such this feels like a safe way to compile them only once.
|
||||
|
||||
#+begin_src nix
|
||||
{ config, pkgs, lib, ... }:
|
||||
let
|
||||
version = "23.11";
|
||||
myEmail = "CaptainJawZ@outlook.com";
|
||||
myName = "Danilo Reyes";
|
||||
cpuArchitecture = "alderlake";
|
||||
home-manager = builtins.fetchTarball
|
||||
# "https://github.com/nix-community/home-manager/archive/master.tar.gz";
|
||||
"https://github.com/nix-community/home-manager/archive/release-${version}.tar.gz";
|
||||
unstable = import
|
||||
(builtins.fetchTarball "https://github.com/nixos/nixpkgs/tarball/master") {
|
||||
config = config.nixpkgs.config;
|
||||
};
|
||||
jawzManageLibrary = pkgs.writeScriptBin
|
||||
"manage-library" (builtins.readFile ../scripts/manage-library.sh);
|
||||
jawzTasks = pkgs.writeScriptBin
|
||||
"tasks" (builtins.readFile ../scripts/tasks.sh);
|
||||
jawzSubs = pkgs.writeScriptBin
|
||||
"sub-sync" (builtins.readFile ../scripts/sub-sync.sh);
|
||||
jawzStream = pkgs.writeScriptBin
|
||||
"stream-dl" (builtins.readFile ../scripts/stream-dl.sh);
|
||||
in
|
||||
{ # Remember to close this bracket at the end of the document
|
||||
#+end_src
|
||||
|
||||
These are files and modules which get loaded onto the configuration file, in the
|
||||
future I may segment this file into different modules once it becomes too
|
||||
cluttered, for example, I may create a module for systemd units.
|
||||
|
||||
- agenix: an encryption system which cleans up the nix-configuration files from
|
||||
passwords and other secrets.
|
||||
|
||||
#+begin_src nix
|
||||
imports = [
|
||||
./fstab.nix
|
||||
./servers.nix
|
||||
./docker.nix
|
||||
# ./mail.nix
|
||||
# ./openldap.nix
|
||||
# <agenix/modules/age.nix>
|
||||
(import "${home-manager}/nixos")
|
||||
];
|
||||
#+end_src
|
||||
|
||||
* SYSTEM CONFIGURATION
|
||||
** NETWORKING
|
||||
Sets sensible networking options, such as setting up a hostname, and creating a
|
||||
hosts file with the static IP and hostname of other devices on my network.
|
||||
|
||||
Also open ports on the firewall for LAN connectivity, and well keeping commented
|
||||
what each port does, I declared the firwewall ports with variables, because I
|
||||
don't care to figure out whether I need TCP or UDP so let's open both, and
|
||||
repetition is maddening.
|
||||
|
||||
#+begin_src nix
|
||||
powerManagement.cpuFreqGovernor = lib.mkDefault "performance";
|
||||
networking = {
|
||||
useDHCP = lib.mkDefault true;
|
||||
enableIPv6 = false;
|
||||
hostName = "miniserver";
|
||||
networkmanager.enable = true;
|
||||
extraHosts = ''
|
||||
192.168.1.64 workstation
|
||||
192.168.1.69 server
|
||||
'';
|
||||
firewall = let
|
||||
open_firewall_ports = [
|
||||
51413 # torrent sedding
|
||||
9091 # qbittorrent
|
||||
2049 # nfs
|
||||
];
|
||||
open_firewall_port_ranges = [ ];
|
||||
in
|
||||
{
|
||||
enable = true;
|
||||
allowPing = true;
|
||||
allowedTCPPorts = open_firewall_ports;
|
||||
allowedUDPPorts = open_firewall_ports;
|
||||
allowedTCPPortRanges = open_firewall_port_ranges;
|
||||
allowedUDPPortRanges = open_firewall_port_ranges;
|
||||
};
|
||||
};
|
||||
#+end_src
|
||||
|
||||
** TIMEZONE & LOCALE
|
||||
For some reason, useXkbConfig throws an error when building the system, either
|
||||
way it is an unnecessary setting as my keyboards are the default en_US, only
|
||||
locale set to Canadian out because I prefer how it displays the date.
|
||||
LC_MONETARY, it's also a personal preference.
|
||||
|
||||
#+begin_src nix
|
||||
time.timeZone = "America/Mexico_City";
|
||||
i18n = {
|
||||
defaultLocale = "en_CA.UTF-8";
|
||||
extraLocaleSettings = {
|
||||
LC_MONETARY = "es_MX.UTF-8";
|
||||
};
|
||||
};
|
||||
console = {
|
||||
font = "Lat2-Terminus16";
|
||||
keyMap = "us";
|
||||
# useXkbConfig = true; # use xkbOptions in tty.
|
||||
};
|
||||
#+end_src
|
||||
|
||||
** SYSTEM/NIX CONFIGURATIONS
|
||||
The first setting creates a copy the NixOS configuration file and link it from
|
||||
the resulting system (/run/current-system/configuration.nix). This is useful in
|
||||
case you accidentally delete configuration.nix.
|
||||
|
||||
The version value determines the NixOS release from which the default settings for
|
||||
stateful data, like file locations and database versions on your system.
|
||||
It‘s perfectly fine and recommended to leave this value at the release version
|
||||
of the first install of this system.
|
||||
|
||||
Lastly I configure in here cachix repositories, which is a website that keeps a
|
||||
cache of nixbuilds for easy quick deployments without having to compile
|
||||
everything from scratch.
|
||||
|
||||
- gc: automatically garbage-collects.
|
||||
- auto-optimise-store: hard-links binaries whenever possible.
|
||||
- system-features: features present on compiling time.
|
||||
|
||||
#+begin_src nix
|
||||
system = {
|
||||
copySystemConfiguration = true;
|
||||
stateVersion = "${version}";
|
||||
};
|
||||
nix = let featuresList = [
|
||||
"nixos-test"
|
||||
"benchmark"
|
||||
"big-parallel"
|
||||
"kvm"
|
||||
"gccarch-${cpuArchitecture}"
|
||||
"gccarch-znver3"
|
||||
];
|
||||
in
|
||||
{
|
||||
gc = {
|
||||
automatic = true;
|
||||
dates = "weekly";
|
||||
};
|
||||
buildMachines = [ {
|
||||
hostName = "workstation";
|
||||
system = "x86_64-linux";
|
||||
sshUser = "nixremote";
|
||||
maxJobs = 14;
|
||||
speedFactor = 1;
|
||||
supportedFeatures = featuresList;
|
||||
} ];
|
||||
distributedBuilds = true;
|
||||
settings = {
|
||||
cores = 3;
|
||||
auto-optimise-store = true;
|
||||
trusted-users = [ "nixremote" ];
|
||||
system-features = featuresList;
|
||||
substituters = [
|
||||
"https://nix-gaming.cachix.org"
|
||||
"https://nixpkgs-python.cachix.org"
|
||||
"https://devenv.cachix.org"
|
||||
"https://cuda-maintainers.cachix.org"
|
||||
];
|
||||
trusted-public-keys = [
|
||||
"nix-gaming.cachix.org-1:nbjlureqMbRAxR1gJ/f3hxemL9svXaZF/Ees8vCUUs4="
|
||||
"nixpkgs-python.cachix.org-1:hxjI7pFxTyuTHn2NkvWCrAUcNZLNS3ZAvfYNuYifcEU="
|
||||
"devenv.cachix.org-1:w1cLUi8dv3hnoSPGAuibQv+f9TZLr6cv/Hm9XgU50cw="
|
||||
"cuda-maintainers.cachix.org-1:0dq3bujKpuEPMCX6U4WylrUDZ9JyUG0VpVZa7CNfq5E="
|
||||
];
|
||||
};
|
||||
};
|
||||
#+end_src
|
||||
|
||||
* SECURITY
|
||||
Disabled password in sudo for commodity, but this is obviously not recommended,
|
||||
regarding rkit, that setting enables pipewire to run with real-time
|
||||
capabilities. And lastly, the acme settings are for signing certificates.
|
||||
|
||||
The pam limits exists so NixOS can compile the entire system without running
|
||||
into "Too many files open" errors.
|
||||
|
||||
#+begin_src nix
|
||||
security = {
|
||||
acme = {
|
||||
acceptTerms = true;
|
||||
defaults.email = myEmail;
|
||||
};
|
||||
rtkit.enable = true;
|
||||
sudo = {
|
||||
enable = true;
|
||||
wheelNeedsPassword = false;
|
||||
};
|
||||
pam.loginLimits = [{
|
||||
domain = "*";
|
||||
type = "soft";
|
||||
item = "nofile";
|
||||
value = "8192";
|
||||
}];
|
||||
};
|
||||
#+end_src
|
||||
|
||||
* NIXPKGS SETTINGS
|
||||
Allow non-free, sadly is a requirement for some of my drivers, besides that,
|
||||
here is a good place to declare some package overrides as well as permit unsafe
|
||||
packages.
|
||||
|
||||
localSystem allows me to compile the entire operating system optimized to my CPU
|
||||
architecture and other build flags.
|
||||
|
||||
=note= if using gcc.arch flags, comment out hostPlatform and viceversa.
|
||||
|
||||
#+begin_src nix
|
||||
nixpkgs = {
|
||||
hostPlatform = lib.mkDefault "x86_64-linux";
|
||||
config = {
|
||||
allowUnfree = true;
|
||||
permittedInsecurePackages = [
|
||||
"openssl-1.1.1w"
|
||||
];
|
||||
};
|
||||
# localSystem = {
|
||||
# gcc.arch = cpuArchitecture;
|
||||
# gcc.tune = cpuArchitecture;
|
||||
# system = "x86_64-linux";
|
||||
# };
|
||||
};
|
||||
#+end_src
|
||||
|
||||
* NORMAL USERS
|
||||
Being part of the "wheel" group, means that the user has root privileges. The
|
||||
piracy.gid is so I have read/write access permissions on all the hard drives
|
||||
split among my multiple systems, the rest of the groups are self explanatory.
|
||||
|
||||
- nixremote: is a low-privilege user set exclusively with the intention to be a
|
||||
proxy to build the nix-store remotely.
|
||||
|
||||
#+begin_src nix
|
||||
users = {
|
||||
groups.nixremote = {
|
||||
name = "nixremote";
|
||||
gid = 555;
|
||||
};
|
||||
users.nixremote = {
|
||||
isNormalUser = true;
|
||||
createHome = true;
|
||||
group = "nixremote";
|
||||
home = "/var/nixremote/";
|
||||
openssh.authorizedKeys.keys = [
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICiyTwryzw8CblPldplDpVUkXD9C1fXVgO8LeXdE5cuR root@workstation"
|
||||
""
|
||||
];
|
||||
};
|
||||
};
|
||||
users.users.jawz = {
|
||||
isNormalUser = true;
|
||||
extraGroups = [ "wheel" "networkmanager" "docker"
|
||||
"scanner" "lp" "piracy" "kavita"
|
||||
"render" "video"
|
||||
];
|
||||
initialPassword = "password";
|
||||
openssh = {
|
||||
authorizedKeys.keys = [
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB5GaQM4N+yGAByibOFQOBVMV/6TjOfaGIP+NunMiK76 gpodeacero\cdreyes@100CDREYES"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMkpeIV9G26W2/e9PsjBx3sNwPGoicJ807ExRGh4KjhW jawz@server"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIH2wtsaMvfEUm//2YnFHyrc16o+TOXXBfIGPJ9nL8RMp jawz@workstation"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINBEblxSDhWPEo33crSjooeUg4W02ruENxHLmmBqCuIo jawz@galaxy"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN6HsajaTL+nTJtSIu00M5WJwgt/7fyU59gBr2R7tbnv root@server"
|
||||
];
|
||||
};
|
||||
#+end_src
|
||||
|
||||
This section of the document categorizes and organizes all he packages that I
|
||||
want installed, attempting to group them as dependencies of others when
|
||||
necessary.
|
||||
|
||||
* USER PACKAGES
|
||||
This section of the document categorizes and organizes all he packages that I
|
||||
want installed, attempting to group them as dependencies of others when
|
||||
necessary.
|
||||
|
||||
Begin the block to install user packages.
|
||||
|
||||
#+begin_src nix
|
||||
packages = (with pkgs; [
|
||||
#+end_src
|
||||
|
||||
cli and tui packages, which on their own right are as or more powerful than the
|
||||
packages on the previous section.
|
||||
|
||||
** HUNSPELL
|
||||
These dictionaries work with Firefox, Doom Emacs and LibreOffice.
|
||||
|
||||
#+begin_src nix
|
||||
hunspell
|
||||
hunspellDicts.it_IT
|
||||
hunspellDicts.es_MX
|
||||
hunspellDicts.en_CA
|
||||
#+end_src
|
||||
|
||||
** CUSTOMIZATION PACKAGES
|
||||
Themes and other customization, making my DE look the way I want is one of the
|
||||
main draws of Linux for me.
|
||||
|
||||
#+begin_src nix
|
||||
symbola
|
||||
#+end_src
|
||||
|
||||
** COMMAND-LINE PACKAGES
|
||||
|
||||
#+begin_src nix
|
||||
unstable.yt-dlp # downloads videos from most video websites
|
||||
unstable.gallery-dl # similar to yt-dlp but for most image gallery websites
|
||||
|
||||
fd # modern find, faster searches
|
||||
fzf # fuzzy finder! super cool and useful
|
||||
gdu # disk-space utility, somewhat useful
|
||||
du-dust # rusty du
|
||||
trash-cli # oop! didn't meant to delete that
|
||||
eza # like ls but with colors
|
||||
rmlint # probably my favourite app, amazing dupe finder that integrates well with BTRFS
|
||||
smartmontools # check hard drie health
|
||||
#+end_src
|
||||
|
||||
** MY SCRIPTS
|
||||
Here I compile my own scripts into binaries
|
||||
|
||||
#+begin_src nix
|
||||
jawzManageLibrary
|
||||
jawzTasks
|
||||
jawzSubs
|
||||
jawzStream
|
||||
(writeScriptBin "ffmpeg4discord" (builtins.readFile ../scripts/ffmpeg4discord.py))
|
||||
(writeScriptBin "ffmpreg" (builtins.readFile ../scripts/ffmpreg.sh))
|
||||
(writeScriptBin "split-dir" (builtins.readFile ../scripts/split-dir.sh))
|
||||
(writeScriptBin "pika-list" (builtins.readFile ../scripts/pika-list.sh))
|
||||
(writeScriptBin "run" (builtins.readFile ../scripts/run.sh))
|
||||
(writeScriptBin "find-dup-episodes" (builtins.readFile ../scripts/find-dup-episodes.sh))
|
||||
#+end_src
|
||||
|
||||
** DEVELOPMENT PACKAGES
|
||||
Assorted development packages and libraries, categorized by languages.
|
||||
|
||||
#+begin_src nix
|
||||
tldr # man for retards
|
||||
|
||||
# SH
|
||||
bats # testing system, required by Exercism
|
||||
bashdb # autocomplete
|
||||
shellcheck # linting
|
||||
shfmt # a shell parser and formatter
|
||||
|
||||
# NIX
|
||||
expect # keep color when nom'ing
|
||||
nix-output-monitor # autistic nix builds
|
||||
nixfmt # linting
|
||||
cachix # why spend time compiling?
|
||||
|
||||
# PYTHON.
|
||||
(python3.withPackages (ps: with ps; [
|
||||
flake8 # wraper for pyflakes, pycodestyle and mccabe
|
||||
isort # sort Python imports
|
||||
nose # testing and running python scripts
|
||||
pyflakes # checks source code for errors
|
||||
pytest # framework for writing tests
|
||||
speedtest-cli # check internet speed from the comand line
|
||||
editorconfig # follow rules of contributin
|
||||
black # Python code formatter
|
||||
pylint # bug and style checker for python
|
||||
])) # base language
|
||||
#+end_src
|
||||
|
||||
** CUSTOM PYTHON SCRIPTS
|
||||
Libraries & apps not found on the nix-store and scripts made by me.
|
||||
|
||||
#+begin_src nix
|
||||
]) ++ (with pkgs.python3Packages; [
|
||||
(buildPythonApplication rec {
|
||||
pname = "download";
|
||||
version = "1.5";
|
||||
src = ../scripts/download/.;
|
||||
doCheck = false;
|
||||
buildInputs = [ setuptools ];
|
||||
propagatedBuildInputs =
|
||||
[ pyyaml types-pyyaml ];
|
||||
})
|
||||
(buildPythonApplication rec {
|
||||
pname = "ffpb";
|
||||
version = "0.4.1";
|
||||
src = fetchPypi {
|
||||
inherit pname version;
|
||||
sha256 = "sha256-7eVqbLpMHS1sBw2vYS4cTtyVdnnknGtEI8190VlXflk=";
|
||||
};
|
||||
doCheck = false;
|
||||
buildInputs = [ setuptools ];
|
||||
propagatedBuildInputs =
|
||||
[ tqdm ];
|
||||
})
|
||||
# (buildPythonApplication rec {
|
||||
# pname = "qbit_manage";
|
||||
# version = "4.0.3";
|
||||
# src = fetchPypi {
|
||||
# inherit pname version;
|
||||
# sha256 = "sha256-7eVqbLpMHS1sBw2vYS4cTtyVdnnknGtEI8190VlXflk=";
|
||||
# };
|
||||
# doCheck = true;
|
||||
# buildInputs = [ setuptools ];
|
||||
# propagatedBuildInputs =
|
||||
# [ gitpython requests retrying ruamel-yaml schedule unstable.qbittorrent-api ];
|
||||
# })
|
||||
#+end_src
|
||||
|
||||
** NODEJS PACKAGES
|
||||
Language servers and linters.
|
||||
|
||||
#+begin_src nix
|
||||
]) ++ (with pkgs.nodePackages; [
|
||||
# Language servers
|
||||
dockerfile-language-server-nodejs
|
||||
yaml-language-server
|
||||
bash-language-server
|
||||
vscode-json-languageserver
|
||||
pyright
|
||||
|
||||
markdownlint-cli # Linter
|
||||
prettier # Linter
|
||||
pnpm # Package manager
|
||||
#+end_src
|
||||
|
||||
** CLOSING USER PACKAGES
|
||||
|
||||
#+begin_src nix
|
||||
]); }; # <--- end of package list
|
||||
#+end_src
|
||||
|
||||
* HOME-MANAGER
|
||||
** HOME-MANAGER SETTINGS
|
||||
These make it so packages install to '/etc' rather than the user home directory,
|
||||
also allow for upgrades when rebuilding the system.
|
||||
|
||||
#+begin_src nix
|
||||
home-manager = {
|
||||
useUserPackages = true;
|
||||
useGlobalPkgs = true;
|
||||
users.jawz = { config, pkgs, ... }:{
|
||||
home.stateVersion = "${version}";
|
||||
#+end_src
|
||||
|
||||
** DOTFILES
|
||||
I opted out of using home-manager to declare my package environment, and instead
|
||||
I use it exclusively for setting up my dotfiles.
|
||||
|
||||
*** BASH
|
||||
Declares my .bashrc file, and sets up some environment and functions.
|
||||
|
||||
#+begin_src nix
|
||||
programs.bash = {
|
||||
enable = true;
|
||||
historyFile = "\${XDG_STATE_HOME}/bash/history";
|
||||
historyControl = [ "erasedups" "ignorespace" ];
|
||||
shellAliases = {
|
||||
hh = "hstr";
|
||||
ls = "eza --icons --group-directories-first";
|
||||
edit = "emacsclient -t";
|
||||
comic = "download -u jawz -i \"$(cat $LC | fzf --multi --exact -i)\"";
|
||||
gallery = "download -u jawz -i \"$(cat $LW | fzf --multi --exact -i)\"";
|
||||
cp = "cp -i";
|
||||
mv = "mv -i";
|
||||
mkcd = "mkdir -pv \"$1\" && cd \"$1\" || exit";
|
||||
mkdir = "mkdir -p";
|
||||
rm = "trash";
|
||||
".." = "cd ..";
|
||||
"..." = "cd ../..";
|
||||
".3" = "cd ../../..";
|
||||
".4" = "cd ../../../..";
|
||||
".5" = "cd ../../../../..";
|
||||
dl = "download -u jawz -i";
|
||||
e = "edit";
|
||||
c = "cat";
|
||||
f = "fzf --multi --exact -i";
|
||||
sc = "systemctl --user";
|
||||
jc = "journalctl --user -xefu";
|
||||
open-gallery = "cd /mnt/pool/scrapping/JawZ/gallery-dl &&
|
||||
xdg-open $(fd . ./ Husbands -tdirectory -d 1 | fzf -i)\"";
|
||||
unique-extensions = "fd -tf | rev | cut -d. -f1 | rev |
|
||||
tr '[:upper:]' '[:lower:]' | sort |
|
||||
uniq --count | sort -rn";
|
||||
};
|
||||
enableVteIntegration = true;
|
||||
initExtra = ''
|
||||
$HOME/.local/bin/pokemon-colorscripts -r --no-title
|
||||
# Lists
|
||||
list_root="${config.xdg.configHome}"/jawz/lists/jawz
|
||||
export LW=$list_root/watch.txt
|
||||
export LI=$list_root/instant.txt
|
||||
export LC=$list_root/comic.txt
|
||||
export command_timeout=30
|
||||
|
||||
if command -v fzf-share >/dev/null; then
|
||||
source "$(fzf-share)/key-bindings.bash"
|
||||
source "$(fzf-share)/completion.bash"
|
||||
fi
|
||||
|
||||
nixos-reload () {
|
||||
nixfmt /home/jawz/Development/NixOS/miniserver/*.nix
|
||||
sudo unbuffer nixos-rebuild switch -I nixos-config=/home/jawz/Development/NixOS/miniserver/configuration.nix |& nom
|
||||
}
|
||||
'';
|
||||
};
|
||||
#+end_src
|
||||
|
||||
*** XDG
|
||||
Configurations for XDG directories, as well as installing dotfiles from the
|
||||
sub-directory on this repository.
|
||||
|
||||
#+begin_src nix
|
||||
xdg = {
|
||||
enable = true;
|
||||
userDirs = {
|
||||
enable = true;
|
||||
createDirectories = false;
|
||||
desktop = "${config.home.homeDirectory}";
|
||||
documents = "${config.home.homeDirectory}/Documents";
|
||||
download = "${config.home.homeDirectory}/Downloads";
|
||||
music = "${config.home.homeDirectory}/Music";
|
||||
pictures = "${config.home.homeDirectory}/Pictures";
|
||||
templates = "${config.xdg.dataHome}/Templates";
|
||||
videos = "${config.home.homeDirectory}/Videos";
|
||||
};
|
||||
configFile = {
|
||||
"wgetrc".source = ../dotfiles/wget/wgetrc;
|
||||
"configstore/update-notifier-npm-check.json".source = ../dotfiles/npm/update-notifier-npm-check.json;
|
||||
"npm/npmrc".source = ../dotfiles/npm/npmrc;
|
||||
"gallery-dl/config.json".source = ../dotfiles/gallery-dl/config.json;
|
||||
"htop/htoprc".source = ../dotfiles/htop/htoprc;
|
||||
"python/pythonrc".source = ../dotfiles/pythonrc;
|
||||
"unpackerr.conf".source = ../dotfiles/unpackerr.conf;
|
||||
};
|
||||
};
|
||||
#+end_src
|
||||
|
||||
** HOME-MANAGER PROGRAMS
|
||||
Program declarations that are exclusive to home-manager, declaring packages this
|
||||
way allows for extra configuration and integration beyond installing the
|
||||
packages on the user environment, it's the only exception I make to installing
|
||||
packages through home-manager.
|
||||
|
||||
#+begin_src nix
|
||||
programs = {
|
||||
helix = {
|
||||
enable = true;
|
||||
};
|
||||
hstr.enable = true;
|
||||
emacs.enable = true;
|
||||
direnv = {
|
||||
enable = true;
|
||||
enableBashIntegration = true;
|
||||
nix-direnv.enable = true;
|
||||
};
|
||||
bat = {
|
||||
enable = true;
|
||||
config = {
|
||||
pager = "less -FR";
|
||||
theme = "base16";
|
||||
};
|
||||
extraPackages = with pkgs.bat-extras; [
|
||||
batman # man pages
|
||||
batpipe # piping
|
||||
batgrep # ripgrep
|
||||
batdiff # this is getting crazy!
|
||||
batwatch # probably my next best friend
|
||||
prettybat # trans your sourcecode!
|
||||
];
|
||||
};
|
||||
git = {
|
||||
enable = true;
|
||||
userName = "${myName}";
|
||||
userEmail = "${myEmail}";
|
||||
};
|
||||
htop = {
|
||||
enable = true;
|
||||
package = pkgs.htop-vim;
|
||||
};
|
||||
};
|
||||
#+end_src
|
||||
|
||||
** HOME-MANAGER USER-SERVICES
|
||||
Lorri helps optimize emacs compilations, and the declaring emacs as a service
|
||||
through home-manager fixes the bug where emacs loads so quickly that can not
|
||||
connect to a graphic environment unless restarting the systemd service.
|
||||
|
||||
#+begin_src nix
|
||||
services = {
|
||||
lorri.enable = true;
|
||||
emacs = {
|
||||
enable = true;
|
||||
defaultEditor = true;
|
||||
package = pkgs.emacs;
|
||||
startWithUserSession = "graphical";
|
||||
};
|
||||
};
|
||||
#+end_src
|
||||
|
||||
** CLOSING HOME-MANAGER
|
||||
|
||||
#+begin_src nix
|
||||
}; };
|
||||
#+end_src
|
||||
|
||||
* ENVIRONMENT
|
||||
These are a MUST to ensure the optimal function of nix, without these, recovery
|
||||
may be challenging.
|
||||
|
||||
The environment.etc block allows for bluetooth devices to control volume, pause,
|
||||
and other things through the headset controls.
|
||||
|
||||
Declare environment variables whose function is mostly to clear-up the $HOME
|
||||
directory from as much bloat as possible, as well as some minor graphical tweaks
|
||||
some applications use.
|
||||
|
||||
#+begin_src nix
|
||||
environment = {
|
||||
systemPackages = with pkgs; [
|
||||
wget
|
||||
jellyfin-ffmpeg # coolest video converter!
|
||||
mediainfo
|
||||
dlib
|
||||
fd
|
||||
ripgrep
|
||||
];
|
||||
variables = rec {
|
||||
# PATH
|
||||
XDG_CACHE_HOME = "\${HOME}/.cache";
|
||||
XDG_CONFIG_HOME = "\${HOME}/.config";
|
||||
XDG_BIN_HOME = "\${HOME}/.local/bin";
|
||||
XDG_DATA_HOME = "\${HOME}/.local/share";
|
||||
XDG_STATE_HOME = "\${HOME}/.local/state";
|
||||
|
||||
# DEV PATH
|
||||
CABAL_DIR = "${XDG_CACHE_HOME}/cabal";
|
||||
CARGO_HOME = "${XDG_DATA_HOME}/cargo";
|
||||
GEM_HOME = "${XDG_DATA_HOME}/ruby/gems";
|
||||
GEM_PATH = "${XDG_DATA_HOME}/ruby/gems";
|
||||
GEM_SPEC_CACHE = "${XDG_DATA_HOME}/ruby/specs";
|
||||
GOPATH = "${XDG_DATA_HOME}/go";
|
||||
NPM_CONFIG_USERCONFIG = "${XDG_CONFIG_HOME}/npm/npmrc";
|
||||
PNPM_HOME = "${XDG_DATA_HOME}/pnpm";
|
||||
PSQL_HISTORY="${XDG_DATA_HOME}/psql_history";
|
||||
REDISCLI_HISTFILE="${XDG_DATA_HOME}/redis/rediscli_history";
|
||||
WINEPREFIX="${XDG_DATA_HOME}/wine";
|
||||
PYTHONSTARTUP="${XDG_CONFIG_HOME}/python/pythonrc";
|
||||
STACK_ROOT="${XDG_DATA_HOME}/stack";
|
||||
|
||||
# OPTIONS
|
||||
HISTFILE = "${XDG_STATE_HOME}/bash/history";
|
||||
LESSHISTFILE = "-";
|
||||
GHCUP_USE_XDG_DIRS = "true";
|
||||
RIPGREP_CONFIG_PATH = "${XDG_CONFIG_HOME}/ripgrep/ripgreprc";
|
||||
ELECTRUMDIR = "${XDG_DATA_HOME}/electrum";
|
||||
VISUAL = "emacsclient -ca emacs";
|
||||
WGETRC = "${XDG_CONFIG_HOME}/wgetrc";
|
||||
XCOMPOSECACHE = "${XDG_CACHE_HOME}/X11/xcompose";
|
||||
"_JAVA_OPTIONS" = "-Djava.util.prefs.userRoot=${XDG_CONFIG_HOME}/java";
|
||||
DOCKER_CONFIG="${XDG_CONFIG_HOME}/docker";
|
||||
|
||||
# NVIDIA
|
||||
CUDA_CACHE_PATH = "${XDG_CACHE_HOME}/nv";
|
||||
|
||||
# Themes
|
||||
# WEBKIT_DISABLE_COMPOSITING_MODE = "1";
|
||||
CALIBRE_USE_SYSTEM_THEME = "1";
|
||||
|
||||
PATH = [
|
||||
"\${HOME}/.local/bin"
|
||||
"\${XDG_CONFIG_HOME}/emacs/bin"
|
||||
"\${XDG_DATA_HOME}/npm/bin"
|
||||
"\${XDG_DATA_HOME}/pnpm"
|
||||
];
|
||||
|
||||
# needed for tensorflow
|
||||
# CUDA_PATH = "${pkgs.cudatoolkit}";
|
||||
# # LD_LIBRARY_PATH = "${pkgs.linuxPackages.nvidia_x11}/lib:${pkgs.ncurses5}/lib";
|
||||
# EXTRA_LDFLAGS = "-L/lib -L${pkgs.linuxPackages.nvidia_x11}/lib";
|
||||
# EXTRA_CCFLAGS = "-I/usr/include";
|
||||
};
|
||||
};
|
||||
#+end_src
|
||||
|
||||
* PROGRAMS
|
||||
Some programs get enabled and installed through here, as well as the activation
|
||||
of some services.
|
||||
|
||||
#+begin_src nix
|
||||
programs = {
|
||||
starship.enable = true;
|
||||
tmux.enable = true;
|
||||
fzf.fuzzyCompletion = true;
|
||||
neovim = {
|
||||
enable = true;
|
||||
vimAlias = true;
|
||||
};
|
||||
gnupg.agent = {
|
||||
enable = true;
|
||||
enableSSHSupport = true;
|
||||
};
|
||||
};
|
||||
#+end_src
|
||||
|
||||
* SERVICES
|
||||
Miscellaneous services, managed by systemd.
|
||||
|
||||
- minidlna: allows me to watch my media on my TV.
|
||||
- avahi: allows to discover/connect to devices through their hostname on the
|
||||
same network.
|
||||
- fstrim/btrfs: file-system services.
|
||||
|
||||
#+begin_src nix
|
||||
services = {
|
||||
# minidlna = {
|
||||
# enable = true;
|
||||
# openFirewall = true;
|
||||
# settings = {
|
||||
# inotify = "yes";
|
||||
# media_dir = [
|
||||
# "/mnt/pool/glue"
|
||||
# ];
|
||||
# };
|
||||
# };
|
||||
avahi = {
|
||||
enable = true;
|
||||
nssmdns = true;
|
||||
};
|
||||
fstrim.enable = true;
|
||||
smartd.enable = true;
|
||||
btrfs.autoScrub = {
|
||||
enable = true;
|
||||
fileSystems = [
|
||||
"/"
|
||||
"/mnt/pool"
|
||||
];
|
||||
};
|
||||
openssh = {
|
||||
enable = true;
|
||||
openFirewall = true;
|
||||
startWhenNeeded = true;
|
||||
settings = {
|
||||
PasswordAuthentication = false;
|
||||
KbdInteractiveAuthentication = false;
|
||||
};
|
||||
};
|
||||
};
|
||||
#+end_src
|
||||
|
||||
* SYSTEMD
|
||||
Home-manager, is not as flushed out when it comes to creating systemd units, so
|
||||
the best way to define them for now, is using nix.
|
||||
|
||||
#+begin_src nix
|
||||
systemd = {
|
||||
packages = let
|
||||
pkgs = import (builtins.fetchTarball {
|
||||
url = "https://github.com/NixOS/nixpkgs/archive/9957cd48326fe8dbd52fdc50dd2502307f188b0d.tar.gz";
|
||||
}) {};
|
||||
|
||||
myPkg = pkgs.qbittorrent-nox;
|
||||
in [ myPkg ];
|
||||
services = {
|
||||
"qbittorrent-nox@jawz" = {
|
||||
enable = true;
|
||||
overrideStrategy = "asDropin";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
};
|
||||
};
|
||||
timers = {
|
||||
};
|
||||
user = {
|
||||
services = {
|
||||
"stream@" = {
|
||||
description = "monitors a stream channel for online streams.";
|
||||
restartIfChanged = true;
|
||||
wantedBy = [ "default.target" ];
|
||||
path = [
|
||||
pkgs.nix
|
||||
jawzStream
|
||||
];
|
||||
serviceConfig = {
|
||||
Restart = "on-failure";
|
||||
RestartSec = 30;
|
||||
ExecStart = "${jawzStream}/bin/stream-dl %I";
|
||||
};
|
||||
};
|
||||
unpackerr = {
|
||||
enable = true;
|
||||
restartIfChanged = true;
|
||||
description = "Run unpackerr";
|
||||
wantedBy = [ "default.target" ];
|
||||
serviceConfig = {
|
||||
Restart = "on-failure";
|
||||
RestartSec = 30;
|
||||
ExecStart = "${pkgs.unpackerr}/bin/unpackerr -c /home/jawz/.config/unpackerr.conf";
|
||||
};
|
||||
};
|
||||
# manage-library = {
|
||||
# enable = true;
|
||||
# restartIfChanged = true;
|
||||
# description = "Run the manage library bash script";
|
||||
# wantedBy = [ "default.target" ];
|
||||
# path = [
|
||||
# pkgs.bash
|
||||
# pkgs.nix
|
||||
# jawzManageLibrary
|
||||
# ];
|
||||
# serviceConfig = {
|
||||
# Restart = "on-failure";
|
||||
# RestartSec = 30;
|
||||
# ExecStart = "${jawzManageLibrary}/bin/manage-library";
|
||||
# };
|
||||
# };
|
||||
# tasks = {
|
||||
# restartIfChanged = true;
|
||||
# description = "Run a tasks script which keeps a lot of things organized";
|
||||
# wantedBy = [ "default.target" ];
|
||||
# path = [
|
||||
# pkgs.bash
|
||||
# pkgs.nix
|
||||
# jawzTasks
|
||||
# ];
|
||||
# serviceConfig = {
|
||||
# Restart = "on-failure";
|
||||
# RestartSec = 30;
|
||||
# ExecStart = "${jawzTasks}/bin/tasks";
|
||||
# };
|
||||
# };
|
||||
# qbit_manage = let qbit_dir = "/home/jawz/Development/Git/qbit_manage"; in {
|
||||
# restartIfChanged = true;
|
||||
# description = "Tidy up my torrents";
|
||||
# wantedBy = [ "default.target" ];
|
||||
# path = [
|
||||
# pkgs.python3
|
||||
# pkgs.pipenv
|
||||
# ];
|
||||
# serviceConfig = {
|
||||
# Restart = "on-failure";
|
||||
# RestartSec = 30;
|
||||
# ExecStart = "${qbit_dir}/.venv/bin/python3 ${qbit_dir}/qbit_manage.py -r -c ${qbit_dir}/config.yml";
|
||||
# };
|
||||
# };
|
||||
};
|
||||
timers = let
|
||||
streamTimer = {
|
||||
enable = true;
|
||||
description = "monitors a stream channel for online streams.";
|
||||
wantedBy = [ "timers.target" ];
|
||||
timerConfig = {
|
||||
OnBootSec = "5min";
|
||||
OnUnitActiveSec = "65min";
|
||||
RandomizedDelaySec = 30;
|
||||
};
|
||||
};
|
||||
in {
|
||||
"stream@johnneal911" = streamTimer // { };
|
||||
"stream@uk2011boy" = streamTimer // { };
|
||||
"stream@tomayto\\x20picarto" = streamTimer // { };
|
||||
"stream@retrohurricaneLIVE\\x20picarto" = streamTimer // { };
|
||||
# tasks = {
|
||||
# enable = true;
|
||||
# description = "Run a tasks script which keeps a lot of things organized";
|
||||
# wantedBy = [ "timers.target" ];
|
||||
# timerConfig = {
|
||||
# OnCalendar = "*:0/10";
|
||||
# };
|
||||
# };
|
||||
# manage-library = {
|
||||
# enable = true;
|
||||
# description = "Run the manage library bash script";
|
||||
# wantedBy = [ "timers.target" ];
|
||||
# timerConfig = {
|
||||
# OnCalendar = "00:30";
|
||||
# };
|
||||
# };
|
||||
# qbit_manage = {
|
||||
# enable = true;
|
||||
# description = "Tidy up my torrents";
|
||||
# wantedBy = [ "timers.target" ];
|
||||
# timerConfig = {
|
||||
# OnCalendar = "*:0/10";
|
||||
# };
|
||||
# };
|
||||
};
|
||||
};
|
||||
};
|
||||
#+end_src
|
||||
|
||||
* FONTCONFIG
|
||||
If enabled, a Fontconfig configuration file will point to a set of default
|
||||
fonts. If you don not care about running X11 applications or any other program
|
||||
that uses Fontconfig, you can turn this option off and prevent a dependency on
|
||||
all those fonts.
|
||||
=tip= once that Wayland is ready for deployment, I probably can remove this
|
||||
setting.
|
||||
|
||||
#+begin_src nix
|
||||
fonts.fontconfig.enable = true;
|
||||
#+end_src
|
||||
|
||||
* HARDWARE
|
||||
Computer-specific hardware settings. The power management settings default to
|
||||
"performance".
|
||||
|
||||
- nvidia: GPU drivers.
|
||||
- cpu.intel: microcode patches.
|
||||
|
||||
#+begin_src nix
|
||||
hardware = {
|
||||
cpu.intel.updateMicrocode = lib.mkDefault true;
|
||||
opengl = {
|
||||
enable = true;
|
||||
driSupport = true;
|
||||
driSupport32Bit = true;
|
||||
};
|
||||
};
|
||||
#+end_src
|
||||
|
||||
* CLOSE SYSTEM
|
||||
#+begin_src nix
|
||||
}
|
||||
#+end_src
|
||||
228
miniserver/docker.nix
Normal file
228
miniserver/docker.nix
Normal file
@ -0,0 +1,228 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
{
|
||||
environment.systemPackages = with pkgs; [ docker-compose ];
|
||||
virtualisation = let postgresSocket = "/run/postgresql";
|
||||
in {
|
||||
docker = {
|
||||
enable = true;
|
||||
enableNvidia = true;
|
||||
# dockerCompat = true;
|
||||
# defaultNetwork.settings.dns_enabled = true;
|
||||
autoPrune = {
|
||||
enable = true;
|
||||
flags = [ "--all" ];
|
||||
dates = "weekly";
|
||||
};
|
||||
};
|
||||
oci-containers = {
|
||||
backend = "docker";
|
||||
containers = {
|
||||
collabora = {
|
||||
autoStart = true;
|
||||
image = "collabora/code";
|
||||
imageFile = pkgs.dockerTools.pullImage {
|
||||
imageName = "collabora/code";
|
||||
imageDigest =
|
||||
"sha256:aab41379baf5652832e9237fcc06a768096a5a7fccc66cf8bd4fdb06d2cbba7f";
|
||||
sha256 = "sha256-M66lynhzaOEFnE15Sy1N6lBbGDxwNw6ap+IUJAvoCLs=";
|
||||
};
|
||||
ports = [ "9980:9980" ];
|
||||
environment = {
|
||||
TZ = "America/Mexico_City";
|
||||
domain = "cloud.servidos.lat";
|
||||
aliasgroup1 = "cloud.servidos.lat:443";
|
||||
aliasgroup2 = "cloud.rotehaare.art:443";
|
||||
dictionaries = "en_CA en_US es_MX es_ES fr_FR it pt_BR ru";
|
||||
extra_params = ''
|
||||
--o:ssl.enable=false
|
||||
--o:ssl.termination=true
|
||||
'';
|
||||
};
|
||||
extraOptions = [ "--cap-add" "MKNOD" ];
|
||||
};
|
||||
# metube = {
|
||||
# image = "ghcr.io/alexta69/metube";
|
||||
# ports = [ "8881:8081" ];
|
||||
# volumes = [
|
||||
# "/var/lib/docker-configs/metube:/downloads"
|
||||
# "/home/jawz/.local/share/cookies.txt:/cookies.txt"
|
||||
# ];
|
||||
# environment = {
|
||||
# TZ = "America/Mexico_City";
|
||||
# YTDL_OPTIONS = ''{"cookiefile":"/cookies.txt"}'';
|
||||
# };
|
||||
# };
|
||||
vocechat = {
|
||||
image = "privoce/vocechat-server:latest";
|
||||
ports = [ "3001:3000" ];
|
||||
volumes =
|
||||
[ "/var/lib/docker-configs/vocechat:/home/vocechat-server/data" ];
|
||||
environment = { TZ = "America/Mexico_City"; };
|
||||
};
|
||||
ryot = {
|
||||
image = "ghcr.io/ignisda/ryot:latest";
|
||||
ports = [ "8765:8000" ];
|
||||
environment = {
|
||||
TZ = "America/Mexico_City";
|
||||
DATABASE_URL = "postgres:///ryot?host=${postgresSocket}";
|
||||
SERVER_INSECURE_COOKIE = "true";
|
||||
VIDEO_GAMES_TWITCH_CLIENT_ID = "tfu0hw0zbdbu4lco4h72nqkb8krxp9";
|
||||
VIDEO_GAMES_TWITCH_CLIENT_SECRET = "582ecfb01ihv6wnt8zbc9pf3hs9p54";
|
||||
};
|
||||
volumes = [ "${postgresSocket}:${postgresSocket}" ];
|
||||
labels = {
|
||||
"flame.type" = "application";
|
||||
"flame.name" = "Ryot";
|
||||
"flame.url" = "tracker.servidos.lat";
|
||||
"flame.icon" = "radar";
|
||||
};
|
||||
};
|
||||
multi-scrobbler = {
|
||||
image = "foxxmd/multi-scrobbler";
|
||||
ports = [ "9078:9078" ];
|
||||
environment = {
|
||||
TZ = "America/Mexico_City";
|
||||
PUID = "1000";
|
||||
PGID = "100";
|
||||
BASE_URL = "https://scrobble.servidos.lat";
|
||||
# JELLYFIN_USER = "jawz";
|
||||
# JELLYFIN_SERVER = "DaniloFlix";
|
||||
DEEZER_CLIENT_ID = "657431";
|
||||
DEEZER_CLIENT_SECRET = "cb2ad03682dd5a55dfef857388ef181e";
|
||||
DEEZER_REDIRECT_URI = "http://192.168.1.69:9078/deezer/callback";
|
||||
MALOJA_URL = "https://maloja.servidos.lat";
|
||||
MALOJA_API_KEY =
|
||||
"LsnY2Ed484JlzUmF6EwhpGJ0gUCjJ2G5s1oJTwALJN8w1N3K6eXpfjBQp3raNPLA";
|
||||
WS_ENABLE = "true";
|
||||
};
|
||||
volumes = [ "/var/lib/docker-configs/multi-scrobbler:/config" ];
|
||||
labels = {
|
||||
"flame.type" = "application";
|
||||
"flame.name" = "Multi-scrobbler";
|
||||
"flame.url" = "scrobble.servidos.lat";
|
||||
"flame.icon" = "broadcast";
|
||||
};
|
||||
};
|
||||
maloja = {
|
||||
image = "krateng/maloja";
|
||||
ports = [ "42010:42010" ];
|
||||
environment = {
|
||||
TZ = "America/Mexico_City";
|
||||
MALOJA_TIMEZONE = "-6";
|
||||
PUID = "1000";
|
||||
PGID = "100";
|
||||
MALOJA_DATA_DIRECTORY = "/mljdata";
|
||||
MALOJA_SKIP_SETUP = "true";
|
||||
MALOJA_FORCE_PASSWORD = "chichis";
|
||||
};
|
||||
volumes = [ "/var/lib/docker-configs/maloja:/mljdata" ];
|
||||
labels = {
|
||||
"flame.type" = "application";
|
||||
"flame.name" = "Maloja";
|
||||
"flame.url" = "maloja.servidos.lat";
|
||||
"flame.icon" = "bookmark-music";
|
||||
};
|
||||
};
|
||||
# flaresolverr = {
|
||||
# autoStart = true;
|
||||
# image = "ghcr.io/flaresolverr/flaresolverr:latest";
|
||||
# ports = [ "8191:8191" ];
|
||||
# };
|
||||
flame = {
|
||||
autoStart = true;
|
||||
image = "pawelmalak/flame";
|
||||
ports = [ "5005:5005" ];
|
||||
volumes = [
|
||||
"/var/lib/docker-configs/flame:/app/data"
|
||||
"/var/run/docker.sock:/var/run/docker.sock"
|
||||
];
|
||||
environment = {
|
||||
TZ = "America/Mexico_City";
|
||||
PUID = "1000";
|
||||
PGID = "100";
|
||||
PASSWORD = "RkawpqMc8lR56QyU7JSfiLhG";
|
||||
};
|
||||
};
|
||||
flame-nsfw = {
|
||||
autoStart = true;
|
||||
image = "pawelmalak/flame";
|
||||
ports = [ "5007:5005" ];
|
||||
volumes = [ "/var/lib/docker-configs/flame-nsfw:/app/data" ];
|
||||
environment = {
|
||||
TZ = "America/Mexico_City";
|
||||
PUID = "1000";
|
||||
PGID = "100";
|
||||
PASSWORD = "RkawpqMc8lR56QyU7JSfiLhG";
|
||||
};
|
||||
};
|
||||
# lidarr = {
|
||||
# autoStart = true;
|
||||
# image = "lscr.io/linuxserver/lidarr:latest";
|
||||
# ports = [ "8686:8686" ];
|
||||
# environment = {
|
||||
# TZ = "America/Mexico_City";
|
||||
# PUID = "1000";
|
||||
# PGID = "100";
|
||||
# };
|
||||
# volumes = [
|
||||
# "/mnt/pool/multimedia:/data"
|
||||
# "/mnt/pool/multimedia/media/Music:/music"
|
||||
# "/mnt/pool/multimedia/media/MusicVideos:/music-videos"
|
||||
# "/var/lib/docker-configs/lidarr/files:/config"
|
||||
# "/var/lib/docker-configs/lidarr/custom-services.d:/custom-services.d"
|
||||
# "/var/lib/docker-configs/lidarr/custom-cont-init.d:/custom-cont-init.d"
|
||||
# ];
|
||||
# labels = {
|
||||
# "flame.type" = "application";
|
||||
# "flame.name" = "Lidarr";
|
||||
# "flame.url" = "music.servidos.lat";
|
||||
# "flame.icon" = "music";
|
||||
# };
|
||||
# };
|
||||
mealie = {
|
||||
autoStart = true;
|
||||
image = "ghcr.io/mealie-recipes/mealie:v1.4.0";
|
||||
ports = [ "9925:9000" ];
|
||||
volumes = [ "/var/lib/docker-configs/mealie:/app/data/" ];
|
||||
environment = {
|
||||
TZ = "America/Mexico_City";
|
||||
ALLOW_SIGNUP = "true";
|
||||
PUID = "1000";
|
||||
PGID = "100";
|
||||
MAX_WORKERS = "1";
|
||||
WEB_CONCURRENCY = "1";
|
||||
BASE_URL = "https://mealie.servidos.lat";
|
||||
SMTP_HOST = "smtp.gmail.com";
|
||||
SMTP_PORT = "587";
|
||||
SMTP_FROM_EMAIL = "stunner6399@gmail.com";
|
||||
SMTP_USER = "stunner6399@gmail.com";
|
||||
SMTP_PASSWORD = "ywofhisexfawslob";
|
||||
};
|
||||
extraOptions = [
|
||||
"--memory=1g" # VA-API (omit for NVENC)
|
||||
];
|
||||
labels = {
|
||||
"flame.type" = "application";
|
||||
"flame.name" = "Mealie";
|
||||
"flame.url" = "mealie.servidos.lat";
|
||||
"flame.icon" = "fridge";
|
||||
};
|
||||
};
|
||||
go-vod = {
|
||||
autoStart = true;
|
||||
image = "radialapps/go-vod";
|
||||
environment = {
|
||||
TZ = "America/Mexico_City";
|
||||
NEXTCLOUD_HOST = "https://${config.services.nextcloud.hostName}";
|
||||
NVIDIA_VISIBLE_DEVICES = "all";
|
||||
};
|
||||
volumes = [ "ncdata:/var/www/html:ro" ];
|
||||
extraOptions = [
|
||||
"--device=/dev/dri" # VA-API (omit for NVENC)
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
228
miniserver/dotfiles/gallery-dl/config.json
Normal file
228
miniserver/dotfiles/gallery-dl/config.json
Normal file
@ -0,0 +1,228 @@
|
||||
{
|
||||
"extractor": {
|
||||
"skip": "abort:5",
|
||||
"cookies": ["firefox", "yw8fhvh4.default-release", "gnomekeyring"],
|
||||
"user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36",
|
||||
"retries": 10,
|
||||
"sleep-request": 0,
|
||||
"directlink": {
|
||||
"directory": [],
|
||||
"filename": "{filename}.{extension}"
|
||||
},
|
||||
"twitter": {
|
||||
"skip": "abort:1",
|
||||
"directory": ["{user[name]}"],
|
||||
"retweets": false,
|
||||
"videos": true,
|
||||
"logout": true
|
||||
},
|
||||
"flickr": {
|
||||
"directory": ["{category}", "{owner[username]}"],
|
||||
"size-max": "Original",
|
||||
"access-token": "72157720849409732-e83af94a8ca145aa",
|
||||
"access-token-secret": "0c7e86529694756a"
|
||||
},
|
||||
"pinterest": {
|
||||
"directory": ["{board[owner][username]}", "{board[name]}"]
|
||||
},
|
||||
"wikifeet": {
|
||||
"page-reverse": true,
|
||||
"directory": ["{category}", "{celebrity}"]
|
||||
},
|
||||
"instagram": {
|
||||
"sleep-request": "25-45",
|
||||
"sleep": "25-45",
|
||||
"cookies": "$HOME/cookies.txt",
|
||||
"directory": ["{username}"],
|
||||
"parent-directory": true,
|
||||
"highlights": {
|
||||
"reverse": "true",
|
||||
"directory": ["{username}"]
|
||||
},
|
||||
"stories": {
|
||||
"reverse": "true",
|
||||
"directory": ["{username}"]
|
||||
},
|
||||
"tagged": {
|
||||
"directory": ["{tagged_username}", "tagged"]
|
||||
}
|
||||
},
|
||||
"kemonoparty": {
|
||||
"directory": ["{category}", "{user}"],
|
||||
"retries": 10,
|
||||
"timeout": 5,
|
||||
"filename": "{id}_{filename}.{extension}"
|
||||
},
|
||||
"exhentai": {
|
||||
"directory": ["{category}", "{title}"]
|
||||
},
|
||||
"tumblr": {
|
||||
"directory": ["{blog_name}"],
|
||||
"access-token": "WTt2nJdHLJAOQMpTbnMBGYqeJwoBeY2HDRztDPjf4HnqJ65rnT",
|
||||
"access-token-secret": "0mI7ZWmD9CJPrQ1jjXvMGLjvJa44kOtgcKHtwz8LsAVDcODMPi",
|
||||
"external": true,
|
||||
"inline": true,
|
||||
"posts": "all",
|
||||
"reblogs": false,
|
||||
"parent-directory": true,
|
||||
"api-key": "uhBUtgPaX9gl7eaD8suGWW6ZInRedQoVT6xsZzopljy0jXHqm5",
|
||||
"api-secret": "D3FDj1INyPzXikVpp4jmzSqjlC9czFUQ8oj2I883PSYJdqwURv"
|
||||
},
|
||||
"deviantart": {
|
||||
"client-id": "20016",
|
||||
"client-secret": "52e1f9b0cb26e673da36f69e2ddd0e9a",
|
||||
"refresh-token": "cc862526cb515d82e750c099aa7f32a29087c961",
|
||||
"directory": ["{username}"],
|
||||
"include": "gallery,scraps",
|
||||
"flat": true,
|
||||
"original": true,
|
||||
"mature": true,
|
||||
"auto-watch": true,
|
||||
"auto-unwatch": true
|
||||
},
|
||||
"furaffinity": {
|
||||
"directory": ["{user}", "{subcategory}"],
|
||||
"include": ["scraps", "gallery"]
|
||||
},
|
||||
"patreon": {
|
||||
"directory": [
|
||||
"(Patreon) {creator[vanity]}",
|
||||
"({date:%Y%m%d}) {title} ({id})"
|
||||
],
|
||||
"filename": "{filename}.{num}.{extension}",
|
||||
"browser": "firefox"
|
||||
},
|
||||
"blogger": {
|
||||
"directory": [
|
||||
"{blog[name]}",
|
||||
"{post[author]}",
|
||||
"{post[title]} - [{post[id]}]"
|
||||
],
|
||||
"filename": "{filename} - {num}.{extension}"
|
||||
},
|
||||
"artstation": {
|
||||
"directory": ["{userinfo[username]}"],
|
||||
"external": true
|
||||
},
|
||||
"gfycat": {
|
||||
"format": "webm"
|
||||
},
|
||||
"reddit": {
|
||||
"user-agent": "Python:gallery-dl:v1.0 (by /u/captainjawz)",
|
||||
"client-id": "T7nZ6WZ3_onJWBhLP8r08g",
|
||||
"refresh-token": "184157546842-bkMXgGYWzkwGSgXTeC8mMmaDZouhUQ",
|
||||
"directory": ["{author}"],
|
||||
"parent-directory": true
|
||||
},
|
||||
"redgifs": {
|
||||
"reverse": "true",
|
||||
"directory": ["{userName}"]
|
||||
},
|
||||
"imgur": {
|
||||
"mp4": true
|
||||
},
|
||||
"paheal": {
|
||||
"directory": ["Husbands", "{search_tags}"]
|
||||
},
|
||||
"rule34": {
|
||||
"directory": ["Husbands", "{search_tags}"]
|
||||
},
|
||||
"e621": {
|
||||
"directory": ["Husbands", "{search_tags}"]
|
||||
},
|
||||
"baraag": {
|
||||
"directory": ["{account[username]}"]
|
||||
},
|
||||
"pixiv": {
|
||||
"refresh-token": "O4kc9tTzGItuuacDcfmevW6NELjm5CJdWiAbZdUv3Kk",
|
||||
"directory": ["{user[account]} - {user[id]}"],
|
||||
"ugoira": true,
|
||||
"favorite": {
|
||||
"directory": [
|
||||
"{user_bookmark[account]} - {user_bookmark[id]}",
|
||||
"Bookmarks"
|
||||
]
|
||||
},
|
||||
"postprocessors": [
|
||||
{
|
||||
"name": "ugoira",
|
||||
"extension": "webm",
|
||||
"keep-files": false,
|
||||
"whitelist": ["pixiv"],
|
||||
"ffmpeg-twopass": true,
|
||||
"ffmpeg-args": ["-c:v", "libvpx", "-crf", "4", "-b:v", "5000k", "-an"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"fanbox": {
|
||||
"directory": ["{category}", "{creatorId}"],
|
||||
"embeds": true
|
||||
},
|
||||
"readcomiconline": {
|
||||
"chapter-reverse": true,
|
||||
"directory": ["Comics", "{comic}", "{comic} #{issue}"],
|
||||
"quality": "hq",
|
||||
"captcha": "wait",
|
||||
"postprocessors": ["cbz"]
|
||||
},
|
||||
"kissmanga": {
|
||||
"chapter-reverse": true,
|
||||
"directory": ["Manga", "{manga}", "{manga} Ch.{chapter}{chapter_minor}"],
|
||||
"captcha": "wait",
|
||||
"postprocessors": ["cbz"]
|
||||
},
|
||||
"mangahere": {
|
||||
"chapter-reverse": true,
|
||||
"directory": ["Manga", "{manga}", "{manga} Ch.{chapter}{chapter_minor}"],
|
||||
"postprocessors": ["cbz"]
|
||||
},
|
||||
"mangadex": {
|
||||
"chapter-reverse": true,
|
||||
"chapter-filter": "lang == 'en'",
|
||||
"directory": ["Manga", "{manga}", "{manga} Ch.{chapter}{chapter_minor}"],
|
||||
"postprocessors": ["cbz"]
|
||||
},
|
||||
"mangareader": {
|
||||
"chapter-reverse": true,
|
||||
"directory": ["Manga", "{manga}", "{manga} Ch.{chapter}{chapter_minor}"],
|
||||
"postprocessors": ["cbz"]
|
||||
},
|
||||
"mangapanda": {
|
||||
"chapter-reverse": true,
|
||||
"directory": ["Manga", "{manga}", "{manga} Ch.{chapter}{chapter_minor}"],
|
||||
"postprocessors": ["cbz"]
|
||||
},
|
||||
"webtoons": {
|
||||
"chapter-reverse": true,
|
||||
"directory": ["Webtoons", "{comic}", "{comic} #{episode}"],
|
||||
"postprocessors": ["cbz"]
|
||||
}
|
||||
},
|
||||
"output": {
|
||||
"mode": "auto"
|
||||
},
|
||||
"downloader": {
|
||||
"part": true,
|
||||
"part-directory": "/home/jawz/.cache/gallery-dl",
|
||||
"ytdl": {
|
||||
"logging": true,
|
||||
"format": "bestvideo+bestaudio/best",
|
||||
"module": "yt_dlp",
|
||||
"forward-cookies": true
|
||||
},
|
||||
"http": {
|
||||
"rate": null,
|
||||
"retries": 5,
|
||||
"timeout": 10.0,
|
||||
"verify": true
|
||||
}
|
||||
},
|
||||
"postprocessor": {
|
||||
"cbz": {
|
||||
"name": "zip",
|
||||
"compression": "store",
|
||||
"mode": "safe",
|
||||
"extension": "cbz"
|
||||
}
|
||||
}
|
||||
}
|
||||
10
miniserver/dotfiles/gopass/config.yml
Normal file
10
miniserver/dotfiles/gopass/config.yml
Normal file
@ -0,0 +1,10 @@
|
||||
autoclip: true
|
||||
autoimport: false
|
||||
cliptimeout: 45
|
||||
exportkeys: false
|
||||
nopager: false
|
||||
notifications: false
|
||||
parsing: true
|
||||
path: /home/jawz/.local/share/pass
|
||||
safecontent: true
|
||||
mounts: {}
|
||||
61
miniserver/dotfiles/htop/htoprc
Normal file
61
miniserver/dotfiles/htop/htoprc
Normal file
@ -0,0 +1,61 @@
|
||||
# Beware! This file is rewritten by htop when settings are changed in the interface.
|
||||
# The parser is also very primitive, and not human-friendly.
|
||||
htop_version=3.2.1
|
||||
config_reader_min_version=3
|
||||
fields=18 0 123 124 46 47 38 50 1
|
||||
hide_kernel_threads=0
|
||||
hide_userland_threads=0
|
||||
shadow_other_users=0
|
||||
show_thread_names=0
|
||||
show_program_path=0
|
||||
highlight_base_name=1
|
||||
highlight_deleted_exe=1
|
||||
highlight_megabytes=1
|
||||
highlight_threads=1
|
||||
highlight_changes=0
|
||||
highlight_changes_delay_secs=5
|
||||
find_comm_in_cmdline=1
|
||||
strip_exe_from_cmdline=1
|
||||
show_merged_command=1
|
||||
header_margin=1
|
||||
screen_tabs=1
|
||||
detailed_cpu_time=0
|
||||
cpu_count_from_one=1
|
||||
show_cpu_usage=1
|
||||
show_cpu_frequency=1
|
||||
show_cpu_temperature=1
|
||||
degree_fahrenheit=0
|
||||
update_process_names=0
|
||||
account_guest_in_cpu_meter=0
|
||||
color_scheme=3
|
||||
enable_mouse=1
|
||||
delay=15
|
||||
hide_function_bar=0
|
||||
header_layout=two_67_33
|
||||
column_meters_0=LeftCPUs Swap Tasks NetworkIO Memory
|
||||
column_meter_modes_0=1 1 2 2 2
|
||||
column_meters_1=RightCPUs Hostname Uptime LoadAverage
|
||||
column_meter_modes_1=1 2 2 2
|
||||
tree_view=1
|
||||
sort_key=38
|
||||
tree_sort_key=0
|
||||
sort_direction=-1
|
||||
tree_sort_direction=1
|
||||
tree_view_always_by_pid=1
|
||||
all_branches_collapsed=1
|
||||
screen:Main=NICE PID COMM EXE PERCENT_CPU PERCENT_MEM M_VIRT NLWP Command
|
||||
.sort_key=M_VIRT
|
||||
.tree_sort_key=PID
|
||||
.tree_view=1
|
||||
.tree_view_always_by_pid=1
|
||||
.sort_direction=-1
|
||||
.tree_sort_direction=1
|
||||
.all_branches_collapsed=1
|
||||
screen:I/O=PID USER IO_PRIORITY IO_RATE IO_READ_RATE IO_WRITE_RATE PERCENT_SWAP_DELAY PERCENT_IO_DELAY Command
|
||||
.sort_key=IO_RATE
|
||||
.tree_sort_key=PID
|
||||
.tree_view=0
|
||||
.tree_view_always_by_pid=0
|
||||
.sort_direction=-1
|
||||
.tree_sort_direction=1
|
||||
.all_branches_collapsed=0
|
||||
7
miniserver/dotfiles/npm/npmrc
Normal file
7
miniserver/dotfiles/npm/npmrc
Normal file
@ -0,0 +1,7 @@
|
||||
user=0
|
||||
unsafe-perm=true
|
||||
prefix=${XDG_DATA_HOME}/npm
|
||||
cache=${XDG_CACHE_HOME}/npm
|
||||
tmp=${XDG_RUNTIME_DIR}/npm
|
||||
init-module=${XDG_CONFIG_HOME}/npm/config/npm-init.js
|
||||
store-dir=${XDG_DATA_HOME}/pnpm-store
|
||||
4
miniserver/dotfiles/npm/update-notifier-npm-check.json
Normal file
4
miniserver/dotfiles/npm/update-notifier-npm-check.json
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"optOut": false,
|
||||
"lastUpdateCheck": 1646662583446
|
||||
}
|
||||
17
miniserver/dotfiles/pythonrc
Normal file
17
miniserver/dotfiles/pythonrc
Normal file
@ -0,0 +1,17 @@
|
||||
import os
|
||||
import atexit
|
||||
import readline
|
||||
|
||||
history = os.path.join(os.environ['XDG_CACHE_HOME'], 'python_history')
|
||||
try:
|
||||
readline.read_history_file(history)
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
def write_history():
|
||||
try:
|
||||
readline.write_history_file(history)
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
atexit.register(write_history)
|
||||
1
miniserver/dotfiles/secrets/mailserver
Normal file
1
miniserver/dotfiles/secrets/mailserver
Normal file
@ -0,0 +1 @@
|
||||
b/run/current-system/sw/bin/bash5/BpvLE.0dXQuzNskhAD94U6zFCFvfhzqWJEiBi
|
||||
1
miniserver/dotfiles/wget/wgetrc
Normal file
1
miniserver/dotfiles/wget/wgetrc
Normal file
@ -0,0 +1 @@
|
||||
hsts-file = /home/jawz/.cache/wget-hsts
|
||||
155
miniserver/fstab.nix
Normal file
155
miniserver/fstab.nix
Normal file
@ -0,0 +1,155 @@
|
||||
{ config, lib, pkgs, modulesPath, ... }: {
|
||||
imports = [ (modulesPath + "/installer/scan/not-detected.nix") ];
|
||||
boot = {
|
||||
loader = {
|
||||
efi = {
|
||||
canTouchEfiVariables = true;
|
||||
efiSysMountPoint = "/boot/efi";
|
||||
};
|
||||
grub = {
|
||||
enable = true;
|
||||
device = "nodev";
|
||||
efiSupport = true;
|
||||
enableCryptodisk = true;
|
||||
};
|
||||
};
|
||||
initrd.luks.devices = {
|
||||
nvme = {
|
||||
device = "/dev/disk/by-uuid/30fd7d86-9bed-42a6-8a4e-a2ddb0031233";
|
||||
preLVM = true;
|
||||
};
|
||||
# disk1 = {
|
||||
# device = "/dev/disk/by-uuid/a9b0f346-7e38-40a6-baf6-3ad80cafc842";
|
||||
# preLVM = true;
|
||||
# };
|
||||
# disk2 = {
|
||||
# device = "/dev/disk/by-uuid/0ed12b83-4c56-4ba8-b4ea-75a9e927d771";
|
||||
# preLVM = true;
|
||||
# };
|
||||
# disk3 = {
|
||||
# device = "/dev/disk/by-uuid/8cd728f6-0d5b-4cea-8f7d-01aad11192c1";
|
||||
# preLVM = true;
|
||||
# };
|
||||
# disk4 = {
|
||||
# device = "/dev/disk/by-uuid/7fcac808-491f-4846-a4a9-a34cc77cb43d";
|
||||
# preLVM = true;
|
||||
# };
|
||||
};
|
||||
kernelModules = [ "kvm-intel" ];
|
||||
kernel.sysctl = {
|
||||
"vm.swappiness" = 80;
|
||||
"net.ipv6.conf.all.disable_ipv6" = 1;
|
||||
"net.ipv6.conf.lo.disable_ipv6" = 1;
|
||||
"net.ipv6.conf.default.disable_ipv6" = 1;
|
||||
};
|
||||
extraModulePackages = [ ];
|
||||
initrd = {
|
||||
availableKernelModules = [
|
||||
"xhci_pci"
|
||||
"ahci"
|
||||
"usbhid"
|
||||
"nvme"
|
||||
"usbhid"
|
||||
"usb_storage"
|
||||
"sd_mod"
|
||||
"sdhci_pci"
|
||||
];
|
||||
kernelModules = [ "kvm-intel" ];
|
||||
};
|
||||
};
|
||||
|
||||
fileSystems = {
|
||||
"/" = {
|
||||
device = "/dev/mapper/nvme";
|
||||
fsType = "btrfs";
|
||||
options = [
|
||||
"subvol=nix"
|
||||
"ssd"
|
||||
"compress=zstd:3"
|
||||
"x-systemd.device-timeout=0"
|
||||
"space_cache=v2"
|
||||
"commit=120"
|
||||
"datacow"
|
||||
"noatime"
|
||||
];
|
||||
};
|
||||
"/home" = {
|
||||
device = "/dev/mapper/nvme";
|
||||
fsType = "btrfs";
|
||||
options = [
|
||||
"subvol=home"
|
||||
"ssd"
|
||||
"compress=zstd:3"
|
||||
"x-systemd.device-timeout=0"
|
||||
"space_cache=v2"
|
||||
"commit=120"
|
||||
"datacow"
|
||||
];
|
||||
};
|
||||
# "/mnt/pool" = {
|
||||
# device = "/dev/disk/by-uuid/1e7cf787-e34d-4e3e-ac3c-0c07309dbd34";
|
||||
# fsType = "btrfs";
|
||||
# options = [
|
||||
# "subvol=@data"
|
||||
# "compress=zstd:3"
|
||||
# "space_cache=v2"
|
||||
# "commit=120"
|
||||
# "datacow"
|
||||
# ];
|
||||
# };
|
||||
"/boot" = {
|
||||
device = "/dev/disk/by-uuid/bf0aeb95-94cc-4377-b6e4-1dbb4958b334";
|
||||
fsType = "ext4";
|
||||
};
|
||||
"/boot/efi" = {
|
||||
device = "/dev/disk/by-uuid/0C7B-4D4C";
|
||||
fsType = "vfat";
|
||||
};
|
||||
"/var/lib/nextcloud/data" = {
|
||||
device = "/mnt/pool/nextcloud";
|
||||
options = [ "bind" ];
|
||||
depends = [ "/mnt/pool" ];
|
||||
};
|
||||
# "/mnt/jellyfin/media" = {
|
||||
# device = "/mnt/pool/multimedia/media";
|
||||
# options = [ "bind" "ro" ];
|
||||
# depends = [ "/mnt/pool" ];
|
||||
# };
|
||||
# NFS
|
||||
"/export/pool" = {
|
||||
device = "/mnt/pool";
|
||||
options = [ "bind" ];
|
||||
depends = [ "/mnt/pool" ];
|
||||
};
|
||||
"/export/jawz" = {
|
||||
device = "/home/jawz";
|
||||
options = [ "bind" ];
|
||||
depends = [ "/mnt/pool" ];
|
||||
};
|
||||
"/export/disks" = {
|
||||
device = "/mnt/disks";
|
||||
options = [ "bind" ];
|
||||
depends = [ "/mnt/disks" ];
|
||||
};
|
||||
};
|
||||
services.nfs = {
|
||||
server = {
|
||||
enable = true;
|
||||
exports = ''
|
||||
/export workstation(rw,fsid=0,no_subtree_check)
|
||||
/export/jawz workstation(rw,nohide,insecure,no_subtree_check)
|
||||
/export/disks workstation(rw,nohide,insecure,no_subtree_check)
|
||||
/export/pool workstation(rw,nohide,insecure,no_subtree_check)
|
||||
'';
|
||||
};
|
||||
};
|
||||
swapDevices = [{
|
||||
device = "/dev/nvme0n1p3";
|
||||
randomEncryption = {
|
||||
enable = true;
|
||||
cipher = "aes-xts-plain64";
|
||||
keySize = 512;
|
||||
sectorSize = 4096;
|
||||
};
|
||||
}];
|
||||
}
|
||||
37
miniserver/mail.nix
Normal file
37
miniserver/mail.nix
Normal file
@ -0,0 +1,37 @@
|
||||
{ config, pkgs, ... }:
|
||||
let
|
||||
version = "23.05";
|
||||
domain = "danilo-reyes.com";
|
||||
in {
|
||||
imports = [
|
||||
(builtins.fetchTarball {
|
||||
# Pick a release version you are interested in and set its hash, e.g.
|
||||
url =
|
||||
"https://gitlab.com/simple-nixos-mailserver/nixos-mailserver/-/archive/nixos-${version}/nixos-mailserver-nixos-${version}.tar.gz";
|
||||
# To get the sha256 of the nixos-mailserver tarball, we can use the nix-prefetch-url command:
|
||||
# release="nixos-23.05"; nix-prefetch-url "https://gitlab.com/simple-nixos-mailserver/nixos-mailserver/-/archive/${release}/nixos-mailserver-${release}.tar.gz" --unpack
|
||||
sha256 = "1ngil2shzkf61qxiqw11awyl81cr7ks2kv3r3k243zz7v2xakm5c";
|
||||
})
|
||||
];
|
||||
|
||||
mailserver = {
|
||||
enable = true;
|
||||
fqdn = "mail.${domain}";
|
||||
domains = [ domain ];
|
||||
|
||||
# A list of all login accounts. To create the password hashes, use
|
||||
# nix-shell -p mkpasswd --run 'mkpasswd -sm bcrypt'
|
||||
loginAccounts = {
|
||||
"contact@${domain}" = {
|
||||
hashedPasswordFile = ../dotfiles/secrets/mailserver;
|
||||
aliases = [ "jawz@${domain}" ];
|
||||
};
|
||||
};
|
||||
|
||||
# Use Let's Encrypt certificates. Note that this needs to set up a stripped
|
||||
# down nginx and opens port 80.
|
||||
certificateScheme = "acme-nginx";
|
||||
};
|
||||
security.acme.acceptTerms = true;
|
||||
security.acme.defaults.email = "contact@${domain}";
|
||||
}
|
||||
260
miniserver/nginx.nix
Normal file
260
miniserver/nginx.nix
Normal file
@ -0,0 +1,260 @@
|
||||
# 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, ... }:
|
||||
let
|
||||
localhost = "127.0.0.1";
|
||||
workstation = "192.168.1.64";
|
||||
domain = "servidos.lat";
|
||||
jellyfinPort = 8096;
|
||||
nextcloudPort = 80;
|
||||
collaboraPort = 9980;
|
||||
flamePort = 5005;
|
||||
secretFlamePort = 5007;
|
||||
lidarrPort = 8686;
|
||||
qbitPort = 9091;
|
||||
prowlarrPort = 9696;
|
||||
radarrPort = 7878;
|
||||
sonarrPort = 8989;
|
||||
mealiePort = 9925;
|
||||
ryotPort = 8765;
|
||||
scrobblePort = 9078;
|
||||
malojaPort = 42010;
|
||||
darkwirePort = 3001;
|
||||
jiraPort = 8091;
|
||||
metatubePort = 8881;
|
||||
bazarrPort = config.services.bazarr.listenPort;
|
||||
kavitaPort = config.services.kavita.port;
|
||||
vaultPort = config.services.vaultwarden.config.ROCKET_PORT;
|
||||
audiobookPort = config.services.audiobookshelf.port;
|
||||
microbinPort = config.services.microbin.settings.MICROBIN_PORT;
|
||||
in {
|
||||
services.nginx = {
|
||||
enable = true;
|
||||
clientMaxBodySize = "4096m";
|
||||
# recommendedTlsSettings = true;
|
||||
# recommendedGzipSettings = true;
|
||||
# recommendedOptimisation = true;
|
||||
sslCiphers = "AES256+EECDH:AES256+EDH:!aNULL";
|
||||
appendHttpConfig = ''
|
||||
# JELLYFIN
|
||||
proxy_cache_path /var/cache/nginx/jellyfin-videos levels=1:2 keys_zone=jellyfin-videos:100m inactive=90d max_size=35000m;
|
||||
proxy_cache_path /var/cache/nginx/jellyfin levels=1:2 keys_zone=jellyfin:100m max_size=15g inactive=30d use_temp_path=off;
|
||||
map $request_uri $h264Level { ~(h264-level=)(.+?)& $2; }
|
||||
map $request_uri $h264Profile { ~(h264-profile=)(.+?)& $2; }
|
||||
'';
|
||||
virtualHosts = let
|
||||
base = locations: {
|
||||
inherit locations;
|
||||
forceSSL = true;
|
||||
enableACME = true;
|
||||
http2 = true;
|
||||
};
|
||||
proxy = port:
|
||||
base { "/".proxyPass = "http://${localhost}:${toString (port)}/"; };
|
||||
proxyArr = port:
|
||||
proxy port // {
|
||||
extraConfig = ''
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Host $host;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection $http_connection;
|
||||
|
||||
proxy_redirect off;
|
||||
proxy_http_version 1.1;
|
||||
'';
|
||||
};
|
||||
in {
|
||||
# "movies.${domain}" = proxyArr radarrPort // { };
|
||||
# "indexer.${domain}" = proxyArr prowlarrPort // { };
|
||||
# "music.${domain}" = proxyArr lidarrPort // { };
|
||||
# "library.${domain}" = proxy kavitaPort // { };
|
||||
"start.${domain}" = proxy flamePort // { };
|
||||
# "subs.${domain}" = proxy bazarrPort // { };
|
||||
# "series.${domain}" = proxy sonarrPort // { };
|
||||
"vault.${domain}" = proxy vaultPort // { };
|
||||
"copy.${domain}" = proxy microbinPort // { };
|
||||
"mealie.${domain}" = proxy mealiePort // { };
|
||||
"tracker.${domain}" = proxy ryotPort // { };
|
||||
"scrobble.${domain}" = proxy scrobblePort // { };
|
||||
"maloja.${domain}" = proxy malojaPort // { };
|
||||
"jira.${domain}" = proxy jiraPort // { };
|
||||
"bajameesta.${domain}" = proxy metatubePort // { };
|
||||
"qampqwn4wprhqny8h8zj.${domain}" = proxy secretFlamePort // { };
|
||||
"xfwmrle6h6skqujbeizw.${domain}" = proxy qbitPort // { };
|
||||
"audiobooks.${domain}" = base {
|
||||
"/" = {
|
||||
proxyPass = "http://${localhost}:${toString (audiobookPort)}";
|
||||
extraConfig = ''
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
|
||||
proxy_http_version 1.1;
|
||||
|
||||
proxy_redirect http:// https://;
|
||||
'';
|
||||
};
|
||||
};
|
||||
"dontcancelmeplz.${domain}" = base {
|
||||
"/" = {
|
||||
proxyPass = "http://${localhost}:${toString (darkwirePort)}";
|
||||
proxyWebsockets = true;
|
||||
extraConfig = ''
|
||||
# Ensuring it can use websockets
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
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 http;
|
||||
proxy_redirect http:// $scheme://;
|
||||
|
||||
# The proxy must preserve the host because gotify verifies the host with the origin
|
||||
# for WebSocket connections
|
||||
proxy_set_header Host $host;
|
||||
|
||||
# These sets the timeout so that the websocket can stay alive
|
||||
proxy_connect_timeout 1m;
|
||||
proxy_send_timeout 1m;
|
||||
proxy_read_timeout 1m;
|
||||
'';
|
||||
};
|
||||
};
|
||||
"flix.${domain}" = {
|
||||
forceSSL = true;
|
||||
enableACME = true;
|
||||
http2 = true;
|
||||
extraConfig = ''
|
||||
# use a variable to store the upstream proxy
|
||||
# in this example we are using a hostname which is resolved via DNS
|
||||
# (if you aren't using DNS remove the resolver line and change the variable to point to an IP address
|
||||
resolver ${localhost} valid=30;
|
||||
|
||||
location = / {
|
||||
return 302 http://$host/web/;
|
||||
#return 302 https://$host/web/;
|
||||
}
|
||||
|
||||
location = /web/ {
|
||||
# Proxy main Jellyfin traffic
|
||||
proxy_pass http://${localhost}:${
|
||||
toString (jellyfinPort)
|
||||
}/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;
|
||||
}
|
||||
'';
|
||||
locations = {
|
||||
"/" = {
|
||||
proxyPass = "http://${localhost}:${toString (jellyfinPort)}";
|
||||
proxyWebsockets = true;
|
||||
};
|
||||
"/socket" = {
|
||||
proxyPass = "http://${localhost}:${toString (jellyfinPort)}";
|
||||
extraConfig = ''
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
'';
|
||||
};
|
||||
"~ /Items/(.*)/Images" = {
|
||||
proxyPass = "http://${localhost}:${toString (jellyfinPort)}";
|
||||
extraConfig = ''
|
||||
proxy_cache jellyfin;
|
||||
proxy_cache_revalidate on;
|
||||
proxy_cache_lock on;
|
||||
'';
|
||||
};
|
||||
"~* ^/Videos/(.*)/(?!live)" = {
|
||||
proxyPass = "http://${localhost}:${toString (jellyfinPort)}";
|
||||
extraConfig = ''
|
||||
# Set size of a slice (this amount will be always requested from the backend by nginx)
|
||||
# Higher value means more latency, lower more overhead
|
||||
# This size is independent of the size clients/browsers can request
|
||||
# slice 2m;
|
||||
|
||||
proxy_cache jellyfin-videos;
|
||||
proxy_cache_valid 200 206 301 302 30d;
|
||||
proxy_ignore_headers Expires Cache-Control Set-Cookie X-Accel-Expires;
|
||||
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
|
||||
proxy_connect_timeout 15s;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Connection "";
|
||||
# Transmit slice range to the backend
|
||||
proxy_set_header Range 2m;
|
||||
|
||||
# This saves bandwidth between the proxy and jellyfin, as a file is only downloaded one time instead of multiple times when multiple clients want to at the same time
|
||||
# The first client will trigger the download, the other clients will have to wait until the slice is cached
|
||||
# Esp. practical during SyncPlay
|
||||
proxy_cache_lock on;
|
||||
proxy_cache_lock_age 60s;
|
||||
|
||||
proxy_cache_key "jellyvideo$uri?MediaSourceId=$arg_MediaSourceId&VideoCodec=$arg_VideoCodec&AudioCodec=$arg_AudioCodec&AudioStreamIndex=$arg_AudioStreamIndex&VideoBitrate=$arg_VideoBitrate&AudioBitrate=$arg_AudioBitrate&SubtitleMethod=$arg_SubtitleMethod&TranscodingMaxAudioChannels=$arg_TranscodingMaxAudioChannels&RequireAvc=$arg_RequireAvc&SegmentContainer=$arg_SegmentContainer&MinSegments=$arg_MinSegments&BreakOnNonKeyFrames=$arg_BreakOnNonKeyFrames&h264-profile=$h264Profile&h264-level=$h264Level&slicerange=2m";
|
||||
|
||||
# add_header X-Cache-Status $upstream_cache_status; # This is only for debugging cache
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
${config.services.nextcloud.hostName} = {
|
||||
forceSSL = true;
|
||||
enableACME = true;
|
||||
http2 = true;
|
||||
serverAliases = [ "cloud.rotehaare.art" ];
|
||||
locations = {
|
||||
"/".proxyWebsockets = true;
|
||||
# uh, equals what?
|
||||
"~ ^/nextcloud/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|oc[ms]-provider/.+|.+/richdocumentscode/proxy).php(?:$|/)" =
|
||||
{ };
|
||||
};
|
||||
};
|
||||
|
||||
"collabora.${domain}" = let
|
||||
collaboraString = "http://${localhost}:${toString (collaboraPort)}";
|
||||
collaboraProxy = {
|
||||
proxyPass = collaboraString;
|
||||
extraConfig = ''
|
||||
proxy_set_header Host $host;
|
||||
'';
|
||||
};
|
||||
collaboraSocket = {
|
||||
proxyPass = collaboraString;
|
||||
extraConfig = ''
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header Host $host;
|
||||
proxy_read_timeout 36000s;
|
||||
'';
|
||||
};
|
||||
in base {
|
||||
# static files
|
||||
"^~ /loleaflet" = collaboraProxy;
|
||||
# WOPI discovery URL
|
||||
"^~ /hosting/discovery" = collaboraProxy;
|
||||
# Capabilities
|
||||
"^~ /hosting/capabilities" = collaboraProxy;
|
||||
# download, presentation, image upload and websocket
|
||||
"~ ^/lool" = collaboraSocket;
|
||||
# Admin Console websocket
|
||||
"^~ /lool/adminws" = collaboraSocket;
|
||||
};
|
||||
};
|
||||
};
|
||||
networking = {
|
||||
firewall = let open_firewall_ports = [ 80 443 ];
|
||||
in {
|
||||
enable = true;
|
||||
allowedTCPPorts = open_firewall_ports;
|
||||
allowedUDPPorts = open_firewall_ports;
|
||||
};
|
||||
};
|
||||
}
|
||||
83
miniserver/openldap.nix
Normal file
83
miniserver/openldap.nix
Normal file
@ -0,0 +1,83 @@
|
||||
# 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, ... }:
|
||||
|
||||
let hostname = "servidos.lat";
|
||||
in {
|
||||
services.openldap = {
|
||||
enable = true;
|
||||
|
||||
# enable plain and secure connections
|
||||
urlList = [ "ldap:///" "ldaps:///" ];
|
||||
|
||||
settings = {
|
||||
attrs = {
|
||||
olcLogLevel = "conns config";
|
||||
|
||||
# settings for acme ssl
|
||||
olcTLSCACertificateFile = "/var/lib/acme/${hostname}/full.pem";
|
||||
olcTLSCertificateFile = "/var/lib/acme/${hostname}/cert.pem";
|
||||
olcTLSCertificateKeyFile = "/var/lib/acme/${hostname}/key.pem";
|
||||
olcTLSCipherSuite = "HIGH:MEDIUM:+3DES:+RC4:+aNULL";
|
||||
olcTLSCRLCheck = "none";
|
||||
olcTLSVerifyClient = "never";
|
||||
olcTLSProtocolMin = "3.1";
|
||||
};
|
||||
|
||||
children = {
|
||||
"cn=schema".includes = [
|
||||
"${pkgs.openldap}/etc/schema/core.ldif"
|
||||
"${pkgs.openldap}/etc/schema/cosine.ldif"
|
||||
"${pkgs.openldap}/etc/schema/inetorgperson.ldif"
|
||||
];
|
||||
|
||||
"olcDatabase={1}mdb".attrs = {
|
||||
objectClass = [ "olcDatabaseConfig" "olcMdbConfig" ];
|
||||
|
||||
olcDatabase = "{1}mdb";
|
||||
olcDbDirectory = "/var/lib/openldap/data";
|
||||
|
||||
olcSuffix = "dc=example,dc=com";
|
||||
|
||||
# your admin account, do not use writeText on a production system
|
||||
olcRootDN = "cn=admin,dc=example,dc=com";
|
||||
olcRootPW.path = pkgs.writeText "olcRootPW" "pass";
|
||||
|
||||
olcAccess = [
|
||||
# custom access rules for userPassword attributes
|
||||
''
|
||||
{0}to attrs=userPassword
|
||||
by self write
|
||||
by anonymous auth
|
||||
by * none''
|
||||
|
||||
# allow read on anything else
|
||||
''
|
||||
{1}to *
|
||||
by * read''
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
# ensure openldap is launched after certificates are created
|
||||
systemd.services.openldap = {
|
||||
wants = [ "acme-${hostname}.service" ];
|
||||
after = [ "acme-${hostname}.service" ];
|
||||
};
|
||||
|
||||
# make acme certificates accessible by openldap
|
||||
security.acme.defaults.group = "certs";
|
||||
users.groups.certs.members = [ "openldap" ];
|
||||
|
||||
# trigger the actual certificate generation for your hostname
|
||||
security.acme.certs."${hostname}" = { extraDomainNames = [ ]; };
|
||||
|
||||
# example using hetzner dns to run letsencrypt verification
|
||||
security.acme.defaults.dnsProvider = "hetzner";
|
||||
security.acme.defaults.credentialsFile = pkgs.writeText "credentialsFile" ''
|
||||
HETZNER_API_KEY=<your-hetzner-dns-api-key>
|
||||
'';
|
||||
}
|
||||
336
miniserver/servers.nix
Normal file
336
miniserver/servers.nix
Normal file
@ -0,0 +1,336 @@
|
||||
{ config, lib, pkgs, modulesPath, ... }:
|
||||
let
|
||||
localhost = "127.0.0.1";
|
||||
postgresSocket = "/run/postgresql";
|
||||
unstable = import
|
||||
(builtins.fetchTarball "https://github.com/nixos/nixpkgs/tarball/master") {
|
||||
config = config.nixpkgs.config;
|
||||
};
|
||||
in {
|
||||
|
||||
imports = [ ./nginx.nix ];
|
||||
nixpkgs.config = {
|
||||
permittedInsecurePackages = [ "nodejs-14.21.3" "openssl-1.1.1v" ];
|
||||
};
|
||||
environment.systemPackages = with pkgs;
|
||||
[
|
||||
# Upgrades postgres
|
||||
(let
|
||||
# XXX specify the postgresql package you'd like to upgrade to.
|
||||
# Do not forget to list the extensions you need.
|
||||
newPostgres = pkgs.postgresql_16.withPackages (pp:
|
||||
[
|
||||
# pp.plv8
|
||||
]);
|
||||
in pkgs.writeScriptBin "upgrade-pg-cluster" ''
|
||||
set -eux
|
||||
# XXX it's perhaps advisable to stop all services that depend on postgresql
|
||||
systemctl stop postgresql
|
||||
|
||||
export NEWDATA="/var/lib/postgresql/${newPostgres.psqlSchema}"
|
||||
|
||||
export NEWBIN="${newPostgres}/bin"
|
||||
|
||||
export OLDDATA="${config.services.postgresql.dataDir}"
|
||||
export OLDBIN="${config.services.postgresql.package}/bin"
|
||||
|
||||
install -d -m 0700 -o postgres -g postgres "$NEWDATA"
|
||||
cd "$NEWDATA"
|
||||
sudo -u postgres $NEWBIN/initdb -D "$NEWDATA"
|
||||
|
||||
sudo -u postgres $NEWBIN/pg_upgrade \
|
||||
--old-datadir "$OLDDATA" --new-datadir "$NEWDATA" \
|
||||
--old-bindir $OLDBIN --new-bindir $NEWBIN \
|
||||
"$@"
|
||||
'')
|
||||
];
|
||||
users.groups = { piracy.gid = 985; };
|
||||
users.users = let base = { isSystemUser = true; };
|
||||
in {
|
||||
# # prowlarr = base // { group = "piracy"; };
|
||||
# # kavita = base // {
|
||||
# # group = "kavita";
|
||||
# # extraGroups = [ "piracy" ];
|
||||
# # };
|
||||
nextcloud = base // {
|
||||
extraGroups = [ "render" ];
|
||||
packages = (with pkgs; [
|
||||
nodejs
|
||||
(python3.withPackages (ps: with ps; [ tensorflow ]))
|
||||
perl
|
||||
(perlPackages.buildPerlPackage rec {
|
||||
pname = "Image-ExifTool";
|
||||
version = "12.70";
|
||||
src = fetchurl {
|
||||
url = "https://exiftool.org/Image-ExifTool-${version}.tar.gz";
|
||||
hash = "sha256-TLJSJEXMPj870TkExq6uraX8Wl4kmNerrSlX3LQsr/4=";
|
||||
};
|
||||
})
|
||||
]);
|
||||
};
|
||||
};
|
||||
programs = {
|
||||
msmtp = {
|
||||
enable = true;
|
||||
accounts.default = {
|
||||
auth = true;
|
||||
host = "smtp.gmail.com";
|
||||
port = 587;
|
||||
tls = true;
|
||||
from = "stunner6399@gmail.com";
|
||||
user = "stunner6399@gmail.com";
|
||||
password = "eqyctcgjdykqeuwt";
|
||||
};
|
||||
};
|
||||
};
|
||||
services = let
|
||||
base = {
|
||||
enable = true;
|
||||
group = "piracy";
|
||||
};
|
||||
in {
|
||||
# sonarr = base // { package = pkgs.sonarr; };
|
||||
# radarr = base // { package = pkgs.radarr; };
|
||||
# bazarr = base // { };
|
||||
jellyfin = base // { };
|
||||
# prowlarr.enable = true;
|
||||
# jira.enable = true;
|
||||
microbin = {
|
||||
enable = true;
|
||||
settings = {
|
||||
MICROBIN_HIDE_LOGO = false;
|
||||
MICROBIN_PORT = 8080;
|
||||
MICROBIN_HIGHLIGHTSYNTAX = true;
|
||||
MICROBIN_PRIVATE = true;
|
||||
MICROBIN_QR = true;
|
||||
MICROBIN_ENCRYPTION_CLIENT_SIDE = true;
|
||||
MICROBIN_ENCRYPTION_SERVER_SIDE = true;
|
||||
};
|
||||
};
|
||||
# audiobookshelf = {
|
||||
# enable = true;
|
||||
# group = "piracy";
|
||||
# port = 5687;
|
||||
# };
|
||||
# paperless = {
|
||||
# enable = true;
|
||||
# address = "0.0.0.0";
|
||||
# consumptionDirIsPublic = true;
|
||||
# consumptionDir = "/home/jawz/Backups/Scans";
|
||||
# extraConfig = {
|
||||
# PAPERLESS_DBENGINE = "postgress";
|
||||
# PAPERLESS_DBNAME = "paperless";
|
||||
# PAPERLESS_DBHOST = postgresSocket;
|
||||
# PAPERLESS_CONSUMER_IGNORE_PATTERN =
|
||||
# builtins.toJSON [ ".DS_STORE/*" "desktop.ini" ];
|
||||
# PAPERLESS_TIME_ZONE = "America/Mexico_City";
|
||||
# PAPERLESS_OCR_USER_ARGS = builtins.toJSON {
|
||||
# optimize = 1;
|
||||
# pdfa_image_compression = "lossless";
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
vaultwarden = {
|
||||
enable = true;
|
||||
dbBackend = "postgresql";
|
||||
package = pkgs.vaultwarden;
|
||||
config = {
|
||||
ROCKET_ADDRESS = "${localhost}";
|
||||
ROCKET_PORT = 8222;
|
||||
WEBSOCKET_PORT = 8333;
|
||||
ADMIN_TOKEN =
|
||||
"x9BLqz2QmnU5RmrMLt2kPpoPBTNPZxNFw/b8XrPgpQML2/01+MYENl87dmhDX+Jm";
|
||||
DATABASE_URL = "postgresql:///vaultwarden?host=${postgresSocket}";
|
||||
ENABLE_DB_WAL = false;
|
||||
WEBSOCKET_ENABLED = true;
|
||||
SHOW_PASSWORD_HINT = false;
|
||||
SIGNUPS_ALLOWED = false;
|
||||
EXTENDED_LOGGING = true;
|
||||
LOG_LEVEL = "warn";
|
||||
};
|
||||
};
|
||||
# kavita = {
|
||||
# enable = true;
|
||||
# tokenKeyFile = "${pkgs.writeText "kavitaToken"
|
||||
# "Au002BRkRxBjlQrmWSuXWTGUcpXZjzMo2nJ0Z4g4OZ1S4c2zp6oaesGUXzKp2mhvOwjju002BNoURG3CRIE2qnGybvOgAlDxAZCPBzSNRcx6RJ1lFRgvI8wQR6Nd5ivYX0RMo4S8yOH8XIDhzN6vNo31rCjyv2IycX0JqiJPIovfbvXn9Y="}";
|
||||
# };
|
||||
nextcloud = {
|
||||
enable = true;
|
||||
https = true;
|
||||
package = pkgs.nextcloud27;
|
||||
appstoreEnable = true;
|
||||
configureRedis = true;
|
||||
extraAppsEnable = true;
|
||||
enableImagemagick = true;
|
||||
maxUploadSize = "16G";
|
||||
hostName = "cloud.servidos.lat";
|
||||
config = {
|
||||
adminpassFile = "${pkgs.writeText "adminpass"
|
||||
"Overlying-Hatchback-Charting-Encounter-Deface-Gallantly7"}";
|
||||
overwriteProtocol = "https";
|
||||
defaultPhoneRegion = "MX";
|
||||
dbtype = "pgsql";
|
||||
dbhost = postgresSocket;
|
||||
dbtableprefix = "oc_";
|
||||
dbname = "nextcloud";
|
||||
trustedProxies = [ "nginx" ];
|
||||
extraTrustedDomains = [ "cloud.rotehaare.art" "danilo-reyes.com" ];
|
||||
};
|
||||
phpOptions = {
|
||||
catch_workers_output = "yes";
|
||||
display_errors = "stderr";
|
||||
error_reporting = "E_ALL & ~E_DEPRECATED & ~E_STRICT";
|
||||
expose_php = "Off";
|
||||
"opcache.enable_cli" = "1";
|
||||
"opcache.fast_shutdown" = "1";
|
||||
"opcache.interned_strings_buffer" = "16";
|
||||
"opcache.jit" = "1255";
|
||||
"opcache.jit_buffer_size" = "256M";
|
||||
"opcache.max_accelerated_files" = "10000";
|
||||
"opcache.huge_code_pages" = "1";
|
||||
"opcache.enable_file_override" = "1";
|
||||
"opcache.memory_consumption" = "128";
|
||||
"opcache.revalidate_freq" = "60";
|
||||
"opcache.save_comments" = "1";
|
||||
"opcache.validate_timestamps" = "0";
|
||||
"openssl.cafile" = "/etc/ssl/certs/ca-certificates.crt";
|
||||
short_open_tag = "Off";
|
||||
};
|
||||
extraOptions = {
|
||||
"allow_local_remote_servers" = true;
|
||||
mail_smtpmode = "sendmail";
|
||||
mail_sendmailmode = "pipe";
|
||||
"installed" = true;
|
||||
"memories.exiftool" = "/etc/profiles/per-user/nextcloud/bin/exiftool";
|
||||
enabledPreviewProviders = [
|
||||
"OC\\Preview\\Image"
|
||||
"OC\\Preview\\HEIC"
|
||||
"OC\\Preview\\TIFF"
|
||||
"OC\\Preview\\MKV"
|
||||
"OC\\Preview\\MP4"
|
||||
"OC\\Preview\\AVI"
|
||||
"OC\\Preview\\Movie"
|
||||
];
|
||||
};
|
||||
phpExtraExtensions = all: [ all.pdlib all.bz2 ];
|
||||
};
|
||||
postgresql = {
|
||||
enable = true;
|
||||
ensureDatabases = [ "jawz" "paperless" "nextcloud" "ryot" "vaultwarden" ];
|
||||
package = pkgs.postgresql_16;
|
||||
ensureUsers = [
|
||||
{
|
||||
name = "jawz";
|
||||
ensureDBOwnership = true;
|
||||
}
|
||||
{
|
||||
name = "nextcloud";
|
||||
ensureDBOwnership = true;
|
||||
}
|
||||
{
|
||||
name = "paperless";
|
||||
ensureDBOwnership = true;
|
||||
}
|
||||
{
|
||||
name = "ryot";
|
||||
ensureDBOwnership = true;
|
||||
}
|
||||
{
|
||||
name = "vaultwarden";
|
||||
ensureDBOwnership = true;
|
||||
}
|
||||
];
|
||||
authentication = pkgs.lib.mkOverride 10 ''
|
||||
local all all trust
|
||||
host all all ${localhost}/32 trust
|
||||
host all all ::1/128 trust
|
||||
'';
|
||||
};
|
||||
};
|
||||
systemd = {
|
||||
services = {
|
||||
# sub-sync = {
|
||||
# restartIfChanged = true;
|
||||
# description = "syncronizes subtitles downloaded & modified today";
|
||||
# wantedBy = [ "default.target" ];
|
||||
# path = [
|
||||
# pkgs.bash
|
||||
# pkgs.nix
|
||||
# jawzSubs
|
||||
# ];
|
||||
# serviceConfig = {
|
||||
# Restart = "on-failure";
|
||||
# RestartSec = 30;
|
||||
# ExecStart = "${jawzSubs}/bin/sub-sync all";
|
||||
# Type = "forking";
|
||||
# User = "root";
|
||||
# };
|
||||
# };
|
||||
nextcloud-cronjob = let
|
||||
jawzNextcloudCronjob = pkgs.writeScriptBin "nextcloud-cronjob"
|
||||
(builtins.readFile ../scripts/nextcloud-cronjob.sh);
|
||||
in {
|
||||
description = "Runs various nextcloud-related cronjobs";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
path = [ pkgs.bash jawzNextcloudCronjob ];
|
||||
serviceConfig = {
|
||||
Restart = "on-failure";
|
||||
RestartSec = 30;
|
||||
ExecStart = "${jawzNextcloudCronjob}/bin/nextcloud-cronjob";
|
||||
};
|
||||
};
|
||||
};
|
||||
timers = {
|
||||
nextcloud-cronjob = {
|
||||
enable = true;
|
||||
description = "Runs various nextcloud-related cronjobs";
|
||||
wantedBy = [ "timers.target" ];
|
||||
timerConfig = { OnCalendar = "*:0/10"; };
|
||||
};
|
||||
# sub-sync = {
|
||||
# enable = true;
|
||||
# description = "syncronizes subtitles downloaded & modified today";
|
||||
# wantedBy = [ "timers.target" ];
|
||||
# timerConfig = {
|
||||
# OnCalendar = "22:00";
|
||||
# };
|
||||
# };
|
||||
};
|
||||
user.services = {
|
||||
update-dns = let
|
||||
jawzUpdateDns = pkgs.writeScriptBin "update-dns"
|
||||
(builtins.readFile ../scripts/update-dns.sh);
|
||||
in {
|
||||
restartIfChanged = true;
|
||||
description = "update DNS of my websites";
|
||||
wantedBy = [ "default.target" ];
|
||||
path = [ pkgs.bash pkgs.nix jawzUpdateDns ];
|
||||
serviceConfig = {
|
||||
Restart = "on-failure";
|
||||
RestartSec = 30;
|
||||
ExecStart = "${jawzUpdateDns}/bin/update-dns";
|
||||
};
|
||||
};
|
||||
};
|
||||
user.timers = {
|
||||
update-dns = {
|
||||
enable = true;
|
||||
description = "update DNS of my websites";
|
||||
wantedBy = [ "timers.target" ];
|
||||
timerConfig = {
|
||||
OnBootSec = "1min";
|
||||
OnUnitActiveSec = "30m";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
networking = {
|
||||
firewall = let open_firewall_ports = [ config.services.paperless.port ];
|
||||
in {
|
||||
enable = true;
|
||||
allowedTCPPorts = open_firewall_ports;
|
||||
allowedUDPPorts = open_firewall_ports;
|
||||
};
|
||||
};
|
||||
}
|
||||
@ -291,6 +291,7 @@ users.users.jawz = {
|
||||
authorizedKeys.keys = [
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB5GaQM4N+yGAByibOFQOBVMV/6TjOfaGIP+NunMiK76 gpodeacero\cdreyes@100CDREYES"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIH2wtsaMvfEUm//2YnFHyrc16o+TOXXBfIGPJ9nL8RMp jawz@workstation"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGjnNIggZweJ+GJKKvFEPhpLcs+t64xXjBmeuERsLFLL jawz@miniserver"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINBEblxSDhWPEo33crSjooeUg4W02ruENxHLmmBqCuIo jawz@galaxy"
|
||||
];
|
||||
};
|
||||
|
||||
@ -363,6 +363,7 @@ users = {
|
||||
authorizedKeys.keys = [
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB5GaQM4N+yGAByibOFQOBVMV/6TjOfaGIP+NunMiK76 gpodeacero\cdreyes@100CDREYES"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMkpeIV9G26W2/e9PsjBx3sNwPGoicJ807ExRGh4KjhW jawz@server"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGjnNIggZweJ+GJKKvFEPhpLcs+t64xXjBmeuERsLFLL jawz@miniserver"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINBEblxSDhWPEo33crSjooeUg4W02ruENxHLmmBqCuIo jawz@galaxy"
|
||||
];
|
||||
};
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user