Grav

Grav is a fast, simple file-based web-platform. If you've ever used WordPress, you'll fall in <font inherit/inherit;;#e74c3c;;inherit>LOVE</font> with Grav's ease of use, outstanding features, and available themes and plugins.”

I love Grav's elegant simplicity. The fact that it's file-based makes it super easy to backup/restore and manage; no need to go mucking around in a database. Grav is now my self-hosted CMS/blogging platform of choice.

Having said that, self-hosted installation was a bit maddening . According to the docs


<font 16px/inherit;;inherit;;#dddddd>Installation of Grav is a trivial process. In fact, there is no real installation. You have several options for installing Grav. The first – and simplest – way is to download the</font> <font inherit/inherit;;inherit;;#dddddd>zip</font> <font inherit/inherit;;inherit;;#dddddd>archive, and extract it.</font>

Yeah, and I have a really nice bridge I'll sell you at a great price.

Many, many attempts to setup Grav resulted in “403 Forbidden”. I'm not completely certain, but I'm pretty sure they're assuming you're trying to install it into an already working web server. (Even then, though……)

Ultimately, it was LinuxServer.io's Grav image that got me up and going. It has (basically starts with) a built-in Nginx web server; I just copied and pasted their docker-compose.yml then

docker-compose up -d

and navigate to my docker server's port and IP (as specified in my docker-compose.yml) and <font inherit/inherit;;#8e44ad;;inherit>VOILA!</font> I was prompted to create a Grav user. BUT - once I filled in and submitted the form, Grav disappeared and I was left with nothing but an error message! Of course, I tried all kinds of stuff, all the while keeping in mind my troubleshooting motto - “Eventually, you run out of wrong ways to do it.”In the end, the problem was a chair:keyboard interface issue… as soon as you submit the create user form, you go from http://[local_IP]:[port] to http://[local_IP]:admin. (The port, of course, is absolutely essential.) Once I figured that out, I was ready to proceed with configuration and customization. Yay!