1{
2 config,
3 pkgs,
4 lib,
5 ...
6}:
7let
8 d = lib.py.data.services.nextcloud;
9 i = lib.py.data.services.nextcloud-imaginary;
10in
11{
12 imports = [
13 ./office.nix
14 ./imaginary.nix
15 ];
16 services.nextcloud = {
17 enable = true;
18 package = pkgs.nextcloud31;
19 phpPackage = lib.mkForce pkgs.php82;
20 appstoreEnable = true;
21 caching.redis = true;
22 # Enable Webfinger
23 webfinger = true;
24 # Any additional PHP Extensions we need
25 phpExtraExtensions = all: [
26 all.pdlib
27 all.bz2
28 ];
29 config = {
30 adminpassFile = config.age.secrets.nextcloud-admin-pw.path;
31 adminuser = "pyrox";
32 dbtype = "pgsql";
33 };
34 settings = {
35 default_phone_region = "US";
36 overwriteprotocol = "https";
37 trusted_proxies = [ "100.64.0.0/10" ];
38 # Preview Settings
39 "preview_imaginary_url" = "http://localhost:${builtins.toString i.port}";
40 "preview_format" = "webp";
41 "preview_ffmpeg_path" = "${pkgs.ffmpeg-headless}/bin/ffmpeg";
42 "enabledPreviewProviders" = [
43 "OC\\Preview\\Font"
44 "OC\\Preview\\Krita"
45 "OC\\Preview\\MP3"
46 "OC\\Preview\\MarkDown"
47 "OC\\Preview\\MSOfficeDoc"
48 "OC\\Preview\\OpenDocument"
49 "OC\\Preview\\TXT"
50 "OC\\Preview\\Imaginary"
51 ];
52 # Memories Configuration
53 "memories.exiftool" = "${pkgs.exiftool}/bin/exiftool";
54 "memories.exiftool_no_local" = true;
55 # # Index Everything
56 "memories.index.mode" = "1";
57 # # GIS Data in Postgres
58 "memories.gis_type" = 2;
59 # # Transcoding
60 "memories.vod.disable" = false;
61 "memories.vod.vaapi" = true;
62 "memories.vod.nvenc" = false;
63 "memories.vod.use_gop_size" = false; # NVENV-only
64 "memories.vod.ffmpeg" = "${pkgs.ffmpeg-headless}/bin/ffmpeg";
65 "memories.vod.ffprobe" = "${pkgs.ffmpeg-headless}/bin/ffprobe";
66 "memories.vod.path" = "/var/lib/nextcloud/store-apps/memories/bin-ext/go-vod-amd64";
67 "memories.vod.external" = false;
68
69 # Recognize Options
70 "node_binary" = "${pkgs.nodejs_20}/bin/node";
71 "tensorflow.cores" = 6;
72 "tensorflow.gpu" = false;
73 "musicnn.enabled" = false;
74 "movinet.enabled" = false;
75 "faces.enable" = true;
76 "imagenet.enabled" = true;
77 "landmarks.enabled" = true;
78 };
79 phpOptions = {
80 "opcache.interned_strings_buffer" = "32";
81 "opcache.jit" = "1255";
82 "opcache.jit_buffer_size" = "256M";
83 "opcache.save_comments" = "1";
84 "opcache.validate_timestamps" = "0";
85 };
86 poolSettings = {
87 "pm" = "dynamic";
88 "pm.max_children" = 43;
89 "pm.start_servers" = 10;
90 "pm.min_spare_servers" = 10;
91 "pm.max_spare_servers" = 32;
92 "pm.max_requests" = 500;
93 };
94 configureRedis = true;
95 database.createLocally = true;
96 hostName = d.extUrl;
97 nginx.recommendedHttpHeaders = true;
98 };
99 age.secrets.nextcloud-admin-pw = {
100 file = ./nextcloud-admin-pw.age;
101 owner = "nextcloud";
102 group = "nextcloud";
103 };
104 services.anubis.instances.nextcloud = {
105 settings = {
106 BIND = ":${toString d.anubis}";
107 POLICY_FNAME = "${pkgs.py.anubis-files}/policies/nextcloud.yaml";
108 TARGET = "http://localhost:${toString d.port}";
109 };
110 };
111}