Docker image for WriteFreely

Build a docker image for WriteFreely. This is designed to be run behind a reverse proxy and “patches” the configuration as such.

To build and run:

podman build . --build-arg VERSION=0.16.0 -t writefreely:0.16.0
podman run --rm -it -v ~/volumes/writefreely:/data writefreely:0.16.0
# Follow directions to create initial config.ini and if all goes well, serve up in your preferred style

Containerfile

FROM docker.io/alpine:3

COPY wf-get.sh /tmp/wf-get.sh
COPY wf-startup.sh /wf-startup.sh

ARG VERSION

RUN apk add --no-cache openssl && \
  sh /tmp/wf-get.sh ${VERSION} && \
  tar xzvf /tmp/wf.tar.gz && \
  mkdir /data && \
  rm /tmp/wf-get.sh /tmp/wf.tar.gz

VOLUME ["/data"]

EXPOSE 8080

CMD /bin/sh /wf-startup.sh

wf-get.sh

#!/bin/sh

VERSION=$1

OUT_PATH=/tmp/wf.tar.gz

BASE_URL=https://github.com/writefreely/writefreely/releases/download/v$VERSION/

ARM_URL=$BASE_URL/writefreely_${VERSION}_linux_arm64.tar.gz
X64_URL=$BASE_URL/writefreely_${VERSION}_linux_amd64.tar.gz

case $(arch) in
  "aarch64")
    wget $ARM_URL -O $OUT_PATH
    ;;
  "x86_64")
    wget $X64_URL -O $OUT_PATH
    ;;
  *)
    echo "Unknown arch"
    exit 1
    ;;
esac

wf-startup.sh

#!/bin/sh

DATA_DIR="/data"
CONFIG_FILE="/data/config.ini"
DATABASE_FILE="/data/writefreely.db"
KEYS_DIR="/data/keys"

genpass() {
  PASS=$(cat /dev/urandom | tr -dc 'a-z0-9' | fold -w 16 | head -n 1)
}

if [ ! -f $CONFIG_FILE ]; then
  echo -e "\e[0;33m"
  echo "STARTING CONFIGURATION"
  echo "Your choices for server and database setup will be overwritten"
  echo "For simplicity, select Development and SQLite when given those options"
  echo "The true configuration begins with App setup and the Site type"
  echo -e "\e[0m"

  cd /data
  /writefreely/writefreely config start

  echo -e "\e[0;33m"
  echo "PATCHING CONFIGURATION"
  echo -e "\e[0m"

  sed -i "
    /\[server\]/,/^$/ {
      s:^port.*:port = 8080:
      s:^bind.*:bind = 0.0.0.0:
      s:^tls_cert_path.*:tls_cert_path = :
      s:^tls_key_path.*:tls_key_path = :
      s:^autocert.*:autocert = false:
      s:^keys_parent_dir.*:keys_parent_dir = $DATA_DIR:
    }
    /\[database\]/,/^$/ {
      s:^type.*:type = sqlite3:
      s:^filename.*:filename = $DATABASE_FILE:
    }
  " $CONFIG_FILE

  cd /writefreely/

  echo -e "\e[0;33m"
  echo "If you chose a multi-user blog you'll probably want to create an admin user."
  echo "This user can still blog in addition to being used for system administration."
  echo "If you created a single user blog then you can skip this step."
  echo -e "\e[0m"
  read -p "Create admin user? [y/N] " response
  if [ $response = "Y" ] || [ $response = "y" ]; then
    read -p "Username: " username

    genpass

    ./writefreely -c $CONFIG_FILE user add --admin $username:$PASS

    echo -e "\e[0;33m"
    echo "Created $username with password $PASS. Please change this as soon as possible."
    echo -e "\e[0m"
  fi
fi

if [ ! -f $DATABASE_FILE ]; then
  /writefreely/writefreely -c $CONFIG_FILE db init
else
  /writefreely/writefreely -c $CONFIG_FILE db migrate
fi

if [ ! -e $KEYS_DIR ]; then
  mkdir $KEYS_DIR
fi

if [ -z "$(ls -A $KEYS_DIR )" ]; then
  /writefreely/writefreely -c $CONFIG_FILE keys generate
fi

cd /writefreely
./writefreely -c $CONFIG_FILE