1{ config, lib, pkgs, ... }:
2
3with lib;
4
5let
6 cfg = config.services.nodeDockerRegistry;
7
8in {
9 options.services.nodeDockerRegistry = {
10 enable = mkEnableOption "docker registry service";
11
12 port = mkOption {
13 description = "Docker registry listening port.";
14 default = 8080;
15 type = types.int;
16 };
17
18 users = mkOption {
19 description = "Docker registry list of users.";
20 default = [];
21 options = [{
22 user = mkOption {
23 description = "Docker registry user username.";
24 type = types.str;
25 };
26
27 pass = mkOption {
28 description = "Docker registry user password.";
29 type = types.str;
30 };
31 }];
32 type = types.listOf types.optionSet;
33 };
34
35 onTag = mkOption {
36 description = "Docker registry hook triggered when an image is tagged.";
37 default = "";
38 type = types.str;
39 };
40
41 onImage = mkOption {
42 description = "Docker registry hook triggered when an image metadata is uploaded.";
43 default = "";
44 type = types.str;
45 };
46
47 onLayer = mkOption {
48 description = "Docker registry hook triggered when an when an image layer is uploaded.";
49 default = "";
50 type = types.str;
51 };
52
53 onVerify = mkOption {
54 description = "Docker registry hook triggered when an image layer+metadata has been verified.";
55 default = "";
56 type = types.str;
57 };
58
59 onIndex = mkOption {
60 description = "Docker registry hook triggered when an when an image file system data has been indexed.";
61 default = "";
62 type = types.str;
63 };
64
65 dataDir = mkOption {
66 description = "Docker registry data directory";
67 default = "/var/lib/docker-registry";
68 type = types.path;
69 };
70 };
71
72 config = mkIf cfg.enable {
73 systemd.services.docker-registry-server = {
74 description = "Docker Registry Service.";
75 wantedBy = ["multi-user.target"];
76 after = ["network.target"];
77 script = ''
78 ${pkgs.nodePackages.docker-registry-server}/bin/docker-registry-server \
79 --dir ${cfg.dataDir} \
80 --port ${toString cfg.port} \
81 ${concatMapStringsSep " " (u: "--user ${u.user}:${u.pass}") cfg.users} \
82 ${optionalString (cfg.onTag != "") "--on-tag '${cfg.onTag}'"} \
83 ${optionalString (cfg.onImage != "") "--on-image '${cfg.onImage}'"} \
84 ${optionalString (cfg.onVerify != "") "--on-verify '${cfg.onVerify}'"} \
85 ${optionalString (cfg.onIndex != "") "--on-index '${cfg.onIndex}'"}
86 '';
87
88 serviceConfig.User = "docker-registry";
89 };
90
91 users.extraUsers.docker-registry = {
92 uid = config.ids.uids.docker-registry;
93 description = "Docker registry user";
94 createHome = true;
95 home = cfg.dataDir;
96 };
97 };
98}