]> git.immae.eu Git - perso/Immae/Config/Nix.git/blob - flakes/diaspora/flake.nix
Flake webapps
[perso/Immae/Config/Nix.git] / flakes / diaspora / flake.nix
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