Writefreely, Again
Hello world from Writefreely!
I am not exactly new to Writefreely.
The first time I tried it out was a few years ago—July 2022, to be precise, according to my Git logs. I don't remember why I gave it up back then; at the time, I had less experience with Docker, so it's entirely possible that I simply couldn't get it to work and abandoned it.
Fast-forward to the present, 2025. I decided to give Writefreely another go, and this time I managed to get it up and running with Docker. The docker-compose.yml file I created is quite simple:
services:
writefreely:
container_name: writefreely
image: ghcr.io/writefreely/writefreely:latest
user: "0:0"
volumes:
- ./data:/data
- ./config.ini:/go/config.ini
networks:
- proxied_services
restart: unless-stopped
networks:
proxied_services:
external: true
A few key points about this docker-compose configuration:
- I chose to run the container as root (user: “0:0”) because it simplifies things. By default, Writefreely runs as the daemon user, but that caused some issues with mounted volumes in my setup.
- The proxied_services network is where I run all services that need to be behind a reverse proxy (in my case, Caddy).
Initial Setup Steps
Before starting the container, I had to complete a few manual setup steps.
First, I generated the configuration and keys:
$ docker compose run --rm --entrypoint sh writefreely
/go # cmd/writefreely/writefreely config start
...
/go # cmd/writefreely/writefreely keys generate
...
Then, I copied the following directories from the Writefreely Git repository into the data directory:
- pages → data/pages
- static → data/static
- templates → data/templates
And that's it! I now have a fully functional Writefreely deployment running with Docker Compose. 🚀