summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common-playbook.yml5
-rw-r--r--roles/lounge/defaults/main.yml4
-rw-r--r--roles/lounge/tasks/main.yml40
-rw-r--r--roles/lounge/templates/error.html37
-rw-r--r--roles/lounge/templates/nginx-site-config63
-rw-r--r--roles/lounge/templates/thelounge.service11
6 files changed, 160 insertions, 0 deletions
diff --git a/common-playbook.yml b/common-playbook.yml
index 4b12e4d..9cb44a3 100644
--- a/common-playbook.yml
+++ b/common-playbook.yml
@@ -71,3 +71,8 @@
tags: live
roles:
- live
+- name: Set up lounge
+ hosts: front
+ tags: lounge
+ roles:
+ - lounge
diff --git a/roles/lounge/defaults/main.yml b/roles/lounge/defaults/main.yml
new file mode 100644
index 0000000..26fbaaa
--- /dev/null
+++ b/roles/lounge/defaults/main.yml
@@ -0,0 +1,4 @@
+lounge_domain: chat.emacsconf.org
+irc_network: irc.libera.chat
+irc_port: 6697
+irc_channels: "#emacsconf, #emacsconf-gen, #emacsconf-dev, and #emacsconf-org"
diff --git a/roles/lounge/tasks/main.yml b/roles/lounge/tasks/main.yml
new file mode 100644
index 0000000..8c6593f
--- /dev/null
+++ b/roles/lounge/tasks/main.yml
@@ -0,0 +1,40 @@
+- name: Create directory
+ file:
+ path: /var/www/{{ lounge_domain }}
+ owner: "{{ emacsconf_user }}"
+ group: "{{ emacsconf_group }}"
+ state: directory
+- name: Set up error page
+ template:
+ src: error.html
+ dest: /var/www/{{ lounge_domain }}/error.html
+ mode: 0755
+ owner: "{{ emacsconf_user }}"
+ group: "{{ emacsconf_group }}"
+- name: Create main configuration if needed
+ template:
+ src: nginx-site-config
+ dest: /etc/nginx/sites-available/{{ lounge_domain }}
+- name: Make sure main configuration is enabled
+ file:
+ src: /etc/nginx/sites-available/{{ lounge_domain }}
+ dest: /etc/nginx/sites-enabled/{{ lounge_domain }}
+ owner: "{{ emacsconf_user }}"
+ group: "{{ emacsconf_group }}"
+ force: no
+ state: link
+- name: Reload configuration
+ become: true
+ service:
+ name: nginx
+ state: reloaded
+- name: Install systemd configuration
+ tags: system
+ become: true
+ template:
+ src: thelounge.service
+ dest: /etc/systemd/system/thelounge.service
+ owner: root
+ group: root
+ mode: 0755
+ when: not use_initd
diff --git a/roles/lounge/templates/error.html b/roles/lounge/templates/error.html
new file mode 100644
index 0000000..5e2a093
--- /dev/null
+++ b/roles/lounge/templates/error.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8">
+ <title>{{lounge_domain}} currently unavailable</title>
+ <style>
+ body { padding: 20px; font-family: Arial, sans-serif }
+ </style>
+</head>
+<body>
+ <h1>Web-based chat is currently unavailable (code 502)</h1>
+
+ <p>The web-based IRC interface will be available during <a href="https://{{emacsconf_domain}}/{{emacsconf_year}}">{{emacsconf_name}} {{emacsconf_year}}</a>. Please check back then. In the meantime, you can also connect to {{irc_network}}:{{irc_port}} with your favorite IRC client and join {{irc_channels}}.
+
+ <p>This page will refresh when the site is back. You can also check <a href="https://status.emacsconf.org">status.emacsconf.org</a> for updates.</p>
+
+ <noscript>Your browser doesn’t support javascript. Please try refreshing the page manually every few minutes.</noscript>
+
+ <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
+ <script>
+ var retryCurrent = 30, retryMax = 60 * 5;
+ async function check() {
+ let result = await fetch(window.location.href, { method: HEAD }).then(resp => {
+ if (resp.status == 200) {
+ window.location.reload(true);
+ } else if (resp.status == 502) {
+ if (retryCurrent < retryMax) {
+ retryCurrent = Math.min(retryCurrent * 2, retryMax);
+ }
+ setTimeout(check, retryCurrent * 1000);
+ }
+ });
+ }
+ setTimeout(check_response, retryCurrent * 1000);
+ </script>
+</body>
+</html>
diff --git a/roles/lounge/templates/nginx-site-config b/roles/lounge/templates/nginx-site-config
new file mode 100644
index 0000000..cc6aa4d
--- /dev/null
+++ b/roles/lounge/templates/nginx-site-config
@@ -0,0 +1,63 @@
+upstream backend {
+ server 127.0.0.1:9000;
+}
+
+proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=thelounge_cache:10m max_size=3g inactive=120m use_temp_path=off;
+
+
+server {
+ listen 80;
+ listen [::]:80;
+ server_name chat.emacsconf.org;
+
+ include snippets/well-known-acme-challenge.conf;
+
+ location /js-licenses.html { root /var/www/{{lounge_domain}}; }
+
+ location / {
+ return 302 https://$server_name$request_uri;
+ }
+}
+
+server {
+ listen 443 ssl http2;
+ listen [::]:443 ssl http2;
+ server_name {{lounge_domain}};
+
+ include /etc/nginx/tls/{{emacsconf_domain}}.conf;
+
+ location /js-licenses.html { root /var/www/{{lounge_domain}}; }
+ error_page 502 /error.html;
+ location = /error.html {
+ root /var/www/{{lounge_domain}};
+ }
+ location / {
+ proxy_pass http://backend;
+ proxy_http_version 1.1;
+ proxy_set_header Connection "upgrade";
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header X-Forwarded-For $remote_addr;
+ proxy_set_header X-Forwarded-Proto $scheme;
+
+ # by default nginx times out connections in one minute
+ proxy_read_timeout 1d;
+ }
+
+}
+
+#server {
+# listen 443 ssl http2;
+# listen [::]:443 ssl http2;
+# server_name chat.emacsconf.org;
+#
+# include /etc/nginx/tls/emacsconf.org.conf;
+# root /var/www/chat.emacsconf.org;
+#}
+
+server {
+ listen 80;
+ listen [::]:80;
+ server_name chat.emacsconf.com chat.emacsconf.net;
+
+ return 302 $scheme://{{lounge_domain}}$request_uri;
+}
diff --git a/roles/lounge/templates/thelounge.service b/roles/lounge/templates/thelounge.service
new file mode 100644
index 0000000..abc4868
--- /dev/null
+++ b/roles/lounge/templates/thelounge.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=The Lounge IRC Client
+After=network.target
+
+[Service]
+ExecStart=/usr/bin/thelounge start
+User=thelounge
+WorkingDirectory=/var/lib/thelounge
+
+[Install]
+WantedBy=multi-user.target