update pronouns, css, progress on fp post

This commit is contained in:
Mira 2025-11-30 00:10:32 -05:00
parent 95783f4843
commit f752c683aa
5 changed files with 204 additions and 126 deletions

View file

@ -1,134 +1,92 @@
---
title: Mira's attempts to understand Kuwubernetes
title: Mira attempts to lock the fuck in and figure out how to k8s
date: 2025-04-07
---
# Current Setup
# Install k3s, helm
Auxin (HTPC):
- OS: NixOS
- Service Runtume:Docker Compose
- Services:
- Syncthing
- Jellyfin
- Caddy (as reverse proxy only)
- Kodi
- Service Storage:
- Bind Mounts to NFS on NAS
Lipotropin (NAS):
- OS: Proxmox
- Services Runtime: K3S
- Services:
- adminer
- caddy
- copyparty
- forgejo
- jackett
- mariadb
- ntfy
- paperless+gotenberg+tika
- qbittorrent+gluetun
- radarr
- redis
- slskd
- Service Storage:
- NFS to spinning rust on same system
- Baremetal storage:
- 6 HDDs in BTRFS5 (50TB raw, 38TB usable)
Motilin (working hostname, Unused)
- run `curl -sfL https://get.k3s.io | sh - on first node
- `curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash`
Other Client Devices:
- Access files over NFS/SMB
- Access services via hostname (local), or URL (external)
`export KUBECONFIG=/etc/rancher/k3s/k3s.yaml`
----
```yaml
# Endn't Point
Auxin
- Exclusive Services:
- Kodi
- Distributed Services via K8S
- Service Storage: ????
- Baremetal storage:
- Various HDDs as available
Motilin + Lipotropin
- Distributed Services via K8S
Client Devices
- Still need to be able to access files over NFS/SMB
- Still need to access services via hostname (local), or URL (external)
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: adminer
name: adminer
spec:
replicas: 1
selector:
matchLabels:
app: adminer
template:
metadata:
labels:
app: adminer
spec:
containers:
- image: adminer:latest
name: adminer
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: adminer-svc
spec:
type: ClusterIP
selector:
app: adminer
ports:
- port: 8080
targetPort: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: adminer-http
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: web
spec:
rules:
- host: adminer.lipotropin.lan
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: adminer-svc
port:
number: 8080
```
- Use `kubectl apply -f <yaml>` to deploy a yaml file
The above two result in the following
```
$ kubectl describe svc
Name: adminer
Namespace: default
Labels: io.kompose.service=adminer
Annotations: <none>
Selector: io.kompose.service=adminer
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.43.229.81
IPs: 10.43.229.81
Port: 8090 8090/TCP
TargetPort: 8080/TCP
Endpoints: 10.42.0.10:8080
Session Affinity: None
Internal Traffic Policy: Cluster
Events: <none>
```
Adminer can be accesed at `10.42.0.10:8080`
> [!TODO] how tf do I access this from 127.0.0.1 or outside?
# Still need to figure out:
- How to handle jellyfin requiring GPU access
- nodes not guaranteed to have GPU, or may have heterogenous GPUs, need to lock to nodes with GPUs
- How do I handle failover
- current setup has SSH and HTTP traffic go to auxin, which proxies to lipotropin as needed
- how would I handle auxin going down
- ~~where the fuck would ssh go in general, it's not something reverse proxyable~~
- Move SSH to router, use proxyjump from there
- see if Auto proxy and fallback are options
- can we do crowdsec and fail2ban on openwrt
- if I fucked up a config, how could I recover without incurring downtime
- How the *fuck* do I handle storage
- how do I do concurrent access, which services even allow that
- how the ever loving fuck do I make syncthing work
- ~~the intent is graceful failover, but can I do load balancing?~~
- I do not have a good reason to have multiple instances of, cap replicas at 1
- at best, jellyfin might benefit from multiple GPUs but also nobody is using your instance
- some services use SQLite, is there a way to mitigate concurrency issues with that
- on that note SQLite shits itself when FS access is too slow (eg NFS or ISCSI), how deal with that
- How to gradually migrate to new setup from 6 BTRFS drives on one machine
- The end goal is at least 3 nodes, but at some point there's only going to be 1 or 2
- how would I minimize buying more storage/spending more money, while maintaining some redundancy
- is the best option just `btrfs remove` -> move drive -> format drive -> copy files from btrfs to new drive?
- new storage setup should be easy to add to (at a minimum, no homogenous drives)
- Is tiered storage something I can make use of, could I grab an SSD and use it as cache somehow
- how to give client devices and services access to the same filesystems
- eg (accessing `/downloads` from `qbittorrent`, `sonarr` and my phone via NFS/SMB)
---
# Rook: does it solve my storage issues?
- Deployment: seems to translate to docker service
- Service: seems to handle connecting to the deployment?
- NodePort: something to do with routing
- `kubectl expose deployment <deployment_name> --port=<port> --target-port=<target_port> --type=NodePort`
`kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.1/standard-install.yaml`
`export KUBECONFIG=/etc/rancher/k3s/k3s.yaml`
---
# TODO:
- [x] cyberchef
- [x] adminer
- [x] soulseek
- [x] postgres
- [x] mariadb
- [x] Ntfy
- [x] gluetun?
- [x] Jackett
- [x] qbittorrent
- [x] radarr
- [ ] sonarr
- [ ] syncthing
- [ ] forgejo
- [ ] kuma
- [ ] paperless-ngx
- [ ] goternberg
- [ ] redis
- [ ] tika
- [ ] jellyfin
- [ ] Website
- [ ] crowdsec
- [ ] dufs
- [ ] minecraft
- [ ] flaresolverr?
- Needs raw devices/partitions
- requires migration
# Longhorn: will it do shit?

View file

@ -12,12 +12,12 @@ title: Links and Socials!
</td>
</tr>
<tr>
<td>She/They</td>
<td>She/Her</td>
</tr>
</table>
<br />
<span class="socials-text">I don't know who you are or how you found this, but while you're here, feel
free to add me everywhere</span>
<span class="socials-text">I don't know who you are or how you found this, but while you're here, feel free to add me
everywhere</span>
<div class="social-container">
<table class="socials">
<tr>

87
content/posts/fp.md Executable file
View file

@ -0,0 +1,87 @@
---
title: Dysfunctional Programming
date: 2025-11-24
modified: 2025-11-24
draft: true
summary: Group Theory Adjacent Nonsense for people who slept through high school (me)
---
*Group Theory Adjacent Nonsense for people who slept through high school (me)*
> A Cringe set is Just a Co-Based set
>
> \- Unknown
So anyway, what the FUCK is a Monad
- A monoid in the category of endofunctors
- a burrito
- a co-comonad
Do any of these mean anything? No, so lets start at the beginning
# Numbers
- In the beginning, there was the empty set
- and then Zermelo and Fraenkel said "Let there be a power set of the empty set"
- ...which is a line of exploration that will get us nowhere productive for the scope of this work, and is probably something I'll talk about in the future.
# Magmas
- The easiest Algebraic Structure to explain is The **Magma**
- **Definition**: A magma is a set \(M\) with an operation \(\cdot\) that sends \(a,b\in M \to a\cdot b \in M\)
- the tl;dr is, you've got a set of stuff, and you can shove any two of those together to make a third thing, as long as it's still in the set, we call this property **closure**
- you're probably used to \(\cdot\) meaning multiplication, but that's a fake word that doesn't mean anything
- Aside: '\(\cdot\)' is hard to read on its own, hereafter it will be referred to as multiplication or as <strike>bottom surgery</strike> 'the operation')
- The main example of this is the Free Magma, which is basically just a binary tree
- In this case, 'multiplying' two binary trees just means concatenating them
- Why is this called the Free Magma? I honestly have no clue, Free means *something* here but I haven't figured out what yet. This will not be the last time it comes up.
# Monoids
- The next step we'll on the Algebraic Structure Skill Tree is the Semigroup, but that's less important to focus on here so I'll fold it into the Monoid Section
- When you add Associativity to a Magma, you get a **Semigroup**
- Associativity just means that \(a\cdot(b\cdot c) = (a\cdot b) \cdot c\)
- A more concrete example of this is natural number addition, \(2+(3+4) = (2+3)+4\)
- The proof of this is trivial and left as an exercise to the reader
- When you take a Semigroup and add an **Identity** to it, you get a **Monoid**
- An identity is just something that you can combine with something and get that same something back out
- The easiest way to think of this is that we need something that acts like '1' when you 'multiply' by it
- If we go back to the example of adding numbers together, '0' acts as the identity since \(0+x = x\)
- Yes, this means that the '1' element of \((\mathbb{N},+)\) is '0'
- No, I'm not sorry for coming up with that absolutely dumb ass example
- The Free Monoid is strings with concatenation as the operation
- Told you 'Free' would come up again
- the Identity element here is '', or the empty string
- This is closed since adding two strings together always results in a string
- This is also associative because Trust Me Bro
- Another example of a Monoid is RGBA colors
- The identity here is `rgba(0,0,0,0)` since adding clear to any color doesn't change it
- Colors are closed since you can add two of them and get a color back*
- *Actually I'm sure there's some sort of floating-point nonsense that makes this not true but IEEE 754 can go suck a log
- RGBA Colors are associative because I said so
- Absolutely unrelated, but I'm pretty sure OKLab isn't closed under the set of displayable colors, which feels cursed but is probably reasonable tbh
# Categories
- The Magma -> Monoid skill tree (and the several parts of it that I left out), are a scuffed refresher on Group Theory
- Up next is Category Theory, which they did not cover in high school; As such I will be spewing a significant amount of hot air out of my ass.
# Functors
> A category is a collection of "objects" that are linked by "arrows"
>
> \- [Wikipedia - Category](https://en.wikipedia.org/wiki/Category_(mathematics))
- ...FUCK, I was going to say that, unfortunately Wikipedia's definition is pretty spot on here.
- Okay but seriously
> In mathematics, abstract nonsense is a nonderogatory term used mainly to describe category theory and homological algebra
>
> \- Paraphrased from [Wikipedia - Abstract nonsense](https://en.wikipedia.org/wiki/Abstract_nonsense)
- Okay forget finding a way to explain it to an audience of (<small>uhhh whatever my audience is, I kinda try to write these at a level high school me could follow along with and not get bored, but I don't actually know what kind of masochist is reading this</small>), I need to figure out how to explain this to me first
- I'm back from Wikipedia, and I've returned neither smarter nor wiser, as such we proceed in our endeavors with the rallying cry: "Fuck it, we ball"
# Endofunctors
# Monads
- Examples include: `Future<T>`, `List<T>`, `Option<T>`, `Result<T,E>` also logging
- TODO: find someone who can explain how/why logging and file i/o are monadic
----
# Questions Mira hasn't answered yet and should really get around to before publishing this
- Does free just mean the operation is concatenation?
- https://en.wikipedia.org/wiki/Free_object
- it's supposed to be the 'most generic'
- How does using monads deal with side effects, eg Logging, File IO
- Do they encapsulate state somehow? how does that work exactly?
- what exactly does `Co-` entail

View file

@ -1,6 +1,7 @@
{{ $emojis := dict "caution" ":exclamation:" "important" ":information_source:"
"note" ":information_source:" "tip" ":bulb:" "warning" ":information_source:"
"todo" ":memo:" "quote" ":speech_balloon:" "default" ":information_source:" }}
{{ if .AlertType }}
<blockquote class="alert alert-{{ .AlertType }}">
<table>
<tr>
@ -12,3 +13,15 @@
</tr>
</table>
</blockquote>
{{ else }}
<blockquote class="alert alert-default">
<table>
<tr>
<td class="width-min">Quote:</td>
</tr>
<tr>
<td class="width-auto">{{ .Text }}</td>
</tr>
</table>
</blockquote>
{{ end }}

View file

@ -18,6 +18,14 @@
}
}
h1 {
margin: 1em 0 0 0;
}
small {
opacity: 0.5;
}
a:link,
a:visited {
color: var(--link-color);
@ -57,9 +65,21 @@ body {
color: var(--text-color);
}
.alert-default table {
border-left: 1em solid var(--base02);
background-color: var(--base01);
}
.alert-default td {
border: none;
padding: 0em;
padding-left: 1em;
}
.alert-quote td {
background-color: var(--base01);
border-color: var(--base01);
padding: 1em;
}
p mjx-container {