Manage secrets using agenix
This commit is contained in:
parent
7095204d06
commit
aff559a20e
31
README.md
31
README.md
|
@ -1,4 +1,4 @@
|
||||||
# Erpnext on NixOS
|
# ERPNext on NixOS
|
||||||
|
|
||||||
### Cachix
|
### Cachix
|
||||||
Using the https://pub-solar.cachix.org binary cache:
|
Using the https://pub-solar.cachix.org binary cache:
|
||||||
|
@ -22,15 +22,40 @@ nix build --json .#run-erpnext \
|
||||||
|
|
||||||
### NixOS VM
|
### NixOS VM
|
||||||
```
|
```
|
||||||
|
# Build the test VM
|
||||||
nix build '.#nixosConfigurations.test-vm.config.system.build.vm'
|
nix build '.#nixosConfigurations.test-vm.config.system.build.vm'
|
||||||
|
# Start the VM, to generate SSH host key files required for secrets
|
||||||
./result/bin/run-nixos-vm
|
./result/bin/run-nixos-vm
|
||||||
|
|
||||||
# In the VM, use root & empty password to login
|
# Get the ed25519 SSH hostkey
|
||||||
|
ssh-keyscan -p 2222 127.0.0.1
|
||||||
|
|
||||||
|
# Edit secrets.nix and add the SSH hostkey to machine 'test-vm'
|
||||||
|
vim secrets/secrets.nix
|
||||||
|
|
||||||
|
# Rekey the secrets with agenix
|
||||||
|
cd secrets
|
||||||
|
agenix --rekey
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
# Stop with CTRL-c & build the test VM again
|
||||||
|
nix build '.#nixosConfigurations.test-vm.config.system.build.vm'
|
||||||
|
# Start the VM
|
||||||
|
./result/bin/run-nixos-vm
|
||||||
|
|
||||||
|
# Access the VM via SSH, use an empty password (Enter) to login
|
||||||
|
ssh root@localhost -p 2222
|
||||||
|
|
||||||
# Watch erpnext startup:
|
# Watch erpnext startup:
|
||||||
# journalctl -fu erpnext.service
|
# The initial startup can take a few minutes
|
||||||
|
journalctl -fu erpnext-web.service
|
||||||
|
|
||||||
# Open http://localhost:8081 in your browser
|
# Open http://localhost:8081 in your browser
|
||||||
# User: Administrator
|
# User: Administrator
|
||||||
# Password: admin
|
# Password: admin
|
||||||
|
|
||||||
|
# To reset all data for the VM
|
||||||
|
rm nixos.qcow2
|
||||||
```
|
```
|
||||||
|
|
||||||
### Docker
|
### Docker
|
||||||
|
|
117
docs/secrets.md
Normal file
117
docs/secrets.md
Normal file
|
@ -0,0 +1,117 @@
|
||||||
|
# Secrets
|
||||||
|
|
||||||
|
Secrets are managed using [agenix][agenix]
|
||||||
|
so you can keep your flake in a public repository like GitHub without
|
||||||
|
exposing your password or other sensitive data.
|
||||||
|
|
||||||
|
## Agenix
|
||||||
|
|
||||||
|
Currently, there is [no mechanism][secrets-issue] in nix itself to deploy secrets
|
||||||
|
within the nix store because it is world-readable.
|
||||||
|
|
||||||
|
Most NixOS modules have the ability to set options to files in the system, outside
|
||||||
|
the nix store, that contain sensitive information. You can use [agenix][agenix]
|
||||||
|
to easily setup those secret files declaratively.
|
||||||
|
|
||||||
|
[agenix][agenix] encrypts secrets and stores them as .age files in your repository.
|
||||||
|
Age files are encrypted with multiple ssh public keys, so any host or user with a
|
||||||
|
matching ssh private key can read the data. The [age module][age module] will add those
|
||||||
|
encrypted files to the nix store and decrypt them on activation to `/run/agenix`.
|
||||||
|
|
||||||
|
### Setup
|
||||||
|
|
||||||
|
All hosts must have openssh enabled, this is done by default in the core profile.
|
||||||
|
|
||||||
|
You need to populate your `secrets/secrets.nix` with the proper ssh public keys.
|
||||||
|
Be extra careful to make sure you only add public keys, you should never share a
|
||||||
|
private key!!
|
||||||
|
|
||||||
|
secrets/secrets.nix:
|
||||||
|
|
||||||
|
```nix
|
||||||
|
let
|
||||||
|
system = "<system ssh key>";
|
||||||
|
user = "<user ssh key>";
|
||||||
|
allKeys = [ system user ];
|
||||||
|
in
|
||||||
|
```
|
||||||
|
|
||||||
|
On most systems, you can get your systems ssh public key from `/etc/ssh/ssh_host_ed25519_key.pub`. If
|
||||||
|
this file doesn't exist you likely need to enable openssh and rebuild your system.
|
||||||
|
|
||||||
|
Your users ssh public key is probably stored in `~/.ssh/id_ed25519.pub` or
|
||||||
|
`~/.ssh/id_rsa.pub`. If you haven't generated a ssh key yet, be sure do so:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
ssh-keygen -t ed25519
|
||||||
|
```
|
||||||
|
|
||||||
|
> ##### _Note:_
|
||||||
|
>
|
||||||
|
> The underlying tool used by agenix, rage, doesn't work well with password protected
|
||||||
|
> ssh keys. So if you have lots of secrets you might have to type in your password many
|
||||||
|
> times.
|
||||||
|
|
||||||
|
### Secrets
|
||||||
|
|
||||||
|
You will need the `agenix` command to create secrets. DevOS conveniently provides that
|
||||||
|
in the devShell, so just run `nix develop` whenever you want to edit secrets. Make sure
|
||||||
|
to always run `agenix` while in the `secrets/` folder, so it can pick up your `secrets.nix`.
|
||||||
|
|
||||||
|
To create secrets, simply add lines to your `secrets/secrets.nix`:
|
||||||
|
|
||||||
|
```
|
||||||
|
let
|
||||||
|
...
|
||||||
|
allKeys = [ system user ];
|
||||||
|
in
|
||||||
|
{
|
||||||
|
"secret.age".publicKeys = allKeys;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
That would tell agenix to create a `secret.age` file that is encrypted with the `system`
|
||||||
|
and `user` ssh public key.
|
||||||
|
|
||||||
|
Then go into the `secrets` folder and run:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
agenix -e secret.age
|
||||||
|
```
|
||||||
|
|
||||||
|
This will create the `secret.age`, if it doesn't already exist, and allow you to edit it.
|
||||||
|
|
||||||
|
If you ever change the `publicKeys` entry of any secret make sure to rekey the secrets:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
agenix --rekey
|
||||||
|
```
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
|
||||||
|
Once you have your secret file encrypted and ready to use, you can utilize the [age module][age module]
|
||||||
|
to ensure that your secrets end up in `/run/secrets`.
|
||||||
|
|
||||||
|
In any profile that uses a NixOS module that requires a secret you can enable a particular secret like so:
|
||||||
|
|
||||||
|
```nix
|
||||||
|
{ self, ... }:
|
||||||
|
{
|
||||||
|
age.secrets.mysecret.file = "${self}/secrets/mysecret.age";
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Then you can just pass the path `/run/agenix/mysecret` to the module.
|
||||||
|
|
||||||
|
You can make use of the many options provided by the age module to customize where and how
|
||||||
|
secrets get decrypted. You can learn about them by looking at the
|
||||||
|
[age module][age module].
|
||||||
|
|
||||||
|
> ##### _Note:_
|
||||||
|
>
|
||||||
|
> You can take a look at the [agenix repository][agenix] for more information
|
||||||
|
> about the tool.
|
||||||
|
|
||||||
|
[agenix]: https://github.com/ryantm/agenix
|
||||||
|
[age module]: https://github.com/ryantm/agenix/blob/master/modules/age.nix
|
||||||
|
[secrets-issue]: https://github.com/NixOS/nix/issues/8
|
44
flake.lock
44
flake.lock
|
@ -1,5 +1,48 @@
|
||||||
{
|
{
|
||||||
"nodes": {
|
"nodes": {
|
||||||
|
"agenix": {
|
||||||
|
"inputs": {
|
||||||
|
"darwin": "darwin",
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1682101079,
|
||||||
|
"narHash": "sha256-MdAhtjrLKnk2uiqun1FWABbKpLH090oeqCSiWemtuck=",
|
||||||
|
"owner": "ryantm",
|
||||||
|
"repo": "agenix",
|
||||||
|
"rev": "2994d002dcff5353ca1ac48ec584c7f6589fe447",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "ryantm",
|
||||||
|
"repo": "agenix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"darwin": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"agenix",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1689163348,
|
||||||
|
"narHash": "sha256-qL3FnBauu3PmYf0OZzv2cKtVyRg4ELVXPQl0AAYqlqs=",
|
||||||
|
"owner": "lnl7",
|
||||||
|
"repo": "nix-darwin",
|
||||||
|
"rev": "43ce086813c83184b88f67fc544af2050a3035ba",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "lnl7",
|
||||||
|
"ref": "master",
|
||||||
|
"repo": "nix-darwin",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"devshell": {
|
"devshell": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
|
@ -41,6 +84,7 @@
|
||||||
},
|
},
|
||||||
"root": {
|
"root": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
|
"agenix": "agenix",
|
||||||
"devshell": "devshell",
|
"devshell": "devshell",
|
||||||
"nixpkgs": "nixpkgs",
|
"nixpkgs": "nixpkgs",
|
||||||
"systems": "systems"
|
"systems": "systems"
|
||||||
|
|
28
flake.nix
28
flake.nix
|
@ -1,15 +1,20 @@
|
||||||
{
|
{
|
||||||
description = "Dev Setup";
|
description = "Dev Setup";
|
||||||
|
|
||||||
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
inputs = {
|
||||||
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||||
|
|
||||||
inputs.systems.url = "github:nix-systems/default";
|
systems.url = "github:nix-systems/default";
|
||||||
|
|
||||||
inputs.devshell.url = "github:numtide/devshell";
|
devshell.url = "github:numtide/devshell";
|
||||||
inputs.devshell.inputs.nixpkgs.follows = "nixpkgs";
|
devshell.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
inputs.devshell.inputs.systems.follows = "systems";
|
devshell.inputs.systems.follows = "systems";
|
||||||
|
|
||||||
outputs = {self, nixpkgs, systems, devshell }:
|
agenix.url = "github:ryantm/agenix";
|
||||||
|
agenix.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = {agenix, devshell, nixpkgs, self, systems}:
|
||||||
let
|
let
|
||||||
eachSystem = nixpkgs.lib.genAttrs (import systems);
|
eachSystem = nixpkgs.lib.genAttrs (import systems);
|
||||||
# Nixpkgs instantiated for system types in nix-systems
|
# Nixpkgs instantiated for system types in nix-systems
|
||||||
|
@ -19,6 +24,7 @@
|
||||||
overlays = [
|
overlays = [
|
||||||
self.overlays.default
|
self.overlays.default
|
||||||
self.overlays.pythonOverlay
|
self.overlays.pythonOverlay
|
||||||
|
agenix.overlays.default
|
||||||
devshell.overlays.default
|
devshell.overlays.default
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@ -45,6 +51,11 @@
|
||||||
name = pkgs.cachix.pname;
|
name = pkgs.cachix.pname;
|
||||||
package = pkgs.cachix;
|
package = pkgs.cachix;
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
help = pkgs.agenix.meta.description;
|
||||||
|
name = pkgs.agenix.pname;
|
||||||
|
package = pkgs.agenix;
|
||||||
|
}
|
||||||
];
|
];
|
||||||
bash.extra = ''
|
bash.extra = ''
|
||||||
'';
|
'';
|
||||||
|
@ -67,7 +78,10 @@
|
||||||
{
|
{
|
||||||
test-vm = nixpkgs.lib.nixosSystem {
|
test-vm = nixpkgs.lib.nixosSystem {
|
||||||
inherit system pkgs;
|
inherit system pkgs;
|
||||||
modules = [./test-vm/configuration.nix];
|
modules = [
|
||||||
|
agenix.nixosModules.age
|
||||||
|
./test-vm/configuration.nix
|
||||||
|
];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -42,7 +42,7 @@ in
|
||||||
adminPasswordFile = mkOption {
|
adminPasswordFile = mkOption {
|
||||||
type = types.nullOr types.path;
|
type = types.nullOr types.path;
|
||||||
default = null;
|
default = null;
|
||||||
example = "/run/secrets/erpnext-password";
|
example = "/run/secrets/erpnext-admin-password";
|
||||||
description = lib.mdDoc ''
|
description = lib.mdDoc ''
|
||||||
A file containing the Administrator user password.
|
A file containing the Administrator user password.
|
||||||
'';
|
'';
|
||||||
|
@ -69,10 +69,10 @@ in
|
||||||
default = "erpnext";
|
default = "erpnext";
|
||||||
description = lib.mdDoc "Database username.";
|
description = lib.mdDoc "Database username.";
|
||||||
};
|
};
|
||||||
passwordFile = mkOption {
|
userPasswordFile = mkOption {
|
||||||
type = types.nullOr types.path;
|
type = types.nullOr types.path;
|
||||||
default = null;
|
default = null;
|
||||||
example = "/run/secrets/erpnext-db-password";
|
example = "/run/secrets/erpnext-db-user-password";
|
||||||
description = lib.mdDoc ''
|
description = lib.mdDoc ''
|
||||||
A file containing the MariaDB erpnext user password.
|
A file containing the MariaDB erpnext user password.
|
||||||
'';
|
'';
|
||||||
|
@ -80,7 +80,7 @@ in
|
||||||
rootPasswordFile = mkOption {
|
rootPasswordFile = mkOption {
|
||||||
type = types.nullOr types.path;
|
type = types.nullOr types.path;
|
||||||
default = null;
|
default = null;
|
||||||
example = "/run/secrets/erpnext-root-db-password";
|
example = "/run/secrets/erpnext-db-root-password";
|
||||||
description = lib.mdDoc ''
|
description = lib.mdDoc ''
|
||||||
A file containing the MariaDB root user password.
|
A file containing the MariaDB root user password.
|
||||||
'';
|
'';
|
||||||
|
@ -144,7 +144,7 @@ in
|
||||||
example = lib.literalExpression ''
|
example = lib.literalExpression ''
|
||||||
{
|
{
|
||||||
serverAliases = [
|
serverAliases = [
|
||||||
"dolibarr.''${config.networking.domain}"
|
"erpnext.''${config.networking.domain}"
|
||||||
"erp.''${config.networking.domain}"
|
"erp.''${config.networking.domain}"
|
||||||
];
|
];
|
||||||
enableACME = false;
|
enableACME = false;
|
||||||
|
@ -195,10 +195,10 @@ in
|
||||||
db_host = "${cfg.database.host}";
|
db_host = "${cfg.database.host}";
|
||||||
db_port = "${toString cfg.database.port}";
|
db_port = "${toString cfg.database.port}";
|
||||||
db_name = "${cfg.database.name}";
|
db_name = "${cfg.database.name}";
|
||||||
db_password = "#NIXOS_ERPNEXT_DB_PASSWORD#";
|
db_password = "#NIXOS_ERPNEXT_DB_USER_PASSWORD#";
|
||||||
redis_cache = "redis://${cfg.redis.host}:${toString cfg.redis.port}";
|
redis_cache = "redis://${cfg.redis.host}:${toString cfg.redis.port}?db=1";
|
||||||
redis_queue = "redis://${cfg.redis.host}:${toString cfg.redis.port}";
|
redis_queue = "redis://${cfg.redis.host}:${toString cfg.redis.port}?db=2";
|
||||||
redis_socketio = "redis://${cfg.redis.host}:${toString cfg.redis.port}";
|
redis_socketio = "redis://${cfg.redis.host}:${toString cfg.redis.port}?db=0";
|
||||||
socketio_port = "${toString cfg.socketIoPort}";
|
socketio_port = "${toString cfg.socketIoPort}";
|
||||||
};
|
};
|
||||||
commonSiteConfigFile = pkgs.writeText "erpnext-common_site_config.json" (builtins.toJSON commonSiteConfig);
|
commonSiteConfigFile = pkgs.writeText "erpnext-common_site_config.json" (builtins.toJSON commonSiteConfig);
|
||||||
|
@ -209,6 +209,7 @@ in
|
||||||
Type = "simple";
|
Type = "simple";
|
||||||
BindReadOnlyPaths = [
|
BindReadOnlyPaths = [
|
||||||
"/etc/hosts:/etc/hosts"
|
"/etc/hosts:/etc/hosts"
|
||||||
|
"/run/agenix:/run/agenix"
|
||||||
"${pkgs.frappe-app}:${pkgs.frappe-app}"
|
"${pkgs.frappe-app}:${pkgs.frappe-app}"
|
||||||
"${pkgs.frappe-app}/share/apps/frappe:${cfg.benchDir}/apps/frappe"
|
"${pkgs.frappe-app}/share/apps/frappe:${cfg.benchDir}/apps/frappe"
|
||||||
"${pkgs.erpnext-app}:${pkgs.erpnext-app}"
|
"${pkgs.erpnext-app}:${pkgs.erpnext-app}"
|
||||||
|
@ -264,7 +265,7 @@ in
|
||||||
wantedBy = [ "erpnext-web.service" ];
|
wantedBy = [ "erpnext-web.service" ];
|
||||||
partOf = [ "erpnext-web.service" ];
|
partOf = [ "erpnext-web.service" ];
|
||||||
script = ''
|
script = ''
|
||||||
${pkgs.mariadb-client}/bin/mysql -e "SET PASSWORD FOR 'root'@'localhost' = PASSWORD('${builtins.readFile cfg.database.rootPasswordFile}')";
|
${pkgs.mariadb-client}/bin/mysql -e "SET PASSWORD FOR 'root'@'localhost' = PASSWORD('$(cat "${cfg.database.rootPasswordFile}")')";
|
||||||
'';
|
'';
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
RemainAfterExit = true;
|
RemainAfterExit = true;
|
||||||
|
@ -342,18 +343,21 @@ in
|
||||||
ExecStartPre = assert cfg.adminPasswordFile != null && cfg.database.rootPasswordFile != null; pkgs.writeScript "erpnext-web-init" ''
|
ExecStartPre = assert cfg.adminPasswordFile != null && cfg.database.rootPasswordFile != null; pkgs.writeScript "erpnext-web-init" ''
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
if ! test -e ${escapeShellArg "${cfg.workDir}/.db-created"}; then
|
if ! test -e ${escapeShellArg "${cfg.workDir}/.db-created"}; then
|
||||||
|
# Fail on error
|
||||||
|
set -e
|
||||||
|
|
||||||
install -m0600 ${commonSiteConfigFile} ${cfg.benchDir}/sites/common_site_config.json
|
install -m0600 ${commonSiteConfigFile} ${cfg.benchDir}/sites/common_site_config.json
|
||||||
${pkgs.replace-secret}/bin/replace-secret \
|
${pkgs.replace-secret}/bin/replace-secret \
|
||||||
'#NIXOS_ERPNEXT_DB_PASSWORD#' \
|
'#NIXOS_ERPNEXT_DB_USER_PASSWORD#' \
|
||||||
${cfg.database.passwordFile} \
|
${cfg.database.userPasswordFile} \
|
||||||
${cfg.benchDir}/sites/common_site_config.json
|
${cfg.benchDir}/sites/common_site_config.json
|
||||||
|
|
||||||
ADMIN_PASSWORD="$(cat "${cfg.adminPasswordFile}")"
|
ADMIN_PASSWORD="$(cat "${cfg.adminPasswordFile}")"
|
||||||
ROOT_DB_PASSWORD="$(cat "${cfg.database.rootPasswordFile}")"
|
DB_ROOT_PASSWORD="$(cat "${cfg.database.rootPasswordFile}")"
|
||||||
|
|
||||||
# Upstream initializes the database with this command
|
# Upstream initializes the database with this command
|
||||||
${penv}/bin/bench new-site localhost \
|
${penv}/bin/bench new-site localhost \
|
||||||
--mariadb-root-password "$ROOT_DB_PASSWORD" \
|
--mariadb-root-password "$DB_ROOT_PASSWORD" \
|
||||||
--admin-password "$ADMIN_PASSWORD" \
|
--admin-password "$ADMIN_PASSWORD" \
|
||||||
--install-app erpnext
|
--install-app erpnext
|
||||||
|
|
||||||
|
|
15
secrets/admin-password.age
Normal file
15
secrets/admin-password.age
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
age-encryption.org/v1
|
||||||
|
-> ssh-ed25519 Wp/X/Q CkX9o53yvwG6TWGy86wjz8K08iEKcDWlCFGD/rOqjG8
|
||||||
|
I1JY9R+wMRDD0NYJQ5xYGYXeEMyBzg7J6E+BAVzlTmY
|
||||||
|
-> ssh-ed25519 FnuwSg TIWzdHqIIpGG6GqTspw6tFSWgIfdNnUPiRcWCJyARwA
|
||||||
|
xYMIfXDTl0KcaEa+cQPF0Ld5py4cFAgQUNha4Lrxqa0
|
||||||
|
-> ssh-ed25519 BVsyTA G0DnHKpVXXJPOMsJz9GGUX+RNEQ9FHv5AzUQl0AkkzA
|
||||||
|
OUsicHWAoiDuOQGHQDcgnBX58GdFKP0CpQiB+fF7KPs
|
||||||
|
-> ssh-ed25519 BVsyTA SQ7tgv5R8XNEv9nZaq27Y1/wDhgTzG628EuJh0yHOGk
|
||||||
|
cyBVqL5j0oIsVoIHMz9If9sJvRq7zNrB8aSqlFyeyYw
|
||||||
|
-> nr#`|-grease ORM\VtI 0#l nsQ`v=O 3[zMr%O(
|
||||||
|
Zs1oB4DhG5oE2QYXl/8yVUcdafTSJlK5LtB3gWYhi1pgyox63Pi5oZ0XpzzqN855
|
||||||
|
/egFwpJ9QIMpU7etG94XLjEJq/k0T7P3Nu66Z4pGuRDTybqLCAKlbkcwWGxMxEkH
|
||||||
|
Yg
|
||||||
|
--- aRI3fjSGDjF34d8JK+Ow6dfmncI8qvl3Betzlc1hsVc
|
||||||
|
©¢²¼{õHå/6kSÀÓšclµ e_0ÀÀ_œ]<h(²
|
14
secrets/database-root-password.age
Normal file
14
secrets/database-root-password.age
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
age-encryption.org/v1
|
||||||
|
-> ssh-ed25519 Wp/X/Q uMcrhm3fS+M/P2uaEJvdRab5G4Nk6zZNAlHyRISlGg0
|
||||||
|
9QNitHuuKYzn99Hr76+yOa51/4qfTlhUwf5cD/Px/FI
|
||||||
|
-> ssh-ed25519 FnuwSg ukuZCjWTcyC4LiHWmrunskAk3WbNZsdAXzHi3fydJwI
|
||||||
|
k3N3F4hxw55E6C68jLoaIQfuDUaOILxbw8BYwIcI2e8
|
||||||
|
-> ssh-ed25519 BVsyTA q+2w2O+4c8NahzHuo2KLDxa8RHB79+L+h9KOY9GdGkA
|
||||||
|
eWRM4yyQtefZ6tnozqg37eLLMz7rQYl3eem2jxGThwo
|
||||||
|
-> ssh-ed25519 BVsyTA 6qkLU9OPuBv6KlgaILTkeFsyNgm8uW2PgZvsIQ8pGwM
|
||||||
|
kXBSETY11ZCJs5HZ2jH9LAw0ntrsSW2J5ES97X7FkpI
|
||||||
|
-> }6jwb-grease ,2 {su
|
||||||
|
Yypdzw8GT6HmlqgBxHAuEiKDWsH+wSYK2rMxketTP6OlWJHfmV9jc/YBMXwWNkhh
|
||||||
|
jcQfjmwx2Wjcn0mjiv6RUYi3tulpbkB+jctRW+vstPHTIptEMhOfs5FM
|
||||||
|
--- WPd5tG8HvNuhMZfqvzaCeDz2tavijgWewAuLV+5wFuE
|
||||||
|
9öêÔ¯“áY÷%"|V`WV%l»''oKÀ$W`Ÿ!è)ŸBؘºN¥p
|
14
secrets/database-user-password.age
Normal file
14
secrets/database-user-password.age
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
age-encryption.org/v1
|
||||||
|
-> ssh-ed25519 Wp/X/Q 3hW/8PTjCcRN4cj1OJlmKgGrupW/At/XcZP9mX5relM
|
||||||
|
DrYHHxhA6DDj5tkUwMEP1Diedo5ZRtdaDaytodWcRlU
|
||||||
|
-> ssh-ed25519 FnuwSg 7szTuXVOxA1gEKvXFDDpPBak5Eh2CwUGnL52wGLmogw
|
||||||
|
J/no4LHtQ5FR43r6evCk4n6V/6gQ5navfvVGOc6Mnl0
|
||||||
|
-> ssh-ed25519 BVsyTA cGS0ASOgef9VUxNQF0h70h9aJnctBZRc6FBQgahLn0c
|
||||||
|
b35sRRi+yNu2arU7yipZctcie0itomjJtc3Nr4i2nss
|
||||||
|
-> ssh-ed25519 BVsyTA VG8SwHZkdvGwmbx/kOT5oabV+WpO5QGIJXtse4CtKgE
|
||||||
|
WiEuIMlsaW98kPB6pChEZhCNWo0pVbDMEIwfRtuKNnY
|
||||||
|
-> 2IOJi1-grease s^`TsZL %{ &~L*
|
||||||
|
TU4AdoaLUEYR8YQRMcUdFho/WOs9IpwM1z4t36FbM3GPFqz0IY5MCC9shj+oxhh1
|
||||||
|
aW5/FKRXoTLG5A
|
||||||
|
--- 9HuacZ7Sr0o0XKFkdT4qIQSdx8Idymsb/jc3QxLOwg0
|
||||||
|
MÄ0H±„{ÝË»—ˆ;Ÿc”ž*$½6dŒ(ÖÕ1ÏüDÍ÷<C38D>‹3OÂe†
|
16
secrets/secrets.nix
Normal file
16
secrets/secrets.nix
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
let
|
||||||
|
# set ssh public keys here for your system and user
|
||||||
|
machines = {
|
||||||
|
dumpyourvms = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILDATEWAgDZFfYs1ZPh33Kg4sqQ9tWMVKyk8XqFu3Koe host@dumpyourvms";
|
||||||
|
test-vm = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILD8RziyMKgRj6MLkRjdHnNwG2+VolUl8ejjeteehVnw host@test-vm";
|
||||||
|
};
|
||||||
|
users = {
|
||||||
|
teutat3s = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHcU6KPy4b1MQXd6EJhcYwbJu7E+0IrBZF/IP6T7gbMf teutat3s@dumpyourvms";
|
||||||
|
root = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHcU6KPy4b1MQXd6EJhcYwbJu7E+0IrBZF/IP6T7gbMf root@test-vm";
|
||||||
|
};
|
||||||
|
allKeys = [machines.dumpyourvms machines.test-vm users.root users.teutat3s];
|
||||||
|
in {
|
||||||
|
"admin-password.age".publicKeys = allKeys;
|
||||||
|
"database-root-password.age".publicKeys = allKeys;
|
||||||
|
"database-user-password.age".publicKeys = allKeys;
|
||||||
|
}
|
|
@ -60,11 +60,27 @@
|
||||||
neovim
|
neovim
|
||||||
];
|
];
|
||||||
|
|
||||||
|
age.secrets.erpnext-admin-password = {
|
||||||
|
file = ../secrets/admin-password.age;
|
||||||
|
mode = "700";
|
||||||
|
owner = "erpnext";
|
||||||
|
};
|
||||||
|
age.secrets.erpnext-db-root-password = {
|
||||||
|
file = ../secrets/database-root-password.age;
|
||||||
|
mode = "700";
|
||||||
|
owner = "erpnext";
|
||||||
|
};
|
||||||
|
age.secrets.erpnext-db-user-password = {
|
||||||
|
file = ../secrets/database-user-password.age;
|
||||||
|
mode = "700";
|
||||||
|
owner = "erpnext";
|
||||||
|
};
|
||||||
|
|
||||||
services.erpnext = {
|
services.erpnext = {
|
||||||
enable = true;
|
enable = true;
|
||||||
adminPasswordFile = ../adminpass.txt;
|
adminPasswordFile = config.age.secrets.erpnext-admin-password.path;
|
||||||
database.rootPasswordFile = ../dbrootpass.txt;
|
database.rootPasswordFile = config.age.secrets.erpnext-db-root-password.path;
|
||||||
database.passwordFile = ../dbuserpass.txt;
|
database.userPasswordFile = config.age.secrets.erpnext-db-user-password.path;
|
||||||
caddy = {};
|
caddy = {};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue