···2525 questionSeconds = 30;
2626 };
27272828- # One address may hold a few tabs (players and a spectator screen) and
2929- # reload at a human pace; each tab keeps one event stream open.
3030- services.nginx.appendHttpConfig = ''
3131- limit_conn_zone $binary_remote_addr zone=nixcon_quiz_conns:10m;
3232- limit_req_zone $binary_remote_addr zone=nixcon_quiz_joins:10m rate=5r/s;
3333- '';
3434-3535- services.nginx.virtualHosts.${domain}.locations."/api/events".extraConfig = ''
3636- limit_conn nixcon_quiz_conns 16;
3737- limit_req zone=nixcon_quiz_joins burst=30 nodelay;
3838- limit_conn_status 429;
3939- limit_req_status 429;
4040- '';
2828+ # No per-address limits on the event streams: the venue Wi-Fi puts every
2929+ # phone at NixCon behind one public address, so a per-IP cap cuts off
3030+ # everyone past the first few players. The quiz caps players itself.
41314232 # The quiz's first home; old links and QR codes land on the new name.
4333 services.nginx.virtualHosts."quiz.lassul.us" = {