From ec3b3e2db9cbbad84515bda0a37330a170da0cfc Mon Sep 17 00:00:00 2001 From: Asger Gitz-Johansen Date: Thu, 28 Nov 2024 17:54:37 +0100 Subject: [PATCH] feat: example post --- .gitea/workflows/build.yml | 26 +++++ Dockerfile | 6 +- content/posts/example.md | 8 ++ content/posts/how-to-blog.md | 165 +++++++++++++++++++++++++++++-- shortcodes/centered.html | 3 + static/example.png | Bin 0 -> 2957 bytes static/screenshot-2024-11-27.png | Bin 0 -> 21624 bytes 7 files changed, 200 insertions(+), 8 deletions(-) create mode 100644 .gitea/workflows/build.yml create mode 100644 content/posts/example.md create mode 100644 shortcodes/centered.html create mode 100644 static/example.png create mode 100644 static/screenshot-2024-11-27.png diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml new file mode 100644 index 0000000..a7691bc --- /dev/null +++ b/.gitea/workflows/build.yml @@ -0,0 +1,26 @@ +name: Release CI action +run-name: ${{ gitea.repository }} release +on: + push: + branches: + - main + +jobs: + build-and-push-container: + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v4 + - name: qemu setup + uses: docker/setup-qemu-action@v3 + - name: dockerx setup + uses: docker/setup-buildx-action@v1 + - name: login + uses: docker/login-action@v3 + with: + # NOTE: See https://gitea.com/gitea/docs/pulls/77/files + registry: git.gtz.dk + username: ${{ gitea.actor }} + password: ${{ secrets.PACKAGE_TOKEN }} + - name: build and push container + run: docker buildx build --push --platform linux/amd64,linux/arm64 -t git.gtz.dk/${{ gitea.repository }}:latest . diff --git a/Dockerfile b/Dockerfile index 548ac12..e720c2e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,4 +5,8 @@ RUN hugo new site /hugo RUN git clone https://github.com/yihui/hugo-xmin.git themes/hugo-xmin ADD hugo.toml /hugo/hugo.toml ADD content /hugo/content -CMD ["hugo", "serve", "--bind", "0.0.0.0"] +ADD static /hugo/static +ADD shortcodes /hugo/layouts/shortcodes +ENV PORT=1313 +EXPOSE $PORT +CMD ["hugo", "serve", "--bind", "0.0.0.0", "--port", "$PORT"] diff --git a/content/posts/example.md b/content/posts/example.md new file mode 100644 index 0000000..84dd989 --- /dev/null +++ b/content/posts/example.md @@ -0,0 +1,8 @@ ++++ +date = '2024-11-27' +draft = true +title = 'Example' +tags = ['tutorial'] +categories = ['technical'] ++++ +content goes here. diff --git a/content/posts/how-to-blog.md b/content/posts/how-to-blog.md index 6430df2..c354bb5 100644 --- a/content/posts/how-to-blog.md +++ b/content/posts/how-to-blog.md @@ -1,6 +1,5 @@ +++ date = '2024-11-27' -draft = false title = 'How to Host a Simple Blog' tags = ['howto', 'tutorial', 'web'] categories = ['technical'] @@ -24,11 +23,13 @@ Ideally, the directory structure should look like this: blog ├── Dockerfile // dockerfile to build and host the site ├── README.md // info about the repository, not a blogpost -├── config.toml // blog-framework configuration file -└── content - ├── about.md // the "about" page - └── posts // actual blog posts go here - └── example.md +├── hugo.toml // blog-framework configuration file +├── content +│   ├── about.md // the "about" page +│   └── posts // actual blog posts go here +│   └── example.md +└── static // non-markdown files + └── example.png ``` And then to build the site, simply build the container: @@ -52,9 +53,159 @@ RUN hugo new site /hugo RUN git clone https://github.com/yihui/hugo-xmin.git themes/hugo-xmin ADD hugo.toml /hugo/hugo.toml ADD content /hugo/content -CMD ["hugo", "serve", "--bind", "0.0.0.0"] +ADD static /hugo/static +ENV PORT=1313 +EXPOSE $PORT +CMD hugo serve --bind 0.0.0.0 --port $PORT ``` For now, I am just using the built-in server in `hugo`, but it should be possible to serve using `nginx`. I mentioned `hugo` before, but I was mostly mad that I had to add the autogenerated stuff in git - with this approach... I don't have to 🎊! + +## Images +Just put images in the `static` directory, and reference to them in your blogposts like you would normally in a `hugo` project: + +```markdown +![example](/example.png) +``` + +![example](/example.png#center) + +This is not centered, and there's no built-in [shortcode](https://gohugo.io/content-management/shortcodes/) for centering images (why not, hugo? You have a shortcode for figures, but no css class for centering - you cant even add a `style` tag? Such an oversight)... +So we have to add one dirty thing to this setup. We have to add a `shortcodes` directory, that is then also added to the docker container in `/hugo/layouts/shortcodes`: + +``` +blog +├── Dockerfile +├── README.md +├── hugo.toml +├── content +│   ├── about.md +│   └── posts +│   ├── example.md +│   └── how-to-blog.md +├── shortcodes +│   └── centered.html // <-- Added +└── static + └── example.png +``` + +```html + +

+ example +

+``` + +Then we can use this new shortcode like so: + +```markdown +{{}} +``` + +{{< centered image="/example.png" >}} + +Yes! Now we're cooking with gas! ... or atleast cooking with something. Note that this image centering trick does not work in [reader mode](https://support.mozilla.org/en-US/kb/firefox-reader-view-clutter-free-web-pages). + +## Conclusion +We have made a docker file for automatically downloading, generating and serving a simple `hugo` blog site. +Personally, I would've liked the `static` and `shortcodes` directories to not exist, but blogposts need images and it needs to center them, so they are a necessary evil. +Could we make the directory structure better and cleaner? Probably yes. +Will I make it better for this blog in the future? Probably yes. +Will I make another post when I do that? Probably yes! + +If you want to just manually build and run docker image on your website server, feel free to stop reading here. +The next section concerns about hosting, orchestrating and deploying the site automatically, but it's totally not required. + +# Deployment +Being able to build and launch the docker image is nice and can suffice for smaller projects. +Yes, this blog is a small project and the manual method should be more than enough, but I also play [factorio](https://store.steampowered.com/app/427520/Factorio/) (highly recommend it!), so I _hvae_ to automate everything that is tedious. +I also have other projects that I host on my VPS (Virtual Private Server) such my portfolio site [gtz.dk](https://gtz.dk) and a [gitea instance](https://git.gtz.dk/) amongst other things. + +## Continuous Integration +I am using my personal [gitea instance](https://git.gtz.dk/agj/blog) to host the source code for this blog - which means that I will be using the integrated CI system there, but you can use whichever CI service you'd like. +The general concepts of the workflow should be fairly easy to translate to any kind of CI, but this is how my setup looks like: + +```yaml +name: Release CI action +run-name: ${{ gitea.repository }} release +on: + push: + branches: + - main + +jobs: + build-and-push-container: + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v4 + - name: build container + run: docker build -t git.gtz.dk/${{ gitea.repository }}:latest . + - name: login + uses: docker/login-action@v3 + with: + # NOTE: See https://gitea.com/gitea/docs/pulls/77/files + registry: git.gtz.dk + username: ${{ gitea.actor }} + password: ${{ secrets.PACKAGE_TOKEN }} + - name: push container + run: docker push git.gtz.dk/${{ gitea.repository }}:latest +``` + +This may look a bit overwhelming if you don't know [Github Actions](https://docs.github.com/en/actions), but it is really quite straight forward. +Every time we push a commit to the `main` branch, we run the job named `build-and-push-container`. +In the job, we first download our repository with the `actions/checkout@v4` action, then we build the container using `docker build` (we make sure to accurately tag the image), then we log in to the container registry that we want to host the container at using the `docker/login-action@v3` action, and the we simply `docker push` the container image. + +Make sure to replace the `git.gtz.dk` website mentions with your own github hosting service (whether self-hosted, or `github.com`) and replace the `gitea/GITEA` mentions with `github/GITHUB` instead. +Note that the syntax is extemely similar to GitHub Actions - in fact Gitea Actions are trying to be 1 to 1 compatible with GitHub Actions, so it should be relatively straight forward. + +This setup also gives us the possibility of performing traditional code-review before releasing by using [pull requests](https://docs.gitea.com/next/usage/pull-request?_highlight). +This should empower us to identify and correct issues (e.g. spelling mistakes or whatever) before they are pushed to the official website. + +I will probably make a post about how to host a private gitea instance with an actions runner and all that jazz. For now, I will consider that particular rabbit hole out-of-scope. + +This was the most difficult thing to do. We are _almost_ there. + +## Continuous Delivery +With a docker image readily available, we can automatically deploy the blog when we push it! + +I personally am a big fan of the simplicity of [portainer](https://www.portainer.io/), as it scales really well when doing perosnal server stuff. + +What we really just need is a simple webhook... Fuck... + +{{< centered image="/screenshot-2024-11-27.png" >}} + +Now, don't get me wrong - portainer is a good piece of software - their business tier is even worth the money. +But I am not running a business here. I just want a personal blog. There has to be another way of automatically pulling and redeploying a container based on a new release event. + +IN STEPS [WATCHTOWER](https://containrrr.dev/watchtower/)! +This amazing piece of software will monitor and automatically update all containers on a system and update them! +Now, this only updates once per 24 hours (by default), but that should be plenty fine. + +```yaml +services: + watchtower: + image: containrrr/watchtower + container_name: watchtower + environment: + - DOCKER_CONFIG=/config + volumes: + - watchtower-config:/config/ + - /var/run/docker.sock:/var/run/docker.sock + +volumes: + watchtower-config: +``` + +Only one small thing - if you are hosting the container on a private registry (like I am), you have to do some slight configuration regarding credentials - for this, I will simply refer to the [watchtower documentation](https://containrrr.dev/watchtower/private-registries/). + +# Conclusion +PHEW! I started this blog post using words like "simple" and "easy" - but it got a bit out of hand I must admit. +The workflow is very simple now though. You don't have to contiously deal with the mess of deploying your stuff, and you dont have to commit unneccesary autogenerated stuff to git. +Just focus on writing posts and publish them by merging to `main`. Nice and automated 😁. + +## P.S. +You may notice that the CI script on the real blog repository is a bit more complicated than what we've went through in this post, but the extra complexity only comes from some stupid technicalities regarding my build server being based on ARM rather than x86 (raspberry pi). +The script we made here is plenty good to get you started. diff --git a/shortcodes/centered.html b/shortcodes/centered.html new file mode 100644 index 0000000..56b6ad8 --- /dev/null +++ b/shortcodes/centered.html @@ -0,0 +1,3 @@ +

+ example +

diff --git a/static/example.png b/static/example.png new file mode 100644 index 0000000000000000000000000000000000000000..4c08bc03fc3ae3f3b3c2db88bb47a7f14e875c36 GIT binary patch literal 2957 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 DKR>=R literal 0 HcmV?d00001 diff --git a/static/screenshot-2024-11-27.png b/static/screenshot-2024-11-27.png new file mode 100644 index 0000000000000000000000000000000000000000..4aad43d87bc1bb24b59fc751f7c249575939fa98 GIT binary patch literal 21624 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