From 870aac7da6cd090c65cfa8e2f3d95d24adf2b355 Mon Sep 17 00:00:00 2001 From: Joshua Seigler Date: Sun, 15 Jun 2025 13:26:30 -0400 Subject: [PATCH] Updates --- feed.xml | 440 ++++++++-------------- pagefind/fragment/en_7f9e26e.pf_fragment | Bin 0 -> 2730 bytes pagefind/index/en_192d582.pf_index | Bin 0 -> 36248 bytes pagefind/pagefind-entry.json | 2 +- pagefind/pagefind.en_9ba5dde7b9.pf_meta | Bin 0 -> 292 bytes posts/my-very-own-github-pages/index.html | 415 ++++++++------------ sitemap.xml | 2 +- 7 files changed, 324 insertions(+), 535 deletions(-) create mode 100644 pagefind/fragment/en_7f9e26e.pf_fragment create mode 100644 pagefind/index/en_192d582.pf_index create mode 100644 pagefind/pagefind.en_9ba5dde7b9.pf_meta diff --git a/feed.xml b/feed.xml index dd61b66..9b4c150 100644 --- a/feed.xml +++ b/feed.xml @@ -109,36 +109,38 @@ <p><code>/etc/caddy/Caddyfile</code></p> <pre><code># Global options block { - email you@example.com # &lt;&lt;&lt;&lt; change this - on_demand_tls { - ask http://localhost/check - } + email you@example.com # &lt;&lt;&lt;&lt; CHANGE THIS &lt;&lt;&lt;&lt; + on_demand_tls { + ask http://localhost/check + } } -omitted.webhooks.subdomain.tld { # &lt;&lt;&lt;&lt; change this - reverse_proxy localhost:9000 +# Webhooks +https://webhooks.subdomain.here.tld { &lt;&lt;&lt;&lt; CHANGE THIS &lt;&lt;&lt;&lt; + reverse_proxy localhost:9000 } +# Filter for which SSL certs we will create. Prevents abuse. http://localhost { - handle /check { - root * /var/www - @deny not file /{query.domain}/ - respond @deny 404 - } + handle /check { + root * /var/www + @deny not file /{query.domain}/ + respond @deny 404 + } } +# This automatically handles upgrading http:// requests with a redirect https:// { - tls { - on_demand - } - root /var/www - rewrite /{host}{uri} - # Block files that start with a . - @forbidden { - path /.* - } - respond @forbidden 404 - file_server + tls { + on_demand + } + root /var/www + rewrite /{host}{uri} + @forbidden { + path /.* + } + respond @forbidden 404 + file_server } # Refer to the Caddy docs for more information: @@ -153,225 +155,132 @@ https:// { <code>chown -R joshua:joshua /var/www</code> since the webhooks will run as my login account. </p> -<h3 id="webhook" tabindex="-1"> +<h3 id="webhooks" tabindex="-1"> <a class="header-anchor" - href="https://joshua.seigler.net/posts/my-very-own-github-pages/#webhook" + href="https://joshua.seigler.net/posts/my-very-own-github-pages/#webhooks" aria-hidden="true" ></a> - Webhook + Webhooks </h3> -<p> - I altered the systemd service definition for <code>webhook</code> so I could - organize the hook definitions into separate files. I also set - <code>User=joshua</code> and <code>Group=joshua</code> so the commands run as - my user instead of root. -</p> -<p><code>sudo mkdir /etc/webhook.conf.d/</code></p> -<p><code>/lib/systemd/system/webhook.service</code></p> -<pre><code class="language-ini">[Unit] -Description=Small server for creating HTTP endpoints (hooks) -Documentation=https://github.com/adnanh/webhook/ -ConditionPathExists=/etc/webhook.conf - -[Service] -ExecStart=/usr/bin/webhook -nopanic -hooks /etc/webhook.conf.d/*.conf - -User=joshua -Group=joshua - -[Install] -WantedBy=multi-user.target -</code></pre> -<p> - If you are debugging your webhook output, consider adding - <code>-debug</code> next to <code>-nopanic</code> for more useful logs. -</p> -<p> - After changing the service definition, reload systemd to run the updated - service: -</p> -<pre><code class="language-bash">sudo systemctl daemon-reload -</code></pre> -<p>Then you can remove the now-unused config file:</p> -<pre><code class="language-bash">sudo rm /etc/webhook.conf -</code></pre> -<p>Here are the three hook definitions:</p> -<h4 id="create-pages" tabindex="-1"> - <a - class="header-anchor" - href="https://joshua.seigler.net/posts/my-very-own-github-pages/#create-pages" - aria-hidden="true" - ></a> - Create pages -</h4> -<p><code>/etc/webhook.conf.d/create-pages.conf</code></p> -<pre><code class="language-json">[ - { - &quot;id&quot;: &quot;create-pages&quot;, - &quot;execute-command&quot;: &quot;/home/joshua/webhooks/create-pages.sh&quot;, - &quot;command-working-directory&quot;: &quot;/var/www&quot;, - &quot;pass-arguments-to-command&quot;: - [ - { - &quot;source&quot;: &quot;payload&quot;, - &quot;name&quot;: &quot;repository.name&quot; - }, - { - &quot;source&quot;: &quot;payload&quot;, - &quot;name&quot;: &quot;clone_url&quot;, - } - ], - &quot;trigger-rule&quot;: - { - &quot;and&quot;: - [ - { - &quot;match&quot;: - { - &quot;type&quot;: &quot;payload-hmac-sha256&quot;, - &quot;secret&quot;: &quot;(omitted)&quot;, - &quot;parameter&quot;: - { - &quot;source&quot;: &quot;header&quot;, - &quot;name&quot;: &quot;X-Forgejo-Signature&quot; - } - } - } - ] - } - } -] -</code></pre> -<h4 id="remove-pages" tabindex="-1"> - <a - class="header-anchor" - href="https://joshua.seigler.net/posts/my-very-own-github-pages/#remove-pages" - aria-hidden="true" - ></a> - Remove pages -</h4> -<p><code>/etc/webhook.conf.d/remove-pages.conf</code></p> -<pre><code class="language-json">[ - { - &quot;id&quot;: &quot;remove-pages&quot;, - &quot;execute-command&quot;: &quot;/home/joshua/webhooks/remove-pages.sh&quot;, - &quot;command-working-directory&quot;: &quot;/var/www&quot;, - &quot;pass-arguments-to-command&quot;: - [ - { - &quot;source&quot;: &quot;payload&quot;, - &quot;name&quot;: &quot;repository.name&quot; - }, - ], - &quot;trigger-rule&quot;: - { - &quot;and&quot;: - [ - { - &quot;match&quot;: - { - &quot;type&quot;: &quot;payload-hmac-sha256&quot;, - &quot;secret&quot;: &quot;(omitted)&quot;, - &quot;parameter&quot;: - { - &quot;source&quot;: &quot;header&quot;, - &quot;name&quot;: &quot;X-Forgejo-Signature&quot; - } - } - } - ] - } - } -] -</code></pre> -<h4 id="update-pages" tabindex="-1"> - <a - class="header-anchor" - href="https://joshua.seigler.net/posts/my-very-own-github-pages/#update-pages" - aria-hidden="true" - ></a> - Update pages -</h4> -<p><code>/etc/webhook.conf.d/update-pages.conf</code></p> -<pre><code class="language-json">[ - { - &quot;id&quot;: &quot;update-pages&quot;, - &quot;execute-command&quot;: &quot;/home/joshua/webhooks/update-pages.sh&quot;, - &quot;command-working-directory&quot;: &quot;/var/www&quot;, - &quot;pass-arguments-to-command&quot;: - [ - { - &quot;source&quot;: &quot;payload&quot;, - &quot;name&quot;: &quot;repository.name&quot; - }, - ], - &quot;trigger-rule&quot;: - { - &quot;and&quot;: - [ - { - &quot;match&quot;: - { - &quot;type&quot;: &quot;payload-hmac-sha256&quot;, - &quot;secret&quot;: &quot;(omitted)&quot;, - &quot;parameter&quot;: - { - &quot;source&quot;: &quot;header&quot;, - &quot;name&quot;: &quot;X-Forgejo-Signature&quot; - } - } - }, - { - &quot;match&quot;: - { - &quot;type&quot;: &quot;value&quot;, - &quot;value&quot;: &quot;refs/heads/gh-pages&quot;, - &quot;parameter&quot;: - { - &quot;source&quot;: &quot;payload&quot;, - &quot;name&quot;: &quot;ref&quot; - } - } - } - ] - } - } -] -</code></pre> -<p>In my home directory I defined all three hook scripts:</p> -<p><code>webhooks/create-pages.sh</code></p> -<pre><code class="language-bash">#!/bin/bash -# parameter 1 is repo name, parameter 2 is clone URL -[[ &quot;$1&quot; == *&quot;/&quot;* ]] &amp;&amp; exit 1; # no slashes in the name -[[ &quot;$1&quot; == *&quot;..&quot;* ]] &amp;&amp; exit 1; # no .. in the name -[[ &quot;$1&quot; == *&quot;*&quot;* ]] &amp;&amp; exit 1; # no wildcards in the name -[ -d &quot;/var/www/$1&quot; ] &amp;&amp; exit 1; # the directory must not exist -cd &quot;/var/www&quot;; -git clone -b gh-pages --single-branch &quot;$2&quot; &quot;$1&quot; || exit 1; -</code></pre> -<p><code>webhooks/remove-pages.sh</code></p> -<pre><code class="language-bash">#!/bin/bash -# parameter 1 is repo name -[[ &quot;$1&quot; == *&quot;/&quot;* ]] &amp;&amp; exit 1; # no slashes in the name -[[ &quot;$1&quot; == *&quot;..&quot;* ]] &amp;&amp; exit 1; # no .. in the name -[[ &quot;$1&quot; == *&quot;*&quot;* ]] &amp;&amp; exit 1; # no wildcards in the name -[ -d &quot;/var/www/$1&quot; ] &amp;&amp; exit 1; # the directory must exist -cd &quot;/var/www&quot;; -rm -rf &quot;/var/www/$1&quot;; -</code></pre> -<p><code>webhooks/update-pages.sh</code></p> -<pre><code class="language-bash">#!/bin/bash -# parameter 1 is repo name -[[ &quot;$1&quot; == *&quot;/&quot;* ]] &amp;&amp; exit 1; # no slashes in the name -[[ &quot;$1&quot; == *&quot;..&quot;* ]] &amp;&amp; exit 1; # no .. in the name -[[ &quot;$1&quot; == *&quot;*&quot;* ]] &amp;&amp; exit 1; # no wildcards in the name -[ -d &quot;/var/www/$1&quot; ] || exit 1; # the directory must exist +<p>In my home directory I defined two hook scripts:</p> +<p><code>~/webhooks/update-pages.sh</code></p> +<pre><code class="language-bash"> +#!/bin/bash +# parameter 1 is repo name, parameter 2 is clone url +[[ &quot;$1&quot; == *&quot;/&quot;* ]] &amp;&amp; exit 1; +[[ &quot;$1&quot; == *&quot;..&quot;* ]] &amp;&amp; exit 1; +[[ &quot;$1&quot; == *&quot;*&quot;* ]] &amp;&amp; exit 1; +if [ -d &quot;/var/www/$1&quot; ]; then + git clone -b gh-pages --single-branch &quot;$2&quot; &quot;$1&quot; || exit 1; + exit; +fi; cd &quot;/var/www/$1&quot;; git fetch origin gh-pages; git reset --hard origin/gh-pages; exit; </code></pre> +<p><code>~/webhooks/remove-pages.sh</code></p> +<pre><code class="language-bash">#!/bin/bash +# parameter 1 is repo name +[[ &quot;$1&quot; == *&quot;/&quot;* ]] &amp;&amp; exit 1; +[[ &quot;$1&quot; == *&quot;..&quot;* ]] &amp;&amp; exit 1; +[[ &quot;$1&quot; == *&quot;*&quot;* ]] &amp;&amp; exit 1; +[ -d &quot;/var/www/$1&quot; ] || exit 1; +cd &quot;/var/www&quot;; +rm -rf &quot;/var/www/$1&quot;; +</code></pre> +<p> + To trigger these hooks I am using <code>webhook</code> which is in the default + Debian repository. +</p> +<p> + Here are the hook definitions: one for creating/updating a site, and one for + deleting. You will need to generate one or two secret values that the server + can use to know that the webhook is authorized to run. I used linux command + <code>uuidgen -r</code> to create mine. Save these values so you can enter + them in Forgejo later. +</p> +<p> + Also make sure to replace your execute-command lines with ones referencing + your username and script paths. +</p> +<p><code>/etc/webhook.conf</code></p> +<pre><code class="language-json">[ + { + &quot;id&quot;: &quot;update-pages&quot;, + &quot;execute-command&quot;: &quot;su joshua /home/joshua/webhooks/update-pages.sh&quot;, + &quot;command-working-directory&quot;: &quot;/var/www&quot;, + &quot;pass-arguments-to-command&quot;: + [ + { + &quot;source&quot;: &quot;payload&quot;, + &quot;name&quot;: &quot;repository.name&quot; + }, + ], + &quot;trigger-rule&quot;: + { + &quot;and&quot;: + [ + { + &quot;match&quot;: + { + &quot;type&quot;: &quot;payload-hmac-sha256&quot;, + &quot;secret&quot;: &quot;(omitted)&quot;, + &quot;parameter&quot;: + { + &quot;source&quot;: &quot;header&quot;, + &quot;name&quot;: &quot;X-Forgejo-Signature&quot; + } + } + }, + { + &quot;match&quot;: + { + &quot;type&quot;: &quot;value&quot;, + &quot;value&quot;: &quot;refs/heads/gh-pages&quot;, + &quot;parameter&quot;: + { + &quot;source&quot;: &quot;payload&quot;, + &quot;name&quot;: &quot;ref&quot; + } + } + } + ] + } + }, + { + &quot;id&quot;: &quot;remove-pages&quot;, + &quot;execute-command&quot;: &quot;su joshua /home/joshua/webhooks/remove-pages.sh&quot;, + &quot;command-working-directory&quot;: &quot;/var/www&quot;, + &quot;pass-arguments-to-command&quot;: + [ + { + &quot;source&quot;: &quot;payload&quot;, + &quot;name&quot;: &quot;repository.name&quot; + }, + ], + &quot;trigger-rule&quot;: + { + &quot;and&quot;: + [ + { + &quot;match&quot;: + { + &quot;type&quot;: &quot;payload-hmac-sha256&quot;, + &quot;secret&quot;: &quot;(omitted)&quot;, + &quot;parameter&quot;: + { + &quot;source&quot;: &quot;header&quot;, + &quot;name&quot;: &quot;X-Forgejo-Signature&quot; + } + } + } + ] + } + } +] +</code></pre> <h3 id="forgejo" tabindex="-1"> <a class="header-anchor" @@ -385,42 +294,10 @@ exit; conditions.<br /> Under my main user settings I set up each webhook: </p> -<h4 id="create-pages-1" tabindex="-1"> +<h4 id="update-pages" tabindex="-1"> <a class="header-anchor" - href="https://joshua.seigler.net/posts/my-very-own-github-pages/#create-pages-1" - aria-hidden="true" - ></a> - Create pages -</h4> -<p> - Target URL: https:// <em>your domain here</em> /hooks/create-pages<br /> - HTTP Method: <code>POST</code> (the default)<br /> - POST content type: <code>application/json</code> (the default)<br /> - Secret: <em>omitted, use your own</em><br /> - Trigger on: Custom Events &gt; Create<br /> - Branch filter: <code>gh-pages</code> -</p> -<h4 id="remove-pages-1" tabindex="-1"> - <a - class="header-anchor" - href="https://joshua.seigler.net/posts/my-very-own-github-pages/#remove-pages-1" - aria-hidden="true" - ></a> - Remove pages -</h4> -<p> - Target URL: https:// <em>your domain here</em> /hooks/remove-pages<br /> - HTTP Method: <code>POST</code> (the default)<br /> - POST content type: <code>application/json</code> (the default)<br /> - Secret: <em>omitted, use your own</em><br /> - Trigger on: Custom Events &gt; Repository &gt; Delete<br /> - Branch filter: <code>gh-pages</code> -</p> -<h4 id="update-pages-1" tabindex="-1"> - <a - class="header-anchor" - href="https://joshua.seigler.net/posts/my-very-own-github-pages/#update-pages-1" + href="https://joshua.seigler.net/posts/my-very-own-github-pages/#update-pages" aria-hidden="true" ></a> Update pages @@ -433,6 +310,22 @@ exit; Trigger on: Push events<br /> Branch filter: <code>gh-pages</code> </p> +<h4 id="remove-pages" tabindex="-1"> + <a + class="header-anchor" + href="https://joshua.seigler.net/posts/my-very-own-github-pages/#remove-pages" + aria-hidden="true" + ></a> + Remove pages +</h4> +<p> + Target URL: https:// <em>your domain here</em> /hooks/remove-pages<br /> + HTTP Method: <code>POST</code> (the default)<br /> + POST content type: <code>application/json</code> (the default)<br /> + Secret: <em>omitted, use your own</em><br /> + Trigger on: Custom Events &gt; Repository &gt; Delete<br /> + Branch filter: <code>gh-pages</code> +</p> <h2 id="conclusion" tabindex="-1"> <a class="header-anchor" @@ -456,25 +349,18 @@ exit; > </p> <p> - There is room to make the scripts a little smarter. They don’t handle renaming - very well right now, and a few times I had to log in and manually run my - webhook scripts, like this: -</p> -<pre><code class="language-bash">~/webhooks/create-pages.sh marklink.pages.seigler.net &quot;https://git.apps.seigler.net/joshua/marklink.pages.seigler.net.git&quot; -</code></pre> -<p> - The really important thing is that updates just require pushing to - <code>gh-pages</code> which you can easily do with e.g. + For repos with npm build scripts, I use <a href="https://www.npmjs.com/package/gh-pages" target="_blank" rel="noopener" >gh-pages @ npm</a - >. + > + to push the build to the gh-pages branch and up to the server. </p> <p> - I’m also putting off rolling my own CI server, but I imagine that’s the next - stage here. Stay tuned. + I’m putting off rolling my own CI server, but I imagine that’s the next stage + here. Stay tuned. </p> diff --git a/pagefind/fragment/en_7f9e26e.pf_fragment b/pagefind/fragment/en_7f9e26e.pf_fragment new file mode 100644 index 0000000000000000000000000000000000000000..1070c8ac740b41615b4fbcaf6775bb3bda06b8fa GIT binary patch literal 2730 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 k`&`g{WAKC(_I)<-B_{l0h($ literal 0 HcmV?d00001 diff --git a/pagefind/index/en_192d582.pf_index b/pagefind/index/en_192d582.pf_index new file mode 100644 index 0000000000000000000000000000000000000000..038645ccfe21df00229e0574b6089dc7078a4b7b GIT binary patch literal 36248 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/etc/caddy/Caddyfile

# Global options block
 {
-		email you@example.com # <<<< change this
-        on_demand_tls {
-                ask http://localhost/check
-        }
+	email you@example.com # <<<< CHANGE THIS <<<<
+	on_demand_tls {
+		ask http://localhost/check
+	}
 }
 
-omitted.webhooks.subdomain.tld { # <<<< change this
-        reverse_proxy localhost:9000
+# Webhooks
+https://webhooks.subdomain.here.tld { <<<< CHANGE THIS <<<<
+	reverse_proxy localhost:9000
 }
 
+# Filter for which SSL certs we will create. Prevents abuse.
 http://localhost {
-        handle /check {
-                root * /var/www
-                @deny not file /{query.domain}/
-                respond @deny 404
-        }
+	handle /check {
+		root * /var/www
+		@deny not file /{query.domain}/
+		respond @deny 404
+	}
 }
 
+# This automatically handles upgrading http:// requests with a redirect
 https:// {
-        tls {
-                on_demand
-        }
-        root /var/www
-        rewrite /{host}{uri}
-        # Block files that start with a .
-        @forbidden {
-                path /.*
-        }
-        respond @forbidden 404
-        file_server
+	tls {
+		on_demand
+	}
+	root /var/www
+	rewrite /{host}{uri}
+	@forbidden {
+		path /.*
+	}
+	respond @forbidden 404
+	file_server
 }
 
 # Refer to the Caddy docs for more information:
@@ -221,207 +223,127 @@ https:// {
         chown -R joshua:joshua /var/www since the webhooks will run
         as my login account.
       

-

- Webhook +

+ + Webhooks

-

- I altered the systemd service definition for webhook so I - could organize the hook definitions into separate files. I also set - User=joshua and Group=joshua so the commands - run as my user instead of root. -

-

sudo mkdir /etc/webhook.conf.d/

-

/lib/systemd/system/webhook.service

-
[Unit]
-Description=Small server for creating HTTP endpoints (hooks)
-Documentation=https://github.com/adnanh/webhook/
-ConditionPathExists=/etc/webhook.conf
-
-[Service]
-ExecStart=/usr/bin/webhook -nopanic -hooks /etc/webhook.conf.d/*.conf
-
-User=joshua
-Group=joshua
-
-[Install]
-WantedBy=multi-user.target
-
-

- If you are debugging your webhook output, consider adding - -debug next to -nopanic for more useful logs. -

-

- After changing the service definition, reload systemd to run the updated - service: -

-
sudo systemctl daemon-reload
-
-

Then you can remove the now-unused config file:

-
sudo rm /etc/webhook.conf
-
-

Here are the three hook definitions:

-

- - Create pages -

-

/etc/webhook.conf.d/create-pages.conf

-
[
-  {
-    "id": "create-pages",
-    "execute-command": "/home/joshua/webhooks/create-pages.sh",
-    "command-working-directory": "/var/www",
-    "pass-arguments-to-command":
-    [
-      {
-        "source": "payload",
-        "name": "repository.name"
-      },
-      {
-        "source": "payload",
-        "name": "clone_url",
-      }
-    ],
-    "trigger-rule":
-    {
-      "and":
-      [
-        {
-          "match":
-          {
-            "type": "payload-hmac-sha256",
-            "secret": "(omitted)",
-            "parameter":
-            {
-              "source": "header",
-              "name": "X-Forgejo-Signature"
-            }
-          }
-        }
-      ]
-    }
-  }
-]
-
-

- - Remove pages -

-

/etc/webhook.conf.d/remove-pages.conf

-
[
-  {
-    "id": "remove-pages",
-    "execute-command": "/home/joshua/webhooks/remove-pages.sh",
-    "command-working-directory": "/var/www",
-    "pass-arguments-to-command":
-    [
-      {
-        "source": "payload",
-        "name": "repository.name"
-      },
-    ],
-    "trigger-rule":
-    {
-      "and":
-      [
-        {
-          "match":
-          {
-            "type": "payload-hmac-sha256",
-            "secret": "(omitted)",
-            "parameter":
-            {
-              "source": "header",
-              "name": "X-Forgejo-Signature"
-            }
-          }
-        }
-      ]
-    }
-  }
-]
-
-

- - Update pages -

-

/etc/webhook.conf.d/update-pages.conf

-
[
-  {
-    "id": "update-pages",
-    "execute-command": "/home/joshua/webhooks/update-pages.sh",
-    "command-working-directory": "/var/www",
-    "pass-arguments-to-command":
-    [
-      {
-        "source": "payload",
-        "name": "repository.name"
-      },
-    ],
-    "trigger-rule":
-    {
-      "and":
-      [
-        {
-          "match":
-          {
-            "type": "payload-hmac-sha256",
-            "secret": "(omitted)",
-            "parameter":
-            {
-              "source": "header",
-              "name": "X-Forgejo-Signature"
-            }
-          }
-        },
-        {
-          "match":
-          {
-            "type": "value",
-            "value": "refs/heads/gh-pages",
-            "parameter":
-            {
-              "source": "payload",
-              "name": "ref"
-            }
-          }
-        }
-      ]
-    }
-  }
-]
-
-

In my home directory I defined all three hook scripts:

-

webhooks/create-pages.sh

-
#!/bin/bash
-# parameter 1 is repo name, parameter 2 is clone URL
-[[ "$1" == *"/"* ]] && exit 1; # no slashes in the name
-[[ "$1" == *".."* ]] && exit 1; # no .. in the name
-[[ "$1" == *"*"* ]] && exit 1; # no wildcards in the name
-[ -d "/var/www/$1" ] && exit 1; # the directory must not exist
-cd "/var/www";
-git clone -b gh-pages --single-branch "$2" "$1" || exit 1;
-
-

webhooks/remove-pages.sh

-
#!/bin/bash
-# parameter 1 is repo name
-[[ "$1" == *"/"* ]] && exit 1; # no slashes in the name
-[[ "$1" == *".."* ]] && exit 1; # no .. in the name
-[[ "$1" == *"*"* ]] && exit 1; # no wildcards in the name
-[ -d "/var/www/$1" ] && exit 1; # the directory must exist
-cd "/var/www";
-rm -rf "/var/www/$1";
-
-

webhooks/update-pages.sh

-
#!/bin/bash
-# parameter 1 is repo name
-[[ "$1" == *"/"* ]] && exit 1; # no slashes in the name
-[[ "$1" == *".."* ]] && exit 1; # no .. in the name
-[[ "$1" == *"*"* ]] && exit 1; # no wildcards in the name
-[ -d "/var/www/$1" ] || exit 1; # the directory must exist
+      

In my home directory I defined two hook scripts:

+

~/webhooks/update-pages.sh

+

+#!/bin/bash
+# parameter 1 is repo name, parameter 2 is clone url
+[[ "$1" == *"/"* ]] && exit 1;
+[[ "$1" == *".."* ]] && exit 1;
+[[ "$1" == *"*"* ]] && exit 1;
+if [ -d "/var/www/$1" ]; then
+	git clone -b gh-pages --single-branch "$2" "$1" || exit 1;
+	exit;
+fi;
 cd "/var/www/$1";
 git fetch origin gh-pages;
 git reset --hard origin/gh-pages;
 exit;
+
+

~/webhooks/remove-pages.sh

+
#!/bin/bash
+# parameter 1 is repo name
+[[ "$1" == *"/"* ]] && exit 1;
+[[ "$1" == *".."* ]] && exit 1;
+[[ "$1" == *"*"* ]] && exit 1;
+[ -d "/var/www/$1" ] || exit 1;
+cd "/var/www";
+rm -rf "/var/www/$1";
+
+

+ To trigger these hooks I am using webhook which is in the + default Debian repository. +

+

+ Here are the hook definitions: one for creating/updating a site, and one + for deleting. You will need to generate one or two secret values that + the server can use to know that the webhook is authorized to run. I used + linux command uuidgen -r to create mine. Save these values + so you can enter them in Forgejo later. +

+

+ Also make sure to replace your execute-command lines with ones + referencing your username and script paths. +

+

/etc/webhook.conf

+
[
+	{
+		"id": "update-pages",
+		"execute-command": "su joshua /home/joshua/webhooks/update-pages.sh",
+		"command-working-directory": "/var/www",
+		"pass-arguments-to-command":
+		[
+			{
+				"source": "payload",
+				"name": "repository.name"
+			},
+		],
+		"trigger-rule":
+		{
+			"and":
+			[
+				{
+					"match":
+					{
+						"type": "payload-hmac-sha256",
+						"secret": "(omitted)",
+						"parameter":
+						{
+							"source": "header",
+							"name": "X-Forgejo-Signature"
+						}
+					}
+				},
+				{
+					"match":
+					{
+						"type": "value",
+						"value": "refs/heads/gh-pages",
+						"parameter":
+						{
+							"source": "payload",
+							"name": "ref"
+						}
+					}
+				}
+			]
+		}
+	},
+	{
+		"id": "remove-pages",
+		"execute-command": "su joshua /home/joshua/webhooks/remove-pages.sh",
+		"command-working-directory": "/var/www",
+		"pass-arguments-to-command":
+		[
+			{
+				"source": "payload",
+				"name": "repository.name"
+			},
+		],
+		"trigger-rule":
+		{
+			"and":
+			[
+				{
+					"match":
+					{
+						"type": "payload-hmac-sha256",
+						"secret": "(omitted)",
+						"parameter":
+						{
+							"source": "header",
+							"name": "X-Forgejo-Signature"
+						}
+					}
+				}
+			]
+		}
+	}
+]
 

Forgejo @@ -431,32 +353,8 @@ exit; conditions.
Under my main user settings I set up each webhook:

-

- - Create pages -

-

- Target URL: https:// your domain here /hooks/create-pages
- HTTP Method: POST (the default)
- POST content type: application/json (the default)
- Secret: omitted, use your own
- Trigger on: Custom Events > Create
- Branch filter: gh-pages -

-

- - Remove pages -

-

- Target URL: https:// your domain here /hooks/remove-pages
- HTTP Method: POST (the default)
- POST content type: application/json (the default)
- Secret: omitted, use your own
- Trigger on: Custom Events > Repository > Delete
- Branch filter: gh-pages -

-

- +

+ Update pages

@@ -467,6 +365,18 @@ exit; Trigger on: Push events
Branch filter: gh-pages

+

+ + Remove pages +

+

+ Target URL: https:// your domain here /hooks/remove-pages
+ HTTP Method: POST (the default)
+ POST content type: application/json (the default)
+ Secret: omitted, use your own
+ Trigger on: Custom Events > Repository > Delete
+ Branch filter: gh-pages +

Conclusion @@ -489,25 +399,18 @@ exit; >

- There is room to make the scripts a little smarter. They don’t handle - renaming very well right now, and a few times I had to log in and - manually run my webhook scripts, like this: -

-
~/webhooks/create-pages.sh marklink.pages.seigler.net "https://git.apps.seigler.net/joshua/marklink.pages.seigler.net.git"
-
-

- The really important thing is that updates just require pushing to - gh-pages which you can easily do with e.g. + For repos with npm build scripts, I use gh-pages @ npm. + > + to push the build to the gh-pages branch and up to the server.

- I’m also putting off rolling my own CI server, but I imagine that’s the - next stage here. Stay tuned. + I’m putting off rolling my own CI server, but I imagine that’s the next + stage here. Stay tuned.