<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Multicloud on ps4bp</title><link>https://ps4bp.netlify.app/categories/multicloud/</link><description>Recent content in Multicloud on ps4bp</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Tue, 27 Oct 2026 16:41:01 +1100</lastBuildDate><atom:link href="https://ps4bp.netlify.app/categories/multicloud/index.xml" rel="self" type="application/rss+xml"/><item><title>Hosted by Netlify</title><link>https://ps4bp.netlify.app/posts/hosted-by-netlify/</link><pubDate>Tue, 27 Oct 2026 16:41:01 +1100</pubDate><guid>https://ps4bp.netlify.app/posts/hosted-by-netlify/</guid><description>&lt;h1 id="how-to-deploy-to-netlify"&gt;&#10; How to deploy to Netlify&#10; &lt;a class="heading-link" href="#how-to-deploy-to-netlify"&gt;&#10; &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"&gt;&lt;/i&gt;&#10; &lt;span class="sr-only"&gt;Link to heading&lt;/span&gt;&#10; &lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;I&amp;rsquo;m practicing multicloud deployments and want to host this blog on Netlify.&lt;/p&gt;&#10;&lt;h2 id="create-netlifytoml-in-blog-repo-on-gitlab"&gt;&#10; Create netlify.toml in blog repo on GitLab&#10; &lt;a class="heading-link" href="#create-netlifytoml-in-blog-repo-on-gitlab"&gt;&#10; &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"&gt;&lt;/i&gt;&#10; &lt;span class="sr-only"&gt;Link to heading&lt;/span&gt;&#10; &lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;build&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;DART_SASS_VERSION&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;1.105.1&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;GO_VERSION&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;1.27.2&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;HUGO_VERSION&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0.168.0&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;NODE_VERSION&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;24.21.0&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;TZ&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Europe/Oslo&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;build&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;publish&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;public&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;command&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; curl -sfLO &amp;#34;&lt;/span&gt;&lt;span class="nx"&gt;https&lt;/span&gt;&lt;span class="err"&gt;://&lt;/span&gt;&lt;span class="nx"&gt;github&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;com&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;sass&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;dart-sass&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;releases&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;download&lt;/span&gt;&lt;span class="err"&gt;/$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;DART_SASS_VERSION&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;dart-sass-&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;DART_SASS_VERSION&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="nx"&gt;-linux-x64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gz&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34; &amp;amp;&amp;amp; \&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; tar -C &amp;#34;&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;HOME&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;local&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34; -xf &amp;#34;&lt;/span&gt;&lt;span class="nx"&gt;dart-sass-&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;DART_SASS_VERSION&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="nx"&gt;-linux-x64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gz&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34; &amp;amp;&amp;amp; \&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; rm &amp;#34;&lt;/span&gt;&lt;span class="nx"&gt;dart-sass-&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;DART_SASS_VERSION&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="nx"&gt;-linux-x64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gz&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34; &amp;amp;&amp;amp; \&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; export PATH=&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;HOME&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;local&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;dart-sass&lt;/span&gt;&lt;span class="err"&gt;:$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;PATH&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34; &amp;amp;&amp;amp; \&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; git config --global core.quotepath false &amp;amp;&amp;amp; \&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; hugo build --gc --minify --baseURL &amp;#34;&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="configure-netlify"&gt;&#10; Configure Netlify&#10; &lt;a class="heading-link" href="#configure-netlify"&gt;&#10; &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"&gt;&lt;/i&gt;&#10; &lt;span class="sr-only"&gt;Link to heading&lt;/span&gt;&#10; &lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Create a project by importing from GitLab&lt;/li&gt;&#10;&lt;li&gt;Name the project ps4b→blog URL becomes &lt;a href="https://ps4bp.netlify.app" class="external-link" target="_blank" rel="noopener"&gt;https://ps4bp.netlify.app&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="references"&gt;&#10; References&#10; &lt;a class="heading-link" href="#references"&gt;&#10; &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"&gt;&lt;/i&gt;&#10; &lt;span class="sr-only"&gt;Link to heading&lt;/span&gt;&#10; &lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://docs.netlify.com/build/frameworks/framework-setup-guides/hugo/" class="external-link" target="_blank" rel="noopener"&gt;Hugo on Netlify&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://gohugo.io/host-and-deploy/deploy-to-netlify/" class="external-link" target="_blank" rel="noopener"&gt;Deploy to Netlify&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Cloudflare Turnstile</title><link>https://ps4bp.netlify.app/posts/cloudflare-turnstile/</link><pubDate>Tue, 27 Oct 2026 11:45:01 +1100</pubDate><guid>https://ps4bp.netlify.app/posts/cloudflare-turnstile/</guid><description>&lt;h1 id="put-a-gate-in-a-worker"&gt;&#10; Put a gate in a worker&#10; &lt;a class="heading-link" href="#put-a-gate-in-a-worker"&gt;&#10; &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"&gt;&lt;/i&gt;&#10; &lt;span class="sr-only"&gt;Link to heading&lt;/span&gt;&#10; &lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Create a Turnstile widget.&#10;&lt;img src="https://ps4bp.netlify.app/images/cloudflare-turnstile-1.png" alt="Cloudflare Turnstile 1 "&gt;&#10;&#10;In the Cloudflare dashboard, open Turnstile → Add &lt;code&gt;worker-captcha&lt;/code&gt; &lt;em&gt;manually&lt;/em&gt;. Add &lt;a href="https://forex-proxy.ps4bp.workers.dev" class="external-link" target="_blank" rel="noopener"&gt;forex-proxy.ps4bp.workers.dev&lt;/a&gt; as an allowed hostname and copy the sitekey and secret key. The sitekey is public; keep the secret private.&lt;/li&gt;&#10;&lt;li&gt;Store the keys as Worker variables.&#10;&lt;img src="https://ps4bp.netlify.app/images/cloudflare-turnstile-2.png" alt="Cloudflare Turnstile 2"&gt;&#10;&#10;In Workers &amp;amp; Pages → forex-proxy → Settings → Runtime variables and Secrets, add:&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;TURNSTILE_SITE_KEY&lt;/code&gt; as a regular text variable.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;TURNSTILE_SECRET_KEY&lt;/code&gt; as a secret.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Make the Worker handle requests before serving the page.&#10;Have it:&#10;&lt;ul&gt;&#10;&lt;li&gt;Check for a valid pass cookie on each page request.&lt;/li&gt;&#10;&lt;li&gt;If there isn’t one, return a small HTML verification page containing the Turnstile widget.&lt;/li&gt;&#10;&lt;li&gt;Accept the widget token at a verification endpoint and send it to &lt;a href="https://challenges.cloudflare.com/turnstile/v0/siteverify" class="external-link" target="_blank" rel="noopener"&gt;https://challenges.cloudflare.com/turnstile/v0/siteverify&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;Only after Siteverify returns success: true, issue a short-lived, signed pass cookie and redirect back to /.&lt;/li&gt;&#10;&lt;li&gt;Serve index.html when the cookie is valid.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Protect every route that should be gated.&#10;If only the landing page needs protection, gate /. If API routes also need protection, gate those separately so the verification endpoint stays reachable.&lt;/li&gt;&#10;&lt;li&gt;Deploy and check both paths.&#10;Test that a fresh browser sees the challenge, a successful verification reaches the page, and a request without a valid cookie cannot fetch the protected content directly.&lt;/li&gt;&#10;&lt;/ol&gt;</description></item></channel></rss>