4.5 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:
- A systemd service automatically started that loads
/etc/caddy/Caddyfile
. - The
caddy
user andcaddy
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
With Caddy, we just need to redirect to Genie for now.
emacssurvey.teosaur.net
reverse_proxy localhost:8000
ln -sf "$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.
ln -sf "$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