]>
Commit | Line | Data |
---|---|---|
bc0f9fcf IB |
1 | { |
2 | description = "A privacy-aware, distributed, open source social network."; | |
3 | inputs.myuids = { | |
4 | url = "https://git.immae.eu/perso/Immae/Config/Nix.git"; | |
5 | type = "git"; | |
6 | dir = "flakes/myuids"; | |
7 | }; | |
8 | inputs.flake-utils.url = "github:numtide/flake-utils"; | |
9 | inputs.nixpkgs = { | |
10 | url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742"; | |
11 | flake = false; | |
12 | }; | |
13 | inputs.diaspora = { | |
14 | url = "github:diaspora/diaspora/v0.7.10.0"; | |
15 | flake = false; | |
16 | }; | |
17 | ||
18 | outputs = { self, myuids, nixpkgs, diaspora, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system: | |
19 | let | |
20 | pkgs = import nixpkgs { inherit system; overlays = []; }; | |
21 | version = (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes.diaspora.original.ref; | |
22 | inherit (pkgs) callPackage; | |
23 | in rec { | |
24 | packages.diaspora = callPackage ./. { src = diaspora // { inherit version; }; }; | |
25 | defaultPackage = packages.diaspora; | |
26 | legacyPackages.diaspora = packages.diaspora; | |
27 | checks = { | |
28 | build = defaultPackage; | |
29 | }; | |
30 | } | |
31 | ) // rec { | |
32 | overlays = { | |
33 | diaspora = final: prev: { | |
34 | diaspora = self.defaultPackage."${final.system}"; | |
35 | }; | |
36 | }; | |
37 | overlay = overlays.diaspora; | |
38 | nixosModule = { lib, pkgs, config, ... }: | |
39 | let | |
40 | name = "diaspora"; | |
41 | cfg = config.services.diaspora; | |
42 | ||
43 | uid = config.ids.uids.diaspora; | |
44 | gid = config.ids.gids.diaspora; | |
45 | in | |
46 | { | |
47 | options.services.diaspora = { | |
48 | enable = lib.mkEnableOption "Enable Diaspora’s service"; | |
49 | user = lib.mkOption { | |
50 | type = lib.types.str; | |
51 | default = name; | |
52 | description = "User account under which Diaspora runs"; | |
53 | }; | |
54 | group = lib.mkOption { | |
55 | type = lib.types.str; | |
56 | default = name; | |
57 | description = "Group under which Diaspora runs"; | |
58 | }; | |
59 | adminEmail = lib.mkOption { | |
60 | type = lib.types.str; | |
61 | example = "admin@example.com"; | |
62 | description = "Admin e-mail for Diaspora"; | |
63 | }; | |
64 | dataDir = lib.mkOption { | |
65 | type = lib.types.path; | |
66 | default = "/var/lib/${name}"; | |
67 | description = '' | |
68 | The directory where Diaspora stores its data. | |
69 | ''; | |
70 | }; | |
71 | socketsDir = lib.mkOption { | |
72 | type = lib.types.path; | |
73 | default = "/run/${name}"; | |
74 | description = '' | |
75 | The directory where Diaspora puts runtime files and sockets. | |
76 | ''; | |
77 | }; | |
78 | configDir = lib.mkOption { | |
79 | type = lib.types.path; | |
80 | description = '' | |
81 | The configuration path for Diaspora. | |
82 | ''; | |
83 | }; | |
84 | package = lib.mkOption { | |
85 | type = lib.types.package; | |
86 | default = pkgs.diaspora; | |
87 | description = '' | |
88 | Diaspora package to use. | |
89 | ''; | |
90 | }; | |
91 | withLdap = lib.mkEnableOption "Add ldap patch"; | |
92 | # Output variables | |
93 | systemdStateDirectory = lib.mkOption { | |
94 | type = lib.types.str; | |
95 | # Use ReadWritePaths= instead if varDir is outside of /var/lib | |
96 | default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir; | |
97 | lib.strings.removePrefix "/var/lib/" cfg.dataDir; | |
98 | description = '' | |
99 | Adjusted Diaspora data directory for systemd | |
100 | ''; | |
101 | readOnly = true; | |
102 | }; | |
103 | systemdRuntimeDirectory = lib.mkOption { | |
104 | type = lib.types.str; | |
105 | # Use ReadWritePaths= instead if socketsDir is outside of /run | |
106 | default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir; | |
107 | lib.strings.removePrefix "/run/" cfg.socketsDir; | |
108 | description = '' | |
109 | Adjusted Diaspora sockets directory for systemd | |
110 | ''; | |
111 | readOnly = true; | |
112 | }; | |
113 | workdir = lib.mkOption { | |
114 | type = lib.types.package; | |
115 | default = cfg.package.override { | |
116 | varDir = cfg.dataDir; | |
117 | podmin_email = cfg.adminEmail; | |
118 | config_dir = cfg.configDir; | |
119 | ldap = cfg.withLdap; | |
120 | }; | |
121 | description = '' | |
122 | Adjusted diaspora package with overriden values | |
123 | ''; | |
124 | readOnly = true; | |
125 | }; | |
126 | sockets = lib.mkOption { | |
127 | type = lib.types.attrsOf lib.types.path; | |
128 | default = { | |
129 | rails = "${cfg.socketsDir}/diaspora.sock"; | |
130 | eye = "${cfg.socketsDir}/eye.sock"; | |
131 | }; | |
132 | readOnly = true; | |
133 | description = '' | |
134 | Diaspora sockets | |
135 | ''; | |
136 | }; | |
137 | pids = lib.mkOption { | |
138 | type = lib.types.attrsOf lib.types.path; | |
139 | default = { | |
140 | eye = "${cfg.socketsDir}/eye.pid"; | |
141 | }; | |
142 | readOnly = true; | |
143 | description = '' | |
144 | Diaspora pids | |
145 | ''; | |
146 | }; | |
147 | }; | |
148 | ||
149 | config = lib.mkIf cfg.enable { | |
150 | nixpkgs.overlays = [ self.overlay ]; | |
151 | users.users = lib.optionalAttrs (cfg.user == name) { | |
152 | "${name}" = { | |
153 | uid = myuids.lib.uids.diaspora; | |
154 | group = cfg.group; | |
155 | description = "Diaspora user"; | |
156 | home = cfg.dataDir; | |
157 | packages = [ cfg.workdir.gems pkgs.nodejs cfg.workdir.gems.ruby ]; | |
158 | useDefaultShell = true; | |
159 | }; | |
160 | }; | |
161 | users.groups = lib.optionalAttrs (cfg.group == name) { | |
162 | "${name}" = { | |
163 | gid = myuids.lib.gids.diaspora; | |
164 | }; | |
165 | }; | |
166 | ||
167 | systemd.services.diaspora = { | |
168 | description = "Diaspora"; | |
169 | wantedBy = [ "multi-user.target" ]; | |
170 | after = [ | |
171 | "network.target" "redis.service" "postgresql.service" | |
172 | ]; | |
173 | wants = [ | |
174 | "redis.service" "postgresql.service" | |
175 | ]; | |
176 | ||
177 | environment.RAILS_ENV = "production"; | |
178 | environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}"; | |
179 | environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile"; | |
180 | environment.EYE_SOCK = cfg.sockets.eye; | |
181 | environment.EYE_PID = cfg.pids.eye; | |
182 | ||
183 | path = [ cfg.workdir.gems pkgs.nodejs cfg.workdir.gems.ruby pkgs.curl pkgs.which pkgs.gawk ]; | |
184 | ||
185 | preStart = '' | |
186 | install -m 0755 -d ${cfg.dataDir}/uploads ${cfg.dataDir}/tmp ${cfg.dataDir}/log | |
187 | install -m 0700 -d ${cfg.dataDir}/tmp/pids | |
188 | if [ ! -f ${cfg.dataDir}/schedule.yml ]; then | |
189 | echo "{}" > ${cfg.dataDir}/schedule.yml | |
190 | fi | |
191 | ./bin/bundle exec rails db:migrate | |
192 | ''; | |
193 | ||
194 | script = '' | |
195 | exec ${cfg.workdir}/script/server | |
196 | ''; | |
197 | ||
198 | serviceConfig = { | |
199 | User = cfg.user; | |
200 | PrivateTmp = true; | |
201 | Restart = "always"; | |
202 | Type = "simple"; | |
203 | WorkingDirectory = cfg.workdir; | |
204 | StateDirectory = cfg.systemdStateDirectory; | |
205 | RuntimeDirectory = cfg.systemdRuntimeDirectory; | |
206 | StandardInput = "null"; | |
207 | KillMode = "control-group"; | |
208 | }; | |
209 | ||
210 | unitConfig.RequiresMountsFor = cfg.dataDir; | |
211 | }; | |
212 | }; | |
213 | }; | |
214 | }; | |
215 | } | |
216 |