diff --git a/apps/rebuild/rebuild.sh b/apps/rebuild/rebuild.sh
index 0b2ad24..d04ed21 100755
--- a/apps/rebuild/rebuild.sh
+++ b/apps/rebuild/rebuild.sh
@@ -60,7 +60,7 @@ Rebuild_nixos() {
[[ -n "$TARGET_HOST" || -n "$BUILD_HOST" ]] && CMD+=("--ask-sudo-password")
# Build config first so we can diff it
- local BUILD_CMD=("nixos-rebuild" "build" "--no-build-output" "--flake" "$FLAKE")
+ local BUILD_CMD=("nixos-rebuild" "build" "--flake" "$FLAKE")
[ "$SHOW_TRACE" = 1 ] && BUILD_CMD+=("--show-trace")
[ -n "$BUILD_HOST" ] && BUILD_CMD+=("--build-host" "$BUILD_HOST")
@@ -101,7 +101,7 @@ Rebuild_home() {
# Build config first so we can diff it
if [ "$ROLLBACK" = 0 ]; then
- local BUILD_CMD=("home-manager" "build" "--no-out-link" "--flake" "$FLAKE")
+ local BUILD_CMD=("home-manager" "build" "--flake" "$FLAKE")
[ "$SHOW_TRACE" = 1 ] && BUILD_CMD+=("--show-trace")
_status "Building Home Manager configuration '$FLAKE'..."
_status "Executing command: ${BUILD_CMD[*]}"
diff --git a/modules/home/hyprland/applications/bitwarden/default.nix b/modules/home/hyprland/applications/bitwarden/default.nix
deleted file mode 100644
index bae501f..0000000
--- a/modules/home/hyprland/applications/bitwarden/default.nix
+++ /dev/null
@@ -1,46 +0,0 @@
-{
- inputs,
- config,
- lib,
- pkgs,
- ...
-}:
-
-let
- cfg = config.wayland.windowManager.hyprland;
- app = cfg.applications.password-manager.default;
-
- inherit (lib) mkDefault mkIf;
-in
-{
- imports = [ ../../../rofi-rbw ];
-
- config = mkIf (cfg.enable && app == "rofi-rbw") {
- programs.rbw = {
- enable = true;
- settings = {
- # email = "you@example.tld"; # You have to set this in your config
- pinentry = mkDefault pkgs.pinentry-gnome3;
- lock_timeout = mkDefault 3600;
- };
- };
-
- programs.rofi-rbw = {
- enable = true;
- package = mkDefault pkgs.rofi-rbw-wayland;
- settings = {
- selector = mkDefault "bemenu";
- selector-args = mkDefault "-i -l 20";
- action = mkDefault "copy";
- typing-key-delay = mkDefault 0;
- };
- };
-
- programs.librewolf = mkIf config.programs.librewolf.enable {
- profiles.default.extensions.packages =
- with inputs.nur.legacyPackages."${pkgs.stdenv.hostPlatform.system}".repos.rycee.firefox-addons; [
- bitwarden
- ];
- };
- };
-}
diff --git a/modules/home/hyprland/applications/default.nix b/modules/home/hyprland/applications/default.nix
index 661d47e..8b434be 100644
--- a/modules/home/hyprland/applications/default.nix
+++ b/modules/home/hyprland/applications/default.nix
@@ -56,7 +56,6 @@ let
in
{
imports = [
- ./bitwarden
./bemenu
./dmenu-bluetooth
./dunst-toggle
diff --git a/modules/nixos/librechat-oci/default.nix b/modules/nixos/librechat-oci/default.nix
index d35b0ca..afbdd2b 100644
--- a/modules/nixos/librechat-oci/default.nix
+++ b/modules/nixos/librechat-oci/default.nix
@@ -8,230 +8,67 @@
let
cfg = config.services.librechat-oci;
- defaultImages = {
- librechat = pkgs.dockerTools.pullImage {
- imageName = "ghcr.io/danny-avila/librechat";
- imageDigest = "sha256:a46254938507971e0d4f7ed3f9d116bd9b118f4810b5b75eb716baf575645068";
- hash = "sha256-zevUN6vrs3hymwCGFmk/YXlUzYjN37H+EO5aLxYchyc=";
- finalImageName = "ghcr.io/danny-avila/librechat";
- finalImageTag = "v0.8.5";
- };
-
- meilisearch = pkgs.dockerTools.pullImage {
- imageName = "getmeili/meilisearch";
- imageDigest = "sha256:b839a48d008d4e67e57f78dcff5b21d5e8b8fa066bacd11f97824d6307abb0dd";
- hash = "sha256-+hypvjFDSdnnWAO4tARTnjNd/6HlF6pMg1L6UUffdYM=";
- finalImageName = "getmeili/meilisearch";
- finalImageTag = "v1.44.0";
- };
-
- mongodb = pkgs.dockerTools.pullImage {
- imageName = "mongo";
- imageDigest = "sha256:098862b1339f031900ca66cf8fef799e616d6324fa41b9a263f2ec899552c1ef";
- hash = "sha256-XuWnvcqAAkAGshdQtnngKOOJP2Bd33FXTbGHTRX3nUc=";
- finalImageName = "mongo";
- finalImageTag = "8.0.20";
- };
-
- vectordb = pkgs.dockerTools.pullImage {
- imageName = "pgvector/pgvector";
- imageDigest = "sha256:8809cfffff0082cf260c9ac752f1dd1afc77f6f0a55c4e6411321e78efc3d9a5";
- hash = "sha256-rc6gQLMzv8UOZVLmWKGUESNIo+iPf5DR7T79AmbzWc4=";
- finalImageName = "pgvector/pgvector";
- finalImageTag = "0.8.0-pg15-trixie";
- };
-
- ragApi = pkgs.dockerTools.pullImage {
- imageName = "registry.librechat.ai/danny-avila/librechat-rag-api-dev-lite";
- imageDigest = "sha256:6dfb6832661ff9c26fa329c823ce266059e33567670a763e9ecb9b566b8daa68";
- hash = "sha256-k8pkEgbqT4NU2+2ZjdRFlfFvMUk/1p+pkysbELh95pM=";
- finalImageName = "registry.librechat.ai/danny-avila/librechat-rag-api-dev-lite";
- finalImageTag = "latest";
- };
+ image = pkgs.dockerTools.pullImage {
+ imageName = "ghcr.io/danny-avila/librechat";
+ imageDigest = "sha256:a46254938507971e0d4f7ed3f9d116bd9b118f4810b5b75eb716baf575645068";
+ hash = "sha256-zevUN6vrs3hymwCGFmk/YXlUzYjN37H+EO5aLxYchyc=";
+ finalImageName = "ghcr.io/danny-avila/librechat";
+ finalImageTag = "v0.8.5";
};
defaultEnv = {
- # Server
HOST = "0.0.0.0";
- PORT = toString cfg.port;
+ PORT = "3080";
NO_INDEX = "true";
- TRUST_PROXY = "1";
-
- # Logging
+ DEBUG_LOGGING = "false";
CONSOLE_JSON = "false";
- DEBUG_LOGGING = "true";
- DEBUG_CONSOLE = "false";
- AGENT_DEBUG_LOGGING = "false";
- DEBUG_OPENAI = "false";
-
- # Node
- NODE_MAX_OLD_SPACE_SIZE = "6144";
-
- # Search
+ ALLOW_REGISTRATION = "true";
+ ALLOW_EMAIL_LOGIN = "true";
SEARCH = "true";
MEILI_NO_ANALYTICS = "true";
-
- # Moderation
- OPENAI_MODERATION = "false";
- BAN_VIOLATIONS = "true";
- BAN_DURATION = "1000 * 60 * 60 * 2";
- BAN_INTERVAL = "20";
- LOGIN_VIOLATION_SCORE = "1";
- REGISTRATION_VIOLATION_SCORE = "1";
- CONCURRENT_VIOLATION_SCORE = "1";
- MESSAGE_VIOLATION_SCORE = "1";
- NON_BROWSER_VIOLATION_SCORE = "20";
- TTS_VIOLATION_SCORE = "0";
- STT_VIOLATION_SCORE = "0";
- FORK_VIOLATION_SCORE = "0";
- IMPORT_VIOLATION_SCORE = "0";
- FILE_UPLOAD_VIOLATION_SCORE = "0";
- LOGIN_MAX = "7";
- LOGIN_WINDOW = "5";
- REGISTER_MAX = "5";
- REGISTER_WINDOW = "60";
- LIMIT_CONCURRENT_MESSAGES = "true";
- CONCURRENT_MESSAGE_MAX = "2";
- LIMIT_MESSAGE_IP = "true";
- MESSAGE_IP_MAX = "40";
- MESSAGE_IP_WINDOW = "1";
- LIMIT_MESSAGE_USER = "false";
- MESSAGE_USER_MAX = "40";
- MESSAGE_USER_WINDOW = "1";
- ILLEGAL_MODEL_REQ_SCORE = "5";
-
- # Registration and login
- ALLOW_EMAIL_LOGIN = "true";
- ALLOW_REGISTRATION = "false";
- ALLOW_SOCIAL_LOGIN = "false";
- ALLOW_SOCIAL_REGISTRATION = "false";
- ALLOW_PASSWORD_RESET = "false";
- ALLOW_UNVERIFIED_EMAIL_LOGIN = "true";
- SESSION_EXPIRY = "1000 * 60 * 15";
- REFRESH_TOKEN_EXPIRY = "(1000 * 60 * 60 * 24) * 7";
-
- # OpenID
- OPENID_SCOPE = "openid profile email";
- OPENID_CALLBACK_URL = "/oauth/openid/callback";
- OPENID_AUTO_REDIRECT = "false";
- OPENID_USE_PKCE = "false";
- OPENID_ON_BEHALF_FLOW_USERINFO_SCOPE = "user.read";
-
- # OAuth callback URLs
- DISCORD_CALLBACK_URL = "/oauth/discord/callback";
- FACEBOOK_CALLBACK_URL = "/oauth/facebook/callback";
- GITHUB_CALLBACK_URL = "/oauth/github/callback";
- GOOGLE_CALLBACK_URL = "/oauth/google/callback";
- APPLE_CALLBACK_URL = "/oauth/apple/callback";
- SAML_CALLBACK_URL = "/oauth/saml/callback";
-
- # Entra ID
- USE_ENTRA_ID_FOR_PEOPLE_SEARCH = "false";
- ENTRA_ID_INCLUDE_OWNERS_AS_MEMBERS = "false";
- OPENID_GRAPH_SCOPES = "User.Read,People.Read,GroupMember.Read.All";
-
- # Shared links
- ALLOW_SHARED_LINKS = "true";
- ALLOW_SHARED_LINKS_PUBLIC = "false";
-
- # UI
- APP_TITLE = "LibreChat";
- HELP_AND_FAQ_URL = "https://librechat.ai";
-
- # Flux
- FLUX_API_BASE_URL = "https://api.us1.bfl.ai";
-
- # Email
- EMAIL_PORT = "25";
- EMAIL_FROM = "noreply@librechat.ai";
-
- # Azure Blob Storage
- AZURE_STORAGE_PUBLIC_ACCESS = "false";
- AZURE_CONTAINER_NAME = "files";
};
- mkImageOption =
- name: description:
- mkOption {
- type = types.package;
- default = defaultImages.${name};
- description = description;
- };
-
inherit (lib)
literalExpression
mkEnableOption
mkIf
mkOption
mkOverride
- optional
types
;
in
{
options.services.librechat-oci = {
enable = mkEnableOption "LibreChat container with Podman.";
-
- images = {
- librechat = mkImageOption "librechat" "The LibreChat Docker image (`pkgs.dockerTools.pullImage`).";
- meilisearch = mkImageOption "meilisearch" "The Meilisearch Docker image (`pkgs.dockerTools.pullImage`).";
- mongodb = mkImageOption "mongodb" "The MongoDB Docker image (`pkgs.dockerTools.pullImage`).";
- vectordb = mkImageOption "vectordb" "The pgvector Docker image (`pkgs.dockerTools.pullImage`).";
- ragApi = mkImageOption "ragApi" "The LibreChat RAG API Docker image (`pkgs.dockerTools.pullImage`).";
+ image = mkOption {
+ type = types.package;
+ default = image;
+ description = "The Docker image to use (`pkgs.dockerTools.pullImage`).";
};
-
- configFile = mkOption {
- type = types.nullOr types.path;
- default = null;
- example = literalExpression "./librechat.yaml";
- description = "Path to the `librechat.yaml` configuration file.";
- };
-
externalUrl = mkOption {
type = types.nullOr types.str;
default = null;
- example = literalExpression ''"https://chat.example.com"'';
- description = "Public URL to configure for LibreChat (sets DOMAIN_CLIENT and DOMAIN_SERVER).";
+ example = literalExpression "http://${config.networking.domain}";
+ description = "Public URL to configure for LibreChat.";
};
-
port = mkOption {
type = types.port;
default = 3080;
- description = "Which port the LibreChat server listens on.";
+ description = "Which port the LibreChat server listens to.";
};
-
- meiliPort = mkOption {
- type = types.port;
- default = 7700;
- description = "Which port Meilisearch listens on.";
- };
-
- ragPort = mkOption {
- type = types.port;
- default = 8000;
- description = "Which port the RAG API listens on.";
- };
-
environment = mkOption {
default = { };
type = types.attrsOf types.str;
description = ''
Extra environment variables for LibreChat.
- These are merged on top of the defaults and can override them.
- For secrets use instead.
- See .
+ For more details see
'';
};
-
environmentFile = mkOption {
+ description = "Environment file to be passed to the LibreChat container.";
type = types.nullOr types.path;
default = null;
- example = literalExpression "config.sops.templates.librechat-env.path";
- description = ''
- Environment file passed to the LibreChat, Meilisearch, and RAG API
- containers. Use this for secrets such as JWT_SECRET, CREDS_KEY,
- MEILI_MASTER_KEY, and API keys.
- '';
+ example = "config.sops.templates.librechat-env.path";
};
};
@@ -252,275 +89,158 @@ in
virtualisation.oci-containers.backend = "podman";
- virtualisation.oci-containers.containers.librechat-mongodb = {
- image = with cfg.images.mongodb; "${imageName}:${imageTag}";
- imageFile = cfg.images.mongodb;
- cmd = [
- "mongod"
- "--noauth"
- ];
+ virtualisation.oci-containers.containers."librechat-mongodb" = {
+ image = "mongo:7.0";
+ environment = {
+ MONGO_INITDB_ROOT_USERNAME = "root";
+ MONGO_INITDB_ROOT_PASSWORD = "librechat";
+ MONGO_INITDB_DATABASE = "LibreChat";
+ };
volumes = [
"librechat_mongodb_data:/data/db:rw"
];
log-driver = "journald";
extraOptions = [
- "--network-alias=mongodb"
- "--network=librechat_default"
- ];
- };
-
- virtualisation.oci-containers.containers.librechat-meilisearch = {
- image = with cfg.images.meilisearch; "${imageName}:${imageTag}";
- imageFile = cfg.images.meilisearch;
- environment = {
- MEILI_NO_ANALYTICS = "true";
- MEILI_HOST = "http://meilisearch:${toString cfg.meiliPort}";
- };
- environmentFiles = optional (cfg.environmentFile != null) cfg.environmentFile;
- volumes = [
- "librechat_meili_data:/meili_data:rw"
- ];
- log-driver = "journald";
- extraOptions = [
- "--network-alias=meilisearch"
- "--network=librechat_default"
- ];
- };
-
- virtualisation.oci-containers.containers.librechat-vectordb = {
- image = with cfg.images.vectordb; "${imageName}:${imageTag}";
- imageFile = cfg.images.vectordb;
- environment = {
- POSTGRES_DB = "mydatabase";
- POSTGRES_USER = "myuser";
- POSTGRES_PASSWORD = "mypassword";
- };
- volumes = [
- "librechat_pgdata:/var/lib/postgresql/data:rw"
- ];
- log-driver = "journald";
- extraOptions = [
- "--network-alias=vectordb"
- "--network=librechat_default"
- ];
- };
-
- virtualisation.oci-containers.containers.librechat-rag-api = {
- image = with cfg.images.ragApi; "${imageName}:${imageTag}";
- imageFile = cfg.images.ragApi;
- environment = {
- DB_HOST = "vectordb";
- RAG_PORT = toString cfg.ragPort;
- };
- environmentFiles = optional (cfg.environmentFile != null) cfg.environmentFile;
- dependsOn = [ "librechat-vectordb" ];
- log-driver = "journald";
- extraOptions = [
- "--network-alias=rag_api"
- "--network=librechat_default"
+ "--network=host"
];
};
virtualisation.oci-containers.containers.librechat = {
- image = with cfg.images.librechat; "${imageName}:${imageTag}";
- imageFile = cfg.images.librechat;
+ image = toString cfg.image;
environment =
defaultEnv
// {
- MONGO_URI = "mongodb://mongodb:27017/LibreChat";
- MEILI_HOST = "http://meilisearch:${toString cfg.meiliPort}";
- RAG_PORT = toString cfg.ragPort;
- RAG_API_URL = "http://rag_api:${toString cfg.ragPort}";
- DOMAIN_CLIENT =
- if cfg.externalUrl != null then cfg.externalUrl else "http://localhost:${toString cfg.port}";
- DOMAIN_SERVER =
- if cfg.externalUrl != null then cfg.externalUrl else "http://localhost:${toString cfg.port}";
+ MONGO_URI = "mongodb://root:librechat@localhost:27017/LibreChat?authSource=admin";
}
// cfg.environment;
- environmentFiles = optional (cfg.environmentFile != null) cfg.environmentFile;
volumes = [
+ "librechat_data:/app/client/data:rw"
"librechat_images:/app/client/public/images:rw"
- "librechat_uploads:/app/uploads:rw"
+ "librechat_uploads:/app/api/server/files/uploads:rw"
"librechat_logs:/app/logs:rw"
- ]
- ++ optional (cfg.configFile != null) "${cfg.configFile}:/app/librechat.yaml:ro";
-
- ports = [
- "0.0.0.0:${toString cfg.port}:${toString cfg.port}/tcp"
];
- dependsOn = [
- "librechat-mongodb"
- "librechat-rag-api"
+ ports = [
+ "${toString cfg.port}:${toString cfg.port}"
];
log-driver = "journald";
extraOptions = [
- "--network-alias=api"
- "--network=librechat_default"
+ "--network=host"
];
};
- systemd.services.podman-librechat-mongodb = {
- serviceConfig.Restart = mkOverride 90 "always";
+ systemd.services."podman-librechat-mongodb" = {
+ serviceConfig = {
+ Restart = mkOverride 90 "always";
+ };
after = [
- "podman-network-librechat_default.service"
"podman-volume-librechat_mongodb_data.service"
];
requires = [
- "podman-network-librechat_default.service"
"podman-volume-librechat_mongodb_data.service"
];
- partOf = [ "podman-compose-librechat-root.target" ];
- wantedBy = [ "podman-compose-librechat-root.target" ];
+ partOf = [
+ "podman-compose-librechat-root.target"
+ ];
+ wantedBy = [
+ "podman-compose-librechat-root.target"
+ ];
};
- systemd.services.podman-librechat-meilisearch = {
- serviceConfig.Restart = mkOverride 90 "always";
+ systemd.services."podman-librechat" = {
+ serviceConfig = {
+ Restart = mkOverride 90 "always";
+ };
after = [
- "podman-network-librechat_default.service"
- "podman-volume-librechat_meili_data.service"
- ];
- requires = [
- "podman-network-librechat_default.service"
- "podman-volume-librechat_meili_data.service"
- ];
- partOf = [ "podman-compose-librechat-root.target" ];
- wantedBy = [ "podman-compose-librechat-root.target" ];
- };
-
- systemd.services.podman-librechat-vectordb = {
- serviceConfig.Restart = mkOverride 90 "always";
- after = [
- "podman-network-librechat_default.service"
- "podman-volume-librechat_pgdata.service"
- ];
- requires = [
- "podman-network-librechat_default.service"
- "podman-volume-librechat_pgdata.service"
- ];
- partOf = [ "podman-compose-librechat-root.target" ];
- wantedBy = [ "podman-compose-librechat-root.target" ];
- };
-
- systemd.services.podman-librechat-rag-api = {
- serviceConfig.Restart = mkOverride 90 "always";
- after = [
- "podman-network-librechat_default.service"
- "podman-librechat-vectordb.service"
- ];
- requires = [
- "podman-network-librechat_default.service"
- "podman-librechat-vectordb.service"
- ];
- partOf = [ "podman-compose-librechat-root.target" ];
- wantedBy = [ "podman-compose-librechat-root.target" ];
- };
-
- systemd.services.podman-librechat = {
- serviceConfig.Restart = mkOverride 90 "always";
- after = [
- "podman-network-librechat_default.service"
+ "podman-volume-librechat_data.service"
"podman-volume-librechat_images.service"
"podman-volume-librechat_uploads.service"
"podman-volume-librechat_logs.service"
"podman-librechat-mongodb.service"
- "podman-librechat-meilisearch.service"
- "podman-librechat-rag-api.service"
];
requires = [
- "podman-network-librechat_default.service"
+ "podman-volume-librechat_data.service"
"podman-volume-librechat_images.service"
"podman-volume-librechat_uploads.service"
"podman-volume-librechat_logs.service"
"podman-librechat-mongodb.service"
- "podman-librechat-meilisearch.service"
- "podman-librechat-rag-api.service"
];
- partOf = [ "podman-compose-librechat-root.target" ];
- wantedBy = [ "podman-compose-librechat-root.target" ];
+ partOf = [
+ "podman-compose-librechat-root.target"
+ ];
+ wantedBy = [
+ "podman-compose-librechat-root.target"
+ ];
};
- systemd.services.podman-network-librechat_default = {
+ systemd.services."podman-volume-librechat_data" = {
path = [ pkgs.podman ];
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
- ExecStop = "podman network rm -f librechat_default";
};
script = ''
- podman network inspect librechat_default || podman network create librechat_default
+ podman volume inspect librechat_data || podman volume create librechat_data
'';
partOf = [ "podman-compose-librechat-root.target" ];
wantedBy = [ "podman-compose-librechat-root.target" ];
};
- systemd.services.podman-volume-librechat_mongodb_data = {
+ systemd.services."podman-volume-librechat_images" = {
path = [ pkgs.podman ];
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
};
- script = "podman volume inspect librechat_mongodb_data || podman volume create librechat_mongodb_data";
+ script = ''
+ podman volume inspect librechat_images || podman volume create librechat_images
+ '';
partOf = [ "podman-compose-librechat-root.target" ];
wantedBy = [ "podman-compose-librechat-root.target" ];
};
- systemd.services.podman-volume-librechat_meili_data = {
+ systemd.services."podman-volume-librechat_uploads" = {
path = [ pkgs.podman ];
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
};
- script = "podman volume inspect librechat_meili_data || podman volume create librechat_meili_data";
+ script = ''
+ podman volume inspect librechat_uploads || podman volume create librechat_uploads
+ '';
partOf = [ "podman-compose-librechat-root.target" ];
wantedBy = [ "podman-compose-librechat-root.target" ];
};
- systemd.services.podman-volume-librechat_pgdata = {
+ systemd.services."podman-volume-librechat_logs" = {
path = [ pkgs.podman ];
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
};
- script = "podman volume inspect librechat_pgdata || podman volume create librechat_pgdata";
+ script = ''
+ podman volume inspect librechat_logs || podman volume create librechat_logs
+ '';
partOf = [ "podman-compose-librechat-root.target" ];
wantedBy = [ "podman-compose-librechat-root.target" ];
};
- systemd.services.podman-volume-librechat_images = {
+ systemd.services."podman-volume-librechat_mongodb_data" = {
path = [ pkgs.podman ];
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
};
- script = "podman volume inspect librechat_images || podman volume create librechat_images";
+ script = ''
+ podman volume inspect librechat_mongodb_data || podman volume create librechat_mongodb_data
+ '';
partOf = [ "podman-compose-librechat-root.target" ];
wantedBy = [ "podman-compose-librechat-root.target" ];
};
- systemd.services.podman-volume-librechat_uploads = {
- path = [ pkgs.podman ];
- serviceConfig = {
- Type = "oneshot";
- RemainAfterExit = true;
+ systemd.targets."podman-compose-librechat-root" = {
+ unitConfig = {
+ Description = "Root target generated by compose2nix.";
};
- script = "podman volume inspect librechat_uploads || podman volume create librechat_uploads";
- partOf = [ "podman-compose-librechat-root.target" ];
- wantedBy = [ "podman-compose-librechat-root.target" ];
- };
-
- systemd.services.podman-volume-librechat_logs = {
- path = [ pkgs.podman ];
- serviceConfig = {
- Type = "oneshot";
- RemainAfterExit = true;
- };
- script = "podman volume inspect librechat_logs || podman volume create librechat_logs";
- partOf = [ "podman-compose-librechat-root.target" ];
- wantedBy = [ "podman-compose-librechat-root.target" ];
- };
-
- systemd.targets.podman-compose-librechat-root = {
- unitConfig.Description = "Root target generated by compose2nix.";
wantedBy = [ "multi-user.target" ];
};
};
diff --git a/modules/nixos/mcpo/default.nix b/modules/nixos/mcpo/default.nix
index 76ad953..89e0e29 100644
--- a/modules/nixos/mcpo/default.nix
+++ b/modules/nixos/mcpo/default.nix
@@ -28,12 +28,6 @@ in
default = null;
};
- port = mkOption {
- type = types.port;
- default = 8000;
- description = "Port on which the mcpo service should listen.";
- };
-
user = mkOption {
type = types.str;
description = "The user the mcpo service will run as.";
@@ -106,7 +100,7 @@ in
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
- ExecStart = "${getExe cfg.package} --port ${toString cfg.port} --config ${configFile}";
+ ExecStart = "${getExe cfg.package} --config ${configFile}";
Restart = "on-failure";
User = cfg.user;
Group = cfg.group;
diff --git a/pkgs/default.nix b/pkgs/default.nix
index 899a133..28c1f0b 100644
--- a/pkgs/default.nix
+++ b/pkgs/default.nix
@@ -15,7 +15,6 @@
jirafeau-cli = pkgs.callPackage ./jirafeau-cli { };
kicad-mcp = pkgs.callPackage ./kicad-mcp { };
mcpo = pkgs.callPackage ./mcpo { };
- nerdlog = pkgs.callPackage ./nerdlog { };
pass2bw = pkgs.callPackage ./pass2bw { };
pyman = pkgs.callPackage ./pyman { };
quicknote = pkgs.callPackage ./quicknote { };
diff --git a/pkgs/nerdlog/default.nix b/pkgs/nerdlog/default.nix
deleted file mode 100644
index b1b59f0..0000000
--- a/pkgs/nerdlog/default.nix
+++ /dev/null
@@ -1,83 +0,0 @@
-{
- lib,
- buildGoModule,
- fetchFromGitHub,
- stdenv,
- darwin,
- xorg,
- pkg-config,
- wayland,
- libGL,
- libxkbcommon,
- makeWrapper,
-}:
-
-buildGoModule rec {
- pname = "nerdlog";
- version = "1.10.0";
-
- src = fetchFromGitHub {
- owner = "dimonomid";
- repo = "nerdlog";
- rev = "v${version}";
- hash = "sha256-XlzWNeyd+Ar4ArFcN1wkQ0aod6ckAiIb12odK7cf4+s=";
- };
-
- vendorHash = "sha256-hvv0dsE1yz85VLaBOE7RWbux8L8kVTihcA1HyyHRYAM=";
-
- subPackages = [
- "cmd/nerdlog"
- "cmd/generate_syslog"
- ];
-
- doCheck = false;
-
- nativeBuildInputs = [
- pkg-config
- makeWrapper
- ];
-
- buildInputs =
- lib.optionals stdenv.isDarwin [
- darwin.apple_sdk.frameworks.Cocoa
- ]
- ++ lib.optionals stdenv.isLinux [
- xorg.libX11
- xorg.libXext
- xorg.libXfixes
- wayland
- libGL
- libxkbcommon
- ];
-
- postInstall = lib.optionalString stdenv.isLinux ''
- wrapProgram $out/bin/nerdlog \
- --prefix LD_LIBRARY_PATH : ${
- lib.makeLibraryPath [
- xorg.libX11
- xorg.libXext
- xorg.libXfixes
- wayland
- libGL
- libxkbcommon
- ]
- }
- '';
-
- ldflags = [
- "-s"
- "-w"
- "-X=github.com/dimonomid/nerdlog/version.version=${version}"
- "-X=github.com/dimonomid/nerdlog/version.commit=${src.rev}"
- "-X=github.com/dimonomid/nerdlog/version.date=1970-01-01T00:00:00Z"
- "-X=github.com/dimonomid/nerdlog/version.builtBy=goreleaser"
- ];
-
- meta = {
- description = "Nerdlog: fast, remote-first, multi-host TUI log viewer with timeline histogram and no central server";
- homepage = "https://github.com/dimonomid/nerdlog";
- changelog = "https://github.com/dimonomid/nerdlog/blob/${src.rev}/CHANGELOG.md";
- license = lib.licenses.bsd2;
- mainProgram = "nerdlog";
- };
-}
diff --git a/pkgs/pass2bw/convert_csvs.py b/pkgs/pass2bw/convert_csvs.py
index c67b842..4babb74 100644
--- a/pkgs/pass2bw/convert_csvs.py
+++ b/pkgs/pass2bw/convert_csvs.py
@@ -42,14 +42,6 @@ def process_csv(input_file, output_file):
for col, default_val in default_values.items():
if col not in new_row:
new_row[col] = default_val
-
- folder = new_row.get('folder', '')
- name = new_row.get('name', '')
- if folder.startswith('www') and name:
- if not name.startswith('http://') and not name.startswith('https://'):
- new_row['login_uri'] = f'https://{name}'
- else:
- new_row['login_uri'] = name
if new_row['notes']:
new_row['notes'] = new_row['notes'].replace('\n', ' ').replace('\r', ' ')
@@ -57,6 +49,7 @@ def process_csv(input_file, output_file):
notes = new_row['notes']
if notes:
+ # Look for pattern: "login: USERNAME"
match = re.search(r'login:\s*(\S+)', notes, re.IGNORECASE)
if match:
username = match.group(1)
diff --git a/pkgs/pass2bw/default.nix b/pkgs/pass2bw/default.nix
index ce42f1f..349d8d1 100644
--- a/pkgs/pass2bw/default.nix
+++ b/pkgs/pass2bw/default.nix
@@ -2,8 +2,6 @@
stdenv,
lib,
makeWrapper,
- pass,
- pass2csv,
python3,
...
}:
@@ -22,18 +20,13 @@ stdenv.mkDerivation rec {
installPhase = ''
mkdir -p $out/bin
- cp ${src}/pass2bw.sh $out/bin/${pname}
+ sed -e "s|python ./convert_csvs.py|python $out/bin/convert_csvs.py|" \
+ ${src}/${pname}.sh > $out/bin/${pname}
chmod +x $out/bin/${pname}
cp ${src}/convert_csvs.py $out/bin/
wrapProgram $out/bin/${pname} \
- --prefix PATH : ${
- lib.makeBinPath [
- pass
- pass2csv
- python3
- ]
- }
+ --prefix PATH : ${lib.makeBinPath [ python3 ]}
'';
}
diff --git a/pkgs/pass2bw/pass2bw.sh b/pkgs/pass2bw/pass2bw.sh
index 887a881..95cb544 100644
--- a/pkgs/pass2bw/pass2bw.sh
+++ b/pkgs/pass2bw/pass2bw.sh
@@ -4,5 +4,5 @@ if [ "$#" -ne 2 ]; then
fi
pass2csv "$1" /tmp/pass.csv
-python3 "$(dirname "$0")/convert_csvs.py" /tmp/pass.csv "$2"
+python ./convert_csvs.py /tmp/pass.csv "$2"
rm /tmp/pass.csv