Files

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
'';
};
}