emacs-survey-server/setup.org

4.6 KiB

Setup

We could do something fancy like a NixOS flake, but for the EmacsSurvey server I think a simple Debian machine with a setup script should do the trick. Let's just work out a setup script to get everything up and running.

The idea is that this repository can be cloned/updated anywhere on the machine and sudo setup.sh will do the rest. In fact, here's a snippet to do exactly that:

git clone https://git.tecosaur.net/tec/emacs-survey-server.git /tmp/emacs-survey-server
/tmp/emacs-survey-server/setup.sh

Installing software

Caddy web server

if ! rpm -q caddy > /dev/null; then
    printf "\e[1;34mInstalling Caddy\e[m"
    # Taken from <https://caddyserver.com/docs/install#debian-ubuntu-raspbian>
    sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
    curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
    curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
    sudo apt update
    sudo apt install caddy
fi

There are two notable extras that come with the Caddy software itself here:

  1. A systemd service automatically started that loads /etc/caddy/Caddyfile.
  2. The caddy user and caddy group.

Julia

First, we specify the Julia version we want and hope that the relevant paths continue to be predictable.

JULIA_VERSION="1.8.2"

If either the julia command does not exist, or julia --version does not match the expected output, then we will install Julia in /opt/julia and symlink the binary into /usr/bin.

if ! command -v julia > /dev/null || [ ! $(julia --version) = "julia version $JULIA_VERSION" ]; then
    printf "\e[1;34mInstalling Julia\e[m"
    pushd /tmp > /dev/null
    # Following <https://julialang.org/downloads/platform/>
    wget "https://julialang-s3.julialang.org/bin/linux/x64/${JULIA_VERSION%.*}/julia-$JULIA_VERSION-linux-x86_64.tar.gz"
    mkdir -p "/opt/julia/"
    tar zxf "julia-$JULIA_VERSION-linux-x86_64.tar.gz" --directory=/opt/julia
    ln -sf "/opt/julia/julia-$JULIA_VERSION/bin/julia" /usr/bin/julia
    popd > /dev/null
fi

Copying over relevant files

Before starting to do this, we will obtain the path to the folder of the script, so we can grab files relative to the root of this repository.

SETUPDIR=$(dirname "$(readlink --canonicalize-existing "$0")")

Caddy Config

We just need to redirect to Genie for now, which makes for a rather simple config.

emacssurvey.teosaur.net

reverse_proxy localhost:8000

Just this one file is all it takes to get Caddy set up to our liking 🙂.

cp -f "$SETUPDIR/Caddyfile" "/etc/caddy/Caddyfile"

Emacs Survey

Before we start copying files, we want to make sure these files are owned by the genie user, and so me must first ensure that the user exists.

if ! id genie >/dev/null; then
    groupadd -f genie
    useradd -r -g genie -m -d /var/lib/genie genie
fi

This is actually a separate repo, so we need to ensure it exists, and update it if it does.

if [ -d /opt/emacs-survey ]; then
    pushd /opt/emacs-survey > /dev/null
    sudo -u genie git pull origin main
    popd > /dev/null
else
    mkdir -p /opt/emacs-survey
    chown genie:genie /opt/emacs-survey
    sudo -u genie git clone https://git.tecosaur.net/tec/emacs-survey /opt/emacs-survey
fi

Then lets make sure that the packages are up to date.

sudo -u genie julia --project=/opt/emacs-survey -e 'using Pkg; Pkg.instantiate()'

Genie service

To actually run the survey, we'll use a systemd service.

[Unit]
Description=Genie app
After=network.target network-online.target
Requires=network-online.target

[Service]
Type=simple
User=genie
Group=genie
ExecStart=/opt/emacs-survey/bin/server
Environment="GENIE_ENV=prod"

[Install]
WantedBy=multi-user.target

Then we need to put this is the systemd folder, and make sure it is aware of the latest version of the service.

cp -f "$SETUPDIR/genie-app.service" /etc/systemd/system/
systemctl daemon-reload

To get this up and running, all one has to do is execute the following:

systemctl enable --now genie-app.service