Compare commits
4 Commits
update-fla
...
121d5ed892
| Author | SHA1 | Date | |
|---|---|---|---|
| 121d5ed892 | |||
| 2a4b19a048 | |||
| acbda5c4c9 | |||
| 5c37ad035c |
60
flake.lock
generated
60
flake.lock
generated
@@ -76,11 +76,11 @@
|
||||
},
|
||||
"locked": {
|
||||
"dir": "pkgs/firefox-addons",
|
||||
"lastModified": 1774065775,
|
||||
"narHash": "sha256-anJXbdfZMhXWjHSfB5v6e8+yv1ASTHM4TwikH8tloMI=",
|
||||
"lastModified": 1773201798,
|
||||
"narHash": "sha256-TZQwHvIBz9hr/fci/G/AIjPSKCMtxQm/xFm3MNJ/mVg=",
|
||||
"owner": "rycee",
|
||||
"repo": "nur-expressions",
|
||||
"rev": "4b3bbb9dc3c80d1b62228c9a2ca0bef74a24a192",
|
||||
"rev": "016edd132727d8ac364454a6b443ef46c2d1c7e4",
|
||||
"type": "gitlab"
|
||||
},
|
||||
"original": {
|
||||
@@ -242,11 +242,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1774007980,
|
||||
"narHash": "sha256-FOnZjElEI8pqqCvB6K/1JRHTE8o4rer8driivTpq2uo=",
|
||||
"lastModified": 1773179137,
|
||||
"narHash": "sha256-EdW2bwzlfme0vbMOcStnNmKlOAA05Bp6su2O8VLGT0k=",
|
||||
"owner": "nix-community",
|
||||
"repo": "home-manager",
|
||||
"rev": "9670de2921812bc4e0452f6e3efd8c859696c183",
|
||||
"rev": "3f98e2bbc661ec0aaf558d8a283d6955f05f1d09",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -283,11 +283,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1773993211,
|
||||
"narHash": "sha256-4J6vEtf7dIw3pZ/xM/dU7ECTmr8AsIIUQJba1B8wp5k=",
|
||||
"lastModified": 1771502235,
|
||||
"narHash": "sha256-aH8h5ZOiyEGtHmEyuE/eFxx8TN7a+NGDnl4V+dbzJ6E=",
|
||||
"owner": "hyprwm",
|
||||
"repo": "contrib",
|
||||
"rev": "43c012d21d9314c585b97ac4f34752f6de93dc8f",
|
||||
"rev": "918f266dddae39fa4184a1b8bf51ec5381cf29f7",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -337,11 +337,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1773552174,
|
||||
"narHash": "sha256-mHSRNrT1rjeYBgkAlj07dW3+1nFEgAd8Gu6lgyfT9DU=",
|
||||
"lastModified": 1772945408,
|
||||
"narHash": "sha256-PMt48sEQ8cgCeljQ9I/32uoBq/8t8y+7W/nAZhf72TQ=",
|
||||
"owner": "Mic92",
|
||||
"repo": "nix-index-database",
|
||||
"rev": "8faeb68130df077450451b6734a221ba0d6cde42",
|
||||
"rev": "1c1d8ea87b047788fd7567adf531418c5da321ec",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -417,11 +417,11 @@
|
||||
},
|
||||
"nixos-hardware": {
|
||||
"locked": {
|
||||
"lastModified": 1774018263,
|
||||
"narHash": "sha256-HHYEwK1A22aSaxv2ibhMMkKvrDGKGlA/qObG4smrSqc=",
|
||||
"lastModified": 1772972630,
|
||||
"narHash": "sha256-mUJxsNOrBMNOUJzN0pfdVJ1r2pxeqm9gI/yIKXzVVbk=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixos-hardware",
|
||||
"rev": "2d4b4717b2534fad5c715968c1cece04a172b365",
|
||||
"rev": "3966ce987e1a9a164205ac8259a5fe8a64528f72",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -440,11 +440,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1773233796,
|
||||
"narHash": "sha256-hpAVcTx1xQ7BVf9Y54kFDmjkj3pupEN6miweNXNdTeU=",
|
||||
"lastModified": 1773003096,
|
||||
"narHash": "sha256-YVIoEualeMIrJ6eSFJE75iwyr8kE2/MTVCeKhAKBr/Q=",
|
||||
"owner": "NuschtOS",
|
||||
"repo": "nixos-modules",
|
||||
"rev": "753e2d83eee3d259f9c7ab8cdc1933766d4761a5",
|
||||
"rev": "586abeb940735af053f498e14a6ce4ce008e9760",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -502,11 +502,11 @@
|
||||
},
|
||||
"nixpkgs_2": {
|
||||
"locked": {
|
||||
"lastModified": 1773821835,
|
||||
"narHash": "sha256-TJ3lSQtW0E2JrznGVm8hOQGVpXjJyXY2guAxku2O9A4=",
|
||||
"lastModified": 1772963539,
|
||||
"narHash": "sha256-9jVDGZnvCckTGdYT53d/EfznygLskyLQXYwJLKMPsZs=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "b40629efe5d6ec48dd1efba650c797ddbd39ace0",
|
||||
"rev": "9dcb002ca1690658be4a04645215baea8b95f31d",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -596,11 +596,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1774062094,
|
||||
"narHash": "sha256-ba3c+hS7KzEiwtZRGHagIAYdcmdY3rCSWVCyn64rx7s=",
|
||||
"lastModified": 1773198218,
|
||||
"narHash": "sha256-sxQV16GQrBEfrwuhYT9WvmFBnN8HakhRfR+JR+3qaTo=",
|
||||
"owner": "oxalica",
|
||||
"repo": "rust-overlay",
|
||||
"rev": "c807e83cc2e32adc35f51138b3bdef722c0812ab",
|
||||
"rev": "e552b1d2850f5f0a739bba27c6463af1a29e2f4e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -616,11 +616,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1773889674,
|
||||
"narHash": "sha256-+ycaiVAk3MEshJTg35cBTUa0MizGiS+bgpYw/f8ohkg=",
|
||||
"lastModified": 1773096132,
|
||||
"narHash": "sha256-M3zEnq9OElB7zqc+mjgPlByPm1O5t2fbUrH3t/Hm5Ag=",
|
||||
"owner": "Mic92",
|
||||
"repo": "sops-nix",
|
||||
"rev": "29b6519f3e0780452bca0ac0be4584f04ac16cc5",
|
||||
"rev": "d1ff3b1034d5bab5d7d8086a7803c5a5968cd784",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -650,11 +650,11 @@
|
||||
"tinted-zed": "tinted-zed"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1773792048,
|
||||
"narHash": "sha256-Oy9PCLG3vtflFBWcJd8c/EB3h5RU7ABAIDWn6JrGf6o=",
|
||||
"lastModified": 1772296853,
|
||||
"narHash": "sha256-pAtzPsgHRKw/2Kv8HgAjSJg450FDldHPWsP3AKG/Xj0=",
|
||||
"owner": "danth",
|
||||
"repo": "stylix",
|
||||
"rev": "3f2f9d307fe58c6abe2a16eb9b62c42d53ef5ee1",
|
||||
"rev": "c4b8e80a1020e09a1f081ad0f98ce804a6e85acf",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
||||
78
modules/kubernetes.nix
Normal file
78
modules/kubernetes.nix
Normal file
@@ -0,0 +1,78 @@
|
||||
{
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
|
||||
{
|
||||
options = {
|
||||
services.kubernetes = {
|
||||
enable = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = "Whether to enable Kubernetes services";
|
||||
};
|
||||
|
||||
version = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = "1.28.0";
|
||||
description = "Kubernetes version to use";
|
||||
};
|
||||
|
||||
clusterName = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = "palatine-hill-cluster";
|
||||
description = "Name of the Kubernetes cluster";
|
||||
};
|
||||
|
||||
controlPlaneEndpoint = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = "localhost:6443";
|
||||
description = "Control plane endpoint";
|
||||
};
|
||||
|
||||
networking = lib.mkOption {
|
||||
type = lib.types.attrs;
|
||||
default = { };
|
||||
description = "Kubernetes networking configuration";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf config.services.kubernetes.enable {
|
||||
environment.systemPackages = with pkgs; [
|
||||
kubectl
|
||||
kubernetes
|
||||
];
|
||||
|
||||
# Enable containerd for Kubernetes
|
||||
virtualisation.containerd.enable = true;
|
||||
|
||||
# Enable kubelet
|
||||
#services.kubelet = {
|
||||
# enable = true;
|
||||
# extraFlags = {
|
||||
# "pod-infra-container-image" = "registry.k8s.io/pause:3.9";
|
||||
# };
|
||||
#};
|
||||
|
||||
## Enable kubeadm for cluster initialization
|
||||
#environment.etc."kubeadm.yaml".text = ''
|
||||
# apiVersion: kubeadm.k8s.io/v1beta3
|
||||
# kind: InitConfiguration
|
||||
# localAPIEndpoint:
|
||||
# advertiseAddress: 127.0.0.1
|
||||
# bindPort: 6443
|
||||
# ---
|
||||
# apiVersion: kubeadm.k8s.io/v1beta3
|
||||
# kind: ClusterConfiguration
|
||||
# clusterName: ${config.services.kubernetes.clusterName}
|
||||
# controlPlaneEndpoint: ${config.services.kubernetes.controlPlaneEndpoint}
|
||||
# networking:
|
||||
# serviceSubnet: 10.96.0.0/12
|
||||
# podSubnet: 10.244.0.0/16
|
||||
# dnsDomain: cluster.local
|
||||
#'';
|
||||
};
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
{ pkgs, ... }:
|
||||
{
|
||||
environment.systemPackages = with pkgs; [
|
||||
git
|
||||
python312
|
||||
];
|
||||
}
|
||||
@@ -1,5 +1,4 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
@@ -78,7 +77,10 @@
|
||||
};
|
||||
};
|
||||
|
||||
users.users.alice.extraGroups = [ "calibre-web" ];
|
||||
users.users = {
|
||||
alice.extraGroups = [ "calibre-web" ];
|
||||
};
|
||||
users.groups.ollama = { };
|
||||
|
||||
system.stateVersion = "24.05";
|
||||
|
||||
@@ -86,6 +88,10 @@
|
||||
"KWIN_DRM_NO_DIRECT_SCANOUT" = "1";
|
||||
};
|
||||
|
||||
#nixpkgs.config = {
|
||||
# rocmSupport = true;
|
||||
#};
|
||||
|
||||
sops = {
|
||||
defaultSopsFile = ./secrets.yaml;
|
||||
#secrets = {
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
candy-icons
|
||||
chromium
|
||||
chromedriver
|
||||
claude-code
|
||||
croc
|
||||
deadnix
|
||||
direnv
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
./minio.nix
|
||||
./networking.nix
|
||||
./nextcloud.nix
|
||||
./ollama.nix
|
||||
#./plex
|
||||
./postgresql.nix
|
||||
./samba.nix
|
||||
@@ -25,8 +26,10 @@
|
||||
|
||||
programs.git.lfs.enable = false;
|
||||
|
||||
nixpkgs.config.packageOverrides = pkgs: {
|
||||
vaapiIntel = pkgs.vaapiIntel.override { enableHybridCodec = true; };
|
||||
nixpkgs.config = {
|
||||
packageOverrides = pkgs: {
|
||||
vaapiIntel = pkgs.vaapiIntel.override { enableHybridCodec = true; };
|
||||
};
|
||||
};
|
||||
|
||||
boot = {
|
||||
@@ -97,6 +100,13 @@
|
||||
smartd.enable = true;
|
||||
calibre-server.enable = false;
|
||||
|
||||
# Kubernetes example configuration
|
||||
# To enable Kubernetes, uncomment the following:
|
||||
# kubernetes = {
|
||||
# enable = true;
|
||||
# clusterName = "palatine-hill-cluster";
|
||||
# controlPlaneEndpoint = "localhost:6443";
|
||||
# };
|
||||
};
|
||||
|
||||
nix.gc.options = "--delete-older-than 150d";
|
||||
|
||||
@@ -80,7 +80,7 @@ in
|
||||
# environmentFiles = [ config.sops.secrets."docker/minecraft".path ];
|
||||
#};
|
||||
prominence-ii = {
|
||||
image = "itzg/minecraft-server:java25-graalvm";
|
||||
image = "itzg/minecraft-server:java25";
|
||||
volumes = [
|
||||
"${minecraft_path}/prominence-ii/modpacks:/modpacks:ro"
|
||||
"${minecraft_path}/prominence-ii/data:/data"
|
||||
@@ -105,7 +105,7 @@ in
|
||||
environmentFiles = [ config.sops.secrets."docker/minecraft".path ];
|
||||
};
|
||||
stoneblock-4 = {
|
||||
image = "itzg/minecraft-server:java25-graalvm";
|
||||
image = "itzg/minecraft-server:java25";
|
||||
volumes = [
|
||||
"${minecraft_path}/stoneblock-4/modpacks:/modpacks:ro"
|
||||
"${minecraft_path}/stoneblock-4/data:/data"
|
||||
@@ -127,7 +127,7 @@ in
|
||||
environmentFiles = [ config.sops.secrets."docker/minecraft".path ];
|
||||
};
|
||||
submerged-2 = {
|
||||
image = "itzg/minecraft-server:java25-graalvm";
|
||||
image = "itzg/minecraft-server:java25";
|
||||
volumes = [
|
||||
"${minecraft_path}/submerged-2/modpacks:/modpacks:ro"
|
||||
"${minecraft_path}/submerged-2/data:/data"
|
||||
@@ -147,6 +147,28 @@ in
|
||||
log-driver = "local";
|
||||
environmentFiles = [ config.sops.secrets."docker/minecraft".path ];
|
||||
};
|
||||
cobblemon-overclocked = {
|
||||
image = "itzg/minecraft-server:java25";
|
||||
volumes = [
|
||||
"${minecraft_path}/cobblemon-overclocked/modpacks:/modpacks:ro"
|
||||
"${minecraft_path}/cobblemon-overclocked/data:/data"
|
||||
];
|
||||
hostname = "cobblemon-overclocked";
|
||||
environment = defaultEnv // {
|
||||
VERSION = "1.21.1";
|
||||
CF_SLUG = "modified-cobblemon-overclocked";
|
||||
CF_FILENAME_MATCHER = "1.11.2";
|
||||
USE_AIKAR_FLAGS = "false";
|
||||
USE_MEOWICE_FLAGS = "true";
|
||||
DIFFICULTY = "hard";
|
||||
ENABLE_COMMAND_BLOCK = "true";
|
||||
INIT_MEMORY = "4G";
|
||||
MAX_MEMORY = "16G";
|
||||
};
|
||||
extraOptions = defaultOptions;
|
||||
log-driver = "local";
|
||||
environmentFiles = [ config.sops.secrets."docker/minecraft".path ];
|
||||
};
|
||||
};
|
||||
|
||||
sops = {
|
||||
|
||||
53
systems/palatine-hill/ollama.nix
Normal file
53
systems/palatine-hill/ollama.nix
Normal file
@@ -0,0 +1,53 @@
|
||||
{
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
{
|
||||
services = {
|
||||
ollama = {
|
||||
enable = true;
|
||||
package = pkgs.ollama;
|
||||
syncModels = true;
|
||||
loadModels = [
|
||||
"gemma3"
|
||||
"deepseek-r1:latest"
|
||||
"deepseek-r1:1.5b"
|
||||
"qwen3"
|
||||
#"qwen3-coder-next"
|
||||
"qwen3-coder"
|
||||
"lennyerik/zeta"
|
||||
"llama3.1:8b"
|
||||
"qwen2.5-coder:1.5b-base"
|
||||
"nomic-embed-text:latest"
|
||||
];
|
||||
environmentVariables = {
|
||||
FLASH_ATTENTION = "1";
|
||||
OLLAMA_KV_CACHE_TYPE = "q8_0";
|
||||
# Ollama memory configuration
|
||||
OLLAMA_MAX_LOADED_MODELS = "2";
|
||||
OLLAMA_MAX_QUEUE = "4";
|
||||
OLLAMA_NUM_PARALLEL = "2";
|
||||
|
||||
# ROCm memory optimization
|
||||
#HIP_VISIBLE_DEVICES = "0";
|
||||
#ROCR_VISIBLE_DEVICES = "0";
|
||||
|
||||
# context length for agents
|
||||
OLLAMA_CONTEXT_LENGTH = "64000";
|
||||
};
|
||||
};
|
||||
open-webui = {
|
||||
enable = true;
|
||||
port = 21212;
|
||||
};
|
||||
};
|
||||
users.users.ollama = {
|
||||
extraGroups = [
|
||||
"render"
|
||||
"video"
|
||||
];
|
||||
group = "ollama";
|
||||
isSystemUser = true;
|
||||
};
|
||||
users.groups.ollama = { };
|
||||
}
|
||||
@@ -1,51 +1,123 @@
|
||||
{ pkgs, outputs, ... }:
|
||||
{ pkgs, ... }:
|
||||
|
||||
{
|
||||
programs.emacs = {
|
||||
enable = true;
|
||||
package = pkgs.emacs30-pgtk;
|
||||
};
|
||||
programs.vesktop = {
|
||||
enable = true;
|
||||
settings = {
|
||||
appBadge = false;
|
||||
arRPC = true;
|
||||
checkUpdates = false;
|
||||
customTitleBar = false;
|
||||
hardwareAcceleration = true;
|
||||
programs = {
|
||||
emacs = {
|
||||
enable = true;
|
||||
package = pkgs.emacs30-pgtk;
|
||||
};
|
||||
vencord.useSystem = true;
|
||||
vencord.settings = {
|
||||
autoUpdate = false;
|
||||
autoUpdateNotification = false;
|
||||
notifyAboutUpdates = false;
|
||||
plugins = {
|
||||
AnonymiseFileNames.enabled = true;
|
||||
BetterFolders.enabled = false;
|
||||
BetterGifAltText.enabled = true;
|
||||
CallTimer.enabled = true;
|
||||
ClearURLs.enabled = true;
|
||||
CopyFileContents.enabled = true;
|
||||
CtrlEnterSend.enabled = true;
|
||||
CustomIdle = {
|
||||
enabled = true;
|
||||
remainInIdle = false;
|
||||
vesktop = {
|
||||
enable = true;
|
||||
settings = {
|
||||
appBadge = false;
|
||||
arRPC = true;
|
||||
checkUpdates = false;
|
||||
customTitleBar = false;
|
||||
hardwareAcceleration = true;
|
||||
};
|
||||
vencord.useSystem = true;
|
||||
vencord.settings = {
|
||||
autoUpdate = false;
|
||||
autoUpdateNotification = false;
|
||||
notifyAboutUpdates = false;
|
||||
plugins = {
|
||||
AnonymiseFileNames.enabled = true;
|
||||
BetterFolders.enabled = false;
|
||||
BetterGifAltText.enabled = true;
|
||||
CallTimer.enabled = true;
|
||||
ClearURLs.enabled = true;
|
||||
CopyFileContents.enabled = true;
|
||||
CtrlEnterSend.enabled = true;
|
||||
CustomIdle = {
|
||||
enabled = true;
|
||||
remainInIdle = false;
|
||||
};
|
||||
FriendsSince.enabled = true;
|
||||
GameActivityToggle.enabled = true;
|
||||
ImplicitRelationships.enabled = true;
|
||||
MutualGroupDMs.enabled = true;
|
||||
QuickMention.enabled = true;
|
||||
QuickReply.enabled = true;
|
||||
ReplaceGoogleSearch = {
|
||||
enabled = true;
|
||||
customEngineName = "DuckDuckGo";
|
||||
};
|
||||
ReviewDB.enabled = true;
|
||||
ShowConnections.enabled = true;
|
||||
};
|
||||
FriendsSince.enabled = true;
|
||||
GameActivityToggle.enabled = true;
|
||||
ImplicitRelationships.enabled = true;
|
||||
MutualGroupDMs.enabled = true;
|
||||
QuickMention.enabled = true;
|
||||
QuickReply.enabled = true;
|
||||
ReplaceGoogleSearch = {
|
||||
enabled = true;
|
||||
customEngineName = "DuckDuckGo";
|
||||
};
|
||||
};
|
||||
zed-editor = {
|
||||
enable = true;
|
||||
mutableUserSettings = false;
|
||||
extensions = [
|
||||
"nix"
|
||||
"toml"
|
||||
"rust"
|
||||
"java"
|
||||
"kotlin"
|
||||
"git firefly"
|
||||
"make"
|
||||
"dockerfile"
|
||||
"sql"
|
||||
"latex"
|
||||
"terraform"
|
||||
"log"
|
||||
];
|
||||
userSettings = {
|
||||
colorize_brackets = true;
|
||||
hard_tabs = false;
|
||||
vim_mode = true;
|
||||
minimap = {
|
||||
show = "auto";
|
||||
};
|
||||
buffer_line_height = "comfortable";
|
||||
auto_update = false;
|
||||
autosave = "on_focus_change";
|
||||
agent = {
|
||||
default_model = {
|
||||
provider = "ollama";
|
||||
model = "qwen2.5-coder:latest";
|
||||
};
|
||||
favorite_models = [ ];
|
||||
model_parameters = [ ];
|
||||
};
|
||||
telemetry = {
|
||||
diagnostics = false;
|
||||
metrics = false;
|
||||
};
|
||||
journal = {
|
||||
hour_format = "hour24";
|
||||
};
|
||||
edit_preditions = {
|
||||
provider = "open_ai_compatible_api";
|
||||
open_ai_compatible_api = {
|
||||
api_url = "http://localhost:11434/v1/completions";
|
||||
model = "zeta:latest";
|
||||
prompt_format = "infer";
|
||||
max_requests = 64;
|
||||
};
|
||||
};
|
||||
texlab = {
|
||||
build = {
|
||||
onSave = true;
|
||||
forwardSearchAfter = true;
|
||||
};
|
||||
forwardSearch = {
|
||||
executable = "zathura";
|
||||
args = [
|
||||
"--synctex-forward"
|
||||
"%l:1:%f"
|
||||
"-x"
|
||||
"zed %%{input}:%%{line}"
|
||||
"%p"
|
||||
];
|
||||
};
|
||||
};
|
||||
ReviewDB.enabled = true;
|
||||
ShowConnections.enabled = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
home.packages = with pkgs; [
|
||||
cmake
|
||||
shellcheck
|
||||
|
||||
Reference in New Issue
Block a user