From a384af020e53b4d79b4408a27039b31c5d9bce56 Mon Sep 17 00:00:00 2001
From: Adar Nimrod <nimrod@shore.co.il>
Date: Mon, 10 May 2021 22:00:32 +0300
Subject: [PATCH] Post on Hugo and gitreceive.

---
 content/hugo-gitreceive.rst | 104 ++++++++++++++++++++++++++++++++++++
 1 file changed, 104 insertions(+)
 create mode 100644 content/hugo-gitreceive.rst

diff --git a/content/hugo-gitreceive.rst b/content/hugo-gitreceive.rst
new file mode 100644
index 0000000..2b99493
--- /dev/null
+++ b/content/hugo-gitreceive.rst
@@ -0,0 +1,104 @@
+Deploying a Hugo blog with gitreceive
+=====================================
+
+:date: 2021-05-10
+:summary: How to deploy a blog built with Hugo using gitreceive
+
+
+This blog post is actually one I meant to write a long time ago, but always put
+off. I'm going to describe how to use gitreceive to deploy a blog that's built
+using Hugo. I find the Heroku-style of deploying using ``git push`` nice in
+some cases and this is a nice example of using gitreceive as any. Obviously
+other static blogging tools can be used.
+
+First, setup the server
+-----------------------
+
+We need to create a user on the server, grant it access to deploy the blog and
+add the SSH public keys.
+
+.. code:: shell
+
+    sudo useradd -m hugo
+    sudo install -d -m 755 -o hugo -g hugo /var/www/html/blog
+    sudo install -d -m 700 -o hugo -g hugo ~hugo/.ssh
+    sudo install -m 600 -o hugo -g hugo /dev/null ~hugo/.ssh/authorized_keys
+    echo 'command="GITUSER=hugo gitreceive run %s %s" ssh-ed25519 AAAAC3....' | sudo tee ~hugo/.ssh/authorized_keys
+
+
+Now we'll install git, gitreceive and Hugo.
+
+.. code:: shell
+
+    sudo apt-get install -y git
+    cd /usr/local/bin
+    curl -L https://github.com/gohugoio/hugo/releases/download/v0.83.1/hugo_0.83.1_Linux-64bit.tar.gz | sudo tar -xz
+    sudo curl -L https://raw.github.com/progrium/gitreceive/master/gitreceive -O gitreceive
+    sudo chmod +x gitreceive
+
+Create the receiver script with the following content at ``/home/hugo/receiver``
+and mark it as executable:
+
+.. code:: shell
+
+    #!/bin/sh
+    set -eu
+
+    repo="$1"
+    mkdir -p "/var/tmp/gitreceive/$repo"
+    echo '----> Unpacking'
+    tar -x
+    echo '----> Building blog'
+    hugo --cleanDestinationDir
+    echo '----> Deploying blog'
+    rm -rf /var/www/html/blog/*
+    cp -r public/* /var/www/html/blog/
+    echo '----> Done'
+
+Second, the client side
+-----------------------
+
+Actually, this is quite simple, just adding a git remote.
+
+.. code:: shell
+
+    git remote add deploy hugo@example.com:blog
+
+And now let's give it a test.
+
+.. code:: shell
+
+    $ git push deploy
+    Counting objects: 39, done.
+    Delta compression using up to 8 threads.
+    Compressing objects: 100% (31/31), done.
+    Writing objects: 100% (39/39), 6.55 KiB | 2.18 MiB/s, done.
+    Total 39 (delta 9), reused 0 (delta 0)
+    ----> Unpacking
+    ----> Building blog
+    Start building sites …
+
+                       | EN
+    -------------------+-----
+      Pages            |  3
+      Paginator pages  |  0
+      Non-page files   |  0
+      Static files     |  1
+      Processed images |  0
+      Aliases          |  0
+      Sitemaps         |  1
+      Cleaned          |  0
+
+    Total in 10 ms
+    ----> Deploying blog
+    ----> Done
+    To blog:blog
+     * [new branch]      master -> master
+
+That's it, the blog is deployed. Obviously having the output from the script is
+useful. We can change the ``receiver`` script to do a lot of other things.
+Running ``docker-compose build && docker-compose pull && docker-compose up -d``
+can produce a simple and straightforward dev environment.  We can make it more
+general by running a script inside the repo and build a makeshift CI tool.
+Lastly, I have an Ansible role to do all of the server configuration for you in
+`my GitLab instance <https://git.shore.co.il/ansible/gitreceive>`_.
-- 
GitLab