====== Grav ====== //"[[https://getgrav.org/|Grav]] is a fast, simple file-based web-platform. If you've ever used [[:wordpress|WordPress]], you'll fall in **LOVE** 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 [[https://learn.getgrav.org/17/basics/installation|installation]] was a bit //**maddening**// . According to [[https://learn.getgrav.org/17|the docs]]… \\ //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// // ** zip ** archive, and extract it. // 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 [[https://www.linuxserver.io/|LinuxServer.io]]'s [[https://hub.docker.com/r/linuxserver/grav|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 **//VOILA!//** 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]|http://[local_IP]:[port]]] to [[http://[local_IP]:admin|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!