191 lines
6.7 KiB
Nix
191 lines
6.7 KiB
Nix
{
|
|
pkgs,
|
|
config,
|
|
lib,
|
|
...
|
|
}: {
|
|
environment.systemPackages = [pkgs.nextcloud33];
|
|
|
|
sops.secrets = {
|
|
# Le nom à gauche (ex: "nextcloud/adminUser") sera le nom du fichier dans /run/secrets/
|
|
# La clé "key" pointe vers la structure dans ton fichier YAML (ex: nextcloud: adminUser: ...)
|
|
|
|
"nextcloud/admin_user" = {
|
|
owner = "nextcloud"; # Important : Nextcloud doit pouvoir lire ce fichier
|
|
group = "nextcloud";
|
|
key = "nextcloud_admin_user";
|
|
};
|
|
|
|
"nextcloud/user" = {
|
|
owner = "nextcloud"; # Important : Nextcloud doit pouvoir lire ce fichier
|
|
group = "nextcloud";
|
|
key = "nextcloud_user";
|
|
};
|
|
|
|
"nextcloud/admin_password" = {
|
|
owner = "nextcloud";
|
|
group = "nextcloud";
|
|
key = "nextcloud_admin_password";
|
|
};
|
|
|
|
# Mot de passe de la base de données
|
|
"nextcloud/password" = {
|
|
owner = "nextcloud";
|
|
group = "nextcloud";
|
|
key = "nextcloud_password";
|
|
};
|
|
};
|
|
|
|
services.nginx.virtualHosts."localhost" = {
|
|
listen = [
|
|
{
|
|
addr = "0.0.0.0";
|
|
port = 8083;
|
|
# locations."= /.well-known/openid-configuration".extraConfig = ''
|
|
# rewrite ^ /index.php$request_uri last;
|
|
# '';
|
|
}
|
|
];
|
|
};
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# CONFIGURATION NEXTCLOUD
|
|
# ---------------------------------------------------------------------------
|
|
services.nextcloud = {
|
|
enable = true;
|
|
package = pkgs.nextcloud33;
|
|
|
|
hostName = "localhost";
|
|
|
|
autoUpdateApps.enable = false;
|
|
appstoreEnable = false;
|
|
configureRedis = true;
|
|
|
|
settings = {
|
|
loglevel = 0;
|
|
auth.bruteforce.protection.enabled = false;
|
|
auth.sso-enabled = false;
|
|
trusted_domains = [
|
|
"localhost"
|
|
"127.0.0.1"
|
|
"192.168.1.44"
|
|
"cloud.vps.marcpartensky.com"
|
|
"cloud.marcpartensky.com"
|
|
"cloud.p2p.marcpartensky.com"
|
|
];
|
|
# Si Traefik est en HTTPS et Nextcloud en HTTP derrière :
|
|
overwriteprotocol = "https";
|
|
overwritehost = "cloud.marcpartensky.com";
|
|
"overwrite.cli.url" = "https://cloud.marcpartensky.com";
|
|
overwritecondaddr = "^127\\.0\\.0\\.1$"; # l'overwrite ne s'applique qu'aux requêtes venant du reverse proxy
|
|
trusted_proxies = ["127.0.0.1" "::1"];
|
|
};
|
|
|
|
config = {
|
|
dbtype = "pgsql";
|
|
dbuser = "nextcloud";
|
|
|
|
# Utilisation du socket Unix (plus performant et sécurisé)
|
|
dbhost = "/run/postgresql";
|
|
|
|
# Injection des secrets via les chemins générés par SOPS
|
|
# user = config.sops.secrets."nextcloud/user".path;
|
|
# adminuser = config.sops.secrets."nextcloud/admin_user";
|
|
adminuser = "root";
|
|
adminpassFile = config.sops.secrets."nextcloud/admin_password".path;
|
|
dbpassFile = config.sops.secrets."nextcloud/password".path;
|
|
};
|
|
|
|
extraApps = {
|
|
inherit
|
|
(config.services.nextcloud.package.packages.apps)
|
|
news
|
|
contacts
|
|
tasks
|
|
calendar
|
|
deck
|
|
memories
|
|
notes
|
|
user_oidc # CONSOMMATEUR OIDC : permet de se connecter a Nextcloud AVEC
|
|
# un compte zitadel (auth.marcpartensky.com). La config du provider
|
|
# ("Zitadel", client_id 317450151415316483) est deja en base dans
|
|
# oc_user_oidc_providers ; l'app etant desinstallee, elle etait
|
|
# simplement inutilisable. Les comptes deja lies sont dans oc_user_oidc.
|
|
;
|
|
# ATTENTION : "oidc" (H2CK) c'est l'INVERSE, Nextcloud en PROVIDER OIDC.
|
|
# Garde car des clients externes peuvent y etre enregistres (oc_oidc_clients).
|
|
oidc = pkgs.fetchNextcloudApp {
|
|
url = "https://github.com/H2CK/oidc/releases/download/2.3.1/oidc-2.3.1.tar.gz";
|
|
hash = "sha256-zfdZSUwV8VZ5qq7rwN/G4cSfTbuutaK+yJ6g8556yOQ=";
|
|
license = "agpl3Plus";
|
|
};
|
|
};
|
|
extraAppsEnable = true;
|
|
};
|
|
|
|
systemd.services.nextcloud-cron.path = [pkgs.procps];
|
|
systemd.services.nextcloud-setup = {
|
|
# postgresql.service est Type=notify : `after` = socket prêt. Le module
|
|
# nixpkgs n'ajoute cet ordre que si database.createLocally = true ; ici la
|
|
# base est déclarée par ensureDatabases/ensureUsers, donc sans ces lignes
|
|
# nextcloud-setup partait en parallèle du démarrage de postgres et mourait
|
|
# sur « connection to server on socket "/run/postgresql/.s.PGSQL.5432"
|
|
# failed: No such file or directory » (boots du 22/10 20:29 et 23/10 09:37).
|
|
after = ["postgresql.service"];
|
|
requires = ["postgresql.service"];
|
|
path = [pkgs.procps];
|
|
serviceConfig = {
|
|
# Change cette valeur pour forcer un re-run au prochain switch : ré-active
|
|
# les apps de extraApps (fix 2026-09-22 : calendar déclaré mais jamais
|
|
# activé, tables oc_calendars absentes -> erreurs 500 CalDAV).
|
|
Environment = ["NC_SETUP_FORCE_RUN=20260924"];
|
|
# app:enable ne lance PAS les migrations : sans upgrade ensuite, les
|
|
# tables des apps (oc_calendars...) ne sont jamais créées.
|
|
ExecStartPost = [
|
|
"${config.services.nextcloud.occ}/bin/nextcloud-occ upgrade"
|
|
# adminpassFile ne fixe le mot de passe QUE lors de l'install initiale
|
|
# (occ maintenance:install) : sur une instance déjà installée il est
|
|
# ignoré silencieusement. Ce ExecStartPost force le mot de passe du
|
|
# compte "root" à la valeur sops à CHAQUE activation (self-healing,
|
|
# tourne à chaque switch). Ajouté le 28/09/2026 suite à un fichier
|
|
# services/nextcloud/password.txt committé en clair (repo public) :
|
|
# rotation forcée pour invalider toute ancienne valeur exposée.
|
|
"${pkgs.writeShellScript "nextcloud-rotate-admin-password" ''
|
|
set -euo pipefail
|
|
export OC_PASS="$(cat ${config.sops.secrets."nextcloud/admin_password".path})"
|
|
${config.services.nextcloud.occ}/bin/nextcloud-occ user:resetpassword --password-from-env root
|
|
''}"
|
|
];
|
|
};
|
|
};
|
|
|
|
# Lancé par nextcloud-setup, mais il ouvre lui aussi la base : même garde
|
|
# (il échouait au boot du 23/10 09:37 sur le socket absent).
|
|
systemd.services.nextcloud-update-db = {
|
|
after = ["postgresql.service"];
|
|
requires = ["postgresql.service"];
|
|
};
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# CONFIGURATION BASE DE DONNÉES (PostgreSQL)
|
|
# ---------------------------------------------------------------------------
|
|
services.postgresql = {
|
|
enable = true;
|
|
|
|
ensureDatabases = ["nextcloud"];
|
|
ensureUsers = [
|
|
{
|
|
name = "nextcloud";
|
|
ensureDBOwnership = true;
|
|
}
|
|
];
|
|
|
|
# Authentification "Peer" via Socket
|
|
authentication = lib.mkOverride 10 ''
|
|
# TYPE DATABASE USER METHOD
|
|
local nextcloud nextcloud peer
|
|
local all all peer
|
|
'';
|
|
};
|
|
}
|