delete terranix folder
This commit is contained in:
parent
0671e6b3c5
commit
2f48fe597a
70 changed files with 0 additions and 3349 deletions
3
terranix/.gitignore
vendored
3
terranix/.gitignore
vendored
|
@ -1,3 +0,0 @@
|
|||
*.backup
|
||||
.history
|
||||
.terraform
|
3
terranix/gitlab/.gitignore
vendored
3
terranix/gitlab/.gitignore
vendored
|
@ -1,3 +0,0 @@
|
|||
.terraform*
|
||||
terraform.tfstate*
|
||||
config.tf.json
|
|
@ -1,7 +0,0 @@
|
|||
# nix flake example
|
||||
|
||||
This example shows how you could use terranix as flake.
|
||||
|
||||
- `nix run` run `nix run ".#apply"`
|
||||
- `nix run ".#apply"` run `terraform apply`
|
||||
- `nix run ".#destroy"` run `terraform destroy`
|
|
@ -1,31 +0,0 @@
|
|||
# start with:
|
||||
# export GITLAB_TOKEN=""
|
||||
{ config, lib, ... }:
|
||||
{
|
||||
terraform.required_providers.gitlab.source = "gitlabhq/gitlab";
|
||||
|
||||
provider.gitlab = {
|
||||
base_url = "https://gitlab.ingolf-wagner.de/api/v4/";
|
||||
};
|
||||
|
||||
resource.gitlab_deploy_key =
|
||||
let
|
||||
ssh_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDNRzdW7SYizwrECoTJbL0peeTkaRfAT5Jjefgad+MmHFHsRRy/q2bDQLlhKGPC4I0gXsaYuZSeSpaCwa6JHwDXDUjeSwj/osKE7lDnRx0XmGKKwZPNU4KuI9CUH450p5M9w3KgSmKEXJKayUz1/8E4WlSjfSkqpGwkhCeHtuIVd6Wei+fU/7uzYrL6tg8ZZD3omvvD4AxCEzNvM3wuX915K0x52GySJLpQUt9xYZLb1qrQAkVAnOE2ZZLx5rVzDLJkPrPRQ5Og3Yi3mT469AbKM/XPPuVgluiMCLOq8avAOQGK2brKjdaw2m3bDKuH18WJfMwwu/0uzSe1CWBwNj8/gAQapevhoYwMLjK9eJvWBh2Wc7tgHO51uZM3mVTylWFlsundM2ASssVHueReNpnUtMvXdCPHb0ZmZNy/3NW0u+y7FnLRvnrRSF8TYPeUYTOoRd0nbvwb6R0mBvHFqjs6ILLL7+d+JHCBnGAxu3AwgWAsS8LP3G+VL7arb1pEVJK52Svjoi2tPXWaRixAB1KxMep44UtY+TCGs+5fx++y2sUGhcEJBxXywpFmAPjOZLRuiDcnsWxZfTSMkQowoG6PUtcplasY4+NzJ/ivBjfka111KRLURNIRkCGaBZKPAROkGd9iKdiSENdpXRwubFl5ISjEPR3tdZaTY97w+hj8OQ==";
|
||||
work_repositories = {
|
||||
mindcurv = "palo/mindcurv_nix";
|
||||
timewarrior = "palo/timewarrior_mindcurv";
|
||||
};
|
||||
|
||||
repository = name: project_path: {
|
||||
name = name;
|
||||
value = {
|
||||
project = project_path;
|
||||
title = "Deployment key";
|
||||
key = ssh_key;
|
||||
};
|
||||
};
|
||||
|
||||
in
|
||||
lib.mapAttrs' repository work_repositories;
|
||||
|
||||
}
|
|
@ -1,129 +0,0 @@
|
|||
{
|
||||
"nodes": {
|
||||
"bats-assert": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1636059754,
|
||||
"narHash": "sha256-ewME0l27ZqfmAwJO4h5biTALc9bDLv7Bl3ftBzBuZwk=",
|
||||
"owner": "bats-core",
|
||||
"repo": "bats-assert",
|
||||
"rev": "34551b1d7f8c7b677c1a66fc0ac140d6223409e5",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "bats-core",
|
||||
"repo": "bats-assert",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"bats-support": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1548869839,
|
||||
"narHash": "sha256-Gr4ntadr42F2Ks8Pte2D4wNDbijhujuoJi4OPZnTAZU=",
|
||||
"owner": "bats-core",
|
||||
"repo": "bats-support",
|
||||
"rev": "d140a65044b2d6810381935ae7f0c94c7023c8c3",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "bats-core",
|
||||
"repo": "bats-support",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-utils": {
|
||||
"locked": {
|
||||
"lastModified": 1631561581,
|
||||
"narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-utils_2": {
|
||||
"locked": {
|
||||
"lastModified": 1634851050,
|
||||
"narHash": "sha256-N83GlSGPJJdcqhUxSCS/WwW5pksYf3VP1M13cDRTSVA=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "c91f3de5adaf1de973b797ef7485e441a65b8935",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1633074215,
|
||||
"narHash": "sha256-epmR1H1amgFWuU7xW9OXGjsAqltMqCSqkv1U2+9rOlM=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "378d2c5dcec7fef958cca3760448c09a9be2b7a3",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils",
|
||||
"nixpkgs": "nixpkgs",
|
||||
"terranix": "terranix"
|
||||
}
|
||||
},
|
||||
"terranix": {
|
||||
"inputs": {
|
||||
"bats-assert": "bats-assert",
|
||||
"bats-support": "bats-support",
|
||||
"flake-utils": "flake-utils_2",
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
],
|
||||
"terranix-examples": "terranix-examples"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1636274003,
|
||||
"narHash": "sha256-HDiyJGgyDUoLnpL8N+wDm3cM/vEfYYc/p4N1kKH/kLk=",
|
||||
"owner": "terranix",
|
||||
"repo": "terranix",
|
||||
"rev": "87fe67a2c254e74c1c3f3206c504fe7ba76a3c59",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "terranix",
|
||||
"repo": "terranix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"terranix-examples": {
|
||||
"locked": {
|
||||
"lastModified": 1633465925,
|
||||
"narHash": "sha256-BfXRW1ZHpK5jh5CVcw7eFpGsWE1CyVxL8R+V7uXemaU=",
|
||||
"owner": "terranix",
|
||||
"repo": "terranix-examples",
|
||||
"rev": "70bf5d5a1ad4eabef1e4e71c1eb101021decd5a4",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "terranix",
|
||||
"repo": "terranix-examples",
|
||||
"type": "github"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
|
@ -1,53 +0,0 @@
|
|||
{
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs";
|
||||
flake-utils.url = "github:numtide/flake-utils";
|
||||
terranix = {
|
||||
url = "github:terranix/terranix";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
};
|
||||
|
||||
outputs = { self, nixpkgs, flake-utils, terranix }:
|
||||
flake-utils.lib.eachDefaultSystem (system:
|
||||
let
|
||||
pkgs = nixpkgs.legacyPackages.${system};
|
||||
terraform = pkgs.terraform_0_15;
|
||||
terraformConfiguration = terranix.lib.terranixConfiguration {
|
||||
inherit system;
|
||||
modules = [ ./config.nix ];
|
||||
};
|
||||
in
|
||||
{
|
||||
defaultPackage = terraformConfiguration;
|
||||
# nix develop
|
||||
devShell = pkgs.mkShell {
|
||||
buildInputs = [
|
||||
pkgs.terraform_0_15
|
||||
terranix.defaultPackage.${system}
|
||||
];
|
||||
};
|
||||
# nix run ".#apply"
|
||||
apps.apply = {
|
||||
type = "app";
|
||||
program = toString (pkgs.writers.writeBash "apply" ''
|
||||
if [[ -e config.tf.json ]]; then rm -f config.tf.json; fi
|
||||
cp ${terraformConfiguration} config.tf.json \
|
||||
&& ${terraform}/bin/terraform init \
|
||||
&& ${terraform}/bin/terraform apply
|
||||
'');
|
||||
};
|
||||
# nix run ".#destroy"
|
||||
apps.destroy = {
|
||||
type = "app";
|
||||
program = toString (pkgs.writers.writeBash "destroy" ''
|
||||
if [[ -e config.tf.json ]]; then rm -f config.tf.json; fi
|
||||
cp ${terraformConfiguration} config.tf.json \
|
||||
&& ${terraform}/bin/terraform init \
|
||||
&& ${terraform}/bin/terraform destroy
|
||||
'');
|
||||
};
|
||||
# nix run
|
||||
defaultApp = self.apps.${system}.apply;
|
||||
});
|
||||
}
|
|
@ -1,674 +0,0 @@
|
|||
{
|
||||
"v": "1",
|
||||
"id": "da023d7e-086a-4387-a5b1-02bd267d9c3f",
|
||||
"rev": 2,
|
||||
"name": "Dashboards",
|
||||
"summary": "My Dashboards",
|
||||
"description": "All my Dashboards focusing mainly on journald logs",
|
||||
"vendor": "Ingolf Wagner",
|
||||
"url": "",
|
||||
"parameters": [],
|
||||
"entities": [
|
||||
{
|
||||
"v": "1",
|
||||
"type": {
|
||||
"name": "dashboard",
|
||||
"version": "2"
|
||||
},
|
||||
"id": "04d927ad-a217-43bf-aa9e-820777399cc3",
|
||||
"data": {
|
||||
"summary": {
|
||||
"@type": "string",
|
||||
"@value": "Overview on Graylog"
|
||||
},
|
||||
"search": {
|
||||
"queries": [
|
||||
{
|
||||
"id": "bfb6a815-7213-484c-91ba-ebaeff542a66",
|
||||
"timerange": {
|
||||
"type": "relative",
|
||||
"range": 300
|
||||
},
|
||||
"query": {
|
||||
"type": "elasticsearch",
|
||||
"query_string": ""
|
||||
},
|
||||
"search_types": [
|
||||
{
|
||||
"query": {
|
||||
"type": "elasticsearch",
|
||||
"query_string": "from_journald:true AND syslog_facility:<4 AND (systemd_unit:elasticsearch.service OR systemd_unit:kibana.service OR systemd_unit:graylog.service)"
|
||||
},
|
||||
"name": "chart",
|
||||
"timerange": {
|
||||
"type": "relative",
|
||||
"range": 86400
|
||||
},
|
||||
"streams": [],
|
||||
"series": [
|
||||
{
|
||||
"type": "count",
|
||||
"id": "count()",
|
||||
"field": null
|
||||
}
|
||||
],
|
||||
"filter": null,
|
||||
"rollup": false,
|
||||
"row_groups": [
|
||||
{
|
||||
"type": "time",
|
||||
"field": "timestamp",
|
||||
"interval": {
|
||||
"type": "auto",
|
||||
"scaling": 1
|
||||
}
|
||||
}
|
||||
],
|
||||
"type": "pivot",
|
||||
"id": "8e1ed6ed-ff1f-4d86-8981-a987aaaa5eed",
|
||||
"column_groups": [
|
||||
{
|
||||
"type": "values",
|
||||
"field": "systemd_unit",
|
||||
"limit": 15
|
||||
}
|
||||
],
|
||||
"sort": []
|
||||
},
|
||||
{
|
||||
"query": {
|
||||
"type": "elasticsearch",
|
||||
"query_string": "from_journald:true"
|
||||
},
|
||||
"name": "chart",
|
||||
"timerange": {
|
||||
"type": "relative",
|
||||
"range": 86400
|
||||
},
|
||||
"streams": [],
|
||||
"series": [
|
||||
{
|
||||
"type": "count",
|
||||
"id": "count()",
|
||||
"field": null
|
||||
}
|
||||
],
|
||||
"filter": null,
|
||||
"rollup": false,
|
||||
"row_groups": [
|
||||
{
|
||||
"type": "time",
|
||||
"field": "timestamp",
|
||||
"interval": {
|
||||
"type": "auto",
|
||||
"scaling": 1
|
||||
}
|
||||
}
|
||||
],
|
||||
"type": "pivot",
|
||||
"id": "d7e2a713-28fd-46d1-8c7a-29bd2867bebd",
|
||||
"column_groups": [
|
||||
{
|
||||
"type": "values",
|
||||
"field": "source",
|
||||
"limit": 15
|
||||
}
|
||||
],
|
||||
"sort": []
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"parameters": [],
|
||||
"requires": {},
|
||||
"owner": "admin",
|
||||
"created_at": "2021-07-17T08:03:26.960Z"
|
||||
},
|
||||
"created_at": "2021-07-17T05:53:41.503Z",
|
||||
"requires": {},
|
||||
"state": {
|
||||
"bfb6a815-7213-484c-91ba-ebaeff542a66": {
|
||||
"selected_fields": null,
|
||||
"static_message_list_id": null,
|
||||
"titles": {
|
||||
"widget": {
|
||||
"b0d1972c-c917-4054-a946-d412859ee5f0": "Graylog Errors of last day",
|
||||
"49928524-8949-42e2-b6a6-4f208e2febb5": "Graylog Input of last day",
|
||||
"c535afa8-b27f-4cec-b117-483df2d439ec": "Graylog errors of last day",
|
||||
"9a6682e0-8993-439a-bfff-62e4a3c99473": "Graylog errors of last day (copy)"
|
||||
},
|
||||
"tab": {
|
||||
"title": "Last Day"
|
||||
}
|
||||
},
|
||||
"widgets": [
|
||||
{
|
||||
"id": "c535afa8-b27f-4cec-b117-483df2d439ec",
|
||||
"type": "aggregation",
|
||||
"filter": null,
|
||||
"timerange": {
|
||||
"type": "relative",
|
||||
"range": 86400
|
||||
},
|
||||
"query": {
|
||||
"type": "elasticsearch",
|
||||
"query_string": "from_journald:true AND syslog_facility:<4 AND (systemd_unit:elasticsearch.service OR systemd_unit:kibana.service OR systemd_unit:graylog.service)"
|
||||
},
|
||||
"streams": [],
|
||||
"config": {
|
||||
"visualization": "line",
|
||||
"event_annotation": false,
|
||||
"row_pivots": [
|
||||
{
|
||||
"field": "timestamp",
|
||||
"type": "time",
|
||||
"config": {
|
||||
"interval": {
|
||||
"type": "auto",
|
||||
"scaling": null
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"series": [
|
||||
{
|
||||
"config": {
|
||||
"name": null
|
||||
},
|
||||
"function": "count()"
|
||||
}
|
||||
],
|
||||
"rollup": false,
|
||||
"column_pivots": [
|
||||
{
|
||||
"field": "systemd_unit",
|
||||
"type": "values",
|
||||
"config": {
|
||||
"limit": 15
|
||||
}
|
||||
}
|
||||
],
|
||||
"visualization_config": {
|
||||
"interpolation": "spline"
|
||||
},
|
||||
"formatting_settings": null,
|
||||
"sort": []
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "49928524-8949-42e2-b6a6-4f208e2febb5",
|
||||
"type": "aggregation",
|
||||
"filter": null,
|
||||
"timerange": {
|
||||
"type": "relative",
|
||||
"range": 86400
|
||||
},
|
||||
"query": {
|
||||
"type": "elasticsearch",
|
||||
"query_string": "from_journald:true"
|
||||
},
|
||||
"streams": [],
|
||||
"config": {
|
||||
"visualization": "line",
|
||||
"event_annotation": false,
|
||||
"row_pivots": [
|
||||
{
|
||||
"field": "timestamp",
|
||||
"type": "time",
|
||||
"config": {
|
||||
"interval": {
|
||||
"type": "auto",
|
||||
"scaling": null
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"series": [
|
||||
{
|
||||
"config": {
|
||||
"name": null
|
||||
},
|
||||
"function": "count()"
|
||||
}
|
||||
],
|
||||
"rollup": false,
|
||||
"column_pivots": [
|
||||
{
|
||||
"field": "source",
|
||||
"type": "values",
|
||||
"config": {
|
||||
"limit": 15
|
||||
}
|
||||
}
|
||||
],
|
||||
"visualization_config": {
|
||||
"interpolation": "spline"
|
||||
},
|
||||
"formatting_settings": null,
|
||||
"sort": []
|
||||
}
|
||||
}
|
||||
],
|
||||
"widget_mapping": {
|
||||
"49928524-8949-42e2-b6a6-4f208e2febb5": [
|
||||
"d7e2a713-28fd-46d1-8c7a-29bd2867bebd"
|
||||
],
|
||||
"c535afa8-b27f-4cec-b117-483df2d439ec": [
|
||||
"8e1ed6ed-ff1f-4d86-8981-a987aaaa5eed"
|
||||
]
|
||||
},
|
||||
"positions": {
|
||||
"49928524-8949-42e2-b6a6-4f208e2febb5": {
|
||||
"col": 1,
|
||||
"row": 11,
|
||||
"height": 3,
|
||||
"width": "Infinity"
|
||||
},
|
||||
"c535afa8-b27f-4cec-b117-483df2d439ec": {
|
||||
"col": 1,
|
||||
"row": 8,
|
||||
"height": 3,
|
||||
"width": "Infinity"
|
||||
}
|
||||
},
|
||||
"formatting": {
|
||||
"highlighting": []
|
||||
},
|
||||
"display_mode_settings": {
|
||||
"positions": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
"properties": [],
|
||||
"owner": "admin",
|
||||
"title": {
|
||||
"@type": "string",
|
||||
"@value": "Graylog"
|
||||
},
|
||||
"type": "DASHBOARD",
|
||||
"description": {
|
||||
"@type": "string",
|
||||
"@value": ""
|
||||
}
|
||||
},
|
||||
"constraints": [
|
||||
{
|
||||
"type": "server-version",
|
||||
"version": ">=3.3.9+abab7dc"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"v": "1",
|
||||
"type": {
|
||||
"name": "dashboard",
|
||||
"version": "2"
|
||||
},
|
||||
"id": "40d84ea8-3f72-47b8-9819-722b3f5dcbd3",
|
||||
"data": {
|
||||
"summary": {
|
||||
"@type": "string",
|
||||
"@value": "Overview on Graylog"
|
||||
},
|
||||
"search": {
|
||||
"queries": [
|
||||
{
|
||||
"id": "bfb6a815-7213-484c-91ba-ebaeff542a66",
|
||||
"timerange": {
|
||||
"type": "relative",
|
||||
"range": 300
|
||||
},
|
||||
"query": {
|
||||
"type": "elasticsearch",
|
||||
"query_string": ""
|
||||
},
|
||||
"search_types": [
|
||||
{
|
||||
"query": {
|
||||
"type": "elasticsearch",
|
||||
"query_string": "from_journald:true AND systemd_unit:init.scope AND syslog_priority:4"
|
||||
},
|
||||
"name": "chart",
|
||||
"timerange": {
|
||||
"type": "relative",
|
||||
"range": 86400
|
||||
},
|
||||
"streams": [],
|
||||
"series": [
|
||||
{
|
||||
"type": "count",
|
||||
"id": "count()",
|
||||
"field": null
|
||||
}
|
||||
],
|
||||
"filter": null,
|
||||
"rollup": true,
|
||||
"row_groups": [
|
||||
{
|
||||
"type": "values",
|
||||
"field": "custom_unit",
|
||||
"limit": 15
|
||||
}
|
||||
],
|
||||
"type": "pivot",
|
||||
"id": "d480b368-2968-442c-94b9-e1e4e1830db7",
|
||||
"column_groups": [],
|
||||
"sort": []
|
||||
},
|
||||
{
|
||||
"query": {
|
||||
"type": "elasticsearch",
|
||||
"query_string": "from_journald:true"
|
||||
},
|
||||
"name": "chart",
|
||||
"timerange": {
|
||||
"type": "relative",
|
||||
"range": 86400
|
||||
},
|
||||
"streams": [],
|
||||
"series": [
|
||||
{
|
||||
"type": "count",
|
||||
"id": "count()",
|
||||
"field": null
|
||||
}
|
||||
],
|
||||
"filter": null,
|
||||
"rollup": false,
|
||||
"row_groups": [
|
||||
{
|
||||
"type": "time",
|
||||
"field": "timestamp",
|
||||
"interval": {
|
||||
"type": "auto",
|
||||
"scaling": 1
|
||||
}
|
||||
}
|
||||
],
|
||||
"type": "pivot",
|
||||
"id": "148df0da-281a-4266-a363-9565c9b851b6",
|
||||
"column_groups": [
|
||||
{
|
||||
"type": "values",
|
||||
"field": "source",
|
||||
"limit": 15
|
||||
}
|
||||
],
|
||||
"sort": []
|
||||
},
|
||||
{
|
||||
"query": {
|
||||
"type": "elasticsearch",
|
||||
"query_string": "from_journald:true AND syslog_facility:<4 AND (systemd_unit:elasticsearch.service OR systemd_unit:kibana.service OR systemd_unit:graylog.service)"
|
||||
},
|
||||
"name": "chart",
|
||||
"timerange": {
|
||||
"type": "relative",
|
||||
"range": 86400
|
||||
},
|
||||
"streams": [],
|
||||
"series": [
|
||||
{
|
||||
"type": "count",
|
||||
"id": "count()",
|
||||
"field": null
|
||||
}
|
||||
],
|
||||
"filter": null,
|
||||
"rollup": false,
|
||||
"row_groups": [
|
||||
{
|
||||
"type": "time",
|
||||
"field": "timestamp",
|
||||
"interval": {
|
||||
"type": "auto",
|
||||
"scaling": 1
|
||||
}
|
||||
}
|
||||
],
|
||||
"type": "pivot",
|
||||
"id": "fe958d96-6908-4516-848d-9490d810ed3e",
|
||||
"column_groups": [
|
||||
{
|
||||
"type": "values",
|
||||
"field": "systemd_unit",
|
||||
"limit": 15
|
||||
}
|
||||
],
|
||||
"sort": []
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"parameters": [],
|
||||
"requires": {},
|
||||
"owner": "admin",
|
||||
"created_at": "2021-07-17T11:41:39.203Z"
|
||||
},
|
||||
"created_at": "2021-07-17T05:53:41.503Z",
|
||||
"requires": {},
|
||||
"state": {
|
||||
"bfb6a815-7213-484c-91ba-ebaeff542a66": {
|
||||
"selected_fields": null,
|
||||
"static_message_list_id": null,
|
||||
"titles": {
|
||||
"widget": {
|
||||
"b0d1972c-c917-4054-a946-d412859ee5f0": "Graylog Errors of last day",
|
||||
"49928524-8949-42e2-b6a6-4f208e2febb5": "Graylog Input of last day",
|
||||
"c535afa8-b27f-4cec-b117-483df2d439ec": "Graylog errors of last day",
|
||||
"9a6682e0-8993-439a-bfff-62e4a3c99473": "Graylog errors of last day (copy)",
|
||||
"ac9ffdfc-8f48-4ed8-af3b-62120dc86bfa": "init.scope warnings",
|
||||
"221557b8-5b8b-4c57-9449-00a1aaf91388": "Messages for custom_unit:backup.mount"
|
||||
},
|
||||
"tab": {
|
||||
"title": "Last Day"
|
||||
}
|
||||
},
|
||||
"widgets": [
|
||||
{
|
||||
"id": "c535afa8-b27f-4cec-b117-483df2d439ec",
|
||||
"type": "aggregation",
|
||||
"filter": null,
|
||||
"timerange": {
|
||||
"type": "relative",
|
||||
"range": 86400
|
||||
},
|
||||
"query": {
|
||||
"type": "elasticsearch",
|
||||
"query_string": "from_journald:true AND syslog_facility:<4 AND (systemd_unit:elasticsearch.service OR systemd_unit:kibana.service OR systemd_unit:graylog.service)"
|
||||
},
|
||||
"streams": [],
|
||||
"config": {
|
||||
"visualization": "line",
|
||||
"event_annotation": false,
|
||||
"row_pivots": [
|
||||
{
|
||||
"field": "timestamp",
|
||||
"type": "time",
|
||||
"config": {
|
||||
"interval": {
|
||||
"type": "auto",
|
||||
"scaling": null
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"series": [
|
||||
{
|
||||
"config": {
|
||||
"name": null
|
||||
},
|
||||
"function": "count()"
|
||||
}
|
||||
],
|
||||
"rollup": false,
|
||||
"column_pivots": [
|
||||
{
|
||||
"field": "systemd_unit",
|
||||
"type": "values",
|
||||
"config": {
|
||||
"limit": 15
|
||||
}
|
||||
}
|
||||
],
|
||||
"visualization_config": {
|
||||
"interpolation": "spline"
|
||||
},
|
||||
"formatting_settings": null,
|
||||
"sort": []
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "49928524-8949-42e2-b6a6-4f208e2febb5",
|
||||
"type": "aggregation",
|
||||
"filter": null,
|
||||
"timerange": {
|
||||
"type": "relative",
|
||||
"range": 86400
|
||||
},
|
||||
"query": {
|
||||
"type": "elasticsearch",
|
||||
"query_string": "from_journald:true"
|
||||
},
|
||||
"streams": [],
|
||||
"config": {
|
||||
"visualization": "line",
|
||||
"event_annotation": false,
|
||||
"row_pivots": [
|
||||
{
|
||||
"field": "timestamp",
|
||||
"type": "time",
|
||||
"config": {
|
||||
"interval": {
|
||||
"type": "auto",
|
||||
"scaling": null
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"series": [
|
||||
{
|
||||
"config": {
|
||||
"name": null
|
||||
},
|
||||
"function": "count()"
|
||||
}
|
||||
],
|
||||
"rollup": false,
|
||||
"column_pivots": [
|
||||
{
|
||||
"field": "source",
|
||||
"type": "values",
|
||||
"config": {
|
||||
"limit": 15
|
||||
}
|
||||
}
|
||||
],
|
||||
"visualization_config": {
|
||||
"interpolation": "spline"
|
||||
},
|
||||
"formatting_settings": null,
|
||||
"sort": []
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "ac9ffdfc-8f48-4ed8-af3b-62120dc86bfa",
|
||||
"type": "aggregation",
|
||||
"filter": null,
|
||||
"timerange": {
|
||||
"type": "relative",
|
||||
"range": 86400
|
||||
},
|
||||
"query": {
|
||||
"type": "elasticsearch",
|
||||
"query_string": "from_journald:true AND systemd_unit:init.scope AND syslog_priority:4"
|
||||
},
|
||||
"streams": [],
|
||||
"config": {
|
||||
"visualization": "table",
|
||||
"event_annotation": false,
|
||||
"row_pivots": [
|
||||
{
|
||||
"field": "custom_unit",
|
||||
"type": "values",
|
||||
"config": {
|
||||
"limit": 15
|
||||
}
|
||||
}
|
||||
],
|
||||
"series": [
|
||||
{
|
||||
"config": {
|
||||
"name": null
|
||||
},
|
||||
"function": "count()"
|
||||
}
|
||||
],
|
||||
"rollup": true,
|
||||
"column_pivots": [],
|
||||
"visualization_config": null,
|
||||
"formatting_settings": null,
|
||||
"sort": []
|
||||
}
|
||||
}
|
||||
],
|
||||
"widget_mapping": {
|
||||
"c535afa8-b27f-4cec-b117-483df2d439ec": [
|
||||
"fe958d96-6908-4516-848d-9490d810ed3e"
|
||||
],
|
||||
"ac9ffdfc-8f48-4ed8-af3b-62120dc86bfa": [
|
||||
"d480b368-2968-442c-94b9-e1e4e1830db7"
|
||||
],
|
||||
"49928524-8949-42e2-b6a6-4f208e2febb5": [
|
||||
"148df0da-281a-4266-a363-9565c9b851b6"
|
||||
]
|
||||
},
|
||||
"positions": {
|
||||
"ac9ffdfc-8f48-4ed8-af3b-62120dc86bfa": {
|
||||
"col": 1,
|
||||
"row": 6,
|
||||
"height": 6,
|
||||
"width": 4
|
||||
},
|
||||
"c535afa8-b27f-4cec-b117-483df2d439ec": {
|
||||
"col": 5,
|
||||
"row": 6,
|
||||
"height": 3,
|
||||
"width": 8
|
||||
},
|
||||
"49928524-8949-42e2-b6a6-4f208e2febb5": {
|
||||
"col": 5,
|
||||
"row": 9,
|
||||
"height": 3,
|
||||
"width": 8
|
||||
}
|
||||
},
|
||||
"formatting": {
|
||||
"highlighting": []
|
||||
},
|
||||
"display_mode_settings": {
|
||||
"positions": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
"properties": [],
|
||||
"owner": "admin",
|
||||
"title": {
|
||||
"@type": "string",
|
||||
"@value": "Graylog"
|
||||
},
|
||||
"type": "DASHBOARD",
|
||||
"description": {
|
||||
"@type": "string",
|
||||
"@value": ""
|
||||
}
|
||||
},
|
||||
"constraints": [
|
||||
{
|
||||
"type": "server-version",
|
||||
"version": ">=3.3.9+abab7dc"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,47 +0,0 @@
|
|||
with builtins; {
|
||||
|
||||
imports = [ ./provider.nix ./nginx.nix ./journald.nix ];
|
||||
|
||||
# create default index
|
||||
resource.graylog_index_set.default =
|
||||
let
|
||||
maxIndexSize = 200;
|
||||
maxIndexCount = 20;
|
||||
isDefault = true;
|
||||
in
|
||||
{
|
||||
title = "default";
|
||||
description = ''
|
||||
This is the default index set, where everything ends up which is
|
||||
not specifically send to another index.
|
||||
|
||||
Be aware this index can only hold ${
|
||||
toString (maxIndexCount * maxIndexSize)
|
||||
}MB of logs!
|
||||
'';
|
||||
default = isDefault;
|
||||
index_prefix = "graylog";
|
||||
rotation_strategy_class =
|
||||
"org.graylog2.indexer.rotation.strategies.SizeBasedRotationStrategy";
|
||||
retention_strategy_class =
|
||||
"org.graylog2.indexer.retention.strategies.DeletionRetentionStrategy";
|
||||
index_analyzer = "standard";
|
||||
index_optimization_disabled = false;
|
||||
writable = true;
|
||||
shards = 1;
|
||||
replicas = 0;
|
||||
index_optimization_max_num_segments = 1;
|
||||
field_type_refresh_interval = 5000;
|
||||
retention_strategy = toJSON ({
|
||||
max_number_of_indices = maxIndexCount;
|
||||
type =
|
||||
"org.graylog2.indexer.retention.strategies.DeletionRetentionStrategyConfig";
|
||||
});
|
||||
rotation_strategy = toJSON ({
|
||||
#max_docs_per_index = 30000000;
|
||||
max_size = maxIndexSize * 1024 * 1024;
|
||||
type =
|
||||
"org.graylog2.indexer.rotation.strategies.SizeBasedRotationStrategyConfig";
|
||||
});
|
||||
};
|
||||
}
|
|
@ -1,115 +0,0 @@
|
|||
with builtins; {
|
||||
|
||||
imports = [ ./journald/nextcloud.nix ./journald/kibana.nix ];
|
||||
|
||||
resource = {
|
||||
|
||||
graylog_input = {
|
||||
journalbeat = {
|
||||
title = "Journalbeat Logs";
|
||||
# https://javadoc.io/doc/org.graylog2/graylog2-inputs/latest/index.html
|
||||
type = "org.graylog.plugins.beats.Beats2Input";
|
||||
global = true;
|
||||
attributes = toJSON ({
|
||||
bind_address = "0.0.0.0";
|
||||
no_beats_prefix = true;
|
||||
number_worker_threads = 4;
|
||||
port = 5044;
|
||||
recv_buffer_size = 1048576;
|
||||
tcp_keepalive = false;
|
||||
tls_cert_file = "";
|
||||
tls_client_auth = "disabled";
|
||||
tls_client_auth_cert_file = "";
|
||||
tls_enable = false;
|
||||
tls_key_file = "";
|
||||
tls_key_password = "";
|
||||
});
|
||||
};
|
||||
};
|
||||
|
||||
graylog_input_static_fields.journalbeat = {
|
||||
input_id = "\${graylog_input.journalbeat.id}";
|
||||
fields = {
|
||||
from_journald = true;
|
||||
journalbeat = true;
|
||||
};
|
||||
};
|
||||
|
||||
graylog_stream.journald = {
|
||||
title = "journald";
|
||||
description = "journald processing stream";
|
||||
index_set_id = "\${graylog_index_set.default.id}";
|
||||
disabled = false;
|
||||
matching_type = "AND";
|
||||
};
|
||||
|
||||
graylog_stream_rule.journald = {
|
||||
field = "from_journald";
|
||||
value = true;
|
||||
stream_id = "\${graylog_stream.journald.id}";
|
||||
#description = "";
|
||||
type = 1;
|
||||
inverted = false;
|
||||
};
|
||||
|
||||
graylog_pipeline_connection = {
|
||||
journald = {
|
||||
stream_id = "\${graylog_stream.journald.id}";
|
||||
pipeline_ids = [
|
||||
#"\${graylog_pipeline.journald_fix_loglevel.id}"
|
||||
"\${graylog_pipeline.journald_iptable_parse.id}"
|
||||
#"\${graylog_pipeline.journald_loglevel_int_to_str.id}"
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
graylog_pipeline = {
|
||||
journald_iptable_parse.source = ''
|
||||
pipeline "journald : ip table parse"
|
||||
stage 0 match either
|
||||
rule "journald : iptables split"
|
||||
end
|
||||
'';
|
||||
};
|
||||
|
||||
graylog_pipeline_rule = {
|
||||
iptableSplit.source = ''
|
||||
rule "journald : iptables split"
|
||||
when
|
||||
has_field("facility") && $message.facility == "kernel"
|
||||
then
|
||||
let result = regex(
|
||||
"^refused connection:\\s*IN=(.*) OUT=(.*) MAC=(.*) SRC=(.*) DST=(.*) LEN=.* TOS=.* PREC=.* TTL=(.*) ID=(.*) PROTO=(.*) SPT=(.*) DPT=(.*) WINDOW=(.*) RES=.*",
|
||||
to_string($message.message),
|
||||
["in_interface"
|
||||
,"out_interface"
|
||||
,"mac_addr"
|
||||
,"src_addr"
|
||||
,"dst_addr"
|
||||
,"ttl"
|
||||
,"iptables_id"
|
||||
,"protocol"
|
||||
,"src_port"
|
||||
,"dst_port"
|
||||
,"window"]
|
||||
);
|
||||
|
||||
set_field("in_interface" ,result.in_interface);
|
||||
set_field("out_interface" ,result.out_interface);
|
||||
set_field("mac_addr" ,result.mac_addr);
|
||||
set_field("src_addr" ,result.src_addr);
|
||||
set_field("dst_addr" ,result.dst_addr);
|
||||
set_field("ttl" ,result.ttl);
|
||||
set_field("iptables_id" ,result.iptables_id);
|
||||
set_field("protocol" ,result.protocol);
|
||||
set_field("src_port" ,result.src_port);
|
||||
set_field("dst_port" ,result.dst_port);
|
||||
set_field("window" ,result.window);
|
||||
|
||||
end
|
||||
'';
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
}
|
|
@ -1,59 +0,0 @@
|
|||
with builtins; {
|
||||
|
||||
resource = {
|
||||
|
||||
graylog_pipeline_connection = {
|
||||
journald.pipeline_ids = [ "\${graylog_pipeline.kibana.id}" ];
|
||||
};
|
||||
|
||||
graylog_pipeline = {
|
||||
kibana.source = ''
|
||||
pipeline "kibana : parsing"
|
||||
stage 10 match either
|
||||
rule "kibana : parse level 1"
|
||||
stage 11 match either
|
||||
rule "kibana : parse message"
|
||||
end
|
||||
'';
|
||||
};
|
||||
|
||||
graylog_pipeline_rule = {
|
||||
kibanaLevel1.source = ''
|
||||
rule "kibana : parse level 1"
|
||||
when
|
||||
has_field("systemd_unit") && ($message.systemd_unit == "kibana.service")
|
||||
then
|
||||
let parsedJson = parse_json(to_string($message.message));
|
||||
set_fields(to_map(parsedJson),"kibana_");
|
||||
end
|
||||
'';
|
||||
kibanaLevelRequest.source = ''
|
||||
rule "kibana : parse request"
|
||||
when
|
||||
has_field("kibana_req")
|
||||
then
|
||||
let parsedJson = parse_json(to_string($message.kibana_req));
|
||||
set_fields(to_map(parsedJson),"kibana_req_");
|
||||
end
|
||||
'';
|
||||
kibanaLevelResponse.source = ''
|
||||
rule "kibana : parse response"
|
||||
when
|
||||
has_field("kibana_res")
|
||||
then
|
||||
let parsedJson = parse_json(to_string($message.kibana_res));
|
||||
set_fields(to_map(parsedJson),"kibana_res_");
|
||||
end
|
||||
'';
|
||||
kibanaLevelMessage.source = ''
|
||||
rule "kibana : parse message"
|
||||
when
|
||||
has_field("kibana_message")
|
||||
then
|
||||
set_field("message", $message.kibana_message);
|
||||
end
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
}
|
|
@ -1,62 +0,0 @@
|
|||
with builtins; {
|
||||
|
||||
resource = {
|
||||
|
||||
graylog_pipeline_connection = {
|
||||
journald.pipeline_ids = [ "\${graylog_pipeline.nextcloud.id}" ];
|
||||
};
|
||||
|
||||
graylog_pipeline = {
|
||||
nextcloud.source = ''
|
||||
pipeline "nextcloud : parsing"
|
||||
stage 10 match either
|
||||
rule "nextcloud : parse level 1"
|
||||
stage 11 match either
|
||||
rule "nextcloud : parse level 2"
|
||||
stage 12 match either
|
||||
rule "nextcloud : parse level 3"
|
||||
end
|
||||
'';
|
||||
};
|
||||
|
||||
graylog_pipeline_rule = {
|
||||
nextcloudLevel1.source = ''
|
||||
rule "nextcloud : parse level 1"
|
||||
when
|
||||
has_field("systemd_unit") && ($message.systemd_unit == "phpfpm-nextcloud.service" || $message.systemd_unit == "nextcloud-cron.service") && starts_with(to_string($message.message),"{")
|
||||
then
|
||||
let parsedJson = parse_json(to_string($message.message));
|
||||
set_fields(to_map(parsedJson),"nextcloud_");
|
||||
end
|
||||
'';
|
||||
#nextcloudLevel2.source = ''
|
||||
# rule "nextcloud : parse level 2"
|
||||
# when
|
||||
# has_field("nextcloud_message")
|
||||
# then
|
||||
# let parsedJson = parse_json(to_string($message.nextcloud_message));
|
||||
# set_field("message", $message.nextcloud_message);
|
||||
# set_fields(to_map(parsedJson),"nextcloud_message_");
|
||||
# end
|
||||
#'';
|
||||
nextcloudLevel2.source = ''
|
||||
rule "nextcloud : parse level 2"
|
||||
when
|
||||
has_field("nextcloud_message")
|
||||
then
|
||||
set_field("message", $message.nextcloud_message);
|
||||
end
|
||||
'';
|
||||
nextcloudLevel3.source = ''
|
||||
rule "nextcloud : parse level 3"
|
||||
when
|
||||
has_field("nextcloud_message_Message")
|
||||
then
|
||||
remove_field("nextcloud_message");
|
||||
set_field("message", $message.nextcloud_message_Message);
|
||||
end
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
}
|
|
@ -1,311 +0,0 @@
|
|||
/* # use this nginx configuration
|
||||
# to send data to these inputs
|
||||
|
||||
log_format graylog2_json escape=json '{ "timestamp": "$time_iso8601", '
|
||||
'"facility": "nginx", '
|
||||
'"src_addr": "$remote_addr", '
|
||||
'"body_bytes_sent": $body_bytes_sent, '
|
||||
'"request_time": $request_time, '
|
||||
'"response_status": $status, '
|
||||
'"request": "$request", '
|
||||
'"request_method": "$request_method", '
|
||||
'"host": "$host",'
|
||||
'"upstream_cache_status": "$upstream_cache_status",'
|
||||
'"upstream_addr": "$upstream_addr",'
|
||||
'"http_x_forwarded_for": "$http_x_forwarded_for",'
|
||||
'"http_referrer": "$http_referer", '
|
||||
'"http_user_agent": "$http_user_agent" }';
|
||||
|
||||
access_log syslog:server=${access_log_input} graylog2_json;
|
||||
error_log syslog:server=${error_log_input};
|
||||
*/
|
||||
|
||||
with builtins; {
|
||||
|
||||
resource = {
|
||||
|
||||
graylog_input = {
|
||||
|
||||
nginx_access_logs = {
|
||||
title = "nginx access log";
|
||||
# https://javadoc.io/doc/org.graylog2/graylog2-inputs/latest/index.html
|
||||
type = "org.graylog2.inputs.syslog.udp.SyslogUDPInput";
|
||||
global = true;
|
||||
attributes = toJSON ({
|
||||
allow_override_date = true;
|
||||
bind_address = "0.0.0.0";
|
||||
expand_structured_data = false;
|
||||
force_rdns = false;
|
||||
number_worker_threads = 4;
|
||||
port = 12304;
|
||||
recv_buffer_size = 1048576;
|
||||
store_full_message = false;
|
||||
});
|
||||
};
|
||||
|
||||
nginx_error_logs = {
|
||||
title = "nginx error log";
|
||||
# https://javadoc.io/doc/org.graylog2/graylog2-inputs/latest/index.html
|
||||
type = "org.graylog2.inputs.syslog.udp.SyslogUDPInput";
|
||||
global = true;
|
||||
attributes = toJSON ({
|
||||
allow_override_date = true;
|
||||
bind_address = "0.0.0.0";
|
||||
expand_structured_data = false;
|
||||
force_rdns = false;
|
||||
number_worker_threads = 4;
|
||||
port = 12305;
|
||||
recv_buffer_size = 1048576;
|
||||
store_full_message = false;
|
||||
});
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
graylog_extractor = {
|
||||
|
||||
# nginx error
|
||||
nginx_error_timestamp = {
|
||||
input_id = "\${graylog_input.nginx_error_logs.id}";
|
||||
order = 0;
|
||||
title = "Timestamp";
|
||||
type = "regex";
|
||||
extractor_config = toJSON ({
|
||||
regex_value =
|
||||
"^.*:\\s(\\d\\d\\d\\d/\\d\\d/\\d\\d\\s\\d\\d:\\d\\d:\\d\\d)\\s.*$";
|
||||
});
|
||||
target_field = "timestamp";
|
||||
source_field = "message";
|
||||
cursor_strategy = "copy";
|
||||
condition_type = "none";
|
||||
converters = {
|
||||
config = toJSON ({ date_format = "yyyy/MM/dd HH:mm:ss "; });
|
||||
type = "date";
|
||||
};
|
||||
};
|
||||
nginx_error_server = {
|
||||
input_id = "\${graylog_input.nginx_error_logs.id}";
|
||||
type = "regex";
|
||||
source_field = "message";
|
||||
cursor_strategy = "copy";
|
||||
condition_type = "string";
|
||||
condition_value = "server";
|
||||
extractor_config = toJSON ({ regex_value = "server:\\s(.+?)(,|$)"; });
|
||||
order = 1;
|
||||
target_field = "server";
|
||||
title = "server";
|
||||
};
|
||||
nginx_error_remote_addr = {
|
||||
input_id = "\${graylog_input.nginx_error_logs.id}";
|
||||
type = "regex";
|
||||
source_field = "message";
|
||||
cursor_strategy = "copy";
|
||||
condition_type = "string";
|
||||
condition_value = "client";
|
||||
extractor_config = toJSON ({ regex_value = "client:\\s(.+?)(,|$)"; });
|
||||
order = 2;
|
||||
target_field = "remote_addr";
|
||||
title = "remote_addr/client";
|
||||
};
|
||||
nginx_error_host = {
|
||||
input_id = "\${graylog_input.nginx_error_logs.id}";
|
||||
type = "regex";
|
||||
source_field = "message";
|
||||
cursor_strategy = "copy";
|
||||
condition_type = "string";
|
||||
condition_value = "host";
|
||||
extractor_config = toJSON ({ regex_value = ''host:\s"(.+?)"(,|$)''; });
|
||||
order = 3;
|
||||
target_field = "host";
|
||||
title = "host";
|
||||
};
|
||||
nginx_error_request_path = {
|
||||
input_id = "\${graylog_input.nginx_error_logs.id}";
|
||||
type = "regex";
|
||||
source_field = "message";
|
||||
cursor_strategy = "copy";
|
||||
condition_type = "string";
|
||||
condition_value = "request";
|
||||
extractor_config =
|
||||
toJSON ({ regex_value = ''request:\s"(.+?)"(,|$)''; });
|
||||
order = 4;
|
||||
target_field = "request_path";
|
||||
title = "request_path/request";
|
||||
};
|
||||
nginx_error_request_verb = {
|
||||
input_id = "\${graylog_input.nginx_error_logs.id}";
|
||||
type = "regex";
|
||||
source_field = "message";
|
||||
cursor_strategy = "copy";
|
||||
condition_type = "string";
|
||||
condition_value = "request";
|
||||
extractor_config = toJSON ({
|
||||
regex_value = ''
|
||||
request:\s"(GET|HEAD|POST|PUT|DELETE|TRACE|OPTIONS|CONNECT|PATCH).+"(,|$)'';
|
||||
});
|
||||
order = 5;
|
||||
target_field = "request_verb";
|
||||
title = "request_verb";
|
||||
};
|
||||
|
||||
# nginx access
|
||||
nginx_access_json_from_syslog = {
|
||||
input_id = "\${graylog_input.nginx_access_logs.id}";
|
||||
title = "Get JSON from syslog message";
|
||||
type = "regex";
|
||||
cursor_strategy = "copy";
|
||||
condition_type = "none";
|
||||
source_field = "message";
|
||||
target_field = "json";
|
||||
order = 0;
|
||||
extractor_config = toJSON ({ regex_value = "nginx:\\s+(.*)"; });
|
||||
};
|
||||
nginx_access_extract_json = {
|
||||
input_id = "\${graylog_input.nginx_access_logs.id}";
|
||||
title = "Extract JSON fields";
|
||||
order = 1;
|
||||
source_field = "json";
|
||||
type = "json";
|
||||
cursor_strategy = "copy";
|
||||
condition_type = "none";
|
||||
extractor_config = toJSON ({
|
||||
flatten = true;
|
||||
list_separator = ", ";
|
||||
kv_separator = "=";
|
||||
key_prefix = "";
|
||||
key_separator = "_";
|
||||
replace_key_whitespace = false;
|
||||
key_whitespace_replacement = "_";
|
||||
});
|
||||
};
|
||||
nginx_access_empty_json = {
|
||||
input_id = "\${graylog_input.nginx_access_logs.id}";
|
||||
order = 2;
|
||||
title = "Empty JSON field";
|
||||
type = "regex_replace";
|
||||
extractor_config = toJSON ({
|
||||
regex = ".*";
|
||||
replacement = "-";
|
||||
});
|
||||
target_field = "json";
|
||||
source_field = "json";
|
||||
cursor_strategy = "copy";
|
||||
condition_type = "none";
|
||||
};
|
||||
nginx_access_reduce_message = {
|
||||
input_id = "\${graylog_input.nginx_access_logs.id}";
|
||||
order = 3;
|
||||
title = "Reduced message to path";
|
||||
type = "regex_replace";
|
||||
extractor_config = toJSON ({
|
||||
regex = ''.*request": "(.*?)".*'';
|
||||
replacement = "$1";
|
||||
});
|
||||
target_field = "message";
|
||||
source_field = "message";
|
||||
cursor_strategy = "copy";
|
||||
condition_type = "none";
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
graylog_input_static_fields = {
|
||||
|
||||
nginx_access_logs = {
|
||||
input_id = "\${graylog_input.nginx_access_logs.id}";
|
||||
fields = {
|
||||
from_nginx = true;
|
||||
nginx_error = false;
|
||||
nginx_access = true;
|
||||
};
|
||||
};
|
||||
|
||||
nginx_error_logs = {
|
||||
input_id = "\${graylog_input.nginx_error_logs.id}";
|
||||
fields = {
|
||||
from_nginx = true;
|
||||
nginx_error = true;
|
||||
nginx_access = false;
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
graylog_stream = {
|
||||
nginx5xx = {
|
||||
title = "nginx 5xx";
|
||||
description = "all requests answered with a 5xx response";
|
||||
index_set_id = "\${graylog_index_set.default.id}";
|
||||
disabled = false;
|
||||
matching_type = "AND";
|
||||
};
|
||||
nginx4xx = {
|
||||
title = "nginx 4xx";
|
||||
description = "all requests answered with a 4xx response";
|
||||
index_set_id = "\${graylog_index_set.default.id}";
|
||||
disabled = false;
|
||||
matching_type = "AND";
|
||||
};
|
||||
nginx2xx = {
|
||||
title = "nginx 2xx";
|
||||
description = "all requests answered with a 2xx response";
|
||||
index_set_id = "\${graylog_index_set.default.id}";
|
||||
disabled = false;
|
||||
matching_type = "AND";
|
||||
};
|
||||
nginx_access = {
|
||||
title = "nginx access";
|
||||
description = "all requests";
|
||||
index_set_id = "\${graylog_index_set.default.id}";
|
||||
disabled = false;
|
||||
matching_type = "AND";
|
||||
};
|
||||
nginx_error = {
|
||||
title = "nginx error";
|
||||
description = "all errors";
|
||||
index_set_id = "\${graylog_index_set.default.id}";
|
||||
disabled = false;
|
||||
matching_type = "AND";
|
||||
};
|
||||
};
|
||||
|
||||
graylog_stream_rule =
|
||||
let
|
||||
nq_stream_rule = field: value: stream_id: {
|
||||
inherit field value stream_id;
|
||||
type = 1;
|
||||
inverted = true;
|
||||
};
|
||||
eq_stream_rule = field: value: stream_id: {
|
||||
inherit field value stream_id;
|
||||
type = 1;
|
||||
inverted = false;
|
||||
};
|
||||
gt_stream_rule = field: value: stream_id: {
|
||||
inherit field value stream_id;
|
||||
type = 3;
|
||||
inverted = false;
|
||||
};
|
||||
lt_stream_rule = field: value: stream_id: {
|
||||
inherit field value stream_id;
|
||||
type = 4;
|
||||
inverted = false;
|
||||
};
|
||||
between = min: max: stream_id: {
|
||||
"is_nginx_access_${min}_${max}" =
|
||||
(eq_stream_rule "nginx_access" true stream_id);
|
||||
"nginx_above${min}" = (gt_stream_rule "response_status" min stream_id);
|
||||
"nginx_below${max}" = (lt_stream_rule "response_status" max stream_id);
|
||||
};
|
||||
in
|
||||
(between "499" "600" "\${graylog_stream.nginx5xx.id}")
|
||||
// (between "399" "500" "\${graylog_stream.nginx4xx.id}")
|
||||
// (between "199" "300" "\${graylog_stream.nginx2xx.id}") // {
|
||||
is_nginx_access = (eq_stream_rule "nginx_access" true
|
||||
"\${graylog_stream.nginx_access.id}");
|
||||
is_nginx_error =
|
||||
(eq_stream_rule "nginx_error" true "\${graylog_stream.nginx_error.id}");
|
||||
};
|
||||
|
||||
};
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
{
|
||||
terraform.required_providers.graylog = {
|
||||
source = "terraform-provider-graylog/graylog";
|
||||
version = "1.0.4";
|
||||
};
|
||||
|
||||
provider.graylog = {
|
||||
web_endpoint_uri = "http://graylog.workhorse.private/api";
|
||||
api_version = "v3";
|
||||
#auth_name = "GRAYLOG_AUTH_NAME";
|
||||
auth_password = "token";
|
||||
};
|
||||
}
|
|
@ -1,15 +0,0 @@
|
|||
{ pkgs ? import <nixpkgs> { } }:
|
||||
let pass_access_token_path = "development/graylog/access_token";
|
||||
|
||||
in pkgs.mkShell {
|
||||
|
||||
buildInputs = with pkgs; [
|
||||
git-crypt
|
||||
terranix
|
||||
(writers.writeBashBin "terraform" ''
|
||||
export GRAYLOG_AUTH_NAME=`${pkgs.pass}/bin/pass show ${pass_access_token_path}`
|
||||
${pkgs.terraform_0_15}/bin/terraform "$@"
|
||||
'')
|
||||
];
|
||||
|
||||
}
|
Binary file not shown.
|
@ -1,32 +0,0 @@
|
|||
{ config, ... }:
|
||||
let
|
||||
|
||||
get = element: object: "\${ ${object."_ref"}.${element} }";
|
||||
|
||||
getVariable = name: "\${ var.${name} }";
|
||||
|
||||
in
|
||||
{
|
||||
|
||||
hcloud = {
|
||||
enable = true;
|
||||
|
||||
resource.server."tinc_node" = {
|
||||
name = "tinc-node-nurnberg";
|
||||
image = "ubuntu-18.04";
|
||||
server_type = "cx11";
|
||||
backups = false;
|
||||
# datacenter = "nbg1-dc3";
|
||||
location = "nbg1";
|
||||
labels = { system = "nixos"; };
|
||||
};
|
||||
};
|
||||
|
||||
output = {
|
||||
"${config.hcloud.resource.server."tinc_node".name}-ip4_address".value =
|
||||
get "ipv4_address" config.hcloud.resource.server."tinc_node";
|
||||
"${config.hcloud.resource.server."tinc_node".name}-ip6_address".value =
|
||||
get "ipv6_address" config.hcloud.resource.server."tinc_node";
|
||||
};
|
||||
|
||||
}
|
|
@ -1,35 +0,0 @@
|
|||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
|
||||
cfg = config.hcloud.nixserver;
|
||||
|
||||
in
|
||||
{
|
||||
|
||||
options.hcloud.nixserver = {
|
||||
enable = mkEnableOption ''
|
||||
create a nixos server on hetzner.
|
||||
this module will take car of everything needed
|
||||
to be done, to install stuff on it.
|
||||
|
||||
wip
|
||||
'';
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
hcloud.resource = {
|
||||
server."todo" = {
|
||||
name = "todo-module-created-server";
|
||||
image = "ubuntu-18.04";
|
||||
iso = "nixos-graphical-18.09.1195.bf7930d582b-x86_64-linux.iso";
|
||||
server_type = "cx11";
|
||||
location = "nbg1";
|
||||
rescue = "linux64";
|
||||
labels = { system = "nixos"; };
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,36 +0,0 @@
|
|||
{ pkgs ? import <nixpkgs> { } }:
|
||||
let
|
||||
|
||||
#terraform = terraform-current;
|
||||
terraform = pkgs.terraform;
|
||||
terraform-current = pkgs.terraform.overrideAttrs (old: rec {
|
||||
version = "0.11.10";
|
||||
name = "terraform-${version}";
|
||||
src = pkgs.fetchFromGitHub {
|
||||
owner = "hashicorp";
|
||||
repo = "terraform";
|
||||
rev = "v${version}";
|
||||
sha256 = "08mapla89g106bvqr41zfd7l4ki55by6207qlxq9caiha54nx4nb";
|
||||
};
|
||||
});
|
||||
|
||||
in
|
||||
pkgs.mkShell {
|
||||
|
||||
# needed pkgs
|
||||
# -----------
|
||||
buildInputs = with pkgs;
|
||||
[
|
||||
|
||||
(pkgs.writeShellScriptBin "terraform" ''
|
||||
export TF_VAR_hcloud_api_token=`${pkgs.pass}/bin/pass development/hetzner.com/api-token`
|
||||
${terraform}/bin/terraform "$@"
|
||||
'')
|
||||
];
|
||||
|
||||
# run this on start
|
||||
# -----------------
|
||||
shellHook = ''
|
||||
HISTFILE=${toString ./.}/.history
|
||||
'';
|
||||
}
|
Binary file not shown.
2
terranix/space-left/.gitignore
vendored
2
terranix/space-left/.gitignore
vendored
|
@ -1,2 +0,0 @@
|
|||
plops/generated/
|
||||
sshkey*
|
|
@ -1,54 +0,0 @@
|
|||
# NixOS Server Example with plops
|
||||
|
||||
This setup shows:
|
||||
|
||||
- how to use a terranix module
|
||||
- how to use 3rd party provision software after terraform.
|
||||
- how to run terranix and terraform
|
||||
|
||||
Setup containing opinionated modules to deploy
|
||||
[NixOS servers](https://nixos.org/)
|
||||
on
|
||||
[hcloud](https://www.hetzner.com/cloud)
|
||||
using
|
||||
[nixos-infect](https://github.com/elitak/nixos-infect)
|
||||
with my
|
||||
[plops](https://github.com/mrVanDalo/plops)
|
||||
provisioning tool for NixOS,
|
||||
which is an overlay on
|
||||
[krops](https://cgit.krebsco.de/krops/about/).
|
||||
|
||||
After server creation,
|
||||
the initial provisioning uploads the
|
||||
nixos-infect
|
||||
script and applys it.
|
||||
After server creation and initialization
|
||||
terranix/terraform generates
|
||||
files used for the "real" provisioning
|
||||
done by plops.
|
||||
|
||||
Of course instead of plops you can use every provsioning tool you like
|
||||
here (e.g. NixOps, Ansible, ... )
|
||||
|
||||
# How to Run
|
||||
|
||||
## What you need
|
||||
|
||||
- a setup [passwordstore](https://www.passwordstore.org/).
|
||||
- a [hcloud token](https://docs.hetzner.cloud/#overview-getting-started)
|
||||
stored under `development/hetzner.com/api-token`
|
||||
|
||||
## Steps
|
||||
|
||||
- `terraform-prepare`: to create ssh keys.
|
||||
- `terraform-build`: to run terranix and terraform do create server.
|
||||
- `terraform-destroy`: to delete server (don't forget that step, or else it gets costly)
|
||||
- `terraform-cleanup`: to delete ssh keys and terraform data.
|
||||
|
||||
## DNS
|
||||
|
||||
define domains with your nameserver and update `jitsi.nix` and `workadventure.nix`.
|
||||
|
||||
- `meet.${domain}` to given ip4 address
|
||||
- `party.${domain}` to given ip4 address
|
||||
- `*.party.${domain}` to given ip4 address
|
|
@ -1,52 +0,0 @@
|
|||
{ config, lib, pkgs, ... }:
|
||||
let
|
||||
hcloud-modules = pkgs.fetchgit {
|
||||
url = "https://github.com/mrVanDalo/terranix-hcloud.git";
|
||||
rev = "5fa359a482892cd973dcc6ecfc607f4709f24495";
|
||||
sha256 = "0smgmdiklj98y71fmcdjsqjq8l41i66hs8msc7k4m9dpkphqk86p";
|
||||
};
|
||||
in
|
||||
{
|
||||
|
||||
imports = [ "${hcloud-modules}/default.nix" ];
|
||||
|
||||
# configure temporary admin ssh keys
|
||||
users.admins.palo.publicKey = "${lib.fileContents ./sshkey.pub}";
|
||||
|
||||
# configure provisioning private Key to be used when running provisioning on the machines
|
||||
provisioner.privateKeyFile = toString ./sshkey;
|
||||
|
||||
hcloud.nixserver = {
|
||||
host = {
|
||||
enable = true;
|
||||
serverType = "cx31";
|
||||
configurationFile = pkgs.writeText "configuration.nix" ''
|
||||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
environment.systemPackages = [ pkgs.git ];
|
||||
}
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
# todo : put this in the hcloud module
|
||||
resource.hcloud_server.nixserver-host.location = "hel1";
|
||||
|
||||
hcloud.export.nix = toString ./plops/generated/nixos-machines.nix;
|
||||
|
||||
resource.local_file.sshConfig = {
|
||||
filename = "${toString ./plops/generated/ssh-configuration}";
|
||||
content = with lib;
|
||||
let
|
||||
configPart = name: ''
|
||||
Host ''${ hcloud_server.nixserver-${name}.ipv4_address }
|
||||
IdentityFile ${toString ./sshkey}
|
||||
ServerAliveInterval 60
|
||||
ServerAliveCountMax 3
|
||||
'';
|
||||
in
|
||||
concatStringsSep "\n"
|
||||
(map configPart (attrNames config.hcloud.nixserver));
|
||||
};
|
||||
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
{ config, lib, pkgs, ... }: {
|
||||
|
||||
services.nginx.enable = true;
|
||||
services.nginx.virtualHosts.codimd = {
|
||||
enableACME = true;
|
||||
addSSL = true;
|
||||
serverName = "codimd.ingolf-wagner.de";
|
||||
locations."/".extraConfig = ''
|
||||
client_max_body_size 4G;
|
||||
proxy_set_header Host $host;
|
||||
proxy_pass http://localhost:3091;
|
||||
'';
|
||||
};
|
||||
|
||||
services.codimd = {
|
||||
enable = true;
|
||||
configuration = {
|
||||
allowFreeURL = true;
|
||||
db = {
|
||||
dialect = "sqlite";
|
||||
storage = "/var/lib/codimd/db.codimd.sqlite";
|
||||
useCDN = false;
|
||||
};
|
||||
port = 3091;
|
||||
};
|
||||
};
|
||||
|
||||
}
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
{ config, pkgs, lib, ... }: {
|
||||
imports = [
|
||||
#
|
||||
#./codimd.nix
|
||||
./hardware-configuration.nix
|
||||
#/jitsi.nix
|
||||
#./netdata.nix
|
||||
./ssh.nix
|
||||
#./workadventure.nix
|
||||
];
|
||||
|
||||
environment.systemPackages = [ pkgs.git pkgs.ag pkgs.htop ];
|
||||
|
||||
networking.hostName = "space-left";
|
||||
|
||||
security.acme.email = "contact@ingolf-wagner.de";
|
||||
security.acme.acceptTerms = true;
|
||||
|
||||
}
|
|
@ -1,49 +0,0 @@
|
|||
{ config, pkgs, lib, ... }:
|
||||
let domain = "gitlab.space-left.org";
|
||||
in {
|
||||
|
||||
# setup gitlab
|
||||
services.gitlab = {
|
||||
enable = true;
|
||||
host = domain;
|
||||
databasePasswordFile = "path/todo";
|
||||
initialRootPasswordFile = "path/todo";
|
||||
|
||||
secrets = {
|
||||
# Make sure the secret is at least 30 characters and all random,
|
||||
# no regular words or you'll be exposed to dictionary attacks
|
||||
dbFile = "path/todo";
|
||||
|
||||
# openssl genrsa 2048
|
||||
jwsFile = "path/todo";
|
||||
|
||||
# Make sure the secret is at least 30 characters and all random,
|
||||
# no regular words or you'll be exposed to dictionary attacks
|
||||
otpFile = "path/todo";
|
||||
|
||||
# Make sure the secret is at least 30 characters and all random,
|
||||
# no regular words or you'll be exposed to dictionary attacks
|
||||
secretFile = "path/todo";
|
||||
};
|
||||
|
||||
# smtp?
|
||||
|
||||
# gitlab-runner?
|
||||
};
|
||||
|
||||
# setup nginx for gitlab
|
||||
services.nginx = {
|
||||
enable = true;
|
||||
recommendedProxySettings = true;
|
||||
|
||||
virtualHosts."${domain}" = {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
locations."/" = {
|
||||
proxyPass = "http://127.0.0.1:${toString config.services.gitlab.port}";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
}
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
{ ... }: {
|
||||
imports = [ <nixpkgs/nixos/modules/profiles/qemu-guest.nix> ];
|
||||
boot.initrd.availableKernelModules =
|
||||
[ "ata_piix" "uhci_hcd" "virtio_pci" "sd_mod" "sr_mod" ];
|
||||
boot.loader.grub.device = "/dev/sda";
|
||||
fileSystems."/" = {
|
||||
device = "/dev/sda1";
|
||||
fsType = "ext4";
|
||||
};
|
||||
}
|
|
@ -1,61 +0,0 @@
|
|||
{
|
||||
# + +
|
||||
# | |
|
||||
# | |
|
||||
# v v
|
||||
# 80, 443 TCP 443 TCP, 10000 UDP
|
||||
# +--------------+ +---------------------+
|
||||
# | nginx | 5222, 5347 TCP | |
|
||||
# | jitsi-meet |<-------------------+| jitsi-videobridge |
|
||||
# | prosody | | | |
|
||||
# | jicofo | | +---------------------+
|
||||
# +--------------+ |
|
||||
# | +---------------------+
|
||||
# | | |
|
||||
# +----------+| jitsi-videobridge |
|
||||
# | | |
|
||||
# | +---------------------+
|
||||
# |
|
||||
# | +---------------------+
|
||||
# | | |
|
||||
# +----------+| jitsi-videobridge |
|
||||
# | |
|
||||
# +---------------------+
|
||||
|
||||
# This is a one server setup
|
||||
services.jitsi-meet = {
|
||||
enable = true;
|
||||
hostName = "meet.ingolf-wagner.de";
|
||||
|
||||
# JItsi COnference FOcus is a server side focus component used in Jitsi Meet conferences.
|
||||
# https://github.com/jitsi/jicofo
|
||||
jicofo.enable = true;
|
||||
|
||||
# Whether to enable nginx virtual host that will serve the javascript application and act as a proxy for the XMPP server.
|
||||
# Further nginx configuration can be done by adapting services.nginx.virtualHosts.<hostName>. When this is enabled, ACME
|
||||
# will be used to retrieve a TLS certificate by default. To disable this, set the
|
||||
# services.nginx.virtualHosts.<hostName>.enableACME to false and if appropriate do the same for
|
||||
# services.nginx.virtualHosts.<hostName>.forceSSL.
|
||||
nginx.enable = true;
|
||||
|
||||
# https://github.com/jitsi/jitsi-meet/blob/master/config.js
|
||||
config = {
|
||||
enableWelcomePage = false;
|
||||
defaultLang = "en";
|
||||
|
||||
};
|
||||
|
||||
# https://github.com/jitsi/jitsi-meet/blob/master/interface_config.js
|
||||
interfaceConfig = {
|
||||
SHOW_JITSI_WATERMARK = false;
|
||||
SHOW_WATERMARK_FOR_GUESTS = false;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
networking.firewall = {
|
||||
allowedTCPPorts = [ 80 443 ];
|
||||
allowedUDPPorts = [ 10000 ];
|
||||
};
|
||||
|
||||
}
|
|
@ -1,15 +0,0 @@
|
|||
{
|
||||
services.netdata = {
|
||||
enable = true;
|
||||
config = {
|
||||
#"exporting:global" = { "enabled" = "yes"; };
|
||||
global = {
|
||||
"memory mode" = "dbengine";
|
||||
"dbengine disk space" = 1024 * 10; # in MB
|
||||
"debug log" = "none";
|
||||
"access log" = "none";
|
||||
"error log" = "syslog";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,14 +0,0 @@
|
|||
{
|
||||
# ssh configuration
|
||||
# -----------------
|
||||
services.sshd.enable = true;
|
||||
services.openssh.passwordAuthentication = false;
|
||||
services.openssh.banner = ''
|
||||
[ Space Left Server ]
|
||||
'';
|
||||
|
||||
# the public ssh key used at deployment
|
||||
users.users.root.openssh.authorizedKeys.keys = [
|
||||
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC6uza62+Go9sBFs3XZE2OkugBv9PJ7Yv8ebCskE5WYPcahMZIKkQw+zkGI8EGzOPJhQEv2xk+XBf2VOzj0Fto4nh8X5+Llb1nM+YxQPk1SVlwbNAlhh24L1w2vKtBtMy277MF4EP+caGceYP6gki5+DzlPUSdFSAEFFWgN1WPkiyUii15Xi3QuCMR8F18dbwVUYbT11vwNhdiAXWphrQG+yPguALBGR+21JM6fffOln3BhoDUp2poVc5Qe2EBuUbRUV3/fOU4HwWVKZ7KCFvLZBSVFutXCj5HuNWJ5T3RuuxJSmY5lYuFZx9gD+n+DAEJt30iXWcaJlmUqQB5awcB1S2d9pJ141V4vjiCMKUJHIdspFrI23rFNYD9k2ZXDA8VOnQE33BzmgF9xOVh6qr4G0oEpsNqJoKybVTUeSyl4+ifzdQANouvySgLJV/pcqaxX1srSDIUlcM2vDMWAs3ryCa0aAlmAVZIHgRhh6wa+IXW8gIYt+5biPWUuihJ4zGBEwkyVXXf2xsecMWCAGPWPDL0/fBfY9krNfC5M2sqxey2ShFIq+R/wMdaI7yVjUCF2QIUNiIdFbJL6bDrDyHnEXJJN+rAo23jUoTZZRv7Jq3DB/A5H7a73VCcblZyUmwMSlpg3wos7pdw5Ctta3zQPoxoAKGS1uZ+yTeZbPMmdbw=="
|
||||
];
|
||||
}
|
|
@ -1,166 +0,0 @@
|
|||
{ config, pkgs, lib, ... }:
|
||||
let
|
||||
# If your Jitsi environment has authentication set up,
|
||||
# you MUST set JITSI_PRIVATE_MODE to "true" and
|
||||
# you MUST pass a SECRET_JITSI_KEY to generate the JWT secret
|
||||
jitsiPrivateMode = "false";
|
||||
|
||||
secretJitsiKey = "";
|
||||
|
||||
jitsiISS = "";
|
||||
|
||||
workadventureSecretKey = "YXNkZnNkZmxranNhZGxma2phc2RsZmtqYXNsa2Zkago=";
|
||||
|
||||
jitsiURL = "meet.ingolf-wagner.de";
|
||||
|
||||
domain = "party.ingolf-wagner.de";
|
||||
# domain will redirect to this map. (not play.${domain})
|
||||
defaultMap = "mrvandalo.github.io/workadventure-worlds/main.json";
|
||||
|
||||
apiURL = "api.${domain}";
|
||||
apiPort = 9002;
|
||||
|
||||
frontURL = "play.${domain}";
|
||||
frontPort = 9004;
|
||||
|
||||
pusherURL = "push.${domain}";
|
||||
pusherPort = 9005;
|
||||
|
||||
uploaderURL = "upload.${domain}";
|
||||
uploaderPort = 9006;
|
||||
|
||||
frontImage = "thecodingmachine/workadventure-front:develop";
|
||||
pusherImage = "thecodingmachine/workadventure-pusher:develop";
|
||||
apiImage = "thecodingmachine/workadventure-back:develop";
|
||||
uploaderImage = "thecodingmachine/workadventure-uploader:develop";
|
||||
|
||||
in
|
||||
{
|
||||
|
||||
virtualisation.docker.enable = true;
|
||||
boot.kernel.sysctl."net.ipv4.ip_forward" = true;
|
||||
|
||||
networking.firewall = {
|
||||
allowedTCPPorts = [ 80 443 ];
|
||||
allowedUDPPorts = [ 80 443 ];
|
||||
};
|
||||
|
||||
services.nginx.enable = true;
|
||||
services.nginx.recommendedProxySettings = true;
|
||||
|
||||
systemd.services.workadventure-network = {
|
||||
enable = true;
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
script = ''
|
||||
${pkgs.docker}/bin/docker network create --driver bridge workadventure ||:
|
||||
'';
|
||||
after = [ "docker" ];
|
||||
before = [
|
||||
"docker-workadventure-back.service"
|
||||
"docker-workadventure-pusher.service"
|
||||
"docker-workadventure-uploader.service"
|
||||
"docker-workadventure-website.service"
|
||||
];
|
||||
};
|
||||
|
||||
virtualisation.oci-containers.backend = "docker";
|
||||
|
||||
services.nginx.virtualHosts."${domain}" = {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
locations."/" = {
|
||||
return = "302 $scheme://play.${domain}/_/global/${defaultMap}";
|
||||
};
|
||||
};
|
||||
|
||||
virtualisation.oci-containers.containers.workadventure-front = {
|
||||
image = frontImage;
|
||||
environment = {
|
||||
API_URL = pusherURL;
|
||||
JITSI_PRIVATE_MODE = jitsiPrivateMode;
|
||||
JITSI_URL = jitsiURL;
|
||||
SECRET_JITSI_KEY = secretJitsiKey;
|
||||
UPLOADER_URL = uploaderURL;
|
||||
};
|
||||
ports = [ "127.0.0.1:${toString frontPort}:80" ];
|
||||
extraOptions = [ "--network=workadventure" ];
|
||||
};
|
||||
services.nginx.virtualHosts."${frontURL}" = {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
locations."/" = { proxyPass = "http://127.0.0.1:${toString frontPort}"; };
|
||||
};
|
||||
|
||||
virtualisation.oci-containers.containers.workadventure-pusher = {
|
||||
image = pusherImage;
|
||||
environment = {
|
||||
API_URL = "workadventure-back:50051";
|
||||
JITSI_ISS = jitsiISS;
|
||||
JITSI_URL = jitsiURL;
|
||||
SECRET_KEY = workadventureSecretKey;
|
||||
};
|
||||
ports = [ "127.0.0.1:${toString pusherPort}:8080" ];
|
||||
extraOptions = [ "--network=workadventure" ];
|
||||
};
|
||||
services.nginx.virtualHosts."${pusherURL}" = {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
locations."/" = {
|
||||
proxyPass = "http://127.0.0.1:${toString pusherPort}";
|
||||
proxyWebsockets = true;
|
||||
};
|
||||
locations."/room" = {
|
||||
proxyPass = "http://127.0.0.1:${toString pusherPort}";
|
||||
proxyWebsockets = true;
|
||||
};
|
||||
};
|
||||
|
||||
virtualisation.oci-containers.containers.workadventure-back = {
|
||||
image = apiImage;
|
||||
environment = {
|
||||
#DEBUG = "*";
|
||||
JITSI_ISS = jitsiISS;
|
||||
JITSI_URL = jitsiURL;
|
||||
SECRET_KEY = workadventureSecretKey;
|
||||
};
|
||||
ports = [ "127.0.0.1:${toString apiPort}:8080" "50051" ];
|
||||
extraOptions = [ "--network=workadventure" ];
|
||||
};
|
||||
services.nginx.virtualHosts."${apiURL}" = {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
locations."/" = { proxyPass = "http://127.0.0.1:${toString apiPort}"; };
|
||||
};
|
||||
|
||||
virtualisation.oci-containers.containers.workadventure-uploader = {
|
||||
image = uploaderImage;
|
||||
ports = [ "127.0.0.1:${toString uploaderPort}:8080" ];
|
||||
extraOptions = [ "--network=workadventure" ];
|
||||
};
|
||||
services.nginx.virtualHosts."${uploaderURL}" = {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
locations."/" = {
|
||||
proxyPass = "http://127.0.0.1:${toString uploaderPort}";
|
||||
proxyWebsockets = true;
|
||||
};
|
||||
};
|
||||
|
||||
systemd.services.docker-workadventure-front.serviceConfig = {
|
||||
StandardOutput = lib.mkForce "journal";
|
||||
StandardError = lib.mkForce "journal";
|
||||
};
|
||||
systemd.services.docker-workadventure-uploader.serviceConfig = {
|
||||
StandardOutput = lib.mkForce "journal";
|
||||
StandardError = lib.mkForce "journal";
|
||||
};
|
||||
systemd.services.docker-workadventure-pusher.serviceConfig = {
|
||||
StandardOutput = lib.mkForce "journal";
|
||||
StandardError = lib.mkForce "journal";
|
||||
};
|
||||
systemd.services.docker-workadventure-back.serviceConfig = {
|
||||
StandardOutput = lib.mkForce "journal";
|
||||
StandardError = lib.mkForce "journal";
|
||||
};
|
||||
|
||||
}
|
|
@ -1,74 +0,0 @@
|
|||
let
|
||||
|
||||
# import plops with pkgs and lib
|
||||
opsImport = import ((import <nixpkgs> { }).fetchgit {
|
||||
url = "https://github.com/mrVanDalo/plops.git";
|
||||
rev = "9fabba016a3553ae6e13d5d17d279c4de2eb00ad";
|
||||
sha256 = "193pajq1gcd9jyd12nii06q1sf49xdhbjbfqk3lcq83s0miqfs63";
|
||||
});
|
||||
|
||||
ops =
|
||||
let
|
||||
overlay = self: super: {
|
||||
# overwrite ssh to use the generated ssh configuration
|
||||
openssh = super.writeShellScriptBin "ssh" ''
|
||||
${super.openssh}/bin/ssh -F ${
|
||||
toString ./generated/ssh-configuration
|
||||
} "$@"
|
||||
'';
|
||||
};
|
||||
in
|
||||
opsImport { overlays = [ overlay ]; };
|
||||
|
||||
lib = ops.lib;
|
||||
pkgs = ops.pkgs;
|
||||
|
||||
# define all sources
|
||||
source = {
|
||||
|
||||
# nixpkgs (no need for channels anymore)
|
||||
nixPkgs.nixpkgs.git = {
|
||||
ref = "nixos-20.09";
|
||||
url = "https://github.com/NixOS/nixpkgs";
|
||||
};
|
||||
|
||||
# system configurations
|
||||
system = name: {
|
||||
configs.file = toString ./configs;
|
||||
nixos-config.symlink = "configs/${name}/configuration.nix";
|
||||
};
|
||||
|
||||
# secrets which are hold and stored by pass
|
||||
secrets = name: {
|
||||
secrets.pass = {
|
||||
dir = toString ./secrets;
|
||||
name = name;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
servers = import ./generated/nixos-machines.nix;
|
||||
|
||||
deployServer = name:
|
||||
{ user ? "root", host, ... }:
|
||||
with ops;
|
||||
jobs "deploy-${name}" "${user}@${host.ipv4}" [
|
||||
# deploy secrets to /run/plops-secrets/secrets
|
||||
# (populateTmpfs (source.secrets name))
|
||||
# deploy system to /var/src/system
|
||||
(populate (source.system name))
|
||||
# deploy nixpkgs to /var/src/nixpkgs
|
||||
(populate source.nixPkgs)
|
||||
switch
|
||||
];
|
||||
|
||||
in
|
||||
pkgs.mkShell {
|
||||
|
||||
buildInputs = lib.mapAttrsToList deployServer servers;
|
||||
|
||||
shellHook = ''
|
||||
export PASSWORD_STORE_DIR=./secrets
|
||||
'';
|
||||
|
||||
}
|
|
@ -1,49 +0,0 @@
|
|||
{ pkgs ? import <nixpkgs> { } }:
|
||||
let
|
||||
|
||||
#terranix = pkgs.callPackage (pkgs.fetchgit {
|
||||
# url = "https://github.com/mrVanDalo/terranix.git";
|
||||
# rev = "2.3.0";
|
||||
# sha256 = "030067h3gjc02llaa7rx5iml0ikvw6szadm0nrss2sqzshsfimm4";
|
||||
#}) { };
|
||||
terranix = pkgs.terranix;
|
||||
|
||||
terraform = pkgs.writers.writeBashBin "terraform" ''
|
||||
export TF_VAR_hcloud_api_token=`${pkgs.pass}/bin/pass development/hetzner.com/api-token`
|
||||
${pkgs.terraform_0_12}/bin/terraform "$@"
|
||||
'';
|
||||
|
||||
in
|
||||
pkgs.mkShell {
|
||||
|
||||
buildInputs = [
|
||||
|
||||
terranix
|
||||
terraform
|
||||
|
||||
(pkgs.writers.writeBashBin "terraform-prepare" ''
|
||||
${pkgs.openssh}/bin/ssh-keygen -P "" -f ${toString ./.}/sshkey
|
||||
'')
|
||||
|
||||
(pkgs.writers.writeBashBin "terraform-build" ''
|
||||
set -e
|
||||
set -o pipefail
|
||||
${terranix}/bin/terranix | ${pkgs.jq}/bin/jq '.' > config.tf.json
|
||||
${terraform}/bin/terraform init
|
||||
${terraform}/bin/terraform apply
|
||||
'')
|
||||
|
||||
(pkgs.writers.writeBashBin "terraform-destroy" ''
|
||||
${terraform}/bin/terraform destroy
|
||||
rm ${toString ./.}/config.tf.json
|
||||
'')
|
||||
|
||||
(pkgs.writers.writeBashBin "terraform-cleanup" ''
|
||||
rm ${toString ./.}/sshkey
|
||||
rm ${toString ./.}/sshkey.pub
|
||||
rm ${toString ./.}/terraform.tfstate*
|
||||
'')
|
||||
|
||||
];
|
||||
}
|
||||
|
Binary file not shown.
10
terranix/tinc-test/.gitignore
vendored
10
terranix/tinc-test/.gitignore
vendored
|
@ -1,10 +0,0 @@
|
|||
.terraform
|
||||
*.tf.json
|
||||
*.swp
|
||||
|
||||
02-build/generated/**
|
||||
!02-build/generated/.keep
|
||||
|
||||
terraform.tfstate
|
||||
terraform.tfstate.backup
|
||||
.terraform.tfstate.lock.info
|
|
@ -1,32 +0,0 @@
|
|||
{ config, lib, pkgs, ... }:
|
||||
let
|
||||
|
||||
#hcloud-modules = pkgs.fetchgit {
|
||||
# #url = "https://github.com/mrVanDalo/terranix-hcloud.git";
|
||||
# url = "https://git.ingolf-wagner.de/terranix/hcloud.git";
|
||||
# rev = "b6896f385f45ecfd66e970663c55635c9fd8b26b";
|
||||
# sha256 = "1bggnbry7is7b7cjl63q6r5wg9pqz0jn8i3nnc4rqixp0ckwdn85";
|
||||
#};
|
||||
|
||||
hcloud-modules = /home/palo/dev/terranix-hcloud/terraform-0.11;
|
||||
|
||||
in
|
||||
{
|
||||
|
||||
imports = [ (toString hcloud-modules) ./config/ssh-setup.nix ];
|
||||
|
||||
hcloud.export.nix = "${toString ../02-build/generated}/nixos-machines.nix";
|
||||
|
||||
hcloud.nixserver.server = {
|
||||
configurationFile = pkgs.writeText "configuration.nix" ''
|
||||
{ pkgs, lib, ... }:
|
||||
{
|
||||
environment.systemPackages = with pkgs; [
|
||||
htop git vim mosh
|
||||
];
|
||||
networking.firewall.allowedUDPPorts = [ 60001 ];
|
||||
}
|
||||
'';
|
||||
};
|
||||
|
||||
}
|
|
@ -1,31 +0,0 @@
|
|||
# --------------------------------------------------------------------------------
|
||||
#
|
||||
# collect all server information and generate files which get picked up
|
||||
# by 02-build to deploy the machines properly.
|
||||
#
|
||||
# This makes it possible to deploy VPNs like tinc and wireguard.
|
||||
#
|
||||
# --------------------------------------------------------------------------------
|
||||
|
||||
{ config, lib, pkgs, ... }: {
|
||||
resource.local_file = {
|
||||
nixosMachines = {
|
||||
content = with lib;
|
||||
let
|
||||
serverPart = name: ''
|
||||
${name} = {
|
||||
host = "''${ hcloud_server.${name}.ipv4_address }";
|
||||
user = "root";
|
||||
};
|
||||
'';
|
||||
allServerParts = map serverPart (attrNames config.hcloud.server);
|
||||
in
|
||||
''
|
||||
{
|
||||
${concatStringsSep "\n" allServerParts}
|
||||
}
|
||||
'';
|
||||
filename = "${toString ../../02-build/generated/nixos-machines.nix}";
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,46 +0,0 @@
|
|||
# --------------------------------------------------------------------------------
|
||||
#
|
||||
# configure ssh setup
|
||||
#
|
||||
# --------------------------------------------------------------------------------
|
||||
|
||||
{ config, lib, pkgs, ... }:
|
||||
let
|
||||
ssh = {
|
||||
privateKeyFile = ../../sshkey;
|
||||
publicKeyFile = ../../sshkey.pub;
|
||||
};
|
||||
target = file: "${toString ../../02-build/generated}/${file}";
|
||||
in
|
||||
{
|
||||
# configure admin ssh keys
|
||||
users.admins.palo.publicKey = lib.fileContents ssh.publicKeyFile;
|
||||
|
||||
# configure provisioning private Key to be used when running provisioning on the machines
|
||||
provisioner.privateKeyFile = toString ssh.privateKeyFile;
|
||||
|
||||
resource.local_file = {
|
||||
|
||||
# provide ssh key for the server
|
||||
sshKey = {
|
||||
content = lib.fileContents ssh.publicKeyFile;
|
||||
filename = target "sshkey.pub";
|
||||
};
|
||||
|
||||
sshConfig = {
|
||||
filename = target "ssh-configuration";
|
||||
content = with lib;
|
||||
let
|
||||
configPart = name: ''
|
||||
Host ''${ hcloud_server.${name}.ipv4_address }
|
||||
IdentityFile ${toString ssh.privateKeyFile}
|
||||
ServerAliveInterval 60
|
||||
ServerAliveCountMax 3
|
||||
'';
|
||||
in
|
||||
concatStringsSep "\n"
|
||||
(map configPart (attrNames config.hcloud.server));
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
{ pkgs ? import <nixpkgs> { } }:
|
||||
|
||||
let
|
||||
|
||||
terranix = pkgs.callPackage
|
||||
(pkgs.fetchgit {
|
||||
url = "https://github.com/mrVanDalo/terranix.git";
|
||||
rev = "6097722f3a94972a92d810f3a707351cd425a4be";
|
||||
sha256 = "1d8w82mvgflmscvq133pz9ynr79cgd5qjggng85byk8axj6fg6jw";
|
||||
})
|
||||
{ };
|
||||
|
||||
terraform = pkgs.writers.writeDashBin "terraform" ''
|
||||
export TF_VAR_hcloud_api_token=`${pkgs.pass}/bin/pass development/hetzner.com/api-token`
|
||||
${pkgs.terraform_0_11}/bin/terraform "$@"
|
||||
'';
|
||||
|
||||
create = pkgs.writers.writeDashBin "create" ''
|
||||
${terranix}/bin/terranix | ${pkgs.jq}/bin/jq '.' > ${
|
||||
toString ./.
|
||||
}/config.tf.json \
|
||||
&& ${terraform}/bin/terraform init \
|
||||
&& ${terraform}/bin/terraform apply
|
||||
'';
|
||||
|
||||
destroy = pkgs.writers.writeBashBin "destroy" ''
|
||||
${terraform}/bin/terraform destroy
|
||||
rm ${toString ./.}/config.tf.json
|
||||
rm ${toString ./.}/terraform.tfstate*
|
||||
'';
|
||||
|
||||
in
|
||||
pkgs.mkShell {
|
||||
|
||||
buildInputs = with pkgs; [ terranix terraform create destroy ];
|
||||
|
||||
}
|
|
@ -1,4 +0,0 @@
|
|||
-----BEGIN ED25519 PRIVATE KEY-----
|
||||
gTFtvOMvD5KTUZeGNcTh5ngY/BktUd0OW/37jT8w+61eLP0ntMkaBB8yovTbJvXR
|
||||
vReDUb/hjIi7nhGgy2EzP6An4QtXWvTHWJSDefglGVlcFqPDbhRkJ8CpWbCGoIYt
|
||||
-----END ED25519 PRIVATE KEY-----
|
|
@ -1,14 +0,0 @@
|
|||
Ed25519PublicKey = OwJOU7l170hVi0g3HYpRVJXh6zwWYEZCvQq1mgBKCWL
|
||||
-----BEGIN RSA PUBLIC KEY-----
|
||||
MIICCgKCAgEAwNR4EbAffxezhbmTIoetrUPPpo66rR9kPJkLCl/fTJbVE1ryjXNQ
|
||||
Cq0lefDURLT4L3Iw/XgBUIy1xpH8InolnYlL2DRadOvbA0nCUzoekwshcV1N6tCe
|
||||
HsxrVP5XSxGJ6Es7L0zzvqXCoYP4tic+N4ztZBknn9RRMY497qHPxLoejqPZndmj
|
||||
9VPciWtiZMhLPka/r0mS/Y7h2t3IQg3J2QCXjQoojTpGym9wPlBXcE2Hv5hYKM8X
|
||||
359/arLKlAi91I2SH1o6+rBoGaMB50goEnDvWqdha95CR9K/I7+eJm8/AiJCxus0
|
||||
2KKCK7K5GvBPifEgMX4AVF8bqgTF9VZi0peG3dUEsg2L/6XqfH6IeFziWfuzuR9k
|
||||
Ud0fzu235ssshMz/WHtTZiwTUc/xzs29PrF8ThieN/nt6tdBS3A0wdqeNfKjoD3k
|
||||
zgqcc+ODUUR4gaq/46W0lU8aiP1w32YmKLnrBmFYjZXHqXNgYOZctoW/SjblvpCK
|
||||
pYUxowFOXA8BU/eRiNZfa+b0ONe0XQOj8Q78st5XsCTlqHLkytdjwauZvM4jVuE9
|
||||
7lhvvr1ft/QO3RdBMXAXgDN0F2eDnzqdRE/rrvqNJCeheS9rmHE6Aa0e5yTcJMMK
|
||||
qCkys4lQn4y9RnfH3MpzRtRnpSKid31WcmCI+JYHLe4ZhFWXju4fKPECAwEAAQ==
|
||||
-----END RSA PUBLIC KEY-----
|
|
@ -1,51 +0,0 @@
|
|||
-----BEGIN RSA PRIVATE KEY-----
|
||||
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
|
||||
-----END RSA PRIVATE KEY-----
|
|
@ -1 +0,0 @@
|
|||
client/host_file
|
|
@ -1 +0,0 @@
|
|||
server/ed25519_key
|
|
@ -1 +0,0 @@
|
|||
server/rsa_key
|
|
@ -1,4 +0,0 @@
|
|||
-----BEGIN ED25519 PRIVATE KEY-----
|
||||
wNkj/HdU70l7X5XC5YVlWp3FBa8cBaDRy1LbJCjkh83CYYieSQ2IUWgHQ4Vhx253
|
||||
7bXVLSOnVIKMifAnBwSOSX7lTGI6gUP2aZCwa142WdxPDPiYv3sEMqK037VyfHVl
|
||||
-----END ED25519 PRIVATE KEY-----
|
|
@ -1,14 +0,0 @@
|
|||
Ed25519PublicKey = 1e5kBiOI1jtWmAsWNutVX8zwjI27NLBjqC99el83RVJ
|
||||
-----BEGIN RSA PUBLIC KEY-----
|
||||
MIICCgKCAgEA1qFa0YFVefm3kVXGG5j26TF4JNJtBpZo1Jtd9XB6cErMG80vrdvb
|
||||
RWNwCoY8SM21zN5ew9p7W/P8aClZShx7WRyIzPsTnc69N7zIosAIeXURgo8Ot2Yd
|
||||
1us5RquPxc6NZ0JhDkz50EgQiJ4fRaCmaBb68hP36U8XdO7VTn93+l0YlmvbhAny
|
||||
gB7iMOsXiDXxbzxOO+XC3ygaeO45ioEDduEv9Ny9KptXN08eOkxKL7dN4om2Nux0
|
||||
2EurWqTBYTrWki+XxovfvsmiM5AELHtTaUM8FwwEX0e7dV1cDYYqz3hWPmYgZ4Bj
|
||||
dp258VDa/sbUCiRVQfcxzHqbvd3UCoNG76YsGJ6s7TqoxvCCvB4ziH+d6/Uu+h5h
|
||||
DtjccwVQmW22A5DQHix4T/DmXs1GB5qzOa8eEd6cHTpqp/qzGmvC0un5BezY+CVR
|
||||
ZphzFoYGF6Q3T7JwC6LCMCNBOqby+bhZNYmkztRzhXvFFrBmj6E17+8Z5fgLgl6u
|
||||
+1QhxQTjg3uvjZXmQh2+jjTwa3vO1pZR6k9yyLMo9zPpr7i7QY4tqPR8u4j0fkHj
|
||||
aXtOOj2wl0gDCnVX3mWeUKCJusCDdJ2hPpuz11pPQt67mxtUXO31aMM9J3mHjj0y
|
||||
PKl7NGKA7ozI9e4HV09KiozM6yrLrvLyoRTn8AgwVoMiEw91CHhDNRkCAwEAAQ==
|
||||
-----END RSA PUBLIC KEY-----
|
|
@ -1,51 +0,0 @@
|
|||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIJKAIBAAKCAgEA1qFa0YFVefm3kVXGG5j26TF4JNJtBpZo1Jtd9XB6cErMG80v
|
||||
rdvbRWNwCoY8SM21zN5ew9p7W/P8aClZShx7WRyIzPsTnc69N7zIosAIeXURgo8O
|
||||
t2Yd1us5RquPxc6NZ0JhDkz50EgQiJ4fRaCmaBb68hP36U8XdO7VTn93+l0Ylmvb
|
||||
hAnygB7iMOsXiDXxbzxOO+XC3ygaeO45ioEDduEv9Ny9KptXN08eOkxKL7dN4om2
|
||||
Nux02EurWqTBYTrWki+XxovfvsmiM5AELHtTaUM8FwwEX0e7dV1cDYYqz3hWPmYg
|
||||
Z4Bjdp258VDa/sbUCiRVQfcxzHqbvd3UCoNG76YsGJ6s7TqoxvCCvB4ziH+d6/Uu
|
||||
+h5hDtjccwVQmW22A5DQHix4T/DmXs1GB5qzOa8eEd6cHTpqp/qzGmvC0un5BezY
|
||||
+CVRZphzFoYGF6Q3T7JwC6LCMCNBOqby+bhZNYmkztRzhXvFFrBmj6E17+8Z5fgL
|
||||
gl6u+1QhxQTjg3uvjZXmQh2+jjTwa3vO1pZR6k9yyLMo9zPpr7i7QY4tqPR8u4j0
|
||||
fkHjaXtOOj2wl0gDCnVX3mWeUKCJusCDdJ2hPpuz11pPQt67mxtUXO31aMM9J3mH
|
||||
jj0yPKl7NGKA7ozI9e4HV09KiozM6yrLrvLyoRTn8AgwVoMiEw91CHhDNRkCAwEA
|
||||
AQKCAgBSwt9ZP+zs3tzo/tEoXSCApSG12SpPSvpbWRmvBdNAr6bq5YEIImn35LMU
|
||||
a9SdIi2DNRAHp5y/xWJD7AXRLRBnOTiLChnzVP/jmTkogLID25+H35AGKitBb2yj
|
||||
ko4a8V3XPmJceFQv+0nc1FQsrhjctFfJtud2oJfj8CByZ3alJPbRMf/wd0F6I+6G
|
||||
fHCThnF1uiRUtnEhSb6DeSDZBoyGb6jlW6TZ5BKKckiupDJLGfy/aOjJXv5jVTJa
|
||||
/oLO8jhBIHb/CXqaf/e6uELTwC5WvaVTIcAh2XAwfnJ7iIvDepyO7SR7pKc12vYT
|
||||
VmFLsvGag44YpLAgL/sUCJC2CQ71rtx79SNHegDkunqI+GZTSL1uuBHMXpSA75xm
|
||||
t6m6hcn3E0rL6wSZ+mgpyL1+AULWOSbU4XybsXjORzTsJfn91s7k5dyySQSRDy30
|
||||
z10fQzLPJI8kSmGtzUFpDMvOYpfmq5p0aMI58fvTqLgNc1wnJrj2SKfEQI0MnhKU
|
||||
BESIh63yjPQuPkeqpO1zf8OgmvZ/PU7Egbb8YAHzC11KBh2zKem6zL0Q/bLBcur1
|
||||
bcKT0VRq/5jpwLG1dpXf7KovatTjg44cjb+LFP6YnBhM1pc620Hc4G+TPJs3y56c
|
||||
OdmX6UCCvl1c4pZJ4Mmg7I1LvZcPFIYFFOTmLLixfWWH4n7vrQKCAQEA+PjO4I8Z
|
||||
RMMui1cpfoj3go4y/IY3bWF2Dgg6QgddagXxdFMVtFKD0LMlpbt3MUmGOjj7zepG
|
||||
1zeRnvgkAk6ZX/nibMkDWnyVMoews1WJC3YpOZdavjzJ2j3517rvomhSQWzbyOAt
|
||||
T1oR9dz2EYEFchYgJ+N5pmCvrhQd1nENpT9usxiVT+ecTE8sObJqY6a1otK969yO
|
||||
urIckDx8SqKY6V5iuTjcsdrSfzIlFKKZ5S9XPqg98lqWekYA9R5WMzolQGFVoDMI
|
||||
343HdE/oEExBR7X39E+D2YGwoepw6lVBHkmFd1px5Oc5kysAbvB1QiSoU1Oi85mN
|
||||
uBmrzxmYkQ/d7wKCAQEA3LBgoWzoez81rDh+i9vXweI7vKHy1htJnRPgYuxWtlvu
|
||||
RzgGK/FvOMOthVqpOR0fO1g+7/LupgNjBgGys+jTOeZiKwYEWuy0RCpjKmhc6j2y
|
||||
jwdXjzHf0Ve3MFF23qhaXhQHEgg9W1VQJwt8xv28mY96YznYB/JC0vLG2ZdQ5ASJ
|
||||
JHrrZNIk3h+32yBRq8312+cWRXmg27MSSfOrRAMSeoV0c7YvDakce9ZNaok/gbi9
|
||||
hA+yqxZc0SrkOXLA0plHzyzH492sonsdLjIQNApJv36NqD6ZHzcPy2iHK3ymhj+z
|
||||
QM/kt5QHFbK3OFBJbyHxtbSpMfJMvh5AgzyJhaildwKCAQAHe+MsGOEXkg5qHdqf
|
||||
dRqLkB60PIyZ+x4DWff2WCZUs40IhB7Y5soTke8FxlbU4nLoeSIIlIxAl+kGsErU
|
||||
zuwJWIeX4Yr6Q1hwxmdnXKDb+VdP5d7SbR1cNBS4iWP+q8gdM1p/9U0nX3u+uj+j
|
||||
Uw+I2GVrDYlwmONvBifHdGqGlxuKwqhqWHn4SUD5EwXjrPU0ycTvvBeGQShepZLO
|
||||
44hZK38oNi9cIUnGjQlUT3b0zrF+rqv+Bv8S+du5gonwzESmZMagJCiWH7rpIiXF
|
||||
p6UmtK+ZZnJ+LUnT9CokwR9N+8PJTKyzxseSRu6iZxP/Qv7UUmVJkUoTSKJDfW96
|
||||
nNF9AoIBAAOnU+I4SF0J/dx9DvNHz3mhQjXsRHXw+7YDBzr8CK96NCavscJ2e83n
|
||||
x26mwph0d/jmjBwy3GqZMcF+s7OwzhZuTv/BWL8cnhtmzD9+fNNP9C3UBEoVnEv9
|
||||
9MVzA9HJ3b0i/b75rfJeJjaPRSCSQNYV/wO3iHERPLP7WvltPOSZgp+8/TqtE/kt
|
||||
c0DIdzGt9j0OxVqfGd+pRks9In+8wUiP/w6PXJYQT61pLdzuqsN+CH0wOVgFxcGc
|
||||
wSyGTtTtvreaWTDXka0a9q+2GniSFwh5kuTPLH/MzJEkiOBabvNYCKKxDmtPoxJj
|
||||
5A6lnaGeYT8N36M5DLY1EAJcNTamRR8CggEBAPgc5Wr2YM9rmAB/15H+xk8H/tsI
|
||||
1hxgGtfdHdo9ZwIyowakuqQaIjbgFX64bE9cX9C62mJ12rP6YoTAz5zRBm4J1Eld
|
||||
U2PlnCwLJbtrdF83tTSi8n9Yo/y3wMFB0C+z2apEqOkLTUaz3REM+1N8CWVKMtaW
|
||||
CtEqfx2sIbwy/Y3i8kSyR8mZPiMlpGULLBPvcKSgZZnUzzo5gZh2mP9zwb0q669K
|
||||
71k3LzM8EY/1by8xrhhg5Iyanoeq2PwecUR4XD8pvpYRdUk+bERUSPyJenWa1JQ/
|
||||
df25AfKqmpoVp+LeICbZf4vNLxR1rs44fXPkMpu4SoQkSLuNYkoqpOngjjY=
|
||||
-----END RSA PRIVATE KEY-----
|
|
@ -1 +0,0 @@
|
|||
server/host_file
|
|
@ -1,19 +0,0 @@
|
|||
{ pkgs, lib, ... }: {
|
||||
imports = [ ./hardware-configuration.nix ./tinc-server.nix ];
|
||||
|
||||
networking.hostName = "server";
|
||||
|
||||
# ssh
|
||||
environment.systemPackages = with pkgs; [ htop git vim mosh tmux ];
|
||||
networking.firewall.allowedUDPPortRanges = [{
|
||||
from = 60000;
|
||||
to = 60100;
|
||||
}];
|
||||
services.sshd.enable = true;
|
||||
users.users.root.openssh.authorizedKeys.keyFiles =
|
||||
[ <test-generated/sshkey.pub> ];
|
||||
|
||||
# wireshark
|
||||
programs.wireshark.enable = true;
|
||||
|
||||
}
|
|
@ -1,8 +0,0 @@
|
|||
{ ... }: {
|
||||
imports = [ <nixpkgs/nixos/modules/profiles/qemu-guest.nix> ];
|
||||
boot.loader.grub.device = "/dev/sda";
|
||||
fileSystems."/" = {
|
||||
device = "/dev/sda1";
|
||||
fsType = "ext4";
|
||||
};
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
{
|
||||
imports = [ ./tinc.nix ];
|
||||
|
||||
module.cluster.services.tinc = {
|
||||
"test" = {
|
||||
debugLevel = 5;
|
||||
enable = true;
|
||||
openPort = true;
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,33 +0,0 @@
|
|||
# shared tinc file between client and server
|
||||
{ config, pkgs, lib, ... }:
|
||||
let nixosMachines = import <test-generated/nixos-machines.nix>;
|
||||
in {
|
||||
|
||||
imports = [ <cluster-module> ];
|
||||
|
||||
networking.firewall.trustedInterfaces = [ "tinc.private" ];
|
||||
|
||||
# nix-shell -p tinc_pre --run "tinc --config . generate-keys 4096"
|
||||
module.cluster.services.tinc = {
|
||||
"test" = {
|
||||
networkSubnet = "10.123.142.0/24";
|
||||
extraConfig = ''
|
||||
LocalDiscovery = yes
|
||||
'';
|
||||
privateEd25519KeyFile = toString <test-assets/tinc/ed25519_key>;
|
||||
privateRsaKeyFile = toString <test-assets/tinc/rsa_key>;
|
||||
hosts = {
|
||||
server = {
|
||||
tincIp = "10.123.142.1";
|
||||
realAddress = [ nixosMachines.nixserver-server.host.ipv4 ];
|
||||
publicKey = lib.fileContents <test-assets/tinc/server_host_file>;
|
||||
};
|
||||
sterni = {
|
||||
tincIp = "10.123.142.100";
|
||||
publicKey = lib.fileContents <test-assets/tinc/server_host_file>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
@ -1,76 +0,0 @@
|
|||
{ pkgs ? import <nixpkgs> { } }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
let
|
||||
|
||||
ops =
|
||||
let
|
||||
opsImport = import ((import <nixpkgs> { }).fetchgit {
|
||||
url = "https://github.com/mrVanDalo/plops.git";
|
||||
rev = "9fabba016a3553ae6e13d5d17d279c4de2eb00ad";
|
||||
sha256 = "193pajq1gcd9jyd12nii06q1sf49xdhbjbfqk3lcq83s0miqfs63";
|
||||
});
|
||||
overlay = self: super: {
|
||||
# overwrite ssh to use the generated ssh configuration
|
||||
openssh = super.writers.writeBashBin "ssh" ''
|
||||
${super.openssh}/bin/ssh -F ${
|
||||
toString ./generated/ssh-configuration
|
||||
} "$@"
|
||||
'';
|
||||
};
|
||||
in
|
||||
opsImport { overlays = [ overlay ]; };
|
||||
|
||||
lib = ops.lib;
|
||||
pkgs = ops.pkgs;
|
||||
|
||||
source = {
|
||||
|
||||
nixPkgs.nixpkgs.git = {
|
||||
ref = "nixos-19.09";
|
||||
url = "https://github.com/NixOS/nixpkgs-channels";
|
||||
};
|
||||
|
||||
system = name: {
|
||||
configs.file = toString ./configs;
|
||||
test-assets.file = toString ./assets;
|
||||
test-generated.file = toString ./generated;
|
||||
nixos-config.symlink = "configs/${name}/configuration.nix";
|
||||
};
|
||||
|
||||
modules.cluster-module.git = {
|
||||
url = "https://git.ingolf-wagner.de/nix-modules/cluster.git";
|
||||
ref = "1.2.0";
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
servers = import ./generated/nixos-machines.nix;
|
||||
|
||||
deployServer = name:
|
||||
{ user ? "root", host, ... }:
|
||||
with ops;
|
||||
jobs "deploy-${name}" "${user}@${host.ipv4}" [
|
||||
(populate (source.system name))
|
||||
(populate source.nixPkgs)
|
||||
(populate source.modules)
|
||||
switch
|
||||
];
|
||||
|
||||
moshServer = name:
|
||||
{ user ? "root", host, ... }:
|
||||
pkgs.writers.writeDashBin "mosh-${name}" ''
|
||||
${pkgs.mosh}/bin/mosh \
|
||||
--ssh="${pkgs.openssh}/bin/ssh -F ${
|
||||
toString ./generated/ssh-configuration
|
||||
}" \
|
||||
"${user}@${host.ipv4}"
|
||||
'';
|
||||
|
||||
in
|
||||
pkgs.mkShell {
|
||||
buildInputs = lib.mapAttrsToList deployServer servers
|
||||
++ mapAttrsToList moshServer servers;
|
||||
|
||||
}
|
|
@ -1,73 +0,0 @@
|
|||
A setup to test tinc on a hetzner box
|
||||
|
||||
# steps
|
||||
|
||||
## OPTIONAL: generate fresh ssh keys
|
||||
|
||||
```sh
|
||||
ssh-keygen -P "" -f sshkey
|
||||
```
|
||||
|
||||
## OPTIONAL: generate new tinc keys
|
||||
|
||||
```
|
||||
nix-shell -p tinc_pre --run "tinc --config . generate-keys 4096"
|
||||
cat *.pub host_file
|
||||
rm *.pub
|
||||
```
|
||||
|
||||
## generate machine
|
||||
|
||||
```sh
|
||||
cd ./01-terranix
|
||||
nix-shell --run "create"
|
||||
```
|
||||
|
||||
## provision machine
|
||||
|
||||
```sh
|
||||
cd ./02-build
|
||||
nix-shell --run deploy-server
|
||||
```
|
||||
|
||||
## tracking and collecting
|
||||
|
||||
```
|
||||
dumpcap \
|
||||
-i ens3 \
|
||||
-w /root/hardware-device_working.dcap
|
||||
dumpcap \
|
||||
-i tinc.test \
|
||||
-w /root/tinc-device_working.dcap
|
||||
```
|
||||
|
||||
and for the not working experiment
|
||||
|
||||
```
|
||||
dumpcap \
|
||||
-i ens3 \
|
||||
-w /root/hardware-device_not-working.dcap
|
||||
dumpcap \
|
||||
-i tinc.test \
|
||||
-w /root/tinc-device_not-working.dcap
|
||||
```
|
||||
|
||||
logs
|
||||
|
||||
```
|
||||
systemctl --from "2020-01-04 15:00" --until "2020-01-04 16:00" -o json > working-logs.json
|
||||
systemctl --from "2020-01-04 17:00" --until "2020-01-04 18:00" -o json > nog-working-logs.json
|
||||
```
|
||||
|
||||
and setup
|
||||
|
||||
```
|
||||
tar cvzf etc.tgz /etc/tinc
|
||||
```
|
||||
|
||||
## cleanup
|
||||
|
||||
```sh
|
||||
cd ./01-terranix
|
||||
nix-shell --run "clean"
|
||||
```
|
|
@ -1,27 +0,0 @@
|
|||
-----BEGIN OPENSSH PRIVATE KEY-----
|
||||
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn
|
||||
NhAAAAAwEAAQAAAQEAqD70wK7MGSV6uBaP/IWxgr/eWm/LXsVu0rLOF8/VQdcPZgVw8eo6
|
||||
ZyDnfJpSvaYMknP9JlaiawMTpwrON8A5y8i2prQDhdO8Uz1pK+VXfZgY6hEOcs1UJmacsV
|
||||
82oyaYAHg8gYUsRp8FOYQUCyZPrVlQMJN4F854sCugVr9Zfgc8B3Q+zoLX13jO+QLCTefI
|
||||
BRkKwBDHK3lGrNYyJ6qSTV/gA6LruwglPlK5BQsyB7djoLRgi7eNmJRyFqH7SotY40TzZR
|
||||
w3BF7ssW4DFfqCXw/OtuOKls7+uivQgfUkAKvhGVbFbGRdEzRKTmgMzUNVXILZ5CYoTjEJ
|
||||
FGzrB6APwQAAA8A3cOj/N3Do/wAAAAdzc2gtcnNhAAABAQCoPvTArswZJXq4Fo/8hbGCv9
|
||||
5ab8texW7Sss4Xz9VB1w9mBXDx6jpnIOd8mlK9pgySc/0mVqJrAxOnCs43wDnLyLamtAOF
|
||||
07xTPWkr5Vd9mBjqEQ5yzVQmZpyxXzajJpgAeDyBhSxGnwU5hBQLJk+tWVAwk3gXzniwK6
|
||||
BWv1l+BzwHdD7OgtfXeM75AsJN58gFGQrAEMcreUas1jInqpJNX+ADouu7CCU+UrkFCzIH
|
||||
t2OgtGCLt42YlHIWoftKi1jjRPNlHDcEXuyxbgMV+oJfD86244qWzv66K9CB9SQAq+EZVs
|
||||
VsZF0TNEpOaAzNQ1VcgtnkJihOMQkUbOsHoA/BAAAAAwEAAQAAAQBwNZTNEYeD2fBP6JRd
|
||||
adkrB8ZHcLolWe4AzkoPrYhgogteEpDydzI+Z76b5tz6KU3HO16B/FPUpTetN9KzchvZ4u
|
||||
KWqgaTcdTve0yyfwHr/M3ZBkkpnfHarqMg1Qy+oVXNMmPASk5uR06XvpQTn5iSV7fYvfHh
|
||||
hs4NSPtl/7azCxFK6PnQSKoUz1FSSdV/JT1Iptw5pSASMv6qCPWK04tIpfV9kVnxJMDRuD
|
||||
f8DZqxhruien6YjIKaP2UOvVIj2cog5siELmkRN56naPEXdEKs2heSnQ1NtjexmKkzEJM7
|
||||
vAbZJ1EBT2c4UbmLlCJ/M+3wgjTdDIzjUK7WHVRD1Mh1AAAAgBfcHhwEwStAZ2DUgrOFYE
|
||||
kBUWZzBUmnFIK/HB0SX7CGk7V1I3PhpG8TF2PhC85dcC44i/wYdrEC/R+zA/iOf/94tO3l
|
||||
T0pksYewfk+1uUPWxJtBLzDpYJk/RfskA+K5aLw1UI+4kGdtaoia/Y1qbHmwrBfNUYUZx6
|
||||
NDo7X5teQKAAAAgQDTBDReUialFX046Qq6CXinMpvprgwKNaWgdUfnZ6ihKye3IoLkVqYk
|
||||
IkIJDcDzyPiekJc2Xwi2uFVo//2T02aeisYgkOmFYYNXM4eHQfsEQyt6SqtpvlsoZ6BF7z
|
||||
sB4QQsYnuwxsO6vbQSKItlX5qrodbnldNqjqwU9Eiz6S+5XwAAAIEAzByjPznLIcsYAk/u
|
||||
bZ8TyX2Iigd8WAmuauvhfHJ9o65AQM1D5kYytD8c3Zn64iZxPaZX1UK9T5gkSQETJz/Ix8
|
||||
EEulFiWyS1GtGImykJ1E32zM06xS+nMDKrbvQbAsUPDD0u52eMMLwex1GG8YWxcRKZyDL2
|
||||
jz63bvm/l1vcKt8AAAALcGFsb0BzdGVybmk=
|
||||
-----END OPENSSH PRIVATE KEY-----
|
|
@ -1 +0,0 @@
|
|||
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCoPvTArswZJXq4Fo/8hbGCv95ab8texW7Sss4Xz9VB1w9mBXDx6jpnIOd8mlK9pgySc/0mVqJrAxOnCs43wDnLyLamtAOF07xTPWkr5Vd9mBjqEQ5yzVQmZpyxXzajJpgAeDyBhSxGnwU5hBQLJk+tWVAwk3gXzniwK6BWv1l+BzwHdD7OgtfXeM75AsJN58gFGQrAEMcreUas1jInqpJNX+ADouu7CCU+UrkFCzIHt2OgtGCLt42YlHIWoftKi1jjRPNlHDcEXuyxbgMV+oJfD86244qWzv66K9CB9SQAq+EZVsVsZF0TNEpOaAzNQ1VcgtnkJihOMQkUbOsHoA/B palo@sterni
|
|
@ -1,2 +0,0 @@
|
|||
plops/generated/
|
||||
sshkey*
|
|
@ -1,54 +0,0 @@
|
|||
# NixOS Server Example with plops
|
||||
|
||||
This setup shows:
|
||||
|
||||
- how to use a terranix module
|
||||
- how to use 3rd party provision software after terraform.
|
||||
- how to run terranix and terraform
|
||||
|
||||
Setup containing opinionated modules to deploy
|
||||
[NixOS servers](https://nixos.org/)
|
||||
on
|
||||
[hcloud](https://www.hetzner.com/cloud)
|
||||
using
|
||||
[nixos-infect](https://github.com/elitak/nixos-infect)
|
||||
with my
|
||||
[plops](https://github.com/mrVanDalo/plops)
|
||||
provisioning tool for NixOS,
|
||||
which is an overlay on
|
||||
[krops](https://cgit.krebsco.de/krops/about/).
|
||||
|
||||
After server creation,
|
||||
the initial provisioning uploads the
|
||||
nixos-infect
|
||||
script and applys it.
|
||||
After server creation and initialization
|
||||
terranix/terraform generates
|
||||
files used for the "real" provisioning
|
||||
done by plops.
|
||||
|
||||
Of course instead of plops you can use every provsioning tool you like
|
||||
here (e.g. NixOps, Ansible, ... )
|
||||
|
||||
# How to Run
|
||||
|
||||
## What you need
|
||||
|
||||
- a setup [passwordstore](https://www.passwordstore.org/).
|
||||
- a [hcloud token](https://docs.hetzner.cloud/#overview-getting-started)
|
||||
stored under `development/hetzner.com/api-token`
|
||||
|
||||
## Steps
|
||||
|
||||
- `terraform-prepare`: to create ssh keys.
|
||||
- `terraform-build`: to run terranix and terraform do create server.
|
||||
- `terraform-destroy`: to delete server (don't forget that step, or else it gets costly)
|
||||
- `terraform-cleanup`: to delete ssh keys and terraform data.
|
||||
|
||||
## DNS
|
||||
|
||||
define domains with your nameserver and update `jitsi.nix` and `workadventure.nix`.
|
||||
|
||||
- `meet.${domain}` to given ip4 address
|
||||
- `party.${domain}` to given ip4 address
|
||||
- `*.party.${domain}` to given ip4 address
|
|
@ -1,49 +0,0 @@
|
|||
{ config, lib, pkgs, ... }:
|
||||
let
|
||||
hcloud-modules = pkgs.fetchgit {
|
||||
url = "https://github.com/mrVanDalo/terranix-hcloud.git";
|
||||
rev = "5fa359a482892cd973dcc6ecfc607f4709f24495";
|
||||
sha256 = "0smgmdiklj98y71fmcdjsqjq8l41i66hs8msc7k4m9dpkphqk86p";
|
||||
};
|
||||
in
|
||||
{
|
||||
|
||||
imports = [ "${hcloud-modules}/default.nix" ];
|
||||
|
||||
# configure temporary admin ssh keys
|
||||
users.admins.palo.publicKey = "${lib.fileContents ./sshkey.pub}";
|
||||
|
||||
# configure provisioning private Key to be used when running provisioning on the machines
|
||||
provisioner.privateKeyFile = toString ./sshkey;
|
||||
|
||||
hcloud.nixserver = {
|
||||
host = {
|
||||
enable = true;
|
||||
serverType = "cx51"; # 35€/month
|
||||
configurationFile = pkgs.writeText "configuration.nix" ''
|
||||
{ pkgs, lib, config, ... }:
|
||||
{
|
||||
environment.systemPackages = [ pkgs.git ];
|
||||
}
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
hcloud.export.nix = toString ./plops/generated/nixos-machines.nix;
|
||||
|
||||
resource.local_file.sshConfig = {
|
||||
filename = "${toString ./plops/generated/ssh-configuration}";
|
||||
content = with lib;
|
||||
let
|
||||
configPart = name: ''
|
||||
Host ''${ hcloud_server.nixserver-${name}.ipv4_address }
|
||||
IdentityFile ${toString ./sshkey}
|
||||
ServerAliveInterval 60
|
||||
ServerAliveCountMax 3
|
||||
'';
|
||||
in
|
||||
concatStringsSep "\n"
|
||||
(map configPart (attrNames config.hcloud.nixserver));
|
||||
};
|
||||
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
{ config, lib, pkgs, ... }: {
|
||||
|
||||
services.nginx.enable = true;
|
||||
services.nginx.virtualHosts.codimd = {
|
||||
enableACME = true;
|
||||
addSSL = true;
|
||||
serverName = "codimd.${config.workadventure.domain}";
|
||||
locations."/".extraConfig = ''
|
||||
client_max_body_size 4G;
|
||||
proxy_set_header Host $host;
|
||||
proxy_pass http://localhost:3091;
|
||||
'';
|
||||
};
|
||||
|
||||
services.codimd = {
|
||||
enable = true;
|
||||
configuration = {
|
||||
allowFreeURL = true;
|
||||
db = {
|
||||
dialect = "sqlite";
|
||||
storage = "/var/lib/codimd/db.codimd.sqlite";
|
||||
useCDN = false;
|
||||
};
|
||||
port = 3091;
|
||||
};
|
||||
};
|
||||
|
||||
}
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
{ config, pkgs, lib, ... }: {
|
||||
imports = [
|
||||
./options.nix
|
||||
# codimd.${hostName}
|
||||
./codimd.nix
|
||||
./hardware-configuration.nix
|
||||
# meet.${hostName}
|
||||
./jitsi.nix
|
||||
# netdata.${hostName}
|
||||
#./netdata.nix
|
||||
./ssh.nix
|
||||
# party.${hostName}
|
||||
# api.party.${hostName}
|
||||
# push.party.${hostName}
|
||||
# play.party.${hostName}
|
||||
# upload.party.${hostName}
|
||||
./workadventure.nix
|
||||
];
|
||||
|
||||
environment.systemPackages =
|
||||
[ pkgs.git pkgs.docker-compose pkgs.ag pkgs.htop ];
|
||||
|
||||
# party.${hostName}
|
||||
# api.party.${hostName}
|
||||
# push.party.${hostName}
|
||||
# play.party.${hostName}
|
||||
# upload.party.${hostName}
|
||||
|
||||
networking.hostName = "host";
|
||||
workadventure.domain = "palovandalo.com";
|
||||
security.acme.email = "contact@ingolf-wagner.de";
|
||||
security.acme.acceptTerms = true;
|
||||
|
||||
}
|
|
@ -1,10 +0,0 @@
|
|||
{ ... }: {
|
||||
imports = [ <nixpkgs/nixos/modules/profiles/qemu-guest.nix> ];
|
||||
boot.initrd.availableKernelModules =
|
||||
[ "ata_piix" "uhci_hcd" "virtio_pci" "sd_mod" "sr_mod" ];
|
||||
boot.loader.grub.device = "/dev/sda";
|
||||
fileSystems."/" = {
|
||||
device = "/dev/sda1";
|
||||
fsType = "ext4";
|
||||
};
|
||||
}
|
|
@ -1,60 +0,0 @@
|
|||
{ config, ... }: {
|
||||
# + +
|
||||
# | |
|
||||
# | |
|
||||
# v v
|
||||
# 80, 443 TCP 443 TCP, 10000 UDP
|
||||
# +--------------+ +---------------------+
|
||||
# | nginx | 5222, 5347 TCP | |
|
||||
# | jitsi-meet |<-------------------+| jitsi-videobridge |
|
||||
# | prosody | | | |
|
||||
# | jicofo | | +---------------------+
|
||||
# +--------------+ |
|
||||
# | +---------------------+
|
||||
# | | |
|
||||
# +----------+| jitsi-videobridge |
|
||||
# | | |
|
||||
# | +---------------------+
|
||||
# |
|
||||
# | +---------------------+
|
||||
# | | |
|
||||
# +----------+| jitsi-videobridge |
|
||||
# | |
|
||||
# +---------------------+
|
||||
|
||||
# This is a one server setup
|
||||
services.jitsi-meet = {
|
||||
enable = true;
|
||||
hostName = "meet.${config.workadventure.domain}";
|
||||
|
||||
# JItsi COnference FOcus is a server side focus component used in Jitsi Meet conferences.
|
||||
# https://github.com/jitsi/jicofo
|
||||
jicofo.enable = true;
|
||||
|
||||
# Whether to enable nginx virtual host that will serve the javascript application and act as a proxy for the XMPP server.
|
||||
# Further nginx configuration can be done by adapting services.nginx.virtualHosts.<hostName>. When this is enabled, ACME
|
||||
# will be used to retrieve a TLS certificate by default. To disable this, set the
|
||||
# services.nginx.virtualHosts.<hostName>.enableACME to false and if appropriate do the same for
|
||||
# services.nginx.virtualHosts.<hostName>.forceSSL.
|
||||
nginx.enable = true;
|
||||
|
||||
# https://github.com/jitsi/jitsi-meet/blob/master/config.js
|
||||
config = {
|
||||
enableWelcomePage = false;
|
||||
defaultLang = "en";
|
||||
};
|
||||
|
||||
# https://github.com/jitsi/jitsi-meet/blob/master/interface_config.js
|
||||
interfaceConfig = {
|
||||
SHOW_JITSI_WATERMARK = false;
|
||||
SHOW_WATERMARK_FOR_GUESTS = false;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
networking.firewall = {
|
||||
allowedTCPPorts = [ 80 443 ];
|
||||
allowedUDPPorts = [ 10000 ];
|
||||
};
|
||||
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
{ config, ... }: {
|
||||
services.netdata = {
|
||||
enable = true;
|
||||
config = {
|
||||
#"exporting:global" = { "enabled" = "yes"; };
|
||||
global = {
|
||||
"memory mode" = "dbengine";
|
||||
"dbengine disk space" = 1024 * 10; # in MB
|
||||
"debug log" = "none";
|
||||
"access log" = "none";
|
||||
"error log" = "syslog";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
services.nginx.enable = true;
|
||||
services.nginx.virtualHosts."netdata.${config.workadventure.domain}" = {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
basicAuth.admin = "NYsXfBKRwkkS60WIeZONtFTv3nz4tPy52uqLkzJzuc";
|
||||
locations."/" = {
|
||||
proxyPass = "http://localhost:19999";
|
||||
proxyWebsockets = true;
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,15 +0,0 @@
|
|||
{ config, lib, pkgs, ... }:
|
||||
with lib;
|
||||
let cfg = config.workadventure;
|
||||
in {
|
||||
|
||||
options.workadventure = {
|
||||
domain = mkOption {
|
||||
type = with types; str;
|
||||
description = ''
|
||||
domain of the server
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
}
|
|
@ -1,14 +0,0 @@
|
|||
{
|
||||
# ssh configuration
|
||||
# -----------------
|
||||
services.sshd.enable = true;
|
||||
services.openssh.passwordAuthentication = false;
|
||||
services.openssh.banner = ''
|
||||
[ JITSI Server ]
|
||||
'';
|
||||
|
||||
# the public ssh key used at deployment
|
||||
users.users.root.openssh.authorizedKeys.keys = [
|
||||
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC6uza62+Go9sBFs3XZE2OkugBv9PJ7Yv8ebCskE5WYPcahMZIKkQw+zkGI8EGzOPJhQEv2xk+XBf2VOzj0Fto4nh8X5+Llb1nM+YxQPk1SVlwbNAlhh24L1w2vKtBtMy277MF4EP+caGceYP6gki5+DzlPUSdFSAEFFWgN1WPkiyUii15Xi3QuCMR8F18dbwVUYbT11vwNhdiAXWphrQG+yPguALBGR+21JM6fffOln3BhoDUp2poVc5Qe2EBuUbRUV3/fOU4HwWVKZ7KCFvLZBSVFutXCj5HuNWJ5T3RuuxJSmY5lYuFZx9gD+n+DAEJt30iXWcaJlmUqQB5awcB1S2d9pJ141V4vjiCMKUJHIdspFrI23rFNYD9k2ZXDA8VOnQE33BzmgF9xOVh6qr4G0oEpsNqJoKybVTUeSyl4+ifzdQANouvySgLJV/pcqaxX1srSDIUlcM2vDMWAs3ryCa0aAlmAVZIHgRhh6wa+IXW8gIYt+5biPWUuihJ4zGBEwkyVXXf2xsecMWCAGPWPDL0/fBfY9krNfC5M2sqxey2ShFIq+R/wMdaI7yVjUCF2QIUNiIdFbJL6bDrDyHnEXJJN+rAo23jUoTZZRv7Jq3DB/A5H7a73VCcblZyUmwMSlpg3wos7pdw5Ctta3zQPoxoAKGS1uZ+yTeZbPMmdbw=="
|
||||
];
|
||||
}
|
|
@ -1,167 +0,0 @@
|
|||
{ config, pkgs, lib, ... }:
|
||||
let
|
||||
# If your Jitsi environment has authentication set up,
|
||||
# you MUST set JITSI_PRIVATE_MODE to "true" and
|
||||
# you MUST pass a SECRET_JITSI_KEY to generate the JWT secret
|
||||
jitsiPrivateMode = "false";
|
||||
|
||||
secretJitsiKey = "";
|
||||
|
||||
jitsiISS = "";
|
||||
|
||||
workadventureSecretKey = "";
|
||||
|
||||
jitsiURL = "meet.${config.workadventure.domain}";
|
||||
|
||||
domain = "party.${config.workadventure.domain}";
|
||||
# domain will redirect to this map. (not play.${domain})
|
||||
defaultMap = "mrvandalo.github.io/workadventure-worlds/main.json";
|
||||
|
||||
apiURL = "api.${domain}";
|
||||
apiPort = 9002;
|
||||
|
||||
frontURL = "play.${domain}";
|
||||
frontPort = 9004;
|
||||
|
||||
pusherURL = "push.${domain}";
|
||||
pusherPort = 9005;
|
||||
|
||||
uploaderURL = "upload.${domain}";
|
||||
uploaderPort = 9006;
|
||||
|
||||
version = "v1.1.0";
|
||||
frontImage = "thecodingmachine/workadventure-front:${version}";
|
||||
pusherImage = "thecodingmachine/workadventure-pusher:${version}";
|
||||
apiImage = "thecodingmachine/workadventure-back:${version}";
|
||||
uploaderImage = "thecodingmachine/workadventure-uploader:${version}";
|
||||
|
||||
in
|
||||
{
|
||||
|
||||
virtualisation.docker.enable = true;
|
||||
boot.kernel.sysctl."net.ipv4.ip_forward" = true;
|
||||
|
||||
networking.firewall = {
|
||||
allowedTCPPorts = [ 80 443 ];
|
||||
allowedUDPPorts = [ 80 443 ];
|
||||
};
|
||||
|
||||
services.nginx.enable = true;
|
||||
services.nginx.recommendedProxySettings = true;
|
||||
|
||||
systemd.services.workadventure-network = {
|
||||
enable = true;
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
script = ''
|
||||
${pkgs.docker}/bin/docker network create --driver bridge workadventure ||:
|
||||
'';
|
||||
after = [ "docker" ];
|
||||
before = [
|
||||
"docker-workadventure-back.service"
|
||||
"docker-workadventure-pusher.service"
|
||||
"docker-workadventure-uploader.service"
|
||||
"docker-workadventure-website.service"
|
||||
];
|
||||
};
|
||||
|
||||
virtualisation.oci-containers.backend = "docker";
|
||||
|
||||
services.nginx.virtualHosts."${domain}" = {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
locations."/" = {
|
||||
return = "302 $scheme://play.${domain}/_/global/${defaultMap}";
|
||||
};
|
||||
};
|
||||
|
||||
virtualisation.oci-containers.containers.workadventure-front = {
|
||||
image = frontImage;
|
||||
environment = {
|
||||
API_URL = pusherURL;
|
||||
JITSI_PRIVATE_MODE = jitsiPrivateMode;
|
||||
JITSI_URL = jitsiURL;
|
||||
SECRET_JITSI_KEY = secretJitsiKey;
|
||||
UPLOADER_URL = uploaderURL;
|
||||
};
|
||||
ports = [ "127.0.0.1:${toString frontPort}:80" ];
|
||||
extraOptions = [ "--network=workadventure" ];
|
||||
};
|
||||
services.nginx.virtualHosts."${frontURL}" = {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
locations."/" = { proxyPass = "http://127.0.0.1:${toString frontPort}"; };
|
||||
};
|
||||
|
||||
virtualisation.oci-containers.containers.workadventure-pusher = {
|
||||
image = pusherImage;
|
||||
environment = {
|
||||
API_URL = "workadventure-back:50051";
|
||||
JITSI_ISS = jitsiISS;
|
||||
JITSI_URL = jitsiURL;
|
||||
SECRET_KEY = workadventureSecretKey;
|
||||
};
|
||||
ports = [ "127.0.0.1:${toString pusherPort}:8080" ];
|
||||
extraOptions = [ "--network=workadventure" ];
|
||||
};
|
||||
services.nginx.virtualHosts."${pusherURL}" = {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
locations."/" = {
|
||||
proxyPass = "http://127.0.0.1:${toString pusherPort}";
|
||||
proxyWebsockets = true;
|
||||
};
|
||||
locations."/room" = {
|
||||
proxyPass = "http://127.0.0.1:${toString pusherPort}";
|
||||
proxyWebsockets = true;
|
||||
};
|
||||
};
|
||||
|
||||
virtualisation.oci-containers.containers.workadventure-back = {
|
||||
image = apiImage;
|
||||
environment = {
|
||||
#DEBUG = "*";
|
||||
JITSI_ISS = jitsiISS;
|
||||
JITSI_URL = jitsiURL;
|
||||
SECRET_KEY = workadventureSecretKey;
|
||||
};
|
||||
ports = [ "127.0.0.1:${toString apiPort}:8080" "50051" ];
|
||||
extraOptions = [ "--network=workadventure" ];
|
||||
};
|
||||
services.nginx.virtualHosts."${apiURL}" = {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
locations."/" = { proxyPass = "http://127.0.0.1:${toString apiPort}"; };
|
||||
};
|
||||
|
||||
virtualisation.oci-containers.containers.workadventure-uploader = {
|
||||
image = uploaderImage;
|
||||
ports = [ "127.0.0.1:${toString uploaderPort}:8080" ];
|
||||
extraOptions = [ "--network=workadventure" ];
|
||||
};
|
||||
services.nginx.virtualHosts."${uploaderURL}" = {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
locations."/" = {
|
||||
proxyPass = "http://127.0.0.1:${toString uploaderPort}";
|
||||
proxyWebsockets = true;
|
||||
};
|
||||
};
|
||||
|
||||
systemd.services.docker-workadventure-front.serviceConfig = {
|
||||
StandardOutput = lib.mkForce "journal";
|
||||
StandardError = lib.mkForce "journal";
|
||||
};
|
||||
systemd.services.docker-workadventure-uploader.serviceConfig = {
|
||||
StandardOutput = lib.mkForce "journal";
|
||||
StandardError = lib.mkForce "journal";
|
||||
};
|
||||
systemd.services.docker-workadventure-pusher.serviceConfig = {
|
||||
StandardOutput = lib.mkForce "journal";
|
||||
StandardError = lib.mkForce "journal";
|
||||
};
|
||||
systemd.services.docker-workadventure-back.serviceConfig = {
|
||||
StandardOutput = lib.mkForce "journal";
|
||||
StandardError = lib.mkForce "journal";
|
||||
};
|
||||
|
||||
}
|
|
@ -1,74 +0,0 @@
|
|||
let
|
||||
|
||||
# import plops with pkgs and lib
|
||||
opsImport = import ((import <nixpkgs> { }).fetchgit {
|
||||
url = "https://github.com/mrVanDalo/plops.git";
|
||||
rev = "9fabba016a3553ae6e13d5d17d279c4de2eb00ad";
|
||||
sha256 = "193pajq1gcd9jyd12nii06q1sf49xdhbjbfqk3lcq83s0miqfs63";
|
||||
});
|
||||
|
||||
ops =
|
||||
let
|
||||
overlay = self: super: {
|
||||
# overwrite ssh to use the generated ssh configuration
|
||||
openssh = super.writeShellScriptBin "ssh" ''
|
||||
${super.openssh}/bin/ssh -F ${
|
||||
toString ./generated/ssh-configuration
|
||||
} "$@"
|
||||
'';
|
||||
};
|
||||
in
|
||||
opsImport { overlays = [ overlay ]; };
|
||||
|
||||
lib = ops.lib;
|
||||
pkgs = ops.pkgs;
|
||||
|
||||
# define all sources
|
||||
source = {
|
||||
|
||||
# nixpkgs (no need for channels anymore)
|
||||
nixPkgs.nixpkgs.git = {
|
||||
ref = "nixos-20.09";
|
||||
url = "https://github.com/NixOS/nixpkgs";
|
||||
};
|
||||
|
||||
# system configurations
|
||||
system = name: {
|
||||
configs.file = toString ./configs;
|
||||
nixos-config.symlink = "configs/${name}/configuration.nix";
|
||||
};
|
||||
|
||||
# secrets which are hold and stored by pass
|
||||
secrets = name: {
|
||||
secrets.pass = {
|
||||
dir = toString ./secrets;
|
||||
name = name;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
servers = import ./generated/nixos-machines.nix;
|
||||
|
||||
deployServer = name:
|
||||
{ user ? "root", host, ... }:
|
||||
with ops;
|
||||
jobs "deploy-${name}" "${user}@${host.ipv4}" [
|
||||
# deploy secrets to /run/plops-secrets/secrets
|
||||
# (populateTmpfs (source.secrets name))
|
||||
# deploy system to /var/src/system
|
||||
(populate (source.system name))
|
||||
# deploy nixpkgs to /var/src/nixpkgs
|
||||
(populate source.nixPkgs)
|
||||
switch
|
||||
];
|
||||
|
||||
in
|
||||
pkgs.mkShell {
|
||||
|
||||
buildInputs = lib.mapAttrsToList deployServer servers;
|
||||
|
||||
shellHook = ''
|
||||
export PASSWORD_STORE_DIR=./secrets
|
||||
'';
|
||||
|
||||
}
|
|
@ -1,50 +0,0 @@
|
|||
{ pkgs ? import <nixpkgs> { } }:
|
||||
let
|
||||
|
||||
terranix = pkgs.callPackage
|
||||
(pkgs.fetchgit {
|
||||
url = "https://github.com/mrVanDalo/terranix.git";
|
||||
rev = "2.3.0";
|
||||
sha256 = "030067h3gjc02llaa7rx5iml0ikvw6szadm0nrss2sqzshsfimm4";
|
||||
})
|
||||
{ };
|
||||
|
||||
terraform = pkgs.writers.writeBashBin "terraform" ''
|
||||
export TF_VAR_hcloud_api_token=`${pkgs.pass}/bin/pass development/hetzner.com/api-token`
|
||||
${pkgs.terraform_0_12}/bin/terraform "$@"
|
||||
'';
|
||||
|
||||
in
|
||||
pkgs.mkShell {
|
||||
|
||||
buildInputs = [
|
||||
|
||||
terranix
|
||||
terraform
|
||||
|
||||
(pkgs.writers.writeBashBin "terraform-prepare" ''
|
||||
${pkgs.openssh}/bin/ssh-keygen -P "" -f ${toString ./.}/sshkey
|
||||
'')
|
||||
|
||||
(pkgs.writers.writeBashBin "terraform-build" ''
|
||||
set -e
|
||||
set -o pipefail
|
||||
${terranix}/bin/terranix | ${pkgs.jq}/bin/jq '.' > config.tf.json
|
||||
${terraform}/bin/terraform init
|
||||
${terraform}/bin/terraform apply
|
||||
'')
|
||||
|
||||
(pkgs.writers.writeBashBin "terraform-destroy" ''
|
||||
${terraform}/bin/terraform destroy
|
||||
rm ${toString ./.}/config.tf.json
|
||||
'')
|
||||
|
||||
(pkgs.writers.writeBashBin "terraform-cleanup" ''
|
||||
rm ${toString ./.}/sshkey
|
||||
rm ${toString ./.}/sshkey.pub
|
||||
rm ${toString ./.}/terraform.tfstate*
|
||||
'')
|
||||
|
||||
];
|
||||
}
|
||||
|
Loading…
Reference in a new issue