Lemmy 0.16.7 on OpenBSD 7.2

nabbisen - Jan 15 '23 - - Dev Community

Summary

Lemmy is one of Fediverse implementations, which focuses on link aggregators. It also works as a platform for forums and microblogging.

On technical aspects, used are Rust Actix Web, an actor-model web framework good at concurrency, and InfernoJS, a blazingly fast client framework inspired by React. Therefore, it runs comfortably fast.

This post shows how to install Lemmy and configure it on OpenBSD, a solid operating system.
As to Rust's platform support, OpenBSD stands in Tier 3, the lowest in Target Tier Policy, and, however, it works !!

Environment

  • OS: OpenBSD 7.2
  • Database: PostgreSQL 14.5 (released on Aug 11, 2022)
  • Object Storage: MinIO - AWS S3-compatible (Optional)
  • Web Server: relayd
  • Apps
    • Lemmy: 0.16.7
    • based on Rust 1.63 + Actix Web 4 + Actix 0.13
    • Lemmy-UI: 0.16.7
    • based on InfernoJS 7.4
    • Image hosting: pict-rs 0.3.2

Tutorial

PostgreSQL

Install PostgreSQL server and configure it (if undone)

This post should help.

Create database

Start psql:

$ psql -U <your-postgres-user>
Enter fullscreen mode Exit fullscreen mode

Run to create role:

create user lemmy with encrypted password '(...)';
Enter fullscreen mode Exit fullscreen mode

The output was:

CREATE ROLE
Enter fullscreen mode Exit fullscreen mode

Then run to create database belonging to the role:

create database lemmy with owner lemmy \
    ENCODING 'UTF-8' template template0 LC_COLLATE 'C' LC_CTYPE 'C';
Enter fullscreen mode Exit fullscreen mode

The output was:

CREATE DATABASE
Enter fullscreen mode Exit fullscreen mode

MinIO (Optional)

This post and its series may help.

Prepare Lemmy project

Suppose directories will be created as below:

/var
+-- /lemmy
    +-- /lemmy
    +-- /lemmy-ui
    +-- /pict-rs
Enter fullscreen mode Exit fullscreen mode

Prepare Rust packages

$ doas pkg_add rust
Enter fullscreen mode Exit fullscreen mode

The output was:

quirks-6.42 signed on 2023-01-13T18:22:41Z
rust-1.63.0p0:libssh2-1.10.0p0: ok
rust-1.63.0p0: ok
Enter fullscreen mode Exit fullscreen mode

Add a Lemmy user

Run:

$ doas useradd -d /var/lemmy -m _lemmy
Enter fullscreen mode Exit fullscreen mode

Then act as the user:

$ doas su - _lemmy
Enter fullscreen mode Exit fullscreen mode

The login shell is perhaps ksh.

You must be in the home directory:

$ pwd
/var/lemmy
Enter fullscreen mode Exit fullscreen mode

Lemmy server

This part is long so separated to another post. The following two are, too.

Go to this post and then return.

Lemmy-UI server

Go to this post and return.

pict-rs server

Go to this post and return.

Build network

The servers are ready !! Switch back to your own user (by executing exit).

Here is the final network archtecture in this post.
All of Lemmy familly listen to lo, the internal network, only.
relayd handles request/response between the external and the internal, including WebSocket Lemmy-UI uses.

[external] <--> [internal]
                 relayd  <--> lemmy
                         <--> lemmy-ui
                              (websocket included)
                         <--> pict-rs
Enter fullscreen mode Exit fullscreen mode

Be slightly careful about permissions of rc.d scripts.

Lemmy (server)

Create:

$ doas nvim /etc/rc.d/lemmy
Enter fullscreen mode Exit fullscreen mode

to write in it:

#!/bin/ksh

daemon="target/release/lemmy_server"
daemon_user="_lemmy"

daemon_execdir="/var/lemmy/lemmy"

. /etc/rc.d/rc.subr

rc_cmd $1
Enter fullscreen mode Exit fullscreen mode

Lemmy-UI

Create:

$ doas nvim /etc/rc.d/lemmy_ui
Enter fullscreen mode Exit fullscreen mode

to write in it:

#!/bin/ksh

daemon="env LEMMY_UI_HOST=127.0.0.1:1234 LEMMY_INTERNAL_HOST=127.0.0.1:8536 LEMMY_EXTERNAL_HOST=<your-fqdb>:8536 LEMMY_WS_HOST=<your-fqdn>:443 node"
daemon_user="_lemmy"
daemon_flags="dist/js/server.js"

daemon_execdir="/var/lemmy/lemmy-ui"

. /etc/rc.d/rc.subr

rc_cmd $1
Enter fullscreen mode Exit fullscreen mode

pict-rs

Create:

$ doas nvim /etc/rc.d/lemmy_pict_rs
Enter fullscreen mode Exit fullscreen mode

to write in it:

#!/bin/ksh

daemon="target/release/pict-rs"
daemon_user="_lemmy"
daemon_flags="-c pict-rs.toml"

daemon_execdir="/var/lemmy/pict-rs"

. /etc/rc.d/rc.subr

rc_cmd $1
Enter fullscreen mode Exit fullscreen mode

relayd.conf

Configuration about httpd is optional.
When you have other services in the same machine, you may have to do manage them.

# $OpenBSD: relayd.conf,v 1.5 2018/05/06 20:56:55 benno Exp $

# prefork 5

#table <httpd> { "127.0.0.1" }
lemmy_server_port = "8536"
table <lemmy_ui> { "127.0.0.1" }
lemmy_ui_port = "1234"
table <lemmy_server> { "127.0.0.1" }
lemmy_server_port = "8536"

your_fqdn = "<your-fqdn>"

cert_keypair = "<cert-keypair-name>"

http protocol "https-filter" {
    return error

    #match request forward to <httpd>
    match request header "Host" value $your_fqdn forward to <lemmy_ui>
    match request url "<your-fqdn>/api/" forward to <lemmy_server>
    match request url "<your-fqdn>/pictrs/" forward to <lemmy_server>

    http websockets

    tls keypair $cert_keypair
}
relay "https-proxy" {
    listen on egress port https tls

    protocol "https-filter"

    #forward to <httpd> port http check tcp
    forward to <lemmy_ui> port $lemmy_ui_port check tcp
    forward to <lemmy_server> port $lemmy_server_port check tcp
}

http protocol "lemmy-server" {
    http websockets

    tls keypair $cert_keypair
}
relay "lemmy-server" {
    listen on $your_fqdn port $lemmy_server_port tls

    protocol "lemmy-server"

    forward to <lemmy_server> port $lemmy_server_port check tcp
}
Enter fullscreen mode Exit fullscreen mode

Conclusion

Let's start the servers. Here are command lines to run them temporarily:

$ doas rcctl -f start {lemmy, lemmy_ui, lemmy_pict_rs, relayd}
Enter fullscreen mode Exit fullscreen mode

* Besides, if you want to activate them, run rcctl enable beforehand, and -f option will be unnecessary.

Open your browser and access to <your-fqdn>. You will be welcomed.

lemmy-setup

After signing up, you will be guided to create an instance:

lemmy-instance-create-1

lemmy-instance-create-2

Then, voilà :)

lemmy-on-openbsd

Happy swimming across the fediverse.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .