From d9da6e6457c1b942c8bfcc9a21a68be8c360783f Mon Sep 17 00:00:00 2001 From: Mirza Arnaut Date: Thu, 22 Jan 2026 18:10:30 +0100 Subject: [PATCH] opencode: add web service configuration Add configuration options for the opencode web service including host, port, mDNS, logging, and CORS settings. Implement systemd user service to run the web server with configurable parameters. --- modules/programs/opencode.nix | 68 +++++++++++++++++++ tests/modules/programs/opencode/default.nix | 1 + .../modules/programs/opencode/web-service.nix | 41 +++++++++++ .../programs/opencode/web-service.plist | 36 ++++++++++ .../programs/opencode/web-service.service | 11 +++ 5 files changed, 157 insertions(+) create mode 100644 tests/modules/programs/opencode/web-service.nix create mode 100644 tests/modules/programs/opencode/web-service.plist create mode 100644 tests/modules/programs/opencode/web-service.service diff --git a/modules/programs/opencode.nix b/modules/programs/opencode.nix index 62706508..fec747a1 100644 --- a/modules/programs/opencode.nix +++ b/modules/programs/opencode.nix @@ -14,6 +14,7 @@ let ; cfg = config.programs.opencode; + webCfg = cfg.web; jsonFormat = pkgs.formats.json { }; @@ -87,6 +88,35 @@ in ''; }; + web = { + enable = lib.mkEnableOption "opencode web service"; + + extraArgs = mkOption { + type = lib.types.listOf lib.types.str; + default = [ ]; + example = [ + "--hostname" + "0.0.0.0" + "--port" + "4096" + "--mdns" + "--cors" + "https://example.com" + "--cors" + "http://localhost:3000" + "--print-logs" + "--log-level" + "DEBUG" + ]; + description = '' + Extra arguments to pass to the opencode web command. + + These arguments override the "server" options defined in the configuration file. + See for available options. + ''; + }; + }; + rules = lib.mkOption { type = lib.types.either lib.types.lines lib.types.path; default = ""; @@ -443,5 +473,43 @@ in ) ) cfg.themes ); + + systemd.user.services = mkIf webCfg.enable { + opencode-web = { + Unit = { + Description = "OpenCode Web Service"; + After = [ "network.target" ]; + }; + + Service = { + ExecStart = "${lib.getExe cfg.package} web ${lib.escapeShellArgs webCfg.extraArgs}"; + Restart = "always"; + RestartSec = 5; + }; + + Install = { + WantedBy = [ "default.target" ]; + }; + }; + }; + + launchd.agents = mkIf webCfg.enable { + opencode-web = { + enable = true; + config = { + ProgramArguments = [ + (lib.getExe cfg.package) + "web" + ] + ++ webCfg.extraArgs; + KeepAlive = { + Crashed = true; + SuccessfulExit = false; + }; + ProcessType = "Background"; + RunAtLoad = true; + }; + }; + }; }; } diff --git a/tests/modules/programs/opencode/default.nix b/tests/modules/programs/opencode/default.nix index cd88c35e..99193913 100644 --- a/tests/modules/programs/opencode/default.nix +++ b/tests/modules/programs/opencode/default.nix @@ -23,4 +23,5 @@ opencode-themes-bulk-directory = ./themes-bulk-directory.nix; opencode-mcp-integration = ./mcp-integration.nix; opencode-mcp-integration-with-override = ./mcp-integration-with-override.nix; + opencode-web-service = ./web-service.nix; } diff --git a/tests/modules/programs/opencode/web-service.nix b/tests/modules/programs/opencode/web-service.nix new file mode 100644 index 00000000..593cbb53 --- /dev/null +++ b/tests/modules/programs/opencode/web-service.nix @@ -0,0 +1,41 @@ +{ + pkgs, + ... +}: +{ + programs.opencode = { + enable = true; + + web = { + enable = true; + extraArgs = [ + "--hostname" + "0.0.0.0" + "--port" + "4096" + "--mdns" + "--cors" + "https://example.com" + "--cors" + "http://localhost:3000" + "--print-logs" + "--log-level" + "DEBUG" + ]; + }; + }; + + nmt.script = + if pkgs.stdenv.hostPlatform.isDarwin then + '' + serviceFile=LaunchAgents/org.nix-community.home.opencode-web.plist + assertFileExists "$serviceFile" + assertFileContent "$serviceFile" ${./web-service.plist} + '' + else + '' + serviceFile=home-files/.config/systemd/user/opencode-web.service + assertFileExists "$serviceFile" + assertFileContent "$serviceFile" ${./web-service.service} + ''; +} diff --git a/tests/modules/programs/opencode/web-service.plist b/tests/modules/programs/opencode/web-service.plist new file mode 100644 index 00000000..d7247b10 --- /dev/null +++ b/tests/modules/programs/opencode/web-service.plist @@ -0,0 +1,36 @@ + + + + + KeepAlive + + Crashed + + SuccessfulExit + + + Label + org.nix-community.home.opencode-web + ProcessType + Background + ProgramArguments + + @opencode@/bin/opencode + web + --hostname + 0.0.0.0 + --port + 4096 + --mdns + --cors + https://example.com + --cors + http://localhost:3000 + --print-logs + --log-level + DEBUG + + RunAtLoad + + + \ No newline at end of file diff --git a/tests/modules/programs/opencode/web-service.service b/tests/modules/programs/opencode/web-service.service new file mode 100644 index 00000000..9f62ef43 --- /dev/null +++ b/tests/modules/programs/opencode/web-service.service @@ -0,0 +1,11 @@ +[Install] +WantedBy=default.target + +[Service] +ExecStart=@opencode@/bin/opencode web --hostname 0.0.0.0 --port 4096 --mdns --cors https://example.com --cors http://localhost:3000 --print-logs --log-level DEBUG +Restart=always +RestartSec=5 + +[Unit] +After=network.target +Description=OpenCode Web Service