Compare commits

..

61 Commits
v2.3.6 ... main

Author SHA1 Message Date
72739701a8
Merge pull request #18 from alexohneander/dependabot/npm_and_yarn/undici-5.28.5
build(deps-dev): bump undici from 5.28.4 to 5.28.5
2025-03-10 09:54:53 +01:00
8bc8c9550c
Merge pull request #19 from alexohneander/dependabot/npm_and_yarn/vite-5.4.14
build(deps): bump vite from 5.4.9 to 5.4.14
2025-03-10 09:54:41 +01:00
dependabot[bot]
7024d50fca
build(deps): bump vite from 5.4.9 to 5.4.14
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.4.9 to 5.4.14.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.14/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.14/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-22 07:35:39 +00:00
dependabot[bot]
c6859cb651
build(deps-dev): bump undici from 5.28.4 to 5.28.5
Bumps [undici](https://github.com/nodejs/undici) from 5.28.4 to 5.28.5.
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v5.28.4...v5.28.5)

---
updated-dependencies:
- dependency-name: undici
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-22 00:20:41 +00:00
9729792cfd
Merge pull request #15 from alexohneander/dependabot/npm_and_yarn/cross-spawn-7.0.6
build(deps-dev): bump cross-spawn from 7.0.3 to 7.0.6
2024-12-16 17:04:47 +01:00
696c5c1e05
Merge pull request #16 from alexohneander/dependabot/npm_and_yarn/nanoid-3.3.8
build(deps): bump nanoid from 3.3.7 to 3.3.8
2024-12-16 17:04:36 +01:00
dependabot[bot]
ddea171ea2
build(deps): bump nanoid from 3.3.7 to 3.3.8
Bumps [nanoid](https://github.com/ai/nanoid) from 3.3.7 to 3.3.8.
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/3.3.7...3.3.8)

---
updated-dependencies:
- dependency-name: nanoid
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-16 04:45:31 +00:00
dependabot[bot]
fde0158330
build(deps-dev): bump cross-spawn from 7.0.3 to 7.0.6
Bumps [cross-spawn](https://github.com/moxystudio/node-cross-spawn) from 7.0.3 to 7.0.6.
- [Changelog](https://github.com/moxystudio/node-cross-spawn/blob/master/CHANGELOG.md)
- [Commits](https://github.com/moxystudio/node-cross-spawn/compare/v7.0.3...v7.0.6)

---
updated-dependencies:
- dependency-name: cross-spawn
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-28 10:28:34 +00:00
3136a4b455
Update index.astro 2024-11-04 08:22:26 +01:00
7390d7aa36
Update config.ts 2024-11-04 08:21:43 +01:00
8709e60483
Update values-prod.yaml 2024-11-03 15:52:00 +01:00
72e69364c0
Update values-prod.yaml 2024-11-03 15:49:39 +01:00
54ab42c7b5
Merge pull request #14 from alexohneander/dependabot/npm_and_yarn/multi-f226eec316
build(deps): bump cookie, astro and @astrojs/tailwind
2024-10-17 08:33:15 +02:00
dependabot[bot]
c537a95b72
build(deps): bump cookie, astro and @astrojs/tailwind
Bumps [cookie](https://github.com/jshttp/cookie) to 0.7.2 and updates ancestor dependencies [cookie](https://github.com/jshttp/cookie), [astro](https://github.com/withastro/astro/tree/HEAD/packages/astro) and [@astrojs/tailwind](https://github.com/withastro/astro/tree/HEAD/packages/integrations/tailwind). These dependencies need to be updated together.


Updates `cookie` from 0.5.0 to 0.7.2
- [Release notes](https://github.com/jshttp/cookie/releases)
- [Commits](https://github.com/jshttp/cookie/compare/v0.5.0...v0.7.2)

Updates `astro` from 2.6.6 to 4.16.4
- [Release notes](https://github.com/withastro/astro/releases)
- [Changelog](https://github.com/withastro/astro/blob/main/packages/astro/CHANGELOG.md)
- [Commits](https://github.com/withastro/astro/commits/astro@4.16.4/packages/astro)

Updates `@astrojs/tailwind` from 3.1.3 to 5.1.2
- [Release notes](https://github.com/withastro/astro/releases)
- [Changelog](https://github.com/withastro/astro/blob/main/packages/integrations/tailwind/CHANGELOG.md)
- [Commits](https://github.com/withastro/astro/commits/@astrojs/tailwind@5.1.2/packages/integrations/tailwind)

---
updated-dependencies:
- dependency-name: cookie
  dependency-type: indirect
- dependency-name: astro
  dependency-type: direct:production
- dependency-name: "@astrojs/tailwind"
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-15 12:02:59 +00:00
af9dfe9e6b
Merge pull request #11 from alexohneander/dependabot/npm_and_yarn/path-to-regexp-6.3.0
build(deps): bump path-to-regexp from 6.2.1 to 6.3.0
2024-09-13 23:14:32 +02:00
dependabot[bot]
e3fef30bcd
build(deps): bump path-to-regexp from 6.2.1 to 6.3.0
Bumps [path-to-regexp](https://github.com/pillarjs/path-to-regexp) from 6.2.1 to 6.3.0.
- [Release notes](https://github.com/pillarjs/path-to-regexp/releases)
- [Changelog](https://github.com/pillarjs/path-to-regexp/blob/master/History.md)
- [Commits](https://github.com/pillarjs/path-to-regexp/compare/v6.2.1...v6.3.0)

---
updated-dependencies:
- dependency-name: path-to-regexp
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-12 18:27:09 +00:00
a4765a8ca7
Merge pull request #10 from alexohneander/dependabot/npm_and_yarn/dset-3.1.4
build(deps): bump dset from 3.1.2 to 3.1.4
2024-09-12 15:36:47 +02:00
15040820be
Merge pull request #9 from alexohneander/dependabot/npm_and_yarn/micromatch-4.0.8
build(deps): bump micromatch from 4.0.5 to 4.0.8
2024-09-12 15:36:34 +02:00
dependabot[bot]
b40b5b9283
build(deps): bump dset from 3.1.2 to 3.1.4
Bumps [dset](https://github.com/lukeed/dset) from 3.1.2 to 3.1.4.
- [Release notes](https://github.com/lukeed/dset/releases)
- [Commits](https://github.com/lukeed/dset/compare/v3.1.2...v3.1.4)

---
updated-dependencies:
- dependency-name: dset
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-11 23:28:47 +00:00
dependabot[bot]
4788fe2cb6
build(deps): bump micromatch from 4.0.5 to 4.0.8
Bumps [micromatch](https://github.com/micromatch/micromatch) from 4.0.5 to 4.0.8.
- [Release notes](https://github.com/micromatch/micromatch/releases)
- [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/micromatch/compare/4.0.5...4.0.8)

---
updated-dependencies:
- dependency-name: micromatch
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-05 09:36:23 +00:00
6fbb03a7ed
Update values-prod.yaml 2024-08-12 10:04:31 +02:00
a1e390287d
Merge pull request #7 from alexohneander/dependabot/npm_and_yarn/zod-3.23.8
build(deps): bump zod from 3.21.4 to 3.23.8
2024-08-12 10:01:36 +02:00
351eff1e15
Merge pull request #5 from alexohneander/dependabot/npm_and_yarn/sharp-0.32.6
build(deps): bump sharp from 0.32.1 to 0.32.6
2024-08-12 10:01:24 +02:00
dependabot[bot]
3114fca069
build(deps): bump sharp from 0.32.1 to 0.32.6
Bumps [sharp](https://github.com/lovell/sharp) from 0.32.1 to 0.32.6.
- [Release notes](https://github.com/lovell/sharp/releases)
- [Changelog](https://github.com/lovell/sharp/blob/main/docs/changelog.md)
- [Commits](https://github.com/lovell/sharp/compare/v0.32.1...v0.32.6)

---
updated-dependencies:
- dependency-name: sharp
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-12 08:01:06 +00:00
b14b975ef6
Merge pull request #6 from alexohneander/dependabot/npm_and_yarn/babel/traverse-7.25.3
build(deps): bump @babel/traverse from 7.22.5 to 7.25.3
2024-08-12 10:01:02 +02:00
87fbaff137
Merge pull request #8 from alexohneander/dependabot/npm_and_yarn/postcss-8.4.41
build(deps): bump postcss from 8.4.24 to 8.4.41
2024-08-12 10:00:38 +02:00
dependabot[bot]
ecf293c153
build(deps): bump postcss from 8.4.24 to 8.4.41
Bumps [postcss](https://github.com/postcss/postcss) from 8.4.24 to 8.4.41.
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/8.4.24...8.4.41)

---
updated-dependencies:
- dependency-name: postcss
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-12 08:00:18 +00:00
d7566f1472
Merge pull request #4 from alexohneander/dependabot/npm_and_yarn/vite-4.5.3
build(deps): bump vite from 4.3.9 to 4.5.3
2024-08-12 10:00:02 +02:00
7c08062e35
Merge pull request #3 from alexohneander/dependabot/npm_and_yarn/braces-3.0.3
build(deps): bump braces from 3.0.2 to 3.0.3
2024-08-12 09:59:54 +02:00
0aa7005de9
Merge pull request #2 from alexohneander/dependabot/npm_and_yarn/undici-5.28.4
build(deps): bump undici from 5.22.1 to 5.28.4
2024-08-12 09:59:43 +02:00
dependabot[bot]
e536f05258
build(deps): bump zod from 3.21.4 to 3.23.8
Bumps [zod](https://github.com/colinhacks/zod) from 3.21.4 to 3.23.8.
- [Release notes](https://github.com/colinhacks/zod/releases)
- [Changelog](https://github.com/colinhacks/zod/blob/main/CHANGELOG.md)
- [Commits](https://github.com/colinhacks/zod/compare/v3.21.4...v3.23.8)

---
updated-dependencies:
- dependency-name: zod
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-12 07:59:24 +00:00
48346c9c6f
Merge pull request #1 from alexohneander/dependabot/npm_and_yarn/fast-xml-parser-4.4.1
build(deps): bump fast-xml-parser from 4.2.6 to 4.4.1
2024-08-12 09:59:20 +02:00
dependabot[bot]
2e28aa45bb
build(deps): bump @babel/traverse from 7.22.5 to 7.25.3
Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.22.5 to 7.25.3.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.25.3/packages/babel-traverse)

---
updated-dependencies:
- dependency-name: "@babel/traverse"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-12 07:58:52 +00:00
dependabot[bot]
3516342fea
build(deps): bump vite from 4.3.9 to 4.5.3
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 4.3.9 to 4.5.3.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v4.5.3/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v4.5.3/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-12 07:58:49 +00:00
dependabot[bot]
98beb48e6d
build(deps): bump braces from 3.0.2 to 3.0.3
Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3.
- [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3)

---
updated-dependencies:
- dependency-name: braces
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-12 07:58:48 +00:00
dependabot[bot]
555d0a011e
build(deps): bump undici from 5.22.1 to 5.28.4
Bumps [undici](https://github.com/nodejs/undici) from 5.22.1 to 5.28.4.
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v5.22.1...v5.28.4)

---
updated-dependencies:
- dependency-name: undici
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-12 07:58:44 +00:00
dependabot[bot]
157cc7780a
build(deps): bump fast-xml-parser from 4.2.6 to 4.4.1
Bumps [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser) from 4.2.6 to 4.4.1.
- [Release notes](https://github.com/NaturalIntelligence/fast-xml-parser/releases)
- [Changelog](https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/NaturalIntelligence/fast-xml-parser/compare/v4.2.6...v4.4.1)

---
updated-dependencies:
- dependency-name: fast-xml-parser
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-12 07:58:44 +00:00
974236e5a4
Create dependabot.yml 2024-08-12 09:57:59 +02:00
Alex Wellnitz
c141f27773 ci: update container image 2024-06-25 14:50:18 +02:00
Alex Wellnitz
30f08c832c feature: add new experience 2024-06-25 14:48:23 +02:00
3ff0c470a6 feat: Update Article 2023-11-03 23:39:43 +01:00
18ef7639f6 ci: Update Image version 2023-11-03 23:11:42 +01:00
864ce4bb42 feat: Add Image in Article 2023-11-03 23:11:17 +01:00
dd8a19de73 ci: Update Image Version 2023-11-03 22:41:18 +01:00
8e72b765f7 feat: New Article 2023-11-03 22:40:40 +01:00
c9c18dad91
Update vscode-debug-settings-collection.md 2023-09-29 10:54:44 +02:00
Alex Wellnitz
688230661f ci: Update container image 2023-09-26 14:55:08 +02:00
Alex Wellnitz
05de27abe9 2.3.10 2023-09-26 14:54:30 +02:00
Alex Wellnitz
1209346a71 fix: update packag.json 2023-09-26 14:54:23 +02:00
Alex Wellnitz
3db6264f66 feat: update sitemap plugin 2023-09-26 14:53:44 +02:00
4c08105626
Update values-prod.yaml 2023-09-25 18:04:01 +02:00
6941f97721
Update Layout.astro 2023-09-25 18:01:59 +02:00
ca015a59d8
Update Socials.astro 2023-09-25 15:52:01 +02:00
94ea56f946
Update values-prod.yaml 2023-09-25 15:49:46 +02:00
6cb96c6ab1
Update Socials.astro 2023-09-25 15:40:40 +02:00
8a8269648c
Update config.ts 2023-09-25 15:39:23 +02:00
b921284f4d
Create vscode-debug-settings-collection.md 2023-09-17 12:26:56 +02:00
697b482095 ci: update image version in helm chart 2023-09-04 11:50:06 +02:00
c3a4ced3ac 2.3.7 2023-09-04 11:46:58 +02:00
8266430503 style: auto Format files with Prettier 2023-09-04 11:41:11 +02:00
0377f5a73e ci: update image in helm chart 2023-09-04 11:27:30 +02:00
22 changed files with 7954 additions and 3446 deletions

11
.github/dependabot.yml vendored Normal file
View File

@ -0,0 +1,11 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
version: 2
updates:
- package-ecosystem: "" # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: "weekly"

View File

@ -1,10 +1,10 @@
name: Docker Image CI
on:
push:
tags:
- '*'
workflow_dispatch:
push:
tags:
- "*"
workflow_dispatch:
env:
CARGO_TERM_COLOR: always
@ -13,26 +13,26 @@ jobs:
build-container:
runs-on: ubuntu-latest
steps:
- name: Check out the repo
uses: actions/checkout@v3
- name: Check out the repo
uses: actions/checkout@v3
- name: Log in to Docker Hub
uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Log in to Docker Hub
uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
with:
images: alexohneander/alexohneander-astro
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
with:
images: alexohneander/alexohneander-astro
- name: Build and push Docker image
uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671
with:
context: .
file: ./Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
- name: Build and push Docker image
uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671
with:
context: .
file: ./Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}

View File

@ -2,7 +2,7 @@ image:
repository: alexohneander/alexohneander-astro
pullPolicy: IfNotPresent
# Overrides the image tag whose default is the chart appVersion.
tag: "v2.3.5"
tag: "v2.4.0"
ingress:
enabled: true
@ -11,12 +11,24 @@ ingress:
kubernetes.io/ingress.class: nginx
kubernetes.io/tls-acme: "true"
cert-manager.io/cluster-issuer: letsencrypt-prod
nginx.ingress.kubernetes.io/configuration-snippet : |
if ($request_uri ~* \.(gif|jpe?g|png|woff2)) {
expires 1M;
add_header Cache-Control "public";
}
#nginx.ingress.kubernetes.io/configuration-snippet : |
# if ($request_uri ~* \.(gif|jpe?g|png|woff2)) {
# expires 1M;
# add_header Cache-Control "public";
# }
hosts:
- host: www.wellnitz-alex.de
paths:
- path: /
pathType: Prefix
- host: www.alexohneander.de
paths:
- path: /
pathType: Prefix
- host: wellnitz-alex.de
paths:
- path: /
pathType: Prefix
- host: alexohneander.de
paths:
- path: /
@ -25,3 +37,6 @@ ingress:
- secretName: alexohneander-tls
hosts:
- alexohneander.de
- wellnitz-alex.de
- www.alexohneander.de
- www.wellnitz-alex.de

10868
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{
"name": "alexohneander-astro",
"version": "2.3.6",
"version": "2.3.10",
"scripts": {
"dev": "astro check --watch & astro dev",
"start": "astro dev",
@ -17,7 +17,7 @@
"dependencies": {
"@astrojs/rss": "^2.4.1",
"@resvg/resvg-js": "^2.4.1",
"astro": "^2.4.5",
"astro": "^4.16.4",
"fuse.js": "^6.6.2",
"github-slugger": "^2.0.0",
"remark-collapse": "^0.1.2",
@ -27,8 +27,8 @@
},
"devDependencies": {
"@astrojs/react": "^2.1.3",
"@astrojs/sitemap": "^1.3.1",
"@astrojs/tailwind": "^3.1.2",
"@astrojs/sitemap": "^1.4.0",
"@astrojs/tailwind": "^5.1.2",
"@divriots/jampack": "^0.11.2",
"@tailwindcss/typography": "^0.5.9",
"@types/github-slugger": "^1.3.0",

View File

@ -69,7 +69,10 @@ const { activeNav } = Astro.props;
</a>
</li>
<li>
<a href="/experience" class={activeNav === "experience" ? "active" : ""}>
<a
href="/experience"
class={activeNav === "experience" ? "active" : ""}
>
Experience
</a>
</li>

View File

@ -8,7 +8,14 @@ export interface Props {
newTarget?: boolean;
}
const { href, className, ariaLabel, title, disabled = false, newTarget = true } = Astro.props;
const {
href,
className,
ariaLabel,
title,
disabled = false,
newTarget = true,
} = Astro.props;
---
<a
@ -18,7 +25,7 @@ const { href, className, ariaLabel, title, disabled = false, newTarget = true }
aria-label={ariaLabel}
title={title}
aria-disabled={disabled}
target={ newTarget ? "_blank" : "_self"}
target={newTarget ? "_blank" : "_self"}
>
<slot />
</a>

View File

@ -17,6 +17,7 @@ const { centered = false } = Astro.props;
href={social.href}
className="link-button"
title={social.linkTitle}
>
<Fragment set:html={socialIcons[social.name]} />
</LinkButton>

View File

@ -3,7 +3,7 @@ import type { Site, SocialObjects } from "./types";
export const SITE: Site = {
website: "https://astro-paper.pages.dev/",
author: "Alex Wellnitz",
desc: "A minimal, responsive and SEO-friendly Astro blog theme.",
desc: "Alex Wellnitz DevOps Architect | Software Developer | Kubernetes Expert | Network Security | Web Performance Optimization. Accelerating web performance and modernizing application delivery.",
title: "Alexohneander",
subtitle: "Engineering Chaos",
ogImage: "astropaper-og.jpg",
@ -137,8 +137,8 @@ export const SOCIALS: SocialObjects = [
},
{
name: "Mastodon",
href: "https://github.com/satnaing/astro-paper",
href: "https://mastodon.social/@alexohneander",
linkTitle: `${SITE.title} on Mastodon`,
active: false,
active: true,
},
];

View File

@ -12,8 +12,7 @@ tags:
- bash
- backup
ogImage: ""
description:
In this post, we will show you how to create a MySQL server backup using Kubernetes CronJobs.
description: In this post, we will show you how to create a MySQL server backup using Kubernetes CronJobs.
---
In this post, we will show you how to create a MySQL server backup using Kubernetes CronJobs.
@ -22,6 +21,7 @@ In our case, we do not have a managed MySQL server. But we want to backup it to
For this we first build a container that can execute our tasks, because we will certainly need several tasks to backup our cluster.
## CronJob Agent Container
First, we'll show you our Dockerfile so you know what we need.
```Dockerfile
@ -41,6 +41,7 @@ RUN mkdir /var/backup/mysql
```
## Backup Script
And now our backup script which the container executes.
Our script is quite simple, we get all tables with the mysql client, export them as sql file, pack them in a zip file and send them in a 8 hours interval to our NAS.
@ -89,6 +90,7 @@ rsync -avz $BACKUPDIR/backup-${NOW}.tar.gz root@$BACKUPSERVER:$BACKUPREMOTEDIR
```
## Kubernetes CronJob Deployment
Finally we show you the kubernetes deployment for our agent.
In the deployment, our agent is defined as a CronJob that runs every 8 hours.
@ -111,7 +113,7 @@ spec:
containers:
- name: cronjob-agent
image: xxx/cronjob-agent
command: ["bash", "/srv/jobs/backup-mariadb.sh"]
command: ["bash", "/srv/jobs/backup-mariadb.sh"]
volumeMounts:
- mountPath: /root/.ssh/id_rsa.pub
name: cronjob-default-config

View File

@ -10,13 +10,13 @@ tags:
- cni
- baremetal
ogImage: ""
description:
In a freshly set up Kubernetes cluster, we need a so-called CNI. This CNI is not always present after installation.
description: In a freshly set up Kubernetes cluster, we need a so-called CNI. This CNI is not always present after installation.
---
In a freshly set up Kubernetes cluster, we need a so-called CNI. This CNI is not always present after installation.
## What is a Container Network Interface (CNI)?
CNI is a network framework that allows the dynamic configuration of networking resources through a group of Go-written specifications and libraries. The specification mentioned for the plugin outlines an interface that would configure the network, provisioning the IP addresses, and mantain multi-host connectivity.
In the Kubernetes context, the CNI seamlessly integrates with the kubelet to allow automatic network configuration between pods using an underlay or overlay network. An underlay network is defined at the physical level of the networking layer composed of routers and switches. In contrast, the overlay network uses a virtual interface like VxLAN to encapsulate the network traffic.
@ -26,6 +26,7 @@ Once the network configuration type is specified, the runtime defines a network
In addition to Kubernetes networking, CNI also supports Kubernetes-based platforms like OpenShift to provide a unified container communication across the cluster through software-defined networking (SDN) approach.
### What is Cilium?
Cilium is an open-source, highly scalable Kubernetes CNI solution developed by Linux kernel developers. Cilium secures network connectivity between Kubernetes services by adding high-level application rules utilizing eBPF filtering technology. Cilium is deployed as a daemon `cilium-agent` on each node of the Kubernetes cluster to manage operations and translates the network definitions to eBPF programs.
The communication between pods happens over an overlay network or utilizing a routing protocol. Both IPv4 and IPv6 addresses are supported for cases. Overlay network implementation utilizes VXLAN tunneling for packet encapsulation while native routing happens through unencapsulated BGP protocol.
@ -37,10 +38,12 @@ Its network and application layer awareness manages packet inspection, and the a
Cilium also has support for Kubernetes Network Policies through HTTP request filters. The policy configuration can be written into a YAML or JSON file and offers both ingress and egress enforcements. Admins can accept or reject requests based on the request method or path header while integrating policies with service mesh like Istio.
### Preparation
For the installation we need the CLI from Cilium.
We can install this with the following commands:
**Mac OSx**
```bash
curl -L --remote-name-all https://github.com/cilium/cilium-cli/releases/latest/download/cilium-darwin-amd64.tar.gz{,.sha256sum}
shasum -a 256 -c cilium-darwin-amd64.tar.gz.sha256sum
@ -49,6 +52,7 @@ rm cilium-darwin-amd64.tar.gz{,.sha256sum}
```
**Linux**
```bash
curl -L --remote-name-all https://github.com/cilium/cilium-cli/releases/latest/download/cilium-linux-amd64.tar.gz{,.sha256sum}
sha256sum --check cilium-linux-amd64.tar.gz.sha256sum
@ -57,14 +61,18 @@ rm cilium-linux-amd64.tar.gz{,.sha256sum}
```
### Install Cilium
You can install Cilium on any Kubernetes cluster. These are the generic instructions on how to install Cilium into any Kubernetes cluster. The installer will attempt to automatically pick the best configuration options for you.
#### Requirements
- Kubernetes must be configured to use CNI
- Linux kernel >= 4.9.17
#### Install
Install Cilium into the Kubernetes cluster pointed to by your current kubectl context:
```bash
cilium install
```
@ -72,7 +80,9 @@ cilium install
If the installation fails for some reason, run `cilium status` to retrieve the overall status of the Cilium deployment and inspect the logs of whatever pods are failing to be deployed.
### Validate the Installation
To validate that Cilium has been properly installed, you can run
```bash
$ cilium status --wait
/¯¯\
@ -91,6 +101,7 @@ Image versions cilium quay.io/cilium/cilium:v1.9.5: 2
```
Run the following command to validate that your cluster has proper network connectivity:
```bash
$ cilium connectivity test
Monitor aggregation detected, will skip some flow validation steps
@ -101,4 +112,5 @@ $ cilium connectivity test
---------------------------------------------------------------------------------------------------------------------
✅ 69/69 tests successful (0 warnings)
```
Congratulations! You have a fully functional Kubernetes cluster with Cilium. 🎉

View File

@ -0,0 +1,90 @@
---
author: Alex Wellnitz
pubDatetime: 2023-11-03T19:20:50+02:00
title: Highly scalable Minecraft cluster
postSlug: highly-scalable-minecraft-cluster
featured: true
draft: false
tags:
- kubernetes
- minecraft
- cluster
ogImage: ""
description: How to build and configure a highly scalable Minecraft server
---
Are you planning a very large Minecraft LAN party? Then this article is for you. Here I show you how to set up a highly scalable Minecraft cluster.
### What is a Minecraft cluster?
A Minecraft cluster is a Minecraft server network that consists of multiple Minecraft servers. These servers are connected to each other via a network and can therefore be shared. This means that you can play with your friends on a server that consists of multiple servers.
### How does a Minecraft cluster work?
A Minecraft cluster consists of several components.
<!-- Image -->
![Minecraft cluster](https://github.com/MultiPaper/MultiPaper/raw/main/assets/multipaper-diagram.jpg)
#### Master database
First, there is the master database. This database allows servers to store data in a central location that all servers can access. Servers store chunks, maps, level.dat, player data, banned players, and more in this database. This database also records which chunk belongs to which server and coordinates communication between servers.
#### Server
The master database is great for storing data, but not so good at synchronizing data in real time between servers. This is where peer-to-peer communication comes in. Each server establishes a connection to another server so that data between them can be updated in real time. When a player on server A attacks another player on server B, server A sends this data directly to server B so that server B can damage the player and apply any knockback.
#### Load Balancer
The load balancer is the last component of the cluster. A load balancer is required to distribute players evenly across your servers. A load balancer automatically distributes players between servers to distribute the load evenly across the individual servers.
### Why do I need multiple servers?
By having multiple servers, we can distribute the load across multiple servers. This means that we can have more players on our servers without the servers becoming overloaded. With this setup, we can also easily add new servers if we get more players. If the number of players decreases again, the server can be removed again.
## Preparation
You should be familiar with Kubernetes and have set up a Kubernetes cluster. I recommend [k3s](https://k3s.io/).
You should also be familiar with Helm. I recommend [Helm 3](https://helm.sh/docs/intro/install/).
## Installation
First, you should clone the repository.
```bash
git clone git@github.com:alexohneander/MultiPaperHelm.git
cd MultiPaperHelm/
```
I installed the entire setup in a separate namespace. You can create this namespace with the following command.
```bash
kubectl create namespace minecraft
```
Next, we install the Minecraft cluster with Helm.
```bash
helm install multipaper . --namespace minecraf
```
Once the Helm chart is installed, you can view the port of the proxy service.
```bash
kubectl describe service multipaper-master-proxy -n minecraft
```
This port is the port that you need to enter in your Minecraft client.
## Configuration
The Helm chart creates several ConfigMaps. In these ConfigMaps, you can customize the configuration of your cluster.
For example, you can set the number of maximum players or change the description of the server.
For more information on the individual config files, see [MultiPaper](https://github.com/MultiPaper/MultiPaper).
## Conclusion
With this setup, you can easily set up a highly scalable Minecraft cluster. You can easily add new servers if you get more players and remove them again if the number of players decreases again.
You can test this setup under the following Server Address: `minecraft.alexohneander.de:31732`
If you have any questions, feel free to contact me on [Email](mailto:moin@wellnitz-alex.de) or on [Matrix](https://matrix.to/#/@alexohneander:dev-null.rocks).

View File

@ -10,8 +10,7 @@ tags:
- openvpn
- google
ogImage: ""
description:
In this tutorial I will try to explain you briefly and concisely how you can set up a site-to-site VPN for the Google Cloud Network.
description: In this tutorial I will try to explain you briefly and concisely how you can set up a site-to-site VPN for the Google Cloud Network.
---
In this tutorial I will try to explain you briefly and concisely how you can set up a site-to-site VPN for the Google Cloud Network.
@ -23,13 +22,17 @@ We need 2 virtual machines. The first one on the side of our office and the othe
#### Setup OpenVPN Clients
##### Site-to-Site Client Office Side
We need to install OpenVPN, we do it as follows:
```bash
apt install openvpn -y
```
After that we add our OpenVPN configuration under this path `/etc/openvpn/s2s.conf`.
*s2s.conf*
_s2s.conf_
```
# Use a dynamic tun device.
# For Linux 2.2 or non-Linux OSes,
@ -78,11 +81,15 @@ verb 3
log /etc/openvpn/s2s.log
```
We also have to enable the IPv4 forward function in the kernel, so we go to `/etc/sysctl.conf` and comment out the following line:
```
net.ipv4.ip_forward=1
```
We can then start our OpenVPN client with this command:
```bash
systemctl start openvpn@s2s
```
@ -90,11 +97,13 @@ systemctl start openvpn@s2s
On the Office side we have to open the port for the OpenVPN client that the other side can connect.
##### Site-to-Site Client Google Side
When setting up the OpenVPN client on Google's site, we need to consider the following settings when creating it. When we create the machine, we need to enable this option in the network settings:
![Google Cloud Network Settings](https://i.imgur.com/OXEkhxo.png)
Also on this side we have to install the OpenVPN client again and then add this config under the path `/etc/openvpn/s2s.conf`:
```
# Use a dynamic tun device.
# For Linux 2.2 or non-Linux OSes,
@ -143,12 +152,15 @@ verb 3
log /etc/openvpn/s2s.log
```
We also have to enable the IPv4 forward function in the kernel, so we go to `/etc/sysctl.conf` and comment out the following line:
```
net.ipv4.ip_forward=1
```
##### Connection test
Now that both clients are basically configured we can test the connection. Both clients have to be started with systemctl. After that we look at the logs with `tail -f /etc/openvpn/s2s-log` and wait for this message:
```
@ -167,6 +179,7 @@ Wed May 5 08:28:12 2021 Initialization Sequence Completed
If we can't establish a connection, we need to check if the ports are opened on both sides.
#### Routing Google Cloud Network
After our clients have finished installing and configuring, we need to set the routes on Google. I will not map the Office side, as this is always different. But you have to route the networks for the Google network there as well.
To set the route on Google we go to the network settings and then to Routes. Here you have to specify your office network so that the clients in the Google network know what to do.
@ -174,6 +187,7 @@ To set the route on Google we go to the network settings and then to Routes. Her
![Google Cloud Network Route](https://i.imgur.com/6Q2Drf4.png)
#### IP-Masquerade-Agent
IP masquerading is a form of network address translation (NAT) used to perform many-to-one IP address translations, which allows multiple clients to access a destination using a single IP address. A GKE cluster uses IP masquerading so that destinations outside of the cluster only receive packets from node IP addresses instead of Pod IP addresses. This is useful in environments that expect to only receive packets from node IP addresses.
You have to edit the ip-masq-agent and this configuration is responsible for letting the pods inside the nodes, reach other parts of the GCP VPC Network, more specifically the VPN. So, it allows pods to communicate with the devices that are accessible through the VPN.
@ -182,11 +196,12 @@ First of all we're gonna be working inside the kube-system namespace, and we're
```yaml
nonMasqueradeCIDRs:
- 10.24.0.0/14 # The IPv4 CIDR the cluster is using for Pods (required)
- 10.24.0.0/14 # The IPv4 CIDR the cluster is using for Pods (required)
- 10.156.0.0/20 # The IPv4 CIDR of the subnetwork the cluster is using for Nodes (optional, works without but I guess its better with it)
masqLinkLocal: false
resyncInterval: 60s
```
and run `kubectl create configmap ip-masq-agent --from-file config --namespace kube-system`
afterwards, configure the ip-masq-agent, put this in a `ip-masq-agent.yml` file:
@ -205,17 +220,17 @@ spec:
spec:
hostNetwork: true
containers:
- name: ip-masq-agent
image: gcr.io/google-containers/ip-masq-agent-amd64:v2.4.1
args:
- name: ip-masq-agent
image: gcr.io/google-containers/ip-masq-agent-amd64:v2.4.1
args:
- --masq-chain=IP-MASQ
# To non-masquerade reserved IP ranges by default, uncomment the line below.
# - --nomasq-all-reserved-ranges
securityContext:
privileged: true
volumeMounts:
- name: config
mountPath: /etc/config
securityContext:
privileged: true
volumeMounts:
- name: config
mountPath: /etc/config
volumes:
- name: config
configMap:
@ -227,12 +242,12 @@ spec:
- key: config
path: ip-masq-agent
tolerations:
- effect: NoSchedule
operator: Exists
- effect: NoExecute
operator: Exists
- key: "CriticalAddonsOnly"
operator: "Exists"
- effect: NoSchedule
operator: Exists
- effect: NoExecute
operator: Exists
- key: "CriticalAddonsOnly"
operator: "Exists"
```
and run `kubectl -n kube-system apply -f ip-masq-agent.yml`.

View File

@ -0,0 +1,47 @@
---
author: Alex Wellnitz
pubDatetime: 2023-17-09T12:20:27+02:00
title: VSCode debug settings Collection
postSlug: vscode-debug-settings-collection.md
featured: true
draft: true
tags:
- vscode
- debug
- development
ogImage: ""
description: In this post, we will show you how to create a MySQL server backup using Kubernetes CronJobs.
---
### Go VSCode debugging
**launch.json:**
```json
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Package",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${workspaceRoot}"
}
]
}
```
### Java Remote VSCode debugging
**launch.json:**
```json
"version": "0.2.0",
"configurations": [
{
"type": "java",
"name": "Debug (Attach)",
"projectName": "MyApplication",
"request": "attach",
"hostName": "localhost",
"port": 8787
}
]
```

View File

@ -10,9 +10,8 @@ tags:
- network
- haproxy
ogImage: ""
description:
To briefly explain the situation.
We have a **HAProxy** running on a Debian server as a Docker container. This is the entrance node to a **Docker Swarm** cluster.
description: To briefly explain the situation.
We have a **HAProxy** running on a Debian server as a Docker container. This is the entrance node to a **Docker Swarm** cluster.
---
To briefly explain the situation:

View File

@ -10,8 +10,7 @@ tags:
- linux
- backup
ogImage: ""
description:
Since we all know that the first rule is "no backup, no pity", I'll show you how you can use Borg to back up your important data in an encrypted way with relative ease.
description: Since we all know that the first rule is "no backup, no pity", I'll show you how you can use Borg to back up your important data in an encrypted way with relative ease.
---
Since we all know that the first rule is "no backup, no pity", I'll show you how you can use Borg to back up your important data in an encrypted way with relative ease.
@ -19,14 +18,17 @@ Since we all know that the first rule is "no backup, no pity", I'll show you how
If you do not want to use a second computer, but an external hard drive, you can adjust this later in the script and ignore the points in the instructions for the second computer.
### Requirements
- 2 Linux Computers
- Borg
- SSH
- Storage
- More than 5 brain cells
- 2 Linux Computers
- Borg
- SSH
- Storage
- More than 5 brain cells
### Installation
First we need to install borg on both computers so that we can back up on one and save on the other.
```bash
sudo apt install borgbackup
```
@ -34,11 +36,13 @@ sudo apt install borgbackup
Then we create a Borg repository. We can either use an external target or a local path.
**External Target:**
```bash
borg init --encryption=repokey ssh://user@192.168.2.42:22/mnt/backup/borg
```
**Local Path:**
```bash
borg init --encryption=repokey /path/to/backup_folder
```
@ -49,6 +53,7 @@ This way you don't have to enter a password and is simply nicer from my point of
Once you have created everything and prepared the script with your parameters, I recommend that you run the script as a CronJob so that you no longer have to remember to back up your things yourself.
**crontab example:**
```bash
#Minute Hour Day Month Day(Week) command
#(0-59) (0-23) (1-31) (1-12) (1-7;1=Mo)
@ -56,6 +61,7 @@ Once you have created everything and prepared the script with your parameters, I
```
### Automated script
```bash
#!/bin/sh
@ -113,6 +119,7 @@ exit ${global_exit}
```
### Get your data from the backup
First, we create a temporary directory in which we can mount the backup.
```bash
@ -125,7 +132,9 @@ At this point you must remember that you can use an external destination or a lo
```bash
borg mount ssh://user@192.168.2.42/mnt/backup/borg /tmp/borg-backup
```
Once our repo is mounted, we can change into the directory and restore files via **rsync** or **cp**.
### Conclusion
I hope you could understand everything and now secure your shit sensibly. Because without a backup we are all lost!

View File

@ -35,6 +35,7 @@ const socialImageURL = new URL(
<meta name="viewport" content="width=device-width" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="canonical" href={canonicalURL} />
<link rel="me" href="https://mastodon.social/@alexohneander" />
<meta name="generator" content={Astro.generator} />
<!-- General Meta Tags -->

View File

@ -13,7 +13,8 @@ export interface Props {
const { post } = Astro.props;
const { title, author, description, ogImage, canonicalURL, pubDatetime, tags } = post.data;
const { title, author, description, ogImage, canonicalURL, pubDatetime, tags } =
post.data;
const { Content } = await post.render();
@ -21,7 +22,13 @@ const ogUrl = new URL(ogImage ? ogImage : `${title}.png`, Astro.url.origin)
.href;
---
<Layout title={title} author={author} description={description} ogImage={ogUrl} canonicalURL={canonicalURL}>
<Layout
title={title}
author={author}
description={description}
ogImage={ogUrl}
canonicalURL={canonicalURL}
>
<Header />
<div class="mx-auto flex w-full max-w-3xl justify-start px-2">
<button

View File

@ -4,62 +4,80 @@ title: "Experience"
---
### DevOps Engineer, Materna SE
**since 2023**
As a key globally active IT service provider, Materna advise and assist you in all aspects of digitization and provide tailor-made technologies for agile, flexible and secure IT.
- **Infrastructure as Code (IaC)**:
- Develop and maintain infrastructure as code scripts using tools like Terraform, Ansible, or CloudFormation to automate the provisioning of infrastructure resources.
- **Continuous Integration (CI) and Continuous Deployment (CD)**:
- Implement and manage CI/CD pipelines using tools like Jenkins, Travis CI, or GitLab CI to automate the software delivery process.
- **Containerization and Orchestration**:
- Work with Docker containers and container orchestration platforms like Kubernetes to improve scalability and resource utilization.
- **Monitoring and Logging**:
- Set up monitoring and logging solutions (e.g., Prometheus, ELK Stack) to track application performance, identify issues, and troubleshoot problems proactively.
- **Collaboration and Communication**:
- Foster collaboration between development and operations teams, ensuring effective communication and knowledge sharing.
- **Infrastructure Optimization**:
- Analyze and optimize infrastructure costs, resource utilization, and performance to achieve cost-efficiency and scalability.
- **Troubleshooting and Support**:
- Respond to incidents, diagnose problems, and provide support to ensure system reliability and availability.
- **Infrastructure as Code (IaC)**:
- Develop and maintain infrastructure as code scripts using tools like Terraform, Ansible, or CloudFormation to automate the provisioning of infrastructure resources.
- **Continuous Integration (CI) and Continuous Deployment (CD)**:
- Implement and manage CI/CD pipelines using tools like Jenkins, Travis CI, or GitLab CI to automate the software delivery process.
- **Containerization and Orchestration**:
- Work with Docker containers and container orchestration platforms like Kubernetes to improve scalability and resource utilization.
- **Monitoring and Logging**:
- Set up monitoring and logging solutions (e.g., Prometheus, ELK Stack) to track application performance, identify issues, and troubleshoot problems proactively.
- **Collaboration and Communication**:
- Foster collaboration between development and operations teams, ensuring effective communication and knowledge sharing.
- **Infrastructure Optimization**:
- Analyze and optimize infrastructure costs, resource utilization, and performance to achieve cost-efficiency and scalability.
- **Troubleshooting and Support**:
- Respond to incidents, diagnose problems, and provide support to ensure system reliability and availability.
### DevOps Engineer, Apozin GmbH
**until 2023**
Apozin turns visions into a competitive advantage. Our team of pharmacists, PTA's, graphic designers, web designers, sales professionals, marketing specialists, and programmers realize holistic concepts that we constantly evolve and improve for our clients.
- Operation and design of Kubernetes clusters at multiple locations
- Design and implementation of backup strategies
- Deployment of various services (including HAProxy, MariaDB, MongoDB, Elasticsearch, NGINX)
- Design and operation of comprehensive monitoring solutions (Zabbix, Grafana, Prometheus, Graylog)
- Design and setup of build pipelines with Jenkins, Docker, and FluxCD
- Administration of various servers in different environments (Google Cloud, Hetzner, AWS, Digital Ocean, Hosting.de)
- Operation and design of Kubernetes clusters at multiple locations
- Design and implementation of backup strategies
- Deployment of various services (including HAProxy, MariaDB, MongoDB, Elasticsearch, NGINX)
- Design and operation of comprehensive monitoring solutions (Zabbix, Grafana, Prometheus, Graylog)
- Design and setup of build pipelines with Jenkins, Docker, and FluxCD
- Administration of various servers in different environments (Google Cloud, Hetzner, AWS, Digital Ocean, Hosting.de)
### Fullstack .Net Developer, prointernet
**until 2019**
Agency for internet and design founded in 1998, established in Kastellaun in the Hunsrück region, operating worldwide, and at home on the internet. A team of designers, developers, and consultants who love what they do.
- Development of web applications (C#, Dotnet, JS)
- Design of websites (Composite C1)
- Company Website
- Development of web applications (C#, Dotnet, JS)
- Design of websites (Composite C1)
- Company Website
## Projects
### DevOps Engineer, Cofinity-X
**since 2023**
Cofinity-X is the first operator of the Catena-X network, connecting automotive partners at every level of the value chain. As a DevOps engineer, I was responsible for the enablement services.
- Deployment of various open source Projects with GitOps and ArgoCD
- Managing projects on a Kubernetes clusters
- Communication with end customers (support, troubleshooting)
- Analysis of problems and spikes in load
- Planning new projects and deploying to the Kubernetes clusters
### DevOps Engineer, Amamed
**until 2023**
Just right for your pharmacy! amamed is the only digital solution on the market that puts your pharmacy at the center and makes you fully equipped, secure, and flexible online.
- Provision of various services (including reverse proxies, databases, load balancers)
- Operation of Docker Swarm clusters
- Product Website
- Provision of various services (including reverse proxies, databases, load balancers)
- Operation of Docker Swarm clusters
- Product Website
### DevOps Engineer, deineApotheke
**until 2021**
"deine Apotheke" supports the pharmacies in your neighborhood and paves the way for you to access pharmacy services: through our app, you can select your pharmacy and pre-order medications, even with a prescription.
- Provision of various services (including backend APIs, MariaDB clusters, NATs, Redis)
- Design and operation of Kubernetes clusters (3 locations)
- Management of automated pipelines via Bitbucket Pipelines (continuous integration)
- IT administration for 6 individuals (SysOps)
- Provision of various services (including backend APIs, MariaDB clusters, NATs, Redis)
- Design and operation of Kubernetes clusters (3 locations)
- Management of automated pipelines via Bitbucket Pipelines (continuous integration)
- IT administration for 6 individuals (SysOps)

View File

@ -41,7 +41,10 @@ const socialCount = SOCIALS.filter(social => social.active).length;
</a>
<p>
I'm Alex, a DevOps architect and software developer. I currently hold the role of DevOps Engineer at Materna, where I assist developers in accelerating web performance and provide guidance on various topics such as web development, Kubernetes, network security, and more.
I'm Alex Wellnitz, a DevOps architect and software developer. I currently hold
the role of DevOps Engineer at Materna, where I assist developers in
accelerating web performance and provide guidance on various topics such
as web development, Kubernetes, network security, and more.
</p>
<!-- <p>
Read the blog posts or check

View File

@ -1,50 +1,48 @@
/* ibm-plex-mono-regular - latin */
@font-face {
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
font-family: 'IBM Plex Mono';
font-family: "IBM Plex Mono";
font-style: normal;
font-weight: 400;
src: url('/fonts/ibm-plex-mono-v19-latin-regular.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
src: url("/fonts/ibm-plex-mono-v19-latin-regular.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
}
/* ibm-plex-mono-500 - latin */
@font-face {
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
font-family: 'IBM Plex Mono';
font-family: "IBM Plex Mono";
font-style: normal;
font-weight: 500;
src: url('/fonts/ibm-plex-mono-v19-latin-500.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
src: url("/fonts/ibm-plex-mono-v19-latin-500.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
}
/* ibm-plex-mono-600 - latin */
@font-face {
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
font-family: 'IBM Plex Mono';
font-family: "IBM Plex Mono";
font-style: normal;
font-weight: 600;
src: url('/fonts/ibm-plex-mono-v19-latin-600.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
src: url("/fonts/ibm-plex-mono-v19-latin-600.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
}
/* ibm-plex-mono-600italic - latin */
@font-face {
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
font-family: 'IBM Plex Mono';
font-family: "IBM Plex Mono";
font-style: italic;
font-weight: 600;
src: url('/fonts/ibm-plex-mono-v19-latin-600italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
src: url("/fonts/ibm-plex-mono-v19-latin-600italic.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
}
/* ibm-plex-mono-700 - latin */
@font-face {
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
font-family: 'IBM Plex Mono';
font-family: "IBM Plex Mono";
font-style: normal;
font-weight: 700;
src: url('/fonts/ibm-plex-mono-v19-latin-700.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
src: url("/fonts/ibm-plex-mono-v19-latin-700.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
}
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
:root,
html[data-theme="light"] {

View File

@ -4,30 +4,14 @@
"baseUrl": "src",
"jsx": "react-jsx",
"paths": {
"@assets/*": [
"assets/*"
],
"@config": [
"config.ts"
],
"@components/*": [
"components/*"
],
"@content/*": [
"content/*"
],
"@layouts/*": [
"layouts/*"
],
"@pages/*": [
"pages/*"
],
"@styles/*": [
"styles/*"
],
"@utils/*": [
"utils/*"
]
"@assets/*": ["assets/*"],
"@config": ["config.ts"],
"@components/*": ["components/*"],
"@content/*": ["content/*"],
"@layouts/*": ["layouts/*"],
"@pages/*": ["pages/*"],
"@styles/*": ["styles/*"],
"@utils/*": ["utils/*"]
}
}
}