Service Outage: Please note that all services and subdomains on cleberg.net will be unavailable for a few days.

Self-Hosting Voyager - A Lemmy Web Client

422 words; 3 minute(s)

Table of Contents

Installation Guide

Voyager is a mobile-first Lemmy web client, based on iOS design standards. It follows very closely to Apollo's design.

This post is a guide showing how I was able to build and launch my own instance of Voyager via Docker Compose.

Clone the Repository

Start by cloning the repository and entering it:

git clone https://github.com/aeharding/voyager
cd voyager

Build the Image

With this repository, you can build the image yourself without any further configuration. When complete, it'll give you the image ID for you to run.

sudo docker build .
# Successfully built 5f00723cb5be

With the image ID above, you can run the container and pass the requested port 5314 through or use a custom port, if you wish.

You can also set the CUSTOM_LEMMY_SERVERS environment variable if you want to add to the default suggested login servers. This must be set with a comma separated list of suggested servers. The first instance in the list will be the default view for logged-out users.

I will be using a docker-compose.yml file to run this container, instead of a docker run command.

nano docker-compose.yml
version: "2"
services:
  voyager:
    image: 5f00723cb5be
    restart: always
    ports:
      - "<custom_port>:5314"
    environment:
      - CUSTOM_LEMMY_SERVERS=lemmy.dbzer0.com,lemmy.world,lemmy.ml,beehaw.org
sudo docker-compose up -d

The web app will now be available at the following address: <machine_ip>:<custom_port>. If you are running it on your local device, try localhost:<custom_port>.

Reverse Proxy

If you want to visit this app via an external URL or domain name, you'll need to set up a reverse proxy. The example below uses Nginx as a reverse proxy.

Simply create the configuration file, paste the contents below, save the file, symlink the file, and restart Nginx.

sudo nano /etc/nginx/sites-available/voyager
server {
    if ($host ~ ^[^.]+\.example\.com$) {
        return 301 https://$host$request_uri;
    }

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

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

    location / {
        proxy_http_version 1.1;
        proxy_pass http://localhost:5314;
        proxy_set_header Host $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;
}
sudo ln sudo ln -s /etc/nginx/sites-available/voyager /etc/nginx/sites-enabled/voyager
sudo systemctl restart nginx.service

The site will now be available at the server_name you specified above!

You can visit my instance at voyager.cleberg.net for an example.