From 4547dacc7e3315055fc9c47be21e82f4ad5e8626 Mon Sep 17 00:00:00 2001 From: centra Date: Fri, 12 Dec 2025 08:35:20 +0900 Subject: [PATCH] feat(nix): Add creditservice module for NixOS deployment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add creditservice.nix module for credit service deployment - Update default.nix to import creditservice module - Required for T039.S3 NixOS provisioning 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- nix/modules/creditservice.nix | 76 +++++++++++++++++++++++++++++++++++ nix/modules/default.nix | 1 + 2 files changed, 77 insertions(+) create mode 100644 nix/modules/creditservice.nix diff --git a/nix/modules/creditservice.nix b/nix/modules/creditservice.nix new file mode 100644 index 0000000..fcb8174 --- /dev/null +++ b/nix/modules/creditservice.nix @@ -0,0 +1,76 @@ +{ config, lib, pkgs, ... }: + +let + cfg = config.services.creditservice; +in +{ + options.services.creditservice = { + enable = lib.mkEnableOption "creditservice service"; + + port = lib.mkOption { + type = lib.types.port; + default = 3010; + description = "Port for creditservice gRPC API"; + }; + + dataDir = lib.mkOption { + type = lib.types.path; + default = "/var/lib/creditservice"; + description = "Data directory for creditservice"; + }; + + settings = lib.mkOption { + type = lib.types.attrs; + default = {}; + description = "Additional configuration settings"; + }; + + package = lib.mkOption { + type = lib.types.package; + default = pkgs.creditservice-server or (throw "creditservice-server package not found"); + description = "Package to use for creditservice"; + }; + }; + + config = lib.mkIf cfg.enable { + # Create system user + users.users.creditservice = { + isSystemUser = true; + group = "creditservice"; + description = "CreditService quota/billing user"; + home = cfg.dataDir; + }; + + users.groups.creditservice = {}; + + # Create systemd service + systemd.services.creditservice = { + description = "CreditService Quota and Billing Management"; + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" "chainfire.service" "nightlight.service" ]; + wants = [ "chainfire.service" "nightlight.service" ]; + + serviceConfig = { + Type = "simple"; + User = "creditservice"; + Group = "creditservice"; + Restart = "on-failure"; + RestartSec = "10s"; + + # State directory management + StateDirectory = "creditservice"; + StateDirectoryMode = "0750"; + + # Security hardening + NoNewPrivileges = true; + PrivateTmp = true; + ProtectSystem = "strict"; + ProtectHome = true; + ReadWritePaths = [ cfg.dataDir ]; + + # Start command + ExecStart = "${cfg.package}/bin/creditservice-server --port ${toString cfg.port} --data-dir ${cfg.dataDir}"; + }; + }; + }; +} diff --git a/nix/modules/default.nix b/nix/modules/default.nix index e327edb..38219ea 100644 --- a/nix/modules/default.nix +++ b/nix/modules/default.nix @@ -1,6 +1,7 @@ { imports = [ ./chainfire.nix + ./creditservice.nix ./flaredb.nix ./iam.nix ./plasmavmc.nix