blob: c5dd06343b07d013ecb364cd826628917f84026b [file] [log] [blame]
Matthias Andreas Benkard170a5ac2021-01-02 12:36:02 +01001{ system ? builtins.currentSystem }:
2let
Matthias Andreas Benkard9d05b872022-12-28 21:27:39 +01003 pkgs = import <nixpkgs> {
4 inherit system;
5 overlays = [
6 (self: super: {
7 docker = super.docker.override {
8 iptables = self.iptables-legacy;
9 };
10 })
11 ];
12 };
Matthias Andreas Benkard170a5ac2021-01-02 12:36:02 +010013
14in
15let
16 img = spec: {
17 streamed = pkgs.dockerTools.streamLayeredImage spec;
18 layered = pkgs.dockerTools.buildLayeredImage spec;
19 image = pkgs.dockerTools.buildImage spec;
20 };
21
22in
23let
24 dockerComposeOverrideYaml =
25 pkgs.writeTextDir "docker-compose.override.yml" ''
26 version: '2.1'
27
28 services:
29 mysql-mailcow:
30 image: alpine/socat:1.0.3
31 command:
32 - UNIX-LISTEN:/var/run/mysqld/mysqld.sock,reuseaddr,fork,unlink-early,mode=0777
33 - TCP-CONNECT:mysql.system.svc.cluster.local.:3306
34 volumes:
35 - mysql-socket-vol-1:/var/run/mysqld/:Z
36 restart: always
37
38 netfilter-mailcow:
39 build: ./data/Dockerfiles/netfilter
40
Matthias Andreas Benkard63964b42022-12-28 22:38:46 +010041 dockerapi-mailcow:
42 build: ./data/Dockerfiles/dockerapi
43
Matthias Andreas Benkard170a5ac2021-01-02 12:36:02 +010044 watchdog-mailcow:
45 build: ./data/Dockerfiles/watchdog
46
47 volumes:
48 vmail-vol-1: {driver: local, driver_opts: {o: bind, type: none, device: "/vol/vmail"}}
49 vmail-index-vol-1: {driver: local, driver_opts: {o: bind, type: none, device: "/vol/vmail-index"}}
50 mysql-vol-1: {driver: local, driver_opts: {o: bind, type: none, device: "/run/mysql"}}
51 mysql-socket-vol-1: {driver: local, driver_opts: {o: bind, type: none, device: "/run/mysql-socket"}}
52 redis-vol-1: {driver: local, driver_opts: {o: bind, type: none, device: "/vol/redis-data"}}
53 rspamd-vol-1: {driver: local, driver_opts: {o: bind, type: none, device: "/vol/rspamd-data"}}
54 solr-vol-1: {driver: local, driver_opts: {o: bind, type: none, device: "/vol/solr-data"}}
55 postfix-vol-1: {driver: local, driver_opts: {o: bind, type: none, device: "/vol/postfix-data"}}
56 crypt-vol-1: {driver: local, driver_opts: {o: bind, type: none, device: "/vol/crypt-data"}}
57 sogo-web-vol-1: {driver: local, driver_opts: {o: bind, type: none, device: "/vol/sogo-web"}}
58 sogo-userdata-backup-vol-1: {driver: local, driver_opts: {o: bind, type: none, device: "/vol/sogo-userdata-backup"}}
59 '';
60
61 init =
62 pkgs.writeShellScriptBin "init" ''
63 set -xeuo pipefail
64
65 if ! [ -e /vol/docker-data/docker.ext4 ]; then
66 ${pkgs.busybox}/bin/dd if=/dev/zero of=/vol/docker-data/docker.ext4 bs=1G count=0 seek=30
67 ${pkgs.e2fsprogs}/bin/mkfs.ext4 /vol/docker-data/docker.ext4
68 fi
69 ${pkgs.e2fsprogs}/bin/e2fsck -y /vol/docker-data/docker.ext4
70 ${pkgs.busybox}/bin/mkdir -p /var/lib/docker
71 ${pkgs.busybox}/bin/mount -o loop,rw /vol/docker-data/docker.ext4 /var/lib/docker
Matthias Andreas Benkarded8280c2026-10-23 07:12:55 +020072 #${pkgs.busybox}/bin/mkdir -p /var/lib/docker/containers
73 #${pkgs.busybox}/bin/mount -t tmpfs none /var/lib/docker/containers
Matthias Andreas Benkard170a5ac2021-01-02 12:36:02 +010074
Matthias Andreas Benkarded8280c2026-10-23 07:12:55 +020075 ${pkgs.docker}/bin/dockerd --storage-driver=overlay2 --log-driver=local --log-opt=max-size=10m --log-opt=compress=true &
Matthias Andreas Benkard170a5ac2021-01-02 12:36:02 +010076 sleep 10s
77
78 ${pkgs.docker}/bin/docker kill $(${pkgs.docker}/bin/docker ps -a -q) || :
79 ${pkgs.docker}/bin/docker system prune --volumes --force || :
80
81 ${pkgs.docker-compose}/bin/docker-compose -f /mailcow-dockerized/docker-compose.yml -f ${dockerComposeOverrideYaml}/docker-compose.override.yml build
82
83 ${pkgs.busybox}/bin/mkdir -p /tmp /run/{mysql,mysql-socket}
Matthias Andreas Benkard9d05b872022-12-28 21:27:39 +010084 ${pkgs.busybox}/bin/chmod u+w /mailcow-dockerized/data/web/templates/cache
Matthias Andreas Benkard170a5ac2021-01-02 12:36:02 +010085 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
86 '';
87
88 src = ./src;
89
90 extraDeps = with pkgs; [
91 # for Docker
92 cacert
93
94 # for update.sh
95 bash
96 coreutils
97 curl
98 docker
99 docker-compose
100 findutils
101 gawk
102 gitMinimal
103 ];
104
105 maintenanceDeps = with pkgs; [
106 bash
107 busybox
108 coreutils
109 findutils
110 pxattr
111 strace
112 ];
113
114in
115img {
116 name = "docker.benkard.de/mulk/mailcow";
Matthias Andreas Benkard2e7a09c2021-01-06 17:59:02 +0100117 #tag = "latest";
Matthias Andreas Benkard170a5ac2021-01-02 12:36:02 +0100118 maxLayers = 125;
119 contents = extraDeps ++ maintenanceDeps;
120 extraCommands =
121 ''
122 #!${pkgs.runtimeShell}
123
124 install -dm755 vol/{crypt-data,postfix-data,redis-data,rspamd-data,sogo-web,sogo-userdata-backup,solr-data,vmail,vmail-index,web-data}
125
126 cp -a ${src}/* .
127 '';
128 config = {
129 Entrypoint = [ "${init}/bin/init" ];
130 Cmd = [ ];
131 Workdir = "/mailcow-dockerized";
132 Volumes = {
133 "/mailcow-dockerized/data/conf" = { };
134 "/mailcow-dockerized/data/assets/ssl" = { };
135 "/vol/crypt-data" = { };
136 "/vol/docker-data" = { };
137 "/vol/postfix-data" = { };
138 "/vol/redis-data" = { };
139 "/vol/rspamd-data" = { };
140 "/vol/sogo-web" = { };
141 "/vol/sogo-userdata-backup" = { };
142 "/vol/solr-data" = { };
143 "/vol/vmail" = { };
144 "/vol/vmail-index" = { };
145 "/vol/web-data" = { };
146 };
147 };
148}