{ pkgs, ... }:
let
apacheHttpd = pkgs.apacheHttpd.overrideAttrs (oldAttrs: {
env.NIX_CFLAGS_COMPILE = "-DBIG_SECURITY_HOLE";
});
# https://docs.nextcloud.com/server/latest/admin_manual/installation/php_configuration.html
php =
(pkgs.php83.override {
inherit apacheHttpd;
apxs2Support = true;
}).buildEnv
{
extensions =
{ all, ... }:
with all;
[
ctype
curl
dom
fileinfo
filter
gd
mbstring
openssl
posix
session
simplexml
xmlreader
xmlwriter
zip
zlib
pdo_pgsql
intl
sodium
apcu
imagick
exif
pcntl
opcache
gmp
sysvsem
];
extraConfig = ''
expose_php = Off
memory_limit = 2048M
apc.shm_size = 128M
opcache.jit = 1255
opcache.jit_buffer_size = 8M
opcache.interned_strings_buffer = 16
upload_max_filesize = 100G
post_max_size = 100G
max_input_time = 3600
max_execution_time = 3600
output_buffering = 0
'';
};
apacheHttpdConfig = pkgs.writeTextDir "/etc/httpd/httpd.conf" ''
ServerRoot ${apacheHttpd}
ServerName localhost
Listen 80
LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule unixd_module modules/mod_unixd.so
LoadModule headers_module modules/mod_headers.so
LoadModule env_module modules/mod_env.so
LoadModule dir_module modules/mod_dir.so
LoadModule mime_module modules/mod_mime.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule php_module ${php}/modules/libphp.so
User root
Group root
PidFile /run/httpd/httpd.pid
LogLevel warn
ErrorLog /dev/stderr
TypesConfig conf/mime.types
AddType application/x-httpd-php .php .phtml
DocumentRoot "/var/www/nextcloud"
DirectoryIndex index.php index.html
LimitRequestBody 0
TimeOut 3600
Require all granted
AllowOverride All
Options FollowSymLinks MultiViews
Require all denied
'';
occ = pkgs.writeShellApplication {
name = "occ";
text = ''
exec ${pkgs.lib.meta.getExe php} /var/www/nextcloud/occ "$@"
'';
};
nextcloud31 =
let
nextcloud31 = pkgs.nextcloud31.overrideAttrs (oldAttrs: {
patches = oldAttrs.patches or [ ] ++ [ ./declarative-secrets.patch ];
});
in
pkgs.runCommandLocal "nextcloud" { } ''
mkdir -p $out/var/www
cp -r ${nextcloud31} $out/var/www/nextcloud
'';
crontab = pkgs.writeTextDir "/var/cron/tabs/root" ''
*/5 * * * * ${pkgs.lib.meta.getExe php} -f /var/www/nextcloud/cron.php
'';
entrypoint = pkgs.writeTextFile {
name = "entrypoint";
executable = true;
destination = "/bin/entrypoint";
text = builtins.readFile ./entrypoint.sh;
};
in
pkgs.dockerTools.buildImage {
name = "nextcloud";
fromImage = pkgs.docker-image-base;
copyToRoot = pkgs.buildEnv {
name = "root";
paths = with pkgs; [
apacheHttpd
apacheHttpdConfig
php
nextcloud31
occ
entrypoint
crontab
cron
ffmpeg
];
pathsToLink = [
"/bin"
"/etc"
"/var"
];
};
runAsRoot = ''
mkdir -p /run/httpd
'';
config = {
Entrypoint = [ "entrypoint" ];
Cmd = [
"-D"
"FOREGROUND"
"-f"
"/etc/httpd/httpd.conf"
];
WorkingDir = "/var/lib/nextcloud";
Volumes = {
"/var/www/nextcloud/config" = { };
"/var/www/nextcloud/apps" = { };
"/var/lib/nextcloud" = { };
};
ExposedPorts = {
"80/tcp" = { };
};
};
}