diff --git a/README.md b/README.md index 018db1c..7678755 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,8 @@ # services-flake -> **Note** -> -> 🚧 Work in Progress - NixOS-like services for Nix flakes, as a [process-compose-flake](https://github.com/Platonic-Systems/process-compose-flake) module (based on flake-parts). -![](./doc/demo.gif) +![](./doc/services-flake/demo.gif) ## Getting Started @@ -20,14 +16,7 @@ Or see `./test/flake.nix` ## Services available -- [x] Apache Kafka -- [x] Elasticsearch -- [x] MySQL -- [x] PostgreSQL -- [x] Redis -- [x] Redis Cluster -- [x] Zookeeper -- [ ] ... +See the list [here](nix/default.nix). ## A note on process working directory diff --git a/doc/flake.lock b/doc/flake.lock new file mode 100644 index 0000000..8aec380 --- /dev/null +++ b/doc/flake.lock @@ -0,0 +1,284 @@ +{ + "nodes": { + "commonmark-simple": { + "flake": false, + "locked": { + "lastModified": 1705078713, + "narHash": "sha256-YgDHJG8M47ZXGLWu8o7MhXbIrgQ0Ai32Gr8nKvZGGw8=", + "owner": "srid", + "repo": "commonmark-simple", + "rev": "fc106c94f781f6a35ef66900880edc08cbe3b034", + "type": "github" + }, + "original": { + "owner": "srid", + "repo": "commonmark-simple", + "type": "github" + } + }, + "commonmark-wikilink": { + "flake": false, + "locked": { + "lastModified": 1705502834, + "narHash": "sha256-79fzI4fPhCkfusDXctQwwmjIcWMrLfTvUtKBY32asuM=", + "owner": "srid", + "repo": "commonmark-wikilink", + "rev": "f6d7bdf7f1fce09ba2a4259b0306b0eef24c0cf7", + "type": "github" + }, + "original": { + "owner": "srid", + "repo": "commonmark-wikilink", + "type": "github" + } + }, + "ema": { + "inputs": { + "flake-parts": [ + "emanote", + "flake-parts" + ], + "flake-root": [ + "emanote", + "flake-root" + ], + "haskell-flake": [ + "emanote", + "haskell-flake" + ], + "nixpkgs": [ + "emanote", + "nixpkgs" + ], + "treefmt-nix": [ + "emanote", + "treefmt-nix" + ] + }, + "locked": { + "lastModified": 1702334080, + "narHash": "sha256-zrtzyLrSORxtocLMji5U9p4pDicMulOqgsuiB4LCu1o=", + "owner": "srid", + "repo": "ema", + "rev": "33f4cf31ace7e612e78ad25f5fc45089745ab644", + "type": "github" + }, + "original": { + "owner": "srid", + "ref": "no-ws", + "repo": "ema", + "type": "github" + } + }, + "emanote": { + "inputs": { + "commonmark-simple": "commonmark-simple", + "commonmark-wikilink": "commonmark-wikilink", + "ema": "ema", + "emanote-template": "emanote-template", + "flake-parts": "flake-parts", + "flake-root": "flake-root", + "haskell-flake": "haskell-flake", + "heist-extra": "heist-extra", + "nixpkgs": "nixpkgs", + "systems": "systems", + "treefmt-nix": "treefmt-nix", + "unionmount": "unionmount" + }, + "locked": { + "lastModified": 1705667811, + "narHash": "sha256-ZH/m5e4l4v2HRcv45trQKl92PRG6e1lpRJ4+U4zewL8=", + "owner": "srid", + "repo": "emanote", + "rev": "bf573e7653d183baa0fa68e2e172333f585b7a25", + "type": "github" + }, + "original": { + "owner": "srid", + "repo": "emanote", + "type": "github" + } + }, + "emanote-template": { + "flake": false, + "locked": { + "lastModified": 1703877265, + "narHash": "sha256-2xdikzzHrIHr1s2pAJrBJU8mZP258Na3V4P4RWteDZM=", + "owner": "srid", + "repo": "emanote-template", + "rev": "9d458b63c80162519ae55814e60f17cc9d3f95a3", + "type": "github" + }, + "original": { + "owner": "srid", + "repo": "emanote-template", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1704982712, + "narHash": "sha256-2Ptt+9h8dczgle2Oo6z5ni5rt/uLMG47UFTR1ry/wgg=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "07f6395285469419cf9d078f59b5b49993198c00", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-root": { + "locked": { + "lastModified": 1692742795, + "narHash": "sha256-f+Y0YhVCIJ06LemO+3Xx00lIcqQxSKJHXT/yk1RTKxw=", + "owner": "srid", + "repo": "flake-root", + "rev": "d9a70d9c7a5fd7f3258ccf48da9335e9b47c3937", + "type": "github" + }, + "original": { + "owner": "srid", + "repo": "flake-root", + "type": "github" + } + }, + "haskell-flake": { + "locked": { + "lastModified": 1705067885, + "narHash": "sha256-al2JqNIkXfLiVreqSJWly64Z6YVNphWBh4m3IxGIdYI=", + "owner": "srid", + "repo": "haskell-flake", + "rev": "8a526aaf98cde6af6b2d1d368e9acb460ee34547", + "type": "github" + }, + "original": { + "owner": "srid", + "repo": "haskell-flake", + "type": "github" + } + }, + "heist-extra": { + "flake": false, + "locked": { + "lastModified": 1691619499, + "narHash": "sha256-4e8v5t4FM99pdcPhohP3dAeGtsFnirbfYGpbr2+qWxI=", + "owner": "srid", + "repo": "heist-extra", + "rev": "54ff970f733dd45b5509d1c4c298927b6241041b", + "type": "github" + }, + "original": { + "owner": "srid", + "repo": "heist-extra", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1704842529, + "narHash": "sha256-OTeQA+F8d/Evad33JMfuXC89VMetQbsU4qcaePchGr4=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "eabe8d3eface69f5bb16c18f8662a702f50c20d5", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1703961334, + "narHash": "sha256-M1mV/Cq+pgjk0rt6VxoyyD+O8cOUiai8t9Q6Yyq4noY=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "b0d36bd0a420ecee3bc916c91886caca87c894e9", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "emanote": "emanote", + "flake-parts": [ + "emanote", + "flake-parts" + ], + "nixpkgs": [ + "emanote", + "nixpkgs" + ] + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "emanote", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1693468138, + "narHash": "sha256-DddblCahuTW8K0ncPOheTlG3igE8b15LJjafF1PWhOo=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "6930a5ba0a722385baf273885a03f561dcb1af67", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "unionmount": { + "flake": false, + "locked": { + "lastModified": 1691619410, + "narHash": "sha256-V9/OcGu9cy4kV9jta12A6w5BEj8awSEVYrXPpg8YckQ=", + "owner": "srid", + "repo": "unionmount", + "rev": "ed73b627f88c8f021f41ba4b518ba41beff9df42", + "type": "github" + }, + "original": { + "owner": "srid", + "repo": "unionmount", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/doc/flake.nix b/doc/flake.nix new file mode 100644 index 0000000..7fce5e3 --- /dev/null +++ b/doc/flake.nix @@ -0,0 +1,36 @@ +{ + nixConfig = { + extra-substituters = "https://srid.cachix.org"; + extra-trusted-public-keys = "srid.cachix.org-1:3clnql5gjbJNEvhA/WQp7nrZlBptwpXnUk6JAv8aB2M="; + }; + + inputs = { + emanote.url = "github:srid/emanote"; + nixpkgs.follows = "emanote/nixpkgs"; + flake-parts.follows = "emanote/flake-parts"; + }; + + outputs = inputs@{ self, flake-parts, nixpkgs, ... }: + flake-parts.lib.mkFlake { inherit inputs; } { + systems = nixpkgs.lib.systems.flakeExposed; + imports = [ inputs.emanote.flakeModule ]; + perSystem = { self', pkgs, system, ... }: { + emanote = { + # By default, the 'emanote' flake input is used. + # package = inputs.emanote.packages.${system}.default; + sites."default" = { + layers = [ ./. ]; + layersString = [ "." ]; + port = 8181; + prettyUrls = true; + }; + }; + devShells.default = pkgs.mkShell { + buildInputs = [ + pkgs.nixpkgs-fmt + ]; + }; + formatter = pkgs.nixpkgs-fmt; + }; + }; +} diff --git a/doc/services-flake.md b/doc/services-flake.md index 1ab835c..2ccae18 100644 --- a/doc/services-flake.md +++ b/doc/services-flake.md @@ -9,11 +9,21 @@ emanote: # Running services using `services-flake` -[services-flake][gh] is a [flake-parts](https://flake.parts/) module providing NixOS-like services for Nix flakes. It builds on top of the [process-compose-flake](https://community.flake.parts/process-compose-flake) module which allows running arbitrary processes in the devShell environment. +[services-flake][gh] is a [flake-parts](https://flake.parts/) module providing [NixOS-like services](https://github.com/NixOS/nixpkgs/tree/master/nixos/modules/services) for [Nix flakes](https://nixos.asia/en/flakes), enabling the users to use same configuration for local development across platforms. ->[!warning] Work in progress -> `services-flake` is still being developed. Visit the [GitHub repository][gh] for more information. +It builds on top of the [process-compose-flake](https://community.flake.parts/process-compose-flake) module which allows running arbitrary processes in the devShell environment. -![](services-flake/demo.gif) +See: +- [[start]]# +- [[services]]# + +## Demo + +This is how running a service with `services-flake` looks like[^demo]: +:::{.max-w-2xl .h-auto .mx-auto .p-4} +![[demo.gif]] +::: + +[^demo]: The commands used in the demo are available in the [getting started](https://github.com/juspay/services-flake#getting-started) section of the `services-flake` README. [gh]: https://github.com/juspay/services-flake diff --git a/doc/services-flake.yaml b/doc/services-flake.yaml index 7ec8672..9608cb7 100644 --- a/doc/services-flake.yaml +++ b/doc/services-flake.yaml @@ -3,6 +3,8 @@ page: siteTitle: services-flake + headHtml: | + template: # You can add your own variables here, like editBaseUrl. diff --git a/doc/services-flake/demo.gif b/doc/services-flake/demo.gif index c3733f3..bd4b225 100644 Binary files a/doc/services-flake/demo.gif and b/doc/services-flake/demo.gif differ diff --git a/doc/services-flake/services.md b/doc/services-flake/services.md new file mode 100644 index 0000000..e232db0 --- /dev/null +++ b/doc/services-flake/services.md @@ -0,0 +1,20 @@ +--- +short-title: Services +--- + +# Supported services + +>[!warning] +> This list denotes the progress of documentation, not implementation. See full list of implemented services at [gh]. + +- [ ] Apache Kafka +- [ ] Elasticsearch +- [ ] MySQL +- [ ] Nginx +- [ ] PostgreSQL +- [ ] Redis +- [ ] Redis Cluster +- [ ] Zookeeper +- [ ] ... + +[gh]: https://github.com/juspay/services-flake diff --git a/doc/services-flake/start.md b/doc/services-flake/start.md new file mode 100644 index 0000000..1875886 --- /dev/null +++ b/doc/services-flake/start.md @@ -0,0 +1,60 @@ +--- +order: -10 +--- + +# Getting started + + +## New project + +Use the [template flake](https://github.com/juspay/services-flake/blob/main/example/flake.nix) provided by `services-flake`: +```sh +mkdir example && cd ./example +nix flake init -t github:juspay/services-flake +nix run +``` + +## Existing project + +services-flake uses [process-compose-flake](https://community.flake.parts/process-compose-flake) to manage the services. Let's first import the `flake-parts` modules provided by `process-compose-flake` and `services-flake` in your flake: +```nix +{ + inputs.process-compose-flake.url = "github:Platonic-Systems/process-compose-flake"; + inputs.services-flake.url = "github:juspay/services-flake"; + ... + outputs = inputs: + inputs.flake-parts.lib.mkFlake { inherit inputs; } { + imports = [ + inputs.process-compose-flake.flakeModule + ]; + perSystem = { ... }: { + process-compose."default" = { + imports = [ + inputs.services-flake.processComposeModules.default + ]; + }; + } + }; +} +``` +As an example, let's add the `redis` service to your flake: +```nix +# Inside `perSystem.process-compose.default` +{ + services.redis."r1".enable = true; +} +``` + +Time to run the service: +```sh +nix run +``` + +## Under the hood + +- The `services-flake` module configures [process settings](https://community.flake.parts/process-compose-flake#usage) for a service. In simple terms, it handles stuff like health checks, restart policies, setup scripts, etc. by using the easy to configure APIs provided by `process-compose-flake`. +- The `process-compose-flake` module uses these settings to generate `packages.${system}.default`[^how-default] (`nix run` above, runs this package by default), which runs [process-compose](https://github.com/F1bonacc1/process-compose) with the generated YAML configuration[^sample-config]. + +[^how-default]: `default` is the name of the process group that is derived from `process-compose.` in `perSystem.process-compose`. + +[^sample-config]: See the example configuration from the [getting started](https://f1bonacc1.github.io/process-compose/intro/) section of the process-compose docs. diff --git a/flake.nix b/flake.nix index ae0231e..cd900d0 100644 --- a/flake.nix +++ b/flake.nix @@ -23,6 +23,9 @@ dev = { dir = "./dev"; }; + doc = { + dir = "./doc"; + }; }; }; }