4
.vscode/settings.json
vendored
@ -5,12 +5,16 @@
|
||||
"fontawesome",
|
||||
"fortawesome",
|
||||
"frontmatter",
|
||||
"gitops",
|
||||
"homelab",
|
||||
"Jellyfin",
|
||||
"Lieshoutt",
|
||||
"Rickvan",
|
||||
"rickvanlieshoutcom",
|
||||
"slsw",
|
||||
"soundcloud",
|
||||
"todos",
|
||||
"unraid",
|
||||
"weibo"
|
||||
],
|
||||
"grammarly.selectors": [
|
||||
|
@ -12,3 +12,4 @@ A list of categories used in the blog
|
||||
| exploits | blogs about exploits and bugs in open-source software |
|
||||
| lego | blogs about Lego |
|
||||
| house | Content about the place I live |
|
||||
| life | Posts about life |
|
||||
|
@ -0,0 +1,356 @@
|
||||
---
|
||||
title: "A Hidden Life of Pain, Sorrow, Misery and Rampant Emotions"
|
||||
description: "A deeply personal story about grief, memory, and the long road through the shadows. For anyone who’s lost someone they can never get back."
|
||||
date: 2025-05-04
|
||||
template: "post"
|
||||
category: "life"
|
||||
tags:
|
||||
- life
|
||||
- grief
|
||||
- memory
|
||||
- loss
|
||||
- trauma
|
||||
- healing
|
||||
- personal
|
||||
- poetry
|
||||
coverImage: ./media/cover.png
|
||||
---
|
||||
|
||||

|
||||
|
||||
<center>⚠️ <strong>Content Warning</strong><br/>
|
||||
This blog contains themes of death, grief, mental health, and emotional trauma.<br />
|
||||
It is raw, honest, and may be deeply triggering for some.<br />
|
||||
Please read with care and stop if it becomes too heavy. You're not alone.</center>
|
||||
|
||||
## A Hidden Life of Pain, Sorrow, Misery and Rampant Emotions
|
||||
|
||||
Some kinds of missing are temporary. A friend you haven’t seen in a while. A conversation left unfinished. A plan postponed.
|
||||
|
||||
But then there's another kind.
|
||||
|
||||
The kind that settles into your bones. The kind that haunts you during the quiet hours. The kind that never finds a conclusion.
|
||||
|
||||
That kind is not absence. It's ***gone***. Irrevocable, final, cruel. A door slammed shut that you still find yourself knocking on, long after you’ve forgotten why you started.
|
||||
|
||||
It never opens. And still, you try the handle every now and then.
|
||||
|
||||
## In the background of every moment
|
||||
|
||||
Losing a loved one doesn’t stay in one room of your house though, it isn't one door that is locked. It leaks under doors and through cracks. You find it in the most unexpected places.
|
||||
|
||||
You're sipping coffee with someone, and they mention a trip they took. Suddenly, you're remembering the trip *you* never took. The one you'd planned. The one that cancer took from you.
|
||||
|
||||
They talk about a shared playlist. You remember the song you danced to in the rain, soaking wet but laughing anyway. The same song you now skip every time it comes on because it hurts too much
|
||||
|
||||
Someone laughs about chipped mugs. You think of the one she cracked and called "vintage," and how it's still at the back of your cabinet. Untouched. Sacred.
|
||||
|
||||
It’s like walking through a museum where only *you* know what’s behind the glass.
|
||||
|
||||
> They talk, they laugh, the world goes on,<br />
|
||||
> Yet I sit with shadows, from dusk to dawn. <br />
|
||||
> A smile here hides a silent scream,<br />
|
||||
> A haunted heart, a broken dream.
|
||||
|
||||
<figure class="float-right" style="width: 240px">
|
||||
<img src="/media/the-flashback-no-one-sees.png" alt="A foggy bathroom mirror with a red lipstick kiss at the center, surrounded by a shadowy, intimate atmosphere.">
|
||||
</figure>
|
||||
|
||||
These are what I call *mind pops*. Short for Involuntary Autobiographical Memory Chains. I wrote a journal-like book once, and later a smaller one. I wanted to share them. I tried. But I was never brave enough to.
|
||||
|
||||
Mind pops come uninvited. And they come *hard*.
|
||||
Here are some examples from my book:
|
||||
|
||||
- The eyeliner she never quite got even.
|
||||
- The way she tucked me in, thinking I was asleep.
|
||||
- The fake wedding we planned just to see what colors we'd choose.
|
||||
- Your love for Twilight. And the moment we realized, quietly, you'd never get to read the next book—if there ever was one.
|
||||
- The mole you've had removed and I pretended not to notice. I did miss it so.
|
||||
- The mixture of guilt, remorse and happiness in your eyes as conscious life ebbed away.
|
||||
|
||||
They’re not just memories. They’re grenades. Quiet ones. You never know when they'll detonate. Nor whether they will ruin your entire day.
|
||||
|
||||
> A flicker in time, unbidden and wild,<br />
|
||||
> A whisper of laughter, a memory smiled.<br />
|
||||
> Then tears arrive with no request,<br />
|
||||
> The heart’s old wounds laid bare, unblessed.
|
||||
|
||||
## Unfair doesn’t even begin to cover it
|
||||
|
||||
We grow up believing that the world has some kind of order to it. That bad things happen, sure—but not *this* bad. Not *this* unfair.
|
||||
You lose someone who made life feel infinite. You watch them disappear into the haze of hospital lights and soft-spoken specialists.
|
||||
|
||||
Cancer doesn’t care if you’re young. Or kind.<br />
|
||||
Or if you had a hundred plans left.
|
||||
It just takes.<br />
|
||||
And keeps taking.
|
||||
|
||||
And you're left with jewelry in a drawer. Her necklace still smells like her.<br />
|
||||
Sometimes I take it out. I hold it. Smell it. Let it transport me. I don’t even know if I should still be doing that. But it’s a thread. One of the last ones.
|
||||
|
||||
> This necklace, cold, rests in my hand,<br />
|
||||
> The last soft echo of a silent land.<br />
|
||||
> I breathe her in, though she's not near,<br />
|
||||
> A ghost in scent, in touch, in tear.
|
||||
|
||||
## The masks we wear
|
||||
|
||||
For a long time, no one knew. Most don't, still.
|
||||
|
||||
People see the version of you they expect: Smiling. Joking. Coping. Existing.<br />
|
||||
But behind the eyes, you’re unraveling. Constantly. Because grief doesn’t pause.<br />
|
||||
Not ***really***.
|
||||
|
||||
Sharing this is hard. Not because I don’t want to, but because it makes you so vulnerable. Because as you're writing or speaking, memories pop up uninvited. They derail your words. They choke your sentences. They just pop in... bastards...
|
||||
|
||||
And even when you manage to share, others often don’t understand. They compare. They say things like “I lost someone too,” but it’s different. This kind of grief? This kind of loss? It’s heavier. It cuts deeper. And hearing it treated like it’s the same as all the rest—*that* makes you angry.
|
||||
|
||||
Here’s something I once wrote, when I thought no one would ever read it:
|
||||
|
||||
> I'm surrounded by many figures, but still alone...<br />
|
||||
>No one sees me, nor the pain behind my mask.<br />
|
||||
>They see the smiling, happy guy I show them.<br />
|
||||
>You can't blame them though, how can I let them see the darkness in my heart? <br />
|
||||
> It would scare them, for it has been torn apart.
|
||||
|
||||
I didn’t want to scare people. Or burden them. So I said nothing.<br />
|
||||
For years.
|
||||
|
||||
## Strange rituals of survival
|
||||
|
||||
<figure class="float-right" style="width: 240px">
|
||||
<img
|
||||
src="/media/strange-rituals-of-survival.png"
|
||||
alt="A softly lit restaurant table for two. One plate is untouched, the other half-eaten. A single candle flickers between them, hinting at absence and memory.">
|
||||
</figure>
|
||||
|
||||
Grief makes you do strange things too..<br />
|
||||
One of my telltale behaviors is that I start eating, lots... but there are weirder ones.<br />
|
||||
More unexpected ones...
|
||||
|
||||
I’ve spoken out loud to pictures. Imagined new conversations. Tried to conjure her in dreams. I’ve spent hours crafting memories that never happened, just to feel like I got one more day.
|
||||
I name items, characters, and other things in games after her.
|
||||
If I eat alone, at a restaurant, I order what she would’ve. (who do I kid, I sometimes do it with company too...)
|
||||
|
||||
And I wrote a song. It’s unfinished though—like she was.
|
||||
|
||||
**🎵 (Refrain)**<br />
|
||||
*A strand of blonde hair, as delicate as sun,*<br />
|
||||
*A mystery found, in silence it's spun.*<br />
|
||||
*But memory, like a fleeting breeze,*<br />
|
||||
*Fades away as a haze, in the time we seize.*<br /><br />
|
||||
|
||||
**🎶(Verse)**<br />
|
||||
*Days pass like rustling leaves,*<br />
|
||||
*Stories fade, like quiet thieves.*<br />
|
||||
*How swiftly memory slips away,*<br />
|
||||
*Like an old melody, lost in the fray.*<br />
|
||||
|
||||
*A mysterious gate, in the labyrinth of the mind,*<br />
|
||||
*Locked and hidden, what secrets behind?*
|
||||
|
||||
As I'm writing this blog however, I have a sudden urge to add sound to the lyrics, it'll still be unfinished, but a little farther along.
|
||||
I used both a piano and a viola to give it a more interesting sound than just the piano.
|
||||
|
||||
<center>
|
||||
<audio controls>
|
||||
<source src="./media/a-strand-of-blonde-hair-as-delicate-as-sun.mp3" type="audio/mpeg">
|
||||
Your browser does not support the audio element.
|
||||
</audio>
|
||||
|
||||
<br />
|
||||
<a href="./media/a-strand-of-blonde-hair-as-delicate-as-sun.pdf" target="_blank">score</a> |
|
||||
<a href="./media/a-strand-of-blonde-hair-as-delicate-as-sun.mid" target="_blank">midi</a> |
|
||||
<a href="./media/a-strand-of-blonde-hair-as-delicate-as-sun.flac" target="_blank">flac</a>
|
||||
</center>
|
||||
|
||||
## The final moments and the words that stayed
|
||||
|
||||
There are memories too hard to sit with for long. But they come back, as clear as yesterday.
|
||||
|
||||
The quiet nights filled with endless conversation. Plans made, even though we both knew we'd never see them through. Fantasies of places we'd never travel, children we’d never have, shows we’d never finish.
|
||||
|
||||
She once told me something that still echoes today:
|
||||
|
||||
> "You have to grieve me, for a while... and then you move on. <br />
|
||||
> You find someone else to love. Someone who makes you feel something again. <br /> You deserve that."
|
||||
|
||||
I shook my head. *"I can’t. I **won’t**. Not because I don’t want to feel again. But because abstinence, to me, feels like remembering you as you are. Eternal."* <br />
|
||||
We both cried after that. For different reasons, I think.
|
||||
|
||||
### My words weren't true though
|
||||
|
||||
But life went on. And I did try. I did have relations after her.
|
||||
And every single one felt... off. Wrong. Like stepping into a life that wasn’t meant to fit me anymore.
|
||||
|
||||
They weren’t bad people. In fact, I think some of them really tried to care. But the weight of comparison was impossible to escape. The shadow she left was too wide.
|
||||
|
||||
Sometimes I’m mad at myself for trying. Other times, I’m mad at myself for failing to let them in.
|
||||
And always,...always,.. I feel like I betrayed her just a little.
|
||||
|
||||
I know grief isn’t rational. It doesn’t follow clean lines.<br />
|
||||
And maybe that’s what hurts most of all—knowing I tried, and still came back to the same place. <br />
|
||||
Alone, but full of someone who isn’t here.
|
||||
|
||||
One day... *maybe*.
|
||||
|
||||
## Why I’m finally speaking
|
||||
|
||||
It’s taken me over a decade to find the strength to say any of this.
|
||||
And maybe the only reason I can now… is her.
|
||||
|
||||
But also—my mother.<br />
|
||||
She’s terminally ill. And while it’s “natural” for a parent to go before their child, it’s still excruciating. <br />
|
||||
We don't know how long she's got left, but I know we'll make the best of it. For both of us.
|
||||
|
||||
I do find myself ashamed to admit that it hasn’t hit me quite the same way. But it’s not lesser. It’s just different. A different wound on the same, torn, body.<br />
|
||||
And this time, I’m watching it happen while knowing exactly what’s coming. And I'm scared. <br />
|
||||
For **everyone**.
|
||||
|
||||
I think often of my brothers. For them, this may be their first real loss. Their first brush with the permanence of death.<br />
|
||||
And it breaks me in new ways to imagine them feeling what I felt, without ever seeing it coming. I'll try to be there for them, as you do.
|
||||
|
||||
But it's at least part of why I’m writing now. That’s why I’m finally saying all this.<br />
|
||||
Because pain grows in the dark.
|
||||
|
||||
In a moment of foolish bravery, I once planned to publish my journaled thoughts. That book. That attempt to show what this kind of loss looks like.<br />
|
||||
I didn’t. I **couldn’t**.
|
||||
|
||||
But maybe I can share this blog.
|
||||
|
||||
## On those who want(ed) to leave
|
||||
|
||||
I need to say something with a very serious tone now, and I do hope you read it gently and thoroughly:
|
||||
|
||||
I’ve met people over the years who’ve carried this same grief. And some of them have found themselves teetering.
|
||||
|
||||
On the edge.
|
||||
|
||||
Wondering if there’s peace on the other side of absence.<br />
|
||||
Let me say this clearly: I have never thought of taking that road for myself. If anything, I would *ask* for eternal life. Even with the grief.<br />
|
||||
But if you are someone who has stood on that edge:
|
||||
|
||||
**Don’t. Please.**
|
||||
|
||||
The pain is real. The grief is heavy. But life—*even broken life*—has light in it still. And sometimes, all you need is one person willing to sit with you in the dark.
|
||||
|
||||
Let me be that person for a moment. Just long enough to remind you: the door might be closed, but the room isn’t empty.
|
||||
|
||||
If you are on the edge. Seek help. <sup>([dutch](https://www.113.nl) | [english](https://www.113.nl/english))</sup>
|
||||
Whatever you do, don't pass on the pain.
|
||||
|
||||
## What help looks like
|
||||
|
||||
Over the past two years, I’ve slowly—*achingly*—learned to live with it.
|
||||
And honestly, I'm happier now than I've ever been since.
|
||||
|
||||
I’ve had friends. Real ones. Some with the training to guide me through the murk. Others who simply sat there while I unraveled, trying their best.
|
||||
|
||||
They didn’t try to fix me. They didn’t rush me. They just showed up.
|
||||
They had always been there, I just didn't allow them to be there for me before.
|
||||
|
||||
I’ve learned that grief isn’t a wall to climb or a puzzle to solve. It’s a landscape.
|
||||
|
||||
You don’t conquer it.<br />
|
||||
You *walk it*. One aching step at a time.<br />
|
||||
And if you're lucky... you don’t walk it alone.
|
||||
|
||||
### To those who held me together
|
||||
|
||||
There’s a quiet kind of heroism in being the one who stays.
|
||||
Not the one who fixes. Not the one with the right words.
|
||||
Just… the one who stays.
|
||||
|
||||
To those of you who sat with me in silence,
|
||||
who didn’t flinch at the weight of my words,
|
||||
who let me cry without needing to understand why.
|
||||
thank you.
|
||||
|
||||
To those who asked how I was and meant it.
|
||||
Who asked again when I lied the first time.
|
||||
Who sent messages I never responded to, but always read.
|
||||
Thank you.
|
||||
|
||||
To those who reminded me that it was okay to laugh.
|
||||
To love again.
|
||||
To mess up.
|
||||
To heal slow.
|
||||
Thank you.
|
||||
|
||||
And to the ones who didn’t even know they helped—
|
||||
you did.
|
||||
|
||||
You all held the thread when I couldn’t anymore.
|
||||
And maybe that’s the reason I’m still happy...
|
||||
Still holding her memory, but not drowning in it.
|
||||
|
||||
## Before I finally sign off
|
||||
|
||||
This entire blog was something I never thought I could write.
|
||||
And what comes next,this next part, is something I swore I *never* would share.
|
||||
|
||||
But here we are.
|
||||
|
||||
What follows is the foreword and some pages from the book I wrote years ago. A raw collection of thoughts, pain, patterns, and memory. I’ve always wanted to share it, and I’ve always been too scared. Too protective. Too convinced no one would understand.
|
||||
|
||||
My grief has changed, not disappeared, never that. But shifted.
|
||||
And time has a way of loosening things you once held too tight.
|
||||
Of showing you that even pain deserves to breathe.
|
||||
|
||||
So this is me, still afraid—but doing it anyway.<br />
|
||||
This is me, defiant in the face of silence.<br />
|
||||
This is me, opening the door just a little wider.
|
||||
|
||||
What comes next is the truth as I once wrote it, in a different voice, at a different time (2021-2022)—but still very much me.
|
||||
|
||||
### A Peek into the Pain and Misery
|
||||
|
||||
**The foreword to a book I once wrote titled "A Peek into the Pain and Misery"**
|
||||
|
||||
We, humans, perceive the vast majority of other humans we encounter as bystanders, observers and otherwise side characters in our own lives. Yet, each and every one of them has a life of comparable complexity to our own. Realizing that for the first time is an emotion called "sonder".
|
||||
|
||||
This book will give you a small glimpse into my life. By the end, you might find that I'm more complex than you've thought till now. That there's another side to the happy, carefree guy I show the world for the majority of my time.
|
||||
|
||||
Truth is, that life hasn't always been easy. In fact, I'd say that after the turning point my life has never felt easy anymore. In fact, for at least 10 years now I've been living with prodigious amounts of a single emotion: bereavement.
|
||||
|
||||
And though I've tried not to let the bereavement take over my life, or in fact make it known to others. it's always been there. I've effectively come to think of it as a zit. Constantly there, constantly annoying and once it's gone away it's only a matter of time before it shows up again somewhere else on your body.
|
||||
|
||||
Ten years is truly a long time. In it, I've tried countless things to forget my sorrow. I've written songs and poetry. I've indulged in life's greatest things. I've thrown myself into the pursuit of knowledge and I've even tried to seclude myself, thinking that I'd become a burden to the world.
|
||||
However, In trying to cope with it I've also made many mistakes. I've experienced more loss, extirpated meaningful connections and, to my deepest regret, hurt others.
|
||||
And even now, 10 full years later I'm still burdened by the same emotions, though now compounded by the feelings and mistakes of the past 10 years.
|
||||
|
||||
Furthermore, During these 10 years, on nearly every day I've been haunted by something I've come to know as Involuntary Autobiographical Memory Chains, or as I now like to call them: mind pops.
|
||||
Mind pops are sudden memory flashes, seemingly triggered at random, about things I've experienced prior. These mind pops never seem to go away and can alter my mood for the rest of the day with the emotions they invoke.
|
||||
|
||||
I've actually been able to capture the entire story of the past 10 years in a book, of sorts, titled "a hidden life of pain, sorrow, misery and rampant emotions". And though I've always wanted to share the entire story, I've never been strong enough to do so. Not 10 years ago, not now, and maybe not ever.
|
||||
|
||||
But... The urge to share... something... is still there.
|
||||
So on the 1st of January 2021, I set out on a challenge. I wanted to, at least, share a part of the story. Not one from a distant past though, one of constant remembrance. One of pain and pleasure. One I've lived for every day of the entire year. One I'll live for every day for many years to come.
|
||||
|
||||
Every page henceforth will contain one "mind pop" that I've had on the date listed. So turn over this page and join me on my struggle from January 1st through December 31st of 2021.
|
||||
|
||||
<figure style="width: 240px">
|
||||
<img
|
||||
src="/media/pages/sept-12.png"
|
||||
alt="page of september 12th, a teardrop at the bottom to indicate a sad memory, and the text: my colleagues and I went skiing. They didn't know it was something we had planned to do after our studies which made it infinitely more difficult for me. I didn't really like it, probably because you weren't there to share in my happiness. On the way there and back my colleague drove straight past a place where we had lunch, that hit home a just little too hard.">
|
||||
</figure>
|
||||
|
||||
<figure style="width: 240px;">
|
||||
<img
|
||||
src="/media/pages/march-19.png"
|
||||
alt="page of march 19th, a flower at the bottom to indicate a happy memory, and the text: The warmth you brought into a room.
|
||||
A happy one">
|
||||
</figure>
|
||||
|
||||
<figure style="width: 240px;">
|
||||
<img
|
||||
src="/media/pages/jan-11.png"
|
||||
alt="page of january 11th, a teardrop at the bottom to indicate a sad memory, and the text: Your scared helplessness which slowly transitioned into anger, to violence and back to anxiousness again.">
|
||||
</figure>
|
||||
|
||||
## A postscript
|
||||
|
||||
If you’ve read this far—thank you.
|
||||
That alone means more than you know.
|
||||
|
||||
*- Rick, mastermindzh, lycan, xxxroosjexxx, and other alias' you might know me from.*
|
After Width: | Height: | Size: 2.4 MiB |
After Width: | Height: | Size: 2.2 MiB |
After Width: | Height: | Size: 2.3 MiB |
After Width: | Height: | Size: 1.8 MiB |
After Width: | Height: | Size: 2.3 MiB |
After Width: | Height: | Size: 1.9 MiB |
50
content/posts/2025/iac-part-2-my-homelab/index.md
Normal file
@ -0,0 +1,50 @@
|
||||
---
|
||||
title: Infrastructure as Code - Simplifying My Homelab Setup with Portainer GitOps
|
||||
date: "2025-05-03"
|
||||
template: "post"
|
||||
category: "homelab"
|
||||
tags:
|
||||
- "homelab"
|
||||
- "portainer"
|
||||
- "gitops"
|
||||
- "iac"
|
||||
- "docker"
|
||||
- "unraid"
|
||||
- "kubernetes"
|
||||
description: "How I've simplified my homelab by combining the ease of Unraid storage management with Portainer's GitOps feature to implement Infrastructure as Code."
|
||||
socialImage: ./media/portainer_gitops.png
|
||||
---
|
||||
|
||||
After writing my last blog post about using Infrastructure as Code for uptime monitoring with UptimeKuma, I felt inspired to dive deeper into my broader homelab story.
|
||||
|
||||
## From Complexity to Clarity
|
||||
|
||||
When I started building my homelab, it was all about experimenting and having fun. Kubernetes, Ansible, HA clusters spread across multiple nodes... I dove into everything headfirst. The concept of Infrastructure as Code (IaC), something I fell deeply in love with thanks to Kubernetes, quickly became the backbone of my ideal setup.
|
||||
|
||||
Yet, as much as I enjoyed the complexity and elegance Kubernetes brought to my experiments, I soon realized something pretty obvious: when it comes to crucial services like Jellyfin for movies or Home Assistant for managing my smart home, the last thing I needed was an over-engineered, highly available Kubernetes cluster requiring constant babysitting.
|
||||
|
||||
## The Before Times
|
||||
|
||||
It reminded me of simpler times, the "before times", before Docker and Kubernetes even existed. Back then, my homelab consisted of multiple Ubuntu servers, each handling different parts of my setup, along with a single, reliable main server named "Erebus," using Greyhole for redundancy. Even when Docker came along (and later Kubernetes), I adopted them immediately for non-critical, experimental projects, but crucial services always remained comfortably on one stable server. After all, Kubernetes-level scalability was never really necessary for my home media or automation and I could still use all the benefits of Docker.
|
||||
|
||||
## Hades, the Storage Behemoth
|
||||
|
||||
Today, this philosophy still holds true. My critical services run smoothly on a single Unraid server, my trusted main storage server named "Hades." On Hades, it’s a pleasantly chaotic mix of Unraid's Docker plugin, community apps, and various Docker Compose files. Each container has decentralized configuration variables, with updates effortlessly handled by Unraid's auto-update plugin.
|
||||
|
||||
Here's the ironic twist: despite having Kubernetes nodes running non-critical, playful stuff, all my serious storage still ends up on Hades. Honestly, nothing else compares. Hades dwarfs every other node in my network storage-wise, think around 200TB of free space at any given time. Even Kubernetes relies heavily on Hades for its back-end storage.
|
||||
|
||||
## Simplifying with Portainer GitOps
|
||||
|
||||

|
||||
|
||||
Still, this fragmented setup felt manual and messy. I missed the simplicity and clarity of Infrastructure as Code. Thankfully, Portainer's Ops feature came to my rescue, allowing me to blend the massive storage and ease of use from Unraid with structured IaC management. To fully leverage this, I registered for 3 free nodes of Portainer Business Edition, unlocking their powerful GitOps feature.
|
||||
|
||||
Portainer's GitOps polls my private Git repository for updates to Docker Compose files at regular intervals, automatically deploying any changes. It seamlessly integrates with Docker Hub, pulling the latest container images and ensuring my stacks remain updated without manual intervention. This automation keeps my services fresh and secure with minimal effort.
|
||||
|
||||
The UptimeKuma example from my last blog is one such stack I recently migrated to this new, cleaner workflow.
|
||||
|
||||
## The Best of Both Worlds
|
||||
|
||||
Now, I have the best of both worlds—a robust and neatly structured setup embracing Infrastructure as Code without sacrificing ease of use or storage headaches. In other words, I could keep the things I liked best about my Kubernetes (the predictability and IaC parts) and got rid of its worst (multiple nodes, manual updates).  
|
||||
|
||||
On to the next adventure!
|
After Width: | Height: | Size: 1.9 MiB |
BIN
content/posts/2025/iac-part-2-my-homelab/media/sync.png
Normal file
After Width: | Height: | Size: 2.3 MiB |
292
package-lock.json
generated
@ -338,14 +338,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/code-frame": {
|
||||
"version": "7.26.2",
|
||||
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
|
||||
"integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
|
||||
"integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/helper-validator-identifier": "^7.25.9",
|
||||
"@babel/helper-validator-identifier": "^7.27.1",
|
||||
"js-tokens": "^4.0.0",
|
||||
"picocolors": "^1.0.0"
|
||||
"picocolors": "^1.1.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
@ -627,18 +627,18 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/helper-string-parser": {
|
||||
"version": "7.25.9",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
|
||||
"integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
|
||||
"integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/helper-validator-identifier": {
|
||||
"version": "7.25.9",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
|
||||
"integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
|
||||
"integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
@ -668,13 +668,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/helpers": {
|
||||
"version": "7.26.0",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz",
|
||||
"integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==",
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz",
|
||||
"integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/template": "^7.25.9",
|
||||
"@babel/types": "^7.26.0"
|
||||
"@babel/template": "^7.27.1",
|
||||
"@babel/types": "^7.27.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
@ -767,12 +767,12 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/parser": {
|
||||
"version": "7.26.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz",
|
||||
"integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==",
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.1.tgz",
|
||||
"integrity": "sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/types": "^7.26.3"
|
||||
"@babel/types": "^7.27.1"
|
||||
},
|
||||
"bin": {
|
||||
"parser": "bin/babel-parser.js"
|
||||
@ -2346,26 +2346,23 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/runtime": {
|
||||
"version": "7.26.0",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz",
|
||||
"integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==",
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz",
|
||||
"integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"regenerator-runtime": "^0.14.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/template": {
|
||||
"version": "7.25.9",
|
||||
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz",
|
||||
"integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==",
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.1.tgz",
|
||||
"integrity": "sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/code-frame": "^7.25.9",
|
||||
"@babel/parser": "^7.25.9",
|
||||
"@babel/types": "^7.25.9"
|
||||
"@babel/code-frame": "^7.27.1",
|
||||
"@babel/parser": "^7.27.1",
|
||||
"@babel/types": "^7.27.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
@ -2390,13 +2387,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/types": {
|
||||
"version": "7.26.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz",
|
||||
"integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==",
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz",
|
||||
"integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/helper-string-parser": "^7.25.9",
|
||||
"@babel/helper-validator-identifier": "^7.25.9"
|
||||
"@babel/helper-string-parser": "^7.27.1",
|
||||
"@babel/helper-validator-identifier": "^7.27.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
@ -4688,20 +4685,39 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/endpoint": {
|
||||
"version": "10.1.2",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.2.tgz",
|
||||
"integrity": "sha512-XybpFv9Ms4hX5OCHMZqyODYqGTZ3H6K6Vva+M9LR7ib/xr1y1ZnlChYv9H680y77Vd/i/k+thXApeRASBQkzhA==",
|
||||
"version": "10.1.4",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz",
|
||||
"integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@octokit/types": "^13.6.2",
|
||||
"@octokit/types": "^14.0.0",
|
||||
"universal-user-agent": "^7.0.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 18"
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/endpoint/node_modules/@octokit/openapi-types": {
|
||||
"version": "25.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz",
|
||||
"integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/@octokit/endpoint/node_modules/@octokit/types": {
|
||||
"version": "14.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz",
|
||||
"integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@octokit/openapi-types": "^25.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/graphql": {
|
||||
"version": "8.1.2",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.1.2.tgz",
|
||||
@ -4719,22 +4735,22 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/openapi-types": {
|
||||
"version": "22.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz",
|
||||
"integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==",
|
||||
"version": "24.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz",
|
||||
"integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/@octokit/plugin-paginate-rest": {
|
||||
"version": "11.3.6",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.6.tgz",
|
||||
"integrity": "sha512-zcvqqf/+TicbTCa/Z+3w4eBJcAxCFymtc0UAIsR3dEVoNilWld4oXdscQ3laXamTszUZdusw97K8+DrbFiOwjw==",
|
||||
"version": "11.6.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.6.0.tgz",
|
||||
"integrity": "sha512-n5KPteiF7pWKgBIBJSk8qzoZWcUkza2O6A0za97pMGVrGfPdltxrfmfF5GucHYvHGZD8BdaZmmHGz5cX/3gdpw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@octokit/types": "^13.6.2"
|
||||
"@octokit/types": "^13.10.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 18"
|
||||
@ -4781,16 +4797,16 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/request": {
|
||||
"version": "9.1.4",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.1.4.tgz",
|
||||
"integrity": "sha512-tMbOwGm6wDII6vygP3wUVqFTw3Aoo0FnVQyhihh8vVq12uO3P+vQZeo2CKMpWtPSogpACD0yyZAlVlQnjW71DA==",
|
||||
"version": "9.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.3.tgz",
|
||||
"integrity": "sha512-Ma+pZU8PXLOEYzsWf0cn/gY+ME57Wq8f49WTXA8FMHp2Ps9djKw//xYJ1je8Hm0pR2lU9FUGeJRWOtxq6olt4w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@octokit/endpoint": "^10.0.0",
|
||||
"@octokit/request-error": "^6.0.1",
|
||||
"@octokit/types": "^13.6.2",
|
||||
"@octokit/endpoint": "^10.1.4",
|
||||
"@octokit/request-error": "^6.1.8",
|
||||
"@octokit/types": "^14.0.0",
|
||||
"fast-content-type-parse": "^2.0.0",
|
||||
"universal-user-agent": "^7.0.2"
|
||||
},
|
||||
@ -4799,28 +4815,66 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/request-error": {
|
||||
"version": "6.1.6",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.6.tgz",
|
||||
"integrity": "sha512-pqnVKYo/at0NuOjinrgcQYpEbv4snvP3bKMRqHaD9kIsk9u1LCpb2smHZi8/qJfgeNqLo5hNW4Z7FezNdEo0xg==",
|
||||
"version": "6.1.8",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz",
|
||||
"integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@octokit/types": "^13.6.2"
|
||||
"@octokit/types": "^14.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 18"
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/types": {
|
||||
"version": "13.6.2",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.6.2.tgz",
|
||||
"integrity": "sha512-WpbZfZUcZU77DrSW4wbsSgTPfKcp286q3ItaIgvSbBpZJlu6mnYXAkjZz6LVZPXkEvLIM8McanyZejKTYUHipA==",
|
||||
"node_modules/@octokit/request-error/node_modules/@octokit/openapi-types": {
|
||||
"version": "25.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz",
|
||||
"integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/@octokit/request-error/node_modules/@octokit/types": {
|
||||
"version": "14.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz",
|
||||
"integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@octokit/openapi-types": "^22.2.0"
|
||||
"@octokit/openapi-types": "^25.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/request/node_modules/@octokit/openapi-types": {
|
||||
"version": "25.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz",
|
||||
"integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/@octokit/request/node_modules/@octokit/types": {
|
||||
"version": "14.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz",
|
||||
"integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@octokit/openapi-types": "^25.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/types": {
|
||||
"version": "13.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz",
|
||||
"integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@octokit/openapi-types": "^24.2.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/bundler-default": {
|
||||
@ -8917,9 +8971,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/axios": {
|
||||
"version": "1.7.9",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz",
|
||||
"integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
|
||||
"version": "1.9.0",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz",
|
||||
"integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"follow-redirects": "^1.15.6",
|
||||
@ -9459,55 +9513,81 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/bare-events": {
|
||||
"version": "2.5.0",
|
||||
"resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.0.tgz",
|
||||
"integrity": "sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==",
|
||||
"version": "2.5.4",
|
||||
"resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz",
|
||||
"integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==",
|
||||
"license": "Apache-2.0",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/bare-fs": {
|
||||
"version": "2.3.5",
|
||||
"resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz",
|
||||
"integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==",
|
||||
"version": "4.1.4",
|
||||
"resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.4.tgz",
|
||||
"integrity": "sha512-r8+26Voz8dGX3AYpJdFb1ZPaUSM8XOLCZvy+YGpRTmwPHIxA7Z3Jov/oMPtV7hfRQbOnH8qGlLTzQAbgtdNN0Q==",
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"bare-events": "^2.0.0",
|
||||
"bare-path": "^2.0.0",
|
||||
"bare-stream": "^2.0.0"
|
||||
"bare-events": "^2.5.4",
|
||||
"bare-path": "^3.0.0",
|
||||
"bare-stream": "^2.6.4"
|
||||
},
|
||||
"engines": {
|
||||
"bare": ">=1.16.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"bare-buffer": "*"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"bare-buffer": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/bare-os": {
|
||||
"version": "2.4.4",
|
||||
"resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz",
|
||||
"integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==",
|
||||
"version": "3.6.1",
|
||||
"resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz",
|
||||
"integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==",
|
||||
"license": "Apache-2.0",
|
||||
"optional": true
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"bare": ">=1.14.0"
|
||||
}
|
||||
},
|
||||
"node_modules/bare-path": {
|
||||
"version": "2.1.3",
|
||||
"resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz",
|
||||
"integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==",
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz",
|
||||
"integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==",
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"bare-os": "^2.1.0"
|
||||
"bare-os": "^3.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/bare-stream": {
|
||||
"version": "2.6.1",
|
||||
"resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.1.tgz",
|
||||
"integrity": "sha512-eVZbtKM+4uehzrsj49KtCy3Pbg7kO1pJ3SKZ1SFrIH/0pnj9scuGGgUlNDf/7qS8WKtGdiJY5Kyhs/ivYPTB/g==",
|
||||
"version": "2.6.5",
|
||||
"resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz",
|
||||
"integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==",
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"streamx": "^2.21.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"bare-buffer": "*",
|
||||
"bare-events": "*"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"bare-buffer": {
|
||||
"optional": true
|
||||
},
|
||||
"bare-events": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/base-x": {
|
||||
"version": "3.0.10",
|
||||
"resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz",
|
||||
"integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==",
|
||||
"version": "3.0.11",
|
||||
"resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz",
|
||||
"integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"safe-buffer": "^5.0.1"
|
||||
@ -23925,9 +24005,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/katex": {
|
||||
"version": "0.16.19",
|
||||
"resolved": "https://registry.npmjs.org/katex/-/katex-0.16.19.tgz",
|
||||
"integrity": "sha512-3IA6DYVhxhBabjSLTNO9S4+OliA3Qvb8pBQXMfC4WxXJgLwZgnfDl0BmB4z6nBMdznBsZ+CGM8DrGZ5hcguDZg==",
|
||||
"version": "0.16.22",
|
||||
"resolved": "https://registry.npmjs.org/katex/-/katex-0.16.22.tgz",
|
||||
"integrity": "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
"https://opencollective.com/katex",
|
||||
@ -33059,9 +33139,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/prebuild-install/node_modules/tar-fs": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
|
||||
"integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz",
|
||||
"integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"chownr": "^1.1.1",
|
||||
@ -33198,9 +33278,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/prismjs": {
|
||||
"version": "1.29.0",
|
||||
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
|
||||
"integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
|
||||
"version": "1.30.0",
|
||||
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz",
|
||||
"integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
@ -34359,12 +34439,6 @@
|
||||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/regenerator-runtime": {
|
||||
"version": "0.14.1",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
|
||||
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/regenerator-transform": {
|
||||
"version": "0.15.2",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
|
||||
@ -38668,17 +38742,17 @@
|
||||
}
|
||||
},
|
||||
"node_modules/tar-fs": {
|
||||
"version": "3.0.6",
|
||||
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz",
|
||||
"integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==",
|
||||
"version": "3.0.8",
|
||||
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz",
|
||||
"integrity": "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"pump": "^3.0.0",
|
||||
"tar-stream": "^3.1.5"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"bare-fs": "^2.1.1",
|
||||
"bare-path": "^2.1.0"
|
||||
"bare-fs": "^4.0.1",
|
||||
"bare-path": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/tar-stream": {
|
||||
|