711 lines
16 KiB
HTML
711 lines
16 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Gitea</title>
|
|
<meta name="description" content="The long-running and erratically updated blog of Kathleen Fitzpatrick.">
|
|
<link rel="alternate" href="feed/feed.xml" type="application/atom+xml" title="kfitz">
|
|
<script async="" src="https://talk.hyvor.com/embed/embed.js" type="module"></script>
|
|
<link rel="webmention" href="https://webmention.io/kfitz.info/webmention">
|
|
<link rel="pingback" href="https://webmention.io/kfitz.info/xmlrpc">
|
|
|
|
|
|
|
|
|
|
|
|
<style>/**
|
|
* okaidia theme for JavaScript, CSS and HTML
|
|
* Loosely based on Monokai textmate theme by http://www.monokai.nl/
|
|
* @author ocodia
|
|
*/
|
|
|
|
code[class*="language-"],
|
|
pre[class*="language-"] {
|
|
color: #f8f8f2;
|
|
background: none;
|
|
text-shadow: 0 1px rgba(0, 0, 0, 0.3);
|
|
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
|
|
font-size: 1em;
|
|
text-align: left;
|
|
white-space: pre;
|
|
word-spacing: normal;
|
|
word-break: normal;
|
|
word-wrap: normal;
|
|
line-height: 1.5;
|
|
|
|
-moz-tab-size: 4;
|
|
-o-tab-size: 4;
|
|
tab-size: 4;
|
|
|
|
-webkit-hyphens: none;
|
|
-moz-hyphens: none;
|
|
-ms-hyphens: none;
|
|
hyphens: none;
|
|
}
|
|
|
|
/* Code blocks */
|
|
pre[class*="language-"] {
|
|
padding: 1em;
|
|
margin: .5em 0;
|
|
overflow: auto;
|
|
border-radius: 0.3em;
|
|
}
|
|
|
|
:not(pre) > code[class*="language-"],
|
|
pre[class*="language-"] {
|
|
background: #272822;
|
|
}
|
|
|
|
/* Inline code */
|
|
:not(pre) > code[class*="language-"] {
|
|
padding: .1em;
|
|
border-radius: .3em;
|
|
white-space: normal;
|
|
}
|
|
|
|
.token.comment,
|
|
.token.prolog,
|
|
.token.doctype,
|
|
.token.cdata {
|
|
color: #8292a2;
|
|
}
|
|
|
|
.token.punctuation {
|
|
color: #f8f8f2;
|
|
}
|
|
|
|
.token.namespace {
|
|
opacity: .7;
|
|
}
|
|
|
|
.token.property,
|
|
.token.tag,
|
|
.token.constant,
|
|
.token.symbol,
|
|
.token.deleted {
|
|
color: #f92672;
|
|
}
|
|
|
|
.token.boolean,
|
|
.token.number {
|
|
color: #ae81ff;
|
|
}
|
|
|
|
.token.selector,
|
|
.token.attr-name,
|
|
.token.string,
|
|
.token.char,
|
|
.token.builtin,
|
|
.token.inserted {
|
|
color: #a6e22e;
|
|
}
|
|
|
|
.token.operator,
|
|
.token.entity,
|
|
.token.url,
|
|
.language-css .token.string,
|
|
.style .token.string,
|
|
.token.variable {
|
|
color: #f8f8f2;
|
|
}
|
|
|
|
.token.atrule,
|
|
.token.attr-value,
|
|
.token.function,
|
|
.token.class-name {
|
|
color: #e6db74;
|
|
}
|
|
|
|
.token.keyword {
|
|
color: #66d9ef;
|
|
}
|
|
|
|
.token.regex,
|
|
.token.important {
|
|
color: #fd971f;
|
|
}
|
|
|
|
.token.important,
|
|
.token.bold {
|
|
font-weight: bold;
|
|
}
|
|
.token.italic {
|
|
font-style: italic;
|
|
}
|
|
|
|
.token.entity {
|
|
cursor: help;
|
|
}
|
|
/*
|
|
* New diff- syntax
|
|
*/
|
|
|
|
pre[class*="language-diff-"] {
|
|
--eleventy-code-padding: 1.25em;
|
|
padding-left: var(--eleventy-code-padding);
|
|
padding-right: var(--eleventy-code-padding);
|
|
}
|
|
.token.deleted {
|
|
background-color: hsl(0, 51%, 37%);
|
|
color: inherit;
|
|
}
|
|
.token.inserted {
|
|
background-color: hsl(126, 31%, 39%);
|
|
color: inherit;
|
|
}
|
|
|
|
/* Make the + and - characters unselectable for copy/paste */
|
|
.token.prefix.unchanged,
|
|
.token.prefix.inserted,
|
|
.token.prefix.deleted {
|
|
-webkit-user-select: none;
|
|
user-select: none;
|
|
display: inline-flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
padding-top: 2px;
|
|
padding-bottom: 2px;
|
|
}
|
|
.token.prefix.inserted,
|
|
.token.prefix.deleted {
|
|
width: var(--eleventy-code-padding);
|
|
background-color: rgba(0,0,0,.2);
|
|
}
|
|
|
|
/* Optional: full-width background color */
|
|
.token.inserted:not(.prefix),
|
|
.token.deleted:not(.prefix) {
|
|
display: block;
|
|
margin-left: calc(-1 * var(--eleventy-code-padding));
|
|
margin-right: calc(-1 * var(--eleventy-code-padding));
|
|
text-decoration: none; /* override del, ins, mark defaults */
|
|
color: inherit; /* override del, ins, mark defaults */
|
|
}
|
|
/* This is an arbitrary CSS string added to the bundle */
|
|
/* Defaults */
|
|
@font-face {
|
|
font-family: "Atkinson Hyperlegible";
|
|
src: url('/css/files/atkinson-hyperlegible-latin-400-normal.woff2') format('woff2');
|
|
font-display: swap;
|
|
}
|
|
@font-face {
|
|
font-family: "Atkinson Hyperlegible";
|
|
font-weight: bold;
|
|
src: url('/css/files/atkinson-hyperlegible-latin-700-normal.woff2') format('woff2');
|
|
font-display: swap;
|
|
}
|
|
@font-face {
|
|
font-family: "Atkinson Hyperlegible";
|
|
font-style: italic
|
|
src: url('/css/files/atkinson-hyperlegible-latin-400-italic.woff2') format('woff2');
|
|
font-display: swap;
|
|
}
|
|
|
|
:root {
|
|
--font-family: "Atkinson Hyperlegible", -apple-system, system-ui, sans-serif;
|
|
--font-family-monospace: Consolas, Menlo, Monaco, Andale Mono WT, Andale Mono, Lucida Console, Lucida Sans Typewriter, DejaVu Sans Mono, Bitstream Vera Sans Mono, Liberation Mono, Nimbus Mono L, Courier New, Courier, monospace;
|
|
font-size: 18px;
|
|
}
|
|
|
|
/* Theme colors */
|
|
:root {
|
|
--color-gray-20: #e0e0e0;
|
|
--color-gray-50: #C0C0C0;
|
|
--color-gray-90: #333;
|
|
|
|
--background-color: #fff;
|
|
|
|
--text-color: var(--color-gray-90);
|
|
--text-color-link: #d61d4a;
|
|
--text-color-link-active: #853439;
|
|
--text-color-link-visited: #e8325e;
|
|
|
|
--syntax-tab-size: 2;
|
|
}
|
|
|
|
@media (prefers-color-scheme: dark) {
|
|
:root {
|
|
--color-gray-20: #e0e0e0;
|
|
--color-gray-50: #C0C0C0;
|
|
--color-gray-90: #dad8d8;
|
|
|
|
/* --text-color is assigned to --color-gray-_ above */
|
|
--text-color-link: #1493fb;
|
|
--text-color-link-active: #6969f7;
|
|
--text-color-link-visited: #a6a6f8;
|
|
|
|
--background-color: #15202b;
|
|
}
|
|
}
|
|
|
|
|
|
/* Global stylesheet */
|
|
* {
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
@view-transition {
|
|
navigation: auto;
|
|
}
|
|
|
|
html,
|
|
body {
|
|
padding: 0;
|
|
margin: 0 auto;
|
|
font-family: var(--font-family);
|
|
color: var(--text-color);
|
|
background-color: var(--background-color);
|
|
}
|
|
html {
|
|
overflow-y: scroll;
|
|
}
|
|
body {
|
|
max-width: 40em;
|
|
}
|
|
|
|
/* https://www.a11yproject.com/posts/how-to-hide-content/ */
|
|
.visually-hidden {
|
|
clip: rect(0 0 0 0);
|
|
clip-path: inset(50%);
|
|
height: 1px;
|
|
overflow: hidden;
|
|
position: absolute;
|
|
white-space: nowrap;
|
|
width: 1px;
|
|
}
|
|
|
|
p:last-child {
|
|
margin-bottom: 0;
|
|
}
|
|
p {
|
|
line-height: 1.5;
|
|
}
|
|
|
|
li {
|
|
line-height: 1.5;
|
|
}
|
|
|
|
a[href] {
|
|
color: var(--text-color-link);
|
|
}
|
|
a[href]:visited {
|
|
color: var(--text-color-link-visited);
|
|
}
|
|
a[href]:hover,
|
|
a[href]:active {
|
|
color: var(--text-color-link-active);
|
|
}
|
|
|
|
main,
|
|
footer {
|
|
padding: 1rem;
|
|
}
|
|
main :first-child {
|
|
margin-top: 0;
|
|
}
|
|
|
|
header {
|
|
border-bottom: 1px dashed var(--color-gray-20);
|
|
}
|
|
header:after {
|
|
content: "";
|
|
display: table;
|
|
clear: both;
|
|
}
|
|
|
|
footer {
|
|
border-top: 1px dashed var(--color-gray-50);
|
|
}
|
|
|
|
.links-nextprev {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
gap: .5em 1em;
|
|
list-style: "";
|
|
border-top: 1px dashed var(--color-gray-20);
|
|
padding: 1em 0;
|
|
}
|
|
.links-nextprev > * {
|
|
flex-grow: 1;
|
|
}
|
|
.links-nextprev-next {
|
|
text-align: right;
|
|
}
|
|
|
|
table {
|
|
margin: 1em 0;
|
|
}
|
|
table td,
|
|
table th {
|
|
padding-right: 1em;
|
|
}
|
|
|
|
pre,
|
|
code {
|
|
font-family: var(--font-family-monospace);
|
|
}
|
|
pre:not([class*="language-"]) {
|
|
margin: .5em 0;
|
|
line-height: 1.375; /* 22px /16 */
|
|
-moz-tab-size: var(--syntax-tab-size);
|
|
-o-tab-size: var(--syntax-tab-size);
|
|
tab-size: var(--syntax-tab-size);
|
|
-webkit-hyphens: none;
|
|
-ms-hyphens: none;
|
|
hyphens: none;
|
|
direction: ltr;
|
|
text-align: left;
|
|
white-space: pre;
|
|
word-spacing: normal;
|
|
word-break: normal;
|
|
overflow-x: auto;
|
|
}
|
|
code {
|
|
word-break: break-all;
|
|
}
|
|
|
|
/* Header */
|
|
header {
|
|
display: flex;
|
|
gap: 1em .5em;
|
|
flex-wrap: wrap;
|
|
align-items: center;
|
|
padding: 1em;
|
|
}
|
|
.home-link {
|
|
font-size: 1.5em; /* 16px /16 */
|
|
font-weight: 700;
|
|
margin-right: 2em;
|
|
}
|
|
.home-link:link:not(:hover) {
|
|
text-decoration: none;
|
|
}
|
|
|
|
/* Nav */
|
|
.nav {
|
|
display: flex;
|
|
padding: 0;
|
|
margin: 0;
|
|
list-style: none;
|
|
}
|
|
.nav-item {
|
|
display: inline-block;
|
|
margin-right: 1em;
|
|
}
|
|
.nav-item a[href]:not(:hover) {
|
|
text-decoration: none;
|
|
}
|
|
.nav a[href][aria-current="page"] {
|
|
text-decoration: underline;
|
|
}
|
|
|
|
/* Posts list */
|
|
.postlist {
|
|
list-style: none;
|
|
padding: 0;
|
|
padding-left: 1.5rem;
|
|
}
|
|
.postlist-item {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
align-items: baseline;
|
|
counter-increment: start-from -1;
|
|
margin-bottom: 1em;
|
|
}
|
|
.postlist-item:before {
|
|
display: inline-block;
|
|
pointer-events: none;
|
|
content: "" counter(start-from, decimal-leading-zero) ". ";
|
|
line-height: 100%;
|
|
text-align: right;
|
|
margin-left: -1.5rem;
|
|
}
|
|
.postlist-date,
|
|
.postlist-item:before {
|
|
font-size: 0.8125em; /* 13px /16 */
|
|
color: var(--color-gray-90);
|
|
}
|
|
.postlist-date {
|
|
word-spacing: -0.5px;
|
|
}
|
|
.postlist-link {
|
|
font-size: 1.1875em; /* 19px /16 */
|
|
font-weight: 700;
|
|
flex-basis: calc(100% - 1.5rem);
|
|
padding-left: .25em;
|
|
padding-right: .5em;
|
|
text-underline-position: from-font;
|
|
text-underline-offset: 0;
|
|
text-decoration-thickness: 1px;
|
|
}
|
|
.postlist-item-active .postlist-link {
|
|
font-weight: bold;
|
|
}
|
|
|
|
/* Archive list */
|
|
.archivelist {
|
|
padding: 0;
|
|
padding-left: 2.5rem;
|
|
}
|
|
.archivelist-item {
|
|
align-items: baseline;
|
|
margin-bottom: 1em;
|
|
}
|
|
.archivelist-item::marker {
|
|
text-align: right;
|
|
margin-left: -1.5rem;
|
|
font-size: 0.8125em; /* 13px /16 */
|
|
color: var(--color-gray-90);
|
|
}
|
|
.archivelist-date {
|
|
font-size: 0.8125em; /* 13px /16 */
|
|
color: var(--color-gray-90);
|
|
word-spacing: -0.5px;
|
|
}
|
|
.archivelist-link {
|
|
font-size: 1.1875em; /* 19px /16 */
|
|
font-weight: 700;
|
|
flex-basis: calc(100% - 1.5rem);
|
|
padding-left: .25em;
|
|
padding-right: .5em;
|
|
text-underline-position: from-font;
|
|
text-underline-offset: 0;
|
|
text-decoration-thickness: 1px;
|
|
}
|
|
.archivelist-item-active .archivelist-link {
|
|
font-weight: bold;
|
|
}
|
|
|
|
|
|
/* Tags */
|
|
.post-tag {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
text-transform: capitalize;
|
|
font-style: italic;
|
|
}
|
|
.postlist-item > .post-tag {
|
|
align-self: center;
|
|
}
|
|
|
|
/* Tags list */
|
|
.post-metadata {
|
|
display: inline-flex;
|
|
flex-wrap: wrap;
|
|
gap: .5em;
|
|
list-style: none;
|
|
border-top: 1px dashed var(--color-gray-20);
|
|
border-bottom: 1px dashed var(--color-gray-20);
|
|
padding: 3px 0px 3px 0px;
|
|
margin: 0;
|
|
font-size: .8em;
|
|
}
|
|
.post-metadata time {
|
|
margin-right: 1em;
|
|
}
|
|
|
|
/* Direct Links / Markdown Headers */
|
|
.header-anchor {
|
|
text-decoration: none;
|
|
font-style: normal;
|
|
font-size: 1em;
|
|
margin-left: .1em;
|
|
}
|
|
a[href].header-anchor,
|
|
a[href].header-anchor:visited {
|
|
color: transparent;
|
|
}
|
|
a[href].header-anchor:focus,
|
|
a[href].header-anchor:hover {
|
|
text-decoration: underline;
|
|
}
|
|
a[href].header-anchor:focus,
|
|
:hover > a[href].header-anchor {
|
|
color: #aaa;
|
|
}
|
|
|
|
h2 + .header-anchor {
|
|
font-size: 1.5em;
|
|
font-weight: bold;
|
|
}
|
|
|
|
h1 {
|
|
font-weight: bolder;
|
|
}
|
|
|
|
summary {
|
|
font-size: 1.5em;
|
|
font-weight: bold;
|
|
margin-bottom: .5em;
|
|
}
|
|
|
|
img {
|
|
display: block;
|
|
margin-left: auto;
|
|
margin-right: auto;
|
|
}
|
|
|
|
blockquote {
|
|
display: block;
|
|
margin-left: 2em;
|
|
margin-right: 3em;
|
|
padding-left: 10px;
|
|
border-left: 10px solid var(--text-color-link);
|
|
}
|
|
|
|
hr.new {
|
|
border: none;
|
|
border-top: 1px dashed var(--color-gray-50);
|
|
}
|
|
/* Webmention Section */
|
|
|
|
.webmentions {
|
|
display:block;
|
|
text-align: left;
|
|
}
|
|
.webmentions__facepile {
|
|
display:flex;
|
|
align-items: center;
|
|
flex-wrap: wrap;
|
|
}
|
|
.webmentions__face {
|
|
width: 2rem;
|
|
height: 2rem;
|
|
border-radius: 50%;
|
|
object-fit: cover;
|
|
flex: none;
|
|
}
|
|
.webmentions__list {
|
|
list-style-type: none;
|
|
padding:0;
|
|
}
|
|
.webmentions__item {
|
|
margin-bottom: 2rem;
|
|
}
|
|
|
|
/* Single Webmention */
|
|
|
|
.webmention {
|
|
display:block;
|
|
}
|
|
.webmention__meta,
|
|
.webmention__author {
|
|
display: flex;
|
|
align-items: center;
|
|
flex-wrap: wrap;
|
|
}
|
|
.webmention__meta {
|
|
margin-bottom:.5rem;
|
|
}
|
|
.webmention__author {
|
|
margin-right:.25rem;
|
|
}
|
|
.webmention__author__photo {
|
|
height: 3rem;
|
|
width: 3rem;
|
|
border-radius: 50%;
|
|
object-fit: cover;
|
|
margin-right:.5rem;
|
|
}
|
|
.webmention__pubdate {
|
|
font-style: italic;
|
|
}
|
|
/* Message Box */
|
|
.message-box {
|
|
--color-message-box: #ffc;
|
|
|
|
display: block;
|
|
background-color: var(--color-message-box);
|
|
color: var(--color-gray-90);
|
|
padding: 1em 0.625em; /* 16px 10px /16 */
|
|
}
|
|
.message-box ol {
|
|
margin-top: 0;
|
|
}
|
|
|
|
@media (prefers-color-scheme: dark) {
|
|
.message-box {
|
|
--color-message-box: #082840;
|
|
}
|
|
}</style>
|
|
</head>
|
|
<body>
|
|
<a href="#skip" class="visually-hidden">Skip to main content</a>
|
|
|
|
<header>
|
|
<a href="/" class="home-link">kfitz</a>
|
|
<nav>
|
|
<h2 class="visually-hidden" id="top-level-navigation-menu">Top level navigation menu</h2>
|
|
<ul class="nav">
|
|
<li class="nav-item"><a href="/">Home</a></li>
|
|
<li class="nav-item"><a href="/blog/">Archive</a></li>
|
|
<li class="nav-item"><a href="/about/">About</a></li>
|
|
<li class="nav-item"><a href="/projects/">Projects</a></li>
|
|
<li class="nav-item"><a href="/presentations/">Presentations</a></li>
|
|
<li class="nav-item"><a href="/teaching/">Teaching</a></li>
|
|
<li class="nav-item"><a href="/feed/feed.xml">Feed</a></li>
|
|
</ul>
|
|
</nav>
|
|
</header>
|
|
|
|
<link href="/pagefind/pagefind-ui.css" rel="stylesheet">
|
|
<script src="/pagefind/pagefind-ui.js"></script>
|
|
<div id="search"></div>
|
|
<script>
|
|
window.addEventListener('DOMContentLoaded', (event) => {
|
|
new PagefindUI({ element: "#search", showSubResults: true });
|
|
});
|
|
</script>
|
|
|
|
<main id="skip">
|
|
<heading-anchors>
|
|
|
|
<h1 id="gitea">Gitea</h1>
|
|
|
|
<ul class="post-metadata">
|
|
<li><time datetime="2025-04-20">20 April 2025</time></li>
|
|
<li><a href="/tags/tinkering/" class="post-tag">tinkering</a></li>
|
|
</ul>
|
|
|
|
<p>This site is running in 11ty and is built locally, after which the live site (which gets built into the _site folder) is pushed to my Reclaim Hosting account, where it's served up as <a href="http://kfitz.info">kfitz.info</a>. As an intermediate step, I have been pushing the code and content that builds the site to a GitHub repository, and then the _site folder to another GitHub repository, kfitz-site, mostly for preservation/backup purposes; if something happens to the server or to my local repo, there's another version-controlled pile of code out there from which things can be rebuilt. (Technically, I pull kfitz-site from GitHub to Reclaim. Similarly, <a href="http://presentations.kfitz.info">presentations.kfitz.info</a>, which runs in revealjs, is built locally, pushed to GitHub, and then pulled to Reclaim.)</p>
|
|
<p>I've had in my head for a while, though, that GitHub is in and of itself a point of failure, partially because of its ownership structure. On top of which, I haven't been delighted knowing that everything I push there is part of the greater Copilot feeding frenzy.</p>
|
|
<p>I'd been thinking for a while about migrating my repos to <a href="https://codeberg.org">Codeberg</a>, a community-governed alternative that -- a key consideration at this hour of the world -- is not hosted in the US. But it turns out that the terms of service on Codeberg highly discourage private repositories, and both <a href="http://kfitz.info">kfitz.info</a> and kfitz-site are private, even though the eventual published site is obviously very public and CC BY 4.0 licensed. I've kept those repositories private because they're not the product I'm trying to share -- the website is -- and I want a little freedom to make mistakes without everything being quite that out there. I totally get why Codeberg's TOS is structured the way it is; they're really focused on building open-source communities around FLOSS development, which is a huge part of why I wanted to support them. It's just not the work I'm doing.</p>
|
|
<p>So I spent a chunk of yesterday exploring the possibility of self-hosting <a href="https://about.gitlab.com">GitLab</a>, but <em>holy cats</em> is it resource-intensive. The instance I spun up on a Digital Ocean droplet would have cost me $32/month to keep in operation, and even so it was pegging 100% memory usage, with just one user. So... no, not unless I were really hosting the service for a bunch of friends who wanted to kick in a little.</p>
|
|
<p>This morning, though, I spun up a <a href="https://about.gitea.com">Gitea</a> instance on a much smaller Digital Ocean droplet, which will run $14/month. It's super zippy and very lightweight, and has allowed me to migrate my repositories from GitHub quite seamlessly. And there's lots of room to grow, resource-wise, so if those friends decide they want to test things out I can invite them to join me.</p>
|
|
<p>The next thing I want to investigate in whether I can run that Gitea instance on a shared server, using one droplet to host multiple applications and sites...</p>
|
|
|
|
<ul class="links-nextprev"><li class="links-nextprev-prev">← Previous<br> <a href="/neh-path-forward/">On the NEH and Our Path Forward</a></li><li class="links-nextprev-next">Next →<br><a href="/networking/">Networking</a></li>
|
|
</ul>
|
|
|
|
<hyvor-talk-comments website-id="9100" page-id="/gitea/"></hyvor-talk-comments>
|
|
|
|
<div class="webmentions" id="webmentions">
|
|
<h3 id="webmentions-2">Webmentions</h3>
|
|
|
|
|
|
<p>No replies yet.</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</heading-anchors>
|
|
</main>
|
|
|
|
<footer>
|
|
<p><em>Built with <a href="https://www.11ty.dev/">Eleventy v3.1.0</a>. All content <a href="https://creativecommons.org/licenses/by/4.0/deed.en">CC BY 4.0</a> if you're human.</em></p><p></p>
|
|
</footer>
|
|
|
|
<script type="module" src="/dist/rJ3_G-2ArF.js"></script>
|
|
</body>
|
|
</html>
|