diff options
-rw-r--r-- | ymir.nix | 255 |
1 files changed, 190 insertions, 65 deletions
@@ -6,18 +6,6 @@ let | |||
6 | luaPam = pkgs.callPackage ./custom/luaPam.nix {}; | 6 | luaPam = pkgs.callPackage ./custom/luaPam.nix {}; |
7 | luaPosix = pkgs.callPackage ./custom/luaPosix.nix {}; | 7 | luaPosix = pkgs.callPackage ./custom/luaPosix.nix {}; |
8 | luaSha2 = pkgs.callPackage ./custom/luaSha2.nix {}; | 8 | luaSha2 = pkgs.callPackage ./custom/luaSha2.nix {}; |
9 | prosodyAuth = pkgs.callPackage ./custom/prosody-auth.nix {}; | ||
10 | prosodyVirtHost = name: { | ||
11 | enabled = true; | ||
12 | domain = name; | ||
13 | ssl = { | ||
14 | key = "/var/lib/acme/yggdrasil.li/key.pem"; | ||
15 | cert = "/var/lib/acme/yggdrasil.li/fullchain.pem"; | ||
16 | extraOptions = { | ||
17 | dhparam = config.security.dhparams.params.prosody.path; | ||
18 | }; | ||
19 | }; | ||
20 | }; | ||
21 | myDomains = [ "dirty-haskell.org" "www.dirty-haskell.org" "lists.dirty-haskell.org" "l.dirty-haskell.org" | 9 | myDomains = [ "dirty-haskell.org" "www.dirty-haskell.org" "lists.dirty-haskell.org" "l.dirty-haskell.org" |
22 | "online.141.li" "o.141.li" "ftp.141.li" "files.141.li" "f.141.li" "ymir.141.li" "141.li" "www.141.li" "lists.141.li" "l.141.li" "rpg.141.li" "odin.141.li" | 10 | "online.141.li" "o.141.li" "ftp.141.li" "files.141.li" "f.141.li" "ymir.141.li" "141.li" "www.141.li" "lists.141.li" "l.141.li" "rpg.141.li" "odin.141.li" |
23 | "ymir.xmpp.li" "xmpp.li" "www.xmpp.li" "lists.xmpp.li" "l.xmpp.li" "muc.xmpp.li" "proxy.xmpp.li" | 11 | "ymir.xmpp.li" "xmpp.li" "www.xmpp.li" "lists.xmpp.li" "l.xmpp.li" "muc.xmpp.li" "proxy.xmpp.li" |
@@ -68,13 +56,6 @@ in rec { | |||
68 | 56 | ||
69 | nixpkgs.overlays = [ | 57 | nixpkgs.overlays = [ |
70 | (self: super: { | 58 | (self: super: { |
71 | prosody = self.callPackage ./customized/prosody.nix ({ | ||
72 | inherit (self.lua51Packages) luasocket luaexpat luafilesystem luabitop luaevent luasec luadbi; | ||
73 | lua5 = pkgs.lua5_1; | ||
74 | withCommunityModules = ["carbons" "reload_modules" "csi" "cloud_notify" "csi_pump" "smacks" "track_muc_joins" "watchuntrusted"]; | ||
75 | extraModules = [prosodyAuth]; | ||
76 | extraLibs = [luaPam luaPosix luaSha2] ++ (with self.lua51Packages; [lua-zlib]); | ||
77 | }); | ||
78 | # uwsgi = pkgs.callPackage ./customized/uwsgi.nix { | 59 | # uwsgi = pkgs.callPackage ./customized/uwsgi.nix { |
79 | # extraPlugins = { | 60 | # extraPlugins = { |
80 | # cgi = { | 61 | # cgi = { |
@@ -243,7 +224,7 @@ in rec { | |||
243 | }; | 224 | }; |
244 | 225 | ||
245 | users.groups."ssl" = { | 226 | users.groups."ssl" = { |
246 | members = [ "prosody" | 227 | members = [ "ejabberd" |
247 | "nginx" | 228 | "nginx" |
248 | "postfix" | 229 | "postfix" |
249 | "murmur" | 230 | "murmur" |
@@ -257,59 +238,203 @@ in rec { | |||
257 | SystemMaxUse=100M | 238 | SystemMaxUse=100M |
258 | ''; | 239 | ''; |
259 | }; | 240 | }; |
260 | |||
261 | services.prosody = { | ||
262 | enable = true; | ||
263 | admins = [ | ||
264 | "gkleen@xmpp.li" | ||
265 | "gkleen@praseodym.org" | ||
266 | "gkleen@141.li" | ||
267 | "gkleen@yggdrasil.li" | ||
268 | ]; | ||
269 | allowRegistration = false; | ||
270 | extraModules = [ "posix" | ||
271 | "private" | ||
272 | "auth_custom" | ||
273 | "carbons" | ||
274 | "reload_modules" | ||
275 | "smacks" | ||
276 | "csi" | ||
277 | "csi_pump" | ||
278 | "cloud_notify" | ||
279 | "pep" | ||
280 | "disco" | ||
281 | "admin_adhoc" | ||
282 | "watchuntrusted" | ||
283 | ]; | ||
284 | extraConfig = '' | ||
285 | reload_modules = { "group", "tls" } | ||
286 | authentication="custom" | ||
287 | custom_alias_file="/etc/prosody/aliases" | ||
288 | custom_alias_secret_file="/etc/prosody/alias_secret" | ||
289 | 241 | ||
290 | Component "alias.xmpp.li" | 242 | services.ejabberd = { |
291 | Include "/etc/prosody/alias.xmpp.li.cfg.lua" | 243 | enable = true; |
292 | 244 | package = pkgs.ejabberd.override { withPam = true; }; | |
293 | Component "muc.xmpp.li" "muc" | 245 | configFile = '' |
294 | restrict_room_creation = true | 246 | loglevel: 4 |
295 | max_history_messages = 100 | 247 | hosts: |
296 | name = "Multi-user chats" | 248 | - xmpp.li |
297 | 249 | - yggdrasil.li | |
298 | Component "proxy.xmpp.li" "proxy65" | 250 | - praseodym.org |
299 | proxy65_acl = {"xmpp.li", "yggdrasil.li", "praseodym.org", "141.li", "nights.email"}; | 251 | - 141.li |
252 | - nights.email | ||
253 | certfiles: | ||
254 | - /var/lib/acme/yggdrasil.li/fullchain.pem | ||
255 | - /var/lib/acme/yggdrasil.li/key.pem | ||
256 | listen: | ||
257 | - port: 5222 | ||
258 | ip: "::" | ||
259 | module: ejabberd_c2s | ||
260 | starttls: true | ||
261 | starttls_required: true | ||
262 | max_stanza_size: 262144 | ||
263 | shaper: c2s_shaper | ||
264 | access: c2s | ||
265 | - port: 5269 | ||
266 | ip: "::" | ||
267 | module: ejabberd_s2s_in | ||
268 | max_stanza_size: 524288 | ||
269 | s2s_use_starttls: optional | ||
270 | |||
271 | auth_method: [pam] | ||
272 | pam_service: xmpp | ||
273 | |||
274 | acl: | ||
275 | local: | ||
276 | user_regexp: "" | ||
277 | loopback: | ||
278 | ip: | ||
279 | - 127.0.0.0/8 | ||
280 | - ::1/128 | ||
281 | admin: | ||
282 | user: | ||
283 | - "gkleen@xmpp.li" | ||
284 | - "gkleen@praseodym.org" | ||
285 | - "gkleen@141.li" | ||
286 | - "gkleen@yggdrasil.li" | ||
287 | |||
288 | access_rules: | ||
289 | local: | ||
290 | allow: local | ||
291 | c2s: | ||
292 | deny: blocked | ||
293 | allow: all | ||
294 | announce: | ||
295 | allow: admin | ||
296 | configure: | ||
297 | allow: admin | ||
298 | muc_create: | ||
299 | allow: local | ||
300 | pubsub_createnode: | ||
301 | allow: local | ||
302 | trusted_network: | ||
303 | allow: loopback | ||
304 | |||
305 | api_permissions: | ||
306 | "console commands": | ||
307 | from: | ||
308 | - ejabberd_ctl | ||
309 | who: all | ||
310 | what: "*" | ||
311 | "admin access": | ||
312 | who: | ||
313 | access: | ||
314 | allow: | ||
315 | - acl: loopback | ||
316 | - acl: admin | ||
317 | oauth: | ||
318 | scope: "ejabberd:admin" | ||
319 | access: | ||
320 | allow: | ||
321 | - acl: loopback | ||
322 | - acl: admin | ||
323 | what: | ||
324 | - "*" | ||
325 | - "!stop" | ||
326 | - "!start" | ||
327 | "public commands": | ||
328 | who: | ||
329 | ip: 127.0.0.1/8 | ||
330 | what: | ||
331 | - status | ||
332 | - connected_users_number | ||
333 | |||
334 | shaper: | ||
335 | normal: | ||
336 | rate: 3000 | ||
337 | burst_size: 20000 | ||
338 | fast: 100000 | ||
339 | |||
340 | shaper_rules: | ||
341 | max_user_sessions: 10 | ||
342 | max_user_offline_messages: | ||
343 | 5000: admin | ||
344 | 100: all | ||
345 | c2s_shaper: | ||
346 | none: admin | ||
347 | normal: all | ||
348 | s2s_shaper: fast | ||
349 | |||
350 | modules: | ||
351 | mod_adhoc: {} | ||
352 | mod_admin_extra: {} | ||
353 | mod_announce: | ||
354 | access: announce | ||
355 | mod_avatar: {} | ||
356 | mod_blocking: {} | ||
357 | mod_bosh: {} | ||
358 | mod_caps: {} | ||
359 | mod_carboncopy: {} | ||
360 | mod_client_state: {} | ||
361 | mod_configure: {} | ||
362 | mod_disco: {} | ||
363 | mod_fail2ban: {} | ||
364 | mod_http_api: {} | ||
365 | # mod_http_upload: | ||
366 | # put_url: https://@HOST@:5443/upload | ||
367 | # custom_headers: | ||
368 | # "Access-Control-Allow-Origin": "https://@HOST@" | ||
369 | # "Access-Control-Allow-Methods": "GET,HEAD,PUT,OPTIONS" | ||
370 | # "Access-Control-Allow-Headers": "Content-Type" | ||
371 | mod_last: {} | ||
372 | mod_mam: | ||
373 | ## Mnesia is limited to 2GB, better to use an SQL backend | ||
374 | ## For small servers SQLite is a good fit and is very easy | ||
375 | ## to configure. Uncomment this when you have SQL configured: | ||
376 | ## db_type: sql | ||
377 | assume_mam_usage: true | ||
378 | default: always | ||
379 | mod_mqtt: {} | ||
380 | mod_muc: | ||
381 | access: | ||
382 | - allow | ||
383 | access_admin: | ||
384 | - allow: admin | ||
385 | access_create: muc_create | ||
386 | access_persistent: muc_create | ||
387 | access_mam: | ||
388 | - allow | ||
389 | default_room_options: | ||
390 | mam: true | ||
391 | mod_muc_admin: {} | ||
392 | mod_offline: | ||
393 | access_max_user_messages: max_user_offline_messages | ||
394 | mod_ping: {} | ||
395 | mod_privacy: {} | ||
396 | mod_private: {} | ||
397 | mod_proxy65: | ||
398 | access: local | ||
399 | max_connections: 5 | ||
400 | mod_pubsub: | ||
401 | access_createnode: pubsub_createnode | ||
402 | plugins: | ||
403 | - flat | ||
404 | - pep | ||
405 | force_node_config: | ||
406 | ## Avoid buggy clients to make their bookmarks public | ||
407 | storage:bookmarks: | ||
408 | access_model: whitelist | ||
409 | mod_push: {} | ||
410 | mod_push_keepalive: {} | ||
411 | mod_register: | ||
412 | ## Only accept registration requests from the "trusted" | ||
413 | ## network (see access_rules section above). | ||
414 | ## Think twice before enabling registration from any | ||
415 | ## address. See the Jabber SPAM Manifesto for details: | ||
416 | ## https://github.com/ge0rg/jabber-spam-fighting-manifesto | ||
417 | ip_access: trusted_network | ||
418 | mod_roster: | ||
419 | versioning: true | ||
420 | mod_s2s_dialback: {} | ||
421 | mod_shared_roster: {} | ||
422 | mod_stream_mgmt: | ||
423 | resend_on_timeout: if_offline | ||
424 | mod_stun_disco: {} | ||
425 | mod_vcard: {} | ||
426 | mod_vcard_xupdate: {} | ||
427 | mod_version: | ||
428 | show_os: false | ||
300 | ''; | 429 | ''; |
301 | |||
302 | virtualHosts = builtins.listToAttrs (map (name: { inherit name; value = prosodyVirtHost name; }) | ||
303 | ["xmpp.li" "yggdrasil.li" "praseodym.org" "141.li" "nights.email"]); | ||
304 | |||
305 | xmppComplianceSuite = false; | ||
306 | }; | 430 | }; |
431 | |||
307 | security.pam.services."xmpp".text = '' | 432 | security.pam.services."xmpp".text = '' |
308 | auth requisite pam_succeed_if.so user ingroup xmpp | 433 | auth requisite pam_succeed_if.so user ingroup xmpp |
309 | auth required pam_unix.so audit | 434 | auth required pam_unix.so audit |
310 | ''; | 435 | ''; |
311 | users.groups."shadow" = { | 436 | users.groups."shadow" = { |
312 | members = [ "prosody" | 437 | members = [ "ejabberd" |
313 | ]; | 438 | ]; |
314 | }; | 439 | }; |
315 | users.groups."xmpp" = {}; | 440 | users.groups."xmpp" = {}; |