| { system ? builtins.currentSystem }: |
| let |
| pkgs = import <nixpkgs> { inherit system; }; |
| |
| in |
| let |
| img = spec: { |
| streamed = pkgs.dockerTools.streamLayeredImage spec; |
| layered = pkgs.dockerTools.buildLayeredImage spec; |
| image = pkgs.dockerTools.buildImage spec; |
| }; |
| |
| in |
| let |
| dockerComposeOverrideYaml = |
| pkgs.writeTextDir "docker-compose.override.yml" '' |
| version: '2.1' |
| |
| services: |
| mysql-mailcow: |
| image: alpine/socat:1.0.3 |
| command: |
| - UNIX-LISTEN:/var/run/mysqld/mysqld.sock,reuseaddr,fork,unlink-early,mode=0777 |
| - TCP-CONNECT:mysql.system.svc.cluster.local.:3306 |
| volumes: |
| - mysql-socket-vol-1:/var/run/mysqld/:Z |
| restart: always |
| |
| netfilter-mailcow: |
| build: ./data/Dockerfiles/netfilter |
| |
| watchdog-mailcow: |
| build: ./data/Dockerfiles/watchdog |
| |
| volumes: |
| vmail-vol-1: {driver: local, driver_opts: {o: bind, type: none, device: "/vol/vmail"}} |
| vmail-index-vol-1: {driver: local, driver_opts: {o: bind, type: none, device: "/vol/vmail-index"}} |
| mysql-vol-1: {driver: local, driver_opts: {o: bind, type: none, device: "/run/mysql"}} |
| mysql-socket-vol-1: {driver: local, driver_opts: {o: bind, type: none, device: "/run/mysql-socket"}} |
| redis-vol-1: {driver: local, driver_opts: {o: bind, type: none, device: "/vol/redis-data"}} |
| rspamd-vol-1: {driver: local, driver_opts: {o: bind, type: none, device: "/vol/rspamd-data"}} |
| solr-vol-1: {driver: local, driver_opts: {o: bind, type: none, device: "/vol/solr-data"}} |
| postfix-vol-1: {driver: local, driver_opts: {o: bind, type: none, device: "/vol/postfix-data"}} |
| crypt-vol-1: {driver: local, driver_opts: {o: bind, type: none, device: "/vol/crypt-data"}} |
| sogo-web-vol-1: {driver: local, driver_opts: {o: bind, type: none, device: "/vol/sogo-web"}} |
| sogo-userdata-backup-vol-1: {driver: local, driver_opts: {o: bind, type: none, device: "/vol/sogo-userdata-backup"}} |
| ''; |
| |
| init = |
| pkgs.writeShellScriptBin "init" '' |
| set -xeuo pipefail |
| |
| if ! [ -e /vol/docker-data/docker.ext4 ]; then |
| ${pkgs.busybox}/bin/dd if=/dev/zero of=/vol/docker-data/docker.ext4 bs=1G count=0 seek=30 |
| ${pkgs.e2fsprogs}/bin/mkfs.ext4 /vol/docker-data/docker.ext4 |
| fi |
| ${pkgs.e2fsprogs}/bin/e2fsck -y /vol/docker-data/docker.ext4 |
| ${pkgs.busybox}/bin/mkdir -p /var/lib/docker |
| ${pkgs.busybox}/bin/mount -o loop,rw /vol/docker-data/docker.ext4 /var/lib/docker |
| |
| ${pkgs.docker}/bin/dockerd --storage-driver=overlay2 & |
| sleep 10s |
| |
| ${pkgs.docker}/bin/docker kill $(${pkgs.docker}/bin/docker ps -a -q) || : |
| ${pkgs.docker}/bin/docker system prune --volumes --force || : |
| |
| ${pkgs.docker-compose}/bin/docker-compose -f /mailcow-dockerized/docker-compose.yml -f ${dockerComposeOverrideYaml}/docker-compose.override.yml build |
| |
| ${pkgs.busybox}/bin/mkdir -p /tmp /run/{mysql,mysql-socket} |
| exec ${pkgs.docker-compose}/bin/docker-compose --env-file /mailcow-dockerized/mailcow.conf -f /mailcow-dockerized/docker-compose.yml -f ${dockerComposeOverrideYaml}/docker-compose.override.yml up --remove-orphans |
| ''; |
| |
| src = ./src; |
| |
| extraDeps = with pkgs; [ |
| # for Docker |
| cacert |
| |
| # for update.sh |
| bash |
| coreutils |
| curl |
| docker |
| docker-compose |
| findutils |
| gawk |
| gitMinimal |
| ]; |
| |
| maintenanceDeps = with pkgs; [ |
| bash |
| busybox |
| coreutils |
| findutils |
| pxattr |
| strace |
| ]; |
| |
| in |
| img { |
| name = "docker.benkard.de/mulk/mailcow"; |
| tag = "latest"; |
| maxLayers = 125; |
| contents = extraDeps ++ maintenanceDeps; |
| extraCommands = |
| '' |
| #!${pkgs.runtimeShell} |
| |
| install -dm755 vol/{crypt-data,postfix-data,redis-data,rspamd-data,sogo-web,sogo-userdata-backup,solr-data,vmail,vmail-index,web-data} |
| |
| cp -a ${src}/* . |
| ''; |
| config = { |
| Entrypoint = [ "${init}/bin/init" ]; |
| Cmd = [ ]; |
| Workdir = "/mailcow-dockerized"; |
| Volumes = { |
| "/mailcow-dockerized/data/conf" = { }; |
| "/mailcow-dockerized/data/assets/ssl" = { }; |
| "/vol/crypt-data" = { }; |
| "/vol/docker-data" = { }; |
| "/vol/postfix-data" = { }; |
| "/vol/redis-data" = { }; |
| "/vol/rspamd-data" = { }; |
| "/vol/sogo-web" = { }; |
| "/vol/sogo-userdata-backup" = { }; |
| "/vol/solr-data" = { }; |
| "/vol/vmail" = { }; |
| "/vol/vmail-index" = { }; |
| "/vol/web-data" = { }; |
| }; |
| }; |
| } |