forked from Deuxfleurs/nixcfg
Compare commits
132 commits
crytptpad-
...
main
Author | SHA1 | Date | |
---|---|---|---|
|
344b586ad0 | ||
|
90f56a45a7 | ||
|
d1de8cb2b4 | ||
e87942dad3 | |||
a162754fb1 | |||
|
0b911436ad | ||
|
2e99ca2c52 | ||
|
3bff7075b3 | ||
|
7ae8f05510 | ||
|
070c7281c8 | ||
|
177265b4f1 | ||
|
412f4018f9 | ||
|
83060bab27 | ||
|
1c61d0c9c8 | ||
|
ea270e30db | ||
|
1c224fcece | ||
90f861e1e1 | |||
|
e0385b0456 | ||
|
c66bff55f4 | ||
|
3f51534e03 | ||
ff5178bcdc | |||
|
e5cc0db639 | ||
|
fe7725b49e | ||
|
b279f1e0db | ||
|
d0341caf77 | ||
|
1a739636ca | ||
|
f32c0c34f3 | ||
|
bc49f33d65 | ||
|
00c56a4dda | ||
|
3053f7998f | ||
|
bbfd630d58 | ||
|
1477417aa8 | ||
|
0288aefda4 | ||
|
ba27b2f2c2 | ||
|
9c712b0d78 | ||
d1e979d3ae | |||
|
8743e9b69b | ||
|
87e3ef93e3 | ||
|
99c031dfc4 | ||
50b021dd02 | |||
9467dfea2a | |||
d568dea939 | |||
|
c6ce1628f9 | ||
|
10d9528d91 | ||
|
8b10a0f539 | ||
|
e79e5470fb | ||
e344a1d560 | |||
a560763a41 | |||
aac2019d27 | |||
fabf31a720 | |||
c044078a6e | |||
ac4ca90eca | |||
e204c3e563 | |||
e81a6ccff0 | |||
8ca33f3136 | |||
9742ec34da | |||
64195db879 | |||
dabfbc981b | |||
8f4c78f39c | |||
ca01149e16 | |||
093951af05 | |||
e83f12f6a2 | |||
6c88813e8d | |||
|
7c9fed9e99 | ||
|
aebc4b900f | ||
|
2c43fe0fb4 | ||
|
b6c083cf93 | ||
0cc08a1f2b | |||
1bcfc26c62 | |||
47d94b1ad0 | |||
62ff09234d | |||
98feb96d27 | |||
b89b625f46 | |||
76186c3fb3 | |||
be88b5d274 | |||
fa510688d7 | |||
|
fc83048b02 | ||
86026c5642 | |||
|
87464506ce | ||
2f8b2c74f4 | |||
|
7e88a88e04 | ||
|
9fc22d72d4 | ||
|
cbb0093f2c | ||
|
d4fb14347d | ||
|
67794c53a3 | ||
|
ba37244447 | ||
|
8d475b2ee6 | ||
|
7aa220a2e1 | ||
|
1924f2f4ab | ||
|
bdc7376df4 | ||
|
22dba1f35c | ||
|
7c174d6746 | ||
|
02bdc5a0c0 | ||
726f4b2f32 | |||
37a2f781eb | |||
435cbeebfb | |||
3776734e50 | |||
57628b508e | |||
|
ef91461210 | ||
09c3d618e6 | |||
ebfdc6d1a3 | |||
3e0df95fe9 | |||
602c003e1e | |||
e746768de1 | |||
a513690004 | |||
f55891ba21 | |||
9a6935ac90 | |||
|
3b777ddeb6 | ||
|
ca59237057 | ||
28b58b3776 | |||
|
7db40a8dcf | ||
|
c56ce9134c | ||
1d40a3c7c0 | |||
|
5dc7c3132b | ||
|
14c6dae001 | ||
|
6307f7e62f | ||
|
37192f9dff | ||
e6bac83e02 | |||
22fbadef2e | |||
43189a5fc2 | |||
ff7462b2c7 | |||
972fc4ea7c | |||
444306aa54 | |||
c6a1bb341f | |||
eddc95c5df | |||
fb871fd350 | |||
27df86a7e5 | |||
d817ad7b15 | |||
1871f7bbff | |||
18e73b18f3 | |||
a817d764d3 | |||
718a23b74b |
116 changed files with 1770 additions and 6711 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -4,3 +4,4 @@ secrets/*
|
|||
cluster/*/secrets/*
|
||||
!cluster/*/secrets/*.sample
|
||||
|
||||
adrn-notes/
|
||||
|
|
32
cluster/prod/app/backup/README.md
Normal file
32
cluster/prod/app/backup/README.md
Normal file
|
@ -0,0 +1,32 @@
|
|||
## Pour remonter locement un backup de PSQL fait par Nomad (backup-weekly.hcl)
|
||||
|
||||
```bash
|
||||
export AWS_BUCKET=backups-pgbasebackup
|
||||
export AWS_ENDPOINT=s3.deuxfleurs.shirokumo.net
|
||||
export AWS_ACCESS_KEY_ID=$(consul kv get "secrets/postgres/backup/aws_access_key_id")
|
||||
export AWS_SECRET_ACCESS_KEY=$(consul kv get secrets/postgres/backup/aws_secret_access_key)
|
||||
export CRYPT_PUBLIC_KEY=$(consul kv get secrets/postgres/backup/crypt_public_key)
|
||||
```
|
||||
|
||||
Et voilà le travail :
|
||||
|
||||
```bash
|
||||
$ aws s3 --endpoint https://$AWS_ENDPOINT ls
|
||||
2022-04-14 17:00:50 backups-pgbasebackup
|
||||
|
||||
$ aws s3 --endpoint https://$AWS_ENDPOINT ls s3://backups-pgbasebackup
|
||||
PRE 2024-07-28 00:00:36.140539/
|
||||
PRE 2024-08-04 00:00:21.291551/
|
||||
PRE 2024-08-11 00:00:26.589762/
|
||||
PRE 2024-08-18 00:00:40.873939/
|
||||
PRE 2024-08-25 01:03:54.672763/
|
||||
PRE 2024-09-01 00:00:20.019605/
|
||||
PRE 2024-09-08 00:00:16.969740/
|
||||
PRE 2024-09-15 00:00:37.951459/
|
||||
PRE 2024-09-22 00:00:21.030452/
|
||||
|
||||
$ aws s3 --endpoint https://$AWS_ENDPOINT ls "s3://backups-pgbasebackup/2024-09-22 00:00:21.030452/"
|
||||
2024-09-22 03:23:28 623490 backup_manifest
|
||||
2024-09-22 03:25:32 6037121487 base.tar.gz
|
||||
2024-09-22 03:25:33 19948939 pg_wal.tar.gz
|
||||
```
|
|
@ -44,6 +44,8 @@ if not client.bucket_exists(bucket):
|
|||
abort(f"Bucket {bucket} does not exist or its access is forbidden, aborting")
|
||||
|
||||
# Perform the backup locally
|
||||
# Via command-line:
|
||||
# pg_basebackup --host=localhost --username=$PSQL_USER --pgdata=. --format=tar --wal-method=stream --gzip --compress=6 --progress --max-rate=5M
|
||||
try:
|
||||
ret = subprocess.run(["pg_basebackup",
|
||||
f"--host={psql_host}",
|
||||
|
|
|
@ -21,7 +21,7 @@ job "backup_daily" {
|
|||
driver = "docker"
|
||||
|
||||
config {
|
||||
image = "restic/restic:0.16.0"
|
||||
image = "restic/restic:0.16.4"
|
||||
entrypoint = [ "/bin/sh", "-c" ]
|
||||
args = [ "restic backup /mail && restic forget --group-by paths --keep-within 1m1d --keep-within-weekly 3m --keep-within-monthly 1y && restic prune --max-unused 50% --max-repack-size 2G && restic check" ]
|
||||
volumes = [
|
||||
|
@ -116,7 +116,7 @@ EOH
|
|||
driver = "docker"
|
||||
|
||||
config {
|
||||
image = "restic/restic:0.16.0"
|
||||
image = "restic/restic:0.16.4"
|
||||
entrypoint = [ "/bin/sh", "-c" ]
|
||||
args = [ "restic backup $NOMAD_ALLOC_DIR/consul.json && restic forget --group-by paths --keep-within 1m1d --keep-within-weekly 3m --keep-within-monthly 1y && restic prune --max-unused 50% --max-repack-size 2G && restic check" ]
|
||||
}
|
||||
|
@ -152,14 +152,14 @@ EOH
|
|||
constraint {
|
||||
attribute = "${attr.unique.hostname}"
|
||||
operator = "="
|
||||
value = "concombre"
|
||||
value = "abricot"
|
||||
}
|
||||
|
||||
task "main" {
|
||||
driver = "docker"
|
||||
|
||||
config {
|
||||
image = "restic/restic:0.16.0"
|
||||
image = "restic/restic:0.16.4"
|
||||
entrypoint = [ "/bin/sh", "-c" ]
|
||||
args = [ "restic backup /cryptpad && restic forget --group-by paths --keep-within 1m1d --keep-within-weekly 3m --keep-within-monthly 1y && restic prune --max-unused 50% --max-repack-size 2G && restic check" ]
|
||||
volumes = [
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
job "bagage" {
|
||||
datacenters = ["scorpio", "neptune"]
|
||||
datacenters = ["corrin", "neptune", "scorpio"]
|
||||
type = "service"
|
||||
priority = 90
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
job "cms" {
|
||||
datacenters = ["neptune", "scorpio"]
|
||||
datacenters = ["corrin", "neptune", "scorpio"]
|
||||
type = "service"
|
||||
|
||||
priority = 100
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
job "core-bottin" {
|
||||
datacenters = ["neptune", "scorpio"]
|
||||
datacenters = ["corrin", "neptune", "scorpio", "bespin"]
|
||||
type = "system"
|
||||
priority = 90
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
job "core-d53" {
|
||||
datacenters = ["neptune", "scorpio", "bespin"]
|
||||
datacenters = ["neptune", "scorpio", "bespin", "corrin"]
|
||||
type = "service"
|
||||
priority = 90
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
job "core-diplonat" {
|
||||
datacenters = ["neptune", "scorpio", "bespin"]
|
||||
datacenters = ["neptune", "scorpio", "bespin", "corrin"]
|
||||
type = "system"
|
||||
priority = 90
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ job "core-tricot" {
|
|||
# on pourra mettre bespin quand on aura migré gitea de la vm vers le cluster
|
||||
# en attendant, les deux ne sont pas capables de partager les certificats SSL
|
||||
# donc on laisse la VM gitea gérer les certifs et prendre tout le trafic http(s)
|
||||
datacenters = ["neptune", "scorpio"]
|
||||
datacenters = ["corrin", "neptune", "scorpio"]
|
||||
type = "system"
|
||||
priority = 90
|
||||
|
||||
|
@ -28,13 +28,16 @@ job "core-tricot" {
|
|||
driver = "docker"
|
||||
|
||||
config {
|
||||
image = "superboum/amd64_tricot:54"
|
||||
image = "armael/tricot:40g7jpp915jkfszlczfh1yw2x6syjkxs-redir-headers"
|
||||
network_mode = "host"
|
||||
readonly_rootfs = true
|
||||
ports = [ "http_port", "https_port" ]
|
||||
volumes = [
|
||||
"secrets:/etc/tricot",
|
||||
]
|
||||
ulimit {
|
||||
nofile = "65535:65535"
|
||||
}
|
||||
}
|
||||
|
||||
resources {
|
||||
|
|
|
@ -3,3 +3,7 @@ type = 'user'
|
|||
description = 'LDAP base DN for everything'
|
||||
example = 'dc=example,dc=com'
|
||||
|
||||
[secrets."d53/gandi_api_key"]
|
||||
type = 'user'
|
||||
description = 'Gandi API key'
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
job "coturn" {
|
||||
datacenters = ["neptune", "scorpio"]
|
||||
datacenters = ["corrin", "neptune", "scorpio"]
|
||||
type = "service"
|
||||
|
||||
priority = 100
|
||||
|
@ -34,15 +34,13 @@ job "coturn" {
|
|||
ports = [ "prometheus", "turn_ctrl", "turn_data0", "turn_data1", "turn_data2",
|
||||
"turn_data3", "turn_data4", "turn_data5", "turn_data6", "turn_data7",
|
||||
"turn_data8", "turn_data9" ]
|
||||
entrypoint = ["/local/docker-entrypoint.sh"]
|
||||
network_mode = "host"
|
||||
volumes = [
|
||||
"secrets/docker-entrypoint.sh:/usr/local/bin/docker-entrypoint.sh",
|
||||
]
|
||||
}
|
||||
|
||||
template {
|
||||
data = file("../config/docker-entrypoint.sh")
|
||||
destination = "secrets/docker-entrypoint.sh"
|
||||
destination = "local/docker-entrypoint.sh"
|
||||
perms = 555
|
||||
}
|
||||
|
||||
|
|
|
@ -36,21 +36,17 @@ used by CryptPad, which can result to large Docker image (~2.6GiB)
|
|||
This behaviour is configurable by passing the `--arg withOnlyOffice false` flag to `nix-build` when building them.
|
||||
|
||||
## Updating the Deuxfleurs pinned nixpkgs
|
||||
The pinned sources files are generated with the [niv](https://github.com/nmattia/niv) tool.
|
||||
The pinned sources files are generated with the [npins](https://github.com/andir/npins) tool.
|
||||
|
||||
To update the pinned nixpkgs, you simply run the following command:
|
||||
|
||||
```shell
|
||||
niv update
|
||||
npins update
|
||||
```
|
||||
|
||||
To modify the pinned nixpkgs, you can use the `niv modify` command, for example, to move to nixpkgs-unstable:
|
||||
To modify the pinned nixpkgs, remove it and re-add it using the new target, for exemple for `nixos-unstable`:
|
||||
|
||||
```shell
|
||||
niv modify nixpkgs -b nixos-unstable
|
||||
npins remove nixpkgs
|
||||
npins add --name nixpkgs channel nixos-unstable
|
||||
```
|
||||
|
||||
## Quirks
|
||||
|
||||
- The CryptPad `package-lock.json` is included here because the upstream-provided one appeared to be desync'ed, so a
|
||||
manual lockfile generation was needed
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
, buildNpmPackage
|
||||
, fetchFromGitHub
|
||||
, fetchzip
|
||||
|
||||
, nodejs
|
||||
|
||||
|
@ -30,8 +31,8 @@
|
|||
hash = "sha256-BZdExj2q/bqUD3k9uluOot2dlrWKA+vpad49EdgXKww=";
|
||||
};
|
||||
v7 = {
|
||||
rev = "9d8b914a81f0f9e5d0bc3f0fc631adf4b6d480e7";
|
||||
hash = "sha256-M+rPJ/Xo2olhqB5ViynGRaesMLLfG/1ltUoLnepMPnM=";
|
||||
rev = "e1267803ea749cd93e9d5f81438011ea620d04af";
|
||||
hash = "sha256-iIds0GnCHAyeIEdSD4aCCgDtnnwARh3NE470CywseS0=";
|
||||
};
|
||||
};
|
||||
mkOnlyOffice = {
|
||||
|
@ -40,6 +41,14 @@
|
|||
pname = "${pname}-onlyoffice";
|
||||
inherit version;
|
||||
|
||||
x2t = let
|
||||
version = "v7.3+1";
|
||||
in fetchzip {
|
||||
url = "https://github.com/cryptpad/onlyoffice-x2t-wasm/releases/download/${version}/x2t.zip";
|
||||
hash = "sha256-d5raecsTOflo0UpjSEZW5lker4+wdkTb6IyHNq5iBg8=";
|
||||
stripRoot = false;
|
||||
};
|
||||
|
||||
srcs = lib.mapAttrsToList (version: { rev, hash ? lib.fakeHash }: fetchFromGitHub {
|
||||
name = "${final.pname}-${version}-source";
|
||||
owner = "cryptpad";
|
||||
|
@ -57,20 +66,21 @@
|
|||
(version: "cp -Tr ${final.pname}-${version}-source $out/${version}")
|
||||
(builtins.attrNames onlyOfficeVersions)
|
||||
)}
|
||||
cp -Tr $x2t $out/x2t
|
||||
'';
|
||||
});
|
||||
in buildNpmPackage rec {
|
||||
pname = "cryptpad";
|
||||
version = "2024.3.0";
|
||||
version = "2024.9.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "cryptpad";
|
||||
repo = "cryptpad";
|
||||
rev = version;
|
||||
hash = "sha256-VUW6KvoSatk1/hlzklMQYlSNVH/tdbH+yU4ONUQ0JSQ=";
|
||||
hash = "sha256-OUtWaDVLRUbKS0apwY0aNq4MalGFv+fH9VA7LvWWYRs=";
|
||||
};
|
||||
|
||||
npmDepsHash = "sha256-tvTkoxxioPuNoe8KIuXSP7QQbvcpxMnygsMmzKBQIY0=";
|
||||
npmDepsHash = "sha256-pK0b7q1kJja9l8ANwudbfo3jpldwuO56kuulS8X9A5s=";
|
||||
|
||||
inherit nodejs;
|
||||
|
||||
|
@ -81,10 +91,6 @@ in buildNpmPackage rec {
|
|||
makeCacheWritable = true;
|
||||
dontFixup = true;
|
||||
|
||||
postPatch = ''
|
||||
cp -T ${./package-lock.json} package-lock.json
|
||||
'';
|
||||
|
||||
preBuild = ''
|
||||
npm run install:components
|
||||
'' + lib.optionalString withOnlyOffice ''
|
||||
|
@ -111,8 +117,16 @@ in buildNpmPackage rec {
|
|||
runHook postInstall
|
||||
'';
|
||||
|
||||
passthru = {
|
||||
inherit onlyOffice;
|
||||
};
|
||||
|
||||
meta = {
|
||||
description = "Collaborative office suite, end-to-end encrypted and open-source.";
|
||||
homepage = "https://cryptpad.org";
|
||||
changelog = "https://github.com/cryptpad/cryptpad/releases/tag/${version}";
|
||||
license = lib.licenses.agpl3Plus;
|
||||
platforms = lib.platforms.all;
|
||||
mainProgram = "cryptpad-server";
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,12 +1,14 @@
|
|||
{ name ? "deuxfleurs/cryptpad"
|
||||
, tag ? "nix-latest"
|
||||
}: let
|
||||
sources = import ./nix/sources.nix;
|
||||
sources = import ./npins;
|
||||
pkgs = import sources.nixpkgs {};
|
||||
in rec {
|
||||
cryptpad = pkgs.callPackage ./default.nix {};
|
||||
docker = pkgs.callPackage ./docker.nix {
|
||||
docker = import ./docker.nix {
|
||||
inherit pkgs;
|
||||
inherit name tag;
|
||||
inherit cryptpad;
|
||||
withOnlyOffice = true;
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,14 +0,0 @@
|
|||
{
|
||||
"nixpkgs": {
|
||||
"branch": "nixos-23.11",
|
||||
"description": "Nix Packages collection",
|
||||
"homepage": null,
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "53a2c32bc66f5ae41a28d7a9a49d321172af621e",
|
||||
"sha256": "0yqbwqbripb1bbhlwjfbqmg9qb0lai2fc0k1vfh674d6rrc8igwv",
|
||||
"type": "tarball",
|
||||
"url": "https://github.com/NixOS/nixpkgs/archive/53a2c32bc66f5ae41a28d7a9a49d321172af621e.tar.gz",
|
||||
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
|
||||
}
|
||||
}
|
|
@ -1,198 +0,0 @@
|
|||
# This file has been generated by Niv.
|
||||
|
||||
let
|
||||
|
||||
#
|
||||
# The fetchers. fetch_<type> fetches specs of type <type>.
|
||||
#
|
||||
|
||||
fetch_file = pkgs: name: spec:
|
||||
let
|
||||
name' = sanitizeName name + "-src";
|
||||
in
|
||||
if spec.builtin or true then
|
||||
builtins_fetchurl { inherit (spec) url sha256; name = name'; }
|
||||
else
|
||||
pkgs.fetchurl { inherit (spec) url sha256; name = name'; };
|
||||
|
||||
fetch_tarball = pkgs: name: spec:
|
||||
let
|
||||
name' = sanitizeName name + "-src";
|
||||
in
|
||||
if spec.builtin or true then
|
||||
builtins_fetchTarball { name = name'; inherit (spec) url sha256; }
|
||||
else
|
||||
pkgs.fetchzip { name = name'; inherit (spec) url sha256; };
|
||||
|
||||
fetch_git = name: spec:
|
||||
let
|
||||
ref =
|
||||
spec.ref or (
|
||||
if spec ? branch then "refs/heads/${spec.branch}" else
|
||||
if spec ? tag then "refs/tags/${spec.tag}" else
|
||||
abort "In git source '${name}': Please specify `ref`, `tag` or `branch`!"
|
||||
);
|
||||
submodules = spec.submodules or false;
|
||||
submoduleArg =
|
||||
let
|
||||
nixSupportsSubmodules = builtins.compareVersions builtins.nixVersion "2.4" >= 0;
|
||||
emptyArgWithWarning =
|
||||
if submodules
|
||||
then
|
||||
builtins.trace
|
||||
(
|
||||
"The niv input \"${name}\" uses submodules "
|
||||
+ "but your nix's (${builtins.nixVersion}) builtins.fetchGit "
|
||||
+ "does not support them"
|
||||
)
|
||||
{ }
|
||||
else { };
|
||||
in
|
||||
if nixSupportsSubmodules
|
||||
then { inherit submodules; }
|
||||
else emptyArgWithWarning;
|
||||
in
|
||||
builtins.fetchGit
|
||||
({ url = spec.repo; inherit (spec) rev; inherit ref; } // submoduleArg);
|
||||
|
||||
fetch_local = spec: spec.path;
|
||||
|
||||
fetch_builtin-tarball = name: throw
|
||||
''[${name}] The niv type "builtin-tarball" is deprecated. You should instead use `builtin = true`.
|
||||
$ niv modify ${name} -a type=tarball -a builtin=true'';
|
||||
|
||||
fetch_builtin-url = name: throw
|
||||
''[${name}] The niv type "builtin-url" will soon be deprecated. You should instead use `builtin = true`.
|
||||
$ niv modify ${name} -a type=file -a builtin=true'';
|
||||
|
||||
#
|
||||
# Various helpers
|
||||
#
|
||||
|
||||
# https://github.com/NixOS/nixpkgs/pull/83241/files#diff-c6f540a4f3bfa4b0e8b6bafd4cd54e8bR695
|
||||
sanitizeName = name:
|
||||
(
|
||||
concatMapStrings (s: if builtins.isList s then "-" else s)
|
||||
(
|
||||
builtins.split "[^[:alnum:]+._?=-]+"
|
||||
((x: builtins.elemAt (builtins.match "\\.*(.*)" x) 0) name)
|
||||
)
|
||||
);
|
||||
|
||||
# The set of packages used when specs are fetched using non-builtins.
|
||||
mkPkgs = sources: system:
|
||||
let
|
||||
sourcesNixpkgs =
|
||||
import (builtins_fetchTarball { inherit (sources.nixpkgs) url sha256; }) { inherit system; };
|
||||
hasNixpkgsPath = builtins.any (x: x.prefix == "nixpkgs") builtins.nixPath;
|
||||
hasThisAsNixpkgsPath = <nixpkgs> == ./.;
|
||||
in
|
||||
if builtins.hasAttr "nixpkgs" sources
|
||||
then sourcesNixpkgs
|
||||
else if hasNixpkgsPath && ! hasThisAsNixpkgsPath then
|
||||
import <nixpkgs> { }
|
||||
else
|
||||
abort
|
||||
''
|
||||
Please specify either <nixpkgs> (through -I or NIX_PATH=nixpkgs=...) or
|
||||
add a package called "nixpkgs" to your sources.json.
|
||||
'';
|
||||
|
||||
# The actual fetching function.
|
||||
fetch = pkgs: name: spec:
|
||||
|
||||
if ! builtins.hasAttr "type" spec then
|
||||
abort "ERROR: niv spec ${name} does not have a 'type' attribute"
|
||||
else if spec.type == "file" then fetch_file pkgs name spec
|
||||
else if spec.type == "tarball" then fetch_tarball pkgs name spec
|
||||
else if spec.type == "git" then fetch_git name spec
|
||||
else if spec.type == "local" then fetch_local spec
|
||||
else if spec.type == "builtin-tarball" then fetch_builtin-tarball name
|
||||
else if spec.type == "builtin-url" then fetch_builtin-url name
|
||||
else
|
||||
abort "ERROR: niv spec ${name} has unknown type ${builtins.toJSON spec.type}";
|
||||
|
||||
# If the environment variable NIV_OVERRIDE_${name} is set, then use
|
||||
# the path directly as opposed to the fetched source.
|
||||
replace = name: drv:
|
||||
let
|
||||
saneName = stringAsChars (c: if (builtins.match "[a-zA-Z0-9]" c) == null then "_" else c) name;
|
||||
ersatz = builtins.getEnv "NIV_OVERRIDE_${saneName}";
|
||||
in
|
||||
if ersatz == "" then drv else
|
||||
# this turns the string into an actual Nix path (for both absolute and
|
||||
# relative paths)
|
||||
if builtins.substring 0 1 ersatz == "/" then /. + ersatz else /. + builtins.getEnv "PWD" + "/${ersatz}";
|
||||
|
||||
# Ports of functions for older nix versions
|
||||
|
||||
# a Nix version of mapAttrs if the built-in doesn't exist
|
||||
mapAttrs = builtins.mapAttrs or (
|
||||
f: set: with builtins;
|
||||
listToAttrs (map (attr: { name = attr; value = f attr set.${attr}; }) (attrNames set))
|
||||
);
|
||||
|
||||
# https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/lists.nix#L295
|
||||
range = first: last: if first > last then [ ] else builtins.genList (n: first + n) (last - first + 1);
|
||||
|
||||
# https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L257
|
||||
stringToCharacters = s: map (p: builtins.substring p 1 s) (range 0 (builtins.stringLength s - 1));
|
||||
|
||||
# https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L269
|
||||
stringAsChars = f: s: concatStrings (map f (stringToCharacters s));
|
||||
concatMapStrings = f: list: concatStrings (map f list);
|
||||
concatStrings = builtins.concatStringsSep "";
|
||||
|
||||
# https://github.com/NixOS/nixpkgs/blob/8a9f58a375c401b96da862d969f66429def1d118/lib/attrsets.nix#L331
|
||||
optionalAttrs = cond: as: if cond then as else { };
|
||||
|
||||
# fetchTarball version that is compatible between all the versions of Nix
|
||||
builtins_fetchTarball = { url, name ? null, sha256 }@attrs:
|
||||
let
|
||||
inherit (builtins) lessThan nixVersion fetchTarball;
|
||||
in
|
||||
if lessThan nixVersion "1.12" then
|
||||
fetchTarball ({ inherit url; } // (optionalAttrs (name != null) { inherit name; }))
|
||||
else
|
||||
fetchTarball attrs;
|
||||
|
||||
# fetchurl version that is compatible between all the versions of Nix
|
||||
builtins_fetchurl = { url, name ? null, sha256 }@attrs:
|
||||
let
|
||||
inherit (builtins) lessThan nixVersion fetchurl;
|
||||
in
|
||||
if lessThan nixVersion "1.12" then
|
||||
fetchurl ({ inherit url; } // (optionalAttrs (name != null) { inherit name; }))
|
||||
else
|
||||
fetchurl attrs;
|
||||
|
||||
# Create the final "sources" from the config
|
||||
mkSources = config:
|
||||
mapAttrs
|
||||
(
|
||||
name: spec:
|
||||
if builtins.hasAttr "outPath" spec
|
||||
then
|
||||
abort
|
||||
"The values in sources.json should not have an 'outPath' attribute"
|
||||
else
|
||||
spec // { outPath = replace name (fetch config.pkgs name spec); }
|
||||
)
|
||||
config.sources;
|
||||
|
||||
# The "config" used by the fetchers
|
||||
mkConfig =
|
||||
{ sourcesFile ? if builtins.pathExists ./sources.json then ./sources.json else null
|
||||
, sources ? if sourcesFile == null then { } else builtins.fromJSON (builtins.readFile sourcesFile)
|
||||
, system ? builtins.currentSystem
|
||||
, pkgs ? mkPkgs sources system
|
||||
}: {
|
||||
# The sources, i.e. the attribute set of spec name to spec
|
||||
inherit sources;
|
||||
|
||||
# The "pkgs" (evaluated nixpkgs) to use for e.g. non-builtin fetchers
|
||||
inherit pkgs;
|
||||
};
|
||||
|
||||
in
|
||||
mkSources (mkConfig { }) // { __functor = _: settings: mkSources (mkConfig settings); }
|
80
cluster/prod/app/cryptpad/build/npins/default.nix
Normal file
80
cluster/prod/app/cryptpad/build/npins/default.nix
Normal file
|
@ -0,0 +1,80 @@
|
|||
# Generated by npins. Do not modify; will be overwritten regularly
|
||||
let
|
||||
data = builtins.fromJSON (builtins.readFile ./sources.json);
|
||||
version = data.version;
|
||||
|
||||
mkSource =
|
||||
spec:
|
||||
assert spec ? type;
|
||||
let
|
||||
path =
|
||||
if spec.type == "Git" then
|
||||
mkGitSource spec
|
||||
else if spec.type == "GitRelease" then
|
||||
mkGitSource spec
|
||||
else if spec.type == "PyPi" then
|
||||
mkPyPiSource spec
|
||||
else if spec.type == "Channel" then
|
||||
mkChannelSource spec
|
||||
else
|
||||
builtins.throw "Unknown source type ${spec.type}";
|
||||
in
|
||||
spec // { outPath = path; };
|
||||
|
||||
mkGitSource =
|
||||
{
|
||||
repository,
|
||||
revision,
|
||||
url ? null,
|
||||
hash,
|
||||
branch ? null,
|
||||
...
|
||||
}:
|
||||
assert repository ? type;
|
||||
# At the moment, either it is a plain git repository (which has an url), or it is a GitHub/GitLab repository
|
||||
# In the latter case, there we will always be an url to the tarball
|
||||
if url != null then
|
||||
(builtins.fetchTarball {
|
||||
inherit url;
|
||||
sha256 = hash; # FIXME: check nix version & use SRI hashes
|
||||
})
|
||||
else
|
||||
assert repository.type == "Git";
|
||||
let
|
||||
urlToName =
|
||||
url: rev:
|
||||
let
|
||||
matched = builtins.match "^.*/([^/]*)(\\.git)?$" repository.url;
|
||||
|
||||
short = builtins.substring 0 7 rev;
|
||||
|
||||
appendShort = if (builtins.match "[a-f0-9]*" rev) != null then "-${short}" else "";
|
||||
in
|
||||
"${if matched == null then "source" else builtins.head matched}${appendShort}";
|
||||
name = urlToName repository.url revision;
|
||||
in
|
||||
builtins.fetchGit {
|
||||
url = repository.url;
|
||||
rev = revision;
|
||||
inherit name;
|
||||
# hash = hash;
|
||||
};
|
||||
|
||||
mkPyPiSource =
|
||||
{ url, hash, ... }:
|
||||
builtins.fetchurl {
|
||||
inherit url;
|
||||
sha256 = hash;
|
||||
};
|
||||
|
||||
mkChannelSource =
|
||||
{ url, hash, ... }:
|
||||
builtins.fetchTarball {
|
||||
inherit url;
|
||||
sha256 = hash;
|
||||
};
|
||||
in
|
||||
if version == 3 then
|
||||
builtins.mapAttrs (_: mkSource) data.pins
|
||||
else
|
||||
throw "Unsupported format version ${toString version} in sources.json. Try running `npins upgrade`"
|
11
cluster/prod/app/cryptpad/build/npins/sources.json
Normal file
11
cluster/prod/app/cryptpad/build/npins/sources.json
Normal file
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"pins": {
|
||||
"nixpkgs": {
|
||||
"type": "Channel",
|
||||
"name": "nixos-24.05",
|
||||
"url": "https://releases.nixos.org/nixos/24.05/nixos-24.05.5385.1719f27dd95f/nixexprs.tar.xz",
|
||||
"hash": "0f7i315g1z8kjh10hvj2zv7y2vfqxmwvd96hwlcrr8aig6qq5gzm"
|
||||
}
|
||||
},
|
||||
"version": 3
|
||||
}
|
6000
cluster/prod/app/cryptpad/build/package-lock.json
generated
6000
cluster/prod/app/cryptpad/build/package-lock.json
generated
File diff suppressed because it is too large
Load diff
59
cluster/prod/app/cryptpad/build_docker/Dockerfile
Normal file
59
cluster/prod/app/cryptpad/build_docker/Dockerfile
Normal file
|
@ -0,0 +1,59 @@
|
|||
# SPDX-FileCopyrightText: 2023 XWiki CryptPad Team <contact@cryptpad.org> and contributors
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
#
|
||||
# Tweaks by Deuxfleurs
|
||||
|
||||
# Multistage build to reduce image size and increase security
|
||||
FROM node:lts-slim AS build
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
RUN apt-get update && apt-get install --no-install-recommends -y \
|
||||
ca-certificates tar wget
|
||||
|
||||
# Download the release tarball
|
||||
RUN wget https://github.com/cryptpad/cryptpad/archive/refs/tags/2024.9.0.tar.gz -O cryptpad.tar.gz
|
||||
|
||||
# Create folder for CryptPad
|
||||
RUN mkdir /cryptpad
|
||||
|
||||
# Extract the release into /cryptpad
|
||||
RUN tar xvzf cryptpad.tar.gz -C /cryptpad --strip-components 1
|
||||
|
||||
# Go to /cryptpad
|
||||
WORKDIR /cryptpad
|
||||
|
||||
# Install dependencies
|
||||
RUN npm install --production && npm run install:components
|
||||
|
||||
# Create the actual CryptPad image
|
||||
FROM node:lts-slim
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
# Install curl for healthcheck
|
||||
# Install git, rdfind and unzip for install-onlyoffice.sh
|
||||
RUN apt-get update && apt-get install --no-install-recommends -y \
|
||||
curl ca-certificates git rdfind unzip && \
|
||||
apt-get clean && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Copy cryptpad with installed modules
|
||||
COPY --from=build /cryptpad /cryptpad
|
||||
|
||||
# Set workdir to cryptpad
|
||||
WORKDIR /cryptpad
|
||||
|
||||
# Install onlyoffice
|
||||
RUN ./install-onlyoffice.sh --accept-license --trust-repository
|
||||
|
||||
# Build static pages (?) unsure we need this
|
||||
RUN npm run build
|
||||
|
||||
# Healthcheck
|
||||
HEALTHCHECK --interval=1m CMD curl -f http://localhost:3000/ || exit 1
|
||||
|
||||
# Ports
|
||||
EXPOSE 3000 3003
|
||||
|
||||
# Run cryptpad on startup
|
||||
CMD ["npm", "start"]
|
296
cluster/prod/app/cryptpad/config/config-debug.js
Normal file
296
cluster/prod/app/cryptpad/config/config-debug.js
Normal file
|
@ -0,0 +1,296 @@
|
|||
/* globals module */
|
||||
|
||||
/* DISCLAIMER:
|
||||
|
||||
There are two recommended methods of running a CryptPad instance:
|
||||
|
||||
1. Using a standalone nodejs server without HTTPS (suitable for local development)
|
||||
2. Using NGINX to serve static assets and to handle HTTPS for API server's websocket traffic
|
||||
|
||||
We do not officially recommend or support Apache, Docker, Kubernetes, Traefik, or any other configuration.
|
||||
Support requests for such setups should be directed to their authors.
|
||||
|
||||
If you're having difficulty difficulty configuring your instance
|
||||
we suggest that you join the project's IRC/Matrix channel.
|
||||
|
||||
If you don't have any difficulty configuring your instance and you'd like to
|
||||
support us for the work that went into making it pain-free we are quite happy
|
||||
to accept donations via our opencollective page: https://opencollective.com/cryptpad
|
||||
|
||||
*/
|
||||
module.exports = {
|
||||
/* CryptPad is designed to serve its content over two domains.
|
||||
* Account passwords and cryptographic content is handled on the 'main' domain,
|
||||
* while the user interface is loaded on a 'sandbox' domain
|
||||
* which can only access information which the main domain willingly shares.
|
||||
*
|
||||
* In the event of an XSS vulnerability in the UI (that's bad)
|
||||
* this system prevents attackers from gaining access to your account (that's good).
|
||||
*
|
||||
* Most problems with new instances are related to this system blocking access
|
||||
* because of incorrectly configured sandboxes. If you only see a white screen
|
||||
* when you try to load CryptPad, this is probably the cause.
|
||||
*
|
||||
* PLEASE READ THE FOLLOWING COMMENTS CAREFULLY.
|
||||
*
|
||||
*/
|
||||
|
||||
/* httpUnsafeOrigin is the URL that clients will enter to load your instance.
|
||||
* Any other URL that somehow points to your instance is supposed to be blocked.
|
||||
* The default provided below assumes you are loading CryptPad from a server
|
||||
* which is running on the same machine, using port 3000.
|
||||
*
|
||||
* In a production instance this should be available ONLY over HTTPS
|
||||
* using the default port for HTTPS (443) ie. https://cryptpad.fr
|
||||
* In such a case this should be also handled by NGINX, as documented in
|
||||
* cryptpad/docs/example.nginx.conf (see the $main_domain variable)
|
||||
*
|
||||
*/
|
||||
httpUnsafeOrigin: 'https://pad-debug.deuxfleurs.fr',
|
||||
|
||||
/* httpSafeOrigin is the URL that is used for the 'sandbox' described above.
|
||||
* If you're testing or developing with CryptPad on your local machine then
|
||||
* it is appropriate to leave this blank. The default behaviour is to serve
|
||||
* the main domain over port 3000 and to serve the sandbox content over port 3001.
|
||||
*
|
||||
* This is not appropriate in a production environment where invasive networks
|
||||
* may filter traffic going over abnormal ports.
|
||||
* To correctly configure your production instance you must provide a URL
|
||||
* with a different domain (a subdomain is sufficient).
|
||||
* It will be used to load the UI in our 'sandbox' system.
|
||||
*
|
||||
* This value corresponds to the $sandbox_domain variable
|
||||
* in the example nginx file.
|
||||
*
|
||||
* Note that in order for the sandboxing system to be effective
|
||||
* httpSafeOrigin must be different from httpUnsafeOrigin.
|
||||
*
|
||||
* CUSTOMIZE AND UNCOMMENT THIS FOR PRODUCTION INSTALLATIONS.
|
||||
*/
|
||||
httpSafeOrigin: "https://pad-sandbox-debug.deuxfleurs.fr",
|
||||
|
||||
/* httpAddress specifies the address on which the nodejs server
|
||||
* should be accessible. By default it will listen on 127.0.0.1
|
||||
* (IPv4 localhost on most systems). If you want it to listen on
|
||||
* all addresses, including IPv6, set this to '::'.
|
||||
*
|
||||
*/
|
||||
httpAddress: '::',
|
||||
|
||||
/* httpPort specifies on which port the nodejs server should listen.
|
||||
* By default it will serve content over port 3000, which is suitable
|
||||
* for both local development and for use with the provided nginx example,
|
||||
* which will proxy websocket traffic to your node server.
|
||||
*
|
||||
*/
|
||||
httpPort: 3000,
|
||||
|
||||
/* httpSafePort allows you to specify an alternative port from which
|
||||
* the node process should serve sandboxed assets. The default value is
|
||||
* that of your httpPort + 1. You probably don't need to change this.
|
||||
*
|
||||
*/
|
||||
// httpSafePort: 3001,
|
||||
|
||||
/* CryptPad will launch a child process for every core available
|
||||
* in order to perform CPU-intensive tasks in parallel.
|
||||
* Some host environments may have a very large number of cores available
|
||||
* or you may want to limit how much computing power CryptPad can take.
|
||||
* If so, set 'maxWorkers' to a positive integer.
|
||||
*/
|
||||
// maxWorkers: 4,
|
||||
|
||||
/* =====================
|
||||
* Admin
|
||||
* ===================== */
|
||||
|
||||
/*
|
||||
* CryptPad contains an administration panel. Its access is restricted to specific
|
||||
* users using the following list.
|
||||
* To give access to the admin panel to a user account, just add their public signing
|
||||
* key, which can be found on the settings page for registered users.
|
||||
* Entries should be strings separated by a comma.
|
||||
*/
|
||||
adminKeys: [
|
||||
"[quentin@pad.deuxfleurs.fr/EWtzm-CiqJnM9RZL9mj-YyTgAtX-Zh76sru1K5bFpN8=]",
|
||||
"[adrn@pad.deuxfleurs.fr/PxDpkPwd-jDJWkfWdAzFX7wtnLpnPlBeYZ4MmoEYS6E=]",
|
||||
"[lx@pad.deuxfleurs.fr/FwQzcXywx1FIb83z6COB7c3sHnz8rNSDX1xhjPuH3Fg=]",
|
||||
"[trinity-1686a@pad-debug.deuxfleurs.fr/Pu6Ef03jEsAGBbZI6IOdKd6+5pORD5N51QIYt4-Ys1c=]",
|
||||
"[Jill@pad.deuxfleurs.fr/tLW7W8EVNB2KYETXEaOYR+HmNiBQtZj7u+SOxS3hGmg=]",
|
||||
"[vincent@pad.deuxfleurs.fr/07FQiE8w1iztRWwzbRJzEy3xIqnNR31mUFjLNiGXjwU=]",
|
||||
"[boris@pad.deuxfleurs.fr/kHo5LIhSxDFk39GuhGRp+XKlMjNe+lWfFWM75cINoTQ=]",
|
||||
"[maximilien@pad.deuxfleurs.fr/UoXHLejYRUjvX6t55hAQKpjMdU-3ecg4eDhAeckZmyE=]",
|
||||
"[armael@pad-debug.deuxfleurs.fr/CIKMvNdFxGavwTmni0TnR3x9GM0ypgx3DMcFyzppplU=]",
|
||||
"[bjonglez@pad-debug.deuxfleurs.fr/+RRzwcLPj5ZCWELUXMjmt3u+-lvYnyhpDt4cqAn9nh8=]"
|
||||
],
|
||||
|
||||
/* =====================
|
||||
* STORAGE
|
||||
* ===================== */
|
||||
|
||||
/* Pads that are not 'pinned' by any registered user can be set to expire
|
||||
* after a configurable number of days of inactivity (default 90 days).
|
||||
* The value can be changed or set to false to remove expiration.
|
||||
* Expired pads can then be removed using a cron job calling the
|
||||
* `evict-inactive.js` script with node
|
||||
*
|
||||
* defaults to 90 days if nothing is provided
|
||||
*/
|
||||
//inactiveTime: 90, // days
|
||||
|
||||
/* CryptPad archives some data instead of deleting it outright.
|
||||
* This archived data still takes up space and so you'll probably still want to
|
||||
* remove these files after a brief period.
|
||||
*
|
||||
* cryptpad/scripts/evict-inactive.js is intended to be run daily
|
||||
* from a crontab or similar scheduling service.
|
||||
*
|
||||
* The intent with this feature is to provide a safety net in case of accidental
|
||||
* deletion. Set this value to the number of days you'd like to retain
|
||||
* archived data before it's removed permanently.
|
||||
*
|
||||
* defaults to 15 days if nothing is provided
|
||||
*/
|
||||
//archiveRetentionTime: 15,
|
||||
|
||||
/* It's possible to configure your instance to remove data
|
||||
* stored on behalf of inactive accounts. Set 'accountRetentionTime'
|
||||
* to the number of days an account can remain idle before its
|
||||
* documents and other account data is removed.
|
||||
*
|
||||
* Leave this value commented out to preserve all data stored
|
||||
* by user accounts regardless of inactivity.
|
||||
*/
|
||||
//accountRetentionTime: 365,
|
||||
|
||||
/* Starting with CryptPad 3.23.0, the server automatically runs
|
||||
* the script responsible for removing inactive data according to
|
||||
* your configured definition of inactivity. Set this value to `true`
|
||||
* if you prefer not to remove inactive data, or if you prefer to
|
||||
* do so manually using `scripts/evict-inactive.js`.
|
||||
*/
|
||||
//disableIntegratedEviction: true,
|
||||
|
||||
|
||||
/* Max Upload Size (bytes)
|
||||
* this sets the maximum size of any one file uploaded to the server.
|
||||
* anything larger than this size will be rejected
|
||||
* defaults to 20MB if no value is provided
|
||||
*/
|
||||
//maxUploadSize: 20 * 1024 * 1024,
|
||||
|
||||
/* Users with premium accounts (those with a plan included in their customLimit)
|
||||
* can benefit from an increased upload size limit. By default they are restricted to the same
|
||||
* upload size as any other registered user.
|
||||
*
|
||||
*/
|
||||
//premiumUploadSize: 100 * 1024 * 1024,
|
||||
|
||||
/* =====================
|
||||
* DATABASE VOLUMES
|
||||
* ===================== */
|
||||
|
||||
/*
|
||||
* We need this config entry, else CryptPad will try to mkdir
|
||||
* some stuff into Nix store apparently...
|
||||
*/
|
||||
base: '/mnt/data',
|
||||
|
||||
/*
|
||||
* CryptPad stores each document in an individual file on your hard drive.
|
||||
* Specify a directory where files should be stored.
|
||||
* It will be created automatically if it does not already exist.
|
||||
*/
|
||||
filePath: '/mnt/datastore/',
|
||||
|
||||
/* CryptPad offers the ability to archive data for a configurable period
|
||||
* before deleting it, allowing a means of recovering data in the event
|
||||
* that it was deleted accidentally.
|
||||
*
|
||||
* To set the location of this archive directory to a custom value, change
|
||||
* the path below:
|
||||
*/
|
||||
archivePath: '/mnt/data/archive',
|
||||
|
||||
/* CryptPad allows logged in users to request that particular documents be
|
||||
* stored by the server indefinitely. This is called 'pinning'.
|
||||
* Pin requests are stored in a pin-store. The location of this store is
|
||||
* defined here.
|
||||
*/
|
||||
pinPath: '/mnt/data/pins',
|
||||
|
||||
/* if you would like the list of scheduled tasks to be stored in
|
||||
a custom location, change the path below:
|
||||
*/
|
||||
taskPath: '/mnt/data/tasks',
|
||||
|
||||
/* if you would like users' authenticated blocks to be stored in
|
||||
a custom location, change the path below:
|
||||
*/
|
||||
blockPath: '/mnt/block',
|
||||
|
||||
/* CryptPad allows logged in users to upload encrypted files. Files/blobs
|
||||
* are stored in a 'blob-store'. Set its location here.
|
||||
*/
|
||||
blobPath: '/mnt/blob',
|
||||
|
||||
/* CryptPad stores incomplete blobs in a 'staging' area until they are
|
||||
* fully uploaded. Set its location here.
|
||||
*/
|
||||
blobStagingPath: '/mnt/data/blobstage',
|
||||
|
||||
decreePath: '/mnt/data/decrees',
|
||||
|
||||
/* CryptPad supports logging events directly to the disk in a 'logs' directory
|
||||
* Set its location here, or set it to false (or nothing) if you'd rather not log
|
||||
*/
|
||||
logPath: false,
|
||||
|
||||
/* =====================
|
||||
* Debugging
|
||||
* ===================== */
|
||||
|
||||
/* CryptPad can log activity to stdout
|
||||
* This may be useful for debugging
|
||||
*/
|
||||
logToStdout: true,
|
||||
|
||||
/* CryptPad can be configured to log more or less
|
||||
* the various settings are listed below by order of importance
|
||||
*
|
||||
* silly, verbose, debug, feedback, info, warn, error
|
||||
*
|
||||
* Choose the least important level of logging you wish to see.
|
||||
* For example, a 'silly' logLevel will display everything,
|
||||
* while 'info' will display 'info', 'warn', and 'error' logs
|
||||
*
|
||||
* This will affect both logging to the console and the disk.
|
||||
*/
|
||||
logLevel: 'silly',
|
||||
|
||||
/* clients can use the /settings/ app to opt out of usage feedback
|
||||
* which informs the server of things like how much each app is being
|
||||
* used, and whether certain clientside features are supported by
|
||||
* the client's browser. The intent is to provide feedback to the admin
|
||||
* such that the service can be improved. Enable this with `true`
|
||||
* and ignore feedback with `false` or by commenting the attribute
|
||||
*
|
||||
* You will need to set your logLevel to include 'feedback'. Set this
|
||||
* to false if you'd like to exclude feedback from your logs.
|
||||
*/
|
||||
logFeedback: false,
|
||||
|
||||
/* CryptPad supports verbose logging
|
||||
* (false by default)
|
||||
*/
|
||||
verbose: true,
|
||||
|
||||
/* Surplus information:
|
||||
*
|
||||
* 'installMethod' is included in server telemetry to voluntarily
|
||||
* indicate how many instances are using unofficial installation methods
|
||||
* such as Docker.
|
||||
*
|
||||
*/
|
||||
installMethod: 'deuxfleurs.fr',
|
||||
};
|
|
@ -114,7 +114,14 @@ module.exports = {
|
|||
adminKeys: [
|
||||
"[quentin@pad.deuxfleurs.fr/EWtzm-CiqJnM9RZL9mj-YyTgAtX-Zh76sru1K5bFpN8=]",
|
||||
"[adrn@pad.deuxfleurs.fr/PxDpkPwd-jDJWkfWdAzFX7wtnLpnPlBeYZ4MmoEYS6E=]",
|
||||
"[lx@pad.deuxfleurs.fr/FwQzcXywx1FIb83z6COB7c3sHnz8rNSDX1xhjPuH3Fg=]"
|
||||
"[lx@pad.deuxfleurs.fr/FwQzcXywx1FIb83z6COB7c3sHnz8rNSDX1xhjPuH3Fg=]",
|
||||
"[trinity-1686a@pad.deuxfleurs.fr/Pu6Ef03jEsAGBbZI6IOdKd6+5pORD5N51QIYt4-Ys1c=]",
|
||||
"[Jill@pad.deuxfleurs.fr/tLW7W8EVNB2KYETXEaOYR+HmNiBQtZj7u+SOxS3hGmg=]",
|
||||
"[vincent@pad.deuxfleurs.fr/07FQiE8w1iztRWwzbRJzEy3xIqnNR31mUFjLNiGXjwU=]",
|
||||
"[boris@pad.deuxfleurs.fr/kHo5LIhSxDFk39GuhGRp+XKlMjNe+lWfFWM75cINoTQ=]",
|
||||
"[maximilien@pad.deuxfleurs.fr/UoXHLejYRUjvX6t55hAQKpjMdU-3ecg4eDhAeckZmyE=]",
|
||||
"[armael@pad.deuxfleurs.fr/CIKMvNdFxGavwTmni0TnR3x9GM0ypgx3DMcFyzppplU=]",
|
||||
"[bjonglez@pad.deuxfleurs.fr/+RRzwcLPj5ZCWELUXMjmt3u+-lvYnyhpDt4cqAn9nh8=]"
|
||||
],
|
||||
|
||||
/* =====================
|
||||
|
@ -183,6 +190,12 @@ module.exports = {
|
|||
* DATABASE VOLUMES
|
||||
* ===================== */
|
||||
|
||||
/*
|
||||
* We need this config entry, else CryptPad will try to mkdir
|
||||
* some stuff into Nix store apparently...
|
||||
*/
|
||||
base: '/mnt/data',
|
||||
|
||||
/*
|
||||
* CryptPad stores each document in an individual file on your hard drive.
|
||||
* Specify a directory where files should be stored.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
job "cryptpad" {
|
||||
datacenters = ["neptune"]
|
||||
datacenters = ["scorpio"]
|
||||
type = "service"
|
||||
|
||||
group "cryptpad" {
|
||||
|
@ -22,11 +22,11 @@ job "cryptpad" {
|
|||
constraint {
|
||||
attribute = "${attr.unique.hostname}"
|
||||
operator = "="
|
||||
value = "concombre"
|
||||
value = "abricot"
|
||||
}
|
||||
|
||||
config {
|
||||
image = "kokakiwi/cryptpad:2024.3.0"
|
||||
image = "kokakiwi/cryptpad:2024.9.0"
|
||||
ports = [ "http" ]
|
||||
|
||||
volumes = [
|
||||
|
@ -63,6 +63,10 @@ job "cryptpad" {
|
|||
"tricot pad-sandbox.deuxfleurs.fr",
|
||||
"tricot-add-header Cross-Origin-Resource-Policy cross-origin",
|
||||
"tricot-add-header Cross-Origin-Embedder-Policy require-corp",
|
||||
"tricot-add-header Access-Control-Allow-Origin *",
|
||||
"tricot-add-header Access-Control-Allow-Credentials true",
|
||||
"d53-cname pad.deuxfleurs.fr",
|
||||
"d53-cname pad-sandbox.deuxfleurs.fr",
|
||||
]
|
||||
check {
|
||||
type = "http"
|
||||
|
|
|
@ -83,11 +83,14 @@ smtpd_forbid_unauth_pipelining = yes
|
|||
smtpd_discard_ehlo_keywords = chunking
|
||||
smtpd_forbid_bare_newline = yes
|
||||
|
||||
smtpd_client_connection_rate_limit = 2
|
||||
|
||||
#===
|
||||
# Rate limiting
|
||||
#===
|
||||
smtpd_client_connection_rate_limit = 2
|
||||
# do not rate-limit ourselves
|
||||
# in particular, useful for forgejo who opens a lot of SMTP connections
|
||||
smtpd_client_event_limit_exceptions = $mynetworks /etc/postfix/rate-limit-exceptions
|
||||
|
||||
slow_destination_recipient_limit = 20
|
||||
slow_destination_concurrency_limit = 2
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
job "email-android7" {
|
||||
datacenters = ["neptune"]
|
||||
# Should not run on the same site as email.hcl (port conflict in diplonat)
|
||||
datacenters = ["scorpio", "bespin"]
|
||||
type = "service"
|
||||
priority = 100
|
||||
|
||||
|
@ -41,7 +42,7 @@ job "email-android7" {
|
|||
|
||||
resources {
|
||||
cpu = 50
|
||||
memory = 50
|
||||
memory = 200
|
||||
}
|
||||
|
||||
service {
|
||||
|
@ -95,7 +96,7 @@ job "email-android7" {
|
|||
|
||||
resources {
|
||||
cpu = 50
|
||||
memory = 50
|
||||
memory = 200
|
||||
}
|
||||
|
||||
service {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
job "email" {
|
||||
# Should not run on the same site as email-android7.hcl (port conflict in diplonat)
|
||||
datacenters = ["scorpio"]
|
||||
type = "service"
|
||||
priority = 65
|
||||
|
@ -381,6 +382,29 @@ job "email" {
|
|||
destination = "secrets/postfix/transport"
|
||||
}
|
||||
|
||||
template {
|
||||
# Collect machine IPs from the cluster.
|
||||
# We use intermediate maps to ensure we get a sorted list with no duplicates,
|
||||
# so that it is robust wrt. changes in the order of the output of ls or
|
||||
# addition of new machines in an existing site.
|
||||
# (scratch.MapValues returns the list of *values* in the map, sorted by *key*)
|
||||
data = <<EOH
|
||||
{{- range ls "diplonat/autodiscovery/ipv4" }}
|
||||
{{- with $a := .Value | parseJSON }}
|
||||
{{- scratch.MapSet "ipv4" $a.address $a.address }}
|
||||
{{- end }}
|
||||
{{- end -}}
|
||||
{{- range ls "diplonat/autodiscovery/ipv6" }}
|
||||
{{- with $a := .Value | parseJSON }}
|
||||
{{- scratch.MapSet "ipv6" $a.address $a.address }}
|
||||
{{- end }}
|
||||
{{- end -}}
|
||||
{{- range scratch.MapValues "ipv4" }}{{ . }} {{ end }}
|
||||
{{- range scratch.MapValues "ipv6" }}[{{ . }}] {{ end }}
|
||||
EOH
|
||||
destination = "secrets/postfix/rate-limit-exceptions"
|
||||
}
|
||||
|
||||
# --- secrets ---
|
||||
template {
|
||||
data = "{{ with $d := key \"tricot/certs/smtp.deuxfleurs.fr\" | parseJSON }}{{ $d.cert_pem }}{{ end }}"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
job "garage" {
|
||||
datacenters = [ "neptune", "bespin", "scorpio" ]
|
||||
datacenters = ["neptune", "bespin", "scorpio", "corrin"]
|
||||
type = "system"
|
||||
priority = 80
|
||||
|
||||
|
@ -26,7 +26,7 @@ job "garage" {
|
|||
task "server" {
|
||||
driver = "docker"
|
||||
config {
|
||||
image = "dxflrs/garage:v1.0.0-rc1"
|
||||
image = "superboum/garage:v1.0.0-rc1-hotfix-red-ftr-wquorum"
|
||||
command = "/garage"
|
||||
args = [ "server" ]
|
||||
network_mode = "host"
|
||||
|
@ -80,9 +80,9 @@ job "garage" {
|
|||
#### Configuration for service ports: admin port (internal use only)
|
||||
|
||||
service {
|
||||
name = "garage-admin"
|
||||
port = "admin"
|
||||
address_mode = "host"
|
||||
name = "garage-admin"
|
||||
# Check that Garage is alive and answering TCP connections
|
||||
check {
|
||||
type = "tcp"
|
||||
|
@ -96,18 +96,19 @@ job "garage" {
|
|||
}
|
||||
}
|
||||
|
||||
#### Configuration for service ports: externally available ports (API, web)
|
||||
#### Configuration for service ports: externally available ports (S3 API, K2V, web)
|
||||
|
||||
service {
|
||||
name = "garage-api"
|
||||
tags = [
|
||||
"garage_api",
|
||||
"tricot garage.deuxfleurs.fr",
|
||||
"tricot *.garage.deuxfleurs.fr",
|
||||
"tricot-on-demand-tls-ask http://garage-admin.service.prod.consul:3903/check",
|
||||
"tricot-site-lb",
|
||||
]
|
||||
port = "s3"
|
||||
address_mode = "host"
|
||||
name = "garage-api"
|
||||
# Check 1: Garage is alive and answering TCP connections
|
||||
check {
|
||||
name = "garage-api-live"
|
||||
|
@ -132,6 +133,39 @@ job "garage" {
|
|||
}
|
||||
|
||||
service {
|
||||
name = "garage-k2v"
|
||||
tags = [
|
||||
"garage_k2v",
|
||||
"tricot k2v.deuxfleurs.fr",
|
||||
"tricot-site-lb",
|
||||
]
|
||||
port = "k2v"
|
||||
address_mode = "host"
|
||||
# Check 1: Garage is alive and answering TCP connections
|
||||
check {
|
||||
name = "garage-k2v-live"
|
||||
type = "tcp"
|
||||
interval = "60s"
|
||||
timeout = "5s"
|
||||
check_restart {
|
||||
limit = 3
|
||||
grace = "90s"
|
||||
ignore_warnings = false
|
||||
}
|
||||
}
|
||||
# Check 2: Garage is in a healthy state and requests should be routed here
|
||||
check {
|
||||
name = "garage-k2v-healthy"
|
||||
port = "admin"
|
||||
type = "http"
|
||||
path = "/health"
|
||||
interval = "60s"
|
||||
timeout = "5s"
|
||||
}
|
||||
}
|
||||
|
||||
service {
|
||||
name = "garage-web"
|
||||
tags = [
|
||||
"garage-web",
|
||||
"tricot * 1",
|
||||
|
@ -144,7 +178,6 @@ job "garage" {
|
|||
]
|
||||
port = "web"
|
||||
address_mode = "host"
|
||||
name = "garage-web"
|
||||
# Check 1: Garage is alive and answering TCP connections
|
||||
check {
|
||||
name = "garage-web-live"
|
||||
|
@ -183,39 +216,6 @@ job "garage" {
|
|||
port = "web"
|
||||
on_update = "ignore"
|
||||
}
|
||||
|
||||
|
||||
service {
|
||||
tags = [
|
||||
"garage_k2v",
|
||||
"tricot k2v.deuxfleurs.fr",
|
||||
"tricot-site-lb",
|
||||
]
|
||||
port = "k2v"
|
||||
address_mode = "host"
|
||||
name = "garage-k2v"
|
||||
# Check 1: Garage is alive and answering TCP connections
|
||||
check {
|
||||
name = "garage-k2v-live"
|
||||
type = "tcp"
|
||||
interval = "60s"
|
||||
timeout = "5s"
|
||||
check_restart {
|
||||
limit = 3
|
||||
grace = "90s"
|
||||
ignore_warnings = false
|
||||
}
|
||||
}
|
||||
# Check 2: Garage is in a healthy state and requests should be routed here
|
||||
check {
|
||||
name = "garage-k2v-healthy"
|
||||
port = "admin"
|
||||
type = "http"
|
||||
path = "/health"
|
||||
interval = "60s"
|
||||
timeout = "5s"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
62
cluster/prod/app/guichet/deploy/guichet.hcl
Normal file
62
cluster/prod/app/guichet/deploy/guichet.hcl
Normal file
|
@ -0,0 +1,62 @@
|
|||
job "guichet" {
|
||||
datacenters = ["corrin", "neptune", "scorpio"]
|
||||
type = "service"
|
||||
priority = 90
|
||||
|
||||
group "guichet" {
|
||||
count = 1
|
||||
|
||||
network {
|
||||
port "web_port" { to = 9991 }
|
||||
}
|
||||
|
||||
task "guichet" {
|
||||
driver = "docker"
|
||||
config {
|
||||
image = "dxflrs/guichet:0x4y7bj1qb8w8hckvpbzlgyxh63j66ij"
|
||||
args = [ "server", "-config", "/etc/config.json" ]
|
||||
readonly_rootfs = true
|
||||
ports = [ "web_port" ]
|
||||
volumes = [
|
||||
"secrets/config.json:/etc/config.json"
|
||||
]
|
||||
}
|
||||
|
||||
template {
|
||||
data = file("../config/guichet/config.json.tpl")
|
||||
destination = "secrets/config.json"
|
||||
}
|
||||
|
||||
resources {
|
||||
# limite de mémoire un peu élevée par précaution.
|
||||
# avec 200M, j'ai observé guichet se faire OOM-killed au moment
|
||||
# où un nouvel utilisateur clique sur un lien d'invitation
|
||||
# fraichement généré.
|
||||
memory = 300
|
||||
}
|
||||
|
||||
service {
|
||||
name = "guichet"
|
||||
tags = [
|
||||
"guichet",
|
||||
"tricot guichet.deuxfleurs.fr",
|
||||
"d53-cname guichet.deuxfleurs.fr",
|
||||
]
|
||||
port = "web_port"
|
||||
address_mode = "host"
|
||||
check {
|
||||
type = "tcp"
|
||||
port = "web_port"
|
||||
interval = "60s"
|
||||
timeout = "5s"
|
||||
check_restart {
|
||||
limit = 3
|
||||
grace = "90s"
|
||||
ignore_warnings = false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -6,16 +6,17 @@ services:
|
|||
context: ./jitsi-meet
|
||||
args:
|
||||
# https://github.com/jitsi/jitsi-meet
|
||||
MEET_TAG: stable/jitsi-meet_8252
|
||||
image: superboum/amd64_jitsi_meet:v6
|
||||
MEET_TAG: stable/jitsi-meet_9646
|
||||
NODE_MAJOR_VERSION: 22
|
||||
image: superboum/amd64_jitsi_meet:v7
|
||||
|
||||
jitsi-conference-focus:
|
||||
build:
|
||||
context: ./jitsi-conference-focus
|
||||
args:
|
||||
# https://github.com/jitsi/jicofo
|
||||
JICOFO_TAG: stable/jitsi-meet_8252
|
||||
image: superboum/amd64_jitsi_conference_focus:v10
|
||||
JICOFO_TAG: stable/jitsi-meet_9646
|
||||
image: superboum/amd64_jitsi_conference_focus:v11
|
||||
|
||||
jitsi-videobridge:
|
||||
build:
|
||||
|
@ -23,13 +24,13 @@ services:
|
|||
args:
|
||||
# https://github.com/jitsi/jitsi-videobridge
|
||||
# note: JVB is not tagged with non-stable tags
|
||||
JVB_TAG: stable/jitsi-meet_8252
|
||||
image: superboum/amd64_jitsi_videobridge:v21
|
||||
JVB_TAG: stable/jitsi-meet_9646
|
||||
image: superboum/amd64_jitsi_videobridge:v22
|
||||
|
||||
jitsi-xmpp:
|
||||
build:
|
||||
context: ./jitsi-xmpp
|
||||
args:
|
||||
MEET_TAG: stable/jitsi-meet_8252
|
||||
PROSODY_VERSION: 1nightly191-1~bookworm
|
||||
image: superboum/amd64_jitsi_xmpp:v11
|
||||
MEET_TAG: stable/jitsi-meet_9646
|
||||
PROSODY_VERSION: 0.12.3-1
|
||||
image: superboum/amd64_jitsi_xmpp:v12
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
FROM debian:bookworm AS builder
|
||||
|
||||
ARG NODE_MAJOR_VERSION
|
||||
RUN apt-get update && \
|
||||
apt-get install -y curl && \
|
||||
curl -sL https://deb.nodesource.com/setup_19.x | bash - && \
|
||||
curl -sL https://deb.nodesource.com/setup_${NODE_MAJOR_VERSION}.x | bash - && \
|
||||
apt-get install -y git nodejs make git unzip
|
||||
|
||||
ARG MEET_TAG
|
||||
|
|
|
@ -6,7 +6,7 @@ if [ -z "${JITSI_NAT_LOCAL_IP}" ]; then
|
|||
fi
|
||||
|
||||
if [ -z "${JITSI_NAT_PUBLIC_IP}" ]; then
|
||||
JITSI_NAT_PUBLIC_IP=$(curl https://ifconfig.me)
|
||||
JITSI_NAT_PUBLIC_IP=$(curl -4 https://ifconfig.me)
|
||||
fi
|
||||
|
||||
echo "NAT config: ${JITSI_NAT_LOCAL_IP} -> ${JITSI_NAT_PUBLIC_IP}"
|
||||
|
|
|
@ -13,8 +13,8 @@ RUN apt-get update && \
|
|||
apt-get install -y wget gnupg2 extrepo && \
|
||||
extrepo enable prosody && \
|
||||
apt-get update && \
|
||||
apt-cache show prosody-0.12 && \
|
||||
apt-get install -y prosody-0.12=${PROSODY_VERSION} lua-event
|
||||
apt-cache show prosody && \
|
||||
apt-get install -y prosody=${PROSODY_VERSION} lua-event
|
||||
|
||||
RUN mkdir -p /usr/local/share/ca-certificates/ && \
|
||||
ln -sf \
|
||||
|
|
|
@ -369,7 +369,7 @@ var config = {
|
|||
// Message to show the users. Example: 'The service will be down for
|
||||
// maintenance at 01:00 AM GMT,
|
||||
// Does only support plaintext. No line skip.
|
||||
// noticeMessage: "Suite à une utilisation contraire à nos CGU, Deuxfleurs surveille activement cette instance Jitsi et enverra tout contenu illégal à la police. Pour toute question, commentaire ou suggestion, contactez moderation@deuxfleurs.fr . Following usage breaching our TOS, Deuxfleurs actively monitors this Jitsi instance and will send any illegal behavior to the Police. For any question, remark or suggestion, reach moderation@deuxfleurs.fr",
|
||||
// noticeMessage: "Suite à une utilisation contraire à nos CGU, Deuxfleurs surveille activement cette instance Jitsi et enverra tout contenu illégal à la police. Pour toute question, commentaire ou suggestion, contactez moderation@deuxfleurs.fr . Following usage breaching our TOS, Deuxfleurs actively monitors this Jitsi instance and will send any illegal behavior to the Police. For any question, remark or suggestion, reach moderation@deuxfleurs.fr",
|
||||
|
||||
// Enables calendar integration, depends on googleApiApplicationClientID
|
||||
// and microsoftApiApplicationClientID
|
||||
|
|
|
@ -81,6 +81,12 @@ http {
|
|||
alias /srv/jitsi-meet/$1/$2;
|
||||
}
|
||||
|
||||
# Disallow robots indexation
|
||||
location = /robots.txt {
|
||||
add_header Content-Type text/plain;
|
||||
return 200 "User-agent: *\nDisallow: /\n";
|
||||
}
|
||||
|
||||
# not used yet VVV
|
||||
# colibri (JVB) websockets
|
||||
#location ~ ^/colibri-ws/([a-zA-Z0-9-\.]+)/(.*) {
|
||||
|
@ -92,12 +98,12 @@ http {
|
|||
#}
|
||||
|
||||
|
||||
location ~ "2daut2wank2|2duat2wank|2duat2wank0|2duat2wank1|2duat2wank2|2duat2wank3|2duatr2wank|2duatr2wank0|2duatr2wank1|2duatr2wank2|2wank2daut2|daut1|duat2wank|duat2wank2|duatr2wank2|prettypanties|slutgfs|wabk2daugther|wank2daugther|wank2daut|wank2daut2|wank2daut3|wankwatch" {
|
||||
location ~* {{ key "secrets/jitsi/blacklist_regex" }} {
|
||||
return 302 https://www.service-public.fr/particuliers/vosdroits/R17674;
|
||||
}
|
||||
|
||||
location = /http-bind {
|
||||
if ($args ~ "2daut2wank2|2duat2wank|2duat2wank0|2duat2wank1|2duat2wank2|2duat2wank3|2duatr2wank|2duatr2wank0|2duatr2wank1|2duatr2wank2|2wank2daut2|daut1|duat2wank|duat2wank2|duatr2wank2|prettypanties|slutgfs|wabk2daugther|wank2daugther|wank2daut|wank2daut2|wank2daut3|wankwatch") {
|
||||
if ($args ~* {{ key "secrets/jitsi/blacklist_regex" }}) {
|
||||
return 403 'forbidden';
|
||||
}
|
||||
|
||||
|
|
|
@ -115,7 +115,8 @@ videobridge {
|
|||
# (e.g. health or debug stats)
|
||||
private {
|
||||
# See JettyBundleActivatorConfig in Jicoco for values
|
||||
host = 127.0.0.1
|
||||
host = 0.0.0.0
|
||||
port = {{ env "NOMAD_PORT_management_port" }}
|
||||
}
|
||||
}
|
||||
octo {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
job "jitsi" {
|
||||
datacenters = ["neptune", "scorpio"]
|
||||
datacenters = ["neptune", "scorpio", "corrin"]
|
||||
type = "service"
|
||||
|
||||
priority = 50
|
||||
|
@ -20,7 +20,7 @@ job "jitsi" {
|
|||
task "xmpp" {
|
||||
driver = "docker"
|
||||
config {
|
||||
image = "superboum/amd64_jitsi_xmpp:v11"
|
||||
image = "superboum/amd64_jitsi_xmpp:v12"
|
||||
ports = [ "bosh_port", "xmpp_port" ]
|
||||
network_mode = "host"
|
||||
volumes = [
|
||||
|
@ -101,7 +101,7 @@ EOF
|
|||
task "front" {
|
||||
driver = "docker"
|
||||
config {
|
||||
image = "superboum/amd64_jitsi_meet:v6"
|
||||
image = "superboum/amd64_jitsi_meet:v7"
|
||||
network_mode = "host"
|
||||
ports = [ "https_port" ]
|
||||
volumes = [
|
||||
|
@ -168,7 +168,7 @@ EOF
|
|||
task "jicofo" {
|
||||
driver = "docker"
|
||||
config {
|
||||
image = "superboum/amd64_jitsi_conference_focus:v10"
|
||||
image = "superboum/amd64_jitsi_conference_focus:v11"
|
||||
network_mode = "host"
|
||||
volumes = [
|
||||
"secrets/certs/jitsi.crt:/usr/local/share/ca-certificates/jitsi.crt",
|
||||
|
@ -203,14 +203,15 @@ EOF
|
|||
group "data_plane" {
|
||||
network {
|
||||
port "video_port" { static = 8080 }
|
||||
port "management_port" { static = 8000 }
|
||||
}
|
||||
|
||||
task "videobridge" {
|
||||
driver = "docker"
|
||||
config {
|
||||
image = "superboum/amd64_jitsi_videobridge:v21"
|
||||
image = "superboum/amd64_jitsi_videobridge:v22"
|
||||
network_mode = "host"
|
||||
ports = [ "video_port" ]
|
||||
ports = [ "video_port", "management_port" ]
|
||||
ulimit {
|
||||
nofile = "1048576:1048576"
|
||||
nproc = "65536:65536"
|
||||
|
@ -222,11 +223,14 @@ EOF
|
|||
]
|
||||
}
|
||||
|
||||
env {
|
||||
# Our container can autodetect the public IP with the ifconfig.me service
|
||||
# However we would like to avoid relying on a 3rd party service for production use
|
||||
# That's why I am setting the public IP address statically here VVVV
|
||||
JITSI_NAT_PUBLIC_IP = "${meta.public_ipv4}"
|
||||
template {
|
||||
data = <<EOH
|
||||
{{ with $a := env "attr.unique.hostname" | printf "diplonat/autodiscovery/ipv4/%s" | key | parseJSON }}
|
||||
JITSI_NAT_PUBLIC_IP = {{ $a.address }}
|
||||
{{ end }}
|
||||
EOH
|
||||
destination = "secrets/jitsi-videobridge.env"
|
||||
env = true
|
||||
}
|
||||
|
||||
template {
|
||||
|
@ -256,9 +260,16 @@ EOF
|
|||
port = "video_port"
|
||||
address_mode = "host"
|
||||
name = "video-jitsi"
|
||||
}
|
||||
|
||||
service {
|
||||
tags = [ "jitsi" ]
|
||||
port = "management_port"
|
||||
address_mode = "host"
|
||||
name = "management-video-jitsi"
|
||||
check {
|
||||
type = "tcp"
|
||||
port = "video_port"
|
||||
port = "management_port"
|
||||
interval = "60s"
|
||||
timeout = "5s"
|
||||
}
|
||||
|
|
|
@ -52,7 +52,7 @@ But maybe this value is deprecated: the check is still here but it is not used a
|
|||
start a maintainance container
|
||||
|
||||
```
|
||||
docker run --rm -it -v `pwd`/prosody/certs/:/var/lib/prosody/ -v `pwd`/prosody/prosody.cfg.lua:/etc/prosody/prosody.cfg.lua:ro --user root superboum/amd64_jitsi_xmpp:v11 bash
|
||||
docker run --rm -it -v `pwd`/prosody/certs/:/var/lib/prosody/ -v `pwd`/prosody/prosody.cfg.lua:/etc/prosody/prosody.cfg.lua:ro --user root superboum/amd64_jitsi_xmpp:v12 bash
|
||||
```
|
||||
|
||||
then generate certificates from inside this container
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
version: '3.4'
|
||||
services:
|
||||
jitsi-xmpp:
|
||||
image: superboum/amd64_jitsi_xmpp:v11
|
||||
image: superboum/amd64_jitsi_xmpp:v12
|
||||
volumes:
|
||||
- "./prosody/prosody.cfg.lua:/etc/prosody/prosody.cfg.lua:ro"
|
||||
- "./prosody/certs/jitsi.crt:/var/lib/prosody/jitsi.crt:ro"
|
||||
|
@ -11,16 +11,19 @@ services:
|
|||
environment:
|
||||
- JICOFO_AUTH_PASSWORD=jicofopass
|
||||
- JVB_AUTH_PASSWORD=jvbpass
|
||||
ports:
|
||||
- "5222:5222/tcp"
|
||||
|
||||
jitsi-conference-focus:
|
||||
image: superboum/amd64_jitsi_conference_focus:v10
|
||||
image: superboum/amd64_jitsi_conference_focus:v11
|
||||
volumes:
|
||||
- "./prosody/certs/jitsi.crt:/usr/local/share/ca-certificates/jitsi.crt:ro"
|
||||
- "./prosody/certs/auth.jitsi.crt:/usr/local/share/ca-certificates/auth.jitsi.crt:ro"
|
||||
- "./jicofo/jicofo.conf:/etc/jitsi/jicofo.conf:ro"
|
||||
|
||||
jitsi-videobridge:
|
||||
image: superboum/amd64_jitsi_videobridge:v21
|
||||
image: superboum/amd64_jitsi_videobridge:v22
|
||||
network_mode: "host"
|
||||
volumes:
|
||||
- "./prosody/certs/jitsi.crt:/usr/local/share/ca-certificates/jitsi.crt:ro"
|
||||
- "./prosody/certs/auth.jitsi.crt:/usr/local/share/ca-certificates/auth.jitsi.crt:ro"
|
||||
|
@ -31,7 +34,7 @@ services:
|
|||
- "10000:10000/udp"
|
||||
|
||||
jitsi-meet:
|
||||
image: superboum/amd64_jitsi_meet:v6
|
||||
image: superboum/amd64_jitsi_meet:v7
|
||||
volumes:
|
||||
- "./prosody/certs/jitsi.crt:/etc/nginx/jitsi.crt:ro"
|
||||
- "./prosody/certs/jitsi.key:/etc/nginx/jitsi.key:ro"
|
||||
|
|
|
@ -62,7 +62,7 @@ videobridge {
|
|||
|
||||
configs {
|
||||
unique-xmpp-server {
|
||||
hostname="jitsi-xmpp"
|
||||
hostname="172.17.0.1"
|
||||
domain = "auth.jitsi"
|
||||
username = "jvb"
|
||||
password = "jvbpass"
|
||||
|
|
|
@ -22,7 +22,7 @@ var config = {
|
|||
},
|
||||
|
||||
// BOSH URL. FIXME: use XEP-0156 to discover it.
|
||||
bosh: '//192.168.1.143/http-bind',
|
||||
bosh: '//[2a0c:e303:0:2a00::de6]/http-bind',
|
||||
|
||||
// Websocket URL
|
||||
// websocket: 'wss://jitsi-meet.example.com/xmpp-websocket',
|
||||
|
|
14
cluster/prod/app/matrix/README.md
Normal file
14
cluster/prod/app/matrix/README.md
Normal file
|
@ -0,0 +1,14 @@
|
|||
# Informations relatives à la config Matrix
|
||||
|
||||
## Ressources
|
||||
|
||||
- La doc de Synapse est là : https://element-hq.github.io/synapse/latest/welcome_and_overview.html
|
||||
|
||||
### Métriques
|
||||
|
||||
- La page pour configurer les metrics : https://element-hq.github.io/synapse/latest/usage/configuration/config_documentation.html?highlight=metrics#metrics
|
||||
- La page pour le tutoriel sur configurer les metrics avec Prometheus : https://element-hq.github.io/synapse/latest/metrics-howto.html?highlight=metrics#how-to-monitor-synapse-metrics-using-prometheus
|
||||
|
||||
---
|
||||
|
||||
> Avec Nix on n'aurait pas tous ces problèmes.
|
|
@ -6,18 +6,18 @@ services:
|
|||
context: ./riotweb
|
||||
args:
|
||||
# https://github.com/vector-im/element-web/releases
|
||||
VERSION: 1.11.49
|
||||
image: lxpz/amd64_elementweb:v35
|
||||
VERSION: v1.11.78
|
||||
image: particallydone/amd64_elementweb:v36
|
||||
|
||||
synapse:
|
||||
build:
|
||||
context: ./matrix-synapse
|
||||
args:
|
||||
# https://github.com/matrix-org/synapse/releases
|
||||
VERSION: 1.95.1
|
||||
VERSION: v1.104.0
|
||||
# https://github.com/matrix-org/synapse-s3-storage-provider/commits/main
|
||||
# Update with the latest commit on main each time you update the synapse version
|
||||
# otherwise synapse may fail to launch due to incompatibility issues
|
||||
# see this issue for an example: https://github.com/matrix-org/synapse-s3-storage-provider/issues/64
|
||||
S3_VERSION: v1.2.1
|
||||
image: lxpz/amd64_synapse:v58
|
||||
S3_VERSION: 2c46a764f700e6439afa11c00db827ddf21a9e89
|
||||
image: particallydone/amd64_synapse:v60
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
FROM amd64/debian:bookworm as builder
|
||||
FROM amd64/debian:trixie AS builder
|
||||
|
||||
ARG VERSION
|
||||
ARG S3_VERSION
|
||||
|
@ -22,21 +22,25 @@ RUN apt-get update && \
|
|||
libpq-dev \
|
||||
virtualenv \
|
||||
libxslt1-dev \
|
||||
git && \
|
||||
virtualenv /root/matrix-env -p /usr/bin/python3 && \
|
||||
git
|
||||
|
||||
RUN virtualenv /root/matrix-env -p /usr/bin/python3 && \
|
||||
. /root/matrix-env/bin/activate && \
|
||||
pip3 install \
|
||||
https://github.com/matrix-org/synapse/archive/v${VERSION}.tar.gz#egg=matrix-synapse[matrix-synapse-ldap3,postgres,resources.consent,saml2,url_preview] && \
|
||||
https://github.com/element-hq/synapse/archive/${VERSION}.tar.gz#egg=matrix-synapse[matrix-synapse-ldap3,postgres,resources.consent,saml2,url_preview] && \
|
||||
pip3 install \
|
||||
git+https://github.com/matrix-org/synapse-s3-storage-provider.git@${S3_VERSION}
|
||||
|
||||
FROM amd64/debian:bookworm
|
||||
# WARNING: trixie n'est pas une LTS
|
||||
# mais on est obligé d'avoir la même version que le builder
|
||||
# et le builder veut une version de rustc qui n'est pas dans bookworm (dernière LTS at the time of writing)
|
||||
FROM amd64/debian:trixie
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get -qq -y full-upgrade && \
|
||||
apt-get install -y \
|
||||
python3 \
|
||||
python3-distutils \
|
||||
python3-setuptools \
|
||||
libffi8 \
|
||||
libjpeg62-turbo \
|
||||
libssl3 \
|
||||
|
|
|
@ -1,13 +1,16 @@
|
|||
FROM amd64/debian:buster as builder
|
||||
FROM amd64/debian:trixie as builder
|
||||
|
||||
ARG VERSION
|
||||
WORKDIR /root
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get install -y wget && \
|
||||
wget https://github.com/vector-im/element-web/releases/download/v${VERSION}/element-v${VERSION}.tar.gz && \
|
||||
tar xf element-v${VERSION}.tar.gz && \
|
||||
mv element-v${VERSION}/ riot/
|
||||
apt-get install -y wget
|
||||
|
||||
RUN wget https://github.com/element-hq/element-web/releases/download/${VERSION}/element-${VERSION}.tar.gz && \
|
||||
tar xf element-${VERSION}.tar.gz && \
|
||||
mv element-${VERSION}/ riot/
|
||||
|
||||
# Le conteneur de superboum contient uniquement un serveur web de 5 lignes.
|
||||
# Ca vous ennuie ? On peut publier Riot dans un bucket web Garage, tkt, ça sera Tricot qui servira.
|
||||
FROM superboum/amd64_webserver:v3
|
||||
COPY --from=builder /root/riot /srv/http
|
||||
|
|
|
@ -15,7 +15,7 @@ job "matrix" {
|
|||
driver = "docker"
|
||||
|
||||
config {
|
||||
image = "lxpz/amd64_synapse:v58"
|
||||
image = "particallydone/amd64_synapse:v60"
|
||||
network_mode = "host"
|
||||
readonly_rootfs = true
|
||||
ports = [ "api_port" ]
|
||||
|
@ -101,7 +101,7 @@ job "matrix" {
|
|||
driver = "docker"
|
||||
|
||||
config {
|
||||
image = "lxpz/amd64_synapse:v58"
|
||||
image = "particallydone/amd64_synapse:v60"
|
||||
readonly_rootfs = true
|
||||
command = "/usr/local/bin/matrix-s3-async"
|
||||
work_dir = "/tmp"
|
||||
|
@ -137,7 +137,7 @@ EOH
|
|||
task "riotweb" {
|
||||
driver = "docker"
|
||||
config {
|
||||
image = "lxpz/amd64_elementweb:v35"
|
||||
image = "particallydone/amd64_elementweb:v36"
|
||||
ports = [ "web_port" ]
|
||||
volumes = [
|
||||
"secrets/config.json:/srv/http/config.json"
|
||||
|
@ -190,7 +190,7 @@ EOH
|
|||
driver = "docker"
|
||||
|
||||
config {
|
||||
image = "ghcr.io/matrix-org/sliding-sync:v0.99.12"
|
||||
image = "ghcr.io/matrix-org/sliding-sync:v0.99.16"
|
||||
ports = [ "syncv3_api", "syncv3_metrics" ]
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
job "plume-blog" {
|
||||
datacenters = ["scorpio", "neptune"]
|
||||
datacenters = ["corrin", "neptune", "scorpio"]
|
||||
type = "service"
|
||||
|
||||
group "plume" {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
job "postgres14" {
|
||||
datacenters = ["neptune", "bespin", "scorpio"]
|
||||
datacenters = ["neptune", "bespin", "scorpio", "corrin"]
|
||||
type = "system"
|
||||
priority = 90
|
||||
|
||||
|
@ -19,8 +19,7 @@ job "postgres14" {
|
|||
constraint {
|
||||
attribute = "${attr.unique.hostname}"
|
||||
operator = "set_contains_any"
|
||||
value = "courgette,df-ymf,abricot"
|
||||
# old (orion) = diplotaxis
|
||||
value = "courgette,df-ymf,abricot,pasteque"
|
||||
}
|
||||
|
||||
restart {
|
||||
|
|
|
@ -26,6 +26,16 @@ scrape_configs:
|
|||
cert_file: /etc/prometheus/consul-client.crt
|
||||
key_file: /etc/prometheus/consul-client.key
|
||||
|
||||
- job_name: 'jitsi-videobridge'
|
||||
consul_sd_configs:
|
||||
- server: 'https://localhost:8501'
|
||||
services:
|
||||
- 'management-video-jitsi'
|
||||
tls_config:
|
||||
ca_file: /etc/prometheus/consul-ca.crt
|
||||
cert_file: /etc/prometheus/consul-client.crt
|
||||
key_file: /etc/prometheus/consul-client.key
|
||||
|
||||
- job_name: 'garage'
|
||||
authorization:
|
||||
type: Bearer
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
job "telemetry-service" {
|
||||
datacenters = ["neptune", "scorpio"]
|
||||
datacenters = ["corrin", "scorpio"]
|
||||
type = "service"
|
||||
|
||||
group "grafana" {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
job "telemetry-storage" {
|
||||
datacenters = ["neptune", "bespin"]
|
||||
datacenters = ["scorpio", "bespin"]
|
||||
type = "service"
|
||||
|
||||
group "prometheus" {
|
||||
|
@ -14,13 +14,13 @@ job "telemetry-storage" {
|
|||
constraint {
|
||||
attribute = "${attr.unique.hostname}"
|
||||
operator = "set_contains_any"
|
||||
value = "celeri,df-ymk"
|
||||
value = "ananas,df-ymk"
|
||||
}
|
||||
|
||||
task "prometheus" {
|
||||
driver = "docker"
|
||||
config {
|
||||
image = "prom/prometheus:v2.46.0"
|
||||
image = "prom/prometheus:v2.50.1"
|
||||
network_mode = "host"
|
||||
ports = [ "prometheus" ]
|
||||
args = [
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
job "telemetry-system" {
|
||||
datacenters = ["neptune", "scorpio", "bespin"]
|
||||
datacenters = ["neptune", "scorpio", "bespin", "corrin"]
|
||||
type = "system"
|
||||
priority = "100"
|
||||
|
||||
|
@ -12,7 +12,7 @@ job "telemetry-system" {
|
|||
driver = "docker"
|
||||
|
||||
config {
|
||||
image = "quay.io/prometheus/node-exporter:v1.6.1"
|
||||
image = "quay.io/prometheus/node-exporter:v1.7.0"
|
||||
network_mode = "host"
|
||||
volumes = [
|
||||
"/:/host:ro,rslave"
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
job "woodpecker-ci" {
|
||||
# prefer scorpio as neptune has bad ipv6 routes to git.deuxfleurs.fr
|
||||
# and bad networking makes woodpecker fail to run builds
|
||||
datacenters = [/*"neptune",*/ "scorpio"]
|
||||
datacenters = ["neptune", "scorpio"]
|
||||
type = "service"
|
||||
|
||||
group "server" {
|
||||
|
@ -25,7 +23,7 @@ job "woodpecker-ci" {
|
|||
task "server" {
|
||||
driver = "docker"
|
||||
config {
|
||||
image = "woodpeckerci/woodpecker-server:v2.3.0"
|
||||
image = "woodpeckerci/woodpecker-server:v2.7.1"
|
||||
ports = [ "web_port", "grpc_port" ]
|
||||
network_mode = "host"
|
||||
}
|
||||
|
@ -123,6 +121,7 @@ http {
|
|||
listen [::]:14453 ssl;
|
||||
http2 on;
|
||||
server_name woodpecker.deuxfleurs.fr;
|
||||
resolver 127.0.0.1 valid=30s;
|
||||
|
||||
ssl_certificate "/etc/ssl/certs/woodpecker.cert";
|
||||
ssl_certificate_key "/etc/ssl/certs/woodpecker.key";
|
||||
|
|
|
@ -38,8 +38,8 @@ apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docke
|
|||
## Install the runner
|
||||
|
||||
```bash
|
||||
wget https://git.deuxfleurs.fr/Deuxfleurs/infrastructure/raw/branch/main/app/woodpecker-ci/integration/nix.conf
|
||||
wget https://git.deuxfleurs.fr/Deuxfleurs/infrastructure/raw/branch/main/app/woodpecker-ci/integration/docker-compose.yml
|
||||
wget https://git.deuxfleurs.fr/Deuxfleurs/nixcfg/raw/branch/main/cluster/prod/app/woodpecker-ci/integration/nix.conf
|
||||
wget https://git.deuxfleurs.fr/Deuxfleurs/nixcfg/raw/branch/main/cluster/prod/app/woodpecker-ci/integration/docker-compose.yml
|
||||
```
|
||||
|
||||
Create a new Agent for your runner in the Woodpecker admin, and copy the agent secret value.
|
||||
|
|
|
@ -10,7 +10,7 @@ services:
|
|||
- "./nix.conf:/etc/nix/nix.conf:ro"
|
||||
|
||||
woodpecker-runner:
|
||||
image: woodpeckerci/woodpecker-agent:v2.3.0
|
||||
image: woodpeckerci/woodpecker-agent:v2.4.1
|
||||
restart: always
|
||||
environment:
|
||||
# -- change these for each agent
|
||||
|
|
|
@ -11,20 +11,21 @@
|
|||
siteName = "neptune";
|
||||
publicKey = "VvXT0fPDfWsHxumZqVShpS33dJQAdpJ1E79ZbCBJP34=";
|
||||
address = "10.83.1.1";
|
||||
endpoint = "77.207.15.215:33731";
|
||||
endpoint = "82.67.87.112:33731";
|
||||
};
|
||||
"courgette" = {
|
||||
siteName = "neptune";
|
||||
publicKey = "goTkBJGmzrGDOAjUcdH9G0JekipqSMoaYQdB6IHnzi0=";
|
||||
address = "10.83.1.2";
|
||||
endpoint = "77.207.15.215:33732";
|
||||
endpoint = "82.67.87.112:33732";
|
||||
};
|
||||
"celeri" = {
|
||||
siteName = "neptune";
|
||||
publicKey = "oZDAb8LoLW87ktUHyFFec0VaIar97bqq47mGbdVqJ0U=";
|
||||
address = "10.83.1.3";
|
||||
endpoint = "77.207.15.215:33733";
|
||||
endpoint = "82.67.87.112:33733";
|
||||
};
|
||||
/*
|
||||
"dahlia" = {
|
||||
siteName = "orion";
|
||||
publicKey = "EtRoWBYCdjqgXX0L+uWLg8KxNfIK8k9OTh30tL19bXU=";
|
||||
|
@ -43,23 +44,24 @@
|
|||
address = "10.83.2.3";
|
||||
endpoint = "82.66.80.201:33733";
|
||||
};
|
||||
*/
|
||||
"df-ykl" = {
|
||||
siteName = "bespin";
|
||||
publicKey = "bIjxey/VhBgVrLa0FxN/KISOt2XFmQeSh1MPivUq9gg=";
|
||||
address = "10.83.3.1";
|
||||
endpoint = "109.136.55.235:33731";
|
||||
endpoint = "109.130.116.21:33731";
|
||||
};
|
||||
"df-ymf" = {
|
||||
siteName = "bespin";
|
||||
publicKey = "pUIKv8UBl586O7DBrHBsb9BgNU7WlYQ2r2RSNkD+JAQ=";
|
||||
address = "10.83.3.2";
|
||||
endpoint = "109.136.55.235:33732";
|
||||
endpoint = "109.130.116.21:33732";
|
||||
};
|
||||
"df-ymk" = {
|
||||
siteName = "bespin";
|
||||
publicKey = "VBmpo15iIJP7250NAsF+ryhZc3j+8TZFnE1Djvn5TXI=";
|
||||
address = "10.83.3.3";
|
||||
endpoint = "109.136.55.235:33733";
|
||||
endpoint = "109.130.116.21:33733";
|
||||
};
|
||||
"abricot" = {
|
||||
siteName = "scorpio";
|
||||
|
@ -73,14 +75,54 @@
|
|||
address = "10.83.4.2";
|
||||
endpoint = "82.65.41.110:33742";
|
||||
};
|
||||
"onion" = {
|
||||
siteName = "dathomir";
|
||||
publicKey = "gpeqalqAUaYlMuebv3glQeZyE64+OpkyIHFhfStJQA4=";
|
||||
address = "10.83.5.1";
|
||||
endpoint = "82.64.238.84:33740";
|
||||
};
|
||||
"oseille" = {
|
||||
siteName = "dathomir";
|
||||
publicKey = "T87GzAQt02i00iOMbEm7McA/VL9OBrG/kCrgoNh5MmY=";
|
||||
address = "10.83.5.2";
|
||||
endpoint = "82.64.238.84:33741";
|
||||
};
|
||||
"io" = {
|
||||
siteName = "dathomir";
|
||||
publicKey = "3+VvWJtABOAd6zUCMROhqGbNtkQRtoIkVmYn0M81jQw=";
|
||||
address = "10.83.5.3";
|
||||
endpoint = "82.64.238.84:33742";
|
||||
};
|
||||
"ortie" = {
|
||||
siteName = "dathomir";
|
||||
publicKey = "tbx2mvt3TN3Xd+ermwwZ6it80VWT5949cKH9BRFgvzE=";
|
||||
address = "10.83.5.4";
|
||||
endpoint = "82.64.238.84:33743";
|
||||
};
|
||||
"pamplemousse" = {
|
||||
siteName = "corrin";
|
||||
publicKey = "6y5GrNXEql12AObuSfOHGxxUKpdlcyapu+juLYOEBhc=";
|
||||
address = "10.83.6.1";
|
||||
endpoint = "45.81.62.36:33731";
|
||||
};
|
||||
"pasteque" = {
|
||||
siteName = "corrin";
|
||||
publicKey = "7vPq0z6JVxTLEebasUlR5Uu4dAFZxfddhjWtIYhCoXw=";
|
||||
address = "10.83.6.2";
|
||||
endpoint = "45.81.62.36:33732";
|
||||
};
|
||||
};
|
||||
|
||||
# Pin Nomad version
|
||||
services.nomad.package = pkgs.nomad_1_6;
|
||||
nixpkgs.config.allowUnfree = true; # Accept nomad's BSL license
|
||||
|
||||
# Bootstrap IPs for Consul cluster,
|
||||
# these are IPs on the Wireguard overlay
|
||||
services.consul.extraConfig.retry_join = [
|
||||
"10.83.1.1" # concombre
|
||||
"10.83.2.1" # dahlia
|
||||
"10.83.3.1" # df-ykl
|
||||
"10.83.4.2" # ananas
|
||||
"10.83.6.1" # pamplemousse
|
||||
];
|
||||
|
||||
deuxfleurs.adminAccounts = {
|
||||
|
@ -128,6 +170,9 @@
|
|||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJX0A2P59or83EKhh32o8XumGz0ToTEsoq89hMbMtr7h"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB540H9kn+Ocs4Wjc1Y3f3OkHFYEqc5IM/FiCyoVVoh3"
|
||||
];
|
||||
kokakiwi = [
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFPTsEgcOtb2bij+Ih8eg8ZqO7d3IMiWykv6deMzlSSS kokakiwi@kira"
|
||||
];
|
||||
};
|
||||
|
||||
# For Garage external communication
|
||||
|
|
|
@ -9,3 +9,9 @@ concombre.machine.deuxfleurs.fr ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL3N0QOFNGkC
|
|||
courgette.machine.deuxfleurs.fr ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPCXJeo6yeQeTN7D7OZwLd8zbyU1jWywlhQ29yyk7x+G
|
||||
abricot.machine.deuxfleurs.fr ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPhHUQtc5lukPMFkiWf/sTgaUpwNFXHCJoQKu4ooRFy+
|
||||
ananas.machine.deuxfleurs.fr ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHs0zAyBy70oyV56qaMaMAKR7VjEDnsm5LEyZJbM95BL
|
||||
onion.machine.deuxfleurs.fr ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINjBQ67fxwuDDzRPveTko/Sgf0cev3tIvlr3CfAmhF0C
|
||||
oseille.machine.deuxfleurs.fr ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAgQdQ5UVFFn+DXN90ut9+V7NtEopQJnES3r8soKTZW4
|
||||
io.machine.deuxfleurs.fr ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIvgCJ7Jew7ou1RZuaT41Sd+ucZAgxUwtdieqNqoC3+T
|
||||
ortie.machine.deuxfleurs.fr ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMqtfIPLk8a5tM6Upj7GQwlIS16nBPrZYVXE2FVlO2Yn
|
||||
pamplemousse.machine.deuxfleurs.fr ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAI0M5qny9yQ6LNzWqPfSlOWwTYpvxQtuSpFiOb6aVtA
|
||||
2001:912:1ac0:2200::201 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAI0M5qny9yQ6LNzWqPfSlOWwTYpvxQtuSpFiOb6aVtA
|
||||
|
|
|
@ -11,5 +11,4 @@
|
|||
deuxfleurs.hostName = "concombre";
|
||||
deuxfleurs.staticIPv4.address = "192.168.1.31";
|
||||
deuxfleurs.staticIPv6.address = "2001:910:1204:1::31";
|
||||
deuxfleurs.isRaftServer = true;
|
||||
}
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
../site/orion.nix
|
|
@ -1,14 +0,0 @@
|
|||
# Configuration file local to this node
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
# Use the GRUB 2 boot loader.
|
||||
boot.loader.grub.enable = true;
|
||||
boot.loader.grub.version = 2;
|
||||
boot.loader.grub.device = "/dev/nvme0n1"; # or "nodev" for efi only
|
||||
|
||||
deuxfleurs.hostName = "diplotaxis";
|
||||
deuxfleurs.staticIPv4.address = "192.168.1.12";
|
||||
deuxfleurs.staticIPv6.address = "2a01:e0a:28f:5e60::12";
|
||||
}
|
|
@ -1 +0,0 @@
|
|||
../site/orion.nix
|
|
@ -1,14 +0,0 @@
|
|||
# Configuration file local to this node
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
# Use the GRUB 2 boot loader.
|
||||
boot.loader.grub.enable = true;
|
||||
boot.loader.grub.version = 2;
|
||||
boot.loader.grub.device = "/dev/nvme0n1"; # or "nodev" for efi only
|
||||
|
||||
deuxfleurs.hostName = "doradille";
|
||||
deuxfleurs.staticIPv4.address = "192.168.1.13";
|
||||
deuxfleurs.staticIPv6.address = "2a01:e0a:28f:5e60::13";
|
||||
}
|
|
@ -1 +0,0 @@
|
|||
../site/orion.nix
|
11
cluster/prod/node/io.nix
Normal file
11
cluster/prod/node/io.nix
Normal file
|
@ -0,0 +1,11 @@
|
|||
{ ... }:
|
||||
{
|
||||
boot.loader.grub.enable = true;
|
||||
boot.loader.grub.device = "/dev/sda";
|
||||
|
||||
services.openssh.ports = [ 22 33603 ];
|
||||
|
||||
deuxfleurs.hostName = "io";
|
||||
deuxfleurs.staticIPv4.address = "192.168.1.36";
|
||||
deuxfleurs.staticIPv6.address = "2a01:e0a:5e4:1d0:52e5:49ff:fe5c:5f35";
|
||||
}
|
1
cluster/prod/node/io.site.nix
Symbolic link
1
cluster/prod/node/io.site.nix
Symbolic link
|
@ -0,0 +1 @@
|
|||
../site/dathomir.nix
|
12
cluster/prod/node/onion.nix
Normal file
12
cluster/prod/node/onion.nix
Normal file
|
@ -0,0 +1,12 @@
|
|||
{ ... }:
|
||||
{
|
||||
boot.loader.systemd-boot.enable = true;
|
||||
boot.loader.timeout = 20;
|
||||
boot.loader.efi.canTouchEfiVariables = true;
|
||||
|
||||
services.openssh.ports = [ 22 33601 ];
|
||||
|
||||
deuxfleurs.hostName = "onion";
|
||||
deuxfleurs.staticIPv4.address = "192.168.1.34";
|
||||
deuxfleurs.staticIPv6.address = "2a01:e0a:5e4:1d0:223:24ff:feb0:e866";
|
||||
}
|
1
cluster/prod/node/onion.site.nix
Symbolic link
1
cluster/prod/node/onion.site.nix
Symbolic link
|
@ -0,0 +1 @@
|
|||
../site/dathomir.nix
|
12
cluster/prod/node/ortie.nix
Normal file
12
cluster/prod/node/ortie.nix
Normal file
|
@ -0,0 +1,12 @@
|
|||
{ ... }:
|
||||
{
|
||||
boot.loader.systemd-boot.enable = true;
|
||||
boot.loader.timeout = 20;
|
||||
boot.loader.efi.canTouchEfiVariables = true;
|
||||
|
||||
services.openssh.ports = [ 22 33604 ];
|
||||
|
||||
deuxfleurs.hostName = "ortie";
|
||||
deuxfleurs.staticIPv4.address = "192.168.1.37";
|
||||
deuxfleurs.staticIPv6.address = "2a01:e0a:5e4:1d0:223:24ff:feb0:1b9";
|
||||
}
|
1
cluster/prod/node/ortie.site.nix
Symbolic link
1
cluster/prod/node/ortie.site.nix
Symbolic link
|
@ -0,0 +1 @@
|
|||
../site/dathomir.nix
|
12
cluster/prod/node/oseille.nix
Normal file
12
cluster/prod/node/oseille.nix
Normal file
|
@ -0,0 +1,12 @@
|
|||
{ ... }:
|
||||
{
|
||||
boot.loader.systemd-boot.enable = true;
|
||||
boot.loader.timeout = 20;
|
||||
boot.loader.efi.canTouchEfiVariables = true;
|
||||
|
||||
services.openssh.ports = [ 22 33602 ];
|
||||
|
||||
deuxfleurs.hostName = "oseille";
|
||||
deuxfleurs.staticIPv4.address = "192.168.1.35";
|
||||
deuxfleurs.staticIPv6.address = "2a01:e0a:5e4:1d0:223:24ff:feaf:f90b";
|
||||
}
|
1
cluster/prod/node/oseille.site.nix
Symbolic link
1
cluster/prod/node/oseille.site.nix
Symbolic link
|
@ -0,0 +1 @@
|
|||
../site/dathomir.nix
|
15
cluster/prod/node/pamplemousse.nix
Normal file
15
cluster/prod/node/pamplemousse.nix
Normal file
|
@ -0,0 +1,15 @@
|
|||
# Configuration file local to this node
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
# Use the systemd-boot EFI boot loader.
|
||||
boot.loader.systemd-boot.enable = true;
|
||||
boot.loader.timeout = 5;
|
||||
boot.loader.efi.canTouchEfiVariables = true;
|
||||
|
||||
deuxfleurs.hostName = "pamplemousse";
|
||||
deuxfleurs.staticIPv4.address = "192.168.5.201";
|
||||
deuxfleurs.staticIPv6.address = "2001:912:1ac0:2200::201";
|
||||
deuxfleurs.isRaftServer = true;
|
||||
}
|
1
cluster/prod/node/pamplemousse.site.nix
Symbolic link
1
cluster/prod/node/pamplemousse.site.nix
Symbolic link
|
@ -0,0 +1 @@
|
|||
../site/corrin.nix
|
|
@ -5,9 +5,10 @@
|
|||
{
|
||||
# Use the systemd-boot EFI boot loader.
|
||||
boot.loader.systemd-boot.enable = true;
|
||||
boot.loader.timeout = 5;
|
||||
boot.loader.efi.canTouchEfiVariables = true;
|
||||
|
||||
deuxfleurs.hostName = "dahlia";
|
||||
deuxfleurs.staticIPv4.address = "192.168.1.11";
|
||||
deuxfleurs.staticIPv6.address = "2a01:e0a:28f:5e60::11";
|
||||
deuxfleurs.hostName = "pasteque";
|
||||
deuxfleurs.staticIPv4.address = "192.168.5.202";
|
||||
deuxfleurs.staticIPv6.address = "2001:912:1ac0:2200::202";
|
||||
}
|
1
cluster/prod/node/pasteque.site.nix
Symbolic link
1
cluster/prod/node/pasteque.site.nix
Symbolic link
|
@ -0,0 +1 @@
|
|||
../site/corrin.nix
|
8
cluster/prod/site/corrin.nix
Normal file
8
cluster/prod/site/corrin.nix
Normal file
|
@ -0,0 +1,8 @@
|
|||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
deuxfleurs.siteName = "corrin";
|
||||
deuxfleurs.staticIPv4.defaultGateway = "192.168.5.1";
|
||||
deuxfleurs.cnameTarget = "corrin.site.deuxfleurs.fr.";
|
||||
deuxfleurs.publicIPv4 = "45.81.62.36";
|
||||
}
|
7
cluster/prod/site/dathomir.nix
Normal file
7
cluster/prod/site/dathomir.nix
Normal file
|
@ -0,0 +1,7 @@
|
|||
{ ... }:
|
||||
{
|
||||
deuxfleurs.siteName = "dathomir";
|
||||
deuxfleurs.cnameTarget = "dathomir.site.deuxfleurs.fr";
|
||||
deuxfleurs.publicIPv4 = "82.64.238.84";
|
||||
deuxfleurs.staticIPv4.defaultGateway = "192.168.1.1";
|
||||
}
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
{
|
||||
deuxfleurs.siteName = "neptune";
|
||||
deuxfleurs.staticIPv4.defaultGateway = "192.168.1.1";
|
||||
deuxfleurs.staticIPv4.defaultGateway = "192.168.1.254";
|
||||
deuxfleurs.cnameTarget = "neptune.site.deuxfleurs.fr.";
|
||||
deuxfleurs.publicIPv4 = "77.207.15.215";
|
||||
deuxfleurs.publicIPv4 = "82.67.87.112";
|
||||
}
|
||||
|
|
|
@ -1,35 +1,52 @@
|
|||
UserKnownHostsFile ./cluster/prod/known_hosts
|
||||
|
||||
Host concombre
|
||||
HostName concombre.machine.deuxfleurs.fr
|
||||
HostName concombre.machine.deuxfleurs.fr
|
||||
|
||||
Host courgette
|
||||
HostName courgette.machine.deuxfleurs.fr
|
||||
HostName courgette.machine.deuxfleurs.fr
|
||||
|
||||
Host celeri
|
||||
HostName celeri.machine.deuxfleurs.fr
|
||||
HostName celeri.machine.deuxfleurs.fr
|
||||
|
||||
Host dahlia
|
||||
HostName dahlia.machine.deuxfleurs.fr
|
||||
HostName dahlia.machine.deuxfleurs.fr
|
||||
|
||||
Host diplotaxis
|
||||
HostName diplotaxis.machine.deuxfleurs.fr
|
||||
HostName diplotaxis.machine.deuxfleurs.fr
|
||||
|
||||
Host doradille
|
||||
HostName doradille.machine.deuxfleurs.fr
|
||||
HostName doradille.machine.deuxfleurs.fr
|
||||
|
||||
Host df-ykl
|
||||
HostName df-ykl.machine.deuxfleurs.fr
|
||||
HostName df-ykl.machine.deuxfleurs.fr
|
||||
|
||||
Host df-ymf
|
||||
HostName df-ymf.machine.deuxfleurs.fr
|
||||
HostName df-ymf.machine.deuxfleurs.fr
|
||||
|
||||
Host df-ymk
|
||||
HostName df-ymk.machine.deuxfleurs.fr
|
||||
HostName df-ymk.machine.deuxfleurs.fr
|
||||
|
||||
Host abricot
|
||||
HostName abricot.machine.deuxfleurs.fr
|
||||
HostName abricot.machine.deuxfleurs.fr
|
||||
|
||||
Host ananas
|
||||
HostName ananas.machine.deuxfleurs.fr
|
||||
HostName ananas.machine.deuxfleurs.fr
|
||||
|
||||
Host onion
|
||||
HostName onion.machine.deuxfleurs.fr
|
||||
|
||||
Host oseille
|
||||
HostName oseille.machine.deuxfleurs.fr
|
||||
|
||||
Host io
|
||||
HostName io.machine.deuxfleurs.fr
|
||||
|
||||
Host ortie
|
||||
HostName ortie.machine.deuxfleurs.fr
|
||||
|
||||
Host pamplemousse
|
||||
HostName 2001:912:1ac0:2200::201
|
||||
|
||||
Host pasteque
|
||||
HostName 2001:912:1ac0:2200::202
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
job "albatros" {
|
||||
datacenters = ["neptune", "jupiter", "corrin", "bespin"]
|
||||
datacenters = ["neptune", "dathomir", "corrin", "bespin"]
|
||||
type = "service"
|
||||
priority = 90
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ job "builder" {
|
|||
namespace = "ci"
|
||||
type = "batch"
|
||||
|
||||
datacenters = ["neptune", "jupiter", "corrin", "bespin"]
|
||||
datacenters = ["neptune", "dathomir", "corrin", "bespin"]
|
||||
priority = 100
|
||||
|
||||
parameterized {
|
||||
|
|
100
cluster/staging/app/core/deploy/bottin.hcl
Normal file
100
cluster/staging/app/core/deploy/bottin.hcl
Normal file
|
@ -0,0 +1,100 @@
|
|||
job "core-bottin" {
|
||||
datacenters = ["neptune", "jupiter", "corrin", "bespin"]
|
||||
type = "system"
|
||||
priority = 90
|
||||
|
||||
update {
|
||||
max_parallel = 1
|
||||
stagger = "1m"
|
||||
}
|
||||
|
||||
group "bottin" {
|
||||
constraint {
|
||||
distinct_property = "${meta.site}"
|
||||
value = "1"
|
||||
}
|
||||
|
||||
network {
|
||||
port "ldap_port" {
|
||||
static = 389
|
||||
to = 389
|
||||
}
|
||||
}
|
||||
|
||||
task "bottin" {
|
||||
driver = "docker"
|
||||
config {
|
||||
image = "dxflrs/bottin:7h18i30cckckaahv87d3c86pn4a7q41z"
|
||||
network_mode = "host"
|
||||
readonly_rootfs = true
|
||||
ports = [ "ldap_port" ]
|
||||
volumes = [
|
||||
"secrets/config.json:/config.json",
|
||||
"secrets:/etc/bottin",
|
||||
]
|
||||
}
|
||||
|
||||
restart {
|
||||
interval = "5m"
|
||||
attempts = 10
|
||||
delay = "15s"
|
||||
mode = "delay"
|
||||
}
|
||||
|
||||
resources {
|
||||
memory = 100
|
||||
memory_max = 200
|
||||
}
|
||||
|
||||
template {
|
||||
data = file("../config/bottin/config.json.tpl")
|
||||
destination = "secrets/config.json"
|
||||
}
|
||||
|
||||
template {
|
||||
data = "{{ key \"secrets/consul/consul.crt\" }}"
|
||||
destination = "secrets/consul.crt"
|
||||
}
|
||||
|
||||
template {
|
||||
data = "{{ key \"secrets/consul/consul-client.crt\" }}"
|
||||
destination = "secrets/consul-client.crt"
|
||||
}
|
||||
|
||||
template {
|
||||
data = "{{ key \"secrets/consul/consul-client.key\" }}"
|
||||
destination = "secrets/consul-client.key"
|
||||
}
|
||||
|
||||
template {
|
||||
data = <<EOH
|
||||
CONSUL_HTTP_ADDR=https://consul.service.staging.consul:8501
|
||||
CONSUL_HTTP_SSL=true
|
||||
CONSUL_CACERT=/etc/bottin/consul.crt
|
||||
CONSUL_CLIENT_CERT=/etc/bottin/consul-client.crt
|
||||
CONSUL_CLIENT_KEY=/etc/bottin/consul-client.key
|
||||
EOH
|
||||
destination = "secrets/env"
|
||||
env = true
|
||||
}
|
||||
|
||||
service {
|
||||
tags = [ "${meta.site}" ]
|
||||
port = "ldap_port"
|
||||
address_mode = "host"
|
||||
name = "bottin"
|
||||
check {
|
||||
type = "tcp"
|
||||
port = "ldap_port"
|
||||
interval = "60s"
|
||||
timeout = "5s"
|
||||
check_restart {
|
||||
limit = 3
|
||||
grace = "90s"
|
||||
ignore_warnings = false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
job "core-d53" {
|
||||
datacenters = ["neptune", "jupiter", "corrin", "bespin"]
|
||||
datacenters = ["neptune", "dathomir", "corrin", "bespin"]
|
||||
type = "service"
|
||||
priority = 90
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
job "core-diplonat" {
|
||||
datacenters = ["neptune", "jupiter", "corrin", "bespin"]
|
||||
datacenters = ["neptune", "dathomir", "corrin", "bespin"]
|
||||
type = "system"
|
||||
priority = 90
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
job "core-tricot" {
|
||||
datacenters = ["neptune", "jupiter", "corrin", "bespin"]
|
||||
datacenters = ["neptune", "dathomir", "corrin", "bespin"]
|
||||
type = "system"
|
||||
priority = 90
|
||||
|
||||
|
@ -21,20 +21,25 @@ job "core-tricot" {
|
|||
}
|
||||
|
||||
task "server" {
|
||||
driver = "nix2"
|
||||
driver = "docker"
|
||||
|
||||
config {
|
||||
packages = [
|
||||
"git+https://git.deuxfleurs.fr/Deuxfleurs/tricot.git?ref=redirect&rev=b76b6dcbcc47ebc61848389a6b0d5d4e8d8cde48"
|
||||
image = "armael/tricot:40g7jpp915jkfszlczfh1yw2x6syjkxs-redir-headers"
|
||||
network_mode = "host"
|
||||
readonly_rootfs = true
|
||||
ports = [ "http_port", "https_port" ]
|
||||
volumes = [
|
||||
"secrets:/etc/tricot",
|
||||
]
|
||||
command = "tricot"
|
||||
# cap_add = [ "net_bind_service" ] # this doesn't work for whatever reason, so we need to put user = "root" instead
|
||||
ulimit {
|
||||
nofile = "65535:65535"
|
||||
}
|
||||
}
|
||||
user = "root"
|
||||
|
||||
resources {
|
||||
cpu = 500
|
||||
memory = 200
|
||||
memory_max = 500
|
||||
}
|
||||
|
||||
restart {
|
||||
|
@ -46,17 +51,17 @@ job "core-tricot" {
|
|||
|
||||
template {
|
||||
data = "{{ key \"secrets/consul/consul-ca.crt\" }}"
|
||||
destination = "etc/tricot/consul-ca.crt"
|
||||
destination = "secrets/consul-ca.crt"
|
||||
}
|
||||
|
||||
template {
|
||||
data = "{{ key \"secrets/consul/consul-client.crt\" }}"
|
||||
destination = "etc/tricot/consul-client.crt"
|
||||
destination = "secrets/consul-client.crt"
|
||||
}
|
||||
|
||||
template {
|
||||
data = "{{ key \"secrets/consul/consul-client.key\" }}"
|
||||
destination = "etc/tricot/consul-client.key"
|
||||
destination = "secrets/consul-client.key"
|
||||
}
|
||||
|
||||
template {
|
||||
|
@ -71,7 +76,8 @@ TRICOT_CONSUL_CLIENT_KEY=/etc/tricot/consul-client.key
|
|||
TRICOT_HTTP_BIND_ADDR=[::]:80
|
||||
TRICOT_HTTPS_BIND_ADDR=[::]:443
|
||||
TRICOT_METRICS_BIND_ADDR=[::]:9334
|
||||
RUST_LOG=tricot=debug
|
||||
TRICOT_WARMUP_CERT_MEMORY_STORE=true
|
||||
RUST_LOG=tricot=trace
|
||||
RUST_BACKTRACE=1
|
||||
EOH
|
||||
destination = "secrets/env"
|
||||
|
@ -82,9 +88,6 @@ EOH
|
|||
name = "tricot-http"
|
||||
port = "http_port"
|
||||
tags = [
|
||||
"d53-aaaa ${attr.unique.hostname}.machine.staging.deuxfleurs.org",
|
||||
"d53-aaaa ${meta.site}.site.staging.deuxfleurs.org",
|
||||
"d53-aaaa staging.deuxfleurs.org",
|
||||
"(diplonat (tcp_port 80))"
|
||||
]
|
||||
address_mode = "host"
|
||||
|
@ -94,7 +97,10 @@ EOH
|
|||
name = "tricot-https"
|
||||
port = "https_port"
|
||||
tags = [
|
||||
"(diplonat (tcp_port 443))"
|
||||
"(diplonat (tcp_port 443))",
|
||||
"d53-aaaa ${attr.unique.hostname}.machine.staging.deuxfleurs.org",
|
||||
"d53-aaaa ${meta.site}.site.staging.deuxfleurs.org",
|
||||
"d53-aaaa staging.deuxfleurs.org"
|
||||
]
|
||||
address_mode = "host"
|
||||
}
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
[secrets."directory/ldap_base_dn"]
|
||||
type = 'user'
|
||||
description = 'LDAP base DN for everything'
|
||||
example = 'dc=example,dc=com'
|
||||
|
||||
[secrets."d53/gandi_api_key"]
|
||||
type = 'user'
|
||||
description = 'Gandi API key'
|
||||
|
|
40
cluster/staging/app/cryptpad/config/application_config.js
Normal file
40
cluster/staging/app/cryptpad/config/application_config.js
Normal file
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
* You can override the configurable values from this file.
|
||||
* The recommended method is to make a copy of this file (/customize.dist/application_config.js)
|
||||
in a 'customize' directory (/customize/application_config.js).
|
||||
* If you want to check all the configurable values, you can open the internal configuration file
|
||||
but you should not change it directly (/common/application_config_internal.js)
|
||||
*/
|
||||
define(['/common/application_config_internal.js'], function (AppConfig) {
|
||||
// To inform users of the support ticket panel which languages your admins speak:
|
||||
AppConfig.supportLanguages = [ 'en', 'fr' ];
|
||||
|
||||
/* Select the buttons displayed on the main page to create new collaborative sessions.
|
||||
* Removing apps from the list will prevent users from accessing them. They will instead be
|
||||
* redirected to the drive.
|
||||
* You should never remove the drive from this list.
|
||||
*/
|
||||
AppConfig.availablePadTypes = ['drive', 'teams', 'doc', 'presentation', 'pad', 'kanban', 'code', 'form', 'poll', 'whiteboard',
|
||||
'file', 'contacts', 'slide', 'convert'];
|
||||
// disabled: sheet
|
||||
|
||||
/* You can display a link to your own privacy policy in the static pages footer.
|
||||
* Since this is different for each individual or organization there is no default value.
|
||||
* See the comments above for a description of possible configurations.
|
||||
*/
|
||||
AppConfig.privacy = {
|
||||
"default": "https://deuxfleurs.fr/CGU.html",
|
||||
};
|
||||
|
||||
/* You can display a link to your instances's terms of service in the static pages footer.
|
||||
* A default is included for backwards compatibility, but we recommend replacing this
|
||||
* with your own terms.
|
||||
*
|
||||
* See the comments above for a description of possible configurations.
|
||||
*/
|
||||
AppConfig.terms = {
|
||||
"default": "https://deuxfleurs.fr/CGU.html",
|
||||
};
|
||||
|
||||
return AppConfig;
|
||||
});
|
296
cluster/staging/app/cryptpad/config/config.js
Normal file
296
cluster/staging/app/cryptpad/config/config.js
Normal file
|
@ -0,0 +1,296 @@
|
|||
/* globals module */
|
||||
|
||||
/* DISCLAIMER:
|
||||
|
||||
There are two recommended methods of running a CryptPad instance:
|
||||
|
||||
1. Using a standalone nodejs server without HTTPS (suitable for local development)
|
||||
2. Using NGINX to serve static assets and to handle HTTPS for API server's websocket traffic
|
||||
|
||||
We do not officially recommend or support Apache, Docker, Kubernetes, Traefik, or any other configuration.
|
||||
Support requests for such setups should be directed to their authors.
|
||||
|
||||
If you're having difficulty difficulty configuring your instance
|
||||
we suggest that you join the project's IRC/Matrix channel.
|
||||
|
||||
If you don't have any difficulty configuring your instance and you'd like to
|
||||
support us for the work that went into making it pain-free we are quite happy
|
||||
to accept donations via our opencollective page: https://opencollective.com/cryptpad
|
||||
|
||||
*/
|
||||
module.exports = {
|
||||
/* CryptPad is designed to serve its content over two domains.
|
||||
* Account passwords and cryptographic content is handled on the 'main' domain,
|
||||
* while the user interface is loaded on a 'sandbox' domain
|
||||
* which can only access information which the main domain willingly shares.
|
||||
*
|
||||
* In the event of an XSS vulnerability in the UI (that's bad)
|
||||
* this system prevents attackers from gaining access to your account (that's good).
|
||||
*
|
||||
* Most problems with new instances are related to this system blocking access
|
||||
* because of incorrectly configured sandboxes. If you only see a white screen
|
||||
* when you try to load CryptPad, this is probably the cause.
|
||||
*
|
||||
* PLEASE READ THE FOLLOWING COMMENTS CAREFULLY.
|
||||
*
|
||||
*/
|
||||
|
||||
/* httpUnsafeOrigin is the URL that clients will enter to load your instance.
|
||||
* Any other URL that somehow points to your instance is supposed to be blocked.
|
||||
* The default provided below assumes you are loading CryptPad from a server
|
||||
* which is running on the same machine, using port 3000.
|
||||
*
|
||||
* In a production instance this should be available ONLY over HTTPS
|
||||
* using the default port for HTTPS (443) ie. https://cryptpad.fr
|
||||
* In such a case this should be also handled by NGINX, as documented in
|
||||
* cryptpad/docs/example.nginx.conf (see the $main_domain variable)
|
||||
*
|
||||
*/
|
||||
httpUnsafeOrigin: 'https://pad.staging.deuxfleurs.org',
|
||||
|
||||
/* httpSafeOrigin is the URL that is used for the 'sandbox' described above.
|
||||
* If you're testing or developing with CryptPad on your local machine then
|
||||
* it is appropriate to leave this blank. The default behaviour is to serve
|
||||
* the main domain over port 3000 and to serve the sandbox content over port 3001.
|
||||
*
|
||||
* This is not appropriate in a production environment where invasive networks
|
||||
* may filter traffic going over abnormal ports.
|
||||
* To correctly configure your production instance you must provide a URL
|
||||
* with a different domain (a subdomain is sufficient).
|
||||
* It will be used to load the UI in our 'sandbox' system.
|
||||
*
|
||||
* This value corresponds to the $sandbox_domain variable
|
||||
* in the example nginx file.
|
||||
*
|
||||
* Note that in order for the sandboxing system to be effective
|
||||
* httpSafeOrigin must be different from httpUnsafeOrigin.
|
||||
*
|
||||
* CUSTOMIZE AND UNCOMMENT THIS FOR PRODUCTION INSTALLATIONS.
|
||||
*/
|
||||
httpSafeOrigin: "https://pad-sandbox.staging.deuxfleurs.org",
|
||||
|
||||
/* httpAddress specifies the address on which the nodejs server
|
||||
* should be accessible. By default it will listen on 127.0.0.1
|
||||
* (IPv4 localhost on most systems). If you want it to listen on
|
||||
* all addresses, including IPv6, set this to '::'.
|
||||
*
|
||||
*/
|
||||
httpAddress: '::',
|
||||
|
||||
/* httpPort specifies on which port the nodejs server should listen.
|
||||
* By default it will serve content over port 3000, which is suitable
|
||||
* for both local development and for use with the provided nginx example,
|
||||
* which will proxy websocket traffic to your node server.
|
||||
*
|
||||
*/
|
||||
httpPort: 3000,
|
||||
|
||||
/* httpSafePort allows you to specify an alternative port from which
|
||||
* the node process should serve sandboxed assets. The default value is
|
||||
* that of your httpPort + 1. You probably don't need to change this.
|
||||
*
|
||||
*/
|
||||
// httpSafePort: 3001,
|
||||
|
||||
/* CryptPad will launch a child process for every core available
|
||||
* in order to perform CPU-intensive tasks in parallel.
|
||||
* Some host environments may have a very large number of cores available
|
||||
* or you may want to limit how much computing power CryptPad can take.
|
||||
* If so, set 'maxWorkers' to a positive integer.
|
||||
*/
|
||||
// maxWorkers: 4,
|
||||
|
||||
/* =====================
|
||||
* Admin
|
||||
* ===================== */
|
||||
|
||||
/*
|
||||
* CryptPad contains an administration panel. Its access is restricted to specific
|
||||
* users using the following list.
|
||||
* To give access to the admin panel to a user account, just add their public signing
|
||||
* key, which can be found on the settings page for registered users.
|
||||
* Entries should be strings separated by a comma.
|
||||
*/
|
||||
adminKeys: [
|
||||
"[quentin@pad.deuxfleurs.fr/EWtzm-CiqJnM9RZL9mj-YyTgAtX-Zh76sru1K5bFpN8=]",
|
||||
"[adrn@pad.deuxfleurs.fr/PxDpkPwd-jDJWkfWdAzFX7wtnLpnPlBeYZ4MmoEYS6E=]",
|
||||
"[lx@pad.deuxfleurs.fr/FwQzcXywx1FIb83z6COB7c3sHnz8rNSDX1xhjPuH3Fg=]",
|
||||
"[trinity-1686a@pad.deuxfleurs.fr/Pu6Ef03jEsAGBbZI6IOdKd6+5pORD5N51QIYt4-Ys1c=]",
|
||||
"[Jill@pad.deuxfleurs.fr/tLW7W8EVNB2KYETXEaOYR+HmNiBQtZj7u+SOxS3hGmg=]",
|
||||
"[vincent@pad.deuxfleurs.fr/07FQiE8w1iztRWwzbRJzEy3xIqnNR31mUFjLNiGXjwU=]",
|
||||
"[boris@pad.deuxfleurs.fr/kHo5LIhSxDFk39GuhGRp+XKlMjNe+lWfFWM75cINoTQ=]",
|
||||
"[maximilien@pad.deuxfleurs.fr/UoXHLejYRUjvX6t55hAQKpjMdU-3ecg4eDhAeckZmyE=]",
|
||||
"[armael@pad.deuxfleurs.fr/CIKMvNdFxGavwTmni0TnR3x9GM0ypgx3DMcFyzppplU=]",
|
||||
"[bjonglez@pad.deuxfleurs.fr/+RRzwcLPj5ZCWELUXMjmt3u+-lvYnyhpDt4cqAn9nh8=]"
|
||||
],
|
||||
|
||||
/* =====================
|
||||
* STORAGE
|
||||
* ===================== */
|
||||
|
||||
/* Pads that are not 'pinned' by any registered user can be set to expire
|
||||
* after a configurable number of days of inactivity (default 90 days).
|
||||
* The value can be changed or set to false to remove expiration.
|
||||
* Expired pads can then be removed using a cron job calling the
|
||||
* `evict-inactive.js` script with node
|
||||
*
|
||||
* defaults to 90 days if nothing is provided
|
||||
*/
|
||||
//inactiveTime: 90, // days
|
||||
|
||||
/* CryptPad archives some data instead of deleting it outright.
|
||||
* This archived data still takes up space and so you'll probably still want to
|
||||
* remove these files after a brief period.
|
||||
*
|
||||
* cryptpad/scripts/evict-inactive.js is intended to be run daily
|
||||
* from a crontab or similar scheduling service.
|
||||
*
|
||||
* The intent with this feature is to provide a safety net in case of accidental
|
||||
* deletion. Set this value to the number of days you'd like to retain
|
||||
* archived data before it's removed permanently.
|
||||
*
|
||||
* defaults to 15 days if nothing is provided
|
||||
*/
|
||||
//archiveRetentionTime: 15,
|
||||
|
||||
/* It's possible to configure your instance to remove data
|
||||
* stored on behalf of inactive accounts. Set 'accountRetentionTime'
|
||||
* to the number of days an account can remain idle before its
|
||||
* documents and other account data is removed.
|
||||
*
|
||||
* Leave this value commented out to preserve all data stored
|
||||
* by user accounts regardless of inactivity.
|
||||
*/
|
||||
//accountRetentionTime: 365,
|
||||
|
||||
/* Starting with CryptPad 3.23.0, the server automatically runs
|
||||
* the script responsible for removing inactive data according to
|
||||
* your configured definition of inactivity. Set this value to `true`
|
||||
* if you prefer not to remove inactive data, or if you prefer to
|
||||
* do so manually using `scripts/evict-inactive.js`.
|
||||
*/
|
||||
//disableIntegratedEviction: true,
|
||||
|
||||
|
||||
/* Max Upload Size (bytes)
|
||||
* this sets the maximum size of any one file uploaded to the server.
|
||||
* anything larger than this size will be rejected
|
||||
* defaults to 20MB if no value is provided
|
||||
*/
|
||||
//maxUploadSize: 20 * 1024 * 1024,
|
||||
|
||||
/* Users with premium accounts (those with a plan included in their customLimit)
|
||||
* can benefit from an increased upload size limit. By default they are restricted to the same
|
||||
* upload size as any other registered user.
|
||||
*
|
||||
*/
|
||||
//premiumUploadSize: 100 * 1024 * 1024,
|
||||
|
||||
/* =====================
|
||||
* DATABASE VOLUMES
|
||||
* ===================== */
|
||||
|
||||
/*
|
||||
* We need this config entry, else CryptPad will try to mkdir
|
||||
* some stuff into Nix store apparently...
|
||||
*/
|
||||
base: '/mnt/data',
|
||||
|
||||
/*
|
||||
* CryptPad stores each document in an individual file on your hard drive.
|
||||
* Specify a directory where files should be stored.
|
||||
* It will be created automatically if it does not already exist.
|
||||
*/
|
||||
filePath: '/mnt/datastore/',
|
||||
|
||||
/* CryptPad offers the ability to archive data for a configurable period
|
||||
* before deleting it, allowing a means of recovering data in the event
|
||||
* that it was deleted accidentally.
|
||||
*
|
||||
* To set the location of this archive directory to a custom value, change
|
||||
* the path below:
|
||||
*/
|
||||
archivePath: '/mnt/data/archive',
|
||||
|
||||
/* CryptPad allows logged in users to request that particular documents be
|
||||
* stored by the server indefinitely. This is called 'pinning'.
|
||||
* Pin requests are stored in a pin-store. The location of this store is
|
||||
* defined here.
|
||||
*/
|
||||
pinPath: '/mnt/data/pins',
|
||||
|
||||
/* if you would like the list of scheduled tasks to be stored in
|
||||
a custom location, change the path below:
|
||||
*/
|
||||
taskPath: '/mnt/data/tasks',
|
||||
|
||||
/* if you would like users' authenticated blocks to be stored in
|
||||
a custom location, change the path below:
|
||||
*/
|
||||
blockPath: '/mnt/block',
|
||||
|
||||
/* CryptPad allows logged in users to upload encrypted files. Files/blobs
|
||||
* are stored in a 'blob-store'. Set its location here.
|
||||
*/
|
||||
blobPath: '/mnt/blob',
|
||||
|
||||
/* CryptPad stores incomplete blobs in a 'staging' area until they are
|
||||
* fully uploaded. Set its location here.
|
||||
*/
|
||||
blobStagingPath: '/mnt/data/blobstage',
|
||||
|
||||
decreePath: '/mnt/data/decrees',
|
||||
|
||||
/* CryptPad supports logging events directly to the disk in a 'logs' directory
|
||||
* Set its location here, or set it to false (or nothing) if you'd rather not log
|
||||
*/
|
||||
logPath: false,
|
||||
|
||||
/* =====================
|
||||
* Debugging
|
||||
* ===================== */
|
||||
|
||||
/* CryptPad can log activity to stdout
|
||||
* This may be useful for debugging
|
||||
*/
|
||||
logToStdout: true,
|
||||
|
||||
/* CryptPad can be configured to log more or less
|
||||
* the various settings are listed below by order of importance
|
||||
*
|
||||
* silly, verbose, debug, feedback, info, warn, error
|
||||
*
|
||||
* Choose the least important level of logging you wish to see.
|
||||
* For example, a 'silly' logLevel will display everything,
|
||||
* while 'info' will display 'info', 'warn', and 'error' logs
|
||||
*
|
||||
* This will affect both logging to the console and the disk.
|
||||
*/
|
||||
logLevel: 'silly',
|
||||
|
||||
/* clients can use the /settings/ app to opt out of usage feedback
|
||||
* which informs the server of things like how much each app is being
|
||||
* used, and whether certain clientside features are supported by
|
||||
* the client's browser. The intent is to provide feedback to the admin
|
||||
* such that the service can be improved. Enable this with `true`
|
||||
* and ignore feedback with `false` or by commenting the attribute
|
||||
*
|
||||
* You will need to set your logLevel to include 'feedback'. Set this
|
||||
* to false if you'd like to exclude feedback from your logs.
|
||||
*/
|
||||
logFeedback: false,
|
||||
|
||||
/* CryptPad supports verbose logging
|
||||
* (false by default)
|
||||
*/
|
||||
verbose: true,
|
||||
|
||||
/* Surplus information:
|
||||
*
|
||||
* 'installMethod' is included in server telemetry to voluntarily
|
||||
* indicate how many instances are using unofficial installation methods
|
||||
* such as Docker.
|
||||
*
|
||||
*/
|
||||
installMethod: 'deuxfleurs.fr',
|
||||
};
|
80
cluster/staging/app/cryptpad/deploy/cryptpad.hcl
Normal file
80
cluster/staging/app/cryptpad/deploy/cryptpad.hcl
Normal file
|
@ -0,0 +1,80 @@
|
|||
job "cryptpad" {
|
||||
datacenters = ["neptune"]
|
||||
type = "service"
|
||||
|
||||
group "cryptpad" {
|
||||
count = 1
|
||||
|
||||
network {
|
||||
port "http" {
|
||||
to = 3000
|
||||
}
|
||||
}
|
||||
|
||||
restart {
|
||||
attempts = 10
|
||||
delay = "30s"
|
||||
}
|
||||
|
||||
task "main" {
|
||||
driver = "docker"
|
||||
|
||||
constraint {
|
||||
attribute = "${attr.unique.hostname}"
|
||||
operator = "="
|
||||
value = "caribou"
|
||||
}
|
||||
|
||||
config {
|
||||
image = "kokakiwi/cryptpad:2024.9.0"
|
||||
ports = [ "http" ]
|
||||
|
||||
volumes = [
|
||||
"/mnt/ssd/cryptpad:/mnt",
|
||||
"secrets/config.js:/cryptpad/config.js",
|
||||
]
|
||||
}
|
||||
env {
|
||||
CRYPTPAD_CONFIG = "/cryptpad/config.js"
|
||||
}
|
||||
|
||||
template {
|
||||
data = file("../config/config.js")
|
||||
destination = "secrets/config.js"
|
||||
}
|
||||
|
||||
/* Disabled because it requires modifications to the docker image and I do not want to invest the time yet
|
||||
template {
|
||||
data = file("../config/application_config.js")
|
||||
destination = "secrets/config.js"
|
||||
}
|
||||
*/
|
||||
|
||||
resources {
|
||||
memory = 1000
|
||||
cpu = 500
|
||||
}
|
||||
|
||||
service {
|
||||
name = "cryptpad"
|
||||
port = "http"
|
||||
tags = [
|
||||
"tricot pad.staging.deuxfleurs.org",
|
||||
"tricot pad-sandbox.staging.deuxfleurs.org",
|
||||
"tricot-add-header Cross-Origin-Resource-Policy cross-origin",
|
||||
"tricot-add-header Cross-Origin-Embedder-Policy require-corp",
|
||||
"tricot-add-header Access-Control-Allow-Origin *",
|
||||
"tricot-add-header Access-Control-Allow-Credentials true",
|
||||
"d53-cname pad.staging.deuxfleurs.org",
|
||||
"d53-cname pad-sandbox.staging.deuxfleurs.org",
|
||||
]
|
||||
check {
|
||||
type = "http"
|
||||
path = "/"
|
||||
interval = "10s"
|
||||
timeout = "2s"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,133 +0,0 @@
|
|||
job "directory" {
|
||||
datacenters = ["neptune", "jupiter", "corrin", "bespin"]
|
||||
type = "service"
|
||||
priority = 90
|
||||
|
||||
constraint {
|
||||
attribute = "${attr.cpu.arch}"
|
||||
value = "amd64"
|
||||
}
|
||||
|
||||
group "bottin" {
|
||||
count = 1
|
||||
|
||||
network {
|
||||
port "ldap_port" {
|
||||
static = 389
|
||||
}
|
||||
}
|
||||
|
||||
task "bottin" {
|
||||
driver = "nix2"
|
||||
config {
|
||||
packages = [
|
||||
"git+https://git.deuxfleurs.fr/Deuxfleurs/bottin.git?ref=main&rev=9cab98d2cee386ece54b000bbdf2346da8b55eed"
|
||||
]
|
||||
command = "bottin"
|
||||
}
|
||||
user = "root" # needed to bind port 389
|
||||
|
||||
resources {
|
||||
memory = 100
|
||||
}
|
||||
|
||||
template {
|
||||
data = file("../config/bottin/config.json.tpl")
|
||||
destination = "config.json"
|
||||
}
|
||||
|
||||
template {
|
||||
data = "{{ key \"secrets/consul/consul-ca.crt\" }}"
|
||||
destination = "etc/bottin/consul-ca.crt"
|
||||
}
|
||||
|
||||
template {
|
||||
data = "{{ key \"secrets/consul/consul-client.crt\" }}"
|
||||
destination = "etc/bottin/consul-client.crt"
|
||||
}
|
||||
|
||||
template {
|
||||
data = "{{ key \"secrets/consul/consul-client.key\" }}"
|
||||
destination = "etc/bottin/consul-client.key"
|
||||
}
|
||||
|
||||
template {
|
||||
data = <<EOH
|
||||
CONSUL_HTTP_ADDR=https://localhost:8501
|
||||
CONSUL_HTTP_SSL=true
|
||||
CONSUL_CACERT=/etc/bottin/consul-ca.crt
|
||||
CONSUL_CLIENT_CERT=/etc/bottin/consul-client.crt
|
||||
CONSUL_CLIENT_KEY=/etc/bottin/consul-client.key
|
||||
EOH
|
||||
destination = "secrets/env"
|
||||
env = true
|
||||
}
|
||||
|
||||
service {
|
||||
tags = ["bottin"]
|
||||
port = "ldap_port"
|
||||
name = "bottin"
|
||||
check {
|
||||
type = "tcp"
|
||||
port = "ldap_port"
|
||||
interval = "60s"
|
||||
timeout = "5s"
|
||||
check_restart {
|
||||
limit = 3
|
||||
grace = "90s"
|
||||
ignore_warnings = false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
group "guichet" {
|
||||
count = 1
|
||||
|
||||
network {
|
||||
port "web_port" { static = 9991 }
|
||||
}
|
||||
|
||||
task "guichet" {
|
||||
driver = "nix2"
|
||||
config {
|
||||
packages = [
|
||||
"git+https://git.deuxfleurs.fr/Deuxfleurs/guichet.git?ref=main&rev=10bdee10cf6947ec6dd0ba5040d7274d6c3316a7"
|
||||
]
|
||||
command = "guichet"
|
||||
}
|
||||
|
||||
template {
|
||||
data = file("../config/guichet/config.json.tpl")
|
||||
destination = "config.json"
|
||||
}
|
||||
|
||||
resources {
|
||||
memory = 200
|
||||
}
|
||||
|
||||
service {
|
||||
name = "guichet"
|
||||
tags = [
|
||||
"guichet",
|
||||
"tricot guichet.staging.deuxfleurs.org",
|
||||
"d53-cname guichet.staging.deuxfleurs.org",
|
||||
]
|
||||
port = "web_port"
|
||||
check {
|
||||
type = "tcp"
|
||||
port = "web_port"
|
||||
interval = "60s"
|
||||
timeout = "5s"
|
||||
check_restart {
|
||||
limit = 3
|
||||
grace = "90s"
|
||||
ignore_warnings = false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -25,6 +25,7 @@ tls_skip_verify = true
|
|||
[s3_api]
|
||||
s3_region = "garage-staging"
|
||||
api_bind_addr = "0.0.0.0:3990"
|
||||
root_domain = ".garage.staging.deuxfleurs.org"
|
||||
|
||||
[k2v_api]
|
||||
api_bind_addr = "0.0.0.0:3993"
|
||||
|
|
|
@ -1,13 +1,12 @@
|
|||
job "garage-staging" {
|
||||
datacenters = [ "neptune", "dathomir", "corrin", "bespin" ]
|
||||
type = "system"
|
||||
priority = 90
|
||||
|
||||
datacenters = [ "neptune", "jupiter", "corrin", "bespin" ]
|
||||
|
||||
update {
|
||||
max_parallel = 1
|
||||
stagger = "1m"
|
||||
min_healthy_time = "10s"
|
||||
max_parallel = 2
|
||||
min_healthy_time = "60s"
|
||||
}
|
||||
|
||||
group "garage-staging" {
|
||||
|
@ -19,21 +18,27 @@ job "garage-staging" {
|
|||
port "admin" { static = 3909 }
|
||||
}
|
||||
|
||||
task "server" {
|
||||
driver = "nix2"
|
||||
update {
|
||||
max_parallel = 10
|
||||
min_healthy_time = "30s"
|
||||
healthy_deadline = "5m"
|
||||
}
|
||||
|
||||
task "server" {
|
||||
driver = "docker"
|
||||
config {
|
||||
packages = [
|
||||
"#bash", # so that we can enter a shell inside container
|
||||
"#coreutils",
|
||||
# garage v1.0.0-rc1 as of 2024-03-28
|
||||
"git+https://git.deuxfleurs.fr/Deuxfleurs/garage.git?ref=next-0.10&rev=afad62939e071621666ca7255f7164f92c4475bb"
|
||||
]
|
||||
command = "garage"
|
||||
image = "superboum/garage:v1.0.0-rc1-hotfix-red-ftr-wquorum"
|
||||
command = "/garage"
|
||||
args = [ "server" ]
|
||||
bind = {
|
||||
"/mnt/storage/garage-staging/data" = "/data",
|
||||
"/mnt/ssd/garage-staging/meta" = "/meta",
|
||||
network_mode = "host"
|
||||
volumes = [
|
||||
"/mnt/storage/garage-staging/data:/data",
|
||||
"/mnt/ssd/garage-staging/meta:/meta",
|
||||
"secrets/garage.toml:/etc/garage.toml",
|
||||
"secrets:/etc/garage",
|
||||
]
|
||||
logging {
|
||||
type = "journald"
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -41,27 +46,24 @@ job "garage-staging" {
|
|||
RUST_LOG = "garage=info,garage_api=debug",
|
||||
}
|
||||
|
||||
# files currently owned by root, we don't want to chown everything
|
||||
user = "root"
|
||||
|
||||
template {
|
||||
data = file("../config/garage.toml")
|
||||
destination = "etc/garage.toml"
|
||||
destination = "secrets/garage.toml"
|
||||
}
|
||||
|
||||
template {
|
||||
data = "{{ key \"secrets/consul/consul-ca.crt\" }}"
|
||||
destination = "etc/garage/consul-ca.crt"
|
||||
destination = "secrets/consul-ca.crt"
|
||||
}
|
||||
|
||||
template {
|
||||
data = "{{ key \"secrets/consul/consul-client.crt\" }}"
|
||||
destination = "etc/garage/consul-client.crt"
|
||||
destination = "secrets/consul-client.crt"
|
||||
}
|
||||
|
||||
template {
|
||||
data = "{{ key \"secrets/consul/consul-client.key\" }}"
|
||||
destination = "etc/garage/consul-client.key"
|
||||
destination = "secrets/consul-client.key"
|
||||
}
|
||||
|
||||
resources {
|
||||
|
@ -73,22 +75,68 @@ job "garage-staging" {
|
|||
kill_signal = "SIGINT"
|
||||
kill_timeout = "20s"
|
||||
|
||||
restart {
|
||||
interval = "5m"
|
||||
attempts = 10
|
||||
delay = "1m"
|
||||
mode = "delay"
|
||||
}
|
||||
|
||||
service {
|
||||
name = "garage-staging-rpc"
|
||||
tags = ["garage-staging-rpc"]
|
||||
port = "rpc"
|
||||
}
|
||||
|
||||
#### Configuration for service ports: admin port (internal use only)
|
||||
|
||||
service {
|
||||
name = "garage-staging-admin"
|
||||
tags = [
|
||||
"garage-staging-admin",
|
||||
]
|
||||
port = "admin"
|
||||
check {
|
||||
name = "garage-tcp-liveness-check"
|
||||
type = "tcp"
|
||||
interval = "60s"
|
||||
timeout = "5s"
|
||||
check_restart {
|
||||
limit = 3
|
||||
grace = "90s"
|
||||
ignore_warnings = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#### Configuration for service ports: externally available ports (S3 API, K2V, web)
|
||||
|
||||
service {
|
||||
name = "garage-staging-s3-api"
|
||||
tags = [
|
||||
"garage-staging-api",
|
||||
"tricot garage.staging.deuxfleurs.org",
|
||||
"tricot *.garage.staging.deuxfleurs.org",
|
||||
"tricot-add-header Access-Control-Allow-Origin *",
|
||||
"tricot-on-demand-tls-ask http://garage-staging-admin.service.staging.consul:3909/check",
|
||||
"tricot-site-lb",
|
||||
]
|
||||
port = "s3"
|
||||
# Check 1: Garage is alive and answering TCP connections
|
||||
check {
|
||||
name = "garage-staging-api-live"
|
||||
type = "tcp"
|
||||
interval = "60s"
|
||||
timeout = "5s"
|
||||
check_restart {
|
||||
limit = 3
|
||||
grace = "90s"
|
||||
ignore_warnings = false
|
||||
}
|
||||
}
|
||||
# Check 2: Garage is in a healthy state and requests should be routed here
|
||||
check {
|
||||
name = "garage-staging-api-healthy"
|
||||
port = "admin"
|
||||
type = "http"
|
||||
path = "/health"
|
||||
|
@ -106,7 +154,21 @@ job "garage-staging" {
|
|||
"tricot-site-lb",
|
||||
]
|
||||
port = "k2v"
|
||||
# Check 1: Garage is alive and answering TCP connections
|
||||
check {
|
||||
name = "garage-staging-k2v-live"
|
||||
type = "tcp"
|
||||
interval = "60s"
|
||||
timeout = "5s"
|
||||
check_restart {
|
||||
limit = 3
|
||||
grace = "90s"
|
||||
ignore_warnings = false
|
||||
}
|
||||
}
|
||||
# Check 2: Garage is in a healthy state and requests should be routed here
|
||||
check {
|
||||
name = "garage-staging-k2v-healthy"
|
||||
port = "admin"
|
||||
type = "http"
|
||||
path = "/health"
|
||||
|
@ -119,14 +181,34 @@ job "garage-staging" {
|
|||
name = "garage-staging-web"
|
||||
tags = [
|
||||
"garage-staging-web",
|
||||
"tricot * 1",
|
||||
"tricot *.web.staging.deuxfleurs.org",
|
||||
"tricot staging.deuxfleurs.org",
|
||||
"tricot matrix.home.adnab.me/.well-known/matrix/server",
|
||||
"tricot-add-header Strict-Transport-Security max-age=63072000; includeSubDomains; preload",
|
||||
"tricot-add-header X-Frame-Options SAMEORIGIN",
|
||||
"tricot-add-header X-XSS-Protection 1; mode=block",
|
||||
"tricot-add-header X-Content-Type-Options nosniff",
|
||||
"tricot-add-header Access-Control-Allow-Origin *",
|
||||
"tricot-on-demand-tls-ask http://garage-staging-admin.service.staging.consul:3909/check",
|
||||
"tricot-site-lb",
|
||||
]
|
||||
port = "web"
|
||||
# Check 1: Garage is alive and answering TCP connections
|
||||
check {
|
||||
name = "garage-staging-web-live"
|
||||
type = "tcp"
|
||||
interval = "60s"
|
||||
timeout = "5s"
|
||||
check_restart {
|
||||
limit = 3
|
||||
grace = "90s"
|
||||
ignore_warnings = false
|
||||
}
|
||||
}
|
||||
# Check 2: Garage is in a healthy state and requests should be routed here
|
||||
check {
|
||||
name = "garage-staging-web-healthy"
|
||||
port = "admin"
|
||||
type = "http"
|
||||
path = "/health"
|
||||
|
@ -134,44 +216,6 @@ job "garage-staging" {
|
|||
timeout = "5s"
|
||||
}
|
||||
}
|
||||
|
||||
service {
|
||||
name = "garage-staging-admin"
|
||||
tags = [
|
||||
"garage-staging-admin",
|
||||
]
|
||||
port = "admin"
|
||||
check {
|
||||
name = "garage-admin-health-check"
|
||||
type = "http"
|
||||
path = "/health"
|
||||
interval = "60s"
|
||||
timeout = "5s"
|
||||
check_restart {
|
||||
limit = 10
|
||||
grace = "90s"
|
||||
ignore_warnings = true
|
||||
}
|
||||
}
|
||||
check {
|
||||
name = "garage-tcp-liveness-check"
|
||||
type = "tcp"
|
||||
interval = "60s"
|
||||
timeout = "5s"
|
||||
check_restart {
|
||||
limit = 3
|
||||
grace = "90s"
|
||||
ignore_warnings = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
restart {
|
||||
interval = "5m"
|
||||
attempts = 10
|
||||
delay = "1m"
|
||||
mode = "delay"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,12 +1,15 @@
|
|||
{
|
||||
"http_bind_addr": ":9991",
|
||||
"ldap_server_addr": "ldap://bottin.service.staging.consul:389",
|
||||
"ldap_server_addr": "ldap://{{ env "meta.site" }}.bottin.service.staging.consul:389",
|
||||
|
||||
"base_dn": "{{ key "secrets/directory/ldap_base_dn" }}",
|
||||
"user_base_dn": "ou=users,{{ key "secrets/directory/ldap_base_dn" }}",
|
||||
"user_name_attr": "cn",
|
||||
"group_base_dn": "ou=groups,{{ key "secrets/directory/ldap_base_dn" }}",
|
||||
"group_name_attr": "cn",
|
||||
"mailing_list_base_dn": "ou=mailing_lists,ou=groups,{{ key "secrets/directory/ldap_base_dn" }}",
|
||||
"mailing_list_name_attr": "cn",
|
||||
"mailing_list_guest_user_base_dn": "ou=guests,ou=users,{{ key "secrets/directory/ldap_base_dn" }}",
|
||||
|
||||
"invitation_base_dn": "ou=invitations,{{ key "secrets/directory/ldap_base_dn" }}",
|
||||
"invitation_name_attr": "cn",
|
|
@ -1,5 +1,5 @@
|
|||
job "guichet" {
|
||||
datacenters = [ "neptune", "scorpio" ]
|
||||
datacenters = ["neptune", "jupiter", "corrin", "bespin"]
|
||||
type = "service"
|
||||
priority = 90
|
||||
|
||||
|
@ -14,7 +14,7 @@ job "guichet" {
|
|||
driver = "docker"
|
||||
config {
|
||||
image = "dxflrs/guichet:m1gzk1r00xp0kz566fwbpc87z7haq7xj"
|
||||
args = [ "server", "-config", "/etc/config.json" ]
|
||||
args = [ "server", "-config", "/etc/config.json" ]
|
||||
readonly_rootfs = true
|
||||
ports = [ "web_port" ]
|
||||
volumes = [
|
||||
|
@ -35,8 +35,8 @@ job "guichet" {
|
|||
name = "guichet"
|
||||
tags = [
|
||||
"guichet",
|
||||
"tricot guichet.deuxfleurs.fr",
|
||||
"d53-cname guichet.deuxfleurs.fr",
|
||||
"tricot guichet.staging.deuxfleurs.org",
|
||||
"d53-cname guichet.staging.deuxfleurs.org",
|
||||
]
|
||||
port = "web_port"
|
||||
address_mode = "host"
|
|
@ -1,51 +1,51 @@
|
|||
[secrets."directory/ldap_base_dn"]
|
||||
# General configuration
|
||||
|
||||
[secrets."directory/guichet/web_hostname"]
|
||||
type = 'user'
|
||||
description = 'LDAP base DN for everything'
|
||||
example = 'dc=example,dc=com'
|
||||
description = 'Public hostname from which Guichet is accessible via HTTP (e.g. guichet.example.com)'
|
||||
|
||||
|
||||
# Mailing configuration
|
||||
|
||||
[secrets."directory/guichet/smtp_user"]
|
||||
type = 'user'
|
||||
description = 'SMTP username'
|
||||
|
||||
[secrets."directory/guichet/s3_access_key"]
|
||||
type = 'user'
|
||||
description = 'Garage access key for Guichet profile pictures'
|
||||
|
||||
[secrets."directory/guichet/s3_endpoint"]
|
||||
type = 'user'
|
||||
description = 'S3 endpoint URL'
|
||||
|
||||
[secrets."directory/guichet/s3_region"]
|
||||
type = 'user'
|
||||
description = 'S3 region'
|
||||
|
||||
[secrets."directory/guichet/smtp_pass"]
|
||||
type = 'user'
|
||||
description = 'SMTP password'
|
||||
|
||||
[secrets."directory/guichet/web_hostname"]
|
||||
type = 'user'
|
||||
description = 'Public hostname from which Guichet is accessible via HTTP'
|
||||
example = 'guichet.example.com'
|
||||
|
||||
[secrets."directory/guichet/s3_bucket"]
|
||||
type = 'user'
|
||||
description = 'S3 bucket in which to store data files (such as profile pictures)'
|
||||
|
||||
[secrets."directory/guichet/smtp_server"]
|
||||
type = 'user'
|
||||
description = 'SMTP server address (hostname:port)'
|
||||
|
||||
[secrets."directory/guichet/s3_secret_key"]
|
||||
type = 'user'
|
||||
description = 'Garage secret key for Guichet profile pictures'
|
||||
|
||||
[secrets."directory/guichet/mail_from"]
|
||||
type = 'user'
|
||||
description = 'E-mail address from which to send welcome emails to new users'
|
||||
|
||||
[secrets."directory/guichet/mail_domain"]
|
||||
type = 'user'
|
||||
description = 'E-mail domain for new users'
|
||||
example = 'example.com'
|
||||
description = 'E-mail domain for new users (e.g. example.com)'
|
||||
|
||||
|
||||
# S3 configuration
|
||||
|
||||
[secrets."directory/guichet/s3_endpoint"]
|
||||
type = 'user'
|
||||
description = 'S3 endpoint URL'
|
||||
|
||||
[secrets."directory/guichet/s3_bucket"]
|
||||
type = 'user'
|
||||
description = 'S3 bucket in which to store data files (such as profile pictures)'
|
||||
|
||||
[secrets."directory/guichet/s3_region"]
|
||||
type = 'user'
|
||||
description = 'S3 region'
|
||||
|
||||
[secrets."directory/guichet/s3_access_key"]
|
||||
type = 'user'
|
||||
description = 'Garage access key for Guichet profile pictures'
|
||||
|
||||
[secrets."directory/guichet/s3_secret_key"]
|
||||
type = 'user'
|
||||
description = 'Garage secret key for Guichet profile pictures'
|
|
@ -38,3 +38,27 @@ scrape_configs:
|
|||
ca_file: /etc/prom/consul.crt
|
||||
cert_file: /etc/prom/consul-client.crt
|
||||
key_file: /etc/prom/consul-client.key
|
||||
|
||||
# see https://prometheus.io/docs/prometheus/latest/configuration/configuration/#static_config
|
||||
# and https://www.nomadproject.io/api-docs/metrics
|
||||
# and https://learn.hashicorp.com/tutorials/nomad/prometheus-metrics
|
||||
# dashboard at https://grafana.com/grafana/dashboards/3800
|
||||
- job_name: 'nomad'
|
||||
scrape_interval: 10s
|
||||
metrics_path: "/v1/metrics"
|
||||
params:
|
||||
format: ['prometheus']
|
||||
scheme: 'https'
|
||||
tls_config:
|
||||
ca_file: /etc/prom/nomad-ca.crt
|
||||
cert_file: /etc/prom/nomad-client.crt
|
||||
key_file: /etc/prom/nomad-client.key
|
||||
insecure_skip_verify: true
|
||||
consul_sd_configs:
|
||||
- server: 'https://localhost:8501'
|
||||
services:
|
||||
- 'nomad-client'
|
||||
tls_config:
|
||||
ca_file: /etc/prom/consul.crt
|
||||
cert_file: /etc/prom/consul-client.crt
|
||||
key_file: /etc/prom/consul-client.key
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
job "telemetry-service" {
|
||||
datacenters = ["neptune", "jupiter", "corrin", "bespin"]
|
||||
datacenters = ["neptune", "dathomir", "corrin", "bespin"]
|
||||
type = "service"
|
||||
|
||||
group "prometheus" {
|
||||
|
@ -53,6 +53,21 @@ job "telemetry-service" {
|
|||
destination = "etc/prom/consul-client.key"
|
||||
}
|
||||
|
||||
template {
|
||||
data = "{{ key \"secrets/nomad/nomad-ca.crt\" }}"
|
||||
destination = "etc/prom/nomad-ca.crt"
|
||||
}
|
||||
|
||||
template {
|
||||
data = "{{ key \"secrets/nomad/nomad-client.crt\" }}"
|
||||
destination = "etc/prom/nomad-client.crt"
|
||||
}
|
||||
|
||||
template {
|
||||
data = "{{ key \"secrets/nomad/nomad-client.key\" }}"
|
||||
destination = "etc/prom/nomad-client.key"
|
||||
}
|
||||
|
||||
resources {
|
||||
memory = 500
|
||||
cpu = 200
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
job "telemetry-system" {
|
||||
datacenters = ["neptune", "jupiter", "corrin", "bespin"]
|
||||
datacenters = ["neptune", "dathomir", "corrin", "bespin"]
|
||||
type = "system"
|
||||
priority = "100"
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
endpoint = "77.207.15.215:33723";
|
||||
};
|
||||
"origan" = {
|
||||
siteName = "jupiter";
|
||||
siteName = "dathomir";
|
||||
publicKey = "smBQYUS60JDkNoqkTT7TgbpqFiM43005fcrT6472llI=";
|
||||
address = "10.14.2.33";
|
||||
endpoint = "82.64.238.84:33733";
|
||||
|
@ -100,7 +100,8 @@
|
|||
## ===== EXPERIMENTAL SECTION FOR STAGING CLUSTER =====
|
||||
|
||||
# Test nomad 1.6
|
||||
services.nomad.package = lib.mkForce pkgs.nomad_1_6;
|
||||
services.nomad.package = pkgs.nomad_1_6;
|
||||
nixpkgs.config.allowUnfree = true; # Accept nomad's BSL license
|
||||
|
||||
# We're doing lots of experiments so GC periodically is usefull.
|
||||
nix.gc.automatic = true;
|
||||
|
@ -108,7 +109,6 @@
|
|||
imports = [
|
||||
## ---- Nix Nomad jobs using nomad-driver-nix2 ----
|
||||
({ pkgs, ... }: {
|
||||
services.nomad.dropPrivileges = false;
|
||||
services.nomad.extraSettingsPlugins = [
|
||||
(import ./nomad-driver-nix2.nix { inherit pkgs; })
|
||||
];
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue