Compare commits
18 Commits
master
...
556010c860
Author | SHA1 | Date | |
---|---|---|---|
556010c860
|
|||
ecbdfbaa7f
|
|||
7cd825d938
|
|||
2b76dbea66
|
|||
df0e6b2924
|
|||
4543939b17
|
|||
85ecd4a72a
|
|||
5d1f6aca74
|
|||
1f665646ea
|
|||
14b53c4321
|
|||
d8e0e78728
|
|||
7879fda102
|
|||
c1f28192a0
|
|||
d1c2adface
|
|||
ab75776ebe
|
|||
dba3b8944d
|
|||
0d8b1e7a37
|
|||
ee02393220
|
736
flake.lock
generated
736
flake.lock
generated
File diff suppressed because it is too large
Load Diff
19
flake.nix
19
flake.nix
@ -2,7 +2,7 @@
|
|||||||
description = "NixOS system configuration";
|
description = "NixOS system configuration";
|
||||||
|
|
||||||
inputs = {
|
inputs = {
|
||||||
nixpkgs.url = "nixpkgs/nixos-25.05";
|
nixpkgs.url = "nixpkgs/nixos-24.11";
|
||||||
nixpkgs-unstable.url = "nixpkgs/nixos-unstable";
|
nixpkgs-unstable.url = "nixpkgs/nixos-unstable";
|
||||||
# nixpkgs-master.url = "nixpkgs";
|
# nixpkgs-master.url = "nixpkgs";
|
||||||
agenix.url = "github:ryantm/agenix";
|
agenix.url = "github:ryantm/agenix";
|
||||||
@ -12,14 +12,9 @@
|
|||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
home-manager = {
|
home-manager = {
|
||||||
url = "github:nix-community/home-manager/release-25.05";
|
url = "github:nix-community/home-manager/release-24.11";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
hyprland.url = "github:hyprwm/Hyprland";
|
|
||||||
hyprland-plugins = {
|
|
||||||
url = "github:hyprwm/hyprland-plugins";
|
|
||||||
inputs.hyprland.follows = "hyprland";
|
|
||||||
};
|
|
||||||
firefox-gnome-theme = {
|
firefox-gnome-theme = {
|
||||||
url = "github:rafaelmardojai/firefox-gnome-theme";
|
url = "github:rafaelmardojai/firefox-gnome-theme";
|
||||||
flake = false;
|
flake = false;
|
||||||
@ -28,18 +23,17 @@
|
|||||||
url = "git+ssh://git@git.vimium.com/jordan/gitea-github-theme.git?ref=main";
|
url = "git+ssh://git@git.vimium.com/jordan/gitea-github-theme.git?ref=main";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
impermanence.url = "github:nix-community/impermanence";
|
|
||||||
kvlibadwaita = {
|
kvlibadwaita = {
|
||||||
url = "github:GabePoel/KvLibadwaita";
|
url = "github:GabePoel/KvLibadwaita";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
nixos-hardware.url = "github:NixOS/nixos-hardware";
|
nixos-hardware.url = "github:NixOS/nixos-hardware";
|
||||||
nixos-mailserver = {
|
nixos-mailserver = {
|
||||||
url = "gitlab:simple-nixos-mailserver/nixos-mailserver/nixos-25.05";
|
url = "gitlab:simple-nixos-mailserver/nixos-mailserver";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
nixvim = {
|
nixvim = {
|
||||||
url = "github:nix-community/nixvim/nixos-25.05";
|
url = "github:nix-community/nixvim/nixos-24.11";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
pre-commit-hooks = {
|
pre-commit-hooks = {
|
||||||
@ -136,7 +130,6 @@
|
|||||||
nixfmt-rfc-style.enable = true;
|
nixfmt-rfc-style.enable = true;
|
||||||
trim-trailing-whitespace.enable = true;
|
trim-trailing-whitespace.enable = true;
|
||||||
};
|
};
|
||||||
excludes = [ "pkgs/libcamera-rpi/libcamera-rpi-ipa-priv-key.pem" ];
|
|
||||||
};
|
};
|
||||||
}));
|
}));
|
||||||
|
|
||||||
@ -158,8 +151,8 @@
|
|||||||
sshUser = "root";
|
sshUser = "root";
|
||||||
nodes = lib.genAttrs [
|
nodes = lib.genAttrs [
|
||||||
"mail"
|
"mail"
|
||||||
"pi"
|
# "pi"
|
||||||
"skycam"
|
# "skycam"
|
||||||
"vps1"
|
"vps1"
|
||||||
] mkDeployNode;
|
] mkDeployNode;
|
||||||
};
|
};
|
||||||
|
@ -8,25 +8,17 @@
|
|||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
inputs.agenix.nixosModules.age
|
inputs.agenix.nixosModules.age
|
||||||
inputs.home-manager.nixosModules.home-manager
|
inputs.home-manager.nixosModule
|
||||||
../modules/nixos
|
../modules/nixos
|
||||||
];
|
];
|
||||||
|
|
||||||
nixpkgs = {
|
nixpkgs.overlays = [
|
||||||
config.allowUnfree = true;
|
inputs.agenix.overlays.default
|
||||||
overlays = [
|
(import ../overlays/default.nix)
|
||||||
inputs.agenix.overlays.default
|
(final: prev: {
|
||||||
(import ../overlays/default.nix)
|
unstable = import inputs.nixpkgs-unstable { system = final.system; };
|
||||||
(final: prev: {
|
})
|
||||||
unstable = import inputs.nixpkgs-unstable {
|
];
|
||||||
config = {
|
|
||||||
allowUnfree = true;
|
|
||||||
};
|
|
||||||
system = final.system;
|
|
||||||
};
|
|
||||||
})
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
time.timeZone = "Europe/London";
|
time.timeZone = "Europe/London";
|
||||||
|
|
||||||
@ -76,7 +68,7 @@
|
|||||||
'';
|
'';
|
||||||
buildMachines = [
|
buildMachines = [
|
||||||
{
|
{
|
||||||
hostName = "10.0.1.235";
|
hostName = "10.0.1.79";
|
||||||
sshUser = "root";
|
sshUser = "root";
|
||||||
system = "aarch64-linux";
|
system = "aarch64-linux";
|
||||||
maxJobs = 6;
|
maxJobs = 6;
|
||||||
|
@ -1,7 +1,4 @@
|
|||||||
{
|
{ pkgs, ... }:
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
@ -9,10 +6,14 @@
|
|||||||
../users/jordan
|
../users/jordan
|
||||||
];
|
];
|
||||||
|
|
||||||
|
nixpkgs.overlays = [
|
||||||
|
(import ../overlays/gnome.nix)
|
||||||
|
];
|
||||||
|
|
||||||
services.printing.enable = true;
|
services.printing.enable = true;
|
||||||
services.openssh.startWhenNeeded = true;
|
services.openssh.startWhenNeeded = true;
|
||||||
|
|
||||||
services.pulseaudio.enable = false;
|
hardware.pulseaudio.enable = false;
|
||||||
security.rtkit.enable = true;
|
security.rtkit.enable = true;
|
||||||
services.pipewire = {
|
services.pipewire = {
|
||||||
enable = true;
|
enable = true;
|
||||||
@ -46,6 +47,18 @@
|
|||||||
|
|
||||||
systemd.services.NetworkManager-wait-online.enable = false;
|
systemd.services.NetworkManager-wait-online.enable = false;
|
||||||
|
|
||||||
|
fonts.packages = with pkgs; [
|
||||||
|
noto-fonts
|
||||||
|
(nerdfonts.override {
|
||||||
|
fonts = [
|
||||||
|
"BigBlueTerminal"
|
||||||
|
"ComicShannsMono"
|
||||||
|
"Terminus"
|
||||||
|
"UbuntuMono"
|
||||||
|
];
|
||||||
|
})
|
||||||
|
];
|
||||||
|
|
||||||
modules = {
|
modules = {
|
||||||
system.desktop.gnome.enable = true;
|
system.desktop.gnome.enable = true;
|
||||||
services.tailscale.enable = true;
|
services.tailscale.enable = true;
|
||||||
|
@ -18,5 +18,11 @@
|
|||||||
networkmanager.enable = true;
|
networkmanager.enable = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
dconf.settings = {
|
||||||
|
"org/gnome/desktop/interface" = {
|
||||||
|
show-battery-percentage = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
system.stateVersion = "22.11";
|
system.stateVersion = "22.11";
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,5 @@
|
|||||||
{
|
{ pkgs, ... }:
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
let
|
|
||||||
inherit (lib) mkForce;
|
|
||||||
in
|
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
./hardware-configuration.nix
|
./hardware-configuration.nix
|
||||||
@ -42,10 +35,6 @@ in
|
|||||||
repoPath = "ssh://b9cjl9hq@b9cjl9hq.repo.borgbase.com/./repo";
|
repoPath = "ssh://b9cjl9hq@b9cjl9hq.repo.borgbase.com/./repo";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
system.desktop = {
|
|
||||||
gnome.enable = mkForce false;
|
|
||||||
hyprland.enable = true;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
system.stateVersion = "22.11";
|
system.stateVersion = "22.11";
|
||||||
|
@ -28,8 +28,6 @@
|
|||||||
supportedFilesystems = [ "zfs" ];
|
supportedFilesystems = [ "zfs" ];
|
||||||
};
|
};
|
||||||
|
|
||||||
powerManagement.cpuFreqGovernor = "schedutil";
|
|
||||||
|
|
||||||
fileSystems."/" = {
|
fileSystems."/" = {
|
||||||
device = "rpool/system/root";
|
device = "rpool/system/root";
|
||||||
fsType = "zfs";
|
fsType = "zfs";
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
nixpkgs = {
|
nixpkgs = {
|
||||||
hostPlatform = "x86_64-linux";
|
hostPlatform = "x86_64-linux";
|
||||||
config = {
|
config = {
|
||||||
|
allowUnfree = true;
|
||||||
nvidia.acceptLicense = true;
|
nvidia.acceptLicense = true;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -8,12 +8,12 @@ Media and public file server.
|
|||||||
* Chipset - AMD B550
|
* Chipset - AMD B550
|
||||||
* Memory - 64 GB DDR4
|
* Memory - 64 GB DDR4
|
||||||
* Motherboard - ASRock B550M Pro4
|
* Motherboard - ASRock B550M Pro4
|
||||||
* Case - JMCD-12S4
|
* Case - Fractal Design Node 804
|
||||||
|
|
||||||
### Disks
|
### Disks
|
||||||
Device | Partitions _(filesystem, size, usage)_
|
Device | Partitions _(filesystem, size, usage)_
|
||||||
--- | ---
|
--- | ---
|
||||||
Samsung 970 Evo Plus | `/dev/nvme0n1p1` (EFI, 512 MiB, NixOS Boot) <br> `/dev/nvme0n1p2` (ZFS `rpool`, 200 GiB, NixOS Root)
|
Samsung 980 Evo | `/dev/nvme0n1p1` (EFI, 512 MiB, NixOS Boot) <br> `/dev/nvme0n1p2` (ZFS `rpool`, 200 GiB, NixOS Root)
|
||||||
|
|
||||||
#### ZFS datasets
|
#### ZFS datasets
|
||||||
```
|
```
|
||||||
|
@ -1,38 +0,0 @@
|
|||||||
{
|
|
||||||
inputs,
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
{
|
|
||||||
age.secrets."files/services/open-webui/envfile" = {
|
|
||||||
file = "${inputs.secrets}/files/services/open-webui/envfile.age";
|
|
||||||
};
|
|
||||||
|
|
||||||
services.open-webui = {
|
|
||||||
enable = true;
|
|
||||||
package = pkgs.unstable.open-webui;
|
|
||||||
port = 8081;
|
|
||||||
environment =
|
|
||||||
let
|
|
||||||
clientId = "open-webui";
|
|
||||||
publicUrl = "https://chat.ai.vimium.com";
|
|
||||||
in
|
|
||||||
{
|
|
||||||
WEBUI_URL = publicUrl;
|
|
||||||
ENABLE_LOGIN_FORM = "False";
|
|
||||||
ENABLE_OAUTH_SIGNUP = "True";
|
|
||||||
ENABLE_OAUTH_ROLE_MANAGEMENT = "True";
|
|
||||||
OAUTH_CLIENT_ID = clientId;
|
|
||||||
OAUTH_PROVIDER_NAME = "Vimium";
|
|
||||||
OPENID_PROVIDER_URL = "https://auth.vimium.com/oauth2/openid/${clientId}/.well-known/openid-configuration";
|
|
||||||
OPENID_REDIRECT_URI = "${publicUrl}/oauth/oidc/callback";
|
|
||||||
};
|
|
||||||
environmentFile = config.age.secrets."files/services/open-webui/envfile".path;
|
|
||||||
};
|
|
||||||
|
|
||||||
modules.services.borgmatic.directories = [
|
|
||||||
"/var/lib/private/open-webui"
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,17 +1,8 @@
|
|||||||
{
|
{ config, pkgs, ... }:
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
./hardware-configuration.nix
|
./hardware-configuration.nix
|
||||||
./ai.nix
|
|
||||||
./grafana.nix
|
|
||||||
./jellyfin.nix
|
|
||||||
./jellysearch.nix
|
|
||||||
./nginx.nix
|
|
||||||
./prometheus.nix
|
|
||||||
./tunnel.nix
|
|
||||||
../server.nix
|
../server.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -20,10 +11,7 @@
|
|||||||
boot = {
|
boot = {
|
||||||
loader.systemd-boot.enable = true;
|
loader.systemd-boot.enable = true;
|
||||||
loader.efi.canTouchEfiVariables = true;
|
loader.efi.canTouchEfiVariables = true;
|
||||||
zfs.extraPools = [
|
zfs.extraPools = [ "library" ];
|
||||||
"downloads"
|
|
||||||
"library"
|
|
||||||
];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
networking = {
|
networking = {
|
||||||
@ -58,12 +46,147 @@
|
|||||||
enable = true;
|
enable = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
services.grafana = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
server = {
|
||||||
|
domain = "library.mesh.vimium.net";
|
||||||
|
http_addr = "0.0.0.0";
|
||||||
|
http_port = 3000;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.prometheus = {
|
||||||
|
enable = true;
|
||||||
|
port = 9001;
|
||||||
|
exporters = {
|
||||||
|
node = {
|
||||||
|
enable = true;
|
||||||
|
enabledCollectors = [ "systemd" ];
|
||||||
|
port = 9002;
|
||||||
|
};
|
||||||
|
zfs = {
|
||||||
|
enable = true;
|
||||||
|
port = 9003;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
scrapeConfigs = [
|
||||||
|
{
|
||||||
|
job_name = "node";
|
||||||
|
static_configs = [
|
||||||
|
{
|
||||||
|
targets = [
|
||||||
|
"127.0.0.1:${toString config.services.prometheus.exporters.node.port}"
|
||||||
|
"127.0.0.1:${toString config.services.prometheus.exporters.zfs.port}"
|
||||||
|
];
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.services.vps1-tunnel = {
|
||||||
|
enable = true;
|
||||||
|
description = "vps1.mesh.vimium.net SSH tunnel";
|
||||||
|
after = [
|
||||||
|
"network-online.target"
|
||||||
|
"jellyfin.service"
|
||||||
|
];
|
||||||
|
wants = [ "network-online.target" ];
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "simple";
|
||||||
|
ExecStart = pkgs.lib.mkForce ''
|
||||||
|
${pkgs.openssh}/bin/ssh \
|
||||||
|
-NT \
|
||||||
|
-o ExitOnForwardFailure=yes \
|
||||||
|
-o ServerAliveInterval=60 \
|
||||||
|
-o TCPKeepAlive=no \
|
||||||
|
-i %h/.ssh/id_jellyfin \
|
||||||
|
-R localhost:8000:localhost:8000 \
|
||||||
|
jellyfin@vps1.mesh.vimium.net
|
||||||
|
'';
|
||||||
|
Restart = "always";
|
||||||
|
RestartSec = 20;
|
||||||
|
};
|
||||||
|
wantedBy = [ "default.target" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
services.nginx =
|
||||||
|
let
|
||||||
|
proxyConfig = ''
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
|
||||||
|
proxy_set_header Range $http_range;
|
||||||
|
proxy_set_header If-Range $http_if_range;
|
||||||
|
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
'';
|
||||||
|
in
|
||||||
|
{
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.openresty;
|
||||||
|
recommendedGzipSettings = true;
|
||||||
|
recommendedOptimisation = true;
|
||||||
|
recommendedTlsSettings = true;
|
||||||
|
clientMaxBodySize = "2G";
|
||||||
|
virtualHosts = {
|
||||||
|
"library.mesh.vimium.net" = {
|
||||||
|
locations."/" = {
|
||||||
|
root = "/mnt/library";
|
||||||
|
extraConfig = ''
|
||||||
|
autoindex on;
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
"jellyfin.vimium.com" = {
|
||||||
|
default = true;
|
||||||
|
listen = [
|
||||||
|
{
|
||||||
|
addr = "127.0.0.1";
|
||||||
|
port = 8000;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
locations."/" = {
|
||||||
|
proxyPass = "http://localhost:8096";
|
||||||
|
extraConfig = proxyConfig;
|
||||||
|
};
|
||||||
|
locations."/metrics" = {
|
||||||
|
return = "404";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
hardware.graphics = {
|
||||||
|
enable = true;
|
||||||
|
extraPackages = with pkgs; [
|
||||||
|
vaapiVdpau
|
||||||
|
];
|
||||||
|
};
|
||||||
|
users.users.jellyfin.extraGroups = [
|
||||||
|
"video"
|
||||||
|
"render"
|
||||||
|
];
|
||||||
|
services.jellyfin = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.unstable.jellyfin;
|
||||||
|
cacheDir = "/var/cache/jellyfin";
|
||||||
|
dataDir = "/var/lib/jellyfin";
|
||||||
|
};
|
||||||
|
|
||||||
modules = {
|
modules = {
|
||||||
podman.enable = true;
|
podman.enable = true;
|
||||||
services = {
|
services = {
|
||||||
borgmatic = {
|
borgmatic = {
|
||||||
enable = true;
|
enable = true;
|
||||||
directories = [
|
directories = [
|
||||||
|
config.services.jellyfin.dataDir
|
||||||
"/home/jordan"
|
"/home/jordan"
|
||||||
];
|
];
|
||||||
repoPath = "ssh://b61758r4@b61758r4.repo.borgbase.com/./repo";
|
repoPath = "ssh://b61758r4@b61758r4.repo.borgbase.com/./repo";
|
||||||
|
@ -1,16 +0,0 @@
|
|||||||
{
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
{
|
|
||||||
services.grafana = {
|
|
||||||
enable = true;
|
|
||||||
settings = {
|
|
||||||
server = {
|
|
||||||
domain = "library.mesh.vimium.net";
|
|
||||||
http_addr = "0.0.0.0";
|
|
||||||
http_port = 3000;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,30 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
{
|
|
||||||
hardware.graphics = {
|
|
||||||
enable = true;
|
|
||||||
extraPackages = with pkgs; [
|
|
||||||
vaapiVdpau
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
users.users.jellyfin.extraGroups = [
|
|
||||||
"video"
|
|
||||||
"render"
|
|
||||||
];
|
|
||||||
|
|
||||||
services.jellyfin = {
|
|
||||||
enable = true;
|
|
||||||
package = pkgs.unstable.jellyfin;
|
|
||||||
cacheDir = "/var/cache/jellyfin";
|
|
||||||
dataDir = "/var/lib/jellyfin";
|
|
||||||
};
|
|
||||||
|
|
||||||
modules.services.borgmatic.directories = [
|
|
||||||
config.services.jellyfin.dataDir
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,58 +0,0 @@
|
|||||||
{
|
|
||||||
inputs,
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
{
|
|
||||||
age.secrets."files/services/meilisearch/envfile" = {
|
|
||||||
file = "${inputs.secrets}/files/services/meilisearch/envfile.age";
|
|
||||||
};
|
|
||||||
|
|
||||||
services.meilisearch = {
|
|
||||||
enable = true;
|
|
||||||
package = pkgs.meilisearch;
|
|
||||||
masterKeyEnvironmentFile = config.age.secrets."files/services/meilisearch/envfile".path;
|
|
||||||
};
|
|
||||||
|
|
||||||
users.users.jellysearch = {
|
|
||||||
group = "jellysearch";
|
|
||||||
isSystemUser = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
users.groups.jellysearch = { };
|
|
||||||
|
|
||||||
systemd.services.jellysearch = {
|
|
||||||
enable = true;
|
|
||||||
description = "JellySearch";
|
|
||||||
wantedBy = [ "multi-user.target" ];
|
|
||||||
after = [ "network-online.target" ];
|
|
||||||
wants = [ "network-online.target" ];
|
|
||||||
serviceConfig = {
|
|
||||||
Restart = "on-failure";
|
|
||||||
ExecStart = "${pkgs.jellysearch}/bin/jellysearch";
|
|
||||||
StateDirectory = "jellysearch";
|
|
||||||
StateDirectoryMode = "0750";
|
|
||||||
WorkingDirectory = "/var/lib/jellysearch";
|
|
||||||
EnvironmentFile = config.age.secrets."files/services/meilisearch/envfile".path;
|
|
||||||
|
|
||||||
NoNewPrivileges = true;
|
|
||||||
SystemCallArchitectures = "native";
|
|
||||||
RestrictRealtime = true;
|
|
||||||
RestrictSUIDSGID = true;
|
|
||||||
ProtectHostname = true;
|
|
||||||
LockPersonality = true;
|
|
||||||
PrivateDevices = true;
|
|
||||||
PrivateUsers = true;
|
|
||||||
RemoveIPC = true;
|
|
||||||
};
|
|
||||||
environment = {
|
|
||||||
DOTNET_ENVIRONMENT = "Production";
|
|
||||||
INDEX_CRON = "0 0 0/2 ? * * *";
|
|
||||||
JELLYFIN_URL = "http://localhost:8096";
|
|
||||||
JELLYFIN_CONFIG_DIR = "${toString config.services.jellyfin.dataDir}";
|
|
||||||
MEILI_URL = "http://localhost:${toString config.services.meilisearch.listenPort}";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,88 +0,0 @@
|
|||||||
{
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
{
|
|
||||||
services.nginx =
|
|
||||||
let
|
|
||||||
proxyConfig = ''
|
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
|
|
||||||
proxy_http_version 1.1;
|
|
||||||
proxy_set_header Upgrade $http_upgrade;
|
|
||||||
proxy_set_header Connection "upgrade";
|
|
||||||
'';
|
|
||||||
in
|
|
||||||
{
|
|
||||||
enable = true;
|
|
||||||
package = pkgs.openresty;
|
|
||||||
recommendedGzipSettings = true;
|
|
||||||
recommendedOptimisation = true;
|
|
||||||
recommendedTlsSettings = true;
|
|
||||||
clientMaxBodySize = "2G";
|
|
||||||
virtualHosts = {
|
|
||||||
"library.mesh.vimium.net" = {
|
|
||||||
locations."/" = {
|
|
||||||
root = "/mnt/library";
|
|
||||||
extraConfig = ''
|
|
||||||
autoindex on;
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
"chat.ai.vimium.com" = {
|
|
||||||
listen = [
|
|
||||||
{
|
|
||||||
addr = "127.0.0.1";
|
|
||||||
port = 8001;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
locations."/" = {
|
|
||||||
proxyPass = "http://localhost:8081";
|
|
||||||
extraConfig =
|
|
||||||
proxyConfig
|
|
||||||
+ ''
|
|
||||||
# Disable proxy buffering for better streaming response from models
|
|
||||||
proxy_buffering off;
|
|
||||||
|
|
||||||
# Increase max request size for large attachments and long audio messages
|
|
||||||
client_max_body_size 20M;
|
|
||||||
proxy_read_timeout 10m;
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
"jellyfin.vimium.com" = {
|
|
||||||
default = true;
|
|
||||||
listen = [
|
|
||||||
{
|
|
||||||
addr = "127.0.0.1";
|
|
||||||
port = 8000;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
locations."/" = {
|
|
||||||
extraConfig =
|
|
||||||
''
|
|
||||||
# Proxy JellySearch first
|
|
||||||
if ($arg_searchTerm) {
|
|
||||||
proxy_pass http://localhost:5000;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
proxy_pass http://localhost:8096;
|
|
||||||
''
|
|
||||||
+ proxyConfig
|
|
||||||
+ ''
|
|
||||||
proxy_set_header Range $http_range;
|
|
||||||
proxy_set_header If-Range $http_if_range;
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
locations."/metrics" = {
|
|
||||||
return = "404";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,35 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
{
|
|
||||||
services.prometheus = {
|
|
||||||
enable = true;
|
|
||||||
port = 9001;
|
|
||||||
exporters = {
|
|
||||||
node = {
|
|
||||||
enable = true;
|
|
||||||
enabledCollectors = [ "systemd" ];
|
|
||||||
port = 9002;
|
|
||||||
};
|
|
||||||
zfs = {
|
|
||||||
enable = true;
|
|
||||||
port = 9003;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
scrapeConfigs = [
|
|
||||||
{
|
|
||||||
job_name = "node";
|
|
||||||
static_configs = [
|
|
||||||
{
|
|
||||||
targets = [
|
|
||||||
"127.0.0.1:${toString config.services.prometheus.exporters.node.port}"
|
|
||||||
"127.0.0.1:${toString config.services.prometheus.exporters.zfs.port}"
|
|
||||||
];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,33 +0,0 @@
|
|||||||
{
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
{
|
|
||||||
systemd.services.vps1-tunnel = {
|
|
||||||
enable = true;
|
|
||||||
description = "vps1.mesh.vimium.net SSH tunnel";
|
|
||||||
after = [
|
|
||||||
"network-online.target"
|
|
||||||
"jellyfin.service"
|
|
||||||
];
|
|
||||||
wants = [ "network-online.target" ];
|
|
||||||
serviceConfig = {
|
|
||||||
Type = "simple";
|
|
||||||
ExecStart = pkgs.lib.mkForce ''
|
|
||||||
${pkgs.openssh}/bin/ssh \
|
|
||||||
-NT \
|
|
||||||
-o ExitOnForwardFailure=yes \
|
|
||||||
-o ServerAliveInterval=60 \
|
|
||||||
-o TCPKeepAlive=no \
|
|
||||||
-i %h/.ssh/id_jellyfin \
|
|
||||||
-R localhost:8000:localhost:8000 \
|
|
||||||
-R localhost:8001:localhost:8001 \
|
|
||||||
jellyfin@vps1.mesh.vimium.net
|
|
||||||
'';
|
|
||||||
Restart = "always";
|
|
||||||
RestartSec = 20;
|
|
||||||
};
|
|
||||||
wantedBy = [ "default.target" ];
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
inputs,
|
inputs,
|
||||||
|
lib,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
|
|
||||||
@ -24,6 +25,18 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
users = {
|
||||||
|
users = {
|
||||||
|
root = {
|
||||||
|
openssh.authorizedKeys.keys = [
|
||||||
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILVHTjsyMIV4THNw6yz0OxAxGnC+41gX72UrPqTzR+OS jordan@vimium.com"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.openssh.settings.PermitRootLogin = lib.mkForce "prohibit-password";
|
||||||
|
|
||||||
modules = {
|
modules = {
|
||||||
services = {
|
services = {
|
||||||
borgmatic = {
|
borgmatic = {
|
||||||
|
@ -5,33 +5,24 @@
|
|||||||
}:
|
}:
|
||||||
|
|
||||||
let
|
let
|
||||||
sendingDomains = [
|
domains = [
|
||||||
"jdholt.com"
|
|
||||||
"vimium.com"
|
|
||||||
];
|
|
||||||
receiveOnlyDomains = [
|
|
||||||
"h0lt.com"
|
"h0lt.com"
|
||||||
|
"jdholt.com"
|
||||||
"jordanholt.xyz"
|
"jordanholt.xyz"
|
||||||
"vimium.co"
|
"vimium.co"
|
||||||
|
"vimium.com"
|
||||||
"vimium.co.uk"
|
"vimium.co.uk"
|
||||||
"vimium.info"
|
"vimium.info"
|
||||||
"vimium.net"
|
"vimium.net"
|
||||||
"vimium.org"
|
"vimium.org"
|
||||||
"vimium.xyz"
|
"vimium.xyz"
|
||||||
];
|
];
|
||||||
allDomains = sendingDomains ++ receiveOnlyDomains;
|
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
inputs.nixos-mailserver.nixosModule
|
inputs.nixos-mailserver.nixosModule
|
||||||
];
|
];
|
||||||
|
|
||||||
age.secrets = {
|
|
||||||
"files/services/postfix/sasl_passwd".file =
|
|
||||||
"${inputs.secrets}/files/services/postfix/sasl_passwd.age";
|
|
||||||
"passwords/users/jordan".file = "${inputs.secrets}/passwords/users/jordan.age";
|
|
||||||
};
|
|
||||||
|
|
||||||
services.roundcube = {
|
services.roundcube = {
|
||||||
enable = true;
|
enable = true;
|
||||||
hostName = config.mailserver.fqdn;
|
hostName = config.mailserver.fqdn;
|
||||||
@ -53,7 +44,7 @@ in
|
|||||||
mailserver = {
|
mailserver = {
|
||||||
enable = true;
|
enable = true;
|
||||||
fqdn = "mail.vimium.com";
|
fqdn = "mail.vimium.com";
|
||||||
domains = allDomains;
|
domains = domains;
|
||||||
indexDir = "/var/lib/dovecot/indices";
|
indexDir = "/var/lib/dovecot/indices";
|
||||||
|
|
||||||
certificateDomains = [
|
certificateDomains = [
|
||||||
@ -66,23 +57,16 @@ in
|
|||||||
|
|
||||||
loginAccounts = {
|
loginAccounts = {
|
||||||
"jordan@vimium.com" = {
|
"jordan@vimium.com" = {
|
||||||
hashedPasswordFile = config.age.secrets."passwords/users/jordan".path;
|
hashedPasswordFile = config.users.users.jordan.hashedPasswordFile;
|
||||||
aliases = map (domain: "@" + domain) sendingDomains;
|
catchAll = domains;
|
||||||
catchAll = receiveOnlyDomains;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
|
||||||
|
|
||||||
services.postfix.config = {
|
extraVirtualAliases = {
|
||||||
relayhost = "[mail.smtp2go.com]:2525";
|
"hostmaster@vimium.com" = "jordan@vimium.com";
|
||||||
|
"postmaster@vimium.com" = "jordan@vimium.com";
|
||||||
smtp_sasl_auth_enable = "yes";
|
"webmaster@vimium.com" = "jordan@vimium.com";
|
||||||
smtp_sasl_password_maps = "texthash:${
|
"abuse@vimium.com" = "jordan@vimium.com";
|
||||||
config.age.secrets."files/services/postfix/sasl_passwd".path
|
};
|
||||||
}";
|
|
||||||
smtp_sasl_security_options = "noanonymous";
|
|
||||||
|
|
||||||
smtp_destination_concurrency_limit = "20";
|
|
||||||
header_size_limit = "4096000";
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -4,10 +4,10 @@
|
|||||||
Primary workstation.
|
Primary workstation.
|
||||||
|
|
||||||
## Specs
|
## Specs
|
||||||
* CPU - AMD Ryzen 9 9950X3D @ 4.30GHz
|
* CPU - Intel Core i7-5930K @ 4.10GHz
|
||||||
* Chipset - AMD X870E
|
* Chipset - Intel X99
|
||||||
* Memory - 96 GB DDR5
|
* Memory - 64 GB DDR4
|
||||||
* Motherboard - ASUS ProArt X870E-Creator WiFi
|
* Motherboard - ASUS X99-A
|
||||||
* GPU - NVIDIA RTX 3090
|
* GPU - NVIDIA RTX 3090
|
||||||
* Case - Thermaltake A500
|
* Case - Thermaltake A500
|
||||||
|
|
||||||
|
@ -9,12 +9,14 @@
|
|||||||
./hardware-configuration.nix
|
./hardware-configuration.nix
|
||||||
./gitea-runner.nix
|
./gitea-runner.nix
|
||||||
./nix-serve.nix
|
./nix-serve.nix
|
||||||
|
./zonos-container.nix
|
||||||
../desktop.nix
|
../desktop.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
nixpkgs = {
|
nixpkgs = {
|
||||||
hostPlatform = "x86_64-linux";
|
hostPlatform = "x86_64-linux";
|
||||||
config = {
|
config = {
|
||||||
|
allowUnfree = true;
|
||||||
nvidia.acceptLicense = true;
|
nvidia.acceptLicense = true;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -43,11 +45,13 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
services.sunshine = {
|
services.sunshine = {
|
||||||
enable = false;
|
enable = true;
|
||||||
package = pkgs.unstable.sunshine;
|
package = pkgs.unstable.sunshine;
|
||||||
capSysAdmin = true;
|
capSysAdmin = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
services.displayManager.ly.enable = true;
|
||||||
|
|
||||||
modules = {
|
modules = {
|
||||||
hardware.presonus-studio.enable = true;
|
hardware.presonus-studio.enable = true;
|
||||||
services = {
|
services = {
|
||||||
@ -65,10 +69,7 @@
|
|||||||
repoPath = "ssh://iqwu22oq@iqwu22oq.repo.borgbase.com/./repo";
|
repoPath = "ssh://iqwu22oq@iqwu22oq.repo.borgbase.com/./repo";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
system.desktop = {
|
system.desktop.gnome.enable = lib.mkForce false;
|
||||||
gnome.enable = lib.mkForce false;
|
|
||||||
hyprland.enable = true;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
system.stateVersion = "22.11";
|
system.stateVersion = "22.11";
|
||||||
|
@ -22,29 +22,22 @@
|
|||||||
];
|
];
|
||||||
initrd.kernelModules = [ ];
|
initrd.kernelModules = [ ];
|
||||||
initrd.supportedFilesystems = [ "zfs" ];
|
initrd.supportedFilesystems = [ "zfs" ];
|
||||||
kernelModules = [ "kvm-amd" ];
|
kernelModules = [ "kvm-intel" ];
|
||||||
kernelPackages = pkgs.linuxPackages_6_12;
|
kernelPackages = pkgs.linuxPackages;
|
||||||
supportedFilesystems = [ "ntfs" ];
|
supportedFilesystems = [ "ntfs" ];
|
||||||
binfmt.emulatedSystems = [ "aarch64-linux" ];
|
binfmt.emulatedSystems = [ "aarch64-linux" ];
|
||||||
};
|
};
|
||||||
|
|
||||||
hardware = {
|
hardware = {
|
||||||
bluetooth = {
|
cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||||
enable = true;
|
|
||||||
powerOnBoot = true;
|
|
||||||
};
|
|
||||||
cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
|
||||||
nvidia = {
|
nvidia = {
|
||||||
modesetting.enable = true;
|
modesetting.enable = true;
|
||||||
open = true;
|
open = true;
|
||||||
package = config.boot.kernelPackages.nvidiaPackages.beta;
|
package = config.boot.kernelPackages.nvidiaPackages.beta;
|
||||||
powerManagement.enable = true;
|
powerManagement.enable = true;
|
||||||
nvidiaSettings = false;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
powerManagement.cpuFreqGovernor = "schedutil";
|
|
||||||
|
|
||||||
services.xserver.videoDrivers = [ "nvidia" ];
|
services.xserver.videoDrivers = [ "nvidia" ];
|
||||||
|
|
||||||
fileSystems."/" = {
|
fileSystems."/" = {
|
||||||
|
72
hosts/odyssey/zonos-container.nix
Normal file
72
hosts/odyssey/zonos-container.nix
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
# Auto-generated using compose2nix v0.3.2-pre.
|
||||||
|
{ pkgs, lib, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
hardware.nvidia-container-toolkit.enable = true;
|
||||||
|
# Runtime
|
||||||
|
virtualisation.docker = {
|
||||||
|
enable = true;
|
||||||
|
# enableNvidia = true;
|
||||||
|
enableOnBoot = true;
|
||||||
|
autoPrune.enable = true;
|
||||||
|
daemon.settings.features.cdi = true;
|
||||||
|
rootless.enable = true;
|
||||||
|
rootless.daemon.settings.features.cdi = true;
|
||||||
|
};
|
||||||
|
virtualisation.oci-containers.backend = "docker";
|
||||||
|
|
||||||
|
# Containers
|
||||||
|
virtualisation.oci-containers.containers."zonos_container" = {
|
||||||
|
image = "compose2nix/zonos_container";
|
||||||
|
environment = {
|
||||||
|
"GRADIO_SHARE" = "False";
|
||||||
|
"NVIDIA_VISIBLE_DEVICES" = "0";
|
||||||
|
};
|
||||||
|
cmd = [
|
||||||
|
"python3"
|
||||||
|
"gradio_interface.py"
|
||||||
|
];
|
||||||
|
log-driver = "journald";
|
||||||
|
extraOptions = [
|
||||||
|
"--device=nvidia.com/gpu=0"
|
||||||
|
"--network=host"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
systemd.services."docker-zonos_container" = {
|
||||||
|
serviceConfig = {
|
||||||
|
Restart = lib.mkOverride 90 "no";
|
||||||
|
};
|
||||||
|
partOf = [
|
||||||
|
"docker-compose-zonos-root.target"
|
||||||
|
];
|
||||||
|
wantedBy = [
|
||||||
|
"docker-compose-zonos-root.target"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
# Builds
|
||||||
|
systemd.services."docker-build-zonos_container" = {
|
||||||
|
path = [
|
||||||
|
pkgs.docker
|
||||||
|
pkgs.git
|
||||||
|
];
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
TimeoutSec = 900;
|
||||||
|
};
|
||||||
|
script = ''
|
||||||
|
cd /home/jordan/projects/jordan/Zonos
|
||||||
|
docker build -t compose2nix/zonos_container .
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
# Root service
|
||||||
|
# When started, this will automatically create all resources and start
|
||||||
|
# the containers. When stopped, this will teardown all resources.
|
||||||
|
systemd.targets."docker-compose-zonos-root" = {
|
||||||
|
unitConfig = {
|
||||||
|
Description = "Root target generated by compose2nix.";
|
||||||
|
};
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
};
|
||||||
|
}
|
@ -9,7 +9,6 @@
|
|||||||
inputs.nixos-hardware.nixosModules.raspberry-pi-4
|
inputs.nixos-hardware.nixosModules.raspberry-pi-4
|
||||||
./hardware-configuration.nix
|
./hardware-configuration.nix
|
||||||
./home-assistant
|
./home-assistant
|
||||||
./snapcast.nix
|
|
||||||
../server.nix
|
../server.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
lib,
|
lib,
|
||||||
|
pkgs,
|
||||||
modulesPath,
|
modulesPath,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
@ -10,6 +11,44 @@
|
|||||||
];
|
];
|
||||||
|
|
||||||
boot = {
|
boot = {
|
||||||
|
kernelPackages =
|
||||||
|
let
|
||||||
|
version = "6.1.73";
|
||||||
|
tag = "stable_20240124";
|
||||||
|
srcHash = "sha256-P4ExzxWqZj+9FZr9U2tmh7rfs/3+iHEv0m74PCoXVuM=";
|
||||||
|
in
|
||||||
|
pkgs.linuxPackagesFor (
|
||||||
|
pkgs.linux_rpi4.override {
|
||||||
|
argsOverride = {
|
||||||
|
src = pkgs.fetchFromGitHub {
|
||||||
|
owner = "raspberrypi";
|
||||||
|
repo = "linux";
|
||||||
|
rev = tag;
|
||||||
|
hash = srcHash;
|
||||||
|
};
|
||||||
|
version = version;
|
||||||
|
modDirVersion = version;
|
||||||
|
structuredExtraConfig = { };
|
||||||
|
kernelPatches = [
|
||||||
|
{
|
||||||
|
name = "drm-rp1-depends-on-instead-of-select-MFD_RP1.patch";
|
||||||
|
patch = pkgs.fetchpatch {
|
||||||
|
url = "https://github.com/peat-psuwit/rpi-linux/commit/6de0bb51929cd3ad4fa27b2a421a2af12e6468f5.patch";
|
||||||
|
hash = "sha256-9pHcbgWTiztu48SBaLPVroUnxnXMKeCGt5vEo9V8WGw=";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "iommu-bcm2712-don-t-allow-building-as-module.patch";
|
||||||
|
patch = pkgs.fetchpatch {
|
||||||
|
url = "https://github.com/peat-psuwit/rpi-linux/commit/693a5e69bddbcbe1d1b796ebc7581c3597685b1b.patch";
|
||||||
|
hash = "sha256-8BYYQDM5By8cTk48ASYKJhGVQnZBIK4PXtV70UtfS+A=";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
# Stop ZFS kernel being built
|
# Stop ZFS kernel being built
|
||||||
supportedFilesystems = lib.mkForce [
|
supportedFilesystems = lib.mkForce [
|
||||||
"btrfs"
|
"btrfs"
|
||||||
@ -30,6 +69,23 @@
|
|||||||
(final: prev: {
|
(final: prev: {
|
||||||
makeModulesClosure = x: prev.makeModulesClosure (x // { allowMissing = true; });
|
makeModulesClosure = x: prev.makeModulesClosure (x // { allowMissing = true; });
|
||||||
})
|
})
|
||||||
|
(final: prev: {
|
||||||
|
raspberrypifw =
|
||||||
|
let
|
||||||
|
version = "1.20240529";
|
||||||
|
srcHash = "sha256-KsCo7ZG6vKstxRyFljZtbQvnDSqiAPdUza32xTY/tlA=";
|
||||||
|
in
|
||||||
|
pkgs.raspberrypifw.override {
|
||||||
|
argsOverride = {
|
||||||
|
src = prev.fetchFromGitHub {
|
||||||
|
owner = "raspberrypi";
|
||||||
|
repo = "firmware";
|
||||||
|
rev = "${version}";
|
||||||
|
hash = srcHash;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
})
|
||||||
];
|
];
|
||||||
|
|
||||||
fileSystems = {
|
fileSystems = {
|
||||||
|
@ -63,6 +63,7 @@
|
|||||||
};
|
};
|
||||||
media_player = [ ];
|
media_player = [ ];
|
||||||
mobile_app = { };
|
mobile_app = { };
|
||||||
|
onkyo = { };
|
||||||
open_meteo = { };
|
open_meteo = { };
|
||||||
recorder = {
|
recorder = {
|
||||||
purge_keep_days = 365;
|
purge_keep_days = 365;
|
||||||
|
@ -1,43 +0,0 @@
|
|||||||
{
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
{
|
|
||||||
# Put all sinks in pipewire group
|
|
||||||
services.pipewire.systemWide = true;
|
|
||||||
|
|
||||||
services.avahi = {
|
|
||||||
enable = true;
|
|
||||||
nssmdns4 = true;
|
|
||||||
publish = {
|
|
||||||
enable = true;
|
|
||||||
domain = true;
|
|
||||||
addresses = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
services.snapserver = {
|
|
||||||
enable = true;
|
|
||||||
streams = {
|
|
||||||
default = {
|
|
||||||
type = "file";
|
|
||||||
location = "/var/lib/snapserver/test.wav";
|
|
||||||
sampleFormat = "44100:16:2";
|
|
||||||
codec = "flac";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
systemd.services.snapclient = {
|
|
||||||
wantedBy = [ "multi-user.target" ];
|
|
||||||
after = [ "pipewire.service" ];
|
|
||||||
requires = [ "pipewire.service" ];
|
|
||||||
description = "Snapcast client";
|
|
||||||
serviceConfig = {
|
|
||||||
ExecStart = "${pkgs.snapcast}/bin/snapclient -h 127.0.0.1 --player pulse --mixer hardware";
|
|
||||||
DynamicUser = true;
|
|
||||||
SupplementaryGroups = [ "pipewire" ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,11 +1,7 @@
|
|||||||
{
|
{
|
||||||
lib,
|
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
|
|
||||||
let
|
|
||||||
inherit (lib) mkForce;
|
|
||||||
in
|
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
./common.nix
|
./common.nix
|
||||||
@ -33,16 +29,6 @@ in
|
|||||||
# };
|
# };
|
||||||
};
|
};
|
||||||
|
|
||||||
users = {
|
|
||||||
users = {
|
|
||||||
root = {
|
|
||||||
openssh.authorizedKeys.keys = [
|
|
||||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILVHTjsyMIV4THNw6yz0OxAxGnC+41gX72UrPqTzR+OS jordan@vimium.com"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
systemd = {
|
systemd = {
|
||||||
enableEmergencyMode = false;
|
enableEmergencyMode = false;
|
||||||
|
|
||||||
@ -50,6 +36,11 @@ in
|
|||||||
AllowSuspend=no
|
AllowSuspend=no
|
||||||
AllowHibernation=no
|
AllowHibernation=no
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
watchdog = {
|
||||||
|
runtimeTime = "20s";
|
||||||
|
rebootTime = "30s";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
services.fail2ban = {
|
services.fail2ban = {
|
||||||
@ -65,8 +56,6 @@ in
|
|||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
services.openssh.settings.PermitRootLogin = mkForce "prohibit-password";
|
|
||||||
|
|
||||||
modules.services.tailscale = {
|
modules.services.tailscale = {
|
||||||
enable = true;
|
enable = true;
|
||||||
restrictSSH = false;
|
restrictSSH = false;
|
||||||
|
@ -1,16 +1,78 @@
|
|||||||
{
|
{
|
||||||
|
inputs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
pkgs,
|
pkgs,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
|
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
|
inputs.nixos-hardware.nixosModules.raspberry-pi-4
|
||||||
./hardware-configuration.nix
|
./hardware-configuration.nix
|
||||||
../server.nix
|
../server.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
nixpkgs.hostPlatform = "aarch64-linux";
|
nixpkgs.hostPlatform = "aarch64-linux";
|
||||||
|
|
||||||
|
hardware = {
|
||||||
|
raspberry-pi."4" = {
|
||||||
|
apply-overlays-dtmerge.enable = true;
|
||||||
|
audio.enable = false;
|
||||||
|
xhci.enable = false;
|
||||||
|
};
|
||||||
|
deviceTree = {
|
||||||
|
enable = true;
|
||||||
|
filter = "*rpi-4-*.dtb";
|
||||||
|
# From https://github.com/Electrostasy/dots/blob/3b81723feece67610a252ce754912f6769f0cd34/hosts/phobos/klipper.nix#L43-L65
|
||||||
|
overlays =
|
||||||
|
let
|
||||||
|
mkCompatibleDtsFile =
|
||||||
|
dtbo:
|
||||||
|
let
|
||||||
|
drv =
|
||||||
|
pkgs.runCommand "fix-dts"
|
||||||
|
{
|
||||||
|
nativeBuildInputs = with pkgs; [
|
||||||
|
dtc
|
||||||
|
gnused
|
||||||
|
];
|
||||||
|
}
|
||||||
|
''
|
||||||
|
mkdir "$out"
|
||||||
|
dtc -I dtb -O dts ${dtbo} | sed -e 's/bcm2835/bcm2711/' > $out/overlay.dts
|
||||||
|
'';
|
||||||
|
in
|
||||||
|
"${drv}/overlay.dts";
|
||||||
|
|
||||||
|
inherit (config.boot.kernelPackages) kernel;
|
||||||
|
in
|
||||||
|
[
|
||||||
|
{
|
||||||
|
name = "imx708.dtbo";
|
||||||
|
dtsFile = mkCompatibleDtsFile "${kernel}/dtbs/overlays/imx708.dtbo";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "vc4-kms-v3d-pi4.dtbo";
|
||||||
|
dtsFile = mkCompatibleDtsFile "${kernel}/dtbs/overlays/vc4-kms-v3d-pi4.dtbo";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
firmware = with pkgs; [
|
||||||
|
firmwareLinuxNonfree
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
services.udev.extraRules = ''
|
||||||
|
SUBSYSTEM=="rpivid-*", GROUP="video", MODE="0660"
|
||||||
|
KERNEL=="vcsm-cma", GROUP="video", MODE="0660"
|
||||||
|
SUBSYSTEM=="dma_heap", GROUP="video", MODE="0660"
|
||||||
|
'';
|
||||||
|
|
||||||
|
nixpkgs.overlays = [
|
||||||
|
(import ./../../overlays/libcamera.nix)
|
||||||
|
];
|
||||||
|
|
||||||
networking = {
|
networking = {
|
||||||
hostId = "731d1660";
|
hostId = "731d1660";
|
||||||
firewall = {
|
firewall = {
|
||||||
@ -20,59 +82,45 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
services.go2rtc =
|
users.users.root = {
|
||||||
let
|
openssh.authorizedKeys.keys = [
|
||||||
rpicam-vid = "${pkgs.rpicam-apps}/bin/rpicam-vid";
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILVHTjsyMIV4THNw6yz0OxAxGnC+41gX72UrPqTzR+OS jordan@vimium.com"
|
||||||
in
|
];
|
||||||
{
|
|
||||||
enable = true;
|
|
||||||
settings = {
|
|
||||||
streams.rpicam = "exec:${rpicam-vid} -v1 -t0 -o- --inline --width=4608 --height=2592 --framerate=14 --codec mjpeg --quality 90 --denoise=cdn_off --sharpness 1.25 --exposure long --gain 3";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
systemd.services.skycam-archiver =
|
|
||||||
let
|
|
||||||
snapshotScript = pkgs.writeShellScript "skycam-archiver" ''
|
|
||||||
${pkgs.lib.getExe pkgs.curl} -s -o "/var/lib/skycam-archiver/snapshot-$(date +%Y%m%d-%H%M%S).jpg" "http://skycam.mesh.vimium.net:1984/api/frame.jpeg?src=rpicam"
|
|
||||||
'';
|
|
||||||
in
|
|
||||||
{
|
|
||||||
description = "Capture skycam snapshot and save with timestamp";
|
|
||||||
serviceConfig = {
|
|
||||||
Type = "oneshot";
|
|
||||||
StateDirectory = "skycam-archiver";
|
|
||||||
ExecStart = "${snapshotScript}";
|
|
||||||
};
|
|
||||||
requires = [ "go2rtc.service" ];
|
|
||||||
after = [ "go2rtc.service" ];
|
|
||||||
};
|
|
||||||
|
|
||||||
systemd.timers.skycam-archiver = {
|
|
||||||
description = "Timer for capturing skycam snapshots every 30 minutes";
|
|
||||||
wantedBy = [ "timers.target" ];
|
|
||||||
timerConfig = {
|
|
||||||
OnBootSec = "5min";
|
|
||||||
OnUnitActiveSec = "30min";
|
|
||||||
Unit = "skycam-archiver.service";
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
modules.services.borgmatic = {
|
services.openssh.settings.PermitRootLogin = lib.mkForce "prohibit-password";
|
||||||
|
|
||||||
|
systemd.services.ustreamer = {
|
||||||
enable = true;
|
enable = true;
|
||||||
directories = [
|
description = "uStreamer service";
|
||||||
"/var/lib/skycam-archiver"
|
unitConfig = {
|
||||||
];
|
Type = "simple";
|
||||||
repoPath = "ssh://m94ekv2i@m94ekv2i.repo.borgbase.com/./repo";
|
ConditionPathExists = "/sys/bus/i2c/drivers/imx708/10-001a/video4linux";
|
||||||
|
};
|
||||||
|
serviceConfig = {
|
||||||
|
ExecStart = ''
|
||||||
|
${pkgs.libcamera}/bin/libcamerify ${pkgs.unstable.ustreamer}/bin/ustreamer \
|
||||||
|
--host=0.0.0.0 \
|
||||||
|
--resolution=4608x2592
|
||||||
|
'';
|
||||||
|
DynamicUser = "yes";
|
||||||
|
SupplementaryGroups = [ "video" ];
|
||||||
|
Restart = "always";
|
||||||
|
RestartSec = 10;
|
||||||
|
};
|
||||||
|
wantedBy = [ "network-online.target" ];
|
||||||
|
confinement.mode = "chroot-only";
|
||||||
};
|
};
|
||||||
|
|
||||||
environment.systemPackages = with pkgs; [
|
environment.systemPackages = with pkgs; [
|
||||||
|
camera-streamer
|
||||||
git
|
git
|
||||||
neovim
|
neovim
|
||||||
libcamera
|
libcamera
|
||||||
libraspberrypi
|
libraspberrypi
|
||||||
raspberrypi-eeprom
|
raspberrypi-eeprom
|
||||||
rpicam-apps
|
v4l-utils
|
||||||
|
unstable.ustreamer
|
||||||
];
|
];
|
||||||
|
|
||||||
system.stateVersion = "24.05";
|
system.stateVersion = "24.05";
|
||||||
|
@ -1,20 +1,18 @@
|
|||||||
{
|
{
|
||||||
inputs,
|
|
||||||
config,
|
|
||||||
lib,
|
lib,
|
||||||
pkgs,
|
|
||||||
modulesPath,
|
modulesPath,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
|
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
inputs.nixos-hardware.nixosModules.raspberry-pi-4
|
|
||||||
(modulesPath + "/installer/sd-card/sd-image-aarch64.nix")
|
(modulesPath + "/installer/sd-card/sd-image-aarch64.nix")
|
||||||
];
|
];
|
||||||
|
|
||||||
boot = {
|
boot = {
|
||||||
|
kernelModules = [ "bcm2835-v4l2" ];
|
||||||
kernelParams = [
|
kernelParams = [
|
||||||
|
"cma=512M"
|
||||||
"panic=0"
|
"panic=0"
|
||||||
];
|
];
|
||||||
supportedFilesystems = lib.mkForce [
|
supportedFilesystems = lib.mkForce [
|
||||||
@ -25,61 +23,6 @@
|
|||||||
tmp.cleanOnBoot = false;
|
tmp.cleanOnBoot = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
hardware = {
|
|
||||||
raspberry-pi."4" = {
|
|
||||||
apply-overlays-dtmerge.enable = true;
|
|
||||||
audio.enable = false;
|
|
||||||
xhci.enable = false;
|
|
||||||
};
|
|
||||||
deviceTree = {
|
|
||||||
enable = true;
|
|
||||||
filter = "*rpi-4-*.dtb";
|
|
||||||
# From https://github.com/Electrostasy/dots/blob/3b81723feece67610a252ce754912f6769f0cd34/hosts/phobos/klipper.nix#L43-L65
|
|
||||||
overlays =
|
|
||||||
let
|
|
||||||
mkCompatibleDtsFile =
|
|
||||||
dtbo:
|
|
||||||
let
|
|
||||||
drv =
|
|
||||||
pkgs.runCommand "fix-dts"
|
|
||||||
{
|
|
||||||
nativeBuildInputs = with pkgs; [
|
|
||||||
dtc
|
|
||||||
gnused
|
|
||||||
];
|
|
||||||
}
|
|
||||||
''
|
|
||||||
mkdir "$out"
|
|
||||||
dtc -I dtb -O dts ${dtbo} | sed -e 's/bcm2835/bcm2711/' > $out/overlay.dts
|
|
||||||
'';
|
|
||||||
in
|
|
||||||
"${drv}/overlay.dts";
|
|
||||||
|
|
||||||
inherit (config.boot.kernelPackages) kernel;
|
|
||||||
in
|
|
||||||
[
|
|
||||||
{
|
|
||||||
name = "imx708.dtbo";
|
|
||||||
dtsFile = mkCompatibleDtsFile "${kernel}/dtbs/overlays/imx708.dtbo";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "vc4-kms-v3d-pi4.dtbo";
|
|
||||||
dtsFile = mkCompatibleDtsFile "${kernel}/dtbs/overlays/vc4-kms-v3d-pi4.dtbo";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
firmware = with pkgs; [
|
|
||||||
firmwareLinuxNonfree
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
services.udev.extraRules = ''
|
|
||||||
SUBSYSTEM=="rpivid-*", GROUP="video", MODE="0660"
|
|
||||||
KERNEL=="vcsm-cma", GROUP="video", MODE="0660"
|
|
||||||
SUBSYSTEM=="dma_heap", GROUP="video", MODE="0660"
|
|
||||||
SUBSYSTEM=="dma_heap", KERNEL=="linux,cma", SYMLINK+="dma_heap/vidbuf_cached", OPTIONS+="link_priority=-50"
|
|
||||||
'';
|
|
||||||
|
|
||||||
nixpkgs.overlays = [
|
nixpkgs.overlays = [
|
||||||
(final: super: {
|
(final: super: {
|
||||||
makeModulesClosure = x: super.makeModulesClosure (x // { allowMissing = true; });
|
makeModulesClosure = x: super.makeModulesClosure (x // { allowMissing = true; });
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
lib,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
|
|
||||||
@ -40,12 +41,19 @@
|
|||||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOaaS+KMAEAymZhIJGC4LK8aMhUzhpmloUgvP2cxeBH4 jellyfin"
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOaaS+KMAEAymZhIJGC4LK8aMhUzhpmloUgvP2cxeBH4 jellyfin"
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
root = {
|
||||||
|
openssh.authorizedKeys.keys = [
|
||||||
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILVHTjsyMIV4THNw6yz0OxAxGnC+41gX72UrPqTzR+OS jordan@vimium.com"
|
||||||
|
];
|
||||||
|
};
|
||||||
};
|
};
|
||||||
groups = {
|
groups = {
|
||||||
jellyfin = { };
|
jellyfin = { };
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
services.openssh.settings.PermitRootLogin = lib.mkForce "prohibit-password";
|
||||||
|
|
||||||
modules = {
|
modules = {
|
||||||
services = {
|
services = {
|
||||||
borgmatic = {
|
borgmatic = {
|
||||||
|
@ -26,7 +26,6 @@ in
|
|||||||
origin = uri;
|
origin = uri;
|
||||||
tls_chain = "${config.security.acme.certs.${domain}.directory}/full.pem";
|
tls_chain = "${config.security.acme.certs.${domain}.directory}/full.pem";
|
||||||
tls_key = "${config.security.acme.certs.${domain}.directory}/key.pem";
|
tls_key = "${config.security.acme.certs.${domain}.directory}/key.pem";
|
||||||
version = "2";
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -85,31 +85,6 @@ in
|
|||||||
virtualHosts =
|
virtualHosts =
|
||||||
{
|
{
|
||||||
## Static sites
|
## Static sites
|
||||||
"chat.ai.vimium.com" = {
|
|
||||||
forceSSL = true;
|
|
||||||
enableACME = true;
|
|
||||||
extraConfig = nginxErrorPages + nginxEdgeHeaders;
|
|
||||||
locations."/" = {
|
|
||||||
proxyPass = "http://localhost:8001";
|
|
||||||
extraConfig = ''
|
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
|
|
||||||
proxy_http_version 1.1;
|
|
||||||
proxy_set_header Upgrade $http_upgrade;
|
|
||||||
proxy_set_header Connection "upgrade";
|
|
||||||
|
|
||||||
# Disable proxy buffering for better streaming response from models
|
|
||||||
proxy_buffering off;
|
|
||||||
|
|
||||||
# Increase max request size for large attachments and long audio messages
|
|
||||||
client_max_body_size 20M;
|
|
||||||
proxy_read_timeout 10m;
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
"jellyfin.vimium.com" = {
|
"jellyfin.vimium.com" = {
|
||||||
forceSSL = true;
|
forceSSL = true;
|
||||||
enableACME = true;
|
enableACME = true;
|
||||||
@ -136,16 +111,13 @@ in
|
|||||||
enableACME = true;
|
enableACME = true;
|
||||||
serverAliases = [ "www.jdholt.com" ];
|
serverAliases = [ "www.jdholt.com" ];
|
||||||
extraConfig = nginxErrorPages + nginxEdgeHeaders + nginxStrictHeaders;
|
extraConfig = nginxErrorPages + nginxEdgeHeaders + nginxStrictHeaders;
|
||||||
locations."/skycam" = {
|
|
||||||
root = "/var/www/jdholt.com";
|
|
||||||
};
|
|
||||||
locations."/skycam/snapshot.jpg" = {
|
locations."/skycam/snapshot.jpg" = {
|
||||||
extraConfig = ''
|
extraConfig = ''
|
||||||
set $backend "skycam.mesh.vimium.net:1984";
|
set $backend "skycam.mesh.vimium.net:8080";
|
||||||
|
|
||||||
resolver 100.100.100.100;
|
resolver 100.100.100.100;
|
||||||
|
|
||||||
proxy_pass http://$backend/api/frame.jpeg?src=rpicam;
|
proxy_pass http://$backend/snapshot;
|
||||||
proxy_cache skycam_cache;
|
proxy_cache skycam_cache;
|
||||||
proxy_cache_valid any 10s;
|
proxy_cache_valid any 10s;
|
||||||
proxy_ignore_headers Cache-Control Expires Set-Cookie;
|
proxy_ignore_headers Cache-Control Expires Set-Cookie;
|
||||||
|
@ -7,6 +7,8 @@ let
|
|||||||
domain = "outline.vimium.com";
|
domain = "outline.vimium.com";
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
|
nixpkgs.config.allowUnfree = true;
|
||||||
|
|
||||||
services.nginx.virtualHosts = {
|
services.nginx.virtualHosts = {
|
||||||
"${domain}" = {
|
"${domain}" = {
|
||||||
forceSSL = true;
|
forceSSL = true;
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
./services/postgresql.nix
|
./services/postgresql.nix
|
||||||
./services/tailscale.nix
|
./services/tailscale.nix
|
||||||
./system/desktop/gnome.nix
|
./system/desktop/gnome.nix
|
||||||
./system/desktop/hyprland.nix
|
./system/desktop/mimeapps.nix
|
||||||
./system/wireless.nix
|
./system/wireless.nix
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@ -100,7 +100,7 @@ in
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
pipewire-pulse."40-upmix" = upmixConfig;
|
pipewire-pulse."40-upmix" = upmixConfig;
|
||||||
client."40-upmix" = upmixConfig;
|
client-rt."40-upmix" = upmixConfig;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -64,8 +64,7 @@ in
|
|||||||
];
|
];
|
||||||
|
|
||||||
# Add `pg_dumpall` to unit environment
|
# Add `pg_dumpall` to unit environment
|
||||||
systemd.services.borgmatic.path =
|
systemd.services.borgmatic.path = [ config.services.postgresql.package ];
|
||||||
if config.services.postgresql.enable then [ config.services.postgresql.package ] else [ ];
|
|
||||||
|
|
||||||
# Without this override, `cat` is unavailable for `encryption_passcommand`
|
# Without this override, `cat` is unavailable for `encryption_passcommand`
|
||||||
systemd.services.borgmatic.confinement.fullUnit = true;
|
systemd.services.borgmatic.confinement.fullUnit = true;
|
||||||
|
@ -31,6 +31,7 @@ in
|
|||||||
environment.systemPackages = with pkgs.unstable; [
|
environment.systemPackages = with pkgs.unstable; [
|
||||||
adw-gtk3
|
adw-gtk3
|
||||||
adwaita-fonts
|
adwaita-fonts
|
||||||
|
kdePackages.qtstyleplugin-kvantum
|
||||||
libsForQt5.qtstyleplugin-kvantum
|
libsForQt5.qtstyleplugin-kvantum
|
||||||
morewaita-icon-theme
|
morewaita-icon-theme
|
||||||
nautilus-python
|
nautilus-python
|
||||||
|
@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
let
|
|
||||||
inherit (lib)
|
|
||||||
mkEnableOption
|
|
||||||
mkIf
|
|
||||||
;
|
|
||||||
cfg = config.modules.system.desktop.hyprland;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
options.modules.system.desktop.hyprland.enable = mkEnableOption "hyprland";
|
|
||||||
|
|
||||||
config = mkIf cfg.enable {
|
|
||||||
networking.networkmanager.enable = true;
|
|
||||||
|
|
||||||
programs.hyprland = {
|
|
||||||
enable = true;
|
|
||||||
withUWSM = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,15 +1,24 @@
|
|||||||
{
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
|
|
||||||
let
|
let
|
||||||
avApp = "mpv.desktop";
|
cfg = config.modules.system.desktop.mimeapps;
|
||||||
imageApp = "org.gnome.Loupe.desktop";
|
avApp = "io.github.celluloid_player.Celluloid.desktop";
|
||||||
|
imageApp = "org.gnome.eog.desktop";
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
xdg.mimeApps = {
|
options.modules.system.desktop.mimeapps = {
|
||||||
enable = true;
|
enable = lib.mkOption {
|
||||||
defaultApplications = {
|
default = false;
|
||||||
|
example = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
xdg.mime.defaultApplications = {
|
||||||
# Audio/video
|
# Audio/video
|
||||||
"audio/x-vorbis+ogg" = avApp;
|
"audio/x-vorbis+ogg" = avApp;
|
||||||
"audio/3gpp" = avApp;
|
"audio/3gpp" = avApp;
|
24
overlays/0001-Ignore-IPA-signing.patch
Normal file
24
overlays/0001-Ignore-IPA-signing.patch
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
From 625939e594ce255afa3fab3a40c3e524460e1f8b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jordan Holt <jordan@vimium.com>
|
||||||
|
Date: Sat, 10 Aug 2024 18:28:08 +0100
|
||||||
|
Subject: [PATCH] Ignore IPA signing
|
||||||
|
|
||||||
|
---
|
||||||
|
src/libcamera/ipa_manager.cpp | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/libcamera/ipa_manager.cpp b/src/libcamera/ipa_manager.cpp
|
||||||
|
index 6d5bbd05..43004175 100644
|
||||||
|
--- a/src/libcamera/ipa_manager.cpp
|
||||||
|
+++ b/src/libcamera/ipa_manager.cpp
|
||||||
|
@@ -295,7 +295,7 @@ bool IPAManager::isSignatureValid([[maybe_unused]] IPAModule *ipa) const
|
||||||
|
if (data.empty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
- bool valid = pubKey_.verify(data, ipa->signature());
|
||||||
|
+ bool valid = true;
|
||||||
|
|
||||||
|
LOG(IPAManager, Debug)
|
||||||
|
<< "IPA module " << ipa->path() << " signature is "
|
||||||
|
--
|
||||||
|
2.44.1
|
141
overlays/0001-Remove-relative-config-lookups.patch
Normal file
141
overlays/0001-Remove-relative-config-lookups.patch
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
From 57128bb78f56cadf9e2dcca5ba4d710c3bd478a7 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jordan Holt <jordan@vimium.com>
|
||||||
|
Date: Mon, 5 Aug 2024 21:53:09 +0100
|
||||||
|
Subject: [PATCH] Remove relative config lookups
|
||||||
|
|
||||||
|
---
|
||||||
|
src/libcamera/ipa_manager.cpp | 16 ----------
|
||||||
|
src/libcamera/ipa_proxy.cpp | 48 ++----------------------------
|
||||||
|
src/libcamera/pipeline_handler.cpp | 21 ++-----------
|
||||||
|
3 files changed, 4 insertions(+), 81 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/libcamera/ipa_manager.cpp b/src/libcamera/ipa_manager.cpp
|
||||||
|
index f4e0b633..6d5bbd05 100644
|
||||||
|
--- a/src/libcamera/ipa_manager.cpp
|
||||||
|
+++ b/src/libcamera/ipa_manager.cpp
|
||||||
|
@@ -131,22 +131,6 @@ IPAManager::IPAManager()
|
||||||
|
<< "No IPA found in '" << modulePaths << "'";
|
||||||
|
}
|
||||||
|
|
||||||
|
- /*
|
||||||
|
- * When libcamera is used before it is installed, load IPAs from the
|
||||||
|
- * same build directory as the libcamera library itself.
|
||||||
|
- */
|
||||||
|
- std::string root = utils::libcameraBuildPath();
|
||||||
|
- if (!root.empty()) {
|
||||||
|
- std::string ipaBuildPath = root + "src/ipa";
|
||||||
|
- constexpr int maxDepth = 2;
|
||||||
|
-
|
||||||
|
- LOG(IPAManager, Info)
|
||||||
|
- << "libcamera is not installed. Adding '"
|
||||||
|
- << ipaBuildPath << "' to the IPA search path";
|
||||||
|
-
|
||||||
|
- ipaCount += addDir(ipaBuildPath.c_str(), maxDepth);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
/* Finally try to load IPAs from the installed system path. */
|
||||||
|
ipaCount += addDir(IPA_MODULE_DIR);
|
||||||
|
|
||||||
|
diff --git a/src/libcamera/ipa_proxy.cpp b/src/libcamera/ipa_proxy.cpp
|
||||||
|
index 69975d8f..cd9284a3 100644
|
||||||
|
--- a/src/libcamera/ipa_proxy.cpp
|
||||||
|
+++ b/src/libcamera/ipa_proxy.cpp
|
||||||
|
@@ -122,33 +122,11 @@ std::string IPAProxy::configurationFile(const std::string &name,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- std::string root = utils::libcameraSourcePath();
|
||||||
|
- if (!root.empty()) {
|
||||||
|
- /*
|
||||||
|
- * When libcamera is used before it is installed, load
|
||||||
|
- * configuration files from the source directory. The
|
||||||
|
- * configuration files are then located in the 'data'
|
||||||
|
- * subdirectory of the corresponding IPA module.
|
||||||
|
- */
|
||||||
|
- std::string ipaConfDir = root + "src/ipa/" + ipaName + "/data";
|
||||||
|
-
|
||||||
|
- LOG(IPAProxy, Info)
|
||||||
|
- << "libcamera is not installed. Loading IPA configuration from '"
|
||||||
|
- << ipaConfDir << "'";
|
||||||
|
-
|
||||||
|
- std::string confPath = ipaConfDir + "/" + name;
|
||||||
|
+ for (const auto &dir : utils::split(IPA_CONFIG_DIR, ":")) {
|
||||||
|
+ std::string confPath = dir + "/" + ipaName + "/" + name;
|
||||||
|
ret = stat(confPath.c_str(), &statbuf);
|
||||||
|
if (ret == 0 && (statbuf.st_mode & S_IFMT) == S_IFREG)
|
||||||
|
return confPath;
|
||||||
|
-
|
||||||
|
- } else {
|
||||||
|
- /* Else look in the system locations. */
|
||||||
|
- for (const auto &dir : utils::split(IPA_CONFIG_DIR, ":")) {
|
||||||
|
- std::string confPath = dir + "/" + ipaName + "/" + name;
|
||||||
|
- ret = stat(confPath.c_str(), &statbuf);
|
||||||
|
- if (ret == 0 && (statbuf.st_mode & S_IFMT) == S_IFREG)
|
||||||
|
- return confPath;
|
||||||
|
- }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fallbackName.empty()) {
|
||||||
|
@@ -197,28 +175,6 @@ std::string IPAProxy::resolvePath(const std::string &file) const
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- /*
|
||||||
|
- * When libcamera is used before it is installed, load proxy workers
|
||||||
|
- * from the same build directory as the libcamera directory itself.
|
||||||
|
- * This requires identifying the path of the libcamera.so, and
|
||||||
|
- * referencing a relative path for the proxy workers from that point.
|
||||||
|
- */
|
||||||
|
- std::string root = utils::libcameraBuildPath();
|
||||||
|
- if (!root.empty()) {
|
||||||
|
- std::string ipaProxyDir = root + "src/libcamera/proxy/worker";
|
||||||
|
-
|
||||||
|
- LOG(IPAProxy, Info)
|
||||||
|
- << "libcamera is not installed. Loading proxy workers from '"
|
||||||
|
- << ipaProxyDir << "'";
|
||||||
|
-
|
||||||
|
- std::string proxyPath = ipaProxyDir + proxyFile;
|
||||||
|
- if (!access(proxyPath.c_str(), X_OK))
|
||||||
|
- return proxyPath;
|
||||||
|
-
|
||||||
|
- return std::string();
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- /* Else try finding the exec target from the install directory. */
|
||||||
|
std::string proxyPath = std::string(IPA_PROXY_DIR) + proxyFile;
|
||||||
|
if (!access(proxyPath.c_str(), X_OK))
|
||||||
|
return proxyPath;
|
||||||
|
diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
|
||||||
|
index 5ea2ca78..fd8555ca 100644
|
||||||
|
--- a/src/libcamera/pipeline_handler.cpp
|
||||||
|
+++ b/src/libcamera/pipeline_handler.cpp
|
||||||
|
@@ -561,25 +561,8 @@ std::string PipelineHandler::configurationFile(const std::string &subdir,
|
||||||
|
struct stat statbuf;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
- std::string root = utils::libcameraSourcePath();
|
||||||
|
- if (!root.empty()) {
|
||||||
|
- /*
|
||||||
|
- * When libcamera is used before it is installed, load
|
||||||
|
- * configuration files from the source directory. The
|
||||||
|
- * configuration files are then located in the 'data'
|
||||||
|
- * subdirectory of the corresponding pipeline handler.
|
||||||
|
- */
|
||||||
|
- std::string confDir = root + "src/libcamera/pipeline/";
|
||||||
|
- confPath = confDir + subdir + "/data/" + name;
|
||||||
|
-
|
||||||
|
- LOG(Pipeline, Info)
|
||||||
|
- << "libcamera is not installed. Loading platform configuration file from '"
|
||||||
|
- << confPath << "'";
|
||||||
|
- } else {
|
||||||
|
- /* Else look in the system locations. */
|
||||||
|
- confPath = std::string(LIBCAMERA_DATA_DIR)
|
||||||
|
- + "/pipeline/" + subdir + '/' + name;
|
||||||
|
- }
|
||||||
|
+ confPath = std::string(LIBCAMERA_DATA_DIR)
|
||||||
|
+ + "/pipeline/" + subdir + '/' + name;
|
||||||
|
|
||||||
|
ret = stat(confPath.c_str(), &statbuf);
|
||||||
|
if (ret == 0 && (statbuf.st_mode & S_IFMT) == S_IFREG)
|
||||||
|
--
|
||||||
|
2.44.1
|
21
overlays/gnome.nix
Normal file
21
overlays/gnome.nix
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
final: prev: {
|
||||||
|
gvdb = prev.fetchgit {
|
||||||
|
url = "https://gitlab.gnome.org/GNOME/gvdb.git";
|
||||||
|
rev = "b54bc5da25127ef416858a3ad92e57159ff565b3"; # From gvdb_wrap
|
||||||
|
sha256 = "c56yOepnKPEYFcU1B1TrDl8ydU0JU+z6R8siAQP4d2A=";
|
||||||
|
};
|
||||||
|
|
||||||
|
mutter = prev.mutter.overrideAttrs (attrs: {
|
||||||
|
src = prev.fetchurl {
|
||||||
|
url = "https://gitlab.gnome.org/Community/Ubuntu/mutter/-/archive/triple-buffering-v4-47/mutter-triple-buffering-v4-47.tar.gz";
|
||||||
|
sha256 = "4u8uAYdqAVEl1rM+vPHsuLHy9Ji1WjrYTZQ6B4DBjdA=";
|
||||||
|
};
|
||||||
|
|
||||||
|
postPatch = ''
|
||||||
|
mkdir -p subprojects/gvdb
|
||||||
|
cp -r ${final.gvdb}/* subprojects/gvdb/
|
||||||
|
|
||||||
|
${attrs.postPatch or ""}
|
||||||
|
'';
|
||||||
|
});
|
||||||
|
}
|
65
overlays/libcamera.nix
Normal file
65
overlays/libcamera.nix
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
final: prev: {
|
||||||
|
libpisp = final.stdenv.mkDerivation {
|
||||||
|
name = "libpisp";
|
||||||
|
version = "1.0.5";
|
||||||
|
src = final.fetchFromGitHub {
|
||||||
|
owner = "raspberrypi";
|
||||||
|
repo = "libpisp";
|
||||||
|
rev = "v1.0.5";
|
||||||
|
hash = "sha256-CHd44CH5dBcZuK+5fZtONZ8HE/lwGKwK5U0BYUK8gG4=";
|
||||||
|
};
|
||||||
|
|
||||||
|
nativeBuildInputs = with final; [
|
||||||
|
pkg-config
|
||||||
|
meson
|
||||||
|
ninja
|
||||||
|
];
|
||||||
|
|
||||||
|
buildInputs = with final; [
|
||||||
|
nlohmann_json
|
||||||
|
boost
|
||||||
|
];
|
||||||
|
|
||||||
|
BOOST_INCLUDEDIR = "${prev.lib.getDev final.boost}/include";
|
||||||
|
BOOST_LIBRARYDIR = "${prev.lib.getLib final.boost}/lib";
|
||||||
|
};
|
||||||
|
|
||||||
|
libcamera = prev.libcamera.overrideAttrs (old: {
|
||||||
|
src = final.fetchFromGitHub {
|
||||||
|
owner = "raspberrypi";
|
||||||
|
repo = "libcamera";
|
||||||
|
rev = "eb00c13d7c9f937732305d47af5b8ccf895e700f";
|
||||||
|
hash = "sha256-p0/inkHPRUkxSIsTmj7VI7sIaX7OXdqjMGZ31W7cnt4=";
|
||||||
|
};
|
||||||
|
|
||||||
|
postPatch = ''
|
||||||
|
patchShebangs utils/ src/py/
|
||||||
|
'';
|
||||||
|
|
||||||
|
patches = [
|
||||||
|
./0001-Remove-relative-config-lookups.patch
|
||||||
|
./0001-Ignore-IPA-signing.patch
|
||||||
|
];
|
||||||
|
|
||||||
|
buildInputs =
|
||||||
|
old.buildInputs
|
||||||
|
++ (with final; [
|
||||||
|
libpisp
|
||||||
|
libglibutil
|
||||||
|
]);
|
||||||
|
|
||||||
|
mesonFlags = old.mesonFlags ++ [
|
||||||
|
"--buildtype=release"
|
||||||
|
"-Dpipelines=rpi/vc4,rpi/pisp"
|
||||||
|
"-Dipas=rpi/vc4,rpi/pisp"
|
||||||
|
"-Dgstreamer=enabled"
|
||||||
|
"-Dtest=false"
|
||||||
|
"-Dcam=enabled"
|
||||||
|
"-Dpycamera=disabled"
|
||||||
|
];
|
||||||
|
});
|
||||||
|
|
||||||
|
camera-streamer = prev.callPackage ../pkgs/camera-streamer/package.nix {
|
||||||
|
libcamera = final.libcamera;
|
||||||
|
};
|
||||||
|
}
|
@ -1,28 +0,0 @@
|
|||||||
{
|
|
||||||
stdenv,
|
|
||||||
fetchurl,
|
|
||||||
lib,
|
|
||||||
}:
|
|
||||||
stdenv.mkDerivation rec {
|
|
||||||
pname = "apple-color-emoji";
|
|
||||||
version = "18.4";
|
|
||||||
|
|
||||||
src = fetchurl {
|
|
||||||
url = "https://github.com/samuelngs/apple-emoji-linux/releases/download/v${version}/AppleColorEmoji.ttf";
|
|
||||||
hash = "sha256-pP0He9EUN7SUDYzwj0CE4e39SuNZ+SVz7FdmUviF6r0=";
|
|
||||||
};
|
|
||||||
|
|
||||||
dontUnpack = true;
|
|
||||||
|
|
||||||
installPhase = ''
|
|
||||||
install -Dm644 $src -t $out/share/fonts/truetype
|
|
||||||
'';
|
|
||||||
|
|
||||||
meta = {
|
|
||||||
description = "Apple Color Emoji for Linux";
|
|
||||||
longDescription = "Brings Apple's vibrant emojis to your Linux experience";
|
|
||||||
homepage = "https://github.com/samuelngs/apple-emoji-linux";
|
|
||||||
license = lib.licenses.unfree;
|
|
||||||
platforms = lib.platforms.unix;
|
|
||||||
};
|
|
||||||
}
|
|
24
pkgs/camera-streamer/0001-Disable-libdatachannel.patch
Normal file
24
pkgs/camera-streamer/0001-Disable-libdatachannel.patch
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
From 0f17bb86772afe9495891e420a809a0b3c071caf Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jordan Holt <jordan@vimium.com>
|
||||||
|
Date: Sat, 10 Aug 2024 15:37:15 +0100
|
||||||
|
Subject: [PATCH] Disable libdatachannel
|
||||||
|
|
||||||
|
---
|
||||||
|
Makefile | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/Makefile b/Makefile
|
||||||
|
index d5029bd..e50ba1a 100644
|
||||||
|
--- a/Makefile
|
||||||
|
+++ b/Makefile
|
||||||
|
@@ -23,7 +23,7 @@ USE_HW_H264 ?= 1
|
||||||
|
USE_FFMPEG ?= $(shell pkg-config libavutil libavformat libavcodec && echo 1)
|
||||||
|
USE_LIBCAMERA ?= $(shell pkg-config libcamera && echo 1)
|
||||||
|
USE_RTSP ?= $(shell pkg-config live555 && echo 1)
|
||||||
|
-USE_LIBDATACHANNEL ?= $(shell [ -e $(LIBDATACHANNEL_PATH)/CMakeLists.txt ] && echo 1)
|
||||||
|
+USE_LIBDATACHANNEL ?= 0
|
||||||
|
|
||||||
|
ifeq (1,$(DEBUG))
|
||||||
|
CFLAGS += -g
|
||||||
|
--
|
||||||
|
2.44.1
|
82
pkgs/camera-streamer/package.nix
Normal file
82
pkgs/camera-streamer/package.nix
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
{
|
||||||
|
stdenv,
|
||||||
|
fetchFromGitHub,
|
||||||
|
|
||||||
|
cmake,
|
||||||
|
gnumake,
|
||||||
|
pkg-config,
|
||||||
|
xxd,
|
||||||
|
|
||||||
|
v4l-utils,
|
||||||
|
nlohmann_json,
|
||||||
|
ffmpegSupport ? true,
|
||||||
|
ffmpeg,
|
||||||
|
libcameraSupport ? true,
|
||||||
|
libcamera,
|
||||||
|
rtspSupport ? false,
|
||||||
|
live555,
|
||||||
|
webrtcSupport ? false,
|
||||||
|
openssl,
|
||||||
|
|
||||||
|
lib,
|
||||||
|
}:
|
||||||
|
|
||||||
|
stdenv.mkDerivation (finalAttrs: {
|
||||||
|
pname = "camera-streamer";
|
||||||
|
version = "0.2.8";
|
||||||
|
|
||||||
|
src = fetchFromGitHub {
|
||||||
|
owner = "ayufan";
|
||||||
|
repo = "camera-streamer";
|
||||||
|
rev = "refs/tags/v${finalAttrs.version}";
|
||||||
|
hash = "sha256-8vV8BMFoDeh22I1/qxk6zttJROaD/lrThBxXHZSPpT4=";
|
||||||
|
fetchSubmodules = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
patches = [
|
||||||
|
./0001-Disable-libdatachannel.patch
|
||||||
|
];
|
||||||
|
|
||||||
|
# Second replacement fixes literal newline in generated version.h.
|
||||||
|
postPatch = ''
|
||||||
|
substituteInPlace Makefile \
|
||||||
|
--replace '/usr/local/bin' '/bin' \
|
||||||
|
--replace 'echo "#define' 'echo -e "#define'
|
||||||
|
'';
|
||||||
|
|
||||||
|
env.NIX_CFLAGS_COMPILE = builtins.toString [
|
||||||
|
"-Wno-error=stringop-overflow"
|
||||||
|
"-Wno-error=format"
|
||||||
|
"-Wno-format"
|
||||||
|
"-Wno-format-security"
|
||||||
|
"-Wno-error=unused-result"
|
||||||
|
];
|
||||||
|
|
||||||
|
nativeBuildInputs = [
|
||||||
|
cmake
|
||||||
|
gnumake
|
||||||
|
pkg-config
|
||||||
|
xxd
|
||||||
|
];
|
||||||
|
|
||||||
|
dontUseCmakeConfigure = true;
|
||||||
|
|
||||||
|
buildInputs =
|
||||||
|
[
|
||||||
|
nlohmann_json
|
||||||
|
v4l-utils
|
||||||
|
]
|
||||||
|
++ (lib.optional ffmpegSupport ffmpeg)
|
||||||
|
++ (lib.optional libcameraSupport libcamera)
|
||||||
|
++ (lib.optional rtspSupport live555)
|
||||||
|
++ (lib.optional webrtcSupport openssl);
|
||||||
|
|
||||||
|
installFlags = [ "DESTDIR=${builtins.placeholder "out"}" ];
|
||||||
|
preInstall = "mkdir -p $out/bin";
|
||||||
|
|
||||||
|
meta = with lib; {
|
||||||
|
description = "High-performance low-latency camera streamer for Raspberry Pi's";
|
||||||
|
website = "https://github.com/ayufan/camera-streamer";
|
||||||
|
license = licenses.gpl3Only;
|
||||||
|
};
|
||||||
|
})
|
@ -1,172 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"pname": "MeiliSearch",
|
|
||||||
"version": "0.15.0",
|
|
||||||
"hash": "sha256-MM8Z8xc+AG0m+jNXAHSLhUB2egJC4lI+u6BDTVaOwzg="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "Microsoft.AspNetCore.OpenApi",
|
|
||||||
"version": "8.0.4",
|
|
||||||
"hash": "sha256-Y/UnyBlwraJjxDmEO3vsgB63GO1M7OXyIS10vL1Fs5A="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "Microsoft.Data.Sqlite",
|
|
||||||
"version": "8.0.6",
|
|
||||||
"hash": "sha256-t1g1cF4T26Np10H7opo/vCMTMNb9SS9pmLA9pSCUBp4="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "Microsoft.Data.Sqlite.Core",
|
|
||||||
"version": "8.0.6",
|
|
||||||
"hash": "sha256-MgUBbb0LDM1ixm8pBfBrSTVjNoGFn6NQMD36mirELmo="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "Microsoft.Extensions.ApiDescription.Server",
|
|
||||||
"version": "6.0.5",
|
|
||||||
"hash": "sha256-RJjBWz+UHxkQE2s7CeGYdTZ218mCufrxl0eBykZdIt4="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "Microsoft.Extensions.Logging.Abstractions",
|
|
||||||
"version": "2.1.1",
|
|
||||||
"hash": "sha256-TzbYgz4EemrYKHMvB9HWDkFmq0BkTetKPUwBpYHk9+k="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "Microsoft.IdentityModel.Abstractions",
|
|
||||||
"version": "7.4.0",
|
|
||||||
"hash": "sha256-rzTsvh5hDX7zk6wYzUKNg7lIQf38G/EeR6qUq/j3Eo0="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "Microsoft.IdentityModel.JsonWebTokens",
|
|
||||||
"version": "7.4.0",
|
|
||||||
"hash": "sha256-IeezkUkScumgLQZqq2Zu4YsyldIUA/XpTeONB2AtYDc="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "Microsoft.IdentityModel.Logging",
|
|
||||||
"version": "7.4.0",
|
|
||||||
"hash": "sha256-rudTpYcSlIlE1OX2LO3Qd6DAisqd5vsuX/Edu7rHIJs="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "Microsoft.IdentityModel.Tokens",
|
|
||||||
"version": "7.4.0",
|
|
||||||
"hash": "sha256-qVqVYxBy5p6Jerd1rfMUgApV7vcH54N4neS2x+N5zRQ="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "Microsoft.OpenApi",
|
|
||||||
"version": "1.2.3",
|
|
||||||
"hash": "sha256-OafkxXKnDmLZo5tjifjycax0n0F/OnWQTEZCntBMYR0="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "Microsoft.OpenApi",
|
|
||||||
"version": "1.4.3",
|
|
||||||
"hash": "sha256-vk47e78OwopXJx2LhDRbKFObqF3GShHfNHR2SzvbQeA="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "Microsoft.Win32.SystemEvents",
|
|
||||||
"version": "6.0.0",
|
|
||||||
"hash": "sha256-N9EVZbl5w1VnMywGXyaVWzT9lh84iaJ3aD48hIBk1zA="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "Quartz",
|
|
||||||
"version": "3.10.0",
|
|
||||||
"hash": "sha256-1sb+JKJdS01lScgVjcbDHxbXSpHeMn1Mqg/CQ8r+BKI="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "SQLitePCLRaw.bundle_e_sqlite3",
|
|
||||||
"version": "2.1.6",
|
|
||||||
"hash": "sha256-dZD/bZsYXjOu46ZH5Y/wgh0uhHOqIxC+S+0ecKhr718="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "SQLitePCLRaw.core",
|
|
||||||
"version": "2.1.6",
|
|
||||||
"hash": "sha256-RxWjm52PdmMV98dgDy0BCpF988+BssRZUgALLv7TH/E="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "SQLitePCLRaw.lib.e_sqlite3",
|
|
||||||
"version": "2.1.6",
|
|
||||||
"hash": "sha256-uHt5d+SFUkSd6WD7Tg0J3e8eVoxy/FM/t4PAkc9PJT0="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "SQLitePCLRaw.provider.e_sqlite3",
|
|
||||||
"version": "2.1.6",
|
|
||||||
"hash": "sha256-zHc/YZsd72eXlI8ba1tv58HZWUIiyjJaxq2CCP1hQe8="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "Swashbuckle.AspNetCore",
|
|
||||||
"version": "6.4.0",
|
|
||||||
"hash": "sha256-czuCv3Os7Oo06m3W+auJjrTGuYT82E+Bi80sJqeVb8o="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "Swashbuckle.AspNetCore.Swagger",
|
|
||||||
"version": "6.4.0",
|
|
||||||
"hash": "sha256-1u4A9vzDUJ+wLoxH5yQEVhpOxi+VnAMd64Z18SLqjPE="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "Swashbuckle.AspNetCore.SwaggerGen",
|
|
||||||
"version": "6.4.0",
|
|
||||||
"hash": "sha256-Alra5J+i0L/4JoS5pATJexVu8LId8HZcofkx7KiRqMw="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "Swashbuckle.AspNetCore.SwaggerUI",
|
|
||||||
"version": "6.4.0",
|
|
||||||
"hash": "sha256-P84wlE4EVruLVGGTUHK29wWYs/BTq/MR5P7PuSBwr+c="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "System.Configuration.ConfigurationManager",
|
|
||||||
"version": "6.0.1",
|
|
||||||
"hash": "sha256-U/0HyekAZK5ya2VNfGA1HeuQyJChoaqcoIv57xLpzLQ="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "System.Drawing.Common",
|
|
||||||
"version": "6.0.0",
|
|
||||||
"hash": "sha256-/9EaAbEeOjELRSMZaImS1O8FmUe8j4WuFUw1VOrPyAo="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "System.IdentityModel.Tokens.Jwt",
|
|
||||||
"version": "7.4.0",
|
|
||||||
"hash": "sha256-LYvdJPbPuxr8V3FJacStflSf9GVStprl1Wr+dfgqMdw="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "System.Memory",
|
|
||||||
"version": "4.5.3",
|
|
||||||
"hash": "sha256-Cvl7RbRbRu9qKzeRBWjavUkseT2jhZBUWV1SPipUWFk="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "System.Net.Http.Json",
|
|
||||||
"version": "6.0.0",
|
|
||||||
"hash": "sha256-R4s4Fb3OTKpg9gXSv+8CQ9gPJPJMmj3/nagzaRndm+g="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "System.Runtime.CompilerServices.Unsafe",
|
|
||||||
"version": "6.0.0",
|
|
||||||
"hash": "sha256-bEG1PnDp7uKYz/OgLOWs3RWwQSVYm+AnPwVmAmcgp2I="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "System.Security.AccessControl",
|
|
||||||
"version": "6.0.0",
|
|
||||||
"hash": "sha256-qOyWEBbNr3EjyS+etFG8/zMbuPjA+O+di717JP9Cxyg="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "System.Security.Cryptography.ProtectedData",
|
|
||||||
"version": "6.0.0",
|
|
||||||
"hash": "sha256-Wi9I9NbZlpQDXgS7Kl06RIFxY/9674S7hKiYw5EabRY="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "System.Security.Permissions",
|
|
||||||
"version": "6.0.0",
|
|
||||||
"hash": "sha256-/MMvtFWGN/vOQfjXdOhet1gsnMgh6lh5DCHimVsnVEs="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "System.Text.Encodings.Web",
|
|
||||||
"version": "6.0.0",
|
|
||||||
"hash": "sha256-UemDHGFoQIG7ObQwRluhVf6AgtQikfHEoPLC6gbFyRo="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "System.Text.Json",
|
|
||||||
"version": "6.0.0",
|
|
||||||
"hash": "sha256-9AE/5ds4DqEfb0l+27fCBTSeYCdRWhxh2Bhg8IKvIuo="
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pname": "System.Windows.Extensions",
|
|
||||||
"version": "6.0.0",
|
|
||||||
"hash": "sha256-N+qg1E6FDJ9A9L50wmVt3xPQV8ZxlG1xeXgFuxO+yfM="
|
|
||||||
}
|
|
||||||
]
|
|
@ -1,36 +0,0 @@
|
|||||||
{
|
|
||||||
lib,
|
|
||||||
fetchFromGitLab,
|
|
||||||
buildDotnetModule,
|
|
||||||
dotnetCorePackages,
|
|
||||||
}:
|
|
||||||
|
|
||||||
buildDotnetModule rec {
|
|
||||||
pname = "jellysearch";
|
|
||||||
version = "0.0.1";
|
|
||||||
|
|
||||||
src = fetchFromGitLab {
|
|
||||||
owner = "DomiStyle";
|
|
||||||
repo = "JellySearch";
|
|
||||||
rev = "7397e3f8c7daa6f0d30b22dda7c5159a913ca6b8";
|
|
||||||
hash = "sha256-7t0j4S5A9yvRN8zjToMNsxJ72OjU3j++EAqq9CKcPaI=";
|
|
||||||
};
|
|
||||||
|
|
||||||
patches = [
|
|
||||||
./patches/Only-listen-on-loopback-interface.patch
|
|
||||||
];
|
|
||||||
|
|
||||||
projectFile = "src/JellySearch/JellySearch.csproj";
|
|
||||||
executables = [ "jellysearch" ];
|
|
||||||
nugetDeps = ./nuget-deps.json;
|
|
||||||
dotnet-sdk = dotnetCorePackages.sdk_8_0;
|
|
||||||
dotnet-runtime = dotnetCorePackages.aspnetcore_8_0;
|
|
||||||
|
|
||||||
meta = with lib; {
|
|
||||||
description = "A fast full-text search proxy for Jellyfin";
|
|
||||||
homepage = "https://gitlab.com/DomiStyle/jellysearch";
|
|
||||||
license = licenses.mit;
|
|
||||||
mainProgram = "JellySearch";
|
|
||||||
platforms = dotnet-runtime.meta.platforms;
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,24 +0,0 @@
|
|||||||
From dede2b55ef53028b1347ccb731657a12d7fa3d15 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Jordan Holt <jordan@vimium.com>
|
|
||||||
Date: Sun, 22 Jun 2025 17:16:56 +0100
|
|
||||||
Subject: [PATCH] Only listen on loopback interface
|
|
||||||
|
|
||||||
---
|
|
||||||
src/JellySearch/Program.cs | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/src/JellySearch/Program.cs b/src/JellySearch/Program.cs
|
|
||||||
index a0c6ee1..98798f7 100644
|
|
||||||
--- a/src/JellySearch/Program.cs
|
|
||||||
+++ b/src/JellySearch/Program.cs
|
|
||||||
@@ -6,7 +6,7 @@ using Quartz.Impl;
|
|
||||||
|
|
||||||
var builder = WebApplication.CreateBuilder(args);
|
|
||||||
|
|
||||||
-builder.WebHost.UseUrls("http://0.0.0.0:5000"); // Listen on every IP
|
|
||||||
+builder.WebHost.UseUrls("http://127.0.0.1:5000"); // Listen on loopback only
|
|
||||||
|
|
||||||
builder.Services.AddCors(options =>
|
|
||||||
{
|
|
||||||
--
|
|
||||||
2.49.0
|
|
@ -1,28 +0,0 @@
|
|||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCocmtyzPPjv+52
|
|
||||||
JiZrpZFfaZ0eeUgugc8gV+0+2Q9GEkl/xxqjiDVg31gBO3iwQov2NmGuPbXr+vwZ
|
|
||||||
QcUqNQakmmdi22tBaTtd6hMuhu9OfbP8sIFaf0dToZRHkPgf63+WCF6w0O9enEz4
|
|
||||||
zjW3kPa1eVRVekiYCXGML/VhN+h5WwWouNWgEOw5JH39ZuGmhsGN5XekkHtyMkwq
|
|
||||||
Vr+JodoSizhYs9VBYNA1J4PlyiS4BYr4pLiLffzPwRjcSS777x33g+nWNr1lsFxB
|
|
||||||
nDoVvVnq0E7fiXxlmCtAr/7dv0Ug5ixuNfZ9yoT0f+mfUiG/anmfodHujIm2Db37
|
|
||||||
jvmfxaq1AgMBAAECggEAFhJKBHSY92xod0g37A55fiZFTV8oZ1mgdXU386522yBd
|
|
||||||
y5Wf5rIcBmm1axHrFjNeCgClq3JQEk/kdP3Ccy2YBXzq04/7HYrHmd5oLYZGOINt
|
|
||||||
kExjYqN/SdTH7FmxPWN66AKIP8RcvQmfZ1GDxd4DiZNQitO3S96e53bIQPkVp8Lg
|
|
||||||
GfK6LQCdOGimD00wvRoeqbV0PWGGVMfx+KvD5hxKYolyi/hNUxToD28qCAoMlMTi
|
|
||||||
yL+17q3nIYZvUmL0k7d64U+lXF8ov3cVXNJzAzFi41MXZ2Xqk3Lj+IhNweUhlOyn
|
|
||||||
fTo8QntNlirNL/XmtJ+5mPbGufE/6zsSNOf2Cyz2aQKBgQDio/tA3tFBzOz31hox
|
|
||||||
gW6NKarhp7e5R3XHQjZPmQXKq2lGCTBN+LzwCLYDa+ZWkS+cel/xSbkUFl0dopCu
|
|
||||||
7uGrSvmVAv+l1k879WHsYmLlDjJSa8WmDtVQ0SJr70X9UJmD2BivWnTnzrpZFu2A
|
|
||||||
Nv57gvebJTI4tLfAAyIfbg8gOQKBgQC+RJRv8/jVha/4sPonQYvpH0scS0Xzwca6
|
|
||||||
xd23e+vULBpk7IVzMbVGJEDdfWXVJeAO++FSQcgTJA38nfYm2XRPZAProliLaW8o
|
|
||||||
XVhhhWbXP7Jc8BmL5zyfDaLOXNFBX2kfr/oKeOoQ+0dRDlWKlarw1SxC+RT6i2qQ
|
|
||||||
YETgXHKmXQKBgGk8mWsqy2HRZOtDqE/6eLnlciprtVy7+M14Sj21oUHVTAGwPJTH
|
|
||||||
/fs7IEEAdikWK1RuYmRoxh60r7IWDTadR35BRxjRFqILnCkMLNcVbDRN3kH1NwZ/
|
|
||||||
dr+bDG+v4ADazx2wVu39g7Erhc3eXpOddZcmXhDVObeo+nWXPt33PeDJAoGBAJ4v
|
|
||||||
+FVnuo8Tee1Cfogat87W5KSedIcnqSjpjt+Y2MXq8PrNplnSjwrE42UCd6KRvcnX
|
|
||||||
Ykr4Q/ad+D75uYgtLMVAuv2yWPl3bCJcETnrJkh5PbqFKEgntT/rn1sA0j0OrSDa
|
|
||||||
NwFz6+64a1+ZkkcJDjjykr0Px4BSXwOv9jOuyOdFAoGADZEADOLX5y4utxboe1M0
|
|
||||||
UnaFKGEDE6H8qdRJQ9bSvEwJI142al02CvnvqvP4cpd8rKOCRs9nSXFJFXCedTLy
|
|
||||||
ojSVfjTyJMTVJxab/c/Qugkxb/TqGfEnZF2yoTsfPYp2pXRd6DvyKlDQzlSOj933
|
|
||||||
FrqeSe1QKapuPRsujVwLZDU=
|
|
||||||
-----END PRIVATE KEY-----
|
|
@ -1,66 +0,0 @@
|
|||||||
{
|
|
||||||
lib,
|
|
||||||
fetchFromGitHub,
|
|
||||||
libcamera,
|
|
||||||
boost,
|
|
||||||
nlohmann_json,
|
|
||||||
python3Packages,
|
|
||||||
git,
|
|
||||||
cacert,
|
|
||||||
meson,
|
|
||||||
}:
|
|
||||||
libcamera.overrideAttrs (old: {
|
|
||||||
buildInputs = old.buildInputs ++ [
|
|
||||||
boost
|
|
||||||
nlohmann_json
|
|
||||||
];
|
|
||||||
nativeBuildInputs = old.nativeBuildInputs ++ [ python3Packages.pybind11 ];
|
|
||||||
|
|
||||||
BOOST_INCLUDEDIR = "${lib.getDev boost}/include";
|
|
||||||
BOOST_LIBRARYDIR = "${lib.getLib boost}/lib";
|
|
||||||
|
|
||||||
patches = [
|
|
||||||
./patches/libcamera-installed.patch
|
|
||||||
./patches/libcamera-no-timeout.patch
|
|
||||||
];
|
|
||||||
|
|
||||||
postPatch =
|
|
||||||
old.postPatch
|
|
||||||
+ ''
|
|
||||||
patchShebangs src/py/libcamera
|
|
||||||
'';
|
|
||||||
|
|
||||||
preBuild = ''
|
|
||||||
ninja src/ipa-priv-key.pem
|
|
||||||
install -D ${./libcamera-rpi-ipa-priv-key.pem} src/ipa-priv-key.pem
|
|
||||||
'';
|
|
||||||
|
|
||||||
mesonFlags = old.mesonFlags ++ [
|
|
||||||
"--buildtype=release"
|
|
||||||
"-Dcam=disabled"
|
|
||||||
"-Dgstreamer=disabled"
|
|
||||||
"-Dipas=rpi/vc4,rpi/pisp"
|
|
||||||
"-Dpipelines=rpi/vc4,rpi/pisp"
|
|
||||||
"-Dtest=false"
|
|
||||||
];
|
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
|
||||||
owner = "raspberrypi";
|
|
||||||
repo = "libcamera";
|
|
||||||
rev = "d83ff0a4ae4503bc56b7ed48cd142c3dd423ad3b";
|
|
||||||
sha256 = "sha256-VP0s1jOON9J3gn81aiemsChvGeqx0PPivQF5rmSga6M=";
|
|
||||||
|
|
||||||
nativeBuildInputs = [ git ];
|
|
||||||
|
|
||||||
postFetch = ''
|
|
||||||
cd "$out"
|
|
||||||
|
|
||||||
export NIX_SSL_CERT_FILE=${cacert}/etc/ssl/certs/ca-bundle.crt
|
|
||||||
|
|
||||||
${lib.getExe meson} subprojects download \
|
|
||||||
libpisp
|
|
||||||
|
|
||||||
find subprojects -type d -name .git -prune -execdir rm -r {} +
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
})
|
|
@ -1,53 +0,0 @@
|
|||||||
From e65bbb6e263d99212cd29a32d89e4c45d0c05353 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Jordan Holt <jordan@vimium.com>
|
|
||||||
Date: Sat, 21 Jun 2025 18:38:38 +0100
|
|
||||||
Subject: [PATCH] libcamera installed
|
|
||||||
|
|
||||||
---
|
|
||||||
src/libcamera/source_paths.cpp | 9 ---------
|
|
||||||
src/py/libcamera/meson.build | 4 ++--
|
|
||||||
2 files changed, 2 insertions(+), 11 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/libcamera/source_paths.cpp b/src/libcamera/source_paths.cpp
|
|
||||||
index 1af5386a..3fc7d044 100644
|
|
||||||
--- a/src/libcamera/source_paths.cpp
|
|
||||||
+++ b/src/libcamera/source_paths.cpp
|
|
||||||
@@ -39,15 +39,6 @@ namespace {
|
|
||||||
*/
|
|
||||||
bool isLibcameraInstalled()
|
|
||||||
{
|
|
||||||
- /*
|
|
||||||
- * DT_RUNPATH (DT_RPATH when the linker uses old dtags) is removed on
|
|
||||||
- * install.
|
|
||||||
- */
|
|
||||||
- for (const ElfW(Dyn) *dyn = _DYNAMIC; dyn->d_tag != DT_NULL; ++dyn) {
|
|
||||||
- if (dyn->d_tag == DT_RUNPATH || dyn->d_tag == DT_RPATH)
|
|
||||||
- return false;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/src/py/libcamera/meson.build b/src/py/libcamera/meson.build
|
|
||||||
index 596a203c..c0b1db59 100644
|
|
||||||
--- a/src/py/libcamera/meson.build
|
|
||||||
+++ b/src/py/libcamera/meson.build
|
|
||||||
@@ -34,14 +34,14 @@ gen_py_controls = files('gen-py-controls.py')
|
|
||||||
pycamera_sources += custom_target('py_gen_controls',
|
|
||||||
input : controls_files,
|
|
||||||
output : ['py_controls_generated.cpp'],
|
|
||||||
- command : [gen_py_controls, '--mode', 'controls', '-o', '@OUTPUT@',
|
|
||||||
+ command : ['python3', gen_py_controls, '--mode', 'controls', '-o', '@OUTPUT@',
|
|
||||||
'-t', gen_py_controls_template, '@INPUT@'],
|
|
||||||
env : py_build_env)
|
|
||||||
|
|
||||||
pycamera_sources += custom_target('py_gen_properties',
|
|
||||||
input : properties_files,
|
|
||||||
output : ['py_properties_generated.cpp'],
|
|
||||||
- command : [gen_py_controls, '--mode', 'properties', '-o', '@OUTPUT@',
|
|
||||||
+ command : ['python3', gen_py_controls, '--mode', 'properties', '-o', '@OUTPUT@',
|
|
||||||
'-t', gen_py_controls_template, '@INPUT@'],
|
|
||||||
env : py_build_env)
|
|
||||||
|
|
||||||
--
|
|
||||||
2.49.0
|
|
@ -1,29 +0,0 @@
|
|||||||
From 98918c4efdcf03701908bb756f252ba11b59490b Mon Sep 17 00:00:00 2001
|
|
||||||
From: Jordan Holt <jordan@vimium.com>
|
|
||||||
Date: Sat, 21 Jun 2025 18:41:54 +0100
|
|
||||||
Subject: [PATCH] libcamera no timeout
|
|
||||||
|
|
||||||
---
|
|
||||||
src/libcamera/ipc_pipe_unixsocket.cpp | 2 ++
|
|
||||||
1 file changed, 2 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/src/libcamera/ipc_pipe_unixsocket.cpp b/src/libcamera/ipc_pipe_unixsocket.cpp
|
|
||||||
index 668ec73b..faf7e2a5 100644
|
|
||||||
--- a/src/libcamera/ipc_pipe_unixsocket.cpp
|
|
||||||
+++ b/src/libcamera/ipc_pipe_unixsocket.cpp
|
|
||||||
@@ -130,11 +130,13 @@ int IPCPipeUnixSocket::call(const IPCUnixSocket::Payload &message,
|
|
||||||
/* \todo Make this less dangerous, see IPCPipe::sendSync() */
|
|
||||||
timeout.start(2000ms);
|
|
||||||
while (!iter->second.done) {
|
|
||||||
+ #if 0
|
|
||||||
if (!timeout.isRunning()) {
|
|
||||||
LOG(IPCPipe, Error) << "Call timeout!";
|
|
||||||
callData_.erase(iter);
|
|
||||||
return -ETIMEDOUT;
|
|
||||||
}
|
|
||||||
+ #endif
|
|
||||||
|
|
||||||
Thread::current()->eventDispatcher()->processEvents();
|
|
||||||
}
|
|
||||||
--
|
|
||||||
2.49.0
|
|
@ -1,68 +1,58 @@
|
|||||||
{
|
{
|
||||||
stdenv,
|
stdenv,
|
||||||
callPackage,
|
|
||||||
fetchFromGitHub,
|
fetchFromGitHub,
|
||||||
makeWrapper,
|
|
||||||
meson,
|
meson,
|
||||||
ninja,
|
ninja,
|
||||||
pkg-config,
|
pkg-config,
|
||||||
boost,
|
boost,
|
||||||
ffmpeg-headless,
|
ffmpeg,
|
||||||
|
libcamera,
|
||||||
libdrm,
|
libdrm,
|
||||||
libepoxy,
|
|
||||||
libexif,
|
libexif,
|
||||||
libjpeg,
|
libjpeg,
|
||||||
libpng,
|
libpng,
|
||||||
libtiff,
|
libtiff,
|
||||||
libX11,
|
lib,
|
||||||
}:
|
}:
|
||||||
let
|
|
||||||
libcamera-rpi = callPackage (import ../libcamera-rpi/package.nix) { };
|
|
||||||
in
|
|
||||||
stdenv.mkDerivation (finalAttrs: {
|
stdenv.mkDerivation (finalAttrs: {
|
||||||
pname = "rpicam-apps";
|
pname = "rpicam-apps";
|
||||||
version = "1.7.0";
|
version = "1.4.1";
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
owner = "raspberrypi";
|
owner = "raspberrypi";
|
||||||
repo = "rpicam-apps";
|
repo = "rpicam-apps";
|
||||||
rev = "v${finalAttrs.version}";
|
rev = "v" + finalAttrs.version;
|
||||||
hash = "sha256-79qpAfY83YOZdM5ZPyIOkg3s7x75hvjG6Cc96UAIdb0=";
|
hash = "sha256-3NG2ZE/Ub3lTbfne0LCXuDgLGTPaAAADRdElEbZwvls=";
|
||||||
};
|
};
|
||||||
|
|
||||||
buildInputs = [
|
|
||||||
boost
|
|
||||||
ffmpeg-headless
|
|
||||||
libcamera-rpi
|
|
||||||
libdrm
|
|
||||||
libepoxy # GLES/EGL preview window
|
|
||||||
libexif
|
|
||||||
libjpeg
|
|
||||||
libpng
|
|
||||||
libtiff
|
|
||||||
libX11
|
|
||||||
];
|
|
||||||
|
|
||||||
nativeBuildInputs = [
|
nativeBuildInputs = [
|
||||||
makeWrapper
|
|
||||||
meson
|
meson
|
||||||
ninja
|
ninja
|
||||||
pkg-config
|
pkg-config
|
||||||
];
|
];
|
||||||
|
|
||||||
# See all options here: https://github.com/raspberrypi/rpicam-apps/blob/main/meson_options.txt
|
buildInputs = [
|
||||||
mesonFlags = [
|
boost
|
||||||
"-Denable_drm=disabled"
|
ffmpeg
|
||||||
"-Denable_egl=disabled"
|
libcamera
|
||||||
"-Denable_hailo=disabled"
|
libdrm
|
||||||
"-Denable_qt=disabled"
|
libexif
|
||||||
"-Denable_libav=disabled"
|
libjpeg
|
||||||
|
libpng
|
||||||
|
libtiff
|
||||||
];
|
];
|
||||||
|
|
||||||
postInstall = ''
|
# Meson is no longer able to pick up Boost automatically:
|
||||||
for f in rpicam-hello rpicam-jpeg rpicam-raw rpicam-still rpicam-vid
|
# https://github.com/NixOS/nixpkgs/issues/86131
|
||||||
do
|
BOOST_INCLUDEDIR = "${lib.getDev boost}/include";
|
||||||
wrapProgram $out/bin/$f --set-default LIBCAMERA_IPA_PROXY_PATH ${libcamera-rpi}/libexec/libcamera
|
BOOST_LIBRARYDIR = "${lib.getLib boost}/lib";
|
||||||
done
|
|
||||||
'';
|
meta = with lib; {
|
||||||
|
description = ''
|
||||||
|
libcamera-based applications to drive the cameras on a Raspberry Pi platform
|
||||||
|
'';
|
||||||
|
homepage = "https://github.com/raspberrypi/rpicam-apps";
|
||||||
|
license = licenses.bsd2;
|
||||||
|
};
|
||||||
})
|
})
|
||||||
|
@ -1,20 +0,0 @@
|
|||||||
{
|
|
||||||
stdenv,
|
|
||||||
fetchFromGitHub,
|
|
||||||
}:
|
|
||||||
stdenv.mkDerivation {
|
|
||||||
pname = "segoe-ui";
|
|
||||||
version = "unstable-2024-05-16";
|
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
|
||||||
owner = "mrbvrz";
|
|
||||||
repo = "segoe-ui-linux";
|
|
||||||
rev = "a89213b7136da6dd5c3638db1f2c6e814c40fa84";
|
|
||||||
hash = "sha256-0KXfNu/J1/OUnj0jeQDnYgTdeAIHcV+M+vCPie6AZcU=";
|
|
||||||
};
|
|
||||||
|
|
||||||
installPhase = ''
|
|
||||||
mkdir -p $out/share/fonts/truetype
|
|
||||||
install -m644 $src/font/*.ttf $out/share/fonts/truetype/
|
|
||||||
'';
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
{
|
|
||||||
stdenv,
|
|
||||||
fetchFromGitHub,
|
|
||||||
lib,
|
|
||||||
}:
|
|
||||||
stdenv.mkDerivation {
|
|
||||||
pname = "sf-pro";
|
|
||||||
version = "unstable-2021-06-22";
|
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
|
||||||
owner = "sahibjotsaggu";
|
|
||||||
repo = "San-Francisco-Pro-Fonts";
|
|
||||||
rev = "8bfea09aa6f1139479f80358b2e1e5c6dc991a58";
|
|
||||||
sha256 = "sha256-mAXExj8n8gFHq19HfGy4UOJYKVGPYgarGd/04kUIqX4=";
|
|
||||||
};
|
|
||||||
|
|
||||||
installPhase = ''
|
|
||||||
mkdir -p $out/share/fonts/opentype
|
|
||||||
mkdir -p $out/share/fonts/truetype
|
|
||||||
install -m644 $src/*.otf $out/share/fonts/opentype/
|
|
||||||
install -m644 $src/*.ttf $out/share/fonts/truetype/
|
|
||||||
'';
|
|
||||||
|
|
||||||
meta = {
|
|
||||||
description = "San Francisco Pro fonts";
|
|
||||||
homepage = "https://github.com/sahibjotsaggu/San-Francisco-Pro-Fonts";
|
|
||||||
license = lib.licenses.unfree;
|
|
||||||
};
|
|
||||||
}
|
|
@ -0,0 +1,25 @@
|
|||||||
|
From 18efb9b5c8e562b169425f6ba79977e52e8b91b9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Pavel Sobolev <paveloomm@gmail.com>
|
||||||
|
Date: Sat, 13 Jan 2024 12:49:45 +0000
|
||||||
|
Subject: [PATCH] Ensure the default config file is writable.
|
||||||
|
|
||||||
|
---
|
||||||
|
streamrip/config.py | 3 +++
|
||||||
|
1 file changed, 3 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/streamrip/config.py b/streamrip/config.py
|
||||||
|
index 7ee2f57..88a5fef 100644
|
||||||
|
--- a/streamrip/config.py
|
||||||
|
+++ b/streamrip/config.py
|
||||||
|
@@ -378,6 +378,9 @@ def set_user_defaults(path: str, /):
|
||||||
|
"""Update the TOML file at the path with user-specific default values."""
|
||||||
|
shutil.copy(BLANK_CONFIG_PATH, path)
|
||||||
|
|
||||||
|
+ # Ensure the default config file is writable
|
||||||
|
+ os.chmod(path, 0o644)
|
||||||
|
+
|
||||||
|
with open(path) as f:
|
||||||
|
toml = parse(f.read())
|
||||||
|
toml["downloads"]["folder"] = DEFAULT_DOWNLOADS_FOLDER # type: ignore
|
||||||
|
--
|
||||||
|
2.42.0
|
78
pkgs/streamrip/package.nix
Normal file
78
pkgs/streamrip/package.nix
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
{
|
||||||
|
lib,
|
||||||
|
python3Packages,
|
||||||
|
fetchFromGitHub,
|
||||||
|
|
||||||
|
ffmpeg,
|
||||||
|
}:
|
||||||
|
|
||||||
|
python3Packages.buildPythonApplication {
|
||||||
|
pname = "streamrip";
|
||||||
|
version = "2.0.7";
|
||||||
|
pyproject = true;
|
||||||
|
|
||||||
|
src = fetchFromGitHub {
|
||||||
|
owner = "nathom";
|
||||||
|
repo = "streamrip";
|
||||||
|
rev = "46b570dbb6f81d604cbaa3bfa379463e0a20a841";
|
||||||
|
hash = "sha256-LD99OjguaBnrQxCwmCeHvmBMq5aOfobwnMd5/aCRZW8=";
|
||||||
|
};
|
||||||
|
|
||||||
|
patches = [
|
||||||
|
./ensure-the-default-config-file-is-writable.patch
|
||||||
|
];
|
||||||
|
|
||||||
|
nativeBuildInputs = with python3Packages; [
|
||||||
|
poetry-core
|
||||||
|
];
|
||||||
|
|
||||||
|
propagatedBuildInputs = with python3Packages; [
|
||||||
|
aiodns
|
||||||
|
aiofiles
|
||||||
|
aiohttp
|
||||||
|
aiolimiter
|
||||||
|
appdirs
|
||||||
|
cleo
|
||||||
|
click-help-colors
|
||||||
|
deezer-py
|
||||||
|
m3u8
|
||||||
|
mutagen
|
||||||
|
pathvalidate
|
||||||
|
pillow
|
||||||
|
pycryptodomex
|
||||||
|
pytest-asyncio
|
||||||
|
pytest-mock
|
||||||
|
rich
|
||||||
|
simple-term-menu
|
||||||
|
tomlkit
|
||||||
|
tqdm
|
||||||
|
];
|
||||||
|
|
||||||
|
nativeCheckInputs = with python3Packages; [
|
||||||
|
pytestCheckHook
|
||||||
|
];
|
||||||
|
|
||||||
|
prePatch = ''
|
||||||
|
sed -i 's#aiofiles = ".*"#aiofiles = "*"#' pyproject.toml
|
||||||
|
sed -i 's#deezer-py = ".*"#deezer-py = "*"#' pyproject.toml
|
||||||
|
sed -i 's#m3u8 = ".*"#m3u8 = "*"#' pyproject.toml
|
||||||
|
sed -i 's#pathvalidate = ".*"#pathvalidate = "*"#' pyproject.toml
|
||||||
|
sed -i 's#Pillow = ".*"#Pillow = "*"#' pyproject.toml
|
||||||
|
sed -i 's#pytest-asyncio = ".*"#pytest-asyncio = "*"#' pyproject.toml
|
||||||
|
sed -i 's#tomlkit = ".*"#tomlkit = "*"#' pyproject.toml
|
||||||
|
|
||||||
|
sed -i 's#"ffmpeg"#"${lib.getBin ffmpeg}/bin/ffmpeg"#g' streamrip/client/downloadable.py
|
||||||
|
'';
|
||||||
|
|
||||||
|
preCheck = ''
|
||||||
|
export HOME=$(mktemp -d)
|
||||||
|
'';
|
||||||
|
|
||||||
|
meta = with lib; {
|
||||||
|
description = "Scriptable music downloader for Qobuz, Tidal, SoundCloud, and Deezer";
|
||||||
|
homepage = "https://github.com/nathom/streamrip";
|
||||||
|
license = licenses.gpl3Only;
|
||||||
|
maintainers = with maintainers; [ paveloom ];
|
||||||
|
mainProgram = "rip";
|
||||||
|
};
|
||||||
|
}
|
@ -1,16 +0,0 @@
|
|||||||
{
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
./common/optional/graphical/firefox.nix
|
|
||||||
./common/optional/graphical/gnome.nix
|
|
||||||
];
|
|
||||||
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
jellyfin-media-player
|
|
||||||
qbittorrent
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
{
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
{
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
adwaita-fonts
|
|
||||||
apple-color-emoji
|
|
||||||
corefonts
|
|
||||||
nerd-fonts.bigblue-terminal
|
|
||||||
nerd-fonts.comic-shanns-mono
|
|
||||||
nerd-fonts.terminess-ttf
|
|
||||||
nerd-fonts.ubuntu-mono
|
|
||||||
sf-pro
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,318 +0,0 @@
|
|||||||
{
|
|
||||||
inputs,
|
|
||||||
lib,
|
|
||||||
pkgs,
|
|
||||||
osConfig,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
let
|
|
||||||
inherit (lib)
|
|
||||||
attrValues
|
|
||||||
concatStringsSep
|
|
||||||
elem
|
|
||||||
mapAttrs
|
|
||||||
mkIf
|
|
||||||
versionOlder
|
|
||||||
;
|
|
||||||
inherit (lib.generators)
|
|
||||||
toINI
|
|
||||||
;
|
|
||||||
concatMapAttrsStringSep =
|
|
||||||
sep: f: attrs:
|
|
||||||
concatStringsSep sep (attrValues (mapAttrs f attrs));
|
|
||||||
globalVariables =
|
|
||||||
{
|
|
||||||
_JAVA_AWT_WM_NONREPARENTING = "1";
|
|
||||||
GDK_BACKEND = "wayland";
|
|
||||||
MOZ_ENABLE_WAYLAND = "1";
|
|
||||||
NIXOS_OZONE_WL = "1";
|
|
||||||
QT_QPA_PLATFORM = "wayland";
|
|
||||||
QT_STYLE_OVERRIDE = "kvantum";
|
|
||||||
QT_WAYLAND_DECORATION = "adwaita";
|
|
||||||
QT_WAYLAND_DISABLE_WINDOWDECORATION = "1";
|
|
||||||
SDL_VIDEODRIVER = "wayland";
|
|
||||||
XDG_SESSION_TYPE = "wayland";
|
|
||||||
}
|
|
||||||
// (
|
|
||||||
if elem "nvidia" osConfig.services.xserver.videoDrivers then
|
|
||||||
{
|
|
||||||
GBM_BACKEND = "nvidia-drm";
|
|
||||||
GSK_RENDERER =
|
|
||||||
if versionOlder osConfig.hardware.nvidia.package.version "570" then "ngl" else "vulkan";
|
|
||||||
LIBVA_DRIVER_NAME = "nvidia";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{ }
|
|
||||||
);
|
|
||||||
hyprVariables = {
|
|
||||||
AQ_DRM_DEVICES = "/dev/dri/card0:/dev/dri/card1";
|
|
||||||
};
|
|
||||||
in
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
./hypridle.nix
|
|
||||||
./hyprlock.nix
|
|
||||||
./hyprpaper.nix
|
|
||||||
./waybar.nix
|
|
||||||
];
|
|
||||||
|
|
||||||
wayland.windowManager.hyprland = {
|
|
||||||
enable = true;
|
|
||||||
package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland;
|
|
||||||
portalPackage =
|
|
||||||
inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland;
|
|
||||||
plugins = [
|
|
||||||
pkgs.unstable.hyprlandPlugins.hyprbars
|
|
||||||
pkgs.unstable.hyprlandPlugins.hypr-dynamic-cursors
|
|
||||||
];
|
|
||||||
settings = {
|
|
||||||
general = {
|
|
||||||
gaps_in = 5;
|
|
||||||
gaps_out = 20;
|
|
||||||
|
|
||||||
border_size = 2;
|
|
||||||
|
|
||||||
allow_tearing = false;
|
|
||||||
layout = "dwindle";
|
|
||||||
};
|
|
||||||
|
|
||||||
plugin = {
|
|
||||||
dynamic-cursors = {
|
|
||||||
enabled = true;
|
|
||||||
mode = "none";
|
|
||||||
shake = {
|
|
||||||
enabled = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
hyprbars = {
|
|
||||||
enabled = true;
|
|
||||||
bar_height = 20;
|
|
||||||
bar_blur = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
dwindle = {
|
|
||||||
pseudotile = true;
|
|
||||||
preserve_split = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
master = {
|
|
||||||
new_status = "master";
|
|
||||||
};
|
|
||||||
|
|
||||||
misc = {
|
|
||||||
force_default_wallpaper = 0;
|
|
||||||
disable_hyprland_logo = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
ecosystem = {
|
|
||||||
no_donation_nag = true;
|
|
||||||
no_update_news = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
decoration = {
|
|
||||||
rounding = 10;
|
|
||||||
|
|
||||||
active_opacity = 1.0;
|
|
||||||
inactive_opacity = 1.0;
|
|
||||||
|
|
||||||
shadow = {
|
|
||||||
enabled = true;
|
|
||||||
range = 4;
|
|
||||||
render_power = 3;
|
|
||||||
};
|
|
||||||
|
|
||||||
blur = {
|
|
||||||
enabled = true;
|
|
||||||
size = 3;
|
|
||||||
passes = 1;
|
|
||||||
|
|
||||||
vibrancy = 0.1696;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
animations = {
|
|
||||||
enabled = true;
|
|
||||||
bezier = [
|
|
||||||
"easeOutQuint,0.23,1,0.32,1"
|
|
||||||
"easeInOutCubic,0.65,0.05,0.36,1"
|
|
||||||
"linear,0,0,1,1"
|
|
||||||
"almostLinear,0.5,0.5,0.75,1.0"
|
|
||||||
"quick,0.15,0,0.1,1"
|
|
||||||
];
|
|
||||||
animation = [
|
|
||||||
"global, 1, 10, default"
|
|
||||||
"border, 1, 5.39, easeOutQuint"
|
|
||||||
"windows, 1, 4.79, easeOutQuint"
|
|
||||||
"windowsIn, 1, 4.1, easeOutQuint, popin 87%"
|
|
||||||
"windowsOut, 1, 1.49, linear, popin 87%"
|
|
||||||
"fadeIn, 1, 1.73, almostLinear"
|
|
||||||
"fadeOut, 1, 1.46, almostLinear"
|
|
||||||
"fade, 1, 3.03, quick"
|
|
||||||
"layers, 1, 3.81, easeOutQuint"
|
|
||||||
"layersIn, 1, 4, easeOutQuint, fade"
|
|
||||||
"layersOut, 1, 1.5, linear, fade"
|
|
||||||
"fadeLayersIn, 1, 1.79, almostLinear"
|
|
||||||
"fadeLayersOut, 1, 1.39, almostLinear"
|
|
||||||
"workspaces, 1, 1.94, almostLinear, fade"
|
|
||||||
"workspacesIn, 1, 1.21, almostLinear, fade"
|
|
||||||
"workspacesOut, 1, 1.94, almostLinear, fade"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
monitor = "desc:Dell Inc. DELL U3219Q HPTP413, preferred, auto, 1";
|
|
||||||
|
|
||||||
input = {
|
|
||||||
kb_layout = "us";
|
|
||||||
kb_options = "caps:super";
|
|
||||||
follow_mouse = 1;
|
|
||||||
sensitivity = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
device = {
|
|
||||||
name = "mx-anywhere-3s-mouse";
|
|
||||||
sensitivity = -0.5;
|
|
||||||
};
|
|
||||||
|
|
||||||
"$terminal" = "kitty";
|
|
||||||
"$fileManager" = "thunar";
|
|
||||||
"$menu" = "anyrun";
|
|
||||||
"$mainMod" = "SUPER";
|
|
||||||
|
|
||||||
bind = [
|
|
||||||
"$mainMod, Q, exec, $terminal"
|
|
||||||
"$mainMod, C, killactive,"
|
|
||||||
"$mainMod, M, exit,"
|
|
||||||
"$mainMod, E, exec, $fileManager"
|
|
||||||
"$mainMod, V, togglefloating,"
|
|
||||||
"$mainMod, R, exec, $menu"
|
|
||||||
"$mainMod, P, pseudo, # dwindle"
|
|
||||||
"$mainMod, J, togglesplit, # dwindle"
|
|
||||||
"$mainMod, left, movefocus, l"
|
|
||||||
"$mainMod, right, movefocus, r"
|
|
||||||
"$mainMod, up, movefocus, u"
|
|
||||||
"$mainMod, down, movefocus, d"
|
|
||||||
"$mainMod, 1, workspace, 1"
|
|
||||||
"$mainMod, 2, workspace, 2"
|
|
||||||
"$mainMod, 3, workspace, 3"
|
|
||||||
"$mainMod, 4, workspace, 4"
|
|
||||||
"$mainMod, 5, workspace, 5"
|
|
||||||
"$mainMod, 6, workspace, 6"
|
|
||||||
"$mainMod, 7, workspace, 7"
|
|
||||||
"$mainMod, 8, workspace, 8"
|
|
||||||
"$mainMod, 9, workspace, 9"
|
|
||||||
"$mainMod, 0, workspace, 10"
|
|
||||||
"$mainMod SHIFT, 1, movetoworkspace, 1"
|
|
||||||
"$mainMod SHIFT, 2, movetoworkspace, 2"
|
|
||||||
"$mainMod SHIFT, 3, movetoworkspace, 3"
|
|
||||||
"$mainMod SHIFT, 4, movetoworkspace, 4"
|
|
||||||
"$mainMod SHIFT, 5, movetoworkspace, 5"
|
|
||||||
"$mainMod SHIFT, 6, movetoworkspace, 6"
|
|
||||||
"$mainMod SHIFT, 7, movetoworkspace, 7"
|
|
||||||
"$mainMod SHIFT, 8, movetoworkspace, 8"
|
|
||||||
"$mainMod SHIFT, 9, movetoworkspace, 9"
|
|
||||||
"$mainMod SHIFT, 0, movetoworkspace, 10"
|
|
||||||
"$mainMod, S, togglespecialworkspace, magic"
|
|
||||||
"$mainMod SHIFT, S, movetoworkspace, special:magic"
|
|
||||||
"$mainMod, mouse_down, workspace, e+1"
|
|
||||||
"$mainMod, mouse_up, workspace, e-1"
|
|
||||||
];
|
|
||||||
|
|
||||||
bindm = [
|
|
||||||
"$mainMod, mouse:272, movewindow"
|
|
||||||
"$mainMod, mouse:273, resizewindow"
|
|
||||||
];
|
|
||||||
|
|
||||||
bindel = [
|
|
||||||
",XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+"
|
|
||||||
",XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"
|
|
||||||
",XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
|
|
||||||
",XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"
|
|
||||||
",XF86MonBrightnessUp, exec, brightnessctl s 10%+"
|
|
||||||
",XF86MonBrightnessDown, exec, brightnessctl s 10%-"
|
|
||||||
];
|
|
||||||
|
|
||||||
bindl = [
|
|
||||||
", XF86AudioNext, exec, playerctl next"
|
|
||||||
", XF86AudioPause, exec, playerctl play-pause"
|
|
||||||
", XF86AudioPlay, exec, playerctl play-pause"
|
|
||||||
", XF86AudioPrev, exec, playerctl previous"
|
|
||||||
];
|
|
||||||
|
|
||||||
windowrulev2 = [
|
|
||||||
"suppressevent maximize, class:.*"
|
|
||||||
"nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
xdg.configFile = mkIf osConfig.programs.hyprland.withUWSM {
|
|
||||||
"Kvantum/kvantum.kvconfig".text = toINI { } {
|
|
||||||
General.theme = "KvLibadwaitaDark";
|
|
||||||
};
|
|
||||||
"Kvantum/KvLibadwaita".source = "${inputs.kvlibadwaita}/src/KvLibadwaita";
|
|
||||||
"uwsm/env".text = concatMapAttrsStringSep "\n" (
|
|
||||||
name: value: "export ${name}=${value}"
|
|
||||||
) globalVariables;
|
|
||||||
"uwsm/env-hyprland".text = concatMapAttrsStringSep "\n" (
|
|
||||||
name: value: "export ${name}=${value}"
|
|
||||||
) hyprVariables;
|
|
||||||
};
|
|
||||||
|
|
||||||
home.pointerCursor = {
|
|
||||||
enable = true;
|
|
||||||
gtk.enable = true;
|
|
||||||
name = "macOS";
|
|
||||||
package = pkgs.apple-cursor;
|
|
||||||
size = 28;
|
|
||||||
};
|
|
||||||
|
|
||||||
gtk = {
|
|
||||||
enable = true;
|
|
||||||
|
|
||||||
iconTheme = {
|
|
||||||
name = "MoreWaita";
|
|
||||||
package = pkgs.unstable.morewaita-icon-theme;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
fonts.fontconfig = {
|
|
||||||
enable = true;
|
|
||||||
defaultFonts = {
|
|
||||||
sansSerif = [
|
|
||||||
"Adwaita Sans"
|
|
||||||
];
|
|
||||||
emoji = [
|
|
||||||
"Apple Color Emoji"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
programs.kitty = {
|
|
||||||
enable = true;
|
|
||||||
settings = {
|
|
||||||
background = "#000000";
|
|
||||||
background_opacity = 0.7;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
home.packages = with pkgs.unstable; [
|
|
||||||
anyrun
|
|
||||||
clipse
|
|
||||||
dunst
|
|
||||||
libsForQt5.qtstyleplugin-kvantum
|
|
||||||
loupe
|
|
||||||
mpv
|
|
||||||
qadwaitadecorations
|
|
||||||
qadwaitadecorations-qt6
|
|
||||||
wl-clipboard
|
|
||||||
];
|
|
||||||
|
|
||||||
services = {
|
|
||||||
flameshot.enable = true;
|
|
||||||
unclutter.enable = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
services.gpg-agent.pinentry.package = pkgs.pinentry-gnome3;
|
|
||||||
}
|
|
@ -1,28 +0,0 @@
|
|||||||
{
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
{
|
|
||||||
services.hypridle = {
|
|
||||||
enable = true;
|
|
||||||
settings = {
|
|
||||||
general = {
|
|
||||||
after_sleep_cmd = "hyprctl dispatch dpms on";
|
|
||||||
ignore_dbus_inhibit = false;
|
|
||||||
lock_cmd = "hyprlock";
|
|
||||||
};
|
|
||||||
|
|
||||||
listener = [
|
|
||||||
{
|
|
||||||
timeout = 900;
|
|
||||||
on-timeout = "hyprlock";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
timeout = 1200;
|
|
||||||
on-timeout = "hyprctl dispatch dpms off";
|
|
||||||
on-resume = "hyprctl dispatch dpms on";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,51 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
let
|
|
||||||
inherit (lib)
|
|
||||||
getExe
|
|
||||||
;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
wayland.windowManager.hyprland.settings.bind = [
|
|
||||||
"$mainMod, L, exec, uwsm app -- ${getExe config.programs.hyprlock.package}"
|
|
||||||
];
|
|
||||||
|
|
||||||
programs.hyprlock = {
|
|
||||||
enable = true;
|
|
||||||
settings = {
|
|
||||||
general = {
|
|
||||||
disable_loading_bar = false;
|
|
||||||
grace = 3;
|
|
||||||
hide_cursor = true;
|
|
||||||
no_fade_in = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
background = [
|
|
||||||
{
|
|
||||||
path = "screenshot";
|
|
||||||
blur_passes = 3;
|
|
||||||
blur_size = 8;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
input-field = [
|
|
||||||
{
|
|
||||||
size = "200, 50";
|
|
||||||
position = "0, -80";
|
|
||||||
monitor = "";
|
|
||||||
dots_center = true;
|
|
||||||
fade_on_empty = false;
|
|
||||||
font_color = "rgb(202, 211, 245)";
|
|
||||||
inner_color = "rgb(91, 96, 120)";
|
|
||||||
outer_color = "rgb(24, 25, 38)";
|
|
||||||
outline_thickness = 5;
|
|
||||||
placeholder_text = "Password...";
|
|
||||||
shadow_passes = 2;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,21 +0,0 @@
|
|||||||
{
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
{
|
|
||||||
services.hyprpaper = {
|
|
||||||
enable = true;
|
|
||||||
settings = {
|
|
||||||
ipc = "on";
|
|
||||||
splash = false;
|
|
||||||
|
|
||||||
preload = [
|
|
||||||
"/home/jordan/Pictures/Aurora.png"
|
|
||||||
];
|
|
||||||
|
|
||||||
wallpaper = [
|
|
||||||
",/home/jordan/Pictures/Aurora.png"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,15 +0,0 @@
|
|||||||
* {
|
|
||||||
font-family: sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
window#waybar {
|
|
||||||
border-radius: 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.modules-left {
|
|
||||||
margin-left: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.modules-right {
|
|
||||||
margin-right: 10px;
|
|
||||||
}
|
|
@ -1,54 +0,0 @@
|
|||||||
{
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
{
|
|
||||||
programs.waybar = {
|
|
||||||
enable = true;
|
|
||||||
settings = [
|
|
||||||
{
|
|
||||||
layer = "top";
|
|
||||||
position = "top";
|
|
||||||
height = 30;
|
|
||||||
margin = "10 20 0 20";
|
|
||||||
spacing = 10;
|
|
||||||
|
|
||||||
modules-left = [
|
|
||||||
"hyprland/workspaces"
|
|
||||||
];
|
|
||||||
modules-center = [
|
|
||||||
"hyprland/window"
|
|
||||||
];
|
|
||||||
modules-right = [
|
|
||||||
"disk"
|
|
||||||
"cpu"
|
|
||||||
"memory"
|
|
||||||
"privacy"
|
|
||||||
"clock"
|
|
||||||
];
|
|
||||||
|
|
||||||
clock = {
|
|
||||||
format = "{:%I:%M %p}";
|
|
||||||
};
|
|
||||||
|
|
||||||
disk = {
|
|
||||||
format = "{free}";
|
|
||||||
path = "/";
|
|
||||||
};
|
|
||||||
|
|
||||||
privacy = {
|
|
||||||
modules = [
|
|
||||||
{
|
|
||||||
type = "screenshare";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
type = "audio-in";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
];
|
|
||||||
style = ./waybar.css;
|
|
||||||
systemd.enable = true;
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,13 +0,0 @@
|
|||||||
{
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
{
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
hunspell
|
|
||||||
hunspellDicts.en-gb-large
|
|
||||||
hunspellDicts.en-us-large
|
|
||||||
libreoffice
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,12 +0,0 @@
|
|||||||
{
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
{
|
|
||||||
services.ssh-agent.enable = true;
|
|
||||||
|
|
||||||
programs.ssh = {
|
|
||||||
enable = true;
|
|
||||||
addKeysToAgent = "yes";
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,16 +1,11 @@
|
|||||||
{
|
{
|
||||||
inputs,
|
inputs,
|
||||||
lib,
|
|
||||||
config,
|
config,
|
||||||
pkgs,
|
pkgs,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
let
|
let
|
||||||
inherit (lib)
|
|
||||||
optional
|
|
||||||
;
|
|
||||||
name = "jordan";
|
name = "jordan";
|
||||||
hostFile = ./. + "/${config.networking.hostName}.nix";
|
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
age.secrets."passwords/users/jordan".file = "${inputs.secrets}/passwords/users/jordan.age";
|
age.secrets."passwords/users/jordan".file = "${inputs.secrets}/passwords/users/jordan.age";
|
||||||
@ -36,23 +31,16 @@ in
|
|||||||
|
|
||||||
home-manager.users.${name} = {
|
home-manager.users.${name} = {
|
||||||
imports = [
|
imports = [
|
||||||
./common/git.nix
|
./git.nix
|
||||||
./common/gpg.nix
|
./gpg.nix
|
||||||
./common/neovim.nix
|
./graphical
|
||||||
./common/pass.nix
|
./neovim.nix
|
||||||
./common/shell.nix
|
./pass.nix
|
||||||
./common/ssh.nix
|
./shell.nix
|
||||||
] ++ optional (builtins.pathExists hostFile) hostFile;
|
];
|
||||||
|
|
||||||
home = {
|
home = {
|
||||||
username = name;
|
username = name;
|
||||||
};
|
};
|
||||||
|
|
||||||
xdg.enable = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
# Workaround: https://github.com/nix-community/home-manager/issues/7166
|
|
||||||
systemd.services."home-manager-${name}".serviceConfig = {
|
|
||||||
RemainAfterExit = "yes";
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
36
users/jordan/graphical/default.nix
Normal file
36
users/jordan/graphical/default.nix
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
{
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
osConfig,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports =
|
||||||
|
[
|
||||||
|
./firefox.nix
|
||||||
|
./thunderbird.nix
|
||||||
|
]
|
||||||
|
++ lib.optionals osConfig.modules.system.desktop.gnome.enable [
|
||||||
|
./gnome.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
# ardour
|
||||||
|
# audacity
|
||||||
|
# blender
|
||||||
|
# gimp
|
||||||
|
# handbrake
|
||||||
|
# hunspell
|
||||||
|
# hunspellDicts.en-gb-large
|
||||||
|
# hunspellDicts.en-us-large
|
||||||
|
# inkscape
|
||||||
|
# krita
|
||||||
|
# libreoffice
|
||||||
|
# mkvtoolnix
|
||||||
|
# obs-studio
|
||||||
|
qbittorrent
|
||||||
|
# slack
|
||||||
|
# zoom-us
|
||||||
|
];
|
||||||
|
}
|
@ -10,8 +10,7 @@
|
|||||||
enable = true;
|
enable = true;
|
||||||
profiles.Default = {
|
profiles.Default = {
|
||||||
search = {
|
search = {
|
||||||
default = "ddg";
|
default = "DuckDuckGo";
|
||||||
privateDefault = "ddg";
|
|
||||||
force = true;
|
force = true;
|
||||||
};
|
};
|
||||||
userChrome = ''
|
userChrome = ''
|
@ -2,7 +2,6 @@
|
|||||||
inputs,
|
inputs,
|
||||||
lib,
|
lib,
|
||||||
pkgs,
|
pkgs,
|
||||||
osConfig,
|
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
|
|
||||||
@ -191,12 +190,12 @@ in
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
home.sessionVariables = {
|
environment.sessionVariables = {
|
||||||
QT_STYLE_OVERRIDE = mkForce "kvantum";
|
QT_STYLE_OVERRIDE = mkForce "kvantum";
|
||||||
QT_WAYLAND_DECORATION = mkForce "adwaita";
|
QT_WAYLAND_DECORATION = mkForce "adwaita";
|
||||||
};
|
};
|
||||||
|
|
||||||
xdg.configFile = {
|
home.configFile = {
|
||||||
"Kvantum/kvantum.kvconfig".text = toINI { } {
|
"Kvantum/kvantum.kvconfig".text = toINI { } {
|
||||||
General.theme = "KvLibadwaitaDark";
|
General.theme = "KvLibadwaitaDark";
|
||||||
};
|
};
|
||||||
@ -231,7 +230,7 @@ in
|
|||||||
sysprof
|
sysprof
|
||||||
]
|
]
|
||||||
++ (
|
++ (
|
||||||
if osConfig.virtualisation.podman.enable then
|
if config.virtualisation.podman.enable then
|
||||||
[
|
[
|
||||||
pods
|
pods
|
||||||
]
|
]
|
||||||
@ -239,5 +238,5 @@ in
|
|||||||
[ ]
|
[ ]
|
||||||
);
|
);
|
||||||
|
|
||||||
services.gpg-agent.pinentry.package = pkgs.pinentry-gnome3;
|
services.gpg-agent.pinentryPackage = pkgs.pinentry-gnome3;
|
||||||
}
|
}
|
32
users/jordan/graphical/hyprland.nix
Normal file
32
users/jordan/graphical/hyprland.nix
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
{
|
||||||
|
programs.hyprland = {
|
||||||
|
enable = true;
|
||||||
|
# withUWSM = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
# programs.uwsm.enable = true;
|
||||||
|
|
||||||
|
networking.networkmanager.enable = true;
|
||||||
|
|
||||||
|
home.packages = with pkgs.unstable; [
|
||||||
|
anyrun
|
||||||
|
clipse
|
||||||
|
dunst
|
||||||
|
hyprpaper
|
||||||
|
kitty
|
||||||
|
mpv
|
||||||
|
waybar
|
||||||
|
wl-clipboard
|
||||||
|
];
|
||||||
|
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
adw-gtk3
|
||||||
|
];
|
||||||
|
|
||||||
|
services.gpg-agent.pinentryPackage = pkgs.pinentry-gnome3;
|
||||||
|
}
|
@ -1,19 +0,0 @@
|
|||||||
{
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
./common/optional/graphical/firefox.nix
|
|
||||||
./common/optional/graphical/fonts.nix
|
|
||||||
./common/optional/graphical/hyprland
|
|
||||||
./common/optional/graphical/mimeapps.nix
|
|
||||||
];
|
|
||||||
|
|
||||||
programs.nh.enable = true;
|
|
||||||
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
jellyfin-media-player
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,16 +0,0 @@
|
|||||||
{
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
./common/optional/graphical/firefox.nix
|
|
||||||
./common/optional/graphical/fonts.nix
|
|
||||||
./common/optional/graphical/gnome.nix
|
|
||||||
];
|
|
||||||
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
audacity
|
|
||||||
];
|
|
||||||
}
|
|
@ -10,7 +10,7 @@
|
|||||||
viAlias = true;
|
viAlias = true;
|
||||||
vimAlias = true;
|
vimAlias = true;
|
||||||
|
|
||||||
opts = {
|
options = {
|
||||||
number = true;
|
number = true;
|
||||||
tabstop = 2;
|
tabstop = 2;
|
||||||
shiftwidth = 2;
|
shiftwidth = 2;
|
||||||
@ -113,8 +113,6 @@
|
|||||||
|
|
||||||
plugins.undotree.enable = true;
|
plugins.undotree.enable = true;
|
||||||
|
|
||||||
plugins.vim-surround.enable = true;
|
|
||||||
|
|
||||||
plugins.web-devicons.enable = true;
|
plugins.web-devicons.enable = true;
|
||||||
|
|
||||||
# plugins.gitsigns.enable = true;
|
# plugins.gitsigns.enable = true;
|
||||||
@ -127,6 +125,7 @@
|
|||||||
# plugins.nvim-tree.enable = true;
|
# plugins.nvim-tree.enable = true;
|
||||||
# plugins.oil.enable = true;
|
# plugins.oil.enable = true;
|
||||||
# plugins.project-nvim.enable = true;
|
# plugins.project-nvim.enable = true;
|
||||||
|
# plugins.surround.enable = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
home.sessionVariables.EDITOR = "nvim";
|
home.sessionVariables.EDITOR = "nvim";
|
@ -1,34 +0,0 @@
|
|||||||
{
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
./common/optional/graphical/firefox.nix
|
|
||||||
./common/optional/graphical/fonts.nix
|
|
||||||
./common/optional/graphical/hyprland
|
|
||||||
./common/optional/graphical/libreoffice.nix
|
|
||||||
./common/optional/graphical/mimeapps.nix
|
|
||||||
./common/optional/graphical/thunderbird.nix
|
|
||||||
];
|
|
||||||
|
|
||||||
programs.nh.enable = true;
|
|
||||||
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
# ardour
|
|
||||||
audacity
|
|
||||||
blender
|
|
||||||
gimp
|
|
||||||
handbrake
|
|
||||||
inkscape
|
|
||||||
jellyfin-media-player
|
|
||||||
krita
|
|
||||||
lutris
|
|
||||||
mkvtoolnix
|
|
||||||
# obs-studio
|
|
||||||
unstable.pcsx2
|
|
||||||
qbittorrent
|
|
||||||
xemu
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,14 +1,8 @@
|
|||||||
{
|
{
|
||||||
lib,
|
|
||||||
pkgs,
|
pkgs,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
let
|
|
||||||
inherit (lib)
|
|
||||||
mkMerge
|
|
||||||
mkOrder
|
|
||||||
;
|
|
||||||
in
|
|
||||||
{
|
{
|
||||||
programs = {
|
programs = {
|
||||||
zsh = {
|
zsh = {
|
||||||
@ -33,62 +27,56 @@ in
|
|||||||
size = 1000000;
|
size = 1000000;
|
||||||
};
|
};
|
||||||
|
|
||||||
initContent =
|
initExtra = ''
|
||||||
let
|
## Colors
|
||||||
zshConfigBeforeCompInit = mkOrder 550 ''
|
autoload -U colors && colors
|
||||||
setopt HASH_LIST_ALL
|
|
||||||
'';
|
|
||||||
zshConfig = mkOrder 1000 ''
|
|
||||||
## Colors
|
|
||||||
autoload -U colors && colors
|
|
||||||
|
|
||||||
## Directories
|
## Directories
|
||||||
setopt AUTO_PUSHD
|
setopt AUTO_PUSHD
|
||||||
setopt CDABLE_VARS
|
setopt CDABLE_VARS
|
||||||
setopt PUSHD_IGNORE_DUPS
|
setopt PUSHD_IGNORE_DUPS
|
||||||
setopt PUSHD_SILENT
|
setopt PUSHD_SILENT
|
||||||
setopt PUSHD_TO_HOME
|
setopt PUSHD_TO_HOME
|
||||||
|
|
||||||
## Expansion and globbing
|
## Expansion and globbing
|
||||||
setopt EXTENDED_GLOB
|
setopt EXTENDED_GLOB
|
||||||
unsetopt GLOB_DOTS
|
unsetopt GLOB_DOTS
|
||||||
unsetopt NOMATCH
|
unsetopt NOMATCH
|
||||||
|
|
||||||
## History
|
## History
|
||||||
setopt BANG_HIST
|
setopt BANG_HIST
|
||||||
setopt HIST_VERIFY
|
setopt HIST_VERIFY
|
||||||
setopt INC_APPEND_HISTORY_TIME
|
setopt INC_APPEND_HISTORY_TIME
|
||||||
|
|
||||||
## I/O
|
## I/O
|
||||||
setopt INTERACTIVE_COMMENTS
|
setopt INTERACTIVE_COMMENTS
|
||||||
setopt MULTIOS
|
setopt MULTIOS
|
||||||
unsetopt CLOBBER
|
unsetopt CLOBBER
|
||||||
|
|
||||||
## Jobs
|
## Jobs
|
||||||
setopt LONG_LIST_JOBS
|
setopt LONG_LIST_JOBS
|
||||||
setopt AUTO_RESUME
|
setopt AUTO_RESUME
|
||||||
unsetopt BG_NICE
|
unsetopt BG_NICE
|
||||||
unsetopt NOTIFY
|
unsetopt NOTIFY
|
||||||
unsetopt HUP
|
unsetopt HUP
|
||||||
unsetopt CHECK_JOBS
|
unsetopt CHECK_JOBS
|
||||||
|
|
||||||
## Shell emulation
|
## Shell emulation
|
||||||
setopt APPEND_CREATE
|
setopt APPEND_CREATE
|
||||||
|
|
||||||
## Prompt
|
## Prompt
|
||||||
PS1="%B%{$fg[magenta]%}%~%{$reset_color%} $%b "
|
PS1="%B%{$fg[magenta]%}%~%{$reset_color%} $%b "
|
||||||
|
|
||||||
## Vi mode
|
## Vi mode
|
||||||
export KEYTIMEOUT=1
|
export KEYTIMEOUT=1
|
||||||
|
|
||||||
## Zsh line editor
|
## Zsh line editor
|
||||||
unsetopt BEEP
|
unsetopt BEEP
|
||||||
'';
|
'';
|
||||||
in
|
|
||||||
mkMerge [
|
initExtraBeforeCompInit = ''
|
||||||
zshConfigBeforeCompInit
|
setopt HASH_LIST_ALL
|
||||||
zshConfig
|
'';
|
||||||
];
|
|
||||||
|
|
||||||
localVariables = {
|
localVariables = {
|
||||||
# Prevent zsh-vi-mode overriding other keybinds
|
# Prevent zsh-vi-mode overriding other keybinds
|
Reference in New Issue
Block a user