chore: add favicons
All checks were successful
Build and Deploy Development / build-and-push (push) Successful in 3m0s
Build and Deploy Development / deploy (push) Successful in 21s

This commit is contained in:
2025-09-06 16:30:43 +10:00
parent d9585f2037
commit f65407f86a
51 changed files with 39027 additions and 1111 deletions

View File

@ -1,49 +1,883 @@
<!doctype html><head><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css></head><html lang=en><head><meta charset=utf-8><meta name=theme-color media="(prefers-color-scheme: light)" content="#f7f7f7"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#1b1b1e"><meta name=mobile-web-app-capable content="yes"><meta name=apple-mobile-web-app-status-bar-style content="black-translucent"><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,shrink-to-fit=no,viewport-fit=cover"><meta property="og:url" content="https://comprofix.com/404.html"><meta property="og:site_name" content="Comprofix"><meta property="og:title" content="404 Page not found"><meta property="og:locale" content="en"><meta property="og:type" content="website"><meta name=twitter:card content="summary"><meta name=twitter:title content="404 Page not found"><meta itemprop=name content="404 Page not found"><title>404 Page not found |
Comprofix</title><link rel=apple-touch-icon sizes=180x180 href=/img/favicons/apple-touch-icon.png><link rel=icon type=image/png sizes=32x32 href=/img/favicons/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=/img/favicons/favicon-16x16.png><link rel="shortcut icon" href=/img/favicons/favicon.ico><meta name=apple-mobile-web-app-title content="Comprofix"><meta name=application-name content="Comprofix"><meta name=msapplication-TileColor content="#da532c"><meta name=msapplication-config content="/img/favicons/browserconfig.xml"><meta name=theme-color content="#ffffff"><link rel=preconnect href=https://fonts.googleapis.com><link rel=dns-prefetch href=https://fonts.googleapis.com><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=dns-prefetch href=https://fonts.gstatic.com><link rel=preconnect href=https://cdn.jsdelivr.net><link rel=dns-prefetch href=https://cdn.jsdelivr.net><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css><link rel=stylesheet href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&amp;family=Source+Sans+Pro:wght@400;600;700;900&amp;display=swap"><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css><link rel=stylesheet href=/><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/glightbox@3.3.0/dist/css/glightbox.min.css><script src=/js/modules/theme.js></script><script defer src=/js/commons.js></script></head><body><aside aria-label=Sidebar id=sidebar class="d-flex flex-column align-items-end"><header class=profile-wrapper><a href=/ id=avatar class=rounded-circle><img src=/img/man-logo.png width=112 height=112 alt=avatar onerror='this.style.display="none"'></a>
<a class="site-title d-block" href=/>Comprofix</a><p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p></header><nav class="flex-column flex-grow-1 w-100 ps-0"><ul class=nav><li class=nav-item><a href=/ class=nav-link><i class="fa-fw fas fa-house"></i>
<span>HOME</span></a></li><li class=nav-item><a href=/categories/ class=nav-link><i class="fa-fw fas fa-stream"></i>
<span>CATEGORIES</span></a></li><li class=nav-item><a href=/tags/ class=nav-link><i class="fa-fw fas fa-tags"></i>
<span>TAGS</span></a></li><li class=nav-item><a href=/archives/ class=nav-link><i class="fa-fw fas fa-archive"></i>
<span>ARCHIVES</span></a></li><li class=nav-item><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i>
<span>ABOUT</span></a></li></ul></nav><div class="sidebar-bottom d-flex flex-wrap align-items-center w-100"><button type=button class="btn btn-link nav-link" aria-label="Switch Mode" id=mode-toggle>
<i class="fas fa-adjust"></i>
</button>
<span class=icon-border></span>
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i>
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i>
</a><a href=https://comprofix.com/index.xml aria-label=rss><i class="fas fa-rss"></i></a></div></aside><div id=main-wrapper class="d-flex justify-content-center"><div class="container d-flex flex-column px-xxl-5"><header id=topbar-wrapper class=flex-shrink-0 aria-label="Top Bar"><div id=topbar class="d-flex align-items-center justify-content-between px-lg-3 h-100"><nav id=breadcrumb aria-label=Breadcrumb><span><a href=/>Home</a>
</span><span>404 Page not found</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar>
<i class="fas fa-bars fa-fw"></i></button><div id=topbar-title>404 Page not found</div><button type=button id=search-trigger class="btn btn-link" aria-label=Search>
<i class="fas fa-search fa-fw"></i>
</button>
<search id=search class="align-items-center ms-3 ms-lg-0"><i class="fas fa-search fa-fw"></i>
<input class=form-control id=search-input type=search aria-label=search autocomplete=off placeholder=Search...>
</search><button type=button class="btn btn-link text-decoration-none" id=search-cancel>Cancel</button></div></header><div class="row flex-grow-1"><main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4"><h1 class=dynamic-title>404: Page not found</h1><div class=content><blockquote class=prompt-danger><p>Sorry, we've misplaced that URL or it's pointing to something that doesn't exist.</p></blockquote></div></main><aside aria-label=Panel id=panel-wrapper class="col-xl-3 ps-2 text-muted"><div class=access><section id=access-lastmod><h2 class=panel-heading>Recently Updated</h2><ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2"><li class="text-truncate lh-lg"><a href=/post/2024-09-05-resetrestart/>Reset and Restart</a></li><li class="text-truncate lh-lg"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a></li></ul></section><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div></aside></div><div class=row><div id=tail-wrapper class="col-12 col-lg-11 col-xl-9 px-md-4"><footer aria-label="Site Info" class="d-flex flex-column justify-content-center text-muted
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>©
<time>2025</time>
<a href=https://comprofix.com>Comprofix</a>.
<span data-bs-toggle=tooltip data-bs-placement=top title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author.">Some rights reserved.</span></p><p>Using the <a data-bs-toggle=tooltip data-bs-placement=top title=v1.0.2 href=https://github.com/geekifan/hugo-theme-chirpy target=_blank rel=noopener>Chirpy</a> theme for <a href=https://gohugo.io/ target=_blank rel=noopener>Hugo</a>.</p></footer></div></div><div id=search-result-wrapper class="d-flex justify-content-center d-none"><div class="col-11 content"><div id=search-hints><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div><div id=search-results class="d-flex flex-wrap justify-content-center text-muted mt-3"></div></div></div><script>const DEFAULT_CONFIG={search:{minChars:1,maxResults:5,fields:{title:!0,description:!0,section:!0,contents:!0},strictMode:!0}};class FastSearch{constructor({searchInput:e,resultsContainer:t,json:n,searchResultTemplate:s=null,noResultsText:o=null}){this.searchInput=e,this.resultsContainer=t,this.json=n,this.searchResultTemplate=s,this.noResultsText=o,this.init()}init(){this.loadSearchIndex(),this.searchInput.addEventListener("input",e=>{if(!this.searchIndex){this.resultsContainer.innerHTML='<li class="search-message">Loading search index...</li>';return}this.performSearch(this.searchInput.value)})}async loadSearchIndex(){try{const e=await fetch(this.json);if(!e.ok)throw new Error("Failed to load search index");const t=await e.json();this.searchIndex=t.map(e=>({...e,searchableTitle:e.title?.toLowerCase()||"",searchableDesc:e.desc?.toLowerCase()||"",searchableSection:e.section?.toLowerCase()||"",searchableContents:e.contents?.toLowerCase()||""}))}catch(e){console.error("Error loading search index:",e),this.resultsContainer.innerHTML='<li class="search-message">Error loading search index...</li>'}}escapeHtml(e){return e?e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;"):""}containsTerm(e,t){return!!e&&!!t&&e.includes(t)}performSearch(e){if(e=e.toLowerCase().trim(),!e||!this.searchIndex||e.length<DEFAULT_CONFIG.search.minChars){this.resultsContainer.innerHTML="";return}const s=[e,...e.split(/\s+/).filter(e=>e.length>0)],t=[...new Set(s)],o=DEFAULT_CONFIG.search.strictMode,n=this.searchIndex.map(e=>{const s=this.checkFieldsForMatch(e,t[0]);if(o&&!s)return{item:e,score:0,matched:!1};let n=0,i=0,a=!1;t.forEach((t,s)=>{const r=s===0,o=this.checkFieldsForMatch(e,t);o&&(i++,o.inTitle&&(n+=r?10:5,a=!0),o.inDesc&&(n+=r?8:4),o.inSection&&(n+=r?6:3),o.inContents&&(n+=r?4:2))});const r=i/t.length,c=n*r*(a?1.5:1);return{item:e,score:c,matched:s}}).filter(e=>e.matched).sort((e,t)=>t.score-e.score).slice(0,DEFAULT_CONFIG.search.maxResults).map(e=>e.item);if(n.length===0){this.resultsContainer.innerHTML='<p class="mt-5">Oops! No results found.</p>';return}const i=n.map(e=>{let t="",n="";return e.categories&&(t=e.categories.join(", "),t=`<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${t}</div>`),e.tags&&(n=e.tags.join(", "),n=`<div><i class="fa fa-tag fa-fw"></i>${n}</div>`),`
<!doctype html>
<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
</head>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta
name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
>
<meta property="og:url" content="http://localhost:1313/404.html">
<meta property="og:site_name" content="Comprofix">
<meta property="og:title" content="404 Page not found">
<meta property="og:locale" content="en">
<meta property="og:type" content="website">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="404 Page not found">
<meta itemprop="name" content="404 Page not found">
<title>
404 Page not found |
Comprofix
</title>
<link rel="apple-touch-icon" sizes="180x180" href="/img/favicons/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicons/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicons/favicon-16x16.png">
<link rel="shortcut icon" href="/img/favicons/favicon.ico">
<meta name="apple-mobile-web-app-title" content="Comprofix">
<meta name="application-name" content="Comprofix">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="msapplication-config" content="/img/favicons/browserconfig.xml">
<meta name="theme-color" content="#ffffff">
<link rel="preconnect" href="https://fonts.googleapis.com" >
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="dns-prefetch" href="https://fonts.gstatic.com" >
<link rel="preconnect" href="https://cdn.jsdelivr.net" >
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" >
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&amp;family=Source&#43;Sans&#43;Pro:wght@400;600;700;900&amp;display=swap">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css">
<link rel="stylesheet" href="/">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/glightbox@3.3.0/dist/css/glightbox.min.css">
<script src="/js/modules/theme.js"></script>
<script defer src="/js/commons.js"></script>
</head>
<body>
<aside aria-label="Sidebar" id="sidebar" class="d-flex flex-column align-items-end">
<header class="profile-wrapper">
<a href="/" id="avatar" class="rounded-circle"><img src="/img/man-logo.png" width="112" height="112" alt="avatar" onerror="this.style.display='none'"></a>
<a class="site-title d-block" href="/">Comprofix</a>
<p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p>
</header>
<nav class="flex-column flex-grow-1 w-100 ps-0">
<ul class="nav">
<li class="nav-item">
<a href="/" class="nav-link">
<i class="fa-fw fas fa-house"></i>
<span>HOME</span>
</a>
</li>
<li class="nav-item">
<a href="/categories/" class="nav-link">
<i class="fa-fw fas fa-stream"></i>
<span>CATEGORIES</span>
</a>
</li>
<li class="nav-item">
<a href="/tags/" class="nav-link">
<i class="fa-fw fas fa-tags"></i>
<span>TAGS</span>
</a>
</li>
<li class="nav-item">
<a href="/archives/" class="nav-link">
<i class="fa-fw fas fa-archive"></i>
<span>ARCHIVES</span>
</a>
</li>
<li class="nav-item">
<a href="/about/" class="nav-link">
<i class="fa-fw fas fa-info-circle"></i>
<span>ABOUT</span>
</a>
</li>
</ul>
</nav>
<div class="sidebar-bottom d-flex flex-wrap align-items-center w-100">
<button type="button" class="btn btn-link nav-link" aria-label="Switch Mode" id="mode-toggle">
<i class="fas fa-adjust"></i>
</button>
<span class="icon-border"></span>
<a
href="https://git.comprofix.com/mmckinnon"
aria-label="custom"
target="_blank" rel="noopener noreferrer"
>
<i class="fab fa-git-alt"></i>
</a>
<a
href="https://twitter.com/mckinnon81"
aria-label="twitter"
target="_blank" rel="noopener noreferrer"
>
<i class="fab fa-twitter"></i>
</a>
<a
href="http://localhost:1313/index.xml"
aria-label="rss"
>
<i class="fas fa-rss"></i>
</a>
</div>
</aside>
<div id="main-wrapper" class="d-flex justify-content-center">
<div class="container d-flex flex-column px-xxl-5">
<header id="topbar-wrapper" class="flex-shrink-0" aria-label="Top Bar">
<div id="topbar" class="d-flex align-items-center justify-content-between px-lg-3 h-100">
<nav id="breadcrumb" aria-label="Breadcrumb">
<span>
<a href="/">Home</a>
</span>
<span>404 Page not found</span>
</nav>
<button type="button" id="sidebar-trigger" class="btn btn-link" aria-label="Sidebar">
<i class="fas fa-bars fa-fw"></i>
</button>
<div id="topbar-title">
404 Page not found
</div>
<button type="button" id="search-trigger" class="btn btn-link" aria-label="Search">
<i class="fas fa-search fa-fw"></i>
</button>
<search id="search" class="align-items-center ms-3 ms-lg-0">
<i class="fas fa-search fa-fw"></i>
<input
class="form-control"
id="search-input"
type="search"
aria-label="search"
autocomplete="off"
placeholder="Search..."
>
</search>
<button type="button" class="btn btn-link text-decoration-none" id="search-cancel">Cancel</button>
</div>
</header>
<div class="row flex-grow-1">
<main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4">
<h1 class="dynamic-title">404: Page not found</h1>
<div class="content">
<blockquote class="prompt-danger"><p>Sorry, we&#39;ve misplaced that URL or it&#39;s pointing to something that doesn&#39;t exist.</p></blockquote>
</div>
</main>
<aside aria-label="Panel" id="panel-wrapper" class="col-xl-3 ps-2 text-muted">
<div class="access">
<section id="access-lastmod">
<h2 class="panel-heading">Recently Updated</h2>
<ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2">
<li class="text-truncate lh-lg">
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration &amp; Continuous Deployment</a>
</li>
<li class="text-truncate lh-lg">
<a href="/post/2024-09-05-resetrestart/">Reset and Restart</a>
</li>
</ul>
</section>
<section>
<h2 class="panel-heading">Trending Tags</h2>
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
</div>
</section>
</div>
</aside>
</div>
<div class="row">
<div id="tail-wrapper" class="col-12 col-lg-11 col-xl-9 px-md-4">
<footer
aria-label="Site Info"
class="
d-flex flex-column justify-content-center text-muted
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
"
>
<p>
©
<time>2025</time>
<a href="https://comprofix.com">Comprofix</a>.
<span
data-bs-toggle="tooltip"
data-bs-placement="top"
title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author."
>Some rights reserved.</span>
</p>
<p>Using the <a
data-bs-toggle="tooltip"
data-bs-placement="top"
title="v1.0.2"
href="https://github.com/geekifan/hugo-theme-chirpy"
target="_blank"
rel="noopener"
>Chirpy</a> theme for <a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a>.
</p>
</footer>
</div>
</div>
<div id="search-result-wrapper" class="d-flex justify-content-center d-none">
<div class="col-11 content">
<div id="search-hints">
<section>
<h2 class="panel-heading">Trending Tags</h2>
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
</div>
</section>
</div>
<div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
</div>
</div>
<script>
const DEFAULT_CONFIG = {
search: {
minChars: 1,
maxResults: 5,
fields: {
title: true,
description: true,
section: true,
contents: true
},
strictMode: true
}
};
class FastSearch {
constructor({
searchInput, resultsContainer, json,
searchResultTemplate = null,
noResultsText = null,
}) {
this.searchInput = searchInput;
this.resultsContainer = resultsContainer;
this.json = json;
this.searchResultTemplate = searchResultTemplate;
this.noResultsText = noResultsText;
this.init();
}
init() {
this.loadSearchIndex();
this.searchInput.addEventListener('input', (event) => {
if (!this.searchIndex) {
this.resultsContainer.innerHTML = '<li class="search-message">Loading search index...</li>';
return;
}
this.performSearch(this.searchInput.value);
});
}
async loadSearchIndex() {
try {
const response = await fetch(this.json);
if (!response.ok) throw new Error('Failed to load search index');
const data = await response.json();
this.searchIndex = data.map(item => ({
...item,
searchableTitle: item.title?.toLowerCase() || '',
searchableDesc: item.desc?.toLowerCase() || '',
searchableSection: item.section?.toLowerCase() || '',
searchableContents: item.contents?.toLowerCase() || ''
}));
} catch (error) {
console.error('Error loading search index:', error);
this.resultsContainer.innerHTML = '<li class="search-message">Error loading search index...</li>';
}
}
escapeHtml(unsafe) {
if (!unsafe) return '';
return unsafe
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}
containsTerm(text, term) {
if (!text || !term) return false;
return text.includes(term);
}
performSearch(query) {
query = query.toLowerCase().trim();
if (!query || !this.searchIndex || query.length < DEFAULT_CONFIG.search.minChars) {
this.resultsContainer.innerHTML = '';
return;
}
const searchTerms = [
query,
...query.split(/\s+/).filter(term => term.length > 0)
];
const uniqueTerms = [...new Set(searchTerms)];
const requireFullQueryMatch = DEFAULT_CONFIG.search.strictMode;
const results = this.searchIndex
.map(item => {
const fullQueryMatched = this.checkFieldsForMatch(item, uniqueTerms[0]);
if (requireFullQueryMatch && !fullQueryMatched) {
return { item, score: 0, matched: false };
}
let score = 0;
let matchedTermsCount = 0;
let matchedInTitle = false;
uniqueTerms.forEach((term, index) => {
const isFullQuery = index === 0;
const matched = this.checkFieldsForMatch(item, term);
if (matched) {
matchedTermsCount++;
if (matched.inTitle) {
score += isFullQuery ? 10 : 5;
matchedInTitle = true;
}
if (matched.inDesc) {
score += isFullQuery ? 8 : 4;
}
if (matched.inSection) {
score += isFullQuery ? 6 : 3;
}
if (matched.inContents) {
score += isFullQuery ? 4 : 2;
}
}
});
const matchRatio = matchedTermsCount / uniqueTerms.length;
const finalScore = score * matchRatio * (matchedInTitle ? 1.5 : 1);
return {
item,
score: finalScore,
matched: fullQueryMatched
};
})
.filter(result => result.matched)
.sort((a, b) => b.score - a.score)
.slice(0, DEFAULT_CONFIG.search.maxResults)
.map(result => result.item);
if (results.length === 0) {
this.resultsContainer.innerHTML = '<p class="mt-5">Oops! No results found.</p>';
return;
}
const searchItems = results.map((item) => {
let categories = '';
let tags = '';
if (item.categories) {
categories = item.categories.join(', ');
categories = `<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${categories}</div>`;
}
if (item.tags) {
tags = item.tags.join(', ');
tags = `<div><i class="fa fa-tag fa-fw"></i>${tags}</div>`
}
return `
<article class="px-1 px-sm-2 px-lg-4 px-xl-0">
<header>
<h2><a href="${this.escapeHtml(e.permalink)}">${this.escapeHtml(e.title)}</a></h2>
<h2><a href="${this.escapeHtml(item.permalink)}">${this.escapeHtml(item.title)}</a></h2>
<div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
${t}
${n}
${categories}
${tags}
</div>
</header>
<p>${this.escapeHtml(e.contents)}</p>
<p>${this.escapeHtml(item.contents)}</p>
</article>
`}).join("");this.resultsContainer.innerHTML=i}checkFieldsForMatch(e,t){const n={inTitle:!1,inDesc:!1,inSection:!1,inContents:!1};return DEFAULT_CONFIG.search.fields.title&&this.containsTerm(e.searchableTitle,t)&&(n.inTitle=!0),DEFAULT_CONFIG.search.fields.description&&this.containsTerm(e.searchableDesc,t)&&(n.inDesc=!0),DEFAULT_CONFIG.search.fields.section&&this.containsTerm(e.searchableSection,t)&&(n.inSection=!0),DEFAULT_CONFIG.search.fields.contents&&this.containsTerm(e.searchableContents,t)&&(n.inContents=!0),!!(n.inTitle||n.inDesc||n.inSection||n.inContents)&&n}}const search=new FastSearch({searchInput:document.getElementById("search-input"),resultsContainer:document.getElementById("search-results"),json:`/index.json`})</script></div><aside aria-label="Scroll to Top"><button id=back-to-top type=button class="btn btn-lg btn-box-shadow">
<i class="fas fa-angle-up"></i></button></aside></div><div id=mask class="d-none position-fixed w-100 h-100 z-1"></div></body></html>
`;
}).join('');
this.resultsContainer.innerHTML = searchItems;
}
checkFieldsForMatch(item, term) {
const matches = {
inTitle: false,
inDesc: false,
inSection: false,
inContents: false
};
if (DEFAULT_CONFIG.search.fields.title && this.containsTerm(item.searchableTitle, term)) {
matches.inTitle = true;
}
if (DEFAULT_CONFIG.search.fields.description && this.containsTerm(item.searchableDesc, term)) {
matches.inDesc = true;
}
if (DEFAULT_CONFIG.search.fields.section && this.containsTerm(item.searchableSection, term)) {
matches.inSection = true;
}
if (DEFAULT_CONFIG.search.fields.contents && this.containsTerm(item.searchableContents, term)) {
matches.inContents = true;
}
if (matches.inTitle || matches.inDesc || matches.inSection || matches.inContents) {
return matches;
}
return false;
}
}
const search = new FastSearch({
searchInput: document.getElementById('search-input'),
resultsContainer: document.getElementById('search-results'),
json: `\/index.json`
});
</script>
</div>
<aside aria-label="Scroll to Top">
<button id="back-to-top" type="button" class="btn btn-lg btn-box-shadow">
<i class="fas fa-angle-up"></i>
</button>
</aside>
</div>
<div id="mask" class="d-none position-fixed w-100 h-100 z-1"></div>
</body>
</html>

View File

@ -1,53 +1,950 @@
<!doctype html><head><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css></head><html lang=en><head><meta charset=utf-8><meta name=theme-color media="(prefers-color-scheme: light)" content="#f7f7f7"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#1b1b1e"><meta name=mobile-web-app-capable content="yes"><meta name=apple-mobile-web-app-status-bar-style content="black-translucent"><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,shrink-to-fit=no,viewport-fit=cover"><meta property="og:url" content="https://comprofix.com/about/"><meta property="og:site_name" content="Comprofix"><meta property="og:title" content="About"><meta property="og:description" content="Chirpy is a blog theme originally based on Jekyll. Due to Jekylls design limitations, it does not natively support internationalization (i18n) and requires third-party plugins for i18n functionality. To enable i18n support for Chirpy without the hassle of relying on third-party plugins, the hugo-theme-chirpy project migrated the Chirpy theme to Hugo with minimal adaptations. All features of Chirpy are available in hugo-theme-chirpy (though some functionalities may operate differently within the Hugo framework).
Follow the posts in the demo site to quickly set up a free personal blog!"><meta property="og:locale" content="en"><meta property="og:type" content="article"><meta property="article:published_time" content="2023-04-20T00:00:00+00:00"><meta property="article:modified_time" content="2025-09-06T13:28:05+10:00"><meta name=twitter:card content="summary"><meta name=twitter:title content="About"><meta name=twitter:description content="Chirpy is a blog theme originally based on Jekyll. Due to Jekylls design limitations, it does not natively support internationalization (i18n) and requires third-party plugins for i18n functionality. To enable i18n support for Chirpy without the hassle of relying on third-party plugins, the hugo-theme-chirpy project migrated the Chirpy theme to Hugo with minimal adaptations. All features of Chirpy are available in hugo-theme-chirpy (though some functionalities may operate differently within the Hugo framework).
Follow the posts in the demo site to quickly set up a free personal blog!"><meta itemprop=name content="About"><meta itemprop=description content="Chirpy is a blog theme originally based on Jekyll. Due to Jekylls design limitations, it does not natively support internationalization (i18n) and requires third-party plugins for i18n functionality. To enable i18n support for Chirpy without the hassle of relying on third-party plugins, the hugo-theme-chirpy project migrated the Chirpy theme to Hugo with minimal adaptations. All features of Chirpy are available in hugo-theme-chirpy (though some functionalities may operate differently within the Hugo framework).
Follow the posts in the demo site to quickly set up a free personal blog!"><meta itemprop=datePublished content="2023-04-20T00:00:00+00:00"><meta itemprop=dateModified content="2025-09-06T13:28:05+10:00"><meta itemprop=wordCount content="171"><title>About |
Comprofix</title><link rel=apple-touch-icon sizes=180x180 href=/img/favicons/apple-touch-icon.png><link rel=icon type=image/png sizes=32x32 href=/img/favicons/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=/img/favicons/favicon-16x16.png><link rel="shortcut icon" href=/img/favicons/favicon.ico><meta name=apple-mobile-web-app-title content="Comprofix"><meta name=application-name content="Comprofix"><meta name=msapplication-TileColor content="#da532c"><meta name=msapplication-config content="/img/favicons/browserconfig.xml"><meta name=theme-color content="#ffffff"><link rel=preconnect href=https://fonts.googleapis.com><link rel=dns-prefetch href=https://fonts.googleapis.com><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=dns-prefetch href=https://fonts.gstatic.com><link rel=preconnect href=https://cdn.jsdelivr.net><link rel=dns-prefetch href=https://cdn.jsdelivr.net><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css><link rel=stylesheet href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&amp;family=Source+Sans+Pro:wght@400;600;700;900&amp;display=swap"><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css><link rel=stylesheet href=/><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/glightbox@3.3.0/dist/css/glightbox.min.css><script src=/js/modules/theme.js></script><script src=https://cdn.jsdelivr.net/npm/glightbox@3.3.0/dist/js/glightbox.min.js></script><script src=https://cdn.jsdelivr.net/npm/clipboard@2.0.11/dist/clipboard.min.js></script><script src=https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.js></script><script defer src=/js/page.js></script></head><body><aside aria-label=Sidebar id=sidebar class="d-flex flex-column align-items-end"><header class=profile-wrapper><a href=/ id=avatar class=rounded-circle><img src=/img/man-logo.png width=112 height=112 alt=avatar onerror='this.style.display="none"'></a>
<a class="site-title d-block" href=/>Comprofix</a><p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p></header><nav class="flex-column flex-grow-1 w-100 ps-0"><ul class=nav><li class=nav-item><a href=/ class=nav-link><i class="fa-fw fas fa-house"></i>
<span>HOME</span></a></li><li class=nav-item><a href=/categories/ class=nav-link><i class="fa-fw fas fa-stream"></i>
<span>CATEGORIES</span></a></li><li class=nav-item><a href=/tags/ class=nav-link><i class="fa-fw fas fa-tags"></i>
<span>TAGS</span></a></li><li class=nav-item><a href=/archives/ class=nav-link><i class="fa-fw fas fa-archive"></i>
<span>ARCHIVES</span></a></li><li class="nav-item active"><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i>
<span>ABOUT</span></a></li></ul></nav><div class="sidebar-bottom d-flex flex-wrap align-items-center w-100"><button type=button class="btn btn-link nav-link" aria-label="Switch Mode" id=mode-toggle>
<i class="fas fa-adjust"></i>
</button>
<span class=icon-border></span>
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i>
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i>
</a><a href=https://comprofix.com/index.xml aria-label=rss><i class="fas fa-rss"></i></a></div></aside><div id=main-wrapper class="d-flex justify-content-center"><div class="container d-flex flex-column px-xxl-5"><header id=topbar-wrapper class=flex-shrink-0 aria-label="Top Bar"><div id=topbar class="d-flex align-items-center justify-content-between px-lg-3 h-100"><nav id=breadcrumb aria-label=Breadcrumb><span><a href=/>Home</a>
</span><span>About</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar>
<i class="fas fa-bars fa-fw"></i></button><div id=topbar-title>About</div><button type=button id=search-trigger class="btn btn-link" aria-label=Search>
<i class="fas fa-search fa-fw"></i>
</button>
<search id=search class="align-items-center ms-3 ms-lg-0"><i class="fas fa-search fa-fw"></i>
<input class=form-control id=search-input type=search aria-label=search autocomplete=off placeholder=Search...>
</search><button type=button class="btn btn-link text-decoration-none" id=search-cancel>Cancel</button></div></header><div class="row flex-grow-1"><main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4"><article class=px-1><h1 class=dynamic-title>About</h1><div class=content><p><a href=https://github.com/cotes2020/jekyll-theme-chirpy>Chirpy</a> is a blog theme originally based on <a href=https://jekyllrb.com/>Jekyll</a>. Due to Jekyll&rsquo;s design limitations, it does not natively support internationalization (i18n) and requires third-party plugins for i18n functionality. To enable i18n support for Chirpy without the hassle of relying on third-party plugins, the <a href=https://github.com/geekifan/hugo-theme-chirpy>hugo-theme-chirpy</a> project migrated the Chirpy theme to <a href=https://gohugo.io/>Hugo</a> with minimal adaptations. All features of Chirpy are available in hugo-theme-chirpy (though some functionalities may operate differently within the Hugo framework).</p><p>Follow the posts in the demo site to quickly set up a free personal blog!</p><h2 id=features id=features><span class=me-2>Features</span>
<a href=#features class="anchor text-muted"><i class="fas fa-hashtag"></i></a></h2><ul><li><strong>Dark Mode</strong>: Enhanced readability in low-light environments.</li><li><strong>Multilingual UI:</strong> Easily switch between different languages.</li><li><strong>Efficient Post Organization:</strong> Use hierarchical categories, trending tags, recommended reading, and search functionalities.</li><li><strong>Optimized Layout:</strong> Includes TOC, syntax highlighting, prompts, and more.</li><li><strong>Rich Writing Extensions:</strong> Support for mathematical formulas, charts, flowcharts, and embedded media.</li><li><strong>Multiple Comment Systems:</strong> Choose from various commenting options.</li><li><strong>Web Analysis Tools:</strong> Integrated with multiple analytics tools.</li><li><strong>Modern Web Technologies:</strong> Built for SEO and web performance.</li><li><strong>RSS Feed Support:</strong> Keep your readers updated with RSS feeds.</li></ul></div></article></main><aside aria-label=Panel id=panel-wrapper class="col-xl-3 ps-2 text-muted"><div class=access><section id=access-lastmod><h2 class=panel-heading>Recently Updated</h2><ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2"><li class="text-truncate lh-lg"><a href=/post/2024-09-05-resetrestart/>Reset and Restart</a></li><li class="text-truncate lh-lg"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a></li></ul></section><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div></aside></div><div class=row><div id=tail-wrapper class="col-12 col-lg-11 col-xl-9 px-md-4"><footer aria-label="Site Info" class="d-flex flex-column justify-content-center text-muted
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>©
<time>2025</time>
<a href=https://comprofix.com>Comprofix</a>.
<span data-bs-toggle=tooltip data-bs-placement=top title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author.">Some rights reserved.</span></p><p>Using the <a data-bs-toggle=tooltip data-bs-placement=top title=v1.0.2 href=https://github.com/geekifan/hugo-theme-chirpy target=_blank rel=noopener>Chirpy</a> theme for <a href=https://gohugo.io/ target=_blank rel=noopener>Hugo</a>.</p></footer></div></div><div id=search-result-wrapper class="d-flex justify-content-center d-none"><div class="col-11 content"><div id=search-hints><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div><div id=search-results class="d-flex flex-wrap justify-content-center text-muted mt-3"></div></div></div><script>const DEFAULT_CONFIG={search:{minChars:1,maxResults:5,fields:{title:!0,description:!0,section:!0,contents:!0},strictMode:!0}};class FastSearch{constructor({searchInput:e,resultsContainer:t,json:n,searchResultTemplate:s=null,noResultsText:o=null}){this.searchInput=e,this.resultsContainer=t,this.json=n,this.searchResultTemplate=s,this.noResultsText=o,this.init()}init(){this.loadSearchIndex(),this.searchInput.addEventListener("input",e=>{if(!this.searchIndex){this.resultsContainer.innerHTML='<li class="search-message">Loading search index...</li>';return}this.performSearch(this.searchInput.value)})}async loadSearchIndex(){try{const e=await fetch(this.json);if(!e.ok)throw new Error("Failed to load search index");const t=await e.json();this.searchIndex=t.map(e=>({...e,searchableTitle:e.title?.toLowerCase()||"",searchableDesc:e.desc?.toLowerCase()||"",searchableSection:e.section?.toLowerCase()||"",searchableContents:e.contents?.toLowerCase()||""}))}catch(e){console.error("Error loading search index:",e),this.resultsContainer.innerHTML='<li class="search-message">Error loading search index...</li>'}}escapeHtml(e){return e?e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;"):""}containsTerm(e,t){return!!e&&!!t&&e.includes(t)}performSearch(e){if(e=e.toLowerCase().trim(),!e||!this.searchIndex||e.length<DEFAULT_CONFIG.search.minChars){this.resultsContainer.innerHTML="";return}const s=[e,...e.split(/\s+/).filter(e=>e.length>0)],t=[...new Set(s)],o=DEFAULT_CONFIG.search.strictMode,n=this.searchIndex.map(e=>{const s=this.checkFieldsForMatch(e,t[0]);if(o&&!s)return{item:e,score:0,matched:!1};let n=0,i=0,a=!1;t.forEach((t,s)=>{const r=s===0,o=this.checkFieldsForMatch(e,t);o&&(i++,o.inTitle&&(n+=r?10:5,a=!0),o.inDesc&&(n+=r?8:4),o.inSection&&(n+=r?6:3),o.inContents&&(n+=r?4:2))});const r=i/t.length,c=n*r*(a?1.5:1);return{item:e,score:c,matched:s}}).filter(e=>e.matched).sort((e,t)=>t.score-e.score).slice(0,DEFAULT_CONFIG.search.maxResults).map(e=>e.item);if(n.length===0){this.resultsContainer.innerHTML='<p class="mt-5">Oops! No results found.</p>';return}const i=n.map(e=>{let t="",n="";return e.categories&&(t=e.categories.join(", "),t=`<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${t}</div>`),e.tags&&(n=e.tags.join(", "),n=`<div><i class="fa fa-tag fa-fw"></i>${n}</div>`),`
<!doctype html>
<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
</head>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta
name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
>
<meta property="og:url" content="http://localhost:1313/about/">
<meta property="og:site_name" content="Comprofix">
<meta property="og:title" content="About">
<meta property="og:description" content="Chirpy is a blog theme originally based on Jekyll. Due to Jekylls design limitations, it does not natively support internationalization (i18n) and requires third-party plugins for i18n functionality. To enable i18n support for Chirpy without the hassle of relying on third-party plugins, the hugo-theme-chirpy project migrated the Chirpy theme to Hugo with minimal adaptations. All features of Chirpy are available in hugo-theme-chirpy (though some functionalities may operate differently within the Hugo framework).
Follow the posts in the demo site to quickly set up a free personal blog!">
<meta property="og:locale" content="en">
<meta property="og:type" content="article">
<meta property="article:published_time" content="2023-04-20T00:00:00+00:00">
<meta property="article:modified_time" content="2023-04-20T00:00:00+00:00">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="About">
<meta name="twitter:description" content="Chirpy is a blog theme originally based on Jekyll. Due to Jekylls design limitations, it does not natively support internationalization (i18n) and requires third-party plugins for i18n functionality. To enable i18n support for Chirpy without the hassle of relying on third-party plugins, the hugo-theme-chirpy project migrated the Chirpy theme to Hugo with minimal adaptations. All features of Chirpy are available in hugo-theme-chirpy (though some functionalities may operate differently within the Hugo framework).
Follow the posts in the demo site to quickly set up a free personal blog!">
<meta itemprop="name" content="About">
<meta itemprop="description" content="Chirpy is a blog theme originally based on Jekyll. Due to Jekylls design limitations, it does not natively support internationalization (i18n) and requires third-party plugins for i18n functionality. To enable i18n support for Chirpy without the hassle of relying on third-party plugins, the hugo-theme-chirpy project migrated the Chirpy theme to Hugo with minimal adaptations. All features of Chirpy are available in hugo-theme-chirpy (though some functionalities may operate differently within the Hugo framework).
Follow the posts in the demo site to quickly set up a free personal blog!">
<meta itemprop="datePublished" content="2023-04-20T00:00:00+00:00">
<meta itemprop="dateModified" content="2023-04-20T00:00:00+00:00">
<meta itemprop="wordCount" content="171">
<title>
About |
Comprofix
</title>
<link rel="apple-touch-icon" sizes="180x180" href="/img/favicons/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicons/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicons/favicon-16x16.png">
<link rel="shortcut icon" href="/img/favicons/favicon.ico">
<meta name="apple-mobile-web-app-title" content="Comprofix">
<meta name="application-name" content="Comprofix">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="msapplication-config" content="/img/favicons/browserconfig.xml">
<meta name="theme-color" content="#ffffff">
<link rel="preconnect" href="https://fonts.googleapis.com" >
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="dns-prefetch" href="https://fonts.gstatic.com" >
<link rel="preconnect" href="https://cdn.jsdelivr.net" >
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" >
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&amp;family=Source&#43;Sans&#43;Pro:wght@400;600;700;900&amp;display=swap">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css">
<link rel="stylesheet" href="/">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/glightbox@3.3.0/dist/css/glightbox.min.css">
<script src="/js/modules/theme.js"></script>
<script src="https://cdn.jsdelivr.net/npm/glightbox@3.3.0/dist/js/glightbox.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/clipboard@2.0.11/dist/clipboard.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.js"></script>
<script defer src="/js/page.js"></script>
</head>
<body>
<aside aria-label="Sidebar" id="sidebar" class="d-flex flex-column align-items-end">
<header class="profile-wrapper">
<a href="/" id="avatar" class="rounded-circle"><img src="/img/man-logo.png" width="112" height="112" alt="avatar" onerror="this.style.display='none'"></a>
<a class="site-title d-block" href="/">Comprofix</a>
<p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p>
</header>
<nav class="flex-column flex-grow-1 w-100 ps-0">
<ul class="nav">
<li class="nav-item">
<a href="/" class="nav-link">
<i class="fa-fw fas fa-house"></i>
<span>HOME</span>
</a>
</li>
<li class="nav-item">
<a href="/categories/" class="nav-link">
<i class="fa-fw fas fa-stream"></i>
<span>CATEGORIES</span>
</a>
</li>
<li class="nav-item">
<a href="/tags/" class="nav-link">
<i class="fa-fw fas fa-tags"></i>
<span>TAGS</span>
</a>
</li>
<li class="nav-item">
<a href="/archives/" class="nav-link">
<i class="fa-fw fas fa-archive"></i>
<span>ARCHIVES</span>
</a>
</li>
<li class="nav-item active">
<a href="/about/" class="nav-link">
<i class="fa-fw fas fa-info-circle"></i>
<span>ABOUT</span>
</a>
</li>
</ul>
</nav>
<div class="sidebar-bottom d-flex flex-wrap align-items-center w-100">
<button type="button" class="btn btn-link nav-link" aria-label="Switch Mode" id="mode-toggle">
<i class="fas fa-adjust"></i>
</button>
<span class="icon-border"></span>
<a
href="https://git.comprofix.com/mmckinnon"
aria-label="custom"
target="_blank" rel="noopener noreferrer"
>
<i class="fab fa-git-alt"></i>
</a>
<a
href="https://twitter.com/mckinnon81"
aria-label="twitter"
target="_blank" rel="noopener noreferrer"
>
<i class="fab fa-twitter"></i>
</a>
<a
href="http://localhost:1313/index.xml"
aria-label="rss"
>
<i class="fas fa-rss"></i>
</a>
</div>
</aside>
<div id="main-wrapper" class="d-flex justify-content-center">
<div class="container d-flex flex-column px-xxl-5">
<header id="topbar-wrapper" class="flex-shrink-0" aria-label="Top Bar">
<div id="topbar" class="d-flex align-items-center justify-content-between px-lg-3 h-100">
<nav id="breadcrumb" aria-label="Breadcrumb">
<span>
<a href="/">Home</a>
</span>
<span>About</span>
</nav>
<button type="button" id="sidebar-trigger" class="btn btn-link" aria-label="Sidebar">
<i class="fas fa-bars fa-fw"></i>
</button>
<div id="topbar-title">
About
</div>
<button type="button" id="search-trigger" class="btn btn-link" aria-label="Search">
<i class="fas fa-search fa-fw"></i>
</button>
<search id="search" class="align-items-center ms-3 ms-lg-0">
<i class="fas fa-search fa-fw"></i>
<input
class="form-control"
id="search-input"
type="search"
aria-label="search"
autocomplete="off"
placeholder="Search..."
>
</search>
<button type="button" class="btn btn-link text-decoration-none" id="search-cancel">Cancel</button>
</div>
</header>
<div class="row flex-grow-1">
<main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4">
<article class="px-1">
<h1 class="dynamic-title">
About
</h1>
<div class="content">
<p><a href="https://github.com/cotes2020/jekyll-theme-chirpy">Chirpy</a> is a blog theme originally based on <a href="https://jekyllrb.com/">Jekyll</a>. Due to Jekyll&rsquo;s design limitations, it does not natively support internationalization (i18n) and requires third-party plugins for i18n functionality. To enable i18n support for Chirpy without the hassle of relying on third-party plugins, the <a href="https://github.com/geekifan/hugo-theme-chirpy">hugo-theme-chirpy</a> project migrated the Chirpy theme to <a href="https://gohugo.io/">Hugo</a> with minimal adaptations. All features of Chirpy are available in hugo-theme-chirpy (though some functionalities may operate differently within the Hugo framework).</p>
<p>Follow the posts in the demo site to quickly set up a free personal blog!</p>
<h2 id="features" id=features>
<span class="me-2">Features</span>
<a href="#features" class="anchor text-muted"><i class="fas fa-hashtag"></i></a>
</h2><ul>
<li><strong>Dark Mode</strong>: Enhanced readability in low-light environments.</li>
<li><strong>Multilingual UI:</strong> Easily switch between different languages.</li>
<li><strong>Efficient Post Organization:</strong> Use hierarchical categories, trending tags, recommended reading, and search functionalities.</li>
<li><strong>Optimized Layout:</strong> Includes TOC, syntax highlighting, prompts, and more.</li>
<li><strong>Rich Writing Extensions:</strong> Support for mathematical formulas, charts, flowcharts, and embedded media.</li>
<li><strong>Multiple Comment Systems:</strong> Choose from various commenting options.</li>
<li><strong>Web Analysis Tools:</strong> Integrated with multiple analytics tools.</li>
<li><strong>Modern Web Technologies:</strong> Built for SEO and web performance.</li>
<li><strong>RSS Feed Support:</strong> Keep your readers updated with RSS feeds.</li>
</ul>
</div>
</article>
</main>
<aside aria-label="Panel" id="panel-wrapper" class="col-xl-3 ps-2 text-muted">
<div class="access">
<section id="access-lastmod">
<h2 class="panel-heading">Recently Updated</h2>
<ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2">
<li class="text-truncate lh-lg">
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration &amp; Continuous Deployment</a>
</li>
<li class="text-truncate lh-lg">
<a href="/post/2024-09-05-resetrestart/">Reset and Restart</a>
</li>
</ul>
</section>
<section>
<h2 class="panel-heading">Trending Tags</h2>
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
</div>
</section>
</div>
</aside>
</div>
<div class="row">
<div id="tail-wrapper" class="col-12 col-lg-11 col-xl-9 px-md-4">
<footer
aria-label="Site Info"
class="
d-flex flex-column justify-content-center text-muted
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
"
>
<p>
©
<time>2025</time>
<a href="https://comprofix.com">Comprofix</a>.
<span
data-bs-toggle="tooltip"
data-bs-placement="top"
title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author."
>Some rights reserved.</span>
</p>
<p>Using the <a
data-bs-toggle="tooltip"
data-bs-placement="top"
title="v1.0.2"
href="https://github.com/geekifan/hugo-theme-chirpy"
target="_blank"
rel="noopener"
>Chirpy</a> theme for <a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a>.
</p>
</footer>
</div>
</div>
<div id="search-result-wrapper" class="d-flex justify-content-center d-none">
<div class="col-11 content">
<div id="search-hints">
<section>
<h2 class="panel-heading">Trending Tags</h2>
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
</div>
</section>
</div>
<div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
</div>
</div>
<script>
const DEFAULT_CONFIG = {
search: {
minChars: 1,
maxResults: 5,
fields: {
title: true,
description: true,
section: true,
contents: true
},
strictMode: true
}
};
class FastSearch {
constructor({
searchInput, resultsContainer, json,
searchResultTemplate = null,
noResultsText = null,
}) {
this.searchInput = searchInput;
this.resultsContainer = resultsContainer;
this.json = json;
this.searchResultTemplate = searchResultTemplate;
this.noResultsText = noResultsText;
this.init();
}
init() {
this.loadSearchIndex();
this.searchInput.addEventListener('input', (event) => {
if (!this.searchIndex) {
this.resultsContainer.innerHTML = '<li class="search-message">Loading search index...</li>';
return;
}
this.performSearch(this.searchInput.value);
});
}
async loadSearchIndex() {
try {
const response = await fetch(this.json);
if (!response.ok) throw new Error('Failed to load search index');
const data = await response.json();
this.searchIndex = data.map(item => ({
...item,
searchableTitle: item.title?.toLowerCase() || '',
searchableDesc: item.desc?.toLowerCase() || '',
searchableSection: item.section?.toLowerCase() || '',
searchableContents: item.contents?.toLowerCase() || ''
}));
} catch (error) {
console.error('Error loading search index:', error);
this.resultsContainer.innerHTML = '<li class="search-message">Error loading search index...</li>';
}
}
escapeHtml(unsafe) {
if (!unsafe) return '';
return unsafe
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}
containsTerm(text, term) {
if (!text || !term) return false;
return text.includes(term);
}
performSearch(query) {
query = query.toLowerCase().trim();
if (!query || !this.searchIndex || query.length < DEFAULT_CONFIG.search.minChars) {
this.resultsContainer.innerHTML = '';
return;
}
const searchTerms = [
query,
...query.split(/\s+/).filter(term => term.length > 0)
];
const uniqueTerms = [...new Set(searchTerms)];
const requireFullQueryMatch = DEFAULT_CONFIG.search.strictMode;
const results = this.searchIndex
.map(item => {
const fullQueryMatched = this.checkFieldsForMatch(item, uniqueTerms[0]);
if (requireFullQueryMatch && !fullQueryMatched) {
return { item, score: 0, matched: false };
}
let score = 0;
let matchedTermsCount = 0;
let matchedInTitle = false;
uniqueTerms.forEach((term, index) => {
const isFullQuery = index === 0;
const matched = this.checkFieldsForMatch(item, term);
if (matched) {
matchedTermsCount++;
if (matched.inTitle) {
score += isFullQuery ? 10 : 5;
matchedInTitle = true;
}
if (matched.inDesc) {
score += isFullQuery ? 8 : 4;
}
if (matched.inSection) {
score += isFullQuery ? 6 : 3;
}
if (matched.inContents) {
score += isFullQuery ? 4 : 2;
}
}
});
const matchRatio = matchedTermsCount / uniqueTerms.length;
const finalScore = score * matchRatio * (matchedInTitle ? 1.5 : 1);
return {
item,
score: finalScore,
matched: fullQueryMatched
};
})
.filter(result => result.matched)
.sort((a, b) => b.score - a.score)
.slice(0, DEFAULT_CONFIG.search.maxResults)
.map(result => result.item);
if (results.length === 0) {
this.resultsContainer.innerHTML = '<p class="mt-5">Oops! No results found.</p>';
return;
}
const searchItems = results.map((item) => {
let categories = '';
let tags = '';
if (item.categories) {
categories = item.categories.join(', ');
categories = `<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${categories}</div>`;
}
if (item.tags) {
tags = item.tags.join(', ');
tags = `<div><i class="fa fa-tag fa-fw"></i>${tags}</div>`
}
return `
<article class="px-1 px-sm-2 px-lg-4 px-xl-0">
<header>
<h2><a href="${this.escapeHtml(e.permalink)}">${this.escapeHtml(e.title)}</a></h2>
<h2><a href="${this.escapeHtml(item.permalink)}">${this.escapeHtml(item.title)}</a></h2>
<div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
${t}
${n}
${categories}
${tags}
</div>
</header>
<p>${this.escapeHtml(e.contents)}</p>
<p>${this.escapeHtml(item.contents)}</p>
</article>
`}).join("");this.resultsContainer.innerHTML=i}checkFieldsForMatch(e,t){const n={inTitle:!1,inDesc:!1,inSection:!1,inContents:!1};return DEFAULT_CONFIG.search.fields.title&&this.containsTerm(e.searchableTitle,t)&&(n.inTitle=!0),DEFAULT_CONFIG.search.fields.description&&this.containsTerm(e.searchableDesc,t)&&(n.inDesc=!0),DEFAULT_CONFIG.search.fields.section&&this.containsTerm(e.searchableSection,t)&&(n.inSection=!0),DEFAULT_CONFIG.search.fields.contents&&this.containsTerm(e.searchableContents,t)&&(n.inContents=!0),!!(n.inTitle||n.inDesc||n.inSection||n.inContents)&&n}}const search=new FastSearch({searchInput:document.getElementById("search-input"),resultsContainer:document.getElementById("search-results"),json:`/index.json`})</script></div><aside aria-label="Scroll to Top"><button id=back-to-top type=button class="btn btn-lg btn-box-shadow">
<i class="fas fa-angle-up"></i></button></aside></div><div id=mask class="d-none position-fixed w-100 h-100 z-1"></div></body></html>
`;
}).join('');
this.resultsContainer.innerHTML = searchItems;
}
checkFieldsForMatch(item, term) {
const matches = {
inTitle: false,
inDesc: false,
inSection: false,
inContents: false
};
if (DEFAULT_CONFIG.search.fields.title && this.containsTerm(item.searchableTitle, term)) {
matches.inTitle = true;
}
if (DEFAULT_CONFIG.search.fields.description && this.containsTerm(item.searchableDesc, term)) {
matches.inDesc = true;
}
if (DEFAULT_CONFIG.search.fields.section && this.containsTerm(item.searchableSection, term)) {
matches.inSection = true;
}
if (DEFAULT_CONFIG.search.fields.contents && this.containsTerm(item.searchableContents, term)) {
matches.inContents = true;
}
if (matches.inTitle || matches.inDesc || matches.inSection || matches.inContents) {
return matches;
}
return false;
}
}
const search = new FastSearch({
searchInput: document.getElementById('search-input'),
resultsContainer: document.getElementById('search-results'),
json: `\/index.json`
});
</script>
</div>
<aside aria-label="Scroll to Top">
<button id="back-to-top" type="button" class="btn btn-lg btn-box-shadow">
<i class="fas fa-angle-up"></i>
</button>
</aside>
</div>
<div id="mask" class="d-none position-fixed w-100 h-100 z-1"></div>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@ -1,54 +1,902 @@
<!doctype html><head><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css></head><html lang=en><head><meta charset=utf-8><meta name=theme-color media="(prefers-color-scheme: light)" content="#f7f7f7"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#1b1b1e"><meta name=mobile-web-app-capable content="yes"><meta name=apple-mobile-web-app-status-bar-style content="black-translucent"><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,shrink-to-fit=no,viewport-fit=cover"><meta property="og:url" content="https://comprofix.com/categories/gitea/"><meta property="og:site_name" content="Comprofix"><meta property="og:title" content="Gitea"><meta property="og:locale" content="en"><meta property="og:type" content="website"><meta name=twitter:card content="summary"><meta name=twitter:title content="Gitea"><meta itemprop=name content="Gitea"><meta itemprop=datePublished content="2024-09-21T00:00:00+00:00"><meta itemprop=dateModified content="2025-09-06T13:28:05+10:00"><title>Gitea |
Comprofix</title><link rel=apple-touch-icon sizes=180x180 href=/img/favicons/apple-touch-icon.png><link rel=icon type=image/png sizes=32x32 href=/img/favicons/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=/img/favicons/favicon-16x16.png><link rel="shortcut icon" href=/img/favicons/favicon.ico><meta name=apple-mobile-web-app-title content="Comprofix"><meta name=application-name content="Comprofix"><meta name=msapplication-TileColor content="#da532c"><meta name=msapplication-config content="/img/favicons/browserconfig.xml"><meta name=theme-color content="#ffffff"><link rel=preconnect href=https://fonts.googleapis.com><link rel=dns-prefetch href=https://fonts.googleapis.com><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=dns-prefetch href=https://fonts.gstatic.com><link rel=preconnect href=https://cdn.jsdelivr.net><link rel=dns-prefetch href=https://cdn.jsdelivr.net><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css><link rel=stylesheet href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&amp;family=Source+Sans+Pro:wght@400;600;700;900&amp;display=swap"><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css><script src=/js/modules/theme.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js></script><script defer src=/js/misc.js></script></head><body><aside aria-label=Sidebar id=sidebar class="d-flex flex-column align-items-end"><header class=profile-wrapper><a href=/ id=avatar class=rounded-circle><img src=/img/man-logo.png width=112 height=112 alt=avatar onerror='this.style.display="none"'></a>
<a class="site-title d-block" href=/>Comprofix</a><p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p></header><nav class="flex-column flex-grow-1 w-100 ps-0"><ul class=nav><li class=nav-item><a href=/ class=nav-link><i class="fa-fw fas fa-house"></i>
<span>HOME</span></a></li><li class=nav-item><a href=/categories/ class=nav-link><i class="fa-fw fas fa-stream"></i>
<span>CATEGORIES</span></a></li><li class=nav-item><a href=/tags/ class=nav-link><i class="fa-fw fas fa-tags"></i>
<span>TAGS</span></a></li><li class=nav-item><a href=/archives/ class=nav-link><i class="fa-fw fas fa-archive"></i>
<span>ARCHIVES</span></a></li><li class=nav-item><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i>
<span>ABOUT</span></a></li></ul></nav><div class="sidebar-bottom d-flex flex-wrap align-items-center w-100"><button type=button class="btn btn-link nav-link" aria-label="Switch Mode" id=mode-toggle>
<i class="fas fa-adjust"></i>
</button>
<span class=icon-border></span>
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i>
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i>
</a><a href=https://comprofix.com/index.xml aria-label=rss><i class="fas fa-rss"></i></a></div></aside><div id=main-wrapper class="d-flex justify-content-center"><div class="container d-flex flex-column px-xxl-5"><header id=topbar-wrapper class=flex-shrink-0 aria-label="Top Bar"><div id=topbar class="d-flex align-items-center justify-content-between px-lg-3 h-100"><nav id=breadcrumb aria-label=Breadcrumb><span><a href=/>Home</a>
</span><span><a href=https://comprofix.com/categories/>Categories</a></span>
<span>gitea</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar>
<i class="fas fa-bars fa-fw"></i></button><div id=topbar-title></div><button type=button id=search-trigger class="btn btn-link" aria-label=Search>
<i class="fas fa-search fa-fw"></i>
</button>
<search id=search class="align-items-center ms-3 ms-lg-0"><i class="fas fa-search fa-fw"></i>
<input class=form-control id=search-input type=search aria-label=search autocomplete=off placeholder=Search...>
</search><button type=button class="btn btn-link text-decoration-none" id=search-cancel>Cancel</button></div></header><div class="row flex-grow-1"><main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4"><div id=page-category><h1 class=ps-lg-2><i class="far fa-folder-open fa-fw text-muted"></i>
Gitea
<span class="lead text-muted ps-2">1</span></h1><ul class="content ps-0"><li class="d-flex justify-content-between px-md-3"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a>
<span class="dash flex-grow-1"></span>
<span class="text-muted small text-nowrap">Sep 21, 2024</span></li></ul></div></main><aside aria-label=Panel id=panel-wrapper class="col-xl-3 ps-2 text-muted"><div class=access><section id=access-lastmod><h2 class=panel-heading>Recently Updated</h2><ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2"><li class="text-truncate lh-lg"><a href=/post/2024-09-05-resetrestart/>Reset and Restart</a></li><li class="text-truncate lh-lg"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a></li></ul></section><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div></aside></div><div class=row><div id=tail-wrapper class="col-12 col-lg-11 col-xl-9 px-md-4"><footer aria-label="Site Info" class="d-flex flex-column justify-content-center text-muted
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>©
<time>2025</time>
<a href=https://comprofix.com>Comprofix</a>.
<span data-bs-toggle=tooltip data-bs-placement=top title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author.">Some rights reserved.</span></p><p>Using the <a data-bs-toggle=tooltip data-bs-placement=top title=v1.0.2 href=https://github.com/geekifan/hugo-theme-chirpy target=_blank rel=noopener>Chirpy</a> theme for <a href=https://gohugo.io/ target=_blank rel=noopener>Hugo</a>.</p></footer></div></div><div id=search-result-wrapper class="d-flex justify-content-center d-none"><div class="col-11 content"><div id=search-hints><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div><div id=search-results class="d-flex flex-wrap justify-content-center text-muted mt-3"></div></div></div><script>const DEFAULT_CONFIG={search:{minChars:1,maxResults:5,fields:{title:!0,description:!0,section:!0,contents:!0},strictMode:!0}};class FastSearch{constructor({searchInput:e,resultsContainer:t,json:n,searchResultTemplate:s=null,noResultsText:o=null}){this.searchInput=e,this.resultsContainer=t,this.json=n,this.searchResultTemplate=s,this.noResultsText=o,this.init()}init(){this.loadSearchIndex(),this.searchInput.addEventListener("input",e=>{if(!this.searchIndex){this.resultsContainer.innerHTML='<li class="search-message">Loading search index...</li>';return}this.performSearch(this.searchInput.value)})}async loadSearchIndex(){try{const e=await fetch(this.json);if(!e.ok)throw new Error("Failed to load search index");const t=await e.json();this.searchIndex=t.map(e=>({...e,searchableTitle:e.title?.toLowerCase()||"",searchableDesc:e.desc?.toLowerCase()||"",searchableSection:e.section?.toLowerCase()||"",searchableContents:e.contents?.toLowerCase()||""}))}catch(e){console.error("Error loading search index:",e),this.resultsContainer.innerHTML='<li class="search-message">Error loading search index...</li>'}}escapeHtml(e){return e?e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;"):""}containsTerm(e,t){return!!e&&!!t&&e.includes(t)}performSearch(e){if(e=e.toLowerCase().trim(),!e||!this.searchIndex||e.length<DEFAULT_CONFIG.search.minChars){this.resultsContainer.innerHTML="";return}const s=[e,...e.split(/\s+/).filter(e=>e.length>0)],t=[...new Set(s)],o=DEFAULT_CONFIG.search.strictMode,n=this.searchIndex.map(e=>{const s=this.checkFieldsForMatch(e,t[0]);if(o&&!s)return{item:e,score:0,matched:!1};let n=0,i=0,a=!1;t.forEach((t,s)=>{const r=s===0,o=this.checkFieldsForMatch(e,t);o&&(i++,o.inTitle&&(n+=r?10:5,a=!0),o.inDesc&&(n+=r?8:4),o.inSection&&(n+=r?6:3),o.inContents&&(n+=r?4:2))});const r=i/t.length,c=n*r*(a?1.5:1);return{item:e,score:c,matched:s}}).filter(e=>e.matched).sort((e,t)=>t.score-e.score).slice(0,DEFAULT_CONFIG.search.maxResults).map(e=>e.item);if(n.length===0){this.resultsContainer.innerHTML='<p class="mt-5">Oops! No results found.</p>';return}const i=n.map(e=>{let t="",n="";return e.categories&&(t=e.categories.join(", "),t=`<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${t}</div>`),e.tags&&(n=e.tags.join(", "),n=`<div><i class="fa fa-tag fa-fw"></i>${n}</div>`),`
<!doctype html>
<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
</head>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta
name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
>
<meta property="og:url" content="http://localhost:1313/categories/gitea/">
<meta property="og:site_name" content="Comprofix">
<meta property="og:title" content="Gitea">
<meta property="og:locale" content="en">
<meta property="og:type" content="website">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Gitea">
<meta itemprop="name" content="Gitea">
<meta itemprop="datePublished" content="2024-09-21T00:00:00+00:00">
<meta itemprop="dateModified" content="2024-09-21T00:00:00+00:00">
<title>
Gitea |
Comprofix
</title>
<link rel="apple-touch-icon" sizes="180x180" href="/img/favicons/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicons/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicons/favicon-16x16.png">
<link rel="shortcut icon" href="/img/favicons/favicon.ico">
<meta name="apple-mobile-web-app-title" content="Comprofix">
<meta name="application-name" content="Comprofix">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="msapplication-config" content="/img/favicons/browserconfig.xml">
<meta name="theme-color" content="#ffffff">
<link rel="preconnect" href="https://fonts.googleapis.com" >
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="dns-prefetch" href="https://fonts.gstatic.com" >
<link rel="preconnect" href="https://cdn.jsdelivr.net" >
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" >
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&amp;family=Source&#43;Sans&#43;Pro:wght@400;600;700;900&amp;display=swap">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css">
<script src="/js/modules/theme.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js"></script>
<script defer src="/js/misc.js"></script>
</head>
<body>
<aside aria-label="Sidebar" id="sidebar" class="d-flex flex-column align-items-end">
<header class="profile-wrapper">
<a href="/" id="avatar" class="rounded-circle"><img src="/img/man-logo.png" width="112" height="112" alt="avatar" onerror="this.style.display='none'"></a>
<a class="site-title d-block" href="/">Comprofix</a>
<p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p>
</header>
<nav class="flex-column flex-grow-1 w-100 ps-0">
<ul class="nav">
<li class="nav-item">
<a href="/" class="nav-link">
<i class="fa-fw fas fa-house"></i>
<span>HOME</span>
</a>
</li>
<li class="nav-item">
<a href="/categories/" class="nav-link">
<i class="fa-fw fas fa-stream"></i>
<span>CATEGORIES</span>
</a>
</li>
<li class="nav-item">
<a href="/tags/" class="nav-link">
<i class="fa-fw fas fa-tags"></i>
<span>TAGS</span>
</a>
</li>
<li class="nav-item">
<a href="/archives/" class="nav-link">
<i class="fa-fw fas fa-archive"></i>
<span>ARCHIVES</span>
</a>
</li>
<li class="nav-item">
<a href="/about/" class="nav-link">
<i class="fa-fw fas fa-info-circle"></i>
<span>ABOUT</span>
</a>
</li>
</ul>
</nav>
<div class="sidebar-bottom d-flex flex-wrap align-items-center w-100">
<button type="button" class="btn btn-link nav-link" aria-label="Switch Mode" id="mode-toggle">
<i class="fas fa-adjust"></i>
</button>
<span class="icon-border"></span>
<a
href="https://git.comprofix.com/mmckinnon"
aria-label="custom"
target="_blank" rel="noopener noreferrer"
>
<i class="fab fa-git-alt"></i>
</a>
<a
href="https://twitter.com/mckinnon81"
aria-label="twitter"
target="_blank" rel="noopener noreferrer"
>
<i class="fab fa-twitter"></i>
</a>
<a
href="http://localhost:1313/index.xml"
aria-label="rss"
>
<i class="fas fa-rss"></i>
</a>
</div>
</aside>
<div id="main-wrapper" class="d-flex justify-content-center">
<div class="container d-flex flex-column px-xxl-5">
<header id="topbar-wrapper" class="flex-shrink-0" aria-label="Top Bar">
<div id="topbar" class="d-flex align-items-center justify-content-between px-lg-3 h-100">
<nav id="breadcrumb" aria-label="Breadcrumb">
<span>
<a href="/">Home</a>
</span>
<span><a href="http://localhost:1313/categories/">Categories</a></span>
<span>gitea</span>
</nav>
<button type="button" id="sidebar-trigger" class="btn btn-link" aria-label="Sidebar">
<i class="fas fa-bars fa-fw"></i>
</button>
<div id="topbar-title">
</div>
<button type="button" id="search-trigger" class="btn btn-link" aria-label="Search">
<i class="fas fa-search fa-fw"></i>
</button>
<search id="search" class="align-items-center ms-3 ms-lg-0">
<i class="fas fa-search fa-fw"></i>
<input
class="form-control"
id="search-input"
type="search"
aria-label="search"
autocomplete="off"
placeholder="Search..."
>
</search>
<button type="button" class="btn btn-link text-decoration-none" id="search-cancel">Cancel</button>
</div>
</header>
<div class="row flex-grow-1">
<main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4">
<div id="page-category">
<h1 class="ps-lg-2">
<i class="far fa-folder-open fa-fw text-muted"></i>
Gitea
<span class="lead text-muted ps-2">1</span>
</h1>
<ul class="content ps-0">
<li class="d-flex justify-content-between px-md-3">
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration &amp; Continuous Deployment</a>
<span class="dash flex-grow-1"></span>
<span class="text-muted small text-nowrap">Sep 21, 2024</span>
</li>
</ul>
</div>
</main>
<aside aria-label="Panel" id="panel-wrapper" class="col-xl-3 ps-2 text-muted">
<div class="access">
<section id="access-lastmod">
<h2 class="panel-heading">Recently Updated</h2>
<ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2">
<li class="text-truncate lh-lg">
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration &amp; Continuous Deployment</a>
</li>
<li class="text-truncate lh-lg">
<a href="/post/2024-09-05-resetrestart/">Reset and Restart</a>
</li>
</ul>
</section>
<section>
<h2 class="panel-heading">Trending Tags</h2>
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
</div>
</section>
</div>
</aside>
</div>
<div class="row">
<div id="tail-wrapper" class="col-12 col-lg-11 col-xl-9 px-md-4">
<footer
aria-label="Site Info"
class="
d-flex flex-column justify-content-center text-muted
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
"
>
<p>
©
<time>2025</time>
<a href="https://comprofix.com">Comprofix</a>.
<span
data-bs-toggle="tooltip"
data-bs-placement="top"
title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author."
>Some rights reserved.</span>
</p>
<p>Using the <a
data-bs-toggle="tooltip"
data-bs-placement="top"
title="v1.0.2"
href="https://github.com/geekifan/hugo-theme-chirpy"
target="_blank"
rel="noopener"
>Chirpy</a> theme for <a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a>.
</p>
</footer>
</div>
</div>
<div id="search-result-wrapper" class="d-flex justify-content-center d-none">
<div class="col-11 content">
<div id="search-hints">
<section>
<h2 class="panel-heading">Trending Tags</h2>
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
</div>
</section>
</div>
<div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
</div>
</div>
<script>
const DEFAULT_CONFIG = {
search: {
minChars: 1,
maxResults: 5,
fields: {
title: true,
description: true,
section: true,
contents: true
},
strictMode: true
}
};
class FastSearch {
constructor({
searchInput, resultsContainer, json,
searchResultTemplate = null,
noResultsText = null,
}) {
this.searchInput = searchInput;
this.resultsContainer = resultsContainer;
this.json = json;
this.searchResultTemplate = searchResultTemplate;
this.noResultsText = noResultsText;
this.init();
}
init() {
this.loadSearchIndex();
this.searchInput.addEventListener('input', (event) => {
if (!this.searchIndex) {
this.resultsContainer.innerHTML = '<li class="search-message">Loading search index...</li>';
return;
}
this.performSearch(this.searchInput.value);
});
}
async loadSearchIndex() {
try {
const response = await fetch(this.json);
if (!response.ok) throw new Error('Failed to load search index');
const data = await response.json();
this.searchIndex = data.map(item => ({
...item,
searchableTitle: item.title?.toLowerCase() || '',
searchableDesc: item.desc?.toLowerCase() || '',
searchableSection: item.section?.toLowerCase() || '',
searchableContents: item.contents?.toLowerCase() || ''
}));
} catch (error) {
console.error('Error loading search index:', error);
this.resultsContainer.innerHTML = '<li class="search-message">Error loading search index...</li>';
}
}
escapeHtml(unsafe) {
if (!unsafe) return '';
return unsafe
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}
containsTerm(text, term) {
if (!text || !term) return false;
return text.includes(term);
}
performSearch(query) {
query = query.toLowerCase().trim();
if (!query || !this.searchIndex || query.length < DEFAULT_CONFIG.search.minChars) {
this.resultsContainer.innerHTML = '';
return;
}
const searchTerms = [
query,
...query.split(/\s+/).filter(term => term.length > 0)
];
const uniqueTerms = [...new Set(searchTerms)];
const requireFullQueryMatch = DEFAULT_CONFIG.search.strictMode;
const results = this.searchIndex
.map(item => {
const fullQueryMatched = this.checkFieldsForMatch(item, uniqueTerms[0]);
if (requireFullQueryMatch && !fullQueryMatched) {
return { item, score: 0, matched: false };
}
let score = 0;
let matchedTermsCount = 0;
let matchedInTitle = false;
uniqueTerms.forEach((term, index) => {
const isFullQuery = index === 0;
const matched = this.checkFieldsForMatch(item, term);
if (matched) {
matchedTermsCount++;
if (matched.inTitle) {
score += isFullQuery ? 10 : 5;
matchedInTitle = true;
}
if (matched.inDesc) {
score += isFullQuery ? 8 : 4;
}
if (matched.inSection) {
score += isFullQuery ? 6 : 3;
}
if (matched.inContents) {
score += isFullQuery ? 4 : 2;
}
}
});
const matchRatio = matchedTermsCount / uniqueTerms.length;
const finalScore = score * matchRatio * (matchedInTitle ? 1.5 : 1);
return {
item,
score: finalScore,
matched: fullQueryMatched
};
})
.filter(result => result.matched)
.sort((a, b) => b.score - a.score)
.slice(0, DEFAULT_CONFIG.search.maxResults)
.map(result => result.item);
if (results.length === 0) {
this.resultsContainer.innerHTML = '<p class="mt-5">Oops! No results found.</p>';
return;
}
const searchItems = results.map((item) => {
let categories = '';
let tags = '';
if (item.categories) {
categories = item.categories.join(', ');
categories = `<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${categories}</div>`;
}
if (item.tags) {
tags = item.tags.join(', ');
tags = `<div><i class="fa fa-tag fa-fw"></i>${tags}</div>`
}
return `
<article class="px-1 px-sm-2 px-lg-4 px-xl-0">
<header>
<h2><a href="${this.escapeHtml(e.permalink)}">${this.escapeHtml(e.title)}</a></h2>
<h2><a href="${this.escapeHtml(item.permalink)}">${this.escapeHtml(item.title)}</a></h2>
<div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
${t}
${n}
${categories}
${tags}
</div>
</header>
<p>${this.escapeHtml(e.contents)}</p>
<p>${this.escapeHtml(item.contents)}</p>
</article>
`}).join("");this.resultsContainer.innerHTML=i}checkFieldsForMatch(e,t){const n={inTitle:!1,inDesc:!1,inSection:!1,inContents:!1};return DEFAULT_CONFIG.search.fields.title&&this.containsTerm(e.searchableTitle,t)&&(n.inTitle=!0),DEFAULT_CONFIG.search.fields.description&&this.containsTerm(e.searchableDesc,t)&&(n.inDesc=!0),DEFAULT_CONFIG.search.fields.section&&this.containsTerm(e.searchableSection,t)&&(n.inSection=!0),DEFAULT_CONFIG.search.fields.contents&&this.containsTerm(e.searchableContents,t)&&(n.inContents=!0),!!(n.inTitle||n.inDesc||n.inSection||n.inContents)&&n}}const search=new FastSearch({searchInput:document.getElementById("search-input"),resultsContainer:document.getElementById("search-results"),json:`/index.json`})</script></div><aside aria-label="Scroll to Top"><button id=back-to-top type=button class="btn btn-lg btn-box-shadow">
<i class="fas fa-angle-up"></i></button></aside></div><div id=mask class="d-none position-fixed w-100 h-100 z-1"></div></body></html>
`;
}).join('');
this.resultsContainer.innerHTML = searchItems;
}
checkFieldsForMatch(item, term) {
const matches = {
inTitle: false,
inDesc: false,
inSection: false,
inContents: false
};
if (DEFAULT_CONFIG.search.fields.title && this.containsTerm(item.searchableTitle, term)) {
matches.inTitle = true;
}
if (DEFAULT_CONFIG.search.fields.description && this.containsTerm(item.searchableDesc, term)) {
matches.inDesc = true;
}
if (DEFAULT_CONFIG.search.fields.section && this.containsTerm(item.searchableSection, term)) {
matches.inSection = true;
}
if (DEFAULT_CONFIG.search.fields.contents && this.containsTerm(item.searchableContents, term)) {
matches.inContents = true;
}
if (matches.inTitle || matches.inDesc || matches.inSection || matches.inContents) {
return matches;
}
return false;
}
}
const search = new FastSearch({
searchInput: document.getElementById('search-input'),
resultsContainer: document.getElementById('search-results'),
json: `\/index.json`
});
</script>
</div>
<aside aria-label="Scroll to Top">
<button id="back-to-top" type="button" class="btn btn-lg btn-box-shadow">
<i class="fas fa-angle-up"></i>
</button>
</aside>
</div>
<div id="mask" class="d-none position-fixed w-100 h-100 z-1"></div>
</body>
</html>

View File

@ -1,8 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Gitea on Comprofix</title><link>https://comprofix.com/categories/gitea/</link><description>Recent content in Gitea on Comprofix</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sat, 06 Sep 2025 13:28:05 +1000</lastBuildDate><atom:link href="https://comprofix.com/categories/gitea/index.xml" rel="self" type="application/rss+xml"/><item><title>Continuous Integration &amp; Continuous Deployment</title><link>https://comprofix.com/post/2024-09-21-websitedeployment/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/post/2024-09-21-websitedeployment/</guid><description>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href="https://docs.gitea.com/usage/actions/overview"&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.&lt;/p&gt;
&lt;h3 id="why-use-cicd" id=why-use-cicd&gt;
&lt;span class="me-2"&gt;Why use CI/CD?&lt;/span&gt;
&lt;a href="#why-use-cicd" class="anchor text-muted"&gt;&lt;i class="fas fa-hashtag"&gt;&lt;/i&gt;&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.&lt;/p&gt;</description></item></channel></rss>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Gitea on Comprofix</title>
<link>http://localhost:1313/categories/gitea/</link>
<description>Recent content in Gitea on Comprofix</description>
<generator>Hugo</generator>
<language>en</language>
<lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
<atom:link href="http://localhost:1313/categories/gitea/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Continuous Integration &amp; Continuous Deployment</title>
<link>http://localhost:1313/post/2024-09-21-websitedeployment/</link>
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
<guid>http://localhost:1313/post/2024-09-21-websitedeployment/</guid>
<description>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href=&#34;https://docs.gitea.com/usage/actions/overview&#34;&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href=&#34;https://github.com/features/actions&#34;&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.&lt;/p&gt;&#xA;&lt;h3 id=&#34;why-use-cicd&#34; id=why-use-cicd&gt;&#xA; &#xA; &lt;span class=&#34;me-2&#34;&gt;Why use CI/CD?&lt;/span&gt;&#xA; &lt;a href=&#34;#why-use-cicd&#34; class=&#34;anchor text-muted&#34;&gt;&lt;i class=&#34;fas fa-hashtag&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA; &#xA;&lt;/h3&gt;&lt;p&gt;It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.&lt;/p&gt;</description>
</item>
</channel>
</rss>

View File

@ -1,56 +1,908 @@
<!doctype html><head><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css></head><html lang=en><head><meta charset=utf-8><meta name=theme-color media="(prefers-color-scheme: light)" content="#f7f7f7"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#1b1b1e"><meta name=mobile-web-app-capable content="yes"><meta name=apple-mobile-web-app-status-bar-style content="black-translucent"><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,shrink-to-fit=no,viewport-fit=cover"><meta property="og:url" content="https://comprofix.com/categories/homelab/"><meta property="og:site_name" content="Comprofix"><meta property="og:title" content="Homelab"><meta property="og:locale" content="en"><meta property="og:type" content="website"><meta name=twitter:card content="summary"><meta name=twitter:title content="Homelab"><meta itemprop=name content="Homelab"><meta itemprop=datePublished content="2024-09-21T00:00:00+00:00"><meta itemprop=dateModified content="2025-09-06T13:28:05+10:00"><title>Homelab |
Comprofix</title><link rel=apple-touch-icon sizes=180x180 href=/img/favicons/apple-touch-icon.png><link rel=icon type=image/png sizes=32x32 href=/img/favicons/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=/img/favicons/favicon-16x16.png><link rel="shortcut icon" href=/img/favicons/favicon.ico><meta name=apple-mobile-web-app-title content="Comprofix"><meta name=application-name content="Comprofix"><meta name=msapplication-TileColor content="#da532c"><meta name=msapplication-config content="/img/favicons/browserconfig.xml"><meta name=theme-color content="#ffffff"><link rel=preconnect href=https://fonts.googleapis.com><link rel=dns-prefetch href=https://fonts.googleapis.com><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=dns-prefetch href=https://fonts.gstatic.com><link rel=preconnect href=https://cdn.jsdelivr.net><link rel=dns-prefetch href=https://cdn.jsdelivr.net><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css><link rel=stylesheet href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&amp;family=Source+Sans+Pro:wght@400;600;700;900&amp;display=swap"><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css><script src=/js/modules/theme.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js></script><script defer src=/js/misc.js></script></head><body><aside aria-label=Sidebar id=sidebar class="d-flex flex-column align-items-end"><header class=profile-wrapper><a href=/ id=avatar class=rounded-circle><img src=/img/man-logo.png width=112 height=112 alt=avatar onerror='this.style.display="none"'></a>
<a class="site-title d-block" href=/>Comprofix</a><p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p></header><nav class="flex-column flex-grow-1 w-100 ps-0"><ul class=nav><li class=nav-item><a href=/ class=nav-link><i class="fa-fw fas fa-house"></i>
<span>HOME</span></a></li><li class=nav-item><a href=/categories/ class=nav-link><i class="fa-fw fas fa-stream"></i>
<span>CATEGORIES</span></a></li><li class=nav-item><a href=/tags/ class=nav-link><i class="fa-fw fas fa-tags"></i>
<span>TAGS</span></a></li><li class=nav-item><a href=/archives/ class=nav-link><i class="fa-fw fas fa-archive"></i>
<span>ARCHIVES</span></a></li><li class=nav-item><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i>
<span>ABOUT</span></a></li></ul></nav><div class="sidebar-bottom d-flex flex-wrap align-items-center w-100"><button type=button class="btn btn-link nav-link" aria-label="Switch Mode" id=mode-toggle>
<i class="fas fa-adjust"></i>
</button>
<span class=icon-border></span>
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i>
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i>
</a><a href=https://comprofix.com/index.xml aria-label=rss><i class="fas fa-rss"></i></a></div></aside><div id=main-wrapper class="d-flex justify-content-center"><div class="container d-flex flex-column px-xxl-5"><header id=topbar-wrapper class=flex-shrink-0 aria-label="Top Bar"><div id=topbar class="d-flex align-items-center justify-content-between px-lg-3 h-100"><nav id=breadcrumb aria-label=Breadcrumb><span><a href=/>Home</a>
</span><span><a href=https://comprofix.com/categories/>Categories</a></span>
<span>homelab</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar>
<i class="fas fa-bars fa-fw"></i></button><div id=topbar-title></div><button type=button id=search-trigger class="btn btn-link" aria-label=Search>
<i class="fas fa-search fa-fw"></i>
</button>
<search id=search class="align-items-center ms-3 ms-lg-0"><i class="fas fa-search fa-fw"></i>
<input class=form-control id=search-input type=search aria-label=search autocomplete=off placeholder=Search...>
</search><button type=button class="btn btn-link text-decoration-none" id=search-cancel>Cancel</button></div></header><div class="row flex-grow-1"><main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4"><div id=page-category><h1 class=ps-lg-2><i class="far fa-folder-open fa-fw text-muted"></i>
Homelab
<span class="lead text-muted ps-2">2</span></h1><ul class="content ps-0"><li class="d-flex justify-content-between px-md-3"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a>
<span class="dash flex-grow-1"></span>
<span class="text-muted small text-nowrap">Sep 21, 2024</span></li><li class="d-flex justify-content-between px-md-3"><a href=/post/2024-09-05-resetrestart/>Reset and Restart</a>
<span class="dash flex-grow-1"></span>
<span class="text-muted small text-nowrap">Sep 5, 2024</span></li></ul></div></main><aside aria-label=Panel id=panel-wrapper class="col-xl-3 ps-2 text-muted"><div class=access><section id=access-lastmod><h2 class=panel-heading>Recently Updated</h2><ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2"><li class="text-truncate lh-lg"><a href=/post/2024-09-05-resetrestart/>Reset and Restart</a></li><li class="text-truncate lh-lg"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a></li></ul></section><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div></aside></div><div class=row><div id=tail-wrapper class="col-12 col-lg-11 col-xl-9 px-md-4"><footer aria-label="Site Info" class="d-flex flex-column justify-content-center text-muted
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>©
<time>2025</time>
<a href=https://comprofix.com>Comprofix</a>.
<span data-bs-toggle=tooltip data-bs-placement=top title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author.">Some rights reserved.</span></p><p>Using the <a data-bs-toggle=tooltip data-bs-placement=top title=v1.0.2 href=https://github.com/geekifan/hugo-theme-chirpy target=_blank rel=noopener>Chirpy</a> theme for <a href=https://gohugo.io/ target=_blank rel=noopener>Hugo</a>.</p></footer></div></div><div id=search-result-wrapper class="d-flex justify-content-center d-none"><div class="col-11 content"><div id=search-hints><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div><div id=search-results class="d-flex flex-wrap justify-content-center text-muted mt-3"></div></div></div><script>const DEFAULT_CONFIG={search:{minChars:1,maxResults:5,fields:{title:!0,description:!0,section:!0,contents:!0},strictMode:!0}};class FastSearch{constructor({searchInput:e,resultsContainer:t,json:n,searchResultTemplate:s=null,noResultsText:o=null}){this.searchInput=e,this.resultsContainer=t,this.json=n,this.searchResultTemplate=s,this.noResultsText=o,this.init()}init(){this.loadSearchIndex(),this.searchInput.addEventListener("input",e=>{if(!this.searchIndex){this.resultsContainer.innerHTML='<li class="search-message">Loading search index...</li>';return}this.performSearch(this.searchInput.value)})}async loadSearchIndex(){try{const e=await fetch(this.json);if(!e.ok)throw new Error("Failed to load search index");const t=await e.json();this.searchIndex=t.map(e=>({...e,searchableTitle:e.title?.toLowerCase()||"",searchableDesc:e.desc?.toLowerCase()||"",searchableSection:e.section?.toLowerCase()||"",searchableContents:e.contents?.toLowerCase()||""}))}catch(e){console.error("Error loading search index:",e),this.resultsContainer.innerHTML='<li class="search-message">Error loading search index...</li>'}}escapeHtml(e){return e?e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;"):""}containsTerm(e,t){return!!e&&!!t&&e.includes(t)}performSearch(e){if(e=e.toLowerCase().trim(),!e||!this.searchIndex||e.length<DEFAULT_CONFIG.search.minChars){this.resultsContainer.innerHTML="";return}const s=[e,...e.split(/\s+/).filter(e=>e.length>0)],t=[...new Set(s)],o=DEFAULT_CONFIG.search.strictMode,n=this.searchIndex.map(e=>{const s=this.checkFieldsForMatch(e,t[0]);if(o&&!s)return{item:e,score:0,matched:!1};let n=0,i=0,a=!1;t.forEach((t,s)=>{const r=s===0,o=this.checkFieldsForMatch(e,t);o&&(i++,o.inTitle&&(n+=r?10:5,a=!0),o.inDesc&&(n+=r?8:4),o.inSection&&(n+=r?6:3),o.inContents&&(n+=r?4:2))});const r=i/t.length,c=n*r*(a?1.5:1);return{item:e,score:c,matched:s}}).filter(e=>e.matched).sort((e,t)=>t.score-e.score).slice(0,DEFAULT_CONFIG.search.maxResults).map(e=>e.item);if(n.length===0){this.resultsContainer.innerHTML='<p class="mt-5">Oops! No results found.</p>';return}const i=n.map(e=>{let t="",n="";return e.categories&&(t=e.categories.join(", "),t=`<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${t}</div>`),e.tags&&(n=e.tags.join(", "),n=`<div><i class="fa fa-tag fa-fw"></i>${n}</div>`),`
<!doctype html>
<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
</head>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta
name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
>
<meta property="og:url" content="http://localhost:1313/categories/homelab/">
<meta property="og:site_name" content="Comprofix">
<meta property="og:title" content="Homelab">
<meta property="og:locale" content="en">
<meta property="og:type" content="website">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Homelab">
<meta itemprop="name" content="Homelab">
<meta itemprop="datePublished" content="2024-09-21T00:00:00+00:00">
<meta itemprop="dateModified" content="2024-09-21T00:00:00+00:00">
<title>
Homelab |
Comprofix
</title>
<link rel="apple-touch-icon" sizes="180x180" href="/img/favicons/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicons/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicons/favicon-16x16.png">
<link rel="shortcut icon" href="/img/favicons/favicon.ico">
<meta name="apple-mobile-web-app-title" content="Comprofix">
<meta name="application-name" content="Comprofix">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="msapplication-config" content="/img/favicons/browserconfig.xml">
<meta name="theme-color" content="#ffffff">
<link rel="preconnect" href="https://fonts.googleapis.com" >
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="dns-prefetch" href="https://fonts.gstatic.com" >
<link rel="preconnect" href="https://cdn.jsdelivr.net" >
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" >
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&amp;family=Source&#43;Sans&#43;Pro:wght@400;600;700;900&amp;display=swap">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css">
<script src="/js/modules/theme.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js"></script>
<script defer src="/js/misc.js"></script>
</head>
<body>
<aside aria-label="Sidebar" id="sidebar" class="d-flex flex-column align-items-end">
<header class="profile-wrapper">
<a href="/" id="avatar" class="rounded-circle"><img src="/img/man-logo.png" width="112" height="112" alt="avatar" onerror="this.style.display='none'"></a>
<a class="site-title d-block" href="/">Comprofix</a>
<p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p>
</header>
<nav class="flex-column flex-grow-1 w-100 ps-0">
<ul class="nav">
<li class="nav-item">
<a href="/" class="nav-link">
<i class="fa-fw fas fa-house"></i>
<span>HOME</span>
</a>
</li>
<li class="nav-item">
<a href="/categories/" class="nav-link">
<i class="fa-fw fas fa-stream"></i>
<span>CATEGORIES</span>
</a>
</li>
<li class="nav-item">
<a href="/tags/" class="nav-link">
<i class="fa-fw fas fa-tags"></i>
<span>TAGS</span>
</a>
</li>
<li class="nav-item">
<a href="/archives/" class="nav-link">
<i class="fa-fw fas fa-archive"></i>
<span>ARCHIVES</span>
</a>
</li>
<li class="nav-item">
<a href="/about/" class="nav-link">
<i class="fa-fw fas fa-info-circle"></i>
<span>ABOUT</span>
</a>
</li>
</ul>
</nav>
<div class="sidebar-bottom d-flex flex-wrap align-items-center w-100">
<button type="button" class="btn btn-link nav-link" aria-label="Switch Mode" id="mode-toggle">
<i class="fas fa-adjust"></i>
</button>
<span class="icon-border"></span>
<a
href="https://git.comprofix.com/mmckinnon"
aria-label="custom"
target="_blank" rel="noopener noreferrer"
>
<i class="fab fa-git-alt"></i>
</a>
<a
href="https://twitter.com/mckinnon81"
aria-label="twitter"
target="_blank" rel="noopener noreferrer"
>
<i class="fab fa-twitter"></i>
</a>
<a
href="http://localhost:1313/index.xml"
aria-label="rss"
>
<i class="fas fa-rss"></i>
</a>
</div>
</aside>
<div id="main-wrapper" class="d-flex justify-content-center">
<div class="container d-flex flex-column px-xxl-5">
<header id="topbar-wrapper" class="flex-shrink-0" aria-label="Top Bar">
<div id="topbar" class="d-flex align-items-center justify-content-between px-lg-3 h-100">
<nav id="breadcrumb" aria-label="Breadcrumb">
<span>
<a href="/">Home</a>
</span>
<span><a href="http://localhost:1313/categories/">Categories</a></span>
<span>homelab</span>
</nav>
<button type="button" id="sidebar-trigger" class="btn btn-link" aria-label="Sidebar">
<i class="fas fa-bars fa-fw"></i>
</button>
<div id="topbar-title">
</div>
<button type="button" id="search-trigger" class="btn btn-link" aria-label="Search">
<i class="fas fa-search fa-fw"></i>
</button>
<search id="search" class="align-items-center ms-3 ms-lg-0">
<i class="fas fa-search fa-fw"></i>
<input
class="form-control"
id="search-input"
type="search"
aria-label="search"
autocomplete="off"
placeholder="Search..."
>
</search>
<button type="button" class="btn btn-link text-decoration-none" id="search-cancel">Cancel</button>
</div>
</header>
<div class="row flex-grow-1">
<main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4">
<div id="page-category">
<h1 class="ps-lg-2">
<i class="far fa-folder-open fa-fw text-muted"></i>
Homelab
<span class="lead text-muted ps-2">2</span>
</h1>
<ul class="content ps-0">
<li class="d-flex justify-content-between px-md-3">
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration &amp; Continuous Deployment</a>
<span class="dash flex-grow-1"></span>
<span class="text-muted small text-nowrap">Sep 21, 2024</span>
</li>
<li class="d-flex justify-content-between px-md-3">
<a href="/post/2024-09-05-resetrestart/">Reset and Restart</a>
<span class="dash flex-grow-1"></span>
<span class="text-muted small text-nowrap">Sep 5, 2024</span>
</li>
</ul>
</div>
</main>
<aside aria-label="Panel" id="panel-wrapper" class="col-xl-3 ps-2 text-muted">
<div class="access">
<section id="access-lastmod">
<h2 class="panel-heading">Recently Updated</h2>
<ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2">
<li class="text-truncate lh-lg">
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration &amp; Continuous Deployment</a>
</li>
<li class="text-truncate lh-lg">
<a href="/post/2024-09-05-resetrestart/">Reset and Restart</a>
</li>
</ul>
</section>
<section>
<h2 class="panel-heading">Trending Tags</h2>
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
</div>
</section>
</div>
</aside>
</div>
<div class="row">
<div id="tail-wrapper" class="col-12 col-lg-11 col-xl-9 px-md-4">
<footer
aria-label="Site Info"
class="
d-flex flex-column justify-content-center text-muted
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
"
>
<p>
©
<time>2025</time>
<a href="https://comprofix.com">Comprofix</a>.
<span
data-bs-toggle="tooltip"
data-bs-placement="top"
title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author."
>Some rights reserved.</span>
</p>
<p>Using the <a
data-bs-toggle="tooltip"
data-bs-placement="top"
title="v1.0.2"
href="https://github.com/geekifan/hugo-theme-chirpy"
target="_blank"
rel="noopener"
>Chirpy</a> theme for <a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a>.
</p>
</footer>
</div>
</div>
<div id="search-result-wrapper" class="d-flex justify-content-center d-none">
<div class="col-11 content">
<div id="search-hints">
<section>
<h2 class="panel-heading">Trending Tags</h2>
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
</div>
</section>
</div>
<div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
</div>
</div>
<script>
const DEFAULT_CONFIG = {
search: {
minChars: 1,
maxResults: 5,
fields: {
title: true,
description: true,
section: true,
contents: true
},
strictMode: true
}
};
class FastSearch {
constructor({
searchInput, resultsContainer, json,
searchResultTemplate = null,
noResultsText = null,
}) {
this.searchInput = searchInput;
this.resultsContainer = resultsContainer;
this.json = json;
this.searchResultTemplate = searchResultTemplate;
this.noResultsText = noResultsText;
this.init();
}
init() {
this.loadSearchIndex();
this.searchInput.addEventListener('input', (event) => {
if (!this.searchIndex) {
this.resultsContainer.innerHTML = '<li class="search-message">Loading search index...</li>';
return;
}
this.performSearch(this.searchInput.value);
});
}
async loadSearchIndex() {
try {
const response = await fetch(this.json);
if (!response.ok) throw new Error('Failed to load search index');
const data = await response.json();
this.searchIndex = data.map(item => ({
...item,
searchableTitle: item.title?.toLowerCase() || '',
searchableDesc: item.desc?.toLowerCase() || '',
searchableSection: item.section?.toLowerCase() || '',
searchableContents: item.contents?.toLowerCase() || ''
}));
} catch (error) {
console.error('Error loading search index:', error);
this.resultsContainer.innerHTML = '<li class="search-message">Error loading search index...</li>';
}
}
escapeHtml(unsafe) {
if (!unsafe) return '';
return unsafe
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}
containsTerm(text, term) {
if (!text || !term) return false;
return text.includes(term);
}
performSearch(query) {
query = query.toLowerCase().trim();
if (!query || !this.searchIndex || query.length < DEFAULT_CONFIG.search.minChars) {
this.resultsContainer.innerHTML = '';
return;
}
const searchTerms = [
query,
...query.split(/\s+/).filter(term => term.length > 0)
];
const uniqueTerms = [...new Set(searchTerms)];
const requireFullQueryMatch = DEFAULT_CONFIG.search.strictMode;
const results = this.searchIndex
.map(item => {
const fullQueryMatched = this.checkFieldsForMatch(item, uniqueTerms[0]);
if (requireFullQueryMatch && !fullQueryMatched) {
return { item, score: 0, matched: false };
}
let score = 0;
let matchedTermsCount = 0;
let matchedInTitle = false;
uniqueTerms.forEach((term, index) => {
const isFullQuery = index === 0;
const matched = this.checkFieldsForMatch(item, term);
if (matched) {
matchedTermsCount++;
if (matched.inTitle) {
score += isFullQuery ? 10 : 5;
matchedInTitle = true;
}
if (matched.inDesc) {
score += isFullQuery ? 8 : 4;
}
if (matched.inSection) {
score += isFullQuery ? 6 : 3;
}
if (matched.inContents) {
score += isFullQuery ? 4 : 2;
}
}
});
const matchRatio = matchedTermsCount / uniqueTerms.length;
const finalScore = score * matchRatio * (matchedInTitle ? 1.5 : 1);
return {
item,
score: finalScore,
matched: fullQueryMatched
};
})
.filter(result => result.matched)
.sort((a, b) => b.score - a.score)
.slice(0, DEFAULT_CONFIG.search.maxResults)
.map(result => result.item);
if (results.length === 0) {
this.resultsContainer.innerHTML = '<p class="mt-5">Oops! No results found.</p>';
return;
}
const searchItems = results.map((item) => {
let categories = '';
let tags = '';
if (item.categories) {
categories = item.categories.join(', ');
categories = `<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${categories}</div>`;
}
if (item.tags) {
tags = item.tags.join(', ');
tags = `<div><i class="fa fa-tag fa-fw"></i>${tags}</div>`
}
return `
<article class="px-1 px-sm-2 px-lg-4 px-xl-0">
<header>
<h2><a href="${this.escapeHtml(e.permalink)}">${this.escapeHtml(e.title)}</a></h2>
<h2><a href="${this.escapeHtml(item.permalink)}">${this.escapeHtml(item.title)}</a></h2>
<div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
${t}
${n}
${categories}
${tags}
</div>
</header>
<p>${this.escapeHtml(e.contents)}</p>
<p>${this.escapeHtml(item.contents)}</p>
</article>
`}).join("");this.resultsContainer.innerHTML=i}checkFieldsForMatch(e,t){const n={inTitle:!1,inDesc:!1,inSection:!1,inContents:!1};return DEFAULT_CONFIG.search.fields.title&&this.containsTerm(e.searchableTitle,t)&&(n.inTitle=!0),DEFAULT_CONFIG.search.fields.description&&this.containsTerm(e.searchableDesc,t)&&(n.inDesc=!0),DEFAULT_CONFIG.search.fields.section&&this.containsTerm(e.searchableSection,t)&&(n.inSection=!0),DEFAULT_CONFIG.search.fields.contents&&this.containsTerm(e.searchableContents,t)&&(n.inContents=!0),!!(n.inTitle||n.inDesc||n.inSection||n.inContents)&&n}}const search=new FastSearch({searchInput:document.getElementById("search-input"),resultsContainer:document.getElementById("search-results"),json:`/index.json`})</script></div><aside aria-label="Scroll to Top"><button id=back-to-top type=button class="btn btn-lg btn-box-shadow">
<i class="fas fa-angle-up"></i></button></aside></div><div id=mask class="d-none position-fixed w-100 h-100 z-1"></div></body></html>
`;
}).join('');
this.resultsContainer.innerHTML = searchItems;
}
checkFieldsForMatch(item, term) {
const matches = {
inTitle: false,
inDesc: false,
inSection: false,
inContents: false
};
if (DEFAULT_CONFIG.search.fields.title && this.containsTerm(item.searchableTitle, term)) {
matches.inTitle = true;
}
if (DEFAULT_CONFIG.search.fields.description && this.containsTerm(item.searchableDesc, term)) {
matches.inDesc = true;
}
if (DEFAULT_CONFIG.search.fields.section && this.containsTerm(item.searchableSection, term)) {
matches.inSection = true;
}
if (DEFAULT_CONFIG.search.fields.contents && this.containsTerm(item.searchableContents, term)) {
matches.inContents = true;
}
if (matches.inTitle || matches.inDesc || matches.inSection || matches.inContents) {
return matches;
}
return false;
}
}
const search = new FastSearch({
searchInput: document.getElementById('search-input'),
resultsContainer: document.getElementById('search-results'),
json: `\/index.json`
});
</script>
</div>
<aside aria-label="Scroll to Top">
<button id="back-to-top" type="button" class="btn btn-lg btn-box-shadow">
<i class="fas fa-angle-up"></i>
</button>
</aside>
</div>
<div id="mask" class="d-none position-fixed w-100 h-100 z-1"></div>
</body>
</html>

View File

@ -1,10 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Homelab on Comprofix</title><link>https://comprofix.com/categories/homelab/</link><description>Recent content in Homelab on Comprofix</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sat, 06 Sep 2025 13:28:05 +1000</lastBuildDate><atom:link href="https://comprofix.com/categories/homelab/index.xml" rel="self" type="application/rss+xml"/><item><title>Continuous Integration &amp; Continuous Deployment</title><link>https://comprofix.com/post/2024-09-21-websitedeployment/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/post/2024-09-21-websitedeployment/</guid><description>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href="https://docs.gitea.com/usage/actions/overview"&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.&lt;/p&gt;
&lt;h3 id="why-use-cicd" id=why-use-cicd&gt;
&lt;span class="me-2"&gt;Why use CI/CD?&lt;/span&gt;
&lt;a href="#why-use-cicd" class="anchor text-muted"&gt;&lt;i class="fas fa-hashtag"&gt;&lt;/i&gt;&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.&lt;/p&gt;</description></item><item><title>Reset and Restart</title><link>https://comprofix.com/post/2024-09-05-resetrestart/</link><pubDate>Thu, 05 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/post/2024-09-05-resetrestart/</guid><description>&lt;p&gt;It&amp;rsquo;s time to reset the website and start building my blog again. I have had this domain for a number of years and it has always been used for my E-Mail.&lt;/p&gt;
&lt;p&gt;But the website has been more of a play ground for experimenting and testing.&lt;/p&gt;
&lt;p&gt;I am now hoping to get into the habit of writing more blog posts as I document my journey as I experiment with my HomeLab.&lt;/p&gt;</description></item></channel></rss>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Homelab on Comprofix</title>
<link>http://localhost:1313/categories/homelab/</link>
<description>Recent content in Homelab on Comprofix</description>
<generator>Hugo</generator>
<language>en</language>
<lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
<atom:link href="http://localhost:1313/categories/homelab/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Continuous Integration &amp; Continuous Deployment</title>
<link>http://localhost:1313/post/2024-09-21-websitedeployment/</link>
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
<guid>http://localhost:1313/post/2024-09-21-websitedeployment/</guid>
<description>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href=&#34;https://docs.gitea.com/usage/actions/overview&#34;&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href=&#34;https://github.com/features/actions&#34;&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.&lt;/p&gt;&#xA;&lt;h3 id=&#34;why-use-cicd&#34; id=why-use-cicd&gt;&#xA; &#xA; &lt;span class=&#34;me-2&#34;&gt;Why use CI/CD?&lt;/span&gt;&#xA; &lt;a href=&#34;#why-use-cicd&#34; class=&#34;anchor text-muted&#34;&gt;&lt;i class=&#34;fas fa-hashtag&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA; &#xA;&lt;/h3&gt;&lt;p&gt;It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.&lt;/p&gt;</description>
</item>
<item>
<title>Reset and Restart</title>
<link>http://localhost:1313/post/2024-09-05-resetrestart/</link>
<pubDate>Thu, 05 Sep 2024 00:00:00 +0000</pubDate>
<guid>http://localhost:1313/post/2024-09-05-resetrestart/</guid>
<description>&lt;p&gt;It&amp;rsquo;s time to reset the website and start building my blog again. I have had this domain for a number of years and it has always been used for my E-Mail.&lt;/p&gt;&#xA;&lt;p&gt;But the website has been more of a play ground for experimenting and testing.&lt;/p&gt;&#xA;&lt;p&gt;I am now hoping to get into the habit of writing more blog posts as I document my journey as I experiment with my HomeLab.&lt;/p&gt;</description>
</item>
</channel>
</rss>

File diff suppressed because it is too large Load Diff

View File

@ -1 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Categories on Comprofix</title><link>https://comprofix.com/categories/</link><description>Recent content in Categories on Comprofix</description><generator>Hugo</generator><language>en</language><atom:link href="https://comprofix.com/categories/index.xml" rel="self" type="application/rss+xml"/><item><title>Gitea</title><link>https://comprofix.com/categories/gitea/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/categories/gitea/</guid><description/></item><item><title>Homelab</title><link>https://comprofix.com/categories/homelab/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/categories/homelab/</guid><description/></item></channel></rss>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Categories on Comprofix</title>
<link>http://localhost:1313/categories/</link>
<description>Recent content in Categories on Comprofix</description>
<generator>Hugo</generator>
<language>en</language>
<lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
<atom:link href="http://localhost:1313/categories/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Gitea</title>
<link>http://localhost:1313/categories/gitea/</link>
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
<guid>http://localhost:1313/categories/gitea/</guid>
<description></description>
</item>
<item>
<title>Homelab</title>
<link>http://localhost:1313/categories/homelab/</link>
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
<guid>http://localhost:1313/categories/homelab/</guid>
<description></description>
</item>
</channel>
</rss>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 808 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -1,11 +1,40 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Comprofix</title><link>https://comprofix.com/</link><description>Recent content on Comprofix</description><generator>Hugo</generator><language>en</language><atom:link href="https://comprofix.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Continuous Integration &amp; Continuous Deployment</title><link>https://comprofix.com/post/2024-09-21-websitedeployment/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/post/2024-09-21-websitedeployment/</guid><description>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href="https://docs.gitea.com/usage/actions/overview"&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.&lt;/p&gt;
&lt;h3 id="why-use-cicd" id=why-use-cicd&gt;
&lt;span class="me-2"&gt;Why use CI/CD?&lt;/span&gt;
&lt;a href="#why-use-cicd" class="anchor text-muted"&gt;&lt;i class="fas fa-hashtag"&gt;&lt;/i&gt;&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.&lt;/p&gt;</description></item><item><title>Reset and Restart</title><link>https://comprofix.com/post/2024-09-05-resetrestart/</link><pubDate>Thu, 05 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/post/2024-09-05-resetrestart/</guid><description>&lt;p&gt;It&amp;rsquo;s time to reset the website and start building my blog again. I have had this domain for a number of years and it has always been used for my E-Mail.&lt;/p&gt;
&lt;p&gt;But the website has been more of a play ground for experimenting and testing.&lt;/p&gt;
&lt;p&gt;I am now hoping to get into the habit of writing more blog posts as I document my journey as I experiment with my HomeLab.&lt;/p&gt;</description></item><item><title>About</title><link>https://comprofix.com/about/</link><pubDate>Thu, 20 Apr 2023 00:00:00 +0000</pubDate><guid>https://comprofix.com/about/</guid><description>&lt;p&gt;&lt;a href="https://github.com/cotes2020/jekyll-theme-chirpy"&gt;Chirpy&lt;/a&gt; is a blog theme originally based on &lt;a href="https://jekyllrb.com/"&gt;Jekyll&lt;/a&gt;. Due to Jekyll&amp;rsquo;s design limitations, it does not natively support internationalization (i18n) and requires third-party plugins for i18n functionality. To enable i18n support for Chirpy without the hassle of relying on third-party plugins, the &lt;a href="https://github.com/geekifan/hugo-theme-chirpy"&gt;hugo-theme-chirpy&lt;/a&gt; project migrated the Chirpy theme to &lt;a href="https://gohugo.io/"&gt;Hugo&lt;/a&gt; with minimal adaptations. All features of Chirpy are available in hugo-theme-chirpy (though some functionalities may operate differently within the Hugo framework).&lt;/p&gt;
&lt;p&gt;Follow the posts in the demo site to quickly set up a free personal blog!&lt;/p&gt;</description></item><item><title>Archives</title><link>https://comprofix.com/archives/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://comprofix.com/archives/</guid><description/></item></channel></rss>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Comprofix</title>
<link>http://localhost:1313/</link>
<description>Recent content on Comprofix</description>
<generator>Hugo</generator>
<language>en</language>
<lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
<atom:link href="http://localhost:1313/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Continuous Integration &amp; Continuous Deployment</title>
<link>http://localhost:1313/post/2024-09-21-websitedeployment/</link>
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
<guid>http://localhost:1313/post/2024-09-21-websitedeployment/</guid>
<description>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href=&#34;https://docs.gitea.com/usage/actions/overview&#34;&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href=&#34;https://github.com/features/actions&#34;&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.&lt;/p&gt;&#xA;&lt;h3 id=&#34;why-use-cicd&#34; id=why-use-cicd&gt;&#xA; &#xA; &lt;span class=&#34;me-2&#34;&gt;Why use CI/CD?&lt;/span&gt;&#xA; &lt;a href=&#34;#why-use-cicd&#34; class=&#34;anchor text-muted&#34;&gt;&lt;i class=&#34;fas fa-hashtag&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA; &#xA;&lt;/h3&gt;&lt;p&gt;It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.&lt;/p&gt;</description>
</item>
<item>
<title>Reset and Restart</title>
<link>http://localhost:1313/post/2024-09-05-resetrestart/</link>
<pubDate>Thu, 05 Sep 2024 00:00:00 +0000</pubDate>
<guid>http://localhost:1313/post/2024-09-05-resetrestart/</guid>
<description>&lt;p&gt;It&amp;rsquo;s time to reset the website and start building my blog again. I have had this domain for a number of years and it has always been used for my E-Mail.&lt;/p&gt;&#xA;&lt;p&gt;But the website has been more of a play ground for experimenting and testing.&lt;/p&gt;&#xA;&lt;p&gt;I am now hoping to get into the habit of writing more blog posts as I document my journey as I experiment with my HomeLab.&lt;/p&gt;</description>
</item>
<item>
<title>About</title>
<link>http://localhost:1313/about/</link>
<pubDate>Thu, 20 Apr 2023 00:00:00 +0000</pubDate>
<guid>http://localhost:1313/about/</guid>
<description>&lt;p&gt;&lt;a href=&#34;https://github.com/cotes2020/jekyll-theme-chirpy&#34;&gt;Chirpy&lt;/a&gt; is a blog theme originally based on &lt;a href=&#34;https://jekyllrb.com/&#34;&gt;Jekyll&lt;/a&gt;. Due to Jekyll&amp;rsquo;s design limitations, it does not natively support internationalization (i18n) and requires third-party plugins for i18n functionality. To enable i18n support for Chirpy without the hassle of relying on third-party plugins, the &lt;a href=&#34;https://github.com/geekifan/hugo-theme-chirpy&#34;&gt;hugo-theme-chirpy&lt;/a&gt; project migrated the Chirpy theme to &lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt; with minimal adaptations. All features of Chirpy are available in hugo-theme-chirpy (though some functionalities may operate differently within the Hugo framework).&lt;/p&gt;&#xA;&lt;p&gt;Follow the posts in the demo site to quickly set up a free personal blog!&lt;/p&gt;</description>
</item>
<item>
<title>Archives</title>
<link>http://localhost:1313/archives/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>http://localhost:1313/archives/</guid>
<description></description>
</item>
</channel>
</rss>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1,128 @@
(()=>{var L=Object.defineProperty;var w=i=>{throw TypeError(i)};var k=(i,s,a)=>s in i?L(i,s,{enumerable:!0,configurable:!0,writable:!0,value:a}):i[s]=a;var M=(i,s,a)=>k(i,typeof s!="symbol"?s+"":s,a),b=(i,s,a)=>s.has(i)||w("Cannot "+a);var e=(i,s,a)=>(b(i,s,"read from private field"),a?a.call(i):s.get(i)),o=(i,s,a)=>s.has(i)?w("Cannot add the same private member more than once"):s instanceof WeakSet?s.add(i):s.set(i,a);var r=(i,s,a)=>(b(i,s,"access private method"),a);var c,n,m,t,d,K,l,g,A,D,I,f,h=class h{static get DARK(){return"dark"}static get LIGHT(){return"light"}static get ID(){return"theme-mode"}static get visualState(){return e(this,t,l)?e(this,t,d):e(this,t,g)?this.DARK:this.LIGHT}static getThemeMapper(s,a){return{[this.LIGHT]:s,[this.DARK]:a}}static init(){this.switchable&&(e(this,m).addEventListener("change",()=>{let s=e(this,t,d);r(this,t,I).call(this),s!==this.visualState&&r(this,t,f).call(this)}),e(this,t,l)&&(e(this,t,K)?r(this,t,A).call(this):r(this,t,D).call(this)))}static flip(){e(this,t,l)?r(this,t,I).call(this):e(this,t,g)?r(this,t,D).call(this):r(this,t,A).call(this),r(this,t,f).call(this)}};c=new WeakMap,n=new WeakMap,m=new WeakMap,t=new WeakSet,d=function(){return sessionStorage.getItem(e(this,c))||document.documentElement.getAttribute(e(this,n))},K=function(){return e(this,t,d)===this.DARK},l=function(){return e(this,t,d)!==null},g=function(){return e(this,m).matches},A=function(){document.documentElement.setAttribute(e(this,n),this.DARK),sessionStorage.setItem(e(this,c),this.DARK)},D=function(){document.documentElement.setAttribute(e(this,n),this.LIGHT),sessionStorage.setItem(e(this,c),this.LIGHT)},I=function(){document.documentElement.removeAttribute(e(this,n)),sessionStorage.removeItem(e(this,c))},f=function(){window.postMessage({id:this.ID},"*")},o(h,t),o(h,c,"mode"),o(h,n,"data-mode"),o(h,m,window.matchMedia("(prefers-color-scheme: dark)")),M(h,"switchable",!document.documentElement.hasAttribute(e(h,n)));var u=h;u.init();var E=u;window.Theme=u;})();
(() => {
var __defProp = Object.defineProperty;
var __typeError = (msg) => {
throw TypeError(msg);
};
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
// <stdin>
var _modeKey, _modeAttr, _darkMedia, _Theme_static, mode_get, isDarkMode_get, hasMode_get, sysDark_get, setDark_fn, setLight_fn, clearMode_fn, notify_fn;
var _Theme = class _Theme {
static get DARK() {
return "dark";
}
static get LIGHT() {
return "light";
}
/**
* @returns {string} Theme mode identifier
*/
static get ID() {
return "theme-mode";
}
/**
* Gets the current visual state of the theme.
*
* @returns {string} The current visual state, either the mode if it exists,
* or the system dark mode state ('dark' or 'light').
*/
static get visualState() {
if (__privateGet(this, _Theme_static, hasMode_get)) {
return __privateGet(this, _Theme_static, mode_get);
} else {
return __privateGet(this, _Theme_static, sysDark_get) ? this.DARK : this.LIGHT;
}
}
/**
* Maps theme modes to provided values
* @param {string} light Value for light mode
* @param {string} dark Value for dark mode
* @returns {Object} Mapped values
*/
static getThemeMapper(light, dark) {
return {
[this.LIGHT]: light,
[this.DARK]: dark
};
}
/**
* Initializes the theme based on system preferences or stored mode
*/
static init() {
if (!this.switchable) {
return;
}
__privateGet(this, _darkMedia).addEventListener("change", () => {
const lastMode = __privateGet(this, _Theme_static, mode_get);
__privateMethod(this, _Theme_static, clearMode_fn).call(this);
if (lastMode !== this.visualState) {
__privateMethod(this, _Theme_static, notify_fn).call(this);
}
});
if (!__privateGet(this, _Theme_static, hasMode_get)) {
return;
}
if (__privateGet(this, _Theme_static, isDarkMode_get)) {
__privateMethod(this, _Theme_static, setDark_fn).call(this);
} else {
__privateMethod(this, _Theme_static, setLight_fn).call(this);
}
}
/**
* Flips the current theme mode
*/
static flip() {
if (__privateGet(this, _Theme_static, hasMode_get)) {
__privateMethod(this, _Theme_static, clearMode_fn).call(this);
} else {
__privateGet(this, _Theme_static, sysDark_get) ? __privateMethod(this, _Theme_static, setLight_fn).call(this) : __privateMethod(this, _Theme_static, setDark_fn).call(this);
}
__privateMethod(this, _Theme_static, notify_fn).call(this);
}
};
_modeKey = new WeakMap();
_modeAttr = new WeakMap();
_darkMedia = new WeakMap();
_Theme_static = new WeakSet();
mode_get = function() {
return sessionStorage.getItem(__privateGet(this, _modeKey)) || document.documentElement.getAttribute(__privateGet(this, _modeAttr));
};
isDarkMode_get = function() {
return __privateGet(this, _Theme_static, mode_get) === this.DARK;
};
hasMode_get = function() {
return __privateGet(this, _Theme_static, mode_get) !== null;
};
sysDark_get = function() {
return __privateGet(this, _darkMedia).matches;
};
setDark_fn = function() {
document.documentElement.setAttribute(__privateGet(this, _modeAttr), this.DARK);
sessionStorage.setItem(__privateGet(this, _modeKey), this.DARK);
};
setLight_fn = function() {
document.documentElement.setAttribute(__privateGet(this, _modeAttr), this.LIGHT);
sessionStorage.setItem(__privateGet(this, _modeKey), this.LIGHT);
};
clearMode_fn = function() {
document.documentElement.removeAttribute(__privateGet(this, _modeAttr));
sessionStorage.removeItem(__privateGet(this, _modeKey));
};
notify_fn = function() {
window.postMessage({ id: this.ID }, "*");
};
__privateAdd(_Theme, _Theme_static);
__privateAdd(_Theme, _modeKey, "mode");
__privateAdd(_Theme, _modeAttr, "data-mode");
__privateAdd(_Theme, _darkMedia, window.matchMedia("(prefers-color-scheme: dark)"));
__publicField(_Theme, "switchable", !document.documentElement.hasAttribute(__privateGet(_Theme, _modeAttr)));
var Theme = _Theme;
Theme.init();
var stdin_default = Theme;
window.Theme = Theme;
})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1,10 @@
<!doctype html><html lang=en><head><title>https://comprofix.com/</title><link rel=canonical href=https://comprofix.com/><meta name=robots content="noindex"><meta charset=utf-8><meta http-equiv=refresh content="0; url=https://comprofix.com/"></head></html>
<!DOCTYPE html>
<html lang="en">
<head>
<title>http://localhost:1313/</title>
<link rel="canonical" href="http://localhost:1313/">
<meta name="robots" content="noindex">
<meta charset="utf-8">
<meta http-equiv="refresh" content="0; url=http://localhost:1313/">
</head>
</html>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on Comprofix</title><link>https://comprofix.com/post/</link><description>Recent content in Posts on Comprofix</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sat, 06 Sep 2025 13:28:05 +1000</lastBuildDate><atom:link href="https://comprofix.com/post/index.xml" rel="self" type="application/rss+xml"/><item><title>Continuous Integration &amp; Continuous Deployment</title><link>https://comprofix.com/post/2024-09-21-websitedeployment/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/post/2024-09-21-websitedeployment/</guid><description>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href="https://docs.gitea.com/usage/actions/overview"&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.&lt;/p&gt;
&lt;h3 id="why-use-cicd" id=why-use-cicd&gt;
&lt;span class="me-2"&gt;Why use CI/CD?&lt;/span&gt;
&lt;a href="#why-use-cicd" class="anchor text-muted"&gt;&lt;i class="fas fa-hashtag"&gt;&lt;/i&gt;&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.&lt;/p&gt;</description></item><item><title>Reset and Restart</title><link>https://comprofix.com/post/2024-09-05-resetrestart/</link><pubDate>Thu, 05 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/post/2024-09-05-resetrestart/</guid><description>&lt;p&gt;It&amp;rsquo;s time to reset the website and start building my blog again. I have had this domain for a number of years and it has always been used for my E-Mail.&lt;/p&gt;
&lt;p&gt;But the website has been more of a play ground for experimenting and testing.&lt;/p&gt;
&lt;p&gt;I am now hoping to get into the habit of writing more blog posts as I document my journey as I experiment with my HomeLab.&lt;/p&gt;</description></item></channel></rss>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Posts on Comprofix</title>
<link>http://localhost:1313/post/</link>
<description>Recent content in Posts on Comprofix</description>
<generator>Hugo</generator>
<language>en</language>
<lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
<atom:link href="http://localhost:1313/post/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Continuous Integration &amp; Continuous Deployment</title>
<link>http://localhost:1313/post/2024-09-21-websitedeployment/</link>
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
<guid>http://localhost:1313/post/2024-09-21-websitedeployment/</guid>
<description>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href=&#34;https://docs.gitea.com/usage/actions/overview&#34;&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href=&#34;https://github.com/features/actions&#34;&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.&lt;/p&gt;&#xA;&lt;h3 id=&#34;why-use-cicd&#34; id=why-use-cicd&gt;&#xA; &#xA; &lt;span class=&#34;me-2&#34;&gt;Why use CI/CD?&lt;/span&gt;&#xA; &lt;a href=&#34;#why-use-cicd&#34; class=&#34;anchor text-muted&#34;&gt;&lt;i class=&#34;fas fa-hashtag&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA; &#xA;&lt;/h3&gt;&lt;p&gt;It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.&lt;/p&gt;</description>
</item>
<item>
<title>Reset and Restart</title>
<link>http://localhost:1313/post/2024-09-05-resetrestart/</link>
<pubDate>Thu, 05 Sep 2024 00:00:00 +0000</pubDate>
<guid>http://localhost:1313/post/2024-09-05-resetrestart/</guid>
<description>&lt;p&gt;It&amp;rsquo;s time to reset the website and start building my blog again. I have had this domain for a number of years and it has always been used for my E-Mail.&lt;/p&gt;&#xA;&lt;p&gt;But the website has been more of a play ground for experimenting and testing.&lt;/p&gt;&#xA;&lt;p&gt;I am now hoping to get into the habit of writing more blog posts as I document my journey as I experiment with my HomeLab.&lt;/p&gt;</description>
</item>
</channel>
</rss>

View File

@ -1 +1,55 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml"><url><loc>https://comprofix.com/tags/cd/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/tags/ci/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/tags/continuous-deployment/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/tags/continuous-integration/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/post/2024-09-21-websitedeployment/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/tags/docker/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/tags/git/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/categories/gitea/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/categories/homelab/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/tags/homelab/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/post/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/post/2024-09-05-resetrestart/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/about/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/archives/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/categories/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/tags/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url></urlset>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<url>
<loc>http://localhost:1313/</loc>
<lastmod>2024-09-21T00:00:00+00:00</lastmod>
</url><url>
<loc>http://localhost:1313/categories/</loc>
<lastmod>2024-09-21T00:00:00+00:00</lastmod>
</url><url>
<loc>http://localhost:1313/tags/cd/</loc>
<lastmod>2024-09-21T00:00:00+00:00</lastmod>
</url><url>
<loc>http://localhost:1313/tags/ci/</loc>
<lastmod>2024-09-21T00:00:00+00:00</lastmod>
</url><url>
<loc>http://localhost:1313/tags/continuous-deployment/</loc>
<lastmod>2024-09-21T00:00:00+00:00</lastmod>
</url><url>
<loc>http://localhost:1313/tags/continuous-integration/</loc>
<lastmod>2024-09-21T00:00:00+00:00</lastmod>
</url><url>
<loc>http://localhost:1313/post/2024-09-21-websitedeployment/</loc>
<lastmod>2024-09-21T00:00:00+00:00</lastmod>
</url><url>
<loc>http://localhost:1313/tags/docker/</loc>
<lastmod>2024-09-21T00:00:00+00:00</lastmod>
</url><url>
<loc>http://localhost:1313/tags/git/</loc>
<lastmod>2024-09-21T00:00:00+00:00</lastmod>
</url><url>
<loc>http://localhost:1313/categories/gitea/</loc>
<lastmod>2024-09-21T00:00:00+00:00</lastmod>
</url><url>
<loc>http://localhost:1313/categories/homelab/</loc>
<lastmod>2024-09-21T00:00:00+00:00</lastmod>
</url><url>
<loc>http://localhost:1313/tags/homelab/</loc>
<lastmod>2024-09-21T00:00:00+00:00</lastmod>
</url><url>
<loc>http://localhost:1313/post/</loc>
<lastmod>2024-09-21T00:00:00+00:00</lastmod>
</url><url>
<loc>http://localhost:1313/tags/</loc>
<lastmod>2024-09-21T00:00:00+00:00</lastmod>
</url><url>
<loc>http://localhost:1313/post/2024-09-05-resetrestart/</loc>
<lastmod>2024-09-05T00:00:00+00:00</lastmod>
</url><url>
<loc>http://localhost:1313/about/</loc>
<lastmod>2023-04-20T00:00:00+00:00</lastmod>
</url><url>
<loc>http://localhost:1313/archives/</loc>
</url>
</urlset>

View File

@ -1,54 +1,914 @@
<!doctype html><head><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css></head><html lang=en><head><meta charset=utf-8><meta name=theme-color media="(prefers-color-scheme: light)" content="#f7f7f7"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#1b1b1e"><meta name=mobile-web-app-capable content="yes"><meta name=apple-mobile-web-app-status-bar-style content="black-translucent"><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,shrink-to-fit=no,viewport-fit=cover"><meta property="og:url" content="https://comprofix.com/tags/cd/"><meta property="og:site_name" content="Comprofix"><meta property="og:title" content="Cd"><meta property="og:locale" content="en"><meta property="og:type" content="website"><meta name=twitter:card content="summary"><meta name=twitter:title content="Cd"><meta itemprop=name content="Cd"><meta itemprop=datePublished content="2024-09-21T00:00:00+00:00"><meta itemprop=dateModified content="2025-09-06T13:28:05+10:00"><title>Cd |
Comprofix</title><link rel=apple-touch-icon sizes=180x180 href=/img/favicons/apple-touch-icon.png><link rel=icon type=image/png sizes=32x32 href=/img/favicons/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=/img/favicons/favicon-16x16.png><link rel="shortcut icon" href=/img/favicons/favicon.ico><meta name=apple-mobile-web-app-title content="Comprofix"><meta name=application-name content="Comprofix"><meta name=msapplication-TileColor content="#da532c"><meta name=msapplication-config content="/img/favicons/browserconfig.xml"><meta name=theme-color content="#ffffff"><link rel=preconnect href=https://fonts.googleapis.com><link rel=dns-prefetch href=https://fonts.googleapis.com><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=dns-prefetch href=https://fonts.gstatic.com><link rel=preconnect href=https://cdn.jsdelivr.net><link rel=dns-prefetch href=https://cdn.jsdelivr.net><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css><link rel=stylesheet href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&amp;family=Source+Sans+Pro:wght@400;600;700;900&amp;display=swap"><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css><script src=/js/modules/theme.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js></script><script defer src=/js/misc.js></script></head><body><aside aria-label=Sidebar id=sidebar class="d-flex flex-column align-items-end"><header class=profile-wrapper><a href=/ id=avatar class=rounded-circle><img src=/img/man-logo.png width=112 height=112 alt=avatar onerror='this.style.display="none"'></a>
<a class="site-title d-block" href=/>Comprofix</a><p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p></header><nav class="flex-column flex-grow-1 w-100 ps-0"><ul class=nav><li class=nav-item><a href=/ class=nav-link><i class="fa-fw fas fa-house"></i>
<span>HOME</span></a></li><li class=nav-item><a href=/categories/ class=nav-link><i class="fa-fw fas fa-stream"></i>
<span>CATEGORIES</span></a></li><li class=nav-item><a href=/tags/ class=nav-link><i class="fa-fw fas fa-tags"></i>
<span>TAGS</span></a></li><li class=nav-item><a href=/archives/ class=nav-link><i class="fa-fw fas fa-archive"></i>
<span>ARCHIVES</span></a></li><li class=nav-item><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i>
<span>ABOUT</span></a></li></ul></nav><div class="sidebar-bottom d-flex flex-wrap align-items-center w-100"><button type=button class="btn btn-link nav-link" aria-label="Switch Mode" id=mode-toggle>
<i class="fas fa-adjust"></i>
</button>
<span class=icon-border></span>
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i>
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i>
</a><a href=https://comprofix.com/index.xml aria-label=rss><i class="fas fa-rss"></i></a></div></aside><div id=main-wrapper class="d-flex justify-content-center"><div class="container d-flex flex-column px-xxl-5"><header id=topbar-wrapper class=flex-shrink-0 aria-label="Top Bar"><div id=topbar class="d-flex align-items-center justify-content-between px-lg-3 h-100"><nav id=breadcrumb aria-label=Breadcrumb><span><a href=/>Home</a>
</span><span><a href=https://comprofix.com/tags/>Tags</a></span>
<span>cd</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar>
<i class="fas fa-bars fa-fw"></i></button><div id=topbar-title></div><button type=button id=search-trigger class="btn btn-link" aria-label=Search>
<i class="fas fa-search fa-fw"></i>
</button>
<search id=search class="align-items-center ms-3 ms-lg-0"><i class="fas fa-search fa-fw"></i>
<input class=form-control id=search-input type=search aria-label=search autocomplete=off placeholder=Search...>
</search><button type=button class="btn btn-link text-decoration-none" id=search-cancel>Cancel</button></div></header><div class="row flex-grow-1"><main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4"><div id=page-tag><h1 class=ps-lg-2><i class="fa fa-tag fa-fw text-muted"></i>
cd
<span class="lead text-muted ps-2">1</span></h1><ul class="content ps-0"><li class="d-flex justify-content-between px-md-3"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a>
<span class="dash flex-grow-1"></span>
<time class="text-muted small text-nowrap" data-ts=1726876800 data-df=ll>%b %e, %Y</time></li></ul></div></main><aside aria-label=Panel id=panel-wrapper class="col-xl-3 ps-2 text-muted"><div class=access><section id=access-lastmod><h2 class=panel-heading>Recently Updated</h2><ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2"><li class="text-truncate lh-lg"><a href=/post/2024-09-05-resetrestart/>Reset and Restart</a></li><li class="text-truncate lh-lg"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a></li></ul></section><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div></aside></div><div class=row><div id=tail-wrapper class="col-12 col-lg-11 col-xl-9 px-md-4"><footer aria-label="Site Info" class="d-flex flex-column justify-content-center text-muted
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>©
<time>2025</time>
<a href=https://comprofix.com>Comprofix</a>.
<span data-bs-toggle=tooltip data-bs-placement=top title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author.">Some rights reserved.</span></p><p>Using the <a data-bs-toggle=tooltip data-bs-placement=top title=v1.0.2 href=https://github.com/geekifan/hugo-theme-chirpy target=_blank rel=noopener>Chirpy</a> theme for <a href=https://gohugo.io/ target=_blank rel=noopener>Hugo</a>.</p></footer></div></div><div id=search-result-wrapper class="d-flex justify-content-center d-none"><div class="col-11 content"><div id=search-hints><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div><div id=search-results class="d-flex flex-wrap justify-content-center text-muted mt-3"></div></div></div><script>const DEFAULT_CONFIG={search:{minChars:1,maxResults:5,fields:{title:!0,description:!0,section:!0,contents:!0},strictMode:!0}};class FastSearch{constructor({searchInput:e,resultsContainer:t,json:n,searchResultTemplate:s=null,noResultsText:o=null}){this.searchInput=e,this.resultsContainer=t,this.json=n,this.searchResultTemplate=s,this.noResultsText=o,this.init()}init(){this.loadSearchIndex(),this.searchInput.addEventListener("input",e=>{if(!this.searchIndex){this.resultsContainer.innerHTML='<li class="search-message">Loading search index...</li>';return}this.performSearch(this.searchInput.value)})}async loadSearchIndex(){try{const e=await fetch(this.json);if(!e.ok)throw new Error("Failed to load search index");const t=await e.json();this.searchIndex=t.map(e=>({...e,searchableTitle:e.title?.toLowerCase()||"",searchableDesc:e.desc?.toLowerCase()||"",searchableSection:e.section?.toLowerCase()||"",searchableContents:e.contents?.toLowerCase()||""}))}catch(e){console.error("Error loading search index:",e),this.resultsContainer.innerHTML='<li class="search-message">Error loading search index...</li>'}}escapeHtml(e){return e?e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;"):""}containsTerm(e,t){return!!e&&!!t&&e.includes(t)}performSearch(e){if(e=e.toLowerCase().trim(),!e||!this.searchIndex||e.length<DEFAULT_CONFIG.search.minChars){this.resultsContainer.innerHTML="";return}const s=[e,...e.split(/\s+/).filter(e=>e.length>0)],t=[...new Set(s)],o=DEFAULT_CONFIG.search.strictMode,n=this.searchIndex.map(e=>{const s=this.checkFieldsForMatch(e,t[0]);if(o&&!s)return{item:e,score:0,matched:!1};let n=0,i=0,a=!1;t.forEach((t,s)=>{const r=s===0,o=this.checkFieldsForMatch(e,t);o&&(i++,o.inTitle&&(n+=r?10:5,a=!0),o.inDesc&&(n+=r?8:4),o.inSection&&(n+=r?6:3),o.inContents&&(n+=r?4:2))});const r=i/t.length,c=n*r*(a?1.5:1);return{item:e,score:c,matched:s}}).filter(e=>e.matched).sort((e,t)=>t.score-e.score).slice(0,DEFAULT_CONFIG.search.maxResults).map(e=>e.item);if(n.length===0){this.resultsContainer.innerHTML='<p class="mt-5">Oops! No results found.</p>';return}const i=n.map(e=>{let t="",n="";return e.categories&&(t=e.categories.join(", "),t=`<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${t}</div>`),e.tags&&(n=e.tags.join(", "),n=`<div><i class="fa fa-tag fa-fw"></i>${n}</div>`),`
<!doctype html>
<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
</head>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta
name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
>
<meta property="og:url" content="http://localhost:1313/tags/cd/">
<meta property="og:site_name" content="Comprofix">
<meta property="og:title" content="Cd">
<meta property="og:locale" content="en">
<meta property="og:type" content="website">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Cd">
<meta itemprop="name" content="Cd">
<meta itemprop="datePublished" content="2024-09-21T00:00:00+00:00">
<meta itemprop="dateModified" content="2024-09-21T00:00:00+00:00">
<title>
Cd |
Comprofix
</title>
<link rel="apple-touch-icon" sizes="180x180" href="/img/favicons/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicons/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicons/favicon-16x16.png">
<link rel="shortcut icon" href="/img/favicons/favicon.ico">
<meta name="apple-mobile-web-app-title" content="Comprofix">
<meta name="application-name" content="Comprofix">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="msapplication-config" content="/img/favicons/browserconfig.xml">
<meta name="theme-color" content="#ffffff">
<link rel="preconnect" href="https://fonts.googleapis.com" >
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="dns-prefetch" href="https://fonts.gstatic.com" >
<link rel="preconnect" href="https://cdn.jsdelivr.net" >
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" >
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&amp;family=Source&#43;Sans&#43;Pro:wght@400;600;700;900&amp;display=swap">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css">
<script src="/js/modules/theme.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js"></script>
<script defer src="/js/misc.js"></script>
</head>
<body>
<aside aria-label="Sidebar" id="sidebar" class="d-flex flex-column align-items-end">
<header class="profile-wrapper">
<a href="/" id="avatar" class="rounded-circle"><img src="/img/man-logo.png" width="112" height="112" alt="avatar" onerror="this.style.display='none'"></a>
<a class="site-title d-block" href="/">Comprofix</a>
<p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p>
</header>
<nav class="flex-column flex-grow-1 w-100 ps-0">
<ul class="nav">
<li class="nav-item">
<a href="/" class="nav-link">
<i class="fa-fw fas fa-house"></i>
<span>HOME</span>
</a>
</li>
<li class="nav-item">
<a href="/categories/" class="nav-link">
<i class="fa-fw fas fa-stream"></i>
<span>CATEGORIES</span>
</a>
</li>
<li class="nav-item">
<a href="/tags/" class="nav-link">
<i class="fa-fw fas fa-tags"></i>
<span>TAGS</span>
</a>
</li>
<li class="nav-item">
<a href="/archives/" class="nav-link">
<i class="fa-fw fas fa-archive"></i>
<span>ARCHIVES</span>
</a>
</li>
<li class="nav-item">
<a href="/about/" class="nav-link">
<i class="fa-fw fas fa-info-circle"></i>
<span>ABOUT</span>
</a>
</li>
</ul>
</nav>
<div class="sidebar-bottom d-flex flex-wrap align-items-center w-100">
<button type="button" class="btn btn-link nav-link" aria-label="Switch Mode" id="mode-toggle">
<i class="fas fa-adjust"></i>
</button>
<span class="icon-border"></span>
<a
href="https://git.comprofix.com/mmckinnon"
aria-label="custom"
target="_blank" rel="noopener noreferrer"
>
<i class="fab fa-git-alt"></i>
</a>
<a
href="https://twitter.com/mckinnon81"
aria-label="twitter"
target="_blank" rel="noopener noreferrer"
>
<i class="fab fa-twitter"></i>
</a>
<a
href="http://localhost:1313/index.xml"
aria-label="rss"
>
<i class="fas fa-rss"></i>
</a>
</div>
</aside>
<div id="main-wrapper" class="d-flex justify-content-center">
<div class="container d-flex flex-column px-xxl-5">
<header id="topbar-wrapper" class="flex-shrink-0" aria-label="Top Bar">
<div id="topbar" class="d-flex align-items-center justify-content-between px-lg-3 h-100">
<nav id="breadcrumb" aria-label="Breadcrumb">
<span>
<a href="/">Home</a>
</span>
<span><a href="http://localhost:1313/tags/">Tags</a></span>
<span>cd</span>
</nav>
<button type="button" id="sidebar-trigger" class="btn btn-link" aria-label="Sidebar">
<i class="fas fa-bars fa-fw"></i>
</button>
<div id="topbar-title">
</div>
<button type="button" id="search-trigger" class="btn btn-link" aria-label="Search">
<i class="fas fa-search fa-fw"></i>
</button>
<search id="search" class="align-items-center ms-3 ms-lg-0">
<i class="fas fa-search fa-fw"></i>
<input
class="form-control"
id="search-input"
type="search"
aria-label="search"
autocomplete="off"
placeholder="Search..."
>
</search>
<button type="button" class="btn btn-link text-decoration-none" id="search-cancel">Cancel</button>
</div>
</header>
<div class="row flex-grow-1">
<main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4">
<div id="page-tag">
<h1 class="ps-lg-2">
<i class="fa fa-tag fa-fw text-muted"></i>
cd
<span class="lead text-muted ps-2">1</span>
</h1>
<ul class="content ps-0">
<li class="d-flex justify-content-between px-md-3">
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration &amp; Continuous Deployment</a>
<span class="dash flex-grow-1"></span>
<time
class="text-muted small text-nowrap"
data-ts="1726876800"
data-df="ll"
>
%b %e, %Y
</time>
</li>
</ul>
</div>
</main>
<aside aria-label="Panel" id="panel-wrapper" class="col-xl-3 ps-2 text-muted">
<div class="access">
<section id="access-lastmod">
<h2 class="panel-heading">Recently Updated</h2>
<ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2">
<li class="text-truncate lh-lg">
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration &amp; Continuous Deployment</a>
</li>
<li class="text-truncate lh-lg">
<a href="/post/2024-09-05-resetrestart/">Reset and Restart</a>
</li>
</ul>
</section>
<section>
<h2 class="panel-heading">Trending Tags</h2>
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
</div>
</section>
</div>
</aside>
</div>
<div class="row">
<div id="tail-wrapper" class="col-12 col-lg-11 col-xl-9 px-md-4">
<footer
aria-label="Site Info"
class="
d-flex flex-column justify-content-center text-muted
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
"
>
<p>
©
<time>2025</time>
<a href="https://comprofix.com">Comprofix</a>.
<span
data-bs-toggle="tooltip"
data-bs-placement="top"
title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author."
>Some rights reserved.</span>
</p>
<p>Using the <a
data-bs-toggle="tooltip"
data-bs-placement="top"
title="v1.0.2"
href="https://github.com/geekifan/hugo-theme-chirpy"
target="_blank"
rel="noopener"
>Chirpy</a> theme for <a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a>.
</p>
</footer>
</div>
</div>
<div id="search-result-wrapper" class="d-flex justify-content-center d-none">
<div class="col-11 content">
<div id="search-hints">
<section>
<h2 class="panel-heading">Trending Tags</h2>
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
</div>
</section>
</div>
<div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
</div>
</div>
<script>
const DEFAULT_CONFIG = {
search: {
minChars: 1,
maxResults: 5,
fields: {
title: true,
description: true,
section: true,
contents: true
},
strictMode: true
}
};
class FastSearch {
constructor({
searchInput, resultsContainer, json,
searchResultTemplate = null,
noResultsText = null,
}) {
this.searchInput = searchInput;
this.resultsContainer = resultsContainer;
this.json = json;
this.searchResultTemplate = searchResultTemplate;
this.noResultsText = noResultsText;
this.init();
}
init() {
this.loadSearchIndex();
this.searchInput.addEventListener('input', (event) => {
if (!this.searchIndex) {
this.resultsContainer.innerHTML = '<li class="search-message">Loading search index...</li>';
return;
}
this.performSearch(this.searchInput.value);
});
}
async loadSearchIndex() {
try {
const response = await fetch(this.json);
if (!response.ok) throw new Error('Failed to load search index');
const data = await response.json();
this.searchIndex = data.map(item => ({
...item,
searchableTitle: item.title?.toLowerCase() || '',
searchableDesc: item.desc?.toLowerCase() || '',
searchableSection: item.section?.toLowerCase() || '',
searchableContents: item.contents?.toLowerCase() || ''
}));
} catch (error) {
console.error('Error loading search index:', error);
this.resultsContainer.innerHTML = '<li class="search-message">Error loading search index...</li>';
}
}
escapeHtml(unsafe) {
if (!unsafe) return '';
return unsafe
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}
containsTerm(text, term) {
if (!text || !term) return false;
return text.includes(term);
}
performSearch(query) {
query = query.toLowerCase().trim();
if (!query || !this.searchIndex || query.length < DEFAULT_CONFIG.search.minChars) {
this.resultsContainer.innerHTML = '';
return;
}
const searchTerms = [
query,
...query.split(/\s+/).filter(term => term.length > 0)
];
const uniqueTerms = [...new Set(searchTerms)];
const requireFullQueryMatch = DEFAULT_CONFIG.search.strictMode;
const results = this.searchIndex
.map(item => {
const fullQueryMatched = this.checkFieldsForMatch(item, uniqueTerms[0]);
if (requireFullQueryMatch && !fullQueryMatched) {
return { item, score: 0, matched: false };
}
let score = 0;
let matchedTermsCount = 0;
let matchedInTitle = false;
uniqueTerms.forEach((term, index) => {
const isFullQuery = index === 0;
const matched = this.checkFieldsForMatch(item, term);
if (matched) {
matchedTermsCount++;
if (matched.inTitle) {
score += isFullQuery ? 10 : 5;
matchedInTitle = true;
}
if (matched.inDesc) {
score += isFullQuery ? 8 : 4;
}
if (matched.inSection) {
score += isFullQuery ? 6 : 3;
}
if (matched.inContents) {
score += isFullQuery ? 4 : 2;
}
}
});
const matchRatio = matchedTermsCount / uniqueTerms.length;
const finalScore = score * matchRatio * (matchedInTitle ? 1.5 : 1);
return {
item,
score: finalScore,
matched: fullQueryMatched
};
})
.filter(result => result.matched)
.sort((a, b) => b.score - a.score)
.slice(0, DEFAULT_CONFIG.search.maxResults)
.map(result => result.item);
if (results.length === 0) {
this.resultsContainer.innerHTML = '<p class="mt-5">Oops! No results found.</p>';
return;
}
const searchItems = results.map((item) => {
let categories = '';
let tags = '';
if (item.categories) {
categories = item.categories.join(', ');
categories = `<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${categories}</div>`;
}
if (item.tags) {
tags = item.tags.join(', ');
tags = `<div><i class="fa fa-tag fa-fw"></i>${tags}</div>`
}
return `
<article class="px-1 px-sm-2 px-lg-4 px-xl-0">
<header>
<h2><a href="${this.escapeHtml(e.permalink)}">${this.escapeHtml(e.title)}</a></h2>
<h2><a href="${this.escapeHtml(item.permalink)}">${this.escapeHtml(item.title)}</a></h2>
<div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
${t}
${n}
${categories}
${tags}
</div>
</header>
<p>${this.escapeHtml(e.contents)}</p>
<p>${this.escapeHtml(item.contents)}</p>
</article>
`}).join("");this.resultsContainer.innerHTML=i}checkFieldsForMatch(e,t){const n={inTitle:!1,inDesc:!1,inSection:!1,inContents:!1};return DEFAULT_CONFIG.search.fields.title&&this.containsTerm(e.searchableTitle,t)&&(n.inTitle=!0),DEFAULT_CONFIG.search.fields.description&&this.containsTerm(e.searchableDesc,t)&&(n.inDesc=!0),DEFAULT_CONFIG.search.fields.section&&this.containsTerm(e.searchableSection,t)&&(n.inSection=!0),DEFAULT_CONFIG.search.fields.contents&&this.containsTerm(e.searchableContents,t)&&(n.inContents=!0),!!(n.inTitle||n.inDesc||n.inSection||n.inContents)&&n}}const search=new FastSearch({searchInput:document.getElementById("search-input"),resultsContainer:document.getElementById("search-results"),json:`/index.json`})</script></div><aside aria-label="Scroll to Top"><button id=back-to-top type=button class="btn btn-lg btn-box-shadow">
<i class="fas fa-angle-up"></i></button></aside></div><div id=mask class="d-none position-fixed w-100 h-100 z-1"></div></body></html>
`;
}).join('');
this.resultsContainer.innerHTML = searchItems;
}
checkFieldsForMatch(item, term) {
const matches = {
inTitle: false,
inDesc: false,
inSection: false,
inContents: false
};
if (DEFAULT_CONFIG.search.fields.title && this.containsTerm(item.searchableTitle, term)) {
matches.inTitle = true;
}
if (DEFAULT_CONFIG.search.fields.description && this.containsTerm(item.searchableDesc, term)) {
matches.inDesc = true;
}
if (DEFAULT_CONFIG.search.fields.section && this.containsTerm(item.searchableSection, term)) {
matches.inSection = true;
}
if (DEFAULT_CONFIG.search.fields.contents && this.containsTerm(item.searchableContents, term)) {
matches.inContents = true;
}
if (matches.inTitle || matches.inDesc || matches.inSection || matches.inContents) {
return matches;
}
return false;
}
}
const search = new FastSearch({
searchInput: document.getElementById('search-input'),
resultsContainer: document.getElementById('search-results'),
json: `\/index.json`
});
</script>
</div>
<aside aria-label="Scroll to Top">
<button id="back-to-top" type="button" class="btn btn-lg btn-box-shadow">
<i class="fas fa-angle-up"></i>
</button>
</aside>
</div>
<div id="mask" class="d-none position-fixed w-100 h-100 z-1"></div>
</body>
</html>

View File

@ -1,8 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cd on Comprofix</title><link>https://comprofix.com/tags/cd/</link><description>Recent content in Cd on Comprofix</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sat, 06 Sep 2025 13:28:05 +1000</lastBuildDate><atom:link href="https://comprofix.com/tags/cd/index.xml" rel="self" type="application/rss+xml"/><item><title>Continuous Integration &amp; Continuous Deployment</title><link>https://comprofix.com/post/2024-09-21-websitedeployment/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/post/2024-09-21-websitedeployment/</guid><description>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href="https://docs.gitea.com/usage/actions/overview"&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.&lt;/p&gt;
&lt;h3 id="why-use-cicd" id=why-use-cicd&gt;
&lt;span class="me-2"&gt;Why use CI/CD?&lt;/span&gt;
&lt;a href="#why-use-cicd" class="anchor text-muted"&gt;&lt;i class="fas fa-hashtag"&gt;&lt;/i&gt;&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.&lt;/p&gt;</description></item></channel></rss>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Cd on Comprofix</title>
<link>http://localhost:1313/tags/cd/</link>
<description>Recent content in Cd on Comprofix</description>
<generator>Hugo</generator>
<language>en</language>
<lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
<atom:link href="http://localhost:1313/tags/cd/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Continuous Integration &amp; Continuous Deployment</title>
<link>http://localhost:1313/post/2024-09-21-websitedeployment/</link>
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
<guid>http://localhost:1313/post/2024-09-21-websitedeployment/</guid>
<description>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href=&#34;https://docs.gitea.com/usage/actions/overview&#34;&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href=&#34;https://github.com/features/actions&#34;&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.&lt;/p&gt;&#xA;&lt;h3 id=&#34;why-use-cicd&#34; id=why-use-cicd&gt;&#xA; &#xA; &lt;span class=&#34;me-2&#34;&gt;Why use CI/CD?&lt;/span&gt;&#xA; &lt;a href=&#34;#why-use-cicd&#34; class=&#34;anchor text-muted&#34;&gt;&lt;i class=&#34;fas fa-hashtag&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA; &#xA;&lt;/h3&gt;&lt;p&gt;It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.&lt;/p&gt;</description>
</item>
</channel>
</rss>

View File

@ -1,54 +1,914 @@
<!doctype html><head><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css></head><html lang=en><head><meta charset=utf-8><meta name=theme-color media="(prefers-color-scheme: light)" content="#f7f7f7"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#1b1b1e"><meta name=mobile-web-app-capable content="yes"><meta name=apple-mobile-web-app-status-bar-style content="black-translucent"><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,shrink-to-fit=no,viewport-fit=cover"><meta property="og:url" content="https://comprofix.com/tags/ci/"><meta property="og:site_name" content="Comprofix"><meta property="og:title" content="Ci"><meta property="og:locale" content="en"><meta property="og:type" content="website"><meta name=twitter:card content="summary"><meta name=twitter:title content="Ci"><meta itemprop=name content="Ci"><meta itemprop=datePublished content="2024-09-21T00:00:00+00:00"><meta itemprop=dateModified content="2025-09-06T13:28:05+10:00"><title>Ci |
Comprofix</title><link rel=apple-touch-icon sizes=180x180 href=/img/favicons/apple-touch-icon.png><link rel=icon type=image/png sizes=32x32 href=/img/favicons/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=/img/favicons/favicon-16x16.png><link rel="shortcut icon" href=/img/favicons/favicon.ico><meta name=apple-mobile-web-app-title content="Comprofix"><meta name=application-name content="Comprofix"><meta name=msapplication-TileColor content="#da532c"><meta name=msapplication-config content="/img/favicons/browserconfig.xml"><meta name=theme-color content="#ffffff"><link rel=preconnect href=https://fonts.googleapis.com><link rel=dns-prefetch href=https://fonts.googleapis.com><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=dns-prefetch href=https://fonts.gstatic.com><link rel=preconnect href=https://cdn.jsdelivr.net><link rel=dns-prefetch href=https://cdn.jsdelivr.net><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css><link rel=stylesheet href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&amp;family=Source+Sans+Pro:wght@400;600;700;900&amp;display=swap"><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css><script src=/js/modules/theme.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js></script><script defer src=/js/misc.js></script></head><body><aside aria-label=Sidebar id=sidebar class="d-flex flex-column align-items-end"><header class=profile-wrapper><a href=/ id=avatar class=rounded-circle><img src=/img/man-logo.png width=112 height=112 alt=avatar onerror='this.style.display="none"'></a>
<a class="site-title d-block" href=/>Comprofix</a><p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p></header><nav class="flex-column flex-grow-1 w-100 ps-0"><ul class=nav><li class=nav-item><a href=/ class=nav-link><i class="fa-fw fas fa-house"></i>
<span>HOME</span></a></li><li class=nav-item><a href=/categories/ class=nav-link><i class="fa-fw fas fa-stream"></i>
<span>CATEGORIES</span></a></li><li class=nav-item><a href=/tags/ class=nav-link><i class="fa-fw fas fa-tags"></i>
<span>TAGS</span></a></li><li class=nav-item><a href=/archives/ class=nav-link><i class="fa-fw fas fa-archive"></i>
<span>ARCHIVES</span></a></li><li class=nav-item><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i>
<span>ABOUT</span></a></li></ul></nav><div class="sidebar-bottom d-flex flex-wrap align-items-center w-100"><button type=button class="btn btn-link nav-link" aria-label="Switch Mode" id=mode-toggle>
<i class="fas fa-adjust"></i>
</button>
<span class=icon-border></span>
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i>
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i>
</a><a href=https://comprofix.com/index.xml aria-label=rss><i class="fas fa-rss"></i></a></div></aside><div id=main-wrapper class="d-flex justify-content-center"><div class="container d-flex flex-column px-xxl-5"><header id=topbar-wrapper class=flex-shrink-0 aria-label="Top Bar"><div id=topbar class="d-flex align-items-center justify-content-between px-lg-3 h-100"><nav id=breadcrumb aria-label=Breadcrumb><span><a href=/>Home</a>
</span><span><a href=https://comprofix.com/tags/>Tags</a></span>
<span>ci</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar>
<i class="fas fa-bars fa-fw"></i></button><div id=topbar-title></div><button type=button id=search-trigger class="btn btn-link" aria-label=Search>
<i class="fas fa-search fa-fw"></i>
</button>
<search id=search class="align-items-center ms-3 ms-lg-0"><i class="fas fa-search fa-fw"></i>
<input class=form-control id=search-input type=search aria-label=search autocomplete=off placeholder=Search...>
</search><button type=button class="btn btn-link text-decoration-none" id=search-cancel>Cancel</button></div></header><div class="row flex-grow-1"><main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4"><div id=page-tag><h1 class=ps-lg-2><i class="fa fa-tag fa-fw text-muted"></i>
ci
<span class="lead text-muted ps-2">1</span></h1><ul class="content ps-0"><li class="d-flex justify-content-between px-md-3"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a>
<span class="dash flex-grow-1"></span>
<time class="text-muted small text-nowrap" data-ts=1726876800 data-df=ll>%b %e, %Y</time></li></ul></div></main><aside aria-label=Panel id=panel-wrapper class="col-xl-3 ps-2 text-muted"><div class=access><section id=access-lastmod><h2 class=panel-heading>Recently Updated</h2><ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2"><li class="text-truncate lh-lg"><a href=/post/2024-09-05-resetrestart/>Reset and Restart</a></li><li class="text-truncate lh-lg"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a></li></ul></section><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div></aside></div><div class=row><div id=tail-wrapper class="col-12 col-lg-11 col-xl-9 px-md-4"><footer aria-label="Site Info" class="d-flex flex-column justify-content-center text-muted
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>©
<time>2025</time>
<a href=https://comprofix.com>Comprofix</a>.
<span data-bs-toggle=tooltip data-bs-placement=top title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author.">Some rights reserved.</span></p><p>Using the <a data-bs-toggle=tooltip data-bs-placement=top title=v1.0.2 href=https://github.com/geekifan/hugo-theme-chirpy target=_blank rel=noopener>Chirpy</a> theme for <a href=https://gohugo.io/ target=_blank rel=noopener>Hugo</a>.</p></footer></div></div><div id=search-result-wrapper class="d-flex justify-content-center d-none"><div class="col-11 content"><div id=search-hints><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div><div id=search-results class="d-flex flex-wrap justify-content-center text-muted mt-3"></div></div></div><script>const DEFAULT_CONFIG={search:{minChars:1,maxResults:5,fields:{title:!0,description:!0,section:!0,contents:!0},strictMode:!0}};class FastSearch{constructor({searchInput:e,resultsContainer:t,json:n,searchResultTemplate:s=null,noResultsText:o=null}){this.searchInput=e,this.resultsContainer=t,this.json=n,this.searchResultTemplate=s,this.noResultsText=o,this.init()}init(){this.loadSearchIndex(),this.searchInput.addEventListener("input",e=>{if(!this.searchIndex){this.resultsContainer.innerHTML='<li class="search-message">Loading search index...</li>';return}this.performSearch(this.searchInput.value)})}async loadSearchIndex(){try{const e=await fetch(this.json);if(!e.ok)throw new Error("Failed to load search index");const t=await e.json();this.searchIndex=t.map(e=>({...e,searchableTitle:e.title?.toLowerCase()||"",searchableDesc:e.desc?.toLowerCase()||"",searchableSection:e.section?.toLowerCase()||"",searchableContents:e.contents?.toLowerCase()||""}))}catch(e){console.error("Error loading search index:",e),this.resultsContainer.innerHTML='<li class="search-message">Error loading search index...</li>'}}escapeHtml(e){return e?e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;"):""}containsTerm(e,t){return!!e&&!!t&&e.includes(t)}performSearch(e){if(e=e.toLowerCase().trim(),!e||!this.searchIndex||e.length<DEFAULT_CONFIG.search.minChars){this.resultsContainer.innerHTML="";return}const s=[e,...e.split(/\s+/).filter(e=>e.length>0)],t=[...new Set(s)],o=DEFAULT_CONFIG.search.strictMode,n=this.searchIndex.map(e=>{const s=this.checkFieldsForMatch(e,t[0]);if(o&&!s)return{item:e,score:0,matched:!1};let n=0,i=0,a=!1;t.forEach((t,s)=>{const r=s===0,o=this.checkFieldsForMatch(e,t);o&&(i++,o.inTitle&&(n+=r?10:5,a=!0),o.inDesc&&(n+=r?8:4),o.inSection&&(n+=r?6:3),o.inContents&&(n+=r?4:2))});const r=i/t.length,c=n*r*(a?1.5:1);return{item:e,score:c,matched:s}}).filter(e=>e.matched).sort((e,t)=>t.score-e.score).slice(0,DEFAULT_CONFIG.search.maxResults).map(e=>e.item);if(n.length===0){this.resultsContainer.innerHTML='<p class="mt-5">Oops! No results found.</p>';return}const i=n.map(e=>{let t="",n="";return e.categories&&(t=e.categories.join(", "),t=`<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${t}</div>`),e.tags&&(n=e.tags.join(", "),n=`<div><i class="fa fa-tag fa-fw"></i>${n}</div>`),`
<!doctype html>
<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
</head>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta
name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
>
<meta property="og:url" content="http://localhost:1313/tags/ci/">
<meta property="og:site_name" content="Comprofix">
<meta property="og:title" content="Ci">
<meta property="og:locale" content="en">
<meta property="og:type" content="website">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Ci">
<meta itemprop="name" content="Ci">
<meta itemprop="datePublished" content="2024-09-21T00:00:00+00:00">
<meta itemprop="dateModified" content="2024-09-21T00:00:00+00:00">
<title>
Ci |
Comprofix
</title>
<link rel="apple-touch-icon" sizes="180x180" href="/img/favicons/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicons/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicons/favicon-16x16.png">
<link rel="shortcut icon" href="/img/favicons/favicon.ico">
<meta name="apple-mobile-web-app-title" content="Comprofix">
<meta name="application-name" content="Comprofix">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="msapplication-config" content="/img/favicons/browserconfig.xml">
<meta name="theme-color" content="#ffffff">
<link rel="preconnect" href="https://fonts.googleapis.com" >
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="dns-prefetch" href="https://fonts.gstatic.com" >
<link rel="preconnect" href="https://cdn.jsdelivr.net" >
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" >
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&amp;family=Source&#43;Sans&#43;Pro:wght@400;600;700;900&amp;display=swap">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css">
<script src="/js/modules/theme.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js"></script>
<script defer src="/js/misc.js"></script>
</head>
<body>
<aside aria-label="Sidebar" id="sidebar" class="d-flex flex-column align-items-end">
<header class="profile-wrapper">
<a href="/" id="avatar" class="rounded-circle"><img src="/img/man-logo.png" width="112" height="112" alt="avatar" onerror="this.style.display='none'"></a>
<a class="site-title d-block" href="/">Comprofix</a>
<p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p>
</header>
<nav class="flex-column flex-grow-1 w-100 ps-0">
<ul class="nav">
<li class="nav-item">
<a href="/" class="nav-link">
<i class="fa-fw fas fa-house"></i>
<span>HOME</span>
</a>
</li>
<li class="nav-item">
<a href="/categories/" class="nav-link">
<i class="fa-fw fas fa-stream"></i>
<span>CATEGORIES</span>
</a>
</li>
<li class="nav-item">
<a href="/tags/" class="nav-link">
<i class="fa-fw fas fa-tags"></i>
<span>TAGS</span>
</a>
</li>
<li class="nav-item">
<a href="/archives/" class="nav-link">
<i class="fa-fw fas fa-archive"></i>
<span>ARCHIVES</span>
</a>
</li>
<li class="nav-item">
<a href="/about/" class="nav-link">
<i class="fa-fw fas fa-info-circle"></i>
<span>ABOUT</span>
</a>
</li>
</ul>
</nav>
<div class="sidebar-bottom d-flex flex-wrap align-items-center w-100">
<button type="button" class="btn btn-link nav-link" aria-label="Switch Mode" id="mode-toggle">
<i class="fas fa-adjust"></i>
</button>
<span class="icon-border"></span>
<a
href="https://git.comprofix.com/mmckinnon"
aria-label="custom"
target="_blank" rel="noopener noreferrer"
>
<i class="fab fa-git-alt"></i>
</a>
<a
href="https://twitter.com/mckinnon81"
aria-label="twitter"
target="_blank" rel="noopener noreferrer"
>
<i class="fab fa-twitter"></i>
</a>
<a
href="http://localhost:1313/index.xml"
aria-label="rss"
>
<i class="fas fa-rss"></i>
</a>
</div>
</aside>
<div id="main-wrapper" class="d-flex justify-content-center">
<div class="container d-flex flex-column px-xxl-5">
<header id="topbar-wrapper" class="flex-shrink-0" aria-label="Top Bar">
<div id="topbar" class="d-flex align-items-center justify-content-between px-lg-3 h-100">
<nav id="breadcrumb" aria-label="Breadcrumb">
<span>
<a href="/">Home</a>
</span>
<span><a href="http://localhost:1313/tags/">Tags</a></span>
<span>ci</span>
</nav>
<button type="button" id="sidebar-trigger" class="btn btn-link" aria-label="Sidebar">
<i class="fas fa-bars fa-fw"></i>
</button>
<div id="topbar-title">
</div>
<button type="button" id="search-trigger" class="btn btn-link" aria-label="Search">
<i class="fas fa-search fa-fw"></i>
</button>
<search id="search" class="align-items-center ms-3 ms-lg-0">
<i class="fas fa-search fa-fw"></i>
<input
class="form-control"
id="search-input"
type="search"
aria-label="search"
autocomplete="off"
placeholder="Search..."
>
</search>
<button type="button" class="btn btn-link text-decoration-none" id="search-cancel">Cancel</button>
</div>
</header>
<div class="row flex-grow-1">
<main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4">
<div id="page-tag">
<h1 class="ps-lg-2">
<i class="fa fa-tag fa-fw text-muted"></i>
ci
<span class="lead text-muted ps-2">1</span>
</h1>
<ul class="content ps-0">
<li class="d-flex justify-content-between px-md-3">
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration &amp; Continuous Deployment</a>
<span class="dash flex-grow-1"></span>
<time
class="text-muted small text-nowrap"
data-ts="1726876800"
data-df="ll"
>
%b %e, %Y
</time>
</li>
</ul>
</div>
</main>
<aside aria-label="Panel" id="panel-wrapper" class="col-xl-3 ps-2 text-muted">
<div class="access">
<section id="access-lastmod">
<h2 class="panel-heading">Recently Updated</h2>
<ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2">
<li class="text-truncate lh-lg">
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration &amp; Continuous Deployment</a>
</li>
<li class="text-truncate lh-lg">
<a href="/post/2024-09-05-resetrestart/">Reset and Restart</a>
</li>
</ul>
</section>
<section>
<h2 class="panel-heading">Trending Tags</h2>
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
</div>
</section>
</div>
</aside>
</div>
<div class="row">
<div id="tail-wrapper" class="col-12 col-lg-11 col-xl-9 px-md-4">
<footer
aria-label="Site Info"
class="
d-flex flex-column justify-content-center text-muted
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
"
>
<p>
©
<time>2025</time>
<a href="https://comprofix.com">Comprofix</a>.
<span
data-bs-toggle="tooltip"
data-bs-placement="top"
title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author."
>Some rights reserved.</span>
</p>
<p>Using the <a
data-bs-toggle="tooltip"
data-bs-placement="top"
title="v1.0.2"
href="https://github.com/geekifan/hugo-theme-chirpy"
target="_blank"
rel="noopener"
>Chirpy</a> theme for <a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a>.
</p>
</footer>
</div>
</div>
<div id="search-result-wrapper" class="d-flex justify-content-center d-none">
<div class="col-11 content">
<div id="search-hints">
<section>
<h2 class="panel-heading">Trending Tags</h2>
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
</div>
</section>
</div>
<div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
</div>
</div>
<script>
const DEFAULT_CONFIG = {
search: {
minChars: 1,
maxResults: 5,
fields: {
title: true,
description: true,
section: true,
contents: true
},
strictMode: true
}
};
class FastSearch {
constructor({
searchInput, resultsContainer, json,
searchResultTemplate = null,
noResultsText = null,
}) {
this.searchInput = searchInput;
this.resultsContainer = resultsContainer;
this.json = json;
this.searchResultTemplate = searchResultTemplate;
this.noResultsText = noResultsText;
this.init();
}
init() {
this.loadSearchIndex();
this.searchInput.addEventListener('input', (event) => {
if (!this.searchIndex) {
this.resultsContainer.innerHTML = '<li class="search-message">Loading search index...</li>';
return;
}
this.performSearch(this.searchInput.value);
});
}
async loadSearchIndex() {
try {
const response = await fetch(this.json);
if (!response.ok) throw new Error('Failed to load search index');
const data = await response.json();
this.searchIndex = data.map(item => ({
...item,
searchableTitle: item.title?.toLowerCase() || '',
searchableDesc: item.desc?.toLowerCase() || '',
searchableSection: item.section?.toLowerCase() || '',
searchableContents: item.contents?.toLowerCase() || ''
}));
} catch (error) {
console.error('Error loading search index:', error);
this.resultsContainer.innerHTML = '<li class="search-message">Error loading search index...</li>';
}
}
escapeHtml(unsafe) {
if (!unsafe) return '';
return unsafe
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}
containsTerm(text, term) {
if (!text || !term) return false;
return text.includes(term);
}
performSearch(query) {
query = query.toLowerCase().trim();
if (!query || !this.searchIndex || query.length < DEFAULT_CONFIG.search.minChars) {
this.resultsContainer.innerHTML = '';
return;
}
const searchTerms = [
query,
...query.split(/\s+/).filter(term => term.length > 0)
];
const uniqueTerms = [...new Set(searchTerms)];
const requireFullQueryMatch = DEFAULT_CONFIG.search.strictMode;
const results = this.searchIndex
.map(item => {
const fullQueryMatched = this.checkFieldsForMatch(item, uniqueTerms[0]);
if (requireFullQueryMatch && !fullQueryMatched) {
return { item, score: 0, matched: false };
}
let score = 0;
let matchedTermsCount = 0;
let matchedInTitle = false;
uniqueTerms.forEach((term, index) => {
const isFullQuery = index === 0;
const matched = this.checkFieldsForMatch(item, term);
if (matched) {
matchedTermsCount++;
if (matched.inTitle) {
score += isFullQuery ? 10 : 5;
matchedInTitle = true;
}
if (matched.inDesc) {
score += isFullQuery ? 8 : 4;
}
if (matched.inSection) {
score += isFullQuery ? 6 : 3;
}
if (matched.inContents) {
score += isFullQuery ? 4 : 2;
}
}
});
const matchRatio = matchedTermsCount / uniqueTerms.length;
const finalScore = score * matchRatio * (matchedInTitle ? 1.5 : 1);
return {
item,
score: finalScore,
matched: fullQueryMatched
};
})
.filter(result => result.matched)
.sort((a, b) => b.score - a.score)
.slice(0, DEFAULT_CONFIG.search.maxResults)
.map(result => result.item);
if (results.length === 0) {
this.resultsContainer.innerHTML = '<p class="mt-5">Oops! No results found.</p>';
return;
}
const searchItems = results.map((item) => {
let categories = '';
let tags = '';
if (item.categories) {
categories = item.categories.join(', ');
categories = `<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${categories}</div>`;
}
if (item.tags) {
tags = item.tags.join(', ');
tags = `<div><i class="fa fa-tag fa-fw"></i>${tags}</div>`
}
return `
<article class="px-1 px-sm-2 px-lg-4 px-xl-0">
<header>
<h2><a href="${this.escapeHtml(e.permalink)}">${this.escapeHtml(e.title)}</a></h2>
<h2><a href="${this.escapeHtml(item.permalink)}">${this.escapeHtml(item.title)}</a></h2>
<div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
${t}
${n}
${categories}
${tags}
</div>
</header>
<p>${this.escapeHtml(e.contents)}</p>
<p>${this.escapeHtml(item.contents)}</p>
</article>
`}).join("");this.resultsContainer.innerHTML=i}checkFieldsForMatch(e,t){const n={inTitle:!1,inDesc:!1,inSection:!1,inContents:!1};return DEFAULT_CONFIG.search.fields.title&&this.containsTerm(e.searchableTitle,t)&&(n.inTitle=!0),DEFAULT_CONFIG.search.fields.description&&this.containsTerm(e.searchableDesc,t)&&(n.inDesc=!0),DEFAULT_CONFIG.search.fields.section&&this.containsTerm(e.searchableSection,t)&&(n.inSection=!0),DEFAULT_CONFIG.search.fields.contents&&this.containsTerm(e.searchableContents,t)&&(n.inContents=!0),!!(n.inTitle||n.inDesc||n.inSection||n.inContents)&&n}}const search=new FastSearch({searchInput:document.getElementById("search-input"),resultsContainer:document.getElementById("search-results"),json:`/index.json`})</script></div><aside aria-label="Scroll to Top"><button id=back-to-top type=button class="btn btn-lg btn-box-shadow">
<i class="fas fa-angle-up"></i></button></aside></div><div id=mask class="d-none position-fixed w-100 h-100 z-1"></div></body></html>
`;
}).join('');
this.resultsContainer.innerHTML = searchItems;
}
checkFieldsForMatch(item, term) {
const matches = {
inTitle: false,
inDesc: false,
inSection: false,
inContents: false
};
if (DEFAULT_CONFIG.search.fields.title && this.containsTerm(item.searchableTitle, term)) {
matches.inTitle = true;
}
if (DEFAULT_CONFIG.search.fields.description && this.containsTerm(item.searchableDesc, term)) {
matches.inDesc = true;
}
if (DEFAULT_CONFIG.search.fields.section && this.containsTerm(item.searchableSection, term)) {
matches.inSection = true;
}
if (DEFAULT_CONFIG.search.fields.contents && this.containsTerm(item.searchableContents, term)) {
matches.inContents = true;
}
if (matches.inTitle || matches.inDesc || matches.inSection || matches.inContents) {
return matches;
}
return false;
}
}
const search = new FastSearch({
searchInput: document.getElementById('search-input'),
resultsContainer: document.getElementById('search-results'),
json: `\/index.json`
});
</script>
</div>
<aside aria-label="Scroll to Top">
<button id="back-to-top" type="button" class="btn btn-lg btn-box-shadow">
<i class="fas fa-angle-up"></i>
</button>
</aside>
</div>
<div id="mask" class="d-none position-fixed w-100 h-100 z-1"></div>
</body>
</html>

View File

@ -1,8 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Ci on Comprofix</title><link>https://comprofix.com/tags/ci/</link><description>Recent content in Ci on Comprofix</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sat, 06 Sep 2025 13:28:05 +1000</lastBuildDate><atom:link href="https://comprofix.com/tags/ci/index.xml" rel="self" type="application/rss+xml"/><item><title>Continuous Integration &amp; Continuous Deployment</title><link>https://comprofix.com/post/2024-09-21-websitedeployment/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/post/2024-09-21-websitedeployment/</guid><description>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href="https://docs.gitea.com/usage/actions/overview"&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.&lt;/p&gt;
&lt;h3 id="why-use-cicd" id=why-use-cicd&gt;
&lt;span class="me-2"&gt;Why use CI/CD?&lt;/span&gt;
&lt;a href="#why-use-cicd" class="anchor text-muted"&gt;&lt;i class="fas fa-hashtag"&gt;&lt;/i&gt;&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.&lt;/p&gt;</description></item></channel></rss>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Ci on Comprofix</title>
<link>http://localhost:1313/tags/ci/</link>
<description>Recent content in Ci on Comprofix</description>
<generator>Hugo</generator>
<language>en</language>
<lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
<atom:link href="http://localhost:1313/tags/ci/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Continuous Integration &amp; Continuous Deployment</title>
<link>http://localhost:1313/post/2024-09-21-websitedeployment/</link>
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
<guid>http://localhost:1313/post/2024-09-21-websitedeployment/</guid>
<description>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href=&#34;https://docs.gitea.com/usage/actions/overview&#34;&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href=&#34;https://github.com/features/actions&#34;&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.&lt;/p&gt;&#xA;&lt;h3 id=&#34;why-use-cicd&#34; id=why-use-cicd&gt;&#xA; &#xA; &lt;span class=&#34;me-2&#34;&gt;Why use CI/CD?&lt;/span&gt;&#xA; &lt;a href=&#34;#why-use-cicd&#34; class=&#34;anchor text-muted&#34;&gt;&lt;i class=&#34;fas fa-hashtag&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA; &#xA;&lt;/h3&gt;&lt;p&gt;It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.&lt;/p&gt;</description>
</item>
</channel>
</rss>

View File

@ -1,54 +1,914 @@
<!doctype html><head><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css></head><html lang=en><head><meta charset=utf-8><meta name=theme-color media="(prefers-color-scheme: light)" content="#f7f7f7"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#1b1b1e"><meta name=mobile-web-app-capable content="yes"><meta name=apple-mobile-web-app-status-bar-style content="black-translucent"><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,shrink-to-fit=no,viewport-fit=cover"><meta property="og:url" content="https://comprofix.com/tags/continuous-deployment/"><meta property="og:site_name" content="Comprofix"><meta property="og:title" content="Continuous Deployment"><meta property="og:locale" content="en"><meta property="og:type" content="website"><meta name=twitter:card content="summary"><meta name=twitter:title content="Continuous Deployment"><meta itemprop=name content="Continuous Deployment"><meta itemprop=datePublished content="2024-09-21T00:00:00+00:00"><meta itemprop=dateModified content="2025-09-06T13:28:05+10:00"><title>Continuous Deployment |
Comprofix</title><link rel=apple-touch-icon sizes=180x180 href=/img/favicons/apple-touch-icon.png><link rel=icon type=image/png sizes=32x32 href=/img/favicons/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=/img/favicons/favicon-16x16.png><link rel="shortcut icon" href=/img/favicons/favicon.ico><meta name=apple-mobile-web-app-title content="Comprofix"><meta name=application-name content="Comprofix"><meta name=msapplication-TileColor content="#da532c"><meta name=msapplication-config content="/img/favicons/browserconfig.xml"><meta name=theme-color content="#ffffff"><link rel=preconnect href=https://fonts.googleapis.com><link rel=dns-prefetch href=https://fonts.googleapis.com><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=dns-prefetch href=https://fonts.gstatic.com><link rel=preconnect href=https://cdn.jsdelivr.net><link rel=dns-prefetch href=https://cdn.jsdelivr.net><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css><link rel=stylesheet href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&amp;family=Source+Sans+Pro:wght@400;600;700;900&amp;display=swap"><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css><script src=/js/modules/theme.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js></script><script defer src=/js/misc.js></script></head><body><aside aria-label=Sidebar id=sidebar class="d-flex flex-column align-items-end"><header class=profile-wrapper><a href=/ id=avatar class=rounded-circle><img src=/img/man-logo.png width=112 height=112 alt=avatar onerror='this.style.display="none"'></a>
<a class="site-title d-block" href=/>Comprofix</a><p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p></header><nav class="flex-column flex-grow-1 w-100 ps-0"><ul class=nav><li class=nav-item><a href=/ class=nav-link><i class="fa-fw fas fa-house"></i>
<span>HOME</span></a></li><li class=nav-item><a href=/categories/ class=nav-link><i class="fa-fw fas fa-stream"></i>
<span>CATEGORIES</span></a></li><li class=nav-item><a href=/tags/ class=nav-link><i class="fa-fw fas fa-tags"></i>
<span>TAGS</span></a></li><li class=nav-item><a href=/archives/ class=nav-link><i class="fa-fw fas fa-archive"></i>
<span>ARCHIVES</span></a></li><li class=nav-item><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i>
<span>ABOUT</span></a></li></ul></nav><div class="sidebar-bottom d-flex flex-wrap align-items-center w-100"><button type=button class="btn btn-link nav-link" aria-label="Switch Mode" id=mode-toggle>
<i class="fas fa-adjust"></i>
</button>
<span class=icon-border></span>
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i>
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i>
</a><a href=https://comprofix.com/index.xml aria-label=rss><i class="fas fa-rss"></i></a></div></aside><div id=main-wrapper class="d-flex justify-content-center"><div class="container d-flex flex-column px-xxl-5"><header id=topbar-wrapper class=flex-shrink-0 aria-label="Top Bar"><div id=topbar class="d-flex align-items-center justify-content-between px-lg-3 h-100"><nav id=breadcrumb aria-label=Breadcrumb><span><a href=/>Home</a>
</span><span><a href=https://comprofix.com/tags/>Tags</a></span>
<span>continuous deployment</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar>
<i class="fas fa-bars fa-fw"></i></button><div id=topbar-title></div><button type=button id=search-trigger class="btn btn-link" aria-label=Search>
<i class="fas fa-search fa-fw"></i>
</button>
<search id=search class="align-items-center ms-3 ms-lg-0"><i class="fas fa-search fa-fw"></i>
<input class=form-control id=search-input type=search aria-label=search autocomplete=off placeholder=Search...>
</search><button type=button class="btn btn-link text-decoration-none" id=search-cancel>Cancel</button></div></header><div class="row flex-grow-1"><main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4"><div id=page-tag><h1 class=ps-lg-2><i class="fa fa-tag fa-fw text-muted"></i>
continuous deployment
<span class="lead text-muted ps-2">1</span></h1><ul class="content ps-0"><li class="d-flex justify-content-between px-md-3"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a>
<span class="dash flex-grow-1"></span>
<time class="text-muted small text-nowrap" data-ts=1726876800 data-df=ll>%b %e, %Y</time></li></ul></div></main><aside aria-label=Panel id=panel-wrapper class="col-xl-3 ps-2 text-muted"><div class=access><section id=access-lastmod><h2 class=panel-heading>Recently Updated</h2><ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2"><li class="text-truncate lh-lg"><a href=/post/2024-09-05-resetrestart/>Reset and Restart</a></li><li class="text-truncate lh-lg"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a></li></ul></section><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div></aside></div><div class=row><div id=tail-wrapper class="col-12 col-lg-11 col-xl-9 px-md-4"><footer aria-label="Site Info" class="d-flex flex-column justify-content-center text-muted
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>©
<time>2025</time>
<a href=https://comprofix.com>Comprofix</a>.
<span data-bs-toggle=tooltip data-bs-placement=top title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author.">Some rights reserved.</span></p><p>Using the <a data-bs-toggle=tooltip data-bs-placement=top title=v1.0.2 href=https://github.com/geekifan/hugo-theme-chirpy target=_blank rel=noopener>Chirpy</a> theme for <a href=https://gohugo.io/ target=_blank rel=noopener>Hugo</a>.</p></footer></div></div><div id=search-result-wrapper class="d-flex justify-content-center d-none"><div class="col-11 content"><div id=search-hints><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div><div id=search-results class="d-flex flex-wrap justify-content-center text-muted mt-3"></div></div></div><script>const DEFAULT_CONFIG={search:{minChars:1,maxResults:5,fields:{title:!0,description:!0,section:!0,contents:!0},strictMode:!0}};class FastSearch{constructor({searchInput:e,resultsContainer:t,json:n,searchResultTemplate:s=null,noResultsText:o=null}){this.searchInput=e,this.resultsContainer=t,this.json=n,this.searchResultTemplate=s,this.noResultsText=o,this.init()}init(){this.loadSearchIndex(),this.searchInput.addEventListener("input",e=>{if(!this.searchIndex){this.resultsContainer.innerHTML='<li class="search-message">Loading search index...</li>';return}this.performSearch(this.searchInput.value)})}async loadSearchIndex(){try{const e=await fetch(this.json);if(!e.ok)throw new Error("Failed to load search index");const t=await e.json();this.searchIndex=t.map(e=>({...e,searchableTitle:e.title?.toLowerCase()||"",searchableDesc:e.desc?.toLowerCase()||"",searchableSection:e.section?.toLowerCase()||"",searchableContents:e.contents?.toLowerCase()||""}))}catch(e){console.error("Error loading search index:",e),this.resultsContainer.innerHTML='<li class="search-message">Error loading search index...</li>'}}escapeHtml(e){return e?e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;"):""}containsTerm(e,t){return!!e&&!!t&&e.includes(t)}performSearch(e){if(e=e.toLowerCase().trim(),!e||!this.searchIndex||e.length<DEFAULT_CONFIG.search.minChars){this.resultsContainer.innerHTML="";return}const s=[e,...e.split(/\s+/).filter(e=>e.length>0)],t=[...new Set(s)],o=DEFAULT_CONFIG.search.strictMode,n=this.searchIndex.map(e=>{const s=this.checkFieldsForMatch(e,t[0]);if(o&&!s)return{item:e,score:0,matched:!1};let n=0,i=0,a=!1;t.forEach((t,s)=>{const r=s===0,o=this.checkFieldsForMatch(e,t);o&&(i++,o.inTitle&&(n+=r?10:5,a=!0),o.inDesc&&(n+=r?8:4),o.inSection&&(n+=r?6:3),o.inContents&&(n+=r?4:2))});const r=i/t.length,c=n*r*(a?1.5:1);return{item:e,score:c,matched:s}}).filter(e=>e.matched).sort((e,t)=>t.score-e.score).slice(0,DEFAULT_CONFIG.search.maxResults).map(e=>e.item);if(n.length===0){this.resultsContainer.innerHTML='<p class="mt-5">Oops! No results found.</p>';return}const i=n.map(e=>{let t="",n="";return e.categories&&(t=e.categories.join(", "),t=`<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${t}</div>`),e.tags&&(n=e.tags.join(", "),n=`<div><i class="fa fa-tag fa-fw"></i>${n}</div>`),`
<!doctype html>
<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
</head>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta
name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
>
<meta property="og:url" content="http://localhost:1313/tags/continuous-deployment/">
<meta property="og:site_name" content="Comprofix">
<meta property="og:title" content="Continuous Deployment">
<meta property="og:locale" content="en">
<meta property="og:type" content="website">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Continuous Deployment">
<meta itemprop="name" content="Continuous Deployment">
<meta itemprop="datePublished" content="2024-09-21T00:00:00+00:00">
<meta itemprop="dateModified" content="2024-09-21T00:00:00+00:00">
<title>
Continuous Deployment |
Comprofix
</title>
<link rel="apple-touch-icon" sizes="180x180" href="/img/favicons/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicons/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicons/favicon-16x16.png">
<link rel="shortcut icon" href="/img/favicons/favicon.ico">
<meta name="apple-mobile-web-app-title" content="Comprofix">
<meta name="application-name" content="Comprofix">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="msapplication-config" content="/img/favicons/browserconfig.xml">
<meta name="theme-color" content="#ffffff">
<link rel="preconnect" href="https://fonts.googleapis.com" >
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="dns-prefetch" href="https://fonts.gstatic.com" >
<link rel="preconnect" href="https://cdn.jsdelivr.net" >
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" >
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&amp;family=Source&#43;Sans&#43;Pro:wght@400;600;700;900&amp;display=swap">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css">
<script src="/js/modules/theme.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js"></script>
<script defer src="/js/misc.js"></script>
</head>
<body>
<aside aria-label="Sidebar" id="sidebar" class="d-flex flex-column align-items-end">
<header class="profile-wrapper">
<a href="/" id="avatar" class="rounded-circle"><img src="/img/man-logo.png" width="112" height="112" alt="avatar" onerror="this.style.display='none'"></a>
<a class="site-title d-block" href="/">Comprofix</a>
<p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p>
</header>
<nav class="flex-column flex-grow-1 w-100 ps-0">
<ul class="nav">
<li class="nav-item">
<a href="/" class="nav-link">
<i class="fa-fw fas fa-house"></i>
<span>HOME</span>
</a>
</li>
<li class="nav-item">
<a href="/categories/" class="nav-link">
<i class="fa-fw fas fa-stream"></i>
<span>CATEGORIES</span>
</a>
</li>
<li class="nav-item">
<a href="/tags/" class="nav-link">
<i class="fa-fw fas fa-tags"></i>
<span>TAGS</span>
</a>
</li>
<li class="nav-item">
<a href="/archives/" class="nav-link">
<i class="fa-fw fas fa-archive"></i>
<span>ARCHIVES</span>
</a>
</li>
<li class="nav-item">
<a href="/about/" class="nav-link">
<i class="fa-fw fas fa-info-circle"></i>
<span>ABOUT</span>
</a>
</li>
</ul>
</nav>
<div class="sidebar-bottom d-flex flex-wrap align-items-center w-100">
<button type="button" class="btn btn-link nav-link" aria-label="Switch Mode" id="mode-toggle">
<i class="fas fa-adjust"></i>
</button>
<span class="icon-border"></span>
<a
href="https://git.comprofix.com/mmckinnon"
aria-label="custom"
target="_blank" rel="noopener noreferrer"
>
<i class="fab fa-git-alt"></i>
</a>
<a
href="https://twitter.com/mckinnon81"
aria-label="twitter"
target="_blank" rel="noopener noreferrer"
>
<i class="fab fa-twitter"></i>
</a>
<a
href="http://localhost:1313/index.xml"
aria-label="rss"
>
<i class="fas fa-rss"></i>
</a>
</div>
</aside>
<div id="main-wrapper" class="d-flex justify-content-center">
<div class="container d-flex flex-column px-xxl-5">
<header id="topbar-wrapper" class="flex-shrink-0" aria-label="Top Bar">
<div id="topbar" class="d-flex align-items-center justify-content-between px-lg-3 h-100">
<nav id="breadcrumb" aria-label="Breadcrumb">
<span>
<a href="/">Home</a>
</span>
<span><a href="http://localhost:1313/tags/">Tags</a></span>
<span>continuous deployment</span>
</nav>
<button type="button" id="sidebar-trigger" class="btn btn-link" aria-label="Sidebar">
<i class="fas fa-bars fa-fw"></i>
</button>
<div id="topbar-title">
</div>
<button type="button" id="search-trigger" class="btn btn-link" aria-label="Search">
<i class="fas fa-search fa-fw"></i>
</button>
<search id="search" class="align-items-center ms-3 ms-lg-0">
<i class="fas fa-search fa-fw"></i>
<input
class="form-control"
id="search-input"
type="search"
aria-label="search"
autocomplete="off"
placeholder="Search..."
>
</search>
<button type="button" class="btn btn-link text-decoration-none" id="search-cancel">Cancel</button>
</div>
</header>
<div class="row flex-grow-1">
<main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4">
<div id="page-tag">
<h1 class="ps-lg-2">
<i class="fa fa-tag fa-fw text-muted"></i>
continuous deployment
<span class="lead text-muted ps-2">1</span>
</h1>
<ul class="content ps-0">
<li class="d-flex justify-content-between px-md-3">
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration &amp; Continuous Deployment</a>
<span class="dash flex-grow-1"></span>
<time
class="text-muted small text-nowrap"
data-ts="1726876800"
data-df="ll"
>
%b %e, %Y
</time>
</li>
</ul>
</div>
</main>
<aside aria-label="Panel" id="panel-wrapper" class="col-xl-3 ps-2 text-muted">
<div class="access">
<section id="access-lastmod">
<h2 class="panel-heading">Recently Updated</h2>
<ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2">
<li class="text-truncate lh-lg">
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration &amp; Continuous Deployment</a>
</li>
<li class="text-truncate lh-lg">
<a href="/post/2024-09-05-resetrestart/">Reset and Restart</a>
</li>
</ul>
</section>
<section>
<h2 class="panel-heading">Trending Tags</h2>
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
</div>
</section>
</div>
</aside>
</div>
<div class="row">
<div id="tail-wrapper" class="col-12 col-lg-11 col-xl-9 px-md-4">
<footer
aria-label="Site Info"
class="
d-flex flex-column justify-content-center text-muted
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
"
>
<p>
©
<time>2025</time>
<a href="https://comprofix.com">Comprofix</a>.
<span
data-bs-toggle="tooltip"
data-bs-placement="top"
title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author."
>Some rights reserved.</span>
</p>
<p>Using the <a
data-bs-toggle="tooltip"
data-bs-placement="top"
title="v1.0.2"
href="https://github.com/geekifan/hugo-theme-chirpy"
target="_blank"
rel="noopener"
>Chirpy</a> theme for <a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a>.
</p>
</footer>
</div>
</div>
<div id="search-result-wrapper" class="d-flex justify-content-center d-none">
<div class="col-11 content">
<div id="search-hints">
<section>
<h2 class="panel-heading">Trending Tags</h2>
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
</div>
</section>
</div>
<div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
</div>
</div>
<script>
const DEFAULT_CONFIG = {
search: {
minChars: 1,
maxResults: 5,
fields: {
title: true,
description: true,
section: true,
contents: true
},
strictMode: true
}
};
class FastSearch {
constructor({
searchInput, resultsContainer, json,
searchResultTemplate = null,
noResultsText = null,
}) {
this.searchInput = searchInput;
this.resultsContainer = resultsContainer;
this.json = json;
this.searchResultTemplate = searchResultTemplate;
this.noResultsText = noResultsText;
this.init();
}
init() {
this.loadSearchIndex();
this.searchInput.addEventListener('input', (event) => {
if (!this.searchIndex) {
this.resultsContainer.innerHTML = '<li class="search-message">Loading search index...</li>';
return;
}
this.performSearch(this.searchInput.value);
});
}
async loadSearchIndex() {
try {
const response = await fetch(this.json);
if (!response.ok) throw new Error('Failed to load search index');
const data = await response.json();
this.searchIndex = data.map(item => ({
...item,
searchableTitle: item.title?.toLowerCase() || '',
searchableDesc: item.desc?.toLowerCase() || '',
searchableSection: item.section?.toLowerCase() || '',
searchableContents: item.contents?.toLowerCase() || ''
}));
} catch (error) {
console.error('Error loading search index:', error);
this.resultsContainer.innerHTML = '<li class="search-message">Error loading search index...</li>';
}
}
escapeHtml(unsafe) {
if (!unsafe) return '';
return unsafe
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}
containsTerm(text, term) {
if (!text || !term) return false;
return text.includes(term);
}
performSearch(query) {
query = query.toLowerCase().trim();
if (!query || !this.searchIndex || query.length < DEFAULT_CONFIG.search.minChars) {
this.resultsContainer.innerHTML = '';
return;
}
const searchTerms = [
query,
...query.split(/\s+/).filter(term => term.length > 0)
];
const uniqueTerms = [...new Set(searchTerms)];
const requireFullQueryMatch = DEFAULT_CONFIG.search.strictMode;
const results = this.searchIndex
.map(item => {
const fullQueryMatched = this.checkFieldsForMatch(item, uniqueTerms[0]);
if (requireFullQueryMatch && !fullQueryMatched) {
return { item, score: 0, matched: false };
}
let score = 0;
let matchedTermsCount = 0;
let matchedInTitle = false;
uniqueTerms.forEach((term, index) => {
const isFullQuery = index === 0;
const matched = this.checkFieldsForMatch(item, term);
if (matched) {
matchedTermsCount++;
if (matched.inTitle) {
score += isFullQuery ? 10 : 5;
matchedInTitle = true;
}
if (matched.inDesc) {
score += isFullQuery ? 8 : 4;
}
if (matched.inSection) {
score += isFullQuery ? 6 : 3;
}
if (matched.inContents) {
score += isFullQuery ? 4 : 2;
}
}
});
const matchRatio = matchedTermsCount / uniqueTerms.length;
const finalScore = score * matchRatio * (matchedInTitle ? 1.5 : 1);
return {
item,
score: finalScore,
matched: fullQueryMatched
};
})
.filter(result => result.matched)
.sort((a, b) => b.score - a.score)
.slice(0, DEFAULT_CONFIG.search.maxResults)
.map(result => result.item);
if (results.length === 0) {
this.resultsContainer.innerHTML = '<p class="mt-5">Oops! No results found.</p>';
return;
}
const searchItems = results.map((item) => {
let categories = '';
let tags = '';
if (item.categories) {
categories = item.categories.join(', ');
categories = `<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${categories}</div>`;
}
if (item.tags) {
tags = item.tags.join(', ');
tags = `<div><i class="fa fa-tag fa-fw"></i>${tags}</div>`
}
return `
<article class="px-1 px-sm-2 px-lg-4 px-xl-0">
<header>
<h2><a href="${this.escapeHtml(e.permalink)}">${this.escapeHtml(e.title)}</a></h2>
<h2><a href="${this.escapeHtml(item.permalink)}">${this.escapeHtml(item.title)}</a></h2>
<div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
${t}
${n}
${categories}
${tags}
</div>
</header>
<p>${this.escapeHtml(e.contents)}</p>
<p>${this.escapeHtml(item.contents)}</p>
</article>
`}).join("");this.resultsContainer.innerHTML=i}checkFieldsForMatch(e,t){const n={inTitle:!1,inDesc:!1,inSection:!1,inContents:!1};return DEFAULT_CONFIG.search.fields.title&&this.containsTerm(e.searchableTitle,t)&&(n.inTitle=!0),DEFAULT_CONFIG.search.fields.description&&this.containsTerm(e.searchableDesc,t)&&(n.inDesc=!0),DEFAULT_CONFIG.search.fields.section&&this.containsTerm(e.searchableSection,t)&&(n.inSection=!0),DEFAULT_CONFIG.search.fields.contents&&this.containsTerm(e.searchableContents,t)&&(n.inContents=!0),!!(n.inTitle||n.inDesc||n.inSection||n.inContents)&&n}}const search=new FastSearch({searchInput:document.getElementById("search-input"),resultsContainer:document.getElementById("search-results"),json:`/index.json`})</script></div><aside aria-label="Scroll to Top"><button id=back-to-top type=button class="btn btn-lg btn-box-shadow">
<i class="fas fa-angle-up"></i></button></aside></div><div id=mask class="d-none position-fixed w-100 h-100 z-1"></div></body></html>
`;
}).join('');
this.resultsContainer.innerHTML = searchItems;
}
checkFieldsForMatch(item, term) {
const matches = {
inTitle: false,
inDesc: false,
inSection: false,
inContents: false
};
if (DEFAULT_CONFIG.search.fields.title && this.containsTerm(item.searchableTitle, term)) {
matches.inTitle = true;
}
if (DEFAULT_CONFIG.search.fields.description && this.containsTerm(item.searchableDesc, term)) {
matches.inDesc = true;
}
if (DEFAULT_CONFIG.search.fields.section && this.containsTerm(item.searchableSection, term)) {
matches.inSection = true;
}
if (DEFAULT_CONFIG.search.fields.contents && this.containsTerm(item.searchableContents, term)) {
matches.inContents = true;
}
if (matches.inTitle || matches.inDesc || matches.inSection || matches.inContents) {
return matches;
}
return false;
}
}
const search = new FastSearch({
searchInput: document.getElementById('search-input'),
resultsContainer: document.getElementById('search-results'),
json: `\/index.json`
});
</script>
</div>
<aside aria-label="Scroll to Top">
<button id="back-to-top" type="button" class="btn btn-lg btn-box-shadow">
<i class="fas fa-angle-up"></i>
</button>
</aside>
</div>
<div id="mask" class="d-none position-fixed w-100 h-100 z-1"></div>
</body>
</html>

View File

@ -1,8 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Continuous Deployment on Comprofix</title><link>https://comprofix.com/tags/continuous-deployment/</link><description>Recent content in Continuous Deployment on Comprofix</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sat, 06 Sep 2025 13:28:05 +1000</lastBuildDate><atom:link href="https://comprofix.com/tags/continuous-deployment/index.xml" rel="self" type="application/rss+xml"/><item><title>Continuous Integration &amp; Continuous Deployment</title><link>https://comprofix.com/post/2024-09-21-websitedeployment/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/post/2024-09-21-websitedeployment/</guid><description>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href="https://docs.gitea.com/usage/actions/overview"&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.&lt;/p&gt;
&lt;h3 id="why-use-cicd" id=why-use-cicd&gt;
&lt;span class="me-2"&gt;Why use CI/CD?&lt;/span&gt;
&lt;a href="#why-use-cicd" class="anchor text-muted"&gt;&lt;i class="fas fa-hashtag"&gt;&lt;/i&gt;&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.&lt;/p&gt;</description></item></channel></rss>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Continuous Deployment on Comprofix</title>
<link>http://localhost:1313/tags/continuous-deployment/</link>
<description>Recent content in Continuous Deployment on Comprofix</description>
<generator>Hugo</generator>
<language>en</language>
<lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
<atom:link href="http://localhost:1313/tags/continuous-deployment/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Continuous Integration &amp; Continuous Deployment</title>
<link>http://localhost:1313/post/2024-09-21-websitedeployment/</link>
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
<guid>http://localhost:1313/post/2024-09-21-websitedeployment/</guid>
<description>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href=&#34;https://docs.gitea.com/usage/actions/overview&#34;&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href=&#34;https://github.com/features/actions&#34;&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.&lt;/p&gt;&#xA;&lt;h3 id=&#34;why-use-cicd&#34; id=why-use-cicd&gt;&#xA; &#xA; &lt;span class=&#34;me-2&#34;&gt;Why use CI/CD?&lt;/span&gt;&#xA; &lt;a href=&#34;#why-use-cicd&#34; class=&#34;anchor text-muted&#34;&gt;&lt;i class=&#34;fas fa-hashtag&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA; &#xA;&lt;/h3&gt;&lt;p&gt;It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.&lt;/p&gt;</description>
</item>
</channel>
</rss>

View File

@ -1,54 +1,914 @@
<!doctype html><head><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css></head><html lang=en><head><meta charset=utf-8><meta name=theme-color media="(prefers-color-scheme: light)" content="#f7f7f7"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#1b1b1e"><meta name=mobile-web-app-capable content="yes"><meta name=apple-mobile-web-app-status-bar-style content="black-translucent"><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,shrink-to-fit=no,viewport-fit=cover"><meta property="og:url" content="https://comprofix.com/tags/continuous-integration/"><meta property="og:site_name" content="Comprofix"><meta property="og:title" content="Continuous Integration"><meta property="og:locale" content="en"><meta property="og:type" content="website"><meta name=twitter:card content="summary"><meta name=twitter:title content="Continuous Integration"><meta itemprop=name content="Continuous Integration"><meta itemprop=datePublished content="2024-09-21T00:00:00+00:00"><meta itemprop=dateModified content="2025-09-06T13:28:05+10:00"><title>Continuous Integration |
Comprofix</title><link rel=apple-touch-icon sizes=180x180 href=/img/favicons/apple-touch-icon.png><link rel=icon type=image/png sizes=32x32 href=/img/favicons/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=/img/favicons/favicon-16x16.png><link rel="shortcut icon" href=/img/favicons/favicon.ico><meta name=apple-mobile-web-app-title content="Comprofix"><meta name=application-name content="Comprofix"><meta name=msapplication-TileColor content="#da532c"><meta name=msapplication-config content="/img/favicons/browserconfig.xml"><meta name=theme-color content="#ffffff"><link rel=preconnect href=https://fonts.googleapis.com><link rel=dns-prefetch href=https://fonts.googleapis.com><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=dns-prefetch href=https://fonts.gstatic.com><link rel=preconnect href=https://cdn.jsdelivr.net><link rel=dns-prefetch href=https://cdn.jsdelivr.net><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css><link rel=stylesheet href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&amp;family=Source+Sans+Pro:wght@400;600;700;900&amp;display=swap"><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css><script src=/js/modules/theme.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js></script><script defer src=/js/misc.js></script></head><body><aside aria-label=Sidebar id=sidebar class="d-flex flex-column align-items-end"><header class=profile-wrapper><a href=/ id=avatar class=rounded-circle><img src=/img/man-logo.png width=112 height=112 alt=avatar onerror='this.style.display="none"'></a>
<a class="site-title d-block" href=/>Comprofix</a><p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p></header><nav class="flex-column flex-grow-1 w-100 ps-0"><ul class=nav><li class=nav-item><a href=/ class=nav-link><i class="fa-fw fas fa-house"></i>
<span>HOME</span></a></li><li class=nav-item><a href=/categories/ class=nav-link><i class="fa-fw fas fa-stream"></i>
<span>CATEGORIES</span></a></li><li class=nav-item><a href=/tags/ class=nav-link><i class="fa-fw fas fa-tags"></i>
<span>TAGS</span></a></li><li class=nav-item><a href=/archives/ class=nav-link><i class="fa-fw fas fa-archive"></i>
<span>ARCHIVES</span></a></li><li class=nav-item><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i>
<span>ABOUT</span></a></li></ul></nav><div class="sidebar-bottom d-flex flex-wrap align-items-center w-100"><button type=button class="btn btn-link nav-link" aria-label="Switch Mode" id=mode-toggle>
<i class="fas fa-adjust"></i>
</button>
<span class=icon-border></span>
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i>
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i>
</a><a href=https://comprofix.com/index.xml aria-label=rss><i class="fas fa-rss"></i></a></div></aside><div id=main-wrapper class="d-flex justify-content-center"><div class="container d-flex flex-column px-xxl-5"><header id=topbar-wrapper class=flex-shrink-0 aria-label="Top Bar"><div id=topbar class="d-flex align-items-center justify-content-between px-lg-3 h-100"><nav id=breadcrumb aria-label=Breadcrumb><span><a href=/>Home</a>
</span><span><a href=https://comprofix.com/tags/>Tags</a></span>
<span>continuous integration</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar>
<i class="fas fa-bars fa-fw"></i></button><div id=topbar-title></div><button type=button id=search-trigger class="btn btn-link" aria-label=Search>
<i class="fas fa-search fa-fw"></i>
</button>
<search id=search class="align-items-center ms-3 ms-lg-0"><i class="fas fa-search fa-fw"></i>
<input class=form-control id=search-input type=search aria-label=search autocomplete=off placeholder=Search...>
</search><button type=button class="btn btn-link text-decoration-none" id=search-cancel>Cancel</button></div></header><div class="row flex-grow-1"><main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4"><div id=page-tag><h1 class=ps-lg-2><i class="fa fa-tag fa-fw text-muted"></i>
continuous integration
<span class="lead text-muted ps-2">1</span></h1><ul class="content ps-0"><li class="d-flex justify-content-between px-md-3"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a>
<span class="dash flex-grow-1"></span>
<time class="text-muted small text-nowrap" data-ts=1726876800 data-df=ll>%b %e, %Y</time></li></ul></div></main><aside aria-label=Panel id=panel-wrapper class="col-xl-3 ps-2 text-muted"><div class=access><section id=access-lastmod><h2 class=panel-heading>Recently Updated</h2><ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2"><li class="text-truncate lh-lg"><a href=/post/2024-09-05-resetrestart/>Reset and Restart</a></li><li class="text-truncate lh-lg"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a></li></ul></section><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div></aside></div><div class=row><div id=tail-wrapper class="col-12 col-lg-11 col-xl-9 px-md-4"><footer aria-label="Site Info" class="d-flex flex-column justify-content-center text-muted
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>©
<time>2025</time>
<a href=https://comprofix.com>Comprofix</a>.
<span data-bs-toggle=tooltip data-bs-placement=top title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author.">Some rights reserved.</span></p><p>Using the <a data-bs-toggle=tooltip data-bs-placement=top title=v1.0.2 href=https://github.com/geekifan/hugo-theme-chirpy target=_blank rel=noopener>Chirpy</a> theme for <a href=https://gohugo.io/ target=_blank rel=noopener>Hugo</a>.</p></footer></div></div><div id=search-result-wrapper class="d-flex justify-content-center d-none"><div class="col-11 content"><div id=search-hints><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div><div id=search-results class="d-flex flex-wrap justify-content-center text-muted mt-3"></div></div></div><script>const DEFAULT_CONFIG={search:{minChars:1,maxResults:5,fields:{title:!0,description:!0,section:!0,contents:!0},strictMode:!0}};class FastSearch{constructor({searchInput:e,resultsContainer:t,json:n,searchResultTemplate:s=null,noResultsText:o=null}){this.searchInput=e,this.resultsContainer=t,this.json=n,this.searchResultTemplate=s,this.noResultsText=o,this.init()}init(){this.loadSearchIndex(),this.searchInput.addEventListener("input",e=>{if(!this.searchIndex){this.resultsContainer.innerHTML='<li class="search-message">Loading search index...</li>';return}this.performSearch(this.searchInput.value)})}async loadSearchIndex(){try{const e=await fetch(this.json);if(!e.ok)throw new Error("Failed to load search index");const t=await e.json();this.searchIndex=t.map(e=>({...e,searchableTitle:e.title?.toLowerCase()||"",searchableDesc:e.desc?.toLowerCase()||"",searchableSection:e.section?.toLowerCase()||"",searchableContents:e.contents?.toLowerCase()||""}))}catch(e){console.error("Error loading search index:",e),this.resultsContainer.innerHTML='<li class="search-message">Error loading search index...</li>'}}escapeHtml(e){return e?e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;"):""}containsTerm(e,t){return!!e&&!!t&&e.includes(t)}performSearch(e){if(e=e.toLowerCase().trim(),!e||!this.searchIndex||e.length<DEFAULT_CONFIG.search.minChars){this.resultsContainer.innerHTML="";return}const s=[e,...e.split(/\s+/).filter(e=>e.length>0)],t=[...new Set(s)],o=DEFAULT_CONFIG.search.strictMode,n=this.searchIndex.map(e=>{const s=this.checkFieldsForMatch(e,t[0]);if(o&&!s)return{item:e,score:0,matched:!1};let n=0,i=0,a=!1;t.forEach((t,s)=>{const r=s===0,o=this.checkFieldsForMatch(e,t);o&&(i++,o.inTitle&&(n+=r?10:5,a=!0),o.inDesc&&(n+=r?8:4),o.inSection&&(n+=r?6:3),o.inContents&&(n+=r?4:2))});const r=i/t.length,c=n*r*(a?1.5:1);return{item:e,score:c,matched:s}}).filter(e=>e.matched).sort((e,t)=>t.score-e.score).slice(0,DEFAULT_CONFIG.search.maxResults).map(e=>e.item);if(n.length===0){this.resultsContainer.innerHTML='<p class="mt-5">Oops! No results found.</p>';return}const i=n.map(e=>{let t="",n="";return e.categories&&(t=e.categories.join(", "),t=`<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${t}</div>`),e.tags&&(n=e.tags.join(", "),n=`<div><i class="fa fa-tag fa-fw"></i>${n}</div>`),`
<!doctype html>
<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
</head>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta
name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
>
<meta property="og:url" content="http://localhost:1313/tags/continuous-integration/">
<meta property="og:site_name" content="Comprofix">
<meta property="og:title" content="Continuous Integration">
<meta property="og:locale" content="en">
<meta property="og:type" content="website">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Continuous Integration">
<meta itemprop="name" content="Continuous Integration">
<meta itemprop="datePublished" content="2024-09-21T00:00:00+00:00">
<meta itemprop="dateModified" content="2024-09-21T00:00:00+00:00">
<title>
Continuous Integration |
Comprofix
</title>
<link rel="apple-touch-icon" sizes="180x180" href="/img/favicons/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicons/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicons/favicon-16x16.png">
<link rel="shortcut icon" href="/img/favicons/favicon.ico">
<meta name="apple-mobile-web-app-title" content="Comprofix">
<meta name="application-name" content="Comprofix">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="msapplication-config" content="/img/favicons/browserconfig.xml">
<meta name="theme-color" content="#ffffff">
<link rel="preconnect" href="https://fonts.googleapis.com" >
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="dns-prefetch" href="https://fonts.gstatic.com" >
<link rel="preconnect" href="https://cdn.jsdelivr.net" >
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" >
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&amp;family=Source&#43;Sans&#43;Pro:wght@400;600;700;900&amp;display=swap">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css">
<script src="/js/modules/theme.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js"></script>
<script defer src="/js/misc.js"></script>
</head>
<body>
<aside aria-label="Sidebar" id="sidebar" class="d-flex flex-column align-items-end">
<header class="profile-wrapper">
<a href="/" id="avatar" class="rounded-circle"><img src="/img/man-logo.png" width="112" height="112" alt="avatar" onerror="this.style.display='none'"></a>
<a class="site-title d-block" href="/">Comprofix</a>
<p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p>
</header>
<nav class="flex-column flex-grow-1 w-100 ps-0">
<ul class="nav">
<li class="nav-item">
<a href="/" class="nav-link">
<i class="fa-fw fas fa-house"></i>
<span>HOME</span>
</a>
</li>
<li class="nav-item">
<a href="/categories/" class="nav-link">
<i class="fa-fw fas fa-stream"></i>
<span>CATEGORIES</span>
</a>
</li>
<li class="nav-item">
<a href="/tags/" class="nav-link">
<i class="fa-fw fas fa-tags"></i>
<span>TAGS</span>
</a>
</li>
<li class="nav-item">
<a href="/archives/" class="nav-link">
<i class="fa-fw fas fa-archive"></i>
<span>ARCHIVES</span>
</a>
</li>
<li class="nav-item">
<a href="/about/" class="nav-link">
<i class="fa-fw fas fa-info-circle"></i>
<span>ABOUT</span>
</a>
</li>
</ul>
</nav>
<div class="sidebar-bottom d-flex flex-wrap align-items-center w-100">
<button type="button" class="btn btn-link nav-link" aria-label="Switch Mode" id="mode-toggle">
<i class="fas fa-adjust"></i>
</button>
<span class="icon-border"></span>
<a
href="https://git.comprofix.com/mmckinnon"
aria-label="custom"
target="_blank" rel="noopener noreferrer"
>
<i class="fab fa-git-alt"></i>
</a>
<a
href="https://twitter.com/mckinnon81"
aria-label="twitter"
target="_blank" rel="noopener noreferrer"
>
<i class="fab fa-twitter"></i>
</a>
<a
href="http://localhost:1313/index.xml"
aria-label="rss"
>
<i class="fas fa-rss"></i>
</a>
</div>
</aside>
<div id="main-wrapper" class="d-flex justify-content-center">
<div class="container d-flex flex-column px-xxl-5">
<header id="topbar-wrapper" class="flex-shrink-0" aria-label="Top Bar">
<div id="topbar" class="d-flex align-items-center justify-content-between px-lg-3 h-100">
<nav id="breadcrumb" aria-label="Breadcrumb">
<span>
<a href="/">Home</a>
</span>
<span><a href="http://localhost:1313/tags/">Tags</a></span>
<span>continuous integration</span>
</nav>
<button type="button" id="sidebar-trigger" class="btn btn-link" aria-label="Sidebar">
<i class="fas fa-bars fa-fw"></i>
</button>
<div id="topbar-title">
</div>
<button type="button" id="search-trigger" class="btn btn-link" aria-label="Search">
<i class="fas fa-search fa-fw"></i>
</button>
<search id="search" class="align-items-center ms-3 ms-lg-0">
<i class="fas fa-search fa-fw"></i>
<input
class="form-control"
id="search-input"
type="search"
aria-label="search"
autocomplete="off"
placeholder="Search..."
>
</search>
<button type="button" class="btn btn-link text-decoration-none" id="search-cancel">Cancel</button>
</div>
</header>
<div class="row flex-grow-1">
<main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4">
<div id="page-tag">
<h1 class="ps-lg-2">
<i class="fa fa-tag fa-fw text-muted"></i>
continuous integration
<span class="lead text-muted ps-2">1</span>
</h1>
<ul class="content ps-0">
<li class="d-flex justify-content-between px-md-3">
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration &amp; Continuous Deployment</a>
<span class="dash flex-grow-1"></span>
<time
class="text-muted small text-nowrap"
data-ts="1726876800"
data-df="ll"
>
%b %e, %Y
</time>
</li>
</ul>
</div>
</main>
<aside aria-label="Panel" id="panel-wrapper" class="col-xl-3 ps-2 text-muted">
<div class="access">
<section id="access-lastmod">
<h2 class="panel-heading">Recently Updated</h2>
<ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2">
<li class="text-truncate lh-lg">
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration &amp; Continuous Deployment</a>
</li>
<li class="text-truncate lh-lg">
<a href="/post/2024-09-05-resetrestart/">Reset and Restart</a>
</li>
</ul>
</section>
<section>
<h2 class="panel-heading">Trending Tags</h2>
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
</div>
</section>
</div>
</aside>
</div>
<div class="row">
<div id="tail-wrapper" class="col-12 col-lg-11 col-xl-9 px-md-4">
<footer
aria-label="Site Info"
class="
d-flex flex-column justify-content-center text-muted
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
"
>
<p>
©
<time>2025</time>
<a href="https://comprofix.com">Comprofix</a>.
<span
data-bs-toggle="tooltip"
data-bs-placement="top"
title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author."
>Some rights reserved.</span>
</p>
<p>Using the <a
data-bs-toggle="tooltip"
data-bs-placement="top"
title="v1.0.2"
href="https://github.com/geekifan/hugo-theme-chirpy"
target="_blank"
rel="noopener"
>Chirpy</a> theme for <a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a>.
</p>
</footer>
</div>
</div>
<div id="search-result-wrapper" class="d-flex justify-content-center d-none">
<div class="col-11 content">
<div id="search-hints">
<section>
<h2 class="panel-heading">Trending Tags</h2>
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
</div>
</section>
</div>
<div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
</div>
</div>
<script>
const DEFAULT_CONFIG = {
search: {
minChars: 1,
maxResults: 5,
fields: {
title: true,
description: true,
section: true,
contents: true
},
strictMode: true
}
};
class FastSearch {
constructor({
searchInput, resultsContainer, json,
searchResultTemplate = null,
noResultsText = null,
}) {
this.searchInput = searchInput;
this.resultsContainer = resultsContainer;
this.json = json;
this.searchResultTemplate = searchResultTemplate;
this.noResultsText = noResultsText;
this.init();
}
init() {
this.loadSearchIndex();
this.searchInput.addEventListener('input', (event) => {
if (!this.searchIndex) {
this.resultsContainer.innerHTML = '<li class="search-message">Loading search index...</li>';
return;
}
this.performSearch(this.searchInput.value);
});
}
async loadSearchIndex() {
try {
const response = await fetch(this.json);
if (!response.ok) throw new Error('Failed to load search index');
const data = await response.json();
this.searchIndex = data.map(item => ({
...item,
searchableTitle: item.title?.toLowerCase() || '',
searchableDesc: item.desc?.toLowerCase() || '',
searchableSection: item.section?.toLowerCase() || '',
searchableContents: item.contents?.toLowerCase() || ''
}));
} catch (error) {
console.error('Error loading search index:', error);
this.resultsContainer.innerHTML = '<li class="search-message">Error loading search index...</li>';
}
}
escapeHtml(unsafe) {
if (!unsafe) return '';
return unsafe
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}
containsTerm(text, term) {
if (!text || !term) return false;
return text.includes(term);
}
performSearch(query) {
query = query.toLowerCase().trim();
if (!query || !this.searchIndex || query.length < DEFAULT_CONFIG.search.minChars) {
this.resultsContainer.innerHTML = '';
return;
}
const searchTerms = [
query,
...query.split(/\s+/).filter(term => term.length > 0)
];
const uniqueTerms = [...new Set(searchTerms)];
const requireFullQueryMatch = DEFAULT_CONFIG.search.strictMode;
const results = this.searchIndex
.map(item => {
const fullQueryMatched = this.checkFieldsForMatch(item, uniqueTerms[0]);
if (requireFullQueryMatch && !fullQueryMatched) {
return { item, score: 0, matched: false };
}
let score = 0;
let matchedTermsCount = 0;
let matchedInTitle = false;
uniqueTerms.forEach((term, index) => {
const isFullQuery = index === 0;
const matched = this.checkFieldsForMatch(item, term);
if (matched) {
matchedTermsCount++;
if (matched.inTitle) {
score += isFullQuery ? 10 : 5;
matchedInTitle = true;
}
if (matched.inDesc) {
score += isFullQuery ? 8 : 4;
}
if (matched.inSection) {
score += isFullQuery ? 6 : 3;
}
if (matched.inContents) {
score += isFullQuery ? 4 : 2;
}
}
});
const matchRatio = matchedTermsCount / uniqueTerms.length;
const finalScore = score * matchRatio * (matchedInTitle ? 1.5 : 1);
return {
item,
score: finalScore,
matched: fullQueryMatched
};
})
.filter(result => result.matched)
.sort((a, b) => b.score - a.score)
.slice(0, DEFAULT_CONFIG.search.maxResults)
.map(result => result.item);
if (results.length === 0) {
this.resultsContainer.innerHTML = '<p class="mt-5">Oops! No results found.</p>';
return;
}
const searchItems = results.map((item) => {
let categories = '';
let tags = '';
if (item.categories) {
categories = item.categories.join(', ');
categories = `<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${categories}</div>`;
}
if (item.tags) {
tags = item.tags.join(', ');
tags = `<div><i class="fa fa-tag fa-fw"></i>${tags}</div>`
}
return `
<article class="px-1 px-sm-2 px-lg-4 px-xl-0">
<header>
<h2><a href="${this.escapeHtml(e.permalink)}">${this.escapeHtml(e.title)}</a></h2>
<h2><a href="${this.escapeHtml(item.permalink)}">${this.escapeHtml(item.title)}</a></h2>
<div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
${t}
${n}
${categories}
${tags}
</div>
</header>
<p>${this.escapeHtml(e.contents)}</p>
<p>${this.escapeHtml(item.contents)}</p>
</article>
`}).join("");this.resultsContainer.innerHTML=i}checkFieldsForMatch(e,t){const n={inTitle:!1,inDesc:!1,inSection:!1,inContents:!1};return DEFAULT_CONFIG.search.fields.title&&this.containsTerm(e.searchableTitle,t)&&(n.inTitle=!0),DEFAULT_CONFIG.search.fields.description&&this.containsTerm(e.searchableDesc,t)&&(n.inDesc=!0),DEFAULT_CONFIG.search.fields.section&&this.containsTerm(e.searchableSection,t)&&(n.inSection=!0),DEFAULT_CONFIG.search.fields.contents&&this.containsTerm(e.searchableContents,t)&&(n.inContents=!0),!!(n.inTitle||n.inDesc||n.inSection||n.inContents)&&n}}const search=new FastSearch({searchInput:document.getElementById("search-input"),resultsContainer:document.getElementById("search-results"),json:`/index.json`})</script></div><aside aria-label="Scroll to Top"><button id=back-to-top type=button class="btn btn-lg btn-box-shadow">
<i class="fas fa-angle-up"></i></button></aside></div><div id=mask class="d-none position-fixed w-100 h-100 z-1"></div></body></html>
`;
}).join('');
this.resultsContainer.innerHTML = searchItems;
}
checkFieldsForMatch(item, term) {
const matches = {
inTitle: false,
inDesc: false,
inSection: false,
inContents: false
};
if (DEFAULT_CONFIG.search.fields.title && this.containsTerm(item.searchableTitle, term)) {
matches.inTitle = true;
}
if (DEFAULT_CONFIG.search.fields.description && this.containsTerm(item.searchableDesc, term)) {
matches.inDesc = true;
}
if (DEFAULT_CONFIG.search.fields.section && this.containsTerm(item.searchableSection, term)) {
matches.inSection = true;
}
if (DEFAULT_CONFIG.search.fields.contents && this.containsTerm(item.searchableContents, term)) {
matches.inContents = true;
}
if (matches.inTitle || matches.inDesc || matches.inSection || matches.inContents) {
return matches;
}
return false;
}
}
const search = new FastSearch({
searchInput: document.getElementById('search-input'),
resultsContainer: document.getElementById('search-results'),
json: `\/index.json`
});
</script>
</div>
<aside aria-label="Scroll to Top">
<button id="back-to-top" type="button" class="btn btn-lg btn-box-shadow">
<i class="fas fa-angle-up"></i>
</button>
</aside>
</div>
<div id="mask" class="d-none position-fixed w-100 h-100 z-1"></div>
</body>
</html>

View File

@ -1,8 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Continuous Integration on Comprofix</title><link>https://comprofix.com/tags/continuous-integration/</link><description>Recent content in Continuous Integration on Comprofix</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sat, 06 Sep 2025 13:28:05 +1000</lastBuildDate><atom:link href="https://comprofix.com/tags/continuous-integration/index.xml" rel="self" type="application/rss+xml"/><item><title>Continuous Integration &amp; Continuous Deployment</title><link>https://comprofix.com/post/2024-09-21-websitedeployment/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/post/2024-09-21-websitedeployment/</guid><description>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href="https://docs.gitea.com/usage/actions/overview"&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.&lt;/p&gt;
&lt;h3 id="why-use-cicd" id=why-use-cicd&gt;
&lt;span class="me-2"&gt;Why use CI/CD?&lt;/span&gt;
&lt;a href="#why-use-cicd" class="anchor text-muted"&gt;&lt;i class="fas fa-hashtag"&gt;&lt;/i&gt;&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.&lt;/p&gt;</description></item></channel></rss>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Continuous Integration on Comprofix</title>
<link>http://localhost:1313/tags/continuous-integration/</link>
<description>Recent content in Continuous Integration on Comprofix</description>
<generator>Hugo</generator>
<language>en</language>
<lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
<atom:link href="http://localhost:1313/tags/continuous-integration/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Continuous Integration &amp; Continuous Deployment</title>
<link>http://localhost:1313/post/2024-09-21-websitedeployment/</link>
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
<guid>http://localhost:1313/post/2024-09-21-websitedeployment/</guid>
<description>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href=&#34;https://docs.gitea.com/usage/actions/overview&#34;&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href=&#34;https://github.com/features/actions&#34;&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.&lt;/p&gt;&#xA;&lt;h3 id=&#34;why-use-cicd&#34; id=why-use-cicd&gt;&#xA; &#xA; &lt;span class=&#34;me-2&#34;&gt;Why use CI/CD?&lt;/span&gt;&#xA; &lt;a href=&#34;#why-use-cicd&#34; class=&#34;anchor text-muted&#34;&gt;&lt;i class=&#34;fas fa-hashtag&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA; &#xA;&lt;/h3&gt;&lt;p&gt;It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.&lt;/p&gt;</description>
</item>
</channel>
</rss>

View File

@ -1,54 +1,914 @@
<!doctype html><head><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css></head><html lang=en><head><meta charset=utf-8><meta name=theme-color media="(prefers-color-scheme: light)" content="#f7f7f7"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#1b1b1e"><meta name=mobile-web-app-capable content="yes"><meta name=apple-mobile-web-app-status-bar-style content="black-translucent"><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,shrink-to-fit=no,viewport-fit=cover"><meta property="og:url" content="https://comprofix.com/tags/docker/"><meta property="og:site_name" content="Comprofix"><meta property="og:title" content="Docker"><meta property="og:locale" content="en"><meta property="og:type" content="website"><meta name=twitter:card content="summary"><meta name=twitter:title content="Docker"><meta itemprop=name content="Docker"><meta itemprop=datePublished content="2024-09-21T00:00:00+00:00"><meta itemprop=dateModified content="2025-09-06T13:28:05+10:00"><title>Docker |
Comprofix</title><link rel=apple-touch-icon sizes=180x180 href=/img/favicons/apple-touch-icon.png><link rel=icon type=image/png sizes=32x32 href=/img/favicons/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=/img/favicons/favicon-16x16.png><link rel="shortcut icon" href=/img/favicons/favicon.ico><meta name=apple-mobile-web-app-title content="Comprofix"><meta name=application-name content="Comprofix"><meta name=msapplication-TileColor content="#da532c"><meta name=msapplication-config content="/img/favicons/browserconfig.xml"><meta name=theme-color content="#ffffff"><link rel=preconnect href=https://fonts.googleapis.com><link rel=dns-prefetch href=https://fonts.googleapis.com><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=dns-prefetch href=https://fonts.gstatic.com><link rel=preconnect href=https://cdn.jsdelivr.net><link rel=dns-prefetch href=https://cdn.jsdelivr.net><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css><link rel=stylesheet href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&amp;family=Source+Sans+Pro:wght@400;600;700;900&amp;display=swap"><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css><script src=/js/modules/theme.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js></script><script defer src=/js/misc.js></script></head><body><aside aria-label=Sidebar id=sidebar class="d-flex flex-column align-items-end"><header class=profile-wrapper><a href=/ id=avatar class=rounded-circle><img src=/img/man-logo.png width=112 height=112 alt=avatar onerror='this.style.display="none"'></a>
<a class="site-title d-block" href=/>Comprofix</a><p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p></header><nav class="flex-column flex-grow-1 w-100 ps-0"><ul class=nav><li class=nav-item><a href=/ class=nav-link><i class="fa-fw fas fa-house"></i>
<span>HOME</span></a></li><li class=nav-item><a href=/categories/ class=nav-link><i class="fa-fw fas fa-stream"></i>
<span>CATEGORIES</span></a></li><li class=nav-item><a href=/tags/ class=nav-link><i class="fa-fw fas fa-tags"></i>
<span>TAGS</span></a></li><li class=nav-item><a href=/archives/ class=nav-link><i class="fa-fw fas fa-archive"></i>
<span>ARCHIVES</span></a></li><li class=nav-item><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i>
<span>ABOUT</span></a></li></ul></nav><div class="sidebar-bottom d-flex flex-wrap align-items-center w-100"><button type=button class="btn btn-link nav-link" aria-label="Switch Mode" id=mode-toggle>
<i class="fas fa-adjust"></i>
</button>
<span class=icon-border></span>
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i>
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i>
</a><a href=https://comprofix.com/index.xml aria-label=rss><i class="fas fa-rss"></i></a></div></aside><div id=main-wrapper class="d-flex justify-content-center"><div class="container d-flex flex-column px-xxl-5"><header id=topbar-wrapper class=flex-shrink-0 aria-label="Top Bar"><div id=topbar class="d-flex align-items-center justify-content-between px-lg-3 h-100"><nav id=breadcrumb aria-label=Breadcrumb><span><a href=/>Home</a>
</span><span><a href=https://comprofix.com/tags/>Tags</a></span>
<span>docker</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar>
<i class="fas fa-bars fa-fw"></i></button><div id=topbar-title></div><button type=button id=search-trigger class="btn btn-link" aria-label=Search>
<i class="fas fa-search fa-fw"></i>
</button>
<search id=search class="align-items-center ms-3 ms-lg-0"><i class="fas fa-search fa-fw"></i>
<input class=form-control id=search-input type=search aria-label=search autocomplete=off placeholder=Search...>
</search><button type=button class="btn btn-link text-decoration-none" id=search-cancel>Cancel</button></div></header><div class="row flex-grow-1"><main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4"><div id=page-tag><h1 class=ps-lg-2><i class="fa fa-tag fa-fw text-muted"></i>
docker
<span class="lead text-muted ps-2">1</span></h1><ul class="content ps-0"><li class="d-flex justify-content-between px-md-3"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a>
<span class="dash flex-grow-1"></span>
<time class="text-muted small text-nowrap" data-ts=1726876800 data-df=ll>%b %e, %Y</time></li></ul></div></main><aside aria-label=Panel id=panel-wrapper class="col-xl-3 ps-2 text-muted"><div class=access><section id=access-lastmod><h2 class=panel-heading>Recently Updated</h2><ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2"><li class="text-truncate lh-lg"><a href=/post/2024-09-05-resetrestart/>Reset and Restart</a></li><li class="text-truncate lh-lg"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a></li></ul></section><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div></aside></div><div class=row><div id=tail-wrapper class="col-12 col-lg-11 col-xl-9 px-md-4"><footer aria-label="Site Info" class="d-flex flex-column justify-content-center text-muted
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>©
<time>2025</time>
<a href=https://comprofix.com>Comprofix</a>.
<span data-bs-toggle=tooltip data-bs-placement=top title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author.">Some rights reserved.</span></p><p>Using the <a data-bs-toggle=tooltip data-bs-placement=top title=v1.0.2 href=https://github.com/geekifan/hugo-theme-chirpy target=_blank rel=noopener>Chirpy</a> theme for <a href=https://gohugo.io/ target=_blank rel=noopener>Hugo</a>.</p></footer></div></div><div id=search-result-wrapper class="d-flex justify-content-center d-none"><div class="col-11 content"><div id=search-hints><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div><div id=search-results class="d-flex flex-wrap justify-content-center text-muted mt-3"></div></div></div><script>const DEFAULT_CONFIG={search:{minChars:1,maxResults:5,fields:{title:!0,description:!0,section:!0,contents:!0},strictMode:!0}};class FastSearch{constructor({searchInput:e,resultsContainer:t,json:n,searchResultTemplate:s=null,noResultsText:o=null}){this.searchInput=e,this.resultsContainer=t,this.json=n,this.searchResultTemplate=s,this.noResultsText=o,this.init()}init(){this.loadSearchIndex(),this.searchInput.addEventListener("input",e=>{if(!this.searchIndex){this.resultsContainer.innerHTML='<li class="search-message">Loading search index...</li>';return}this.performSearch(this.searchInput.value)})}async loadSearchIndex(){try{const e=await fetch(this.json);if(!e.ok)throw new Error("Failed to load search index");const t=await e.json();this.searchIndex=t.map(e=>({...e,searchableTitle:e.title?.toLowerCase()||"",searchableDesc:e.desc?.toLowerCase()||"",searchableSection:e.section?.toLowerCase()||"",searchableContents:e.contents?.toLowerCase()||""}))}catch(e){console.error("Error loading search index:",e),this.resultsContainer.innerHTML='<li class="search-message">Error loading search index...</li>'}}escapeHtml(e){return e?e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;"):""}containsTerm(e,t){return!!e&&!!t&&e.includes(t)}performSearch(e){if(e=e.toLowerCase().trim(),!e||!this.searchIndex||e.length<DEFAULT_CONFIG.search.minChars){this.resultsContainer.innerHTML="";return}const s=[e,...e.split(/\s+/).filter(e=>e.length>0)],t=[...new Set(s)],o=DEFAULT_CONFIG.search.strictMode,n=this.searchIndex.map(e=>{const s=this.checkFieldsForMatch(e,t[0]);if(o&&!s)return{item:e,score:0,matched:!1};let n=0,i=0,a=!1;t.forEach((t,s)=>{const r=s===0,o=this.checkFieldsForMatch(e,t);o&&(i++,o.inTitle&&(n+=r?10:5,a=!0),o.inDesc&&(n+=r?8:4),o.inSection&&(n+=r?6:3),o.inContents&&(n+=r?4:2))});const r=i/t.length,c=n*r*(a?1.5:1);return{item:e,score:c,matched:s}}).filter(e=>e.matched).sort((e,t)=>t.score-e.score).slice(0,DEFAULT_CONFIG.search.maxResults).map(e=>e.item);if(n.length===0){this.resultsContainer.innerHTML='<p class="mt-5">Oops! No results found.</p>';return}const i=n.map(e=>{let t="",n="";return e.categories&&(t=e.categories.join(", "),t=`<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${t}</div>`),e.tags&&(n=e.tags.join(", "),n=`<div><i class="fa fa-tag fa-fw"></i>${n}</div>`),`
<!doctype html>
<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
</head>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta
name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
>
<meta property="og:url" content="http://localhost:1313/tags/docker/">
<meta property="og:site_name" content="Comprofix">
<meta property="og:title" content="Docker">
<meta property="og:locale" content="en">
<meta property="og:type" content="website">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Docker">
<meta itemprop="name" content="Docker">
<meta itemprop="datePublished" content="2024-09-21T00:00:00+00:00">
<meta itemprop="dateModified" content="2024-09-21T00:00:00+00:00">
<title>
Docker |
Comprofix
</title>
<link rel="apple-touch-icon" sizes="180x180" href="/img/favicons/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicons/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicons/favicon-16x16.png">
<link rel="shortcut icon" href="/img/favicons/favicon.ico">
<meta name="apple-mobile-web-app-title" content="Comprofix">
<meta name="application-name" content="Comprofix">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="msapplication-config" content="/img/favicons/browserconfig.xml">
<meta name="theme-color" content="#ffffff">
<link rel="preconnect" href="https://fonts.googleapis.com" >
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="dns-prefetch" href="https://fonts.gstatic.com" >
<link rel="preconnect" href="https://cdn.jsdelivr.net" >
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" >
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&amp;family=Source&#43;Sans&#43;Pro:wght@400;600;700;900&amp;display=swap">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css">
<script src="/js/modules/theme.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js"></script>
<script defer src="/js/misc.js"></script>
</head>
<body>
<aside aria-label="Sidebar" id="sidebar" class="d-flex flex-column align-items-end">
<header class="profile-wrapper">
<a href="/" id="avatar" class="rounded-circle"><img src="/img/man-logo.png" width="112" height="112" alt="avatar" onerror="this.style.display='none'"></a>
<a class="site-title d-block" href="/">Comprofix</a>
<p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p>
</header>
<nav class="flex-column flex-grow-1 w-100 ps-0">
<ul class="nav">
<li class="nav-item">
<a href="/" class="nav-link">
<i class="fa-fw fas fa-house"></i>
<span>HOME</span>
</a>
</li>
<li class="nav-item">
<a href="/categories/" class="nav-link">
<i class="fa-fw fas fa-stream"></i>
<span>CATEGORIES</span>
</a>
</li>
<li class="nav-item">
<a href="/tags/" class="nav-link">
<i class="fa-fw fas fa-tags"></i>
<span>TAGS</span>
</a>
</li>
<li class="nav-item">
<a href="/archives/" class="nav-link">
<i class="fa-fw fas fa-archive"></i>
<span>ARCHIVES</span>
</a>
</li>
<li class="nav-item">
<a href="/about/" class="nav-link">
<i class="fa-fw fas fa-info-circle"></i>
<span>ABOUT</span>
</a>
</li>
</ul>
</nav>
<div class="sidebar-bottom d-flex flex-wrap align-items-center w-100">
<button type="button" class="btn btn-link nav-link" aria-label="Switch Mode" id="mode-toggle">
<i class="fas fa-adjust"></i>
</button>
<span class="icon-border"></span>
<a
href="https://git.comprofix.com/mmckinnon"
aria-label="custom"
target="_blank" rel="noopener noreferrer"
>
<i class="fab fa-git-alt"></i>
</a>
<a
href="https://twitter.com/mckinnon81"
aria-label="twitter"
target="_blank" rel="noopener noreferrer"
>
<i class="fab fa-twitter"></i>
</a>
<a
href="http://localhost:1313/index.xml"
aria-label="rss"
>
<i class="fas fa-rss"></i>
</a>
</div>
</aside>
<div id="main-wrapper" class="d-flex justify-content-center">
<div class="container d-flex flex-column px-xxl-5">
<header id="topbar-wrapper" class="flex-shrink-0" aria-label="Top Bar">
<div id="topbar" class="d-flex align-items-center justify-content-between px-lg-3 h-100">
<nav id="breadcrumb" aria-label="Breadcrumb">
<span>
<a href="/">Home</a>
</span>
<span><a href="http://localhost:1313/tags/">Tags</a></span>
<span>docker</span>
</nav>
<button type="button" id="sidebar-trigger" class="btn btn-link" aria-label="Sidebar">
<i class="fas fa-bars fa-fw"></i>
</button>
<div id="topbar-title">
</div>
<button type="button" id="search-trigger" class="btn btn-link" aria-label="Search">
<i class="fas fa-search fa-fw"></i>
</button>
<search id="search" class="align-items-center ms-3 ms-lg-0">
<i class="fas fa-search fa-fw"></i>
<input
class="form-control"
id="search-input"
type="search"
aria-label="search"
autocomplete="off"
placeholder="Search..."
>
</search>
<button type="button" class="btn btn-link text-decoration-none" id="search-cancel">Cancel</button>
</div>
</header>
<div class="row flex-grow-1">
<main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4">
<div id="page-tag">
<h1 class="ps-lg-2">
<i class="fa fa-tag fa-fw text-muted"></i>
docker
<span class="lead text-muted ps-2">1</span>
</h1>
<ul class="content ps-0">
<li class="d-flex justify-content-between px-md-3">
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration &amp; Continuous Deployment</a>
<span class="dash flex-grow-1"></span>
<time
class="text-muted small text-nowrap"
data-ts="1726876800"
data-df="ll"
>
%b %e, %Y
</time>
</li>
</ul>
</div>
</main>
<aside aria-label="Panel" id="panel-wrapper" class="col-xl-3 ps-2 text-muted">
<div class="access">
<section id="access-lastmod">
<h2 class="panel-heading">Recently Updated</h2>
<ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2">
<li class="text-truncate lh-lg">
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration &amp; Continuous Deployment</a>
</li>
<li class="text-truncate lh-lg">
<a href="/post/2024-09-05-resetrestart/">Reset and Restart</a>
</li>
</ul>
</section>
<section>
<h2 class="panel-heading">Trending Tags</h2>
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
</div>
</section>
</div>
</aside>
</div>
<div class="row">
<div id="tail-wrapper" class="col-12 col-lg-11 col-xl-9 px-md-4">
<footer
aria-label="Site Info"
class="
d-flex flex-column justify-content-center text-muted
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
"
>
<p>
©
<time>2025</time>
<a href="https://comprofix.com">Comprofix</a>.
<span
data-bs-toggle="tooltip"
data-bs-placement="top"
title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author."
>Some rights reserved.</span>
</p>
<p>Using the <a
data-bs-toggle="tooltip"
data-bs-placement="top"
title="v1.0.2"
href="https://github.com/geekifan/hugo-theme-chirpy"
target="_blank"
rel="noopener"
>Chirpy</a> theme for <a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a>.
</p>
</footer>
</div>
</div>
<div id="search-result-wrapper" class="d-flex justify-content-center d-none">
<div class="col-11 content">
<div id="search-hints">
<section>
<h2 class="panel-heading">Trending Tags</h2>
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
</div>
</section>
</div>
<div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
</div>
</div>
<script>
const DEFAULT_CONFIG = {
search: {
minChars: 1,
maxResults: 5,
fields: {
title: true,
description: true,
section: true,
contents: true
},
strictMode: true
}
};
class FastSearch {
constructor({
searchInput, resultsContainer, json,
searchResultTemplate = null,
noResultsText = null,
}) {
this.searchInput = searchInput;
this.resultsContainer = resultsContainer;
this.json = json;
this.searchResultTemplate = searchResultTemplate;
this.noResultsText = noResultsText;
this.init();
}
init() {
this.loadSearchIndex();
this.searchInput.addEventListener('input', (event) => {
if (!this.searchIndex) {
this.resultsContainer.innerHTML = '<li class="search-message">Loading search index...</li>';
return;
}
this.performSearch(this.searchInput.value);
});
}
async loadSearchIndex() {
try {
const response = await fetch(this.json);
if (!response.ok) throw new Error('Failed to load search index');
const data = await response.json();
this.searchIndex = data.map(item => ({
...item,
searchableTitle: item.title?.toLowerCase() || '',
searchableDesc: item.desc?.toLowerCase() || '',
searchableSection: item.section?.toLowerCase() || '',
searchableContents: item.contents?.toLowerCase() || ''
}));
} catch (error) {
console.error('Error loading search index:', error);
this.resultsContainer.innerHTML = '<li class="search-message">Error loading search index...</li>';
}
}
escapeHtml(unsafe) {
if (!unsafe) return '';
return unsafe
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}
containsTerm(text, term) {
if (!text || !term) return false;
return text.includes(term);
}
performSearch(query) {
query = query.toLowerCase().trim();
if (!query || !this.searchIndex || query.length < DEFAULT_CONFIG.search.minChars) {
this.resultsContainer.innerHTML = '';
return;
}
const searchTerms = [
query,
...query.split(/\s+/).filter(term => term.length > 0)
];
const uniqueTerms = [...new Set(searchTerms)];
const requireFullQueryMatch = DEFAULT_CONFIG.search.strictMode;
const results = this.searchIndex
.map(item => {
const fullQueryMatched = this.checkFieldsForMatch(item, uniqueTerms[0]);
if (requireFullQueryMatch && !fullQueryMatched) {
return { item, score: 0, matched: false };
}
let score = 0;
let matchedTermsCount = 0;
let matchedInTitle = false;
uniqueTerms.forEach((term, index) => {
const isFullQuery = index === 0;
const matched = this.checkFieldsForMatch(item, term);
if (matched) {
matchedTermsCount++;
if (matched.inTitle) {
score += isFullQuery ? 10 : 5;
matchedInTitle = true;
}
if (matched.inDesc) {
score += isFullQuery ? 8 : 4;
}
if (matched.inSection) {
score += isFullQuery ? 6 : 3;
}
if (matched.inContents) {
score += isFullQuery ? 4 : 2;
}
}
});
const matchRatio = matchedTermsCount / uniqueTerms.length;
const finalScore = score * matchRatio * (matchedInTitle ? 1.5 : 1);
return {
item,
score: finalScore,
matched: fullQueryMatched
};
})
.filter(result => result.matched)
.sort((a, b) => b.score - a.score)
.slice(0, DEFAULT_CONFIG.search.maxResults)
.map(result => result.item);
if (results.length === 0) {
this.resultsContainer.innerHTML = '<p class="mt-5">Oops! No results found.</p>';
return;
}
const searchItems = results.map((item) => {
let categories = '';
let tags = '';
if (item.categories) {
categories = item.categories.join(', ');
categories = `<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${categories}</div>`;
}
if (item.tags) {
tags = item.tags.join(', ');
tags = `<div><i class="fa fa-tag fa-fw"></i>${tags}</div>`
}
return `
<article class="px-1 px-sm-2 px-lg-4 px-xl-0">
<header>
<h2><a href="${this.escapeHtml(e.permalink)}">${this.escapeHtml(e.title)}</a></h2>
<h2><a href="${this.escapeHtml(item.permalink)}">${this.escapeHtml(item.title)}</a></h2>
<div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
${t}
${n}
${categories}
${tags}
</div>
</header>
<p>${this.escapeHtml(e.contents)}</p>
<p>${this.escapeHtml(item.contents)}</p>
</article>
`}).join("");this.resultsContainer.innerHTML=i}checkFieldsForMatch(e,t){const n={inTitle:!1,inDesc:!1,inSection:!1,inContents:!1};return DEFAULT_CONFIG.search.fields.title&&this.containsTerm(e.searchableTitle,t)&&(n.inTitle=!0),DEFAULT_CONFIG.search.fields.description&&this.containsTerm(e.searchableDesc,t)&&(n.inDesc=!0),DEFAULT_CONFIG.search.fields.section&&this.containsTerm(e.searchableSection,t)&&(n.inSection=!0),DEFAULT_CONFIG.search.fields.contents&&this.containsTerm(e.searchableContents,t)&&(n.inContents=!0),!!(n.inTitle||n.inDesc||n.inSection||n.inContents)&&n}}const search=new FastSearch({searchInput:document.getElementById("search-input"),resultsContainer:document.getElementById("search-results"),json:`/index.json`})</script></div><aside aria-label="Scroll to Top"><button id=back-to-top type=button class="btn btn-lg btn-box-shadow">
<i class="fas fa-angle-up"></i></button></aside></div><div id=mask class="d-none position-fixed w-100 h-100 z-1"></div></body></html>
`;
}).join('');
this.resultsContainer.innerHTML = searchItems;
}
checkFieldsForMatch(item, term) {
const matches = {
inTitle: false,
inDesc: false,
inSection: false,
inContents: false
};
if (DEFAULT_CONFIG.search.fields.title && this.containsTerm(item.searchableTitle, term)) {
matches.inTitle = true;
}
if (DEFAULT_CONFIG.search.fields.description && this.containsTerm(item.searchableDesc, term)) {
matches.inDesc = true;
}
if (DEFAULT_CONFIG.search.fields.section && this.containsTerm(item.searchableSection, term)) {
matches.inSection = true;
}
if (DEFAULT_CONFIG.search.fields.contents && this.containsTerm(item.searchableContents, term)) {
matches.inContents = true;
}
if (matches.inTitle || matches.inDesc || matches.inSection || matches.inContents) {
return matches;
}
return false;
}
}
const search = new FastSearch({
searchInput: document.getElementById('search-input'),
resultsContainer: document.getElementById('search-results'),
json: `\/index.json`
});
</script>
</div>
<aside aria-label="Scroll to Top">
<button id="back-to-top" type="button" class="btn btn-lg btn-box-shadow">
<i class="fas fa-angle-up"></i>
</button>
</aside>
</div>
<div id="mask" class="d-none position-fixed w-100 h-100 z-1"></div>
</body>
</html>

View File

@ -1,8 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Docker on Comprofix</title><link>https://comprofix.com/tags/docker/</link><description>Recent content in Docker on Comprofix</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sat, 06 Sep 2025 13:28:05 +1000</lastBuildDate><atom:link href="https://comprofix.com/tags/docker/index.xml" rel="self" type="application/rss+xml"/><item><title>Continuous Integration &amp; Continuous Deployment</title><link>https://comprofix.com/post/2024-09-21-websitedeployment/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/post/2024-09-21-websitedeployment/</guid><description>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href="https://docs.gitea.com/usage/actions/overview"&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.&lt;/p&gt;
&lt;h3 id="why-use-cicd" id=why-use-cicd&gt;
&lt;span class="me-2"&gt;Why use CI/CD?&lt;/span&gt;
&lt;a href="#why-use-cicd" class="anchor text-muted"&gt;&lt;i class="fas fa-hashtag"&gt;&lt;/i&gt;&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.&lt;/p&gt;</description></item></channel></rss>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Docker on Comprofix</title>
<link>http://localhost:1313/tags/docker/</link>
<description>Recent content in Docker on Comprofix</description>
<generator>Hugo</generator>
<language>en</language>
<lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
<atom:link href="http://localhost:1313/tags/docker/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Continuous Integration &amp; Continuous Deployment</title>
<link>http://localhost:1313/post/2024-09-21-websitedeployment/</link>
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
<guid>http://localhost:1313/post/2024-09-21-websitedeployment/</guid>
<description>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href=&#34;https://docs.gitea.com/usage/actions/overview&#34;&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href=&#34;https://github.com/features/actions&#34;&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.&lt;/p&gt;&#xA;&lt;h3 id=&#34;why-use-cicd&#34; id=why-use-cicd&gt;&#xA; &#xA; &lt;span class=&#34;me-2&#34;&gt;Why use CI/CD?&lt;/span&gt;&#xA; &lt;a href=&#34;#why-use-cicd&#34; class=&#34;anchor text-muted&#34;&gt;&lt;i class=&#34;fas fa-hashtag&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA; &#xA;&lt;/h3&gt;&lt;p&gt;It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.&lt;/p&gt;</description>
</item>
</channel>
</rss>

View File

@ -1,54 +1,914 @@
<!doctype html><head><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css></head><html lang=en><head><meta charset=utf-8><meta name=theme-color media="(prefers-color-scheme: light)" content="#f7f7f7"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#1b1b1e"><meta name=mobile-web-app-capable content="yes"><meta name=apple-mobile-web-app-status-bar-style content="black-translucent"><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,shrink-to-fit=no,viewport-fit=cover"><meta property="og:url" content="https://comprofix.com/tags/git/"><meta property="og:site_name" content="Comprofix"><meta property="og:title" content="Git"><meta property="og:locale" content="en"><meta property="og:type" content="website"><meta name=twitter:card content="summary"><meta name=twitter:title content="Git"><meta itemprop=name content="Git"><meta itemprop=datePublished content="2024-09-21T00:00:00+00:00"><meta itemprop=dateModified content="2025-09-06T13:28:05+10:00"><title>Git |
Comprofix</title><link rel=apple-touch-icon sizes=180x180 href=/img/favicons/apple-touch-icon.png><link rel=icon type=image/png sizes=32x32 href=/img/favicons/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=/img/favicons/favicon-16x16.png><link rel="shortcut icon" href=/img/favicons/favicon.ico><meta name=apple-mobile-web-app-title content="Comprofix"><meta name=application-name content="Comprofix"><meta name=msapplication-TileColor content="#da532c"><meta name=msapplication-config content="/img/favicons/browserconfig.xml"><meta name=theme-color content="#ffffff"><link rel=preconnect href=https://fonts.googleapis.com><link rel=dns-prefetch href=https://fonts.googleapis.com><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=dns-prefetch href=https://fonts.gstatic.com><link rel=preconnect href=https://cdn.jsdelivr.net><link rel=dns-prefetch href=https://cdn.jsdelivr.net><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css><link rel=stylesheet href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&amp;family=Source+Sans+Pro:wght@400;600;700;900&amp;display=swap"><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css><script src=/js/modules/theme.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js></script><script defer src=/js/misc.js></script></head><body><aside aria-label=Sidebar id=sidebar class="d-flex flex-column align-items-end"><header class=profile-wrapper><a href=/ id=avatar class=rounded-circle><img src=/img/man-logo.png width=112 height=112 alt=avatar onerror='this.style.display="none"'></a>
<a class="site-title d-block" href=/>Comprofix</a><p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p></header><nav class="flex-column flex-grow-1 w-100 ps-0"><ul class=nav><li class=nav-item><a href=/ class=nav-link><i class="fa-fw fas fa-house"></i>
<span>HOME</span></a></li><li class=nav-item><a href=/categories/ class=nav-link><i class="fa-fw fas fa-stream"></i>
<span>CATEGORIES</span></a></li><li class=nav-item><a href=/tags/ class=nav-link><i class="fa-fw fas fa-tags"></i>
<span>TAGS</span></a></li><li class=nav-item><a href=/archives/ class=nav-link><i class="fa-fw fas fa-archive"></i>
<span>ARCHIVES</span></a></li><li class=nav-item><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i>
<span>ABOUT</span></a></li></ul></nav><div class="sidebar-bottom d-flex flex-wrap align-items-center w-100"><button type=button class="btn btn-link nav-link" aria-label="Switch Mode" id=mode-toggle>
<i class="fas fa-adjust"></i>
</button>
<span class=icon-border></span>
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i>
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i>
</a><a href=https://comprofix.com/index.xml aria-label=rss><i class="fas fa-rss"></i></a></div></aside><div id=main-wrapper class="d-flex justify-content-center"><div class="container d-flex flex-column px-xxl-5"><header id=topbar-wrapper class=flex-shrink-0 aria-label="Top Bar"><div id=topbar class="d-flex align-items-center justify-content-between px-lg-3 h-100"><nav id=breadcrumb aria-label=Breadcrumb><span><a href=/>Home</a>
</span><span><a href=https://comprofix.com/tags/>Tags</a></span>
<span>git</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar>
<i class="fas fa-bars fa-fw"></i></button><div id=topbar-title></div><button type=button id=search-trigger class="btn btn-link" aria-label=Search>
<i class="fas fa-search fa-fw"></i>
</button>
<search id=search class="align-items-center ms-3 ms-lg-0"><i class="fas fa-search fa-fw"></i>
<input class=form-control id=search-input type=search aria-label=search autocomplete=off placeholder=Search...>
</search><button type=button class="btn btn-link text-decoration-none" id=search-cancel>Cancel</button></div></header><div class="row flex-grow-1"><main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4"><div id=page-tag><h1 class=ps-lg-2><i class="fa fa-tag fa-fw text-muted"></i>
git
<span class="lead text-muted ps-2">1</span></h1><ul class="content ps-0"><li class="d-flex justify-content-between px-md-3"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a>
<span class="dash flex-grow-1"></span>
<time class="text-muted small text-nowrap" data-ts=1726876800 data-df=ll>%b %e, %Y</time></li></ul></div></main><aside aria-label=Panel id=panel-wrapper class="col-xl-3 ps-2 text-muted"><div class=access><section id=access-lastmod><h2 class=panel-heading>Recently Updated</h2><ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2"><li class="text-truncate lh-lg"><a href=/post/2024-09-05-resetrestart/>Reset and Restart</a></li><li class="text-truncate lh-lg"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a></li></ul></section><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div></aside></div><div class=row><div id=tail-wrapper class="col-12 col-lg-11 col-xl-9 px-md-4"><footer aria-label="Site Info" class="d-flex flex-column justify-content-center text-muted
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>©
<time>2025</time>
<a href=https://comprofix.com>Comprofix</a>.
<span data-bs-toggle=tooltip data-bs-placement=top title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author.">Some rights reserved.</span></p><p>Using the <a data-bs-toggle=tooltip data-bs-placement=top title=v1.0.2 href=https://github.com/geekifan/hugo-theme-chirpy target=_blank rel=noopener>Chirpy</a> theme for <a href=https://gohugo.io/ target=_blank rel=noopener>Hugo</a>.</p></footer></div></div><div id=search-result-wrapper class="d-flex justify-content-center d-none"><div class="col-11 content"><div id=search-hints><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div><div id=search-results class="d-flex flex-wrap justify-content-center text-muted mt-3"></div></div></div><script>const DEFAULT_CONFIG={search:{minChars:1,maxResults:5,fields:{title:!0,description:!0,section:!0,contents:!0},strictMode:!0}};class FastSearch{constructor({searchInput:e,resultsContainer:t,json:n,searchResultTemplate:s=null,noResultsText:o=null}){this.searchInput=e,this.resultsContainer=t,this.json=n,this.searchResultTemplate=s,this.noResultsText=o,this.init()}init(){this.loadSearchIndex(),this.searchInput.addEventListener("input",e=>{if(!this.searchIndex){this.resultsContainer.innerHTML='<li class="search-message">Loading search index...</li>';return}this.performSearch(this.searchInput.value)})}async loadSearchIndex(){try{const e=await fetch(this.json);if(!e.ok)throw new Error("Failed to load search index");const t=await e.json();this.searchIndex=t.map(e=>({...e,searchableTitle:e.title?.toLowerCase()||"",searchableDesc:e.desc?.toLowerCase()||"",searchableSection:e.section?.toLowerCase()||"",searchableContents:e.contents?.toLowerCase()||""}))}catch(e){console.error("Error loading search index:",e),this.resultsContainer.innerHTML='<li class="search-message">Error loading search index...</li>'}}escapeHtml(e){return e?e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;"):""}containsTerm(e,t){return!!e&&!!t&&e.includes(t)}performSearch(e){if(e=e.toLowerCase().trim(),!e||!this.searchIndex||e.length<DEFAULT_CONFIG.search.minChars){this.resultsContainer.innerHTML="";return}const s=[e,...e.split(/\s+/).filter(e=>e.length>0)],t=[...new Set(s)],o=DEFAULT_CONFIG.search.strictMode,n=this.searchIndex.map(e=>{const s=this.checkFieldsForMatch(e,t[0]);if(o&&!s)return{item:e,score:0,matched:!1};let n=0,i=0,a=!1;t.forEach((t,s)=>{const r=s===0,o=this.checkFieldsForMatch(e,t);o&&(i++,o.inTitle&&(n+=r?10:5,a=!0),o.inDesc&&(n+=r?8:4),o.inSection&&(n+=r?6:3),o.inContents&&(n+=r?4:2))});const r=i/t.length,c=n*r*(a?1.5:1);return{item:e,score:c,matched:s}}).filter(e=>e.matched).sort((e,t)=>t.score-e.score).slice(0,DEFAULT_CONFIG.search.maxResults).map(e=>e.item);if(n.length===0){this.resultsContainer.innerHTML='<p class="mt-5">Oops! No results found.</p>';return}const i=n.map(e=>{let t="",n="";return e.categories&&(t=e.categories.join(", "),t=`<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${t}</div>`),e.tags&&(n=e.tags.join(", "),n=`<div><i class="fa fa-tag fa-fw"></i>${n}</div>`),`
<!doctype html>
<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
</head>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta
name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
>
<meta property="og:url" content="http://localhost:1313/tags/git/">
<meta property="og:site_name" content="Comprofix">
<meta property="og:title" content="Git">
<meta property="og:locale" content="en">
<meta property="og:type" content="website">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Git">
<meta itemprop="name" content="Git">
<meta itemprop="datePublished" content="2024-09-21T00:00:00+00:00">
<meta itemprop="dateModified" content="2024-09-21T00:00:00+00:00">
<title>
Git |
Comprofix
</title>
<link rel="apple-touch-icon" sizes="180x180" href="/img/favicons/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicons/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicons/favicon-16x16.png">
<link rel="shortcut icon" href="/img/favicons/favicon.ico">
<meta name="apple-mobile-web-app-title" content="Comprofix">
<meta name="application-name" content="Comprofix">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="msapplication-config" content="/img/favicons/browserconfig.xml">
<meta name="theme-color" content="#ffffff">
<link rel="preconnect" href="https://fonts.googleapis.com" >
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="dns-prefetch" href="https://fonts.gstatic.com" >
<link rel="preconnect" href="https://cdn.jsdelivr.net" >
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" >
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&amp;family=Source&#43;Sans&#43;Pro:wght@400;600;700;900&amp;display=swap">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css">
<script src="/js/modules/theme.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js"></script>
<script defer src="/js/misc.js"></script>
</head>
<body>
<aside aria-label="Sidebar" id="sidebar" class="d-flex flex-column align-items-end">
<header class="profile-wrapper">
<a href="/" id="avatar" class="rounded-circle"><img src="/img/man-logo.png" width="112" height="112" alt="avatar" onerror="this.style.display='none'"></a>
<a class="site-title d-block" href="/">Comprofix</a>
<p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p>
</header>
<nav class="flex-column flex-grow-1 w-100 ps-0">
<ul class="nav">
<li class="nav-item">
<a href="/" class="nav-link">
<i class="fa-fw fas fa-house"></i>
<span>HOME</span>
</a>
</li>
<li class="nav-item">
<a href="/categories/" class="nav-link">
<i class="fa-fw fas fa-stream"></i>
<span>CATEGORIES</span>
</a>
</li>
<li class="nav-item">
<a href="/tags/" class="nav-link">
<i class="fa-fw fas fa-tags"></i>
<span>TAGS</span>
</a>
</li>
<li class="nav-item">
<a href="/archives/" class="nav-link">
<i class="fa-fw fas fa-archive"></i>
<span>ARCHIVES</span>
</a>
</li>
<li class="nav-item">
<a href="/about/" class="nav-link">
<i class="fa-fw fas fa-info-circle"></i>
<span>ABOUT</span>
</a>
</li>
</ul>
</nav>
<div class="sidebar-bottom d-flex flex-wrap align-items-center w-100">
<button type="button" class="btn btn-link nav-link" aria-label="Switch Mode" id="mode-toggle">
<i class="fas fa-adjust"></i>
</button>
<span class="icon-border"></span>
<a
href="https://git.comprofix.com/mmckinnon"
aria-label="custom"
target="_blank" rel="noopener noreferrer"
>
<i class="fab fa-git-alt"></i>
</a>
<a
href="https://twitter.com/mckinnon81"
aria-label="twitter"
target="_blank" rel="noopener noreferrer"
>
<i class="fab fa-twitter"></i>
</a>
<a
href="http://localhost:1313/index.xml"
aria-label="rss"
>
<i class="fas fa-rss"></i>
</a>
</div>
</aside>
<div id="main-wrapper" class="d-flex justify-content-center">
<div class="container d-flex flex-column px-xxl-5">
<header id="topbar-wrapper" class="flex-shrink-0" aria-label="Top Bar">
<div id="topbar" class="d-flex align-items-center justify-content-between px-lg-3 h-100">
<nav id="breadcrumb" aria-label="Breadcrumb">
<span>
<a href="/">Home</a>
</span>
<span><a href="http://localhost:1313/tags/">Tags</a></span>
<span>git</span>
</nav>
<button type="button" id="sidebar-trigger" class="btn btn-link" aria-label="Sidebar">
<i class="fas fa-bars fa-fw"></i>
</button>
<div id="topbar-title">
</div>
<button type="button" id="search-trigger" class="btn btn-link" aria-label="Search">
<i class="fas fa-search fa-fw"></i>
</button>
<search id="search" class="align-items-center ms-3 ms-lg-0">
<i class="fas fa-search fa-fw"></i>
<input
class="form-control"
id="search-input"
type="search"
aria-label="search"
autocomplete="off"
placeholder="Search..."
>
</search>
<button type="button" class="btn btn-link text-decoration-none" id="search-cancel">Cancel</button>
</div>
</header>
<div class="row flex-grow-1">
<main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4">
<div id="page-tag">
<h1 class="ps-lg-2">
<i class="fa fa-tag fa-fw text-muted"></i>
git
<span class="lead text-muted ps-2">1</span>
</h1>
<ul class="content ps-0">
<li class="d-flex justify-content-between px-md-3">
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration &amp; Continuous Deployment</a>
<span class="dash flex-grow-1"></span>
<time
class="text-muted small text-nowrap"
data-ts="1726876800"
data-df="ll"
>
%b %e, %Y
</time>
</li>
</ul>
</div>
</main>
<aside aria-label="Panel" id="panel-wrapper" class="col-xl-3 ps-2 text-muted">
<div class="access">
<section id="access-lastmod">
<h2 class="panel-heading">Recently Updated</h2>
<ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2">
<li class="text-truncate lh-lg">
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration &amp; Continuous Deployment</a>
</li>
<li class="text-truncate lh-lg">
<a href="/post/2024-09-05-resetrestart/">Reset and Restart</a>
</li>
</ul>
</section>
<section>
<h2 class="panel-heading">Trending Tags</h2>
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
</div>
</section>
</div>
</aside>
</div>
<div class="row">
<div id="tail-wrapper" class="col-12 col-lg-11 col-xl-9 px-md-4">
<footer
aria-label="Site Info"
class="
d-flex flex-column justify-content-center text-muted
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
"
>
<p>
©
<time>2025</time>
<a href="https://comprofix.com">Comprofix</a>.
<span
data-bs-toggle="tooltip"
data-bs-placement="top"
title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author."
>Some rights reserved.</span>
</p>
<p>Using the <a
data-bs-toggle="tooltip"
data-bs-placement="top"
title="v1.0.2"
href="https://github.com/geekifan/hugo-theme-chirpy"
target="_blank"
rel="noopener"
>Chirpy</a> theme for <a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a>.
</p>
</footer>
</div>
</div>
<div id="search-result-wrapper" class="d-flex justify-content-center d-none">
<div class="col-11 content">
<div id="search-hints">
<section>
<h2 class="panel-heading">Trending Tags</h2>
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
</div>
</section>
</div>
<div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
</div>
</div>
<script>
const DEFAULT_CONFIG = {
search: {
minChars: 1,
maxResults: 5,
fields: {
title: true,
description: true,
section: true,
contents: true
},
strictMode: true
}
};
class FastSearch {
constructor({
searchInput, resultsContainer, json,
searchResultTemplate = null,
noResultsText = null,
}) {
this.searchInput = searchInput;
this.resultsContainer = resultsContainer;
this.json = json;
this.searchResultTemplate = searchResultTemplate;
this.noResultsText = noResultsText;
this.init();
}
init() {
this.loadSearchIndex();
this.searchInput.addEventListener('input', (event) => {
if (!this.searchIndex) {
this.resultsContainer.innerHTML = '<li class="search-message">Loading search index...</li>';
return;
}
this.performSearch(this.searchInput.value);
});
}
async loadSearchIndex() {
try {
const response = await fetch(this.json);
if (!response.ok) throw new Error('Failed to load search index');
const data = await response.json();
this.searchIndex = data.map(item => ({
...item,
searchableTitle: item.title?.toLowerCase() || '',
searchableDesc: item.desc?.toLowerCase() || '',
searchableSection: item.section?.toLowerCase() || '',
searchableContents: item.contents?.toLowerCase() || ''
}));
} catch (error) {
console.error('Error loading search index:', error);
this.resultsContainer.innerHTML = '<li class="search-message">Error loading search index...</li>';
}
}
escapeHtml(unsafe) {
if (!unsafe) return '';
return unsafe
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}
containsTerm(text, term) {
if (!text || !term) return false;
return text.includes(term);
}
performSearch(query) {
query = query.toLowerCase().trim();
if (!query || !this.searchIndex || query.length < DEFAULT_CONFIG.search.minChars) {
this.resultsContainer.innerHTML = '';
return;
}
const searchTerms = [
query,
...query.split(/\s+/).filter(term => term.length > 0)
];
const uniqueTerms = [...new Set(searchTerms)];
const requireFullQueryMatch = DEFAULT_CONFIG.search.strictMode;
const results = this.searchIndex
.map(item => {
const fullQueryMatched = this.checkFieldsForMatch(item, uniqueTerms[0]);
if (requireFullQueryMatch && !fullQueryMatched) {
return { item, score: 0, matched: false };
}
let score = 0;
let matchedTermsCount = 0;
let matchedInTitle = false;
uniqueTerms.forEach((term, index) => {
const isFullQuery = index === 0;
const matched = this.checkFieldsForMatch(item, term);
if (matched) {
matchedTermsCount++;
if (matched.inTitle) {
score += isFullQuery ? 10 : 5;
matchedInTitle = true;
}
if (matched.inDesc) {
score += isFullQuery ? 8 : 4;
}
if (matched.inSection) {
score += isFullQuery ? 6 : 3;
}
if (matched.inContents) {
score += isFullQuery ? 4 : 2;
}
}
});
const matchRatio = matchedTermsCount / uniqueTerms.length;
const finalScore = score * matchRatio * (matchedInTitle ? 1.5 : 1);
return {
item,
score: finalScore,
matched: fullQueryMatched
};
})
.filter(result => result.matched)
.sort((a, b) => b.score - a.score)
.slice(0, DEFAULT_CONFIG.search.maxResults)
.map(result => result.item);
if (results.length === 0) {
this.resultsContainer.innerHTML = '<p class="mt-5">Oops! No results found.</p>';
return;
}
const searchItems = results.map((item) => {
let categories = '';
let tags = '';
if (item.categories) {
categories = item.categories.join(', ');
categories = `<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${categories}</div>`;
}
if (item.tags) {
tags = item.tags.join(', ');
tags = `<div><i class="fa fa-tag fa-fw"></i>${tags}</div>`
}
return `
<article class="px-1 px-sm-2 px-lg-4 px-xl-0">
<header>
<h2><a href="${this.escapeHtml(e.permalink)}">${this.escapeHtml(e.title)}</a></h2>
<h2><a href="${this.escapeHtml(item.permalink)}">${this.escapeHtml(item.title)}</a></h2>
<div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
${t}
${n}
${categories}
${tags}
</div>
</header>
<p>${this.escapeHtml(e.contents)}</p>
<p>${this.escapeHtml(item.contents)}</p>
</article>
`}).join("");this.resultsContainer.innerHTML=i}checkFieldsForMatch(e,t){const n={inTitle:!1,inDesc:!1,inSection:!1,inContents:!1};return DEFAULT_CONFIG.search.fields.title&&this.containsTerm(e.searchableTitle,t)&&(n.inTitle=!0),DEFAULT_CONFIG.search.fields.description&&this.containsTerm(e.searchableDesc,t)&&(n.inDesc=!0),DEFAULT_CONFIG.search.fields.section&&this.containsTerm(e.searchableSection,t)&&(n.inSection=!0),DEFAULT_CONFIG.search.fields.contents&&this.containsTerm(e.searchableContents,t)&&(n.inContents=!0),!!(n.inTitle||n.inDesc||n.inSection||n.inContents)&&n}}const search=new FastSearch({searchInput:document.getElementById("search-input"),resultsContainer:document.getElementById("search-results"),json:`/index.json`})</script></div><aside aria-label="Scroll to Top"><button id=back-to-top type=button class="btn btn-lg btn-box-shadow">
<i class="fas fa-angle-up"></i></button></aside></div><div id=mask class="d-none position-fixed w-100 h-100 z-1"></div></body></html>
`;
}).join('');
this.resultsContainer.innerHTML = searchItems;
}
checkFieldsForMatch(item, term) {
const matches = {
inTitle: false,
inDesc: false,
inSection: false,
inContents: false
};
if (DEFAULT_CONFIG.search.fields.title && this.containsTerm(item.searchableTitle, term)) {
matches.inTitle = true;
}
if (DEFAULT_CONFIG.search.fields.description && this.containsTerm(item.searchableDesc, term)) {
matches.inDesc = true;
}
if (DEFAULT_CONFIG.search.fields.section && this.containsTerm(item.searchableSection, term)) {
matches.inSection = true;
}
if (DEFAULT_CONFIG.search.fields.contents && this.containsTerm(item.searchableContents, term)) {
matches.inContents = true;
}
if (matches.inTitle || matches.inDesc || matches.inSection || matches.inContents) {
return matches;
}
return false;
}
}
const search = new FastSearch({
searchInput: document.getElementById('search-input'),
resultsContainer: document.getElementById('search-results'),
json: `\/index.json`
});
</script>
</div>
<aside aria-label="Scroll to Top">
<button id="back-to-top" type="button" class="btn btn-lg btn-box-shadow">
<i class="fas fa-angle-up"></i>
</button>
</aside>
</div>
<div id="mask" class="d-none position-fixed w-100 h-100 z-1"></div>
</body>
</html>

View File

@ -1,8 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Git on Comprofix</title><link>https://comprofix.com/tags/git/</link><description>Recent content in Git on Comprofix</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sat, 06 Sep 2025 13:28:05 +1000</lastBuildDate><atom:link href="https://comprofix.com/tags/git/index.xml" rel="self" type="application/rss+xml"/><item><title>Continuous Integration &amp; Continuous Deployment</title><link>https://comprofix.com/post/2024-09-21-websitedeployment/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/post/2024-09-21-websitedeployment/</guid><description>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href="https://docs.gitea.com/usage/actions/overview"&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.&lt;/p&gt;
&lt;h3 id="why-use-cicd" id=why-use-cicd&gt;
&lt;span class="me-2"&gt;Why use CI/CD?&lt;/span&gt;
&lt;a href="#why-use-cicd" class="anchor text-muted"&gt;&lt;i class="fas fa-hashtag"&gt;&lt;/i&gt;&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.&lt;/p&gt;</description></item></channel></rss>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Git on Comprofix</title>
<link>http://localhost:1313/tags/git/</link>
<description>Recent content in Git on Comprofix</description>
<generator>Hugo</generator>
<language>en</language>
<lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
<atom:link href="http://localhost:1313/tags/git/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Continuous Integration &amp; Continuous Deployment</title>
<link>http://localhost:1313/post/2024-09-21-websitedeployment/</link>
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
<guid>http://localhost:1313/post/2024-09-21-websitedeployment/</guid>
<description>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href=&#34;https://docs.gitea.com/usage/actions/overview&#34;&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href=&#34;https://github.com/features/actions&#34;&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.&lt;/p&gt;&#xA;&lt;h3 id=&#34;why-use-cicd&#34; id=why-use-cicd&gt;&#xA; &#xA; &lt;span class=&#34;me-2&#34;&gt;Why use CI/CD?&lt;/span&gt;&#xA; &lt;a href=&#34;#why-use-cicd&#34; class=&#34;anchor text-muted&#34;&gt;&lt;i class=&#34;fas fa-hashtag&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA; &#xA;&lt;/h3&gt;&lt;p&gt;It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.&lt;/p&gt;</description>
</item>
</channel>
</rss>

View File

@ -1,56 +1,931 @@
<!doctype html><head><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css></head><html lang=en><head><meta charset=utf-8><meta name=theme-color media="(prefers-color-scheme: light)" content="#f7f7f7"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#1b1b1e"><meta name=mobile-web-app-capable content="yes"><meta name=apple-mobile-web-app-status-bar-style content="black-translucent"><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,shrink-to-fit=no,viewport-fit=cover"><meta property="og:url" content="https://comprofix.com/tags/homelab/"><meta property="og:site_name" content="Comprofix"><meta property="og:title" content="Homelab"><meta property="og:locale" content="en"><meta property="og:type" content="website"><meta name=twitter:card content="summary"><meta name=twitter:title content="Homelab"><meta itemprop=name content="Homelab"><meta itemprop=datePublished content="2024-09-21T00:00:00+00:00"><meta itemprop=dateModified content="2025-09-06T13:28:05+10:00"><title>Homelab |
Comprofix</title><link rel=apple-touch-icon sizes=180x180 href=/img/favicons/apple-touch-icon.png><link rel=icon type=image/png sizes=32x32 href=/img/favicons/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=/img/favicons/favicon-16x16.png><link rel="shortcut icon" href=/img/favicons/favicon.ico><meta name=apple-mobile-web-app-title content="Comprofix"><meta name=application-name content="Comprofix"><meta name=msapplication-TileColor content="#da532c"><meta name=msapplication-config content="/img/favicons/browserconfig.xml"><meta name=theme-color content="#ffffff"><link rel=preconnect href=https://fonts.googleapis.com><link rel=dns-prefetch href=https://fonts.googleapis.com><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=dns-prefetch href=https://fonts.gstatic.com><link rel=preconnect href=https://cdn.jsdelivr.net><link rel=dns-prefetch href=https://cdn.jsdelivr.net><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css><link rel=stylesheet href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&amp;family=Source+Sans+Pro:wght@400;600;700;900&amp;display=swap"><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css><script src=/js/modules/theme.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js></script><script defer src=/js/misc.js></script></head><body><aside aria-label=Sidebar id=sidebar class="d-flex flex-column align-items-end"><header class=profile-wrapper><a href=/ id=avatar class=rounded-circle><img src=/img/man-logo.png width=112 height=112 alt=avatar onerror='this.style.display="none"'></a>
<a class="site-title d-block" href=/>Comprofix</a><p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p></header><nav class="flex-column flex-grow-1 w-100 ps-0"><ul class=nav><li class=nav-item><a href=/ class=nav-link><i class="fa-fw fas fa-house"></i>
<span>HOME</span></a></li><li class=nav-item><a href=/categories/ class=nav-link><i class="fa-fw fas fa-stream"></i>
<span>CATEGORIES</span></a></li><li class=nav-item><a href=/tags/ class=nav-link><i class="fa-fw fas fa-tags"></i>
<span>TAGS</span></a></li><li class=nav-item><a href=/archives/ class=nav-link><i class="fa-fw fas fa-archive"></i>
<span>ARCHIVES</span></a></li><li class=nav-item><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i>
<span>ABOUT</span></a></li></ul></nav><div class="sidebar-bottom d-flex flex-wrap align-items-center w-100"><button type=button class="btn btn-link nav-link" aria-label="Switch Mode" id=mode-toggle>
<i class="fas fa-adjust"></i>
</button>
<span class=icon-border></span>
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i>
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i>
</a><a href=https://comprofix.com/index.xml aria-label=rss><i class="fas fa-rss"></i></a></div></aside><div id=main-wrapper class="d-flex justify-content-center"><div class="container d-flex flex-column px-xxl-5"><header id=topbar-wrapper class=flex-shrink-0 aria-label="Top Bar"><div id=topbar class="d-flex align-items-center justify-content-between px-lg-3 h-100"><nav id=breadcrumb aria-label=Breadcrumb><span><a href=/>Home</a>
</span><span><a href=https://comprofix.com/tags/>Tags</a></span>
<span>homelab</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar>
<i class="fas fa-bars fa-fw"></i></button><div id=topbar-title></div><button type=button id=search-trigger class="btn btn-link" aria-label=Search>
<i class="fas fa-search fa-fw"></i>
</button>
<search id=search class="align-items-center ms-3 ms-lg-0"><i class="fas fa-search fa-fw"></i>
<input class=form-control id=search-input type=search aria-label=search autocomplete=off placeholder=Search...>
</search><button type=button class="btn btn-link text-decoration-none" id=search-cancel>Cancel</button></div></header><div class="row flex-grow-1"><main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4"><div id=page-tag><h1 class=ps-lg-2><i class="fa fa-tag fa-fw text-muted"></i>
homelab
<span class="lead text-muted ps-2">2</span></h1><ul class="content ps-0"><li class="d-flex justify-content-between px-md-3"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a>
<span class="dash flex-grow-1"></span>
<time class="text-muted small text-nowrap" data-ts=1726876800 data-df=ll>%b %e, %Y</time></li><li class="d-flex justify-content-between px-md-3"><a href=/post/2024-09-05-resetrestart/>Reset and Restart</a>
<span class="dash flex-grow-1"></span>
<time class="text-muted small text-nowrap" data-ts=1725494400 data-df=ll>%b %e, %Y</time></li></ul></div></main><aside aria-label=Panel id=panel-wrapper class="col-xl-3 ps-2 text-muted"><div class=access><section id=access-lastmod><h2 class=panel-heading>Recently Updated</h2><ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2"><li class="text-truncate lh-lg"><a href=/post/2024-09-05-resetrestart/>Reset and Restart</a></li><li class="text-truncate lh-lg"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a></li></ul></section><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div></aside></div><div class=row><div id=tail-wrapper class="col-12 col-lg-11 col-xl-9 px-md-4"><footer aria-label="Site Info" class="d-flex flex-column justify-content-center text-muted
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>©
<time>2025</time>
<a href=https://comprofix.com>Comprofix</a>.
<span data-bs-toggle=tooltip data-bs-placement=top title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author.">Some rights reserved.</span></p><p>Using the <a data-bs-toggle=tooltip data-bs-placement=top title=v1.0.2 href=https://github.com/geekifan/hugo-theme-chirpy target=_blank rel=noopener>Chirpy</a> theme for <a href=https://gohugo.io/ target=_blank rel=noopener>Hugo</a>.</p></footer></div></div><div id=search-result-wrapper class="d-flex justify-content-center d-none"><div class="col-11 content"><div id=search-hints><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div><div id=search-results class="d-flex flex-wrap justify-content-center text-muted mt-3"></div></div></div><script>const DEFAULT_CONFIG={search:{minChars:1,maxResults:5,fields:{title:!0,description:!0,section:!0,contents:!0},strictMode:!0}};class FastSearch{constructor({searchInput:e,resultsContainer:t,json:n,searchResultTemplate:s=null,noResultsText:o=null}){this.searchInput=e,this.resultsContainer=t,this.json=n,this.searchResultTemplate=s,this.noResultsText=o,this.init()}init(){this.loadSearchIndex(),this.searchInput.addEventListener("input",e=>{if(!this.searchIndex){this.resultsContainer.innerHTML='<li class="search-message">Loading search index...</li>';return}this.performSearch(this.searchInput.value)})}async loadSearchIndex(){try{const e=await fetch(this.json);if(!e.ok)throw new Error("Failed to load search index");const t=await e.json();this.searchIndex=t.map(e=>({...e,searchableTitle:e.title?.toLowerCase()||"",searchableDesc:e.desc?.toLowerCase()||"",searchableSection:e.section?.toLowerCase()||"",searchableContents:e.contents?.toLowerCase()||""}))}catch(e){console.error("Error loading search index:",e),this.resultsContainer.innerHTML='<li class="search-message">Error loading search index...</li>'}}escapeHtml(e){return e?e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;"):""}containsTerm(e,t){return!!e&&!!t&&e.includes(t)}performSearch(e){if(e=e.toLowerCase().trim(),!e||!this.searchIndex||e.length<DEFAULT_CONFIG.search.minChars){this.resultsContainer.innerHTML="";return}const s=[e,...e.split(/\s+/).filter(e=>e.length>0)],t=[...new Set(s)],o=DEFAULT_CONFIG.search.strictMode,n=this.searchIndex.map(e=>{const s=this.checkFieldsForMatch(e,t[0]);if(o&&!s)return{item:e,score:0,matched:!1};let n=0,i=0,a=!1;t.forEach((t,s)=>{const r=s===0,o=this.checkFieldsForMatch(e,t);o&&(i++,o.inTitle&&(n+=r?10:5,a=!0),o.inDesc&&(n+=r?8:4),o.inSection&&(n+=r?6:3),o.inContents&&(n+=r?4:2))});const r=i/t.length,c=n*r*(a?1.5:1);return{item:e,score:c,matched:s}}).filter(e=>e.matched).sort((e,t)=>t.score-e.score).slice(0,DEFAULT_CONFIG.search.maxResults).map(e=>e.item);if(n.length===0){this.resultsContainer.innerHTML='<p class="mt-5">Oops! No results found.</p>';return}const i=n.map(e=>{let t="",n="";return e.categories&&(t=e.categories.join(", "),t=`<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${t}</div>`),e.tags&&(n=e.tags.join(", "),n=`<div><i class="fa fa-tag fa-fw"></i>${n}</div>`),`
<!doctype html>
<head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
</head>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta
name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
>
<meta property="og:url" content="http://localhost:1313/tags/homelab/">
<meta property="og:site_name" content="Comprofix">
<meta property="og:title" content="Homelab">
<meta property="og:locale" content="en">
<meta property="og:type" content="website">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Homelab">
<meta itemprop="name" content="Homelab">
<meta itemprop="datePublished" content="2024-09-21T00:00:00+00:00">
<meta itemprop="dateModified" content="2024-09-21T00:00:00+00:00">
<title>
Homelab |
Comprofix
</title>
<link rel="apple-touch-icon" sizes="180x180" href="/img/favicons/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicons/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicons/favicon-16x16.png">
<link rel="shortcut icon" href="/img/favicons/favicon.ico">
<meta name="apple-mobile-web-app-title" content="Comprofix">
<meta name="application-name" content="Comprofix">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="msapplication-config" content="/img/favicons/browserconfig.xml">
<meta name="theme-color" content="#ffffff">
<link rel="preconnect" href="https://fonts.googleapis.com" >
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="dns-prefetch" href="https://fonts.gstatic.com" >
<link rel="preconnect" href="https://cdn.jsdelivr.net" >
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" >
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&amp;family=Source&#43;Sans&#43;Pro:wght@400;600;700;900&amp;display=swap">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css">
<script src="/js/modules/theme.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js"></script>
<script defer src="/js/misc.js"></script>
</head>
<body>
<aside aria-label="Sidebar" id="sidebar" class="d-flex flex-column align-items-end">
<header class="profile-wrapper">
<a href="/" id="avatar" class="rounded-circle"><img src="/img/man-logo.png" width="112" height="112" alt="avatar" onerror="this.style.display='none'"></a>
<a class="site-title d-block" href="/">Comprofix</a>
<p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p>
</header>
<nav class="flex-column flex-grow-1 w-100 ps-0">
<ul class="nav">
<li class="nav-item">
<a href="/" class="nav-link">
<i class="fa-fw fas fa-house"></i>
<span>HOME</span>
</a>
</li>
<li class="nav-item">
<a href="/categories/" class="nav-link">
<i class="fa-fw fas fa-stream"></i>
<span>CATEGORIES</span>
</a>
</li>
<li class="nav-item">
<a href="/tags/" class="nav-link">
<i class="fa-fw fas fa-tags"></i>
<span>TAGS</span>
</a>
</li>
<li class="nav-item">
<a href="/archives/" class="nav-link">
<i class="fa-fw fas fa-archive"></i>
<span>ARCHIVES</span>
</a>
</li>
<li class="nav-item">
<a href="/about/" class="nav-link">
<i class="fa-fw fas fa-info-circle"></i>
<span>ABOUT</span>
</a>
</li>
</ul>
</nav>
<div class="sidebar-bottom d-flex flex-wrap align-items-center w-100">
<button type="button" class="btn btn-link nav-link" aria-label="Switch Mode" id="mode-toggle">
<i class="fas fa-adjust"></i>
</button>
<span class="icon-border"></span>
<a
href="https://git.comprofix.com/mmckinnon"
aria-label="custom"
target="_blank" rel="noopener noreferrer"
>
<i class="fab fa-git-alt"></i>
</a>
<a
href="https://twitter.com/mckinnon81"
aria-label="twitter"
target="_blank" rel="noopener noreferrer"
>
<i class="fab fa-twitter"></i>
</a>
<a
href="http://localhost:1313/index.xml"
aria-label="rss"
>
<i class="fas fa-rss"></i>
</a>
</div>
</aside>
<div id="main-wrapper" class="d-flex justify-content-center">
<div class="container d-flex flex-column px-xxl-5">
<header id="topbar-wrapper" class="flex-shrink-0" aria-label="Top Bar">
<div id="topbar" class="d-flex align-items-center justify-content-between px-lg-3 h-100">
<nav id="breadcrumb" aria-label="Breadcrumb">
<span>
<a href="/">Home</a>
</span>
<span><a href="http://localhost:1313/tags/">Tags</a></span>
<span>homelab</span>
</nav>
<button type="button" id="sidebar-trigger" class="btn btn-link" aria-label="Sidebar">
<i class="fas fa-bars fa-fw"></i>
</button>
<div id="topbar-title">
</div>
<button type="button" id="search-trigger" class="btn btn-link" aria-label="Search">
<i class="fas fa-search fa-fw"></i>
</button>
<search id="search" class="align-items-center ms-3 ms-lg-0">
<i class="fas fa-search fa-fw"></i>
<input
class="form-control"
id="search-input"
type="search"
aria-label="search"
autocomplete="off"
placeholder="Search..."
>
</search>
<button type="button" class="btn btn-link text-decoration-none" id="search-cancel">Cancel</button>
</div>
</header>
<div class="row flex-grow-1">
<main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4">
<div id="page-tag">
<h1 class="ps-lg-2">
<i class="fa fa-tag fa-fw text-muted"></i>
homelab
<span class="lead text-muted ps-2">2</span>
</h1>
<ul class="content ps-0">
<li class="d-flex justify-content-between px-md-3">
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration &amp; Continuous Deployment</a>
<span class="dash flex-grow-1"></span>
<time
class="text-muted small text-nowrap"
data-ts="1726876800"
data-df="ll"
>
%b %e, %Y
</time>
</li>
<li class="d-flex justify-content-between px-md-3">
<a href="/post/2024-09-05-resetrestart/">Reset and Restart</a>
<span class="dash flex-grow-1"></span>
<time
class="text-muted small text-nowrap"
data-ts="1725494400"
data-df="ll"
>
%b %e, %Y
</time>
</li>
</ul>
</div>
</main>
<aside aria-label="Panel" id="panel-wrapper" class="col-xl-3 ps-2 text-muted">
<div class="access">
<section id="access-lastmod">
<h2 class="panel-heading">Recently Updated</h2>
<ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2">
<li class="text-truncate lh-lg">
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration &amp; Continuous Deployment</a>
</li>
<li class="text-truncate lh-lg">
<a href="/post/2024-09-05-resetrestart/">Reset and Restart</a>
</li>
</ul>
</section>
<section>
<h2 class="panel-heading">Trending Tags</h2>
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
</div>
</section>
</div>
</aside>
</div>
<div class="row">
<div id="tail-wrapper" class="col-12 col-lg-11 col-xl-9 px-md-4">
<footer
aria-label="Site Info"
class="
d-flex flex-column justify-content-center text-muted
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
"
>
<p>
©
<time>2025</time>
<a href="https://comprofix.com">Comprofix</a>.
<span
data-bs-toggle="tooltip"
data-bs-placement="top"
title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author."
>Some rights reserved.</span>
</p>
<p>Using the <a
data-bs-toggle="tooltip"
data-bs-placement="top"
title="v1.0.2"
href="https://github.com/geekifan/hugo-theme-chirpy"
target="_blank"
rel="noopener"
>Chirpy</a> theme for <a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a>.
</p>
</footer>
</div>
</div>
<div id="search-result-wrapper" class="d-flex justify-content-center d-none">
<div class="col-11 content">
<div id="search-hints">
<section>
<h2 class="panel-heading">Trending Tags</h2>
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
</div>
</section>
</div>
<div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
</div>
</div>
<script>
const DEFAULT_CONFIG = {
search: {
minChars: 1,
maxResults: 5,
fields: {
title: true,
description: true,
section: true,
contents: true
},
strictMode: true
}
};
class FastSearch {
constructor({
searchInput, resultsContainer, json,
searchResultTemplate = null,
noResultsText = null,
}) {
this.searchInput = searchInput;
this.resultsContainer = resultsContainer;
this.json = json;
this.searchResultTemplate = searchResultTemplate;
this.noResultsText = noResultsText;
this.init();
}
init() {
this.loadSearchIndex();
this.searchInput.addEventListener('input', (event) => {
if (!this.searchIndex) {
this.resultsContainer.innerHTML = '<li class="search-message">Loading search index...</li>';
return;
}
this.performSearch(this.searchInput.value);
});
}
async loadSearchIndex() {
try {
const response = await fetch(this.json);
if (!response.ok) throw new Error('Failed to load search index');
const data = await response.json();
this.searchIndex = data.map(item => ({
...item,
searchableTitle: item.title?.toLowerCase() || '',
searchableDesc: item.desc?.toLowerCase() || '',
searchableSection: item.section?.toLowerCase() || '',
searchableContents: item.contents?.toLowerCase() || ''
}));
} catch (error) {
console.error('Error loading search index:', error);
this.resultsContainer.innerHTML = '<li class="search-message">Error loading search index...</li>';
}
}
escapeHtml(unsafe) {
if (!unsafe) return '';
return unsafe
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}
containsTerm(text, term) {
if (!text || !term) return false;
return text.includes(term);
}
performSearch(query) {
query = query.toLowerCase().trim();
if (!query || !this.searchIndex || query.length < DEFAULT_CONFIG.search.minChars) {
this.resultsContainer.innerHTML = '';
return;
}
const searchTerms = [
query,
...query.split(/\s+/).filter(term => term.length > 0)
];
const uniqueTerms = [...new Set(searchTerms)];
const requireFullQueryMatch = DEFAULT_CONFIG.search.strictMode;
const results = this.searchIndex
.map(item => {
const fullQueryMatched = this.checkFieldsForMatch(item, uniqueTerms[0]);
if (requireFullQueryMatch && !fullQueryMatched) {
return { item, score: 0, matched: false };
}
let score = 0;
let matchedTermsCount = 0;
let matchedInTitle = false;
uniqueTerms.forEach((term, index) => {
const isFullQuery = index === 0;
const matched = this.checkFieldsForMatch(item, term);
if (matched) {
matchedTermsCount++;
if (matched.inTitle) {
score += isFullQuery ? 10 : 5;
matchedInTitle = true;
}
if (matched.inDesc) {
score += isFullQuery ? 8 : 4;
}
if (matched.inSection) {
score += isFullQuery ? 6 : 3;
}
if (matched.inContents) {
score += isFullQuery ? 4 : 2;
}
}
});
const matchRatio = matchedTermsCount / uniqueTerms.length;
const finalScore = score * matchRatio * (matchedInTitle ? 1.5 : 1);
return {
item,
score: finalScore,
matched: fullQueryMatched
};
})
.filter(result => result.matched)
.sort((a, b) => b.score - a.score)
.slice(0, DEFAULT_CONFIG.search.maxResults)
.map(result => result.item);
if (results.length === 0) {
this.resultsContainer.innerHTML = '<p class="mt-5">Oops! No results found.</p>';
return;
}
const searchItems = results.map((item) => {
let categories = '';
let tags = '';
if (item.categories) {
categories = item.categories.join(', ');
categories = `<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${categories}</div>`;
}
if (item.tags) {
tags = item.tags.join(', ');
tags = `<div><i class="fa fa-tag fa-fw"></i>${tags}</div>`
}
return `
<article class="px-1 px-sm-2 px-lg-4 px-xl-0">
<header>
<h2><a href="${this.escapeHtml(e.permalink)}">${this.escapeHtml(e.title)}</a></h2>
<h2><a href="${this.escapeHtml(item.permalink)}">${this.escapeHtml(item.title)}</a></h2>
<div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
${t}
${n}
${categories}
${tags}
</div>
</header>
<p>${this.escapeHtml(e.contents)}</p>
<p>${this.escapeHtml(item.contents)}</p>
</article>
`}).join("");this.resultsContainer.innerHTML=i}checkFieldsForMatch(e,t){const n={inTitle:!1,inDesc:!1,inSection:!1,inContents:!1};return DEFAULT_CONFIG.search.fields.title&&this.containsTerm(e.searchableTitle,t)&&(n.inTitle=!0),DEFAULT_CONFIG.search.fields.description&&this.containsTerm(e.searchableDesc,t)&&(n.inDesc=!0),DEFAULT_CONFIG.search.fields.section&&this.containsTerm(e.searchableSection,t)&&(n.inSection=!0),DEFAULT_CONFIG.search.fields.contents&&this.containsTerm(e.searchableContents,t)&&(n.inContents=!0),!!(n.inTitle||n.inDesc||n.inSection||n.inContents)&&n}}const search=new FastSearch({searchInput:document.getElementById("search-input"),resultsContainer:document.getElementById("search-results"),json:`/index.json`})</script></div><aside aria-label="Scroll to Top"><button id=back-to-top type=button class="btn btn-lg btn-box-shadow">
<i class="fas fa-angle-up"></i></button></aside></div><div id=mask class="d-none position-fixed w-100 h-100 z-1"></div></body></html>
`;
}).join('');
this.resultsContainer.innerHTML = searchItems;
}
checkFieldsForMatch(item, term) {
const matches = {
inTitle: false,
inDesc: false,
inSection: false,
inContents: false
};
if (DEFAULT_CONFIG.search.fields.title && this.containsTerm(item.searchableTitle, term)) {
matches.inTitle = true;
}
if (DEFAULT_CONFIG.search.fields.description && this.containsTerm(item.searchableDesc, term)) {
matches.inDesc = true;
}
if (DEFAULT_CONFIG.search.fields.section && this.containsTerm(item.searchableSection, term)) {
matches.inSection = true;
}
if (DEFAULT_CONFIG.search.fields.contents && this.containsTerm(item.searchableContents, term)) {
matches.inContents = true;
}
if (matches.inTitle || matches.inDesc || matches.inSection || matches.inContents) {
return matches;
}
return false;
}
}
const search = new FastSearch({
searchInput: document.getElementById('search-input'),
resultsContainer: document.getElementById('search-results'),
json: `\/index.json`
});
</script>
</div>
<aside aria-label="Scroll to Top">
<button id="back-to-top" type="button" class="btn btn-lg btn-box-shadow">
<i class="fas fa-angle-up"></i>
</button>
</aside>
</div>
<div id="mask" class="d-none position-fixed w-100 h-100 z-1"></div>
</body>
</html>

View File

@ -1,10 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Homelab on Comprofix</title><link>https://comprofix.com/tags/homelab/</link><description>Recent content in Homelab on Comprofix</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sat, 06 Sep 2025 13:28:05 +1000</lastBuildDate><atom:link href="https://comprofix.com/tags/homelab/index.xml" rel="self" type="application/rss+xml"/><item><title>Continuous Integration &amp; Continuous Deployment</title><link>https://comprofix.com/post/2024-09-21-websitedeployment/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/post/2024-09-21-websitedeployment/</guid><description>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href="https://docs.gitea.com/usage/actions/overview"&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.&lt;/p&gt;
&lt;h3 id="why-use-cicd" id=why-use-cicd&gt;
&lt;span class="me-2"&gt;Why use CI/CD?&lt;/span&gt;
&lt;a href="#why-use-cicd" class="anchor text-muted"&gt;&lt;i class="fas fa-hashtag"&gt;&lt;/i&gt;&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.&lt;/p&gt;</description></item><item><title>Reset and Restart</title><link>https://comprofix.com/post/2024-09-05-resetrestart/</link><pubDate>Thu, 05 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/post/2024-09-05-resetrestart/</guid><description>&lt;p&gt;It&amp;rsquo;s time to reset the website and start building my blog again. I have had this domain for a number of years and it has always been used for my E-Mail.&lt;/p&gt;
&lt;p&gt;But the website has been more of a play ground for experimenting and testing.&lt;/p&gt;
&lt;p&gt;I am now hoping to get into the habit of writing more blog posts as I document my journey as I experiment with my HomeLab.&lt;/p&gt;</description></item></channel></rss>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Homelab on Comprofix</title>
<link>http://localhost:1313/tags/homelab/</link>
<description>Recent content in Homelab on Comprofix</description>
<generator>Hugo</generator>
<language>en</language>
<lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
<atom:link href="http://localhost:1313/tags/homelab/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Continuous Integration &amp; Continuous Deployment</title>
<link>http://localhost:1313/post/2024-09-21-websitedeployment/</link>
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
<guid>http://localhost:1313/post/2024-09-21-websitedeployment/</guid>
<description>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href=&#34;https://docs.gitea.com/usage/actions/overview&#34;&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href=&#34;https://github.com/features/actions&#34;&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.&lt;/p&gt;&#xA;&lt;h3 id=&#34;why-use-cicd&#34; id=why-use-cicd&gt;&#xA; &#xA; &lt;span class=&#34;me-2&#34;&gt;Why use CI/CD?&lt;/span&gt;&#xA; &lt;a href=&#34;#why-use-cicd&#34; class=&#34;anchor text-muted&#34;&gt;&lt;i class=&#34;fas fa-hashtag&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA; &#xA;&lt;/h3&gt;&lt;p&gt;It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.&lt;/p&gt;</description>
</item>
<item>
<title>Reset and Restart</title>
<link>http://localhost:1313/post/2024-09-05-resetrestart/</link>
<pubDate>Thu, 05 Sep 2024 00:00:00 +0000</pubDate>
<guid>http://localhost:1313/post/2024-09-05-resetrestart/</guid>
<description>&lt;p&gt;It&amp;rsquo;s time to reset the website and start building my blog again. I have had this domain for a number of years and it has always been used for my E-Mail.&lt;/p&gt;&#xA;&lt;p&gt;But the website has been more of a play ground for experimenting and testing.&lt;/p&gt;&#xA;&lt;p&gt;I am now hoping to get into the habit of writing more blog posts as I document my journey as I experiment with my HomeLab.&lt;/p&gt;</description>
</item>
</channel>
</rss>

File diff suppressed because it is too large Load Diff

View File

@ -1 +1,61 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tags on Comprofix</title><link>https://comprofix.com/tags/</link><description>Recent content in Tags on Comprofix</description><generator>Hugo</generator><language>en</language><atom:link href="https://comprofix.com/tags/index.xml" rel="self" type="application/rss+xml"/><item><title>Cd</title><link>https://comprofix.com/tags/cd/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/tags/cd/</guid><description/></item><item><title>Ci</title><link>https://comprofix.com/tags/ci/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/tags/ci/</guid><description/></item><item><title>Continuous Deployment</title><link>https://comprofix.com/tags/continuous-deployment/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/tags/continuous-deployment/</guid><description/></item><item><title>Continuous Integration</title><link>https://comprofix.com/tags/continuous-integration/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/tags/continuous-integration/</guid><description/></item><item><title>Docker</title><link>https://comprofix.com/tags/docker/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/tags/docker/</guid><description/></item><item><title>Git</title><link>https://comprofix.com/tags/git/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/tags/git/</guid><description/></item><item><title>Homelab</title><link>https://comprofix.com/tags/homelab/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/tags/homelab/</guid><description/></item></channel></rss>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Tags on Comprofix</title>
<link>http://localhost:1313/tags/</link>
<description>Recent content in Tags on Comprofix</description>
<generator>Hugo</generator>
<language>en</language>
<lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
<atom:link href="http://localhost:1313/tags/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Cd</title>
<link>http://localhost:1313/tags/cd/</link>
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
<guid>http://localhost:1313/tags/cd/</guid>
<description></description>
</item>
<item>
<title>Ci</title>
<link>http://localhost:1313/tags/ci/</link>
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
<guid>http://localhost:1313/tags/ci/</guid>
<description></description>
</item>
<item>
<title>Continuous Deployment</title>
<link>http://localhost:1313/tags/continuous-deployment/</link>
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
<guid>http://localhost:1313/tags/continuous-deployment/</guid>
<description></description>
</item>
<item>
<title>Continuous Integration</title>
<link>http://localhost:1313/tags/continuous-integration/</link>
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
<guid>http://localhost:1313/tags/continuous-integration/</guid>
<description></description>
</item>
<item>
<title>Docker</title>
<link>http://localhost:1313/tags/docker/</link>
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
<guid>http://localhost:1313/tags/docker/</guid>
<description></description>
</item>
<item>
<title>Git</title>
<link>http://localhost:1313/tags/git/</link>
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
<guid>http://localhost:1313/tags/git/</guid>
<description></description>
</item>
<item>
<title>Homelab</title>
<link>http://localhost:1313/tags/homelab/</link>
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
<guid>http://localhost:1313/tags/homelab/</guid>
<description></description>
</item>
</channel>
</rss>