krops/README.md

151 lines
3.5 KiB
Markdown
Raw Normal View History

2018-05-01 16:55:06 +02:00
# krops (krebs ops)
2018-05-01 15:56:49 +02:00
krops is a lightweigt toolkit to deploy NixOS systems, remotely or locally.
2018-05-01 15:56:49 +02:00
2019-02-26 21:38:32 +01:00
## Some Features
2018-09-28 16:04:22 +02:00
2018-09-28 17:03:24 +02:00
- store your secrets in [password store](https://www.passwordstore.org/)
2018-05-01 15:56:49 +02:00
- build your system remotely
- minimal overhead (it's basically just `nixos-rebuild switch`!)
2018-05-01 15:56:49 +02:00
- run from custom nixpkgs branch/checkout/fork
2019-02-26 21:38:32 +01:00
## Minimal Example
Create a file named `krops.nix` (name doesn't matter) with following content:
2018-05-01 15:56:49 +02:00
```
let
2018-05-01 16:55:06 +02:00
krops = (import <nixpkgs> {}).fetchgit {
url = https://cgit.krebsco.de/krops/;
2019-11-20 19:09:54 +01:00
rev = "v1.17.0";
sha256 = "150jlz0hlb3ngf9a1c9xgcwzz1zz8v2lfgnzw08l3ajlaaai8smd";
2018-05-01 15:56:49 +02:00
};
2018-05-01 16:55:06 +02:00
lib = import "${krops}/lib";
pkgs = import "${krops}/pkgs" {};
2018-05-01 15:56:49 +02:00
source = lib.evalSource [{
nixpkgs.git = {
2018-10-31 18:24:57 +01:00
clean.exclude = ["/.version-suffix"];
2018-05-01 15:56:49 +02:00
ref = "4b4bbce199d3b3a8001ee93495604289b01aaad3";
url = https://github.com/NixOS/nixpkgs;
};
2018-05-01 16:55:06 +02:00
nixos-config.file = toString (pkgs.writeText "nixos-config" ''
{ pkgs, ... }: {
fileSystems."/" = { device = "/dev/sda1"; };
boot.loader.systemd-boot.enable = true;
services.openssh.enable = true;
environment.systemPackages = [ pkgs.git ];
users.users.root.openssh.authorizedKeys.keys = [
"ssh-rsa ADD_YOUR_OWN_PUBLIC_KEY_HERE user@localhost"
];
2018-05-01 15:56:49 +02:00
}
2018-05-01 16:55:06 +02:00
'');
2018-05-01 15:56:49 +02:00
}];
in
2018-05-01 16:55:06 +02:00
pkgs.krops.writeDeploy "deploy" {
2018-05-01 15:56:49 +02:00
source = source;
2018-05-03 21:52:43 +02:00
target = "root@YOUR_IP_ADDRESS_OR_HOST_NAME_HERE";
2018-05-01 15:56:49 +02:00
}
```
and run `$(nix-build --no-out-link krops.nix)` to deploy the target machine.
Under the hood, this will make the sources available on the target machine
below `/var/src`, and execute `nixos-rebuild switch -I /var/src`.
2018-09-28 16:11:52 +02:00
2019-02-26 21:38:32 +01:00
## Source Types
### `derivation`
Nix expression to be built at the target machine.
Supported attributes:
* `text` -
Nix expression to be built.
### `file`
The file source type transfers local files (and folders) to the target
using [`rsync`](https://rsync.samba.org/).
Supported attributes:
* `path` -
absolute path to files that should by transfered
* `useChecksum` (optional) -
boolean that controls whether file contents should be checked to decide
whether a file has changed. This is useful when `path` points at files
with mangled timestamps, e.g. the Nix store.
### `git`
Git sources that will be fetched on the target machine.
Supported attributes:
* `url` -
URL of the Git repository that should be fetched.
* `ref` -
Branch / tag / commit that should be fetched.
* `clean.exclude` -
List of patterns that should be excluded from Git cleaning.
### `pass`
The pass source type transfers contents from a local
[password store](https://www.passwordstore.org/) to the target machine.
Supported attributes:
* `dir` -
absolute path to the password store.
* `name` -
sub-directory in the password store.
### `pipe`
Executes a local command, capture its stdout, and send that as a file to the
target machine.
Supported attributes:
* `command` -
The (shell) command to run.
### `symlink`
Symlink to create at the target, relative to the target directory.
This can be used to reference files in other sources.
Supported attributes:
* `target` -
Content of the symlink. This is typically a relative path.
2018-09-28 16:11:52 +02:00
## References
- [In-depth example](http://tech.ingolf-wagner.de/nixos/krops/) by [Ingolf Wagner](https://ingolf-wagner.de/)
2018-10-05 20:13:26 +02:00
2019-02-26 21:38:32 +01:00
2018-10-05 20:13:26 +02:00
## Communication
Comments, questions, pull-requests, etc. are very welcome, and can be directed
at:
- IRC: #krebs at freenode
- Mail: [spam@krebsco.de](mailto:spam@krebsco.de)