aboutsummaryrefslogtreecommitdiff
path: root/content/blog/2023-06-23-self-hosting-convos.org
blob: ac61c6cce9b48826b679c15428ea84174c445a08 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
#+date: <2023-06-23 Fri 00:00:00>
#+title: Host Your Own Convos IRC Web Client with Docker and Nginx
#+description: A comprehensive guide to self-hosting Convos, an always-online IRC web client. Includes Docker Compose setup, Nginx reverse proxy configuration, and nickname registration instructions.
#+slug: self-hosting-convos
#+filetags: :docker:nginx:convos:

* Convos

[[https://convos.chat/][Convos]] is an always-online web client for IRC.
It has a few features that made it attractive to me as a self-hosted
option:

- Extremely simple Docker Compose installation method.
- Runs in the background and monitors chats even while you're not logged
  in.
- Neatly organized sidebar for conversation and client settings.
- Ability to connect to different hosts and create profiles for hosts.
- By default, registration is closed to the public. You can enable
  public registration on the Settings page or generate invitation links
  on the Users page.
- Customization of the client theme, organization name and URL, admin
  email, and video service.

* Docker Installation

To install Convos, simply create a directory and a =docker-compose.yml=
file:

#+begin_src sh
mkdir ~/convos && cd ~/convos
nano docker-compose.yml
#+end_src

With the =docker-compose.yml= file open, paste the configuration below
into the file. You can customize the host port to be something unique,
such as =21897:3000=. You can also change the =data= folder to be a
docker volume instead, if you prefer.

#+begin_src config
version: '3'

services:
  convos:
    image: 'convos/convos:stable'
    ports:
      - '3000:3000'
    volumes:
      - './data:/data'
    environment:
      - CONVOS_REVERSE_PROXY=1
    restart: always
#+end_src

Save the =docker-compose.yml= file and bring the container up:

#+begin_src sh
sudo docker-compose up -d
#+end_src

At this point, Convos is available at =<server_ip>:3000= but not
available to the public.

* Nginx Reverse Proxy

If you're using Nginx, you can create a configuration file for the
convos application. Start by opening the file:

#+begin_src sh
nano /etc/nginx/sites-available/convos
#+end_src

Within the nginx configuration file, paste the following content and be
sure to update =convos.example.com= to match your domain and
=127.0.0.1:3000= to match the port you opened in the
=docker-compose.yml= file.

#+begin_src config
# Host and port where convos is running
upstream convos_upstream { server 127.0.0.1:3000; }

server {
    if ($host ~ ^[^.]+\.example\.com$) {
        return 301 https://$host$request_uri;
    }

    listen [::]:80;
    listen 80;
    server_name convos.example.com;
    return 404;
}

server {
    listen [::]:443 ssl http2;
    listen 443 ssl http2;
    server_name convos.example.com;
    access_log  /var/log/nginx/convos.access.log;
    error_log   /var/log/nginx/convos.error.log;

    location / {
        proxy_pass http://convos_upstream;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        client_max_body_size 0;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Request-Base "$scheme://$host/";
    }

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
#+end_src

Once the file is saved, link it to the =sites-enabled= directory and
restart Nginx.

#+begin_src sh
sudo ln -s /etc/nginx/sites-available/convos /etc/nginx/sites-enabled/convos
sudo systemctl restart nginx.service
#+end_src

* Screenshots

See the screenshots below for an example of the Convos homepage and an
excerpt of the chat screen.

There are numerous themes to choose from; the theme shown in the images
below is Dracula.

#+caption: Convos Home
[[https://img.cleberg.net/blog/20230623-convos/convos_home.png]]

#+caption: Convos Chat
[[https://img.cleberg.net/blog/20230623-convos/convos_chat.png]]

* Registering a Nickname

Hop into the server channel so that you can message NickServ. In the
case of Convos, the default sever is libera.chat. Simply click the
=libera= conversation at the top of the sidebar to open it. Once the
chat is open, you can claim a nickname by typing:

#+begin_src txt
/nick <nick>
#+end_src

If the nickname is available, and you'd like to register the nickname to
yourself, you'll need to type another command:

#+begin_src txt
/msg NickServ REGISTER
<password> <email>
#+end_src

On libera.chat, the server will send a confirmation email with a command
that you must message in IRC to verify registration of the nickname:

#+begin_src txt
/msg NickServ VERIFY REGISTER <nick> <verification_code>
#+end_src

Once entered, the server should confirm registration of the nickname to
the supplied email with the password specified.