cmc/cleberg.net

My personal web garden & blog.

clone: git clone https://gitbay.org/cmc/cleberg.net.git

39c24db8b4f22324eb6aa4aee48fed5310843231

unsigned

author: Christian Cleberg <hello@cleberg.net> · 2024-12-30T00:51:02Z

publish The Lounge post
 content/blog/2024-12-27-tbd.org | 164 ++++++++++++++++++++++++++++++++++++++++
 theme/templates/index.html      |  13 ++--
 2 files changed, 171 insertions(+), 6 deletions(-)

diff --git a/content/blog/2024-12-27-tbd.org b/content/blog/2024-12-27-tbd.org
new file mode 100644
index 0000000..b3dd943
--- /dev/null
+++ b/content/blog/2024-12-27-tbd.org
@@ -0,0 +1,164 @@
+#+date: <2024-12-29 Sun 17:45:00>
+#+title: Self-Hosting The Lounge: An IRC Web Client
+#+description: Learn how to deploy The Lounge, an IRC web client, via Docker Compose on Linux.
+#+filetags: :self-hosting:
+#+slug: self-hosting-the-lounge
+
+* The Lounge
+
+[[https://thelounge.chat/][The Lounge]] is a self-hosted IRC client for the web, which supports a lot of
+desirable features for a modern IRC client. The Lounge supports push
+notifications, link previews, file uploads, always connected, multi-user
+support, and is available as a PWA for mobile devices.
+
+I wanted to write this as I had written a post about [[https://cleberg.net/blog/self-hosting-convos.html][self-hosting Convos]] and
+have recently migrated over to The Lounge instead.
+
+If you'd like to try a demo first, head over to [[https://demo.thelounge.chat/][the official demo website]].
+
+** Installation (Docker)
+
+I install everything I can via Docker, so this tutorial will install The Lounge
+with the Docker Compose platform.
+
+You can find the official docker version of The Lounge's repository on GitHub at
+[[https://github.com/thelounge/thelounge-docker][thelounge-docker]].
+
+To start, let's create a directory for this app and create the =compose.yml= file.
+
+#+begin_src shell
+mkdir thelounge
+cd thelounge
+nano compose.yml
+#+end_src
+
+Within this configuration file, you can paste the content below and customize as
+needed. If you want to use a different port on your machine, change the first
+port on the =9000:9000= line. Additionally, you may move the volume to a
+different location if required.
+
+#+begin_src yaml
+services:
+  thelounge:
+    image: ghcr.io/thelounge/thelounge:latest
+    container_name: thelounge
+    ports:
+      - "9000:9000"
+    restart: always
+    volumes:
+      - ./.thelounge:/var/opt/thelounge
+#+end_src
+
+Save and close the file and you can now launch the service.
+
+#+begin_src shell
+sudo docker compose up -d
+#+end_src
+
+The service is now available at =localhost:9000= or =machine_ip:9000= if you're
+browsing from a different device. Don't forget to allow the port through your
+machine's firewall, if you have one enabled.
+
+#+caption: Login
+[[https://img.cleberg.net/blog/20241229-thelounge/login.png]]
+
+** Nginx Reverse Proxy
+
+If you want to access the service via a domain name (=thelounge.example.com=),
+you can use Nginx as a reverse proxy.
+
+First, create the Nginx configuration file.
+
+#+begin_src shell
+sudo nano /etc/nginx/conf.d/
+#+end_src
+
+The configuration below assumes you have a wildcard certificate for HTTPS (:443)
+traffic via =example.com=. If you don't, you'll need to obtain an SSL
+certificate to use HTTPS.
+
+#+begin_src configuration
+upstream irc_upstream { server 127.0.0.1:9000; }
+
+# HTTP redirect
+server {
+	listen      80;
+	listen      [::]:80;
+	server_name thelounge.example.com;
+	include     custom.d/letsencrypt.conf;
+
+	if ($host ~ ^[^.]+\.example\.com) {
+		return 301 https://$host$request_uri;
+	}
+}
+
+# HTTPS
+server {
+	listen                  443 ssl;
+	listen                  [::]:443 ssl;
+	http2			on;
+	server_name             thelounge.example.com;
+
+	# SSL
+	ssl_certificate         /etc/letsencrypt/live/example.com/fullchain.pem;
+	ssl_certificate_key     /etc/letsencrypt/live/example.com/privkey.pem;
+	ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
+
+	# reverse proxy
+	location / {
+	        proxy_pass           http://irc_upstream;
+	        client_max_body_size 0;
+	        proxy_set_header     X-Request-Base "$scheme://$host/";
+
+		# Standard reverse proxy settings
+		proxy_set_header Host $host;
+		proxy_set_header Upgrade $http_upgrade;
+		proxy_set_header Connection upgrade;
+		proxy_set_header Accept-Encoding gzip;
+		proxy_set_header X-Real-IP $remote_addr;
+		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+		proxy_set_header X-Forwarded-Proto $scheme;
+		proxy_set_header X-Forwarded-Host $http_host;
+		proxy_set_header X-Forwarded-Uri $request_uri;
+		proxy_set_header X-Forwarded-Ssl on;
+		proxy_redirect  http://  $scheme://;
+		proxy_http_version 1.1;
+		proxy_set_header Connection "";
+		proxy_cache_bypass $cookie_session;
+		proxy_no_cache $cookie_session;
+		proxy_buffers 64 256k;
+	}
+}
+#+end_src
+
+Finally, restart Nginx to see the effects.
+
+#+begin_src shell
+sudo systemctl restart nginx.service
+#+end_src
+
+** Initial Setup
+
+The first thing you'll need to do is create a user. You can do this with the
+docker container with the following command, which will ask for a password.
+
+#+begin_src shell
+sudo docker exec --user node -it thelounge thelounge add [username]
+#+end_src
+
+Once the user has been created, you'll be able to log in to the web interface.
+Once created, you can change your password in the settings panel of the web
+interface.
+
+Finally, you can connect to an IRC server with the plus (=+=) button at the
+bottom of the sidebar and connect to individual channels or users via the plus
+(=+=) button next to your server's name in the sidebar.
+
+#+caption: New Server Connection
+[[https://img.cleberg.net/blog/20241229-thelounge/new_connection.png]]
+
+#+caption: Existing Server Connection
+[[https://img.cleberg.net/blog/20241229-thelounge/existing_connection.png]]
+
+#+caption: Channel View
+[[https://img.cleberg.net/blog/20241229-thelounge/channel.png]]
diff --git a/theme/templates/index.html b/theme/templates/index.html
index e707d3b..e1909dd 100644
--- a/theme/templates/index.html
+++ b/theme/templates/index.html
@@ -8,6 +8,13 @@ uid           [ultimate] Christian Cleberg &lt;hello@cleberg.net&gt;</pre>
 <section>
 	<h2>Recent Blog Posts</h2>
 
+	<div class="post">
+		<time datetime="2024-12-29 17:45:00">2024-12-29</time>
+		<a href="/blog/self-hosting-the-lounge.html"
+			>Self-Hosting The Lounge: An IRC Web Client</a
+		>
+	</div>
+
 	<div class="post">
 		<time datetime="2024-10-31 11:01:05">2024-10-31</time>
 		<a href="/blog/continue-ollama-code-assistant.html"
@@ -20,12 +27,6 @@ uid           [ultimate] Christian Cleberg &lt;hello@cleberg.net&gt;</pre>
 			>Self-Hosting Transmission Bittorrent Client</a
 		>
 	</div>
-	<div class="post">
-		<time datetime="2024-09-20 13:38:52">2024-09-20</time>
-		<a href="/blog/prometheus-grafana-cloud.html"
-			>Linux Observability with Self-Hosted Prometheus and Grafana Cloud</a
-		>
-	</div>
 
 	<br />
 	<a href="/blog/">All Posts →</a>