Author SHA1 Message Date
ahmza 40c58e8d9b harden Hugo build and remove unused CMS
Build Hugo / build (push) Successful in 2m20s
Build Hugo / deploy (push) Successful in 29s
2026-08-23 18:15:52 +00:00
ahmza 00ba36191f revert dockerfile for testing k8
Build Hugo / build (push) Successful in 2m7s
Build Hugo / deploy (push) Successful in 23s
2026-08-22 01:29:42 +00:00
ahmza 2a18854894 added the actual deploy steps
Build Hugo / build (push) Failing after 40s
Build Hugo / deploy (push) Skipped
2026-08-22 01:27:19 +00:00
ahmza c157c599ea Merge branch 'main' of ssh://tea.ahmza.com/ahmza/blog-ahmza-com 2026-08-22 01:22:18 +00:00
ahmza 810069d1fe updated docker file to help with caching 2026-08-22 01:21:32 +00:00
ahmza e2a530045d Update .gitea/workflows/build-docker-images.yml
Build Hugo / build (push) Successful in 1m58s
Build Hugo / deploy (push) Successful in 35s
2026-08-22 01:19:03 +00:00
ahmza 9e69de9fd8 pissing me off
Build Hugo / build (push) Successful in 1m57s
Build Hugo / deploy (push) Failing after 5s
2026-08-22 01:15:52 +00:00
ahmza 808187bef2 pissing me off
Build Hugo / build (push) Successful in 1m51s
Build Hugo / deploy (push) Failing after 12s
2026-08-22 01:02:36 +00:00
ahmza ae74124319 pissing me off
Build Hugo / build (push) Successful in 2m1s
Build Hugo / deploy (push) Failing after 14s
2026-08-22 00:51:39 +00:00
ahmza eefcee2ce3 pissing me off 2026-08-22 00:50:36 +00:00
ahmza d9cf96e594 pissing me off
Build Hugo / build (push) Successful in 6m34s
Build Hugo / deploy (push) Failing after 0s
2026-08-22 00:39:00 +00:00
ahmza b809a14e2b pissing me off
Build Hugo / build (push) Successful in 6m33s
Build Hugo / deploy (push) Failing after 12s
2026-08-22 00:23:02 +00:00
ahmza a0878cf30e pissing me off 2026-08-22 00:21:17 +00:00
ahmza f28aca8484 will it actually work now ?
Build Hugo / build (push) Successful in 6m40s
Build Hugo / deploy (push) Failing after 12s
2026-08-22 00:09:51 +00:00
ahmza 84495ae064 renamed the stuff and stuff to do stff on stuff blablabla
Build Hugo / build (push) Successful in 6m37s
Build Hugo / deploy (push) Failing after 13s
2026-08-21 23:49:28 +00:00
ahmza e8d04b8373 renamed the stuff and stuff to do stff on stuff blablabla
Build Hugo / build (push) Successful in 6m32s
Build Hugo / deploy (push) Failing after 16s
2026-08-21 23:38:37 +00:00
ahmza a4b9e5a040 renamed the stuff and stuff to do stff on stuff blablabla
Build Hugo / build (push) Successful in 6m17s
Build Hugo / deploy (push) Failing after 47s
2026-08-21 23:25:46 +00:00
ahmza 9fc7c371c5 Update README.md
Build Hugo / build (push) Canceled after 0s
Build Hugo / deploy (push) Canceled after 0s
2026-08-21 19:42:16 +00:00
ahmza 1ef8f861c1 Harden Gimli deploy: reconcile in place instead of compose down
Build Hugo / build (push) Successful in 6m15s
Build Hugo / deploy (push) Successful in 13s
'docker compose down' removes caddy_cf and the default network, which
intermittently severs the SSH session's own network path before 'up'
restores it (remote command exited without exit status). Replace with
'pull && up -d --force-recreate --remove-orphans' so the stack is
reconciled in place without tearing the network out from under the
connection, while still picking up the new :latest image.
2026-08-03 15:50:23 +00:00
ahmza 3c5678f8a8 Run Hugo natively in build stage to skip QEMU emulation
Build Hugo / build (push) Successful in 6m31s
Build Hugo / deploy (push) Failing after 24s
Pin the build stage to $BUILDPLATFORM so Hugo runs once on the native
arch instead of once per target arch under QEMU. Hugo output is static
HTML and identical across arches, so the emulated arm64 Hugo run (~59s
vs ~12s native) plus emulated base-image extraction were pure waste.
The runtime stage stays on TARGETPLATFORM, so multi-arch amd64+arm64
images are still produced.
2026-08-03 15:40:22 +00:00
ahmza 319c8fa922 Add NetBird diagnostic checks to deploy job
Build Hugo / build (push) Successful in 7m23s
Build Hugo / deploy (push) Successful in 12s
Surface VPN connection status in the deploy job so netbird failures are
legible instead of a cryptic DeadlineExceeded:
- Pre-flight check for /dev/net/tun + NET_ADMIN before connecting
- id + timeout-minutes:3 on Netbird Connect to bound its wait loop
- Post-connect 'netbird status --detail' with a Management:Connected assert
- Always-run diagnostics + 'netbird down' teardown
2026-08-03 14:51:04 +00:00
ahmza b84843ca3d added footer links
Build Hugo / build (push) Successful in 11m23s
Build Hugo / deploy (push) Failing after 54s
added gitlab as well as gitea footer links.
2026-08-03 13:12:58 +00:00
ahmza 4b0b681302 Merge pull request 'Use dynamic cloudflare trusted_proxies IP source' (#5) from caddy-dynamic-cf-ip into main
Build Hugo / build (push) Successful in 1m37s
Build Hugo / deploy (push) Successful in 41s
Reviewed-on: #5
2026-07-25 04:09:11 +00:00
14 changed files with 178 additions and 184 deletions
+18
View File
@@ -0,0 +1,18 @@
# Send only files required by the Hugo build and SWS runtime stages.
*
!Dockerfile
!go.mod
!go.sum
!sws.toml
!assets/
!assets/**
!config/
!config/**
!content/
!content/**
!layouts/
!layouts/**
!static/
!static/**
+135
View File
@@ -0,0 +1,135 @@
name: Build Hugo
on:
push:
branches: [ "main" ]
env:
REGISTRY: tea.ahmza.com
IMAGE_NAME: ${{ gitea.repository }}
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
attestations: write
id-token: write
steps:
- name: Checkout Repo
uses: actions/checkout@v4
- name: Login to Gitea Container Registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ gitea.repository_owner }}
password: ${{ secrets.GITEATOKEN }}
# QEMU deliberately omitted.
#
# Hugo runs on BUILDPLATFORM in the Dockerfile, so the static site is
# built natively on the runner. The final amd64/arm64 stages only copy
# the resulting static files into the target-platform SWS image.
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build and push
uses: docker/build-push-action@v6
with:
context: .
platforms: linux/arm64, linux/amd64
push: true
tags: |
${{ env.REGISTRY }}/${{ gitea.repository_owner }}/blog-ahmza-com:latest
${{ env.REGISTRY }}/${{ gitea.repository_owner }}/blog-ahmza-com:${{ gitea.event.head_commit.id }}
cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ gitea.repository_owner }}/blog-ahmza-com:buildcache
cache-to: type=registry,ref=${{ env.REGISTRY }}/${{ gitea.repository_owner }}/blog-ahmza-com:buildcache,mode=max
deploy:
runs-on: ubuntu-latest
needs: build
steps:
- name: Pre-flight - verify VPN prerequisites
# NetBird brings up a WireGuard interface, which needs a TUN device and
# NET_ADMIN inside the job container. Without them, `netbird up` hangs
# ~50s and dies with a cryptic "DeadlineExceeded". Check up front so the
# failure is obvious and points at the fix (runner config.yaml).
run: |
echo "::group::NetBird prerequisites"
if [ -e /dev/net/tun ]; then
echo "OK: /dev/net/tun present"
else
echo "::error title=Missing TUN device::/dev/net/tun not found. Add --device=/dev/net/tun to the runner's config.yaml container.options."
exit 1
fi
if command -v capsh >/dev/null 2>&1; then
capsh --print | grep -q 'cap_net_admin' \
&& echo "OK: NET_ADMIN present" \
|| echo "::warning title=NET_ADMIN missing::netbird up will likely time out (DeadlineExceeded) configuring wt0. Add --cap-add=NET_ADMIN to the runner's config.yaml container.options."
else
echo "note: capsh unavailable, skipping NET_ADMIN check"
fi
echo "::endgroup::"
- name: Netbird Connect
id: netbird
timeout-minutes: 3
uses: Alemiz112/netbird-connect@v1
with:
setup-key: ${{ secrets.NETBIRD_SETUP_KEY }}
hostname: 'gitea-actions-blog'
management-url: ${{ secrets.NETBIRD_URL }}
- name: NetBird status
# Surface the actual peer/route state in the log and hard-assert that
# the management connection is up before attempting any deploys.
run: |
echo "::group::netbird status"
sudo netbird status --detail || true
echo "::endgroup::"
sudo netbird status | grep -q 'Management: Connected' \
&& echo "NetBird management connected." \
|| { echo "::error title=NetBird not connected::Management not connected after netbird up."; exit 1; }
- name: Deploy image to talos-prod
uses: actions-hub/kubectl@v1.36.2
env:
KUBE_CONFIG: ${{ secrets.KUBE_CONFIG }}
with:
args: >-
-n blog-ahmza-com
set image deployment/blog
blog=${{ env.REGISTRY }}/${{ gitea.repository_owner }}/blog-ahmza-com:${{ gitea.event.head_commit.id }}
- name: Wait for rollout
uses: actions-hub/kubectl@v1.36.2
env:
KUBE_CONFIG: ${{ secrets.KUBE_CONFIG }}
with:
args: >-
-n blog-ahmza-com
rollout status deployment/blog
--timeout=5m
- name: Show deployed pods
uses: actions-hub/kubectl@v1.36.2
env:
KUBE_CONFIG: ${{ secrets.KUBE_CONFIG }}
with:
args: >-
-n blog-ahmza-com
get pods -o wide
- name: NetBird diagnostics & disconnect
# Runs even on failure: captures final state for debugging and tears the
# peer down so stale 'gitea-actions-blog' peers don't pile up.
if: always()
run: |
echo "::group::final netbird status"
sudo netbird status --detail || echo "netbird unavailable"
echo "::endgroup::"
sudo netbird down || true
-86
View File
@@ -1,86 +0,0 @@
name: Build Hugo
on:
push:
branches: [ "main" ]
env:
REGISTRY: tea.ahmza.com
IMAGE_NAME: ${{ gitea.repository }}
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
attestations: write
id-token: write
steps:
- name: Checkout Repo
uses: actions/checkout@v4
- name: Login to Gitea Container Registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ gitea.repository_owner }}
password: ${{ secrets.GITEATOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build and push
uses: docker/build-push-action@v6
with:
context: .
platforms: linux/arm64, linux/amd64
push: true
build-args: |
BUILDKIT_CONTEXT_KEEP_GIT_DIR=true
tags: |
${{ env.REGISTRY }}/${{ gitea.repository_owner }}/blog-ahmza-com:latest
${{ env.REGISTRY }}/${{ gitea.repository_owner }}/blog-ahmza-com:${{ gitea.event.head_commit.id }}
# Registry-backed build cache. The GitHub-hosted 'gha' cache is not
# reachable from self-hosted Gitea runners, so store the cache as a
# dedicated tag in the same registry instead.
cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ gitea.repository_owner }}/blog-ahmza-com:buildcache
cache-to: type=registry,ref=${{ env.REGISTRY }}/${{ gitea.repository_owner }}/blog-ahmza-com:buildcache,mode=max
deploy:
runs-on: ubuntu-latest
needs: build
steps:
- name: Netbird Connect
uses: Alemiz112/netbird-connect@v1
with:
setup-key: ${{ secrets.NETBIRD_SETUP_KEY }}
hostname: 'gitea-actions-blog'
management-url: ${{ secrets.NETBIRD_URL }}
- name: Deploy to RPIC-Cluster
# RPIC cluster is temporarily out of service. Don't let its failure
# block the Gimli deploy or fail the whole job. Remove this line once
# the cluster is back.
continue-on-error: true
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.RPIC_HOST }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.RPIC_KEY }}
port: ${{ secrets.SSH_PORT }}
script: 'kubectl rollout restart deployment blog -n blog-ahmza-com'
- name: Deploy to Gimli
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.GIMLI_HOST }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.GIMLI_KEY }}
port: ${{ secrets.SSH_PORT }}
script: 'docker compose down && docker compose pull && docker compose up -d'
-1
View File
@@ -5,5 +5,4 @@ styles/
node_modules
public/
resources/
go.sum
themes/
+15 -2
View File
@@ -1,6 +1,19 @@
FROM ghcr.io/hugomods/hugo:0.157.0 AS build
# syntax=docker/dockerfile:1
# Pin the build stage to the native build platform so Hugo runs once (never
# under QEMU emulation). Hugo output is static HTML — identical across arches —
# so there's no reason to run it per target arch. The runtime stage below stays
# on TARGETPLATFORM, so multi-arch (amd64 + arm64) runtime images are preserved.
FROM --platform=$BUILDPLATFORM ghcr.io/hugomods/hugo:0.165.0 AS build
WORKDIR /tmp/hugo
COPY . .
COPY go.mod go.sum ./
COPY config ./config
RUN hugo mod graph
COPY assets ./assets
COPY content ./content
COPY layouts ./layouts
COPY static ./static
RUN hugo --gc --minify
FROM ghcr.io/static-web-server/static-web-server:2
+1 -1
View File
@@ -50,5 +50,5 @@ sacrificing performance.
The Blowfish theme is managed as a Hugo module, so no submodules are required.
Clone the repository with:
```bash
git clone ssh://gitea@tea.ahmza.com:2222/ahmza/blog-ahmza-com.git
git clone ssh://git@tea.ahmza.com/ahmza/blog-ahmza-com.git
```
+2 -2
View File
@@ -1,5 +1,5 @@
languageCode = "en"
languageName = "English"
locale = "en"
label = "English"
weight = 1
title = "ahmza's ramblings"
+1 -1
View File
@@ -1,3 +1,3 @@
[[imports]]
disable = false
path = "github.com/nunocoracao/blowfish/v2"
path = "github.com/nunocoracao/blowfish/v3"
+1 -1
View File
@@ -2,4 +2,4 @@ module github.com/ahmzaa/blog-ahmza-com
go 1.24.3
require github.com/nunocoracao/blowfish/v2 v2.86.0 // indirect
require github.com/nunocoracao/blowfish/v3 v3.4.0
+2
View File
@@ -0,0 +1,2 @@
github.com/nunocoracao/blowfish/v3 v3.4.0 h1:Fv7mS97lagllTGzHA2V1H6+N5fuQd3DuWmOQlFFV4Aw=
github.com/nunocoracao/blowfish/v3 v3.4.0/go.mod h1:8lJwR95VgcyWDhjKvUJMdOQXogrmhYSxkWh4ogSJfCg=
+3 -1
View File
@@ -1,6 +1,8 @@
<br>
<div class="flex items-center gap-x-5">
<a class="text-sm text-neutral-500 dark:text-neutral-400" rel="me noopener noreferrer" target="_blank" href="https://mastodon.social/@ahmza">Mastodon</a>
<a class="text-sm text-neutral-500 dark:text-neutral-400" rel="me noopener noreferrer" target="_blank" href="https://github.com/ahmzaa">Github</a>
<a class="text-sm text-neutral-500 dark:text-neutral-400" rel="me noopener noreferrer" target="_blank" href="https://www.linkedin.com/in/ahmza/">Linkedin</a>
<a class="text-sm text-neutral-500 dark:text-neutral-400" rel="me noopener noreferrer" target="_blank" href="https://github.com/ahmzaa">Github</a>
<a class="text-sm text-neutral-500 dark:text-neutral-400" rel="me noopener noreferrer" target="_blank" href="https://gitlab.com/ahmza">Gitlab</a>
<a class="text-sm text-neutral-500 dark:text-neutral-400" rel="me noopener noreferrer" target="_blank" href="https://tea.ahmza.com/ahmza">Gitea</a>
</div>
-69
View File
@@ -1,69 +0,0 @@
## Commit messages
backend:
name: github
repo: ahmzaa/blog-ahmza-com
branch: main
squash_merges: true
base_url: https://sveltia-cms-auth.hamzaahmed12328.workers.dev
use_graphql: true
commit_messages:
create: Create {{collection}} "{{slug}}"
update: Update {{collection}} "{{slug}}"
delete: Delete {{collection}} "{{slug}}"
uploadMedia: Upload "{{path}}"
deleteMedia: Delete "{{path}}"
openAuthoring: '{{message}}'
## Publish mode
publish_mode: editorial_workflow # Allowed Values: simple, editorial_workflow
## Media and Public folders
#Media
media_folder: "assets/uploaded/img"
public_folder: "/uploaded/img"
## SiteTitle
site_url: https://blog.ahmza.com
display_url: blog.ahmza.com
logo_url: https://blog.ahmza.com/logo.webp
## Collections
collections:
- name: posts
identifier_field: name
label: posts
label_singular: post
icon: article
description: sites main content, blog posts
folder: "content/posts"
path: "{{slug}}/index"
media_folder: ""
public_folder: ""
create: true
slug: '{{slug}}'
fields:
- {label: "Title", name: "title", widget: "string"}
- {label: "Featured Image", name: "featureimage", widget: "image"}
- {label: "Featured Image Caption", name: "featureimagecaption", widget: "string"}
- {label: "Publish Date", name: "date", widget: "datetime", default: "{{now}}", date_format: "YYYY-MM-DD"}
- {label: "Last Modified", name: "lastmod", widget: "datetime", default: "{{now}}", date_format: "YYYY-MM-DD"}
- {label: "Author", name: "author", widget: "string", default: "ahmza"}
- {label: "Draft", name: "draft", widget: "boolean", default: "false"}
- {label: "Tags", name: "tags", widget: "list"}
- {label: "Description", name: "description", widget: "string"}
- {label: "Body", name: "body", widget: "markdown"}
extension: md
sortable_fields: ['title', 'date', 'lastmod', 'tags']
view_filters:
- label: "ahmza's posts"
field: author
pattern: 'ahmza'
- label: Drafts
field: draft
pattern: true
view_groups:
- label: Year
field: date
pattern: \d{4}
- label: Drafts
field: draft
-20
View File
@@ -1,20 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="robots" content="noindex" />
<title>Content Manager</title>
<!-- Include the script that enables Netlify Identity on this page. -->
</head>
<body>
<!-- Sveltia CMS, pinned to a specific version with Subresource Integrity.
Bump the version + regenerate the integrity hash when upgrading:
curl -sS https://cdn.jsdelivr.net/npm/@sveltia/cms@<ver>/dist/sveltia-cms.js \
| openssl dgst -sha384 -binary | openssl base64 -A -->
<script
src="https://cdn.jsdelivr.net/npm/@sveltia/cms@0.172.4/dist/sveltia-cms.js"
integrity="sha384-Sj4Mfbg9OjjwG2ZE/YeUYu7xbZRTXGFg/wa/nszj3KzItKuRLEmGqSpV5C9YI2Ge"
crossorigin="anonymous"></script>
</body>
</html>