2018-05-01 16:55:06 +02:00
|
|
|
# krops (krebs ops)
|
2018-05-01 15:56:49 +02:00
|
|
|
|
2018-09-28 17:01:38 +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
|
|
|
|
2018-09-28 17:01:38 +02: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
|
2018-09-28 17:01:38 +02:00
|
|
|
- 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
|
|
|
|
2018-09-28 17:01:38 +02: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/;
|
2018-10-02 19:51:54 +02:00
|
|
|
rev = "3022582ade8049e6ccf18f358cedb996d6716945";
|
|
|
|
sha256 = "0k3zhv2830z4bljcdvf6ciwjihk2zzcn9y23p49c6sba5hbsd6jb";
|
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 ];
|
2018-05-03 21:52:15 +02:00
|
|
|
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
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2018-09-28 17:01:38 +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
|
|
|
|
|
2018-09-28 17:01:38 +02:00
|
|
|
- [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)
|