#+TITLE: How This Blog Is Set Up #+DATE: 2020-06-17T21:03:26-04:00 #+DRAFT: true #+DESCRIPTION: #+TAGS[]: hugo openbsd emacs #+KEYWORDS[]: #+SLUG: #+SUMMARY: When I was thinking about making this blog, there were a couple of factors I kept in mind when I was trying to figure out how I was going to set it up. Here's a simplified list of that: - Simple - Version controlled - Runs on OpenBSD - Minimal maintenance - Good integration with Emacs That's how I came up with what I currently use. Let me walk you through how I run by blog. * Framework The blog engine is [[https://gohugo.io/][hugo]], a static site generator. I chose this over something dynamic like wordpress for several reasons. First of all, it's very easy to manage, blog posts are just simple files written in one of the markup languages hugo supports. Being statically generated is also a massive advantage in terms of maintenance. With something like wordpress, you have to be careful to keep your site and plugins up to date. Since there's no dynamic content generation or database involved with hugo, the attack surface is dramatically decreased. No possibility for SQL injection, PHP RATs, accidental shell access, or hacked credentials. The entire site is generated using a single command after a new post is created, and then moved to the web server's root directory. Being all flat files also means the entire thing can very easily be tracked using =git= (or maybe [[https://gameoftrees.org/][got]], eventually), in fact that's the recommended way to use hugo. There's no fear I'll accidentally delete something, as I can always go back to a previous commit and restore it. Since hugo is written in go, it's trivial to compile on OpenBSD, and is actually available directly from the OpenBSD package manager right out of the gate. Maybe the most important thing to be however, is that hugo natively supports org-mode markup. I write all my notes, both personal and work related, in org-mode. It makes converting my notes into blog posts really easy. It also lets me leverage my existing Emacs setup, which comes in handy often. While it's not very well documented, since org-mode markup is a bit of a second class citizen in the hugo world, it's pretty easy to figure out. * Prerequisites The only thing that's required on the host server is =git=, although you could even get away without that if you chose to host your git repository elsewhere, like on github. #+BEGIN_SRC shell pkg_add git #+END_SRC On the client you'll need both =git= and =rsync=. Both might already be installed depending on the system you're on. If not, check your package manager for details on how to install them. * Version Control I wanted to try to keep things as simple as possible for this. The "origin" for the blog is simply a bare git repository in the =blog= user's home directory. ** Setting up the blog user First I set up the blog user #+BEGIN_SRC shell useradd -m blog #+END_SRC I then placed my public SSH key in its =authorized_keys= file #+BEGIN_SRC shell mkdir -m 700 /home/blog/.ssh cp /root/.ssh/authorized_keys /home/blog/.ssh/ chown -R blog:blog /home/blog #+END_SRC I then logged in as the blog user and initialize the bare git repository. #+BEGIN_SRC shell su blog cd # cd with no arguments goes to home directory git init --bare blog.git #+END_SRC ** Cloning the repository Cloning the repository onto my local machine is very easy at this point. As long as my private keys are in the =blog= user's =authorized_keys=, git will take care of the rest. #+BEGIN_SRC shell # on my local machine git clone blog@lambda.cx:blog.git #+END_SRC I can now work on the blog as I would any other git repository, pulling with =git pull= and pushing with =git push=. * Web server Since this blog is going to be hosted on OpenBSD, we don't need to install a web server, as it already comes with one built in. * Deployment The system used to deploy this blog is incredibly simple, involving only =rsync=, =hugo=, and a small shell script.