diff --git a/.spelling b/.spelling
index 64d01ff..5aa14a2 100644
--- a/.spelling
+++ b/.spelling
@@ -74,6 +74,34 @@ themenbereiche
änderungen
auszuführen
zeitraum
+GitOps
+FluxCD
+gitlab
+restic
+vaultwarden
+standort
+höchstleistungen
+Fähigkeiten
+docker
+Golang
+Datenbankverwaltung
+Einführung
+selbstverwalteten
+Entwicklungsteams
+Zugriffsmanagement
+Ausführung
+Deployments
+größeren
+kundenorientierter
+Datenbank-Lifecycle-Managements
+Refactoring
+Ablösung
+CD-Lösung
+Preview-Environments
+Daten-Streaming
+JavaScript
+Zugriffsrechten
+Repositories
- index.md
Rodionov
db-operator
@@ -126,3 +154,16 @@ Blue-Green-RabbitMQ-Deployments
Kubernetes-Backends
Faro
Minio-Bucket
+Open-Source-Kubernetes-Operators
+Deployment-Workflows
+Selenoid-Backends
+db-operator
+Terraform-Codebasis
+Downtime
+Cross-Cloud-Backup-Strategien
+Federated-Prometheus-Cluster
+ - ./english/index.md
+Golang
+selenoid
+golang
+db-operator
diff --git a/.woodpecker/build.yaml b/.woodpecker/build.yaml
index 0bb8fef..328add5 100644
--- a/.woodpecker/build.yaml
+++ b/.woodpecker/build.yaml
@@ -20,6 +20,8 @@ steps:
securityContext:
privileged: true
commands:
+ - mkdir -p ~/.local/share/fonts
+ - cp ./fonts/fira_sans/* ~/.local/share/fonts/
- apt-get update
- |-
apt-get install -y libx11-xcb1 libxcomposite1 libasound2 \
diff --git a/css/nord_dark.css b/css/nord_dark.css
new file mode 100644
index 0000000..460180e
--- /dev/null
+++ b/css/nord_dark.css
@@ -0,0 +1,144 @@
+/* ===============================
+ Nord Dark – Compact Markdown
+ github-markdown-css compatible
+ =============================== */
+
+.markdown-body {
+ background: #2E3440;
+ color: #D8DEE9;
+ font-family: "Fira Sans";
+ font-size: 15px;
+ line-height: 1.55;
+ padding-top: 2.0rem;
+ padding-bottom: 1.0rem;
+ padding-right: 3.0rem;
+ padding-left: 3.0rem;
+}
+
+/* Headings */
+.markdown-body h1,
+.markdown-body h2,
+.markdown-body h3,
+.markdown-body h4,
+.markdown-body h5,
+.markdown-body h6 {
+ border: none;
+ margin-top: 1.2em;
+ margin-bottom: 0.4em;
+ font-weight: 700;
+ color: #ECEFF4;
+}
+
+.markdown-body h1 { font-size: 1.9em; }
+.markdown-body h2 { font-size: 1.6em; }
+.markdown-body h3 { font-size: 1.35em; }
+.markdown-body h4 { font-size: 1.15em; }
+.markdown-body h5 { font-size: 1.02em; }
+.markdown-body h6 { font-size: 0.95em; }
+
+/* Paragraphs */
+.markdown-body p {
+ margin: 0.55em 0;
+}
+
+/* Blockquotes – SAME vertical spacing as paragraphs */
+.markdown-body blockquote {
+ margin: 0.55em 0;
+ padding: 0.55em 0.8em;
+ border-left: 3px solid #8FBCBB;
+ background: #3B4252;
+ color: #D8DEE9;
+ font-style: italic;
+}
+
+.markdown-body blockquote > :first-child { margin-top: 0; }
+.markdown-body blockquote > :last-child { margin-bottom: 0; }
+
+/* Links */
+.markdown-body a {
+ color: #ECEFF4; /* same as headings → bold-text feel */
+ font-weight: 700; /* bold */
+ text-decoration: none;
+ border-bottom: 0.5px dotted #88C0D0; /* underline = link signal */
+}
+
+.markdown-body a:hover {
+ color: #8FBCBB; /* subtle Nord accent on hover */
+ border-bottom-color: #8FBCBB;
+}
+
+/* Code */
+.markdown-body code {
+ background: #3B4252;
+ color: #EBCB8B;
+ padding: 0.1em 0.3em;
+ border-radius: 3px;
+ font-size: 0.92em;
+}
+
+.markdown-body pre {
+ background: #3B4252;
+ color: #ECEFF4;
+ padding: 0.75em 0.9em;
+ border-radius: 5px;
+ overflow-x: auto;
+ border-left: 3px solid #81A1C1;
+ margin: 0.7em 0;
+}
+
+.markdown-body pre code {
+ background: none;
+ padding: 0;
+}
+
+/* Lists */
+.markdown-body ul,
+.markdown-body ol {
+ padding-left: 1.3em;
+ margin: 0.5em 0;
+}
+
+.markdown-body ul li::marker,
+.markdown-body ol li::marker {
+ color: #88C0D0;
+}
+
+/* HR */
+.markdown-body hr {
+ border: none;
+ border-top: 1px dashed #4C566A;
+ margin: 1.2em 0;
+}
+
+/* Tables */
+.markdown-body table {
+ border-collapse: collapse;
+ width: 100%;
+ margin: 0.7em 0;
+ font-size: 0.92em;
+}
+
+.markdown-body th,
+.markdown-body td {
+ border: 1px solid #4C566A;
+ padding: 0.35em 0.6em;
+}
+
+.markdown-body th {
+ background: #3B4252;
+}
+
+/* Images */
+.markdown-body img {
+ max-width: 100%;
+ background: #2E3440;
+ border: 0px solid #4C566A;
+ padding: 0.2em;
+ border-radius: 0px;
+}
+
+/* Hide anchor icons */
+.markdown-body a.anchor {
+ display: none;
+}
+
diff --git a/css/nord_light.css b/css/nord_light.css
new file mode 100644
index 0000000..358e328
--- /dev/null
+++ b/css/nord_light.css
@@ -0,0 +1,141 @@
+/* ===============================
+ Nord Light – Compact Markdown
+ github-markdown-css compatible
+ =============================== */
+
+.markdown-body {
+ background: #ECEFF4;
+ color: #2E3440;
+ font-family: "JetBrains Mono", "Fira Code", Menlo, Consolas, monospace;
+ font-size: 15px;
+ line-height: 1.55;
+ padding: 4.0rem;
+}
+
+/* Headings */
+.markdown-body h1,
+.markdown-body h2,
+.markdown-body h3,
+.markdown-body h4,
+.markdown-body h5,
+.markdown-body h6 {
+ border: none;
+ margin-top: 1.2em;
+ margin-bottom: 0.4em;
+ font-weight: 700;
+ color: #3B4252;
+}
+
+.markdown-body h1 { font-size: 1.9em; }
+.markdown-body h2 { font-size: 1.6em; }
+.markdown-body h3 { font-size: 1.35em; }
+.markdown-body h4 { font-size: 1.15em; }
+.markdown-body h5 { font-size: 1.02em; }
+.markdown-body h6 { font-size: 0.95em; color: #4C566A; }
+
+/* Paragraphs */
+.markdown-body p {
+ margin: 0.55em 0;
+}
+
+/* Blockquotes – SAME vertical spacing as paragraphs */
+.markdown-body blockquote {
+ margin: 0.55em 0;
+ padding: 0.55em 0.8em;
+ border-left: 3px solid #81A1C1;
+ background: #E5E9F0;
+ color: #4C566A;
+ font-style: italic;
+}
+
+/* Remove extra spacing inside blockquotes */
+.markdown-body blockquote > :first-child { margin-top: 0; }
+.markdown-body blockquote > :last-child { margin-bottom: 0; }
+
+/* Links */
+.markdown-body a {
+ color: #5E81AC;
+ text-decoration: none;
+ border-bottom: 1px dotted #81A1C1;
+}
+
+.markdown-body a:hover {
+ color: #81A1C1;
+ border-bottom-style: solid;
+}
+
+/* Code */
+.markdown-body code {
+ background: #E5E9F0;
+ color: #BF616A;
+ padding: 0.1em 0.3em;
+ border-radius: 3px;
+ font-size: 0.92em;
+}
+
+.markdown-body pre {
+ background: #E5E9F0;
+ color: #2E3440;
+ padding: 0.75em 0.9em;
+ border-radius: 5px;
+ overflow-x: auto;
+ border-left: 3px solid #88C0D0;
+ margin: 0.7em 0;
+}
+
+.markdown-body pre code {
+ background: none;
+ padding: 0;
+}
+
+/* Lists */
+.markdown-body ul,
+.markdown-body ol {
+ padding-left: 1.3em;
+ margin: 0.5em 0;
+}
+
+.markdown-body ul li::marker,
+.markdown-body ol li::marker {
+ color: #5E81AC;
+}
+
+/* HR */
+.markdown-body hr {
+ border: none;
+ border-top: 1px dashed #D8DEE9;
+ margin: 1.2em 0;
+}
+
+/* Tables */
+.markdown-body table {
+ border-collapse: collapse;
+ width: 100%;
+ margin: 0.7em 0;
+ font-size: 0.92em;
+}
+
+.markdown-body th,
+.markdown-body td {
+ border: 1px solid #D8DEE9;
+ padding: 0.35em 0.6em;
+}
+
+.markdown-body th {
+ background: #E5E9F0;
+}
+
+/* Images */
+.markdown-body img {
+ max-width: 100%;
+ background: #E5E9F0;
+ border: 1px solid #D8DEE9;
+ padding: 0.2em;
+ border-radius: 3px;
+}
+
+/* Hide anchor icons */
+.markdown-body a.anchor {
+ display: none;
+}
+
diff --git a/css/solarized_light.css b/css/solarized_light.css
new file mode 100644
index 0000000..7f56481
--- /dev/null
+++ b/css/solarized_light.css
@@ -0,0 +1,140 @@
+/* ===============================
+ Solarized Light – Compact Markdown
+ github-markdown-css compatible
+ =============================== */
+
+.markdown-body {
+ background: #FDF6E3; /* base3 */
+ color: #657B83; /* base00 */
+ font-family: "JetBrains Mono", "Fira Code", Menlo, Consolas, monospace;
+ font-size: 15px;
+ line-height: 1.55;
+ padding: 4.0rem;
+}
+
+/* Headings */
+.markdown-body h1,
+.markdown-body h2,
+.markdown-body h3,
+.markdown-body h4,
+.markdown-body h5,
+.markdown-body h6 {
+ border: none;
+ margin-top: 1.2em;
+ margin-bottom: 0.4em;
+ font-weight: 700;
+ color: #586E75; /* base01 */
+}
+
+.markdown-body h1 { font-size: 1.9em; }
+.markdown-body h2 { font-size: 1.6em; }
+.markdown-body h3 { font-size: 1.35em; }
+.markdown-body h4 { font-size: 1.15em; }
+.markdown-body h5 { font-size: 1.02em; }
+.markdown-body h6 { font-size: 0.95em; color: #839496; /* base0 */ }
+
+/* Paragraphs */
+.markdown-body p {
+ margin: 0.55em 0;
+}
+
+/* Blockquotes – SAME vertical spacing as paragraphs */
+.markdown-body blockquote {
+ margin: 0.55em 0;
+ padding: 0.55em 0.8em;
+ border-left: 3px solid #268BD2; /* blue */
+ background: #EEE8D5; /* base2 */
+ color: #839496; /* base0 */
+ font-style: italic;
+}
+
+/* Remove extra spacing inside blockquotes */
+.markdown-body blockquote > :first-child { margin-top: 0; }
+.markdown-body blockquote > :last-child { margin-bottom: 0; }
+
+/* Links */
+.markdown-body a {
+ color: #268BD2; /* blue */
+ text-decoration: none;
+ border-bottom: 1px dotted #2AA198; /* cyan */
+}
+
+.markdown-body a:hover {
+ color: #2AA198; /* cyan */
+ border-bottom-style: solid;
+}
+
+/* Code */
+.markdown-body code {
+ background: #EEE8D5; /* base2 */
+ color: #DC322F; /* red */
+ padding: 0.1em 0.3em;
+ border-radius: 3px;
+ font-size: 0.92em;
+}
+
+.markdown-body pre {
+ background: #EEE8D5; /* base2 */
+ color: #586E75; /* base01 */
+ padding: 0.75em 0.9em;
+ border-radius: 5px;
+ overflow-x: auto;
+ border-left: 3px solid #2AA198; /* cyan */
+ margin: 0.7em 0;
+}
+
+.markdown-body pre code {
+ background: none;
+ padding: 0;
+}
+
+/* Lists */
+.markdown-body ul,
+.markdown-body ol {
+ padding-left: 1.3em;
+ margin: 0.5em 0;
+}
+
+.markdown-body ul li::marker,
+.markdown-body ol li::marker {
+ color: #268BD2; /* blue */
+}
+
+/* HR */
+.markdown-body hr {
+ border: none;
+ border-top: 1px dashed #DDD6C1; /* subtle base2/base1 mix */
+ margin: 1.2em 0;
+}
+
+/* Tables */
+.markdown-body table {
+ border-collapse: collapse;
+ width: 100%;
+ margin: 0.7em 0;
+ font-size: 0.92em;
+}
+
+.markdown-body th,
+.markdown-body td {
+ border: 1px solid #DDD6C1;
+ padding: 0.35em 0.6em;
+}
+
+.markdown-body th {
+ background: #EEE8D5; /* base2 */
+}
+
+/* Images */
+.markdown-body img {
+ max-width: 100%;
+ background: #EEE8D5;
+ border: 1px solid #DDD6C1;
+ padding: 0.2em;
+ border-radius: 3px;
+}
+
+/* Hide anchor icons */
+.markdown-body a.anchor {
+ display: none;
+}
diff --git a/css/spacing.css b/css/spacing.css
new file mode 100644
index 0000000..8d6dadb
--- /dev/null
+++ b/css/spacing.css
@@ -0,0 +1,180 @@
+.markdown-body {
+ font-family: "JetBrains Mono", "Fira Code", Menlo, Consolas, monospace;
+ font-size: 16px;
+ line-height: 1.65;
+ padding: 1.25rem;
+}
+
+/* -------------------------------
+ Headings (no underline)
+ ------------------------------- */
+.markdown-body h1,
+.markdown-body h2,
+.markdown-body h3,
+.markdown-body h4,
+.markdown-body h5,
+.markdown-body h6 {
+ border: none;
+ margin-top: 1.6em;
+ margin-bottom: 0.6em;
+ font-weight: 700;
+}
+
+.markdown-body h1 { font-size: 2em; }
+.markdown-body h2 { font-size: 1.7em; }
+.markdown-body h3 { font-size: 1.4em; }
+.markdown-body h4 { font-size: 1.2em; }
+.markdown-body h5 { font-size: 1.05em; }
+.markdown-body h6 { font-size: 1em; }
+
+/* -------------------------------
+ Text
+ ------------------------------- */
+.markdown-body p {
+ margin: 0.75em 0;
+}
+
+.markdown-body strong {
+ color: #ECEFF4;
+}
+
+.markdown-body em {
+ color: #E5E9F0;
+}
+
+/* -------------------------------
+ Links
+ ------------------------------- */
+.markdown-body a {
+ color: #88C0D0; /* nord8 */
+ text-decoration: none;
+ border-bottom: 1px dotted #81A1C1;
+}
+
+.markdown-body a:hover {
+ color: #8FBCBB; /* nord7 */
+ border-bottom-style: solid;
+}
+
+/* -------------------------------
+ Inline + Block Code
+ ------------------------------- */
+.markdown-body code {
+ background: #3B4252; /* nord1 */
+ color: #EBCB8B; /* nord13 */
+ padding: 0.15em 0.35em;
+ border-radius: 3px;
+ font-size: 0.95em;
+}
+
+.markdown-body pre {
+ background: #3B4252;
+ color: #ECEFF4;
+ padding: 1em;
+ border-radius: 6px;
+ overflow-x: auto;
+ border-left: 4px solid #81A1C1; /* nord9 */
+}
+
+.markdown-body pre code {
+ background: none;
+ padding: 0;
+ color: inherit;
+}
+
+/* -------------------------------
+ Blockquotes
+ ------------------------------- */
+.markdown-body blockquote {
+ margin: 1em 0;
+ padding: 0.6em 1em;
+ border-left: 4px solid #8FBCBB; /* nord7 */
+ background: #3B4252;
+ color: #D8DEE9;
+ font-style: italic;
+}
+
+/* -------------------------------
+ Lists
+ ------------------------------- */
+.markdown-body ul,
+.markdown-body ol {
+ padding-left: 1.6em;
+ margin: 0.8em 0;
+}
+
+.markdown-body ul li::marker {
+ color: #88C0D0;
+}
+
+.markdown-body ol li::marker {
+ color: #88C0D0;
+ font-weight: bold;
+}
+
+/* -------------------------------
+ Horizontal Rule
+ ------------------------------- */
+.markdown-body hr {
+ border: none;
+ border-top: 1px dashed #4C566A; /* nord3 */
+ margin: 2em 0;
+}
+
+/* -------------------------------
+ Tables
+ ------------------------------- */
+.markdown-body table {
+ border-collapse: collapse;
+ width: 100%;
+ margin: 1em 0;
+ font-size: 0.95em;
+}
+
+.markdown-body th,
+.markdown-body td {
+ border: 1px solid #4C566A;
+ padding: 0.5em 0.75em;
+}
+
+.markdown-body th {
+ background: #3B4252;
+ color: #ECEFF4;
+}
+
+.markdown-body tr:nth-child(even) td {
+ background: #434C5E; /* nord2 */
+}
+
+/* -------------------------------
+ Images
+ ------------------------------- */
+.markdown-body img {
+ max-width: 100%;
+ background: #3B4252;
+ border: 1px solid #4C566A;
+ padding: 0.25em;
+ border-radius: 4px;
+}
+
+/* -------------------------------
+ Anchor links (hide GitHub icons)
+ ------------------------------- */
+.markdown-body a.anchor {
+ display: none;
+}
+
+/* -------------------------------
+ Print / PDF safety
+ ------------------------------- */
+@media print {
+ .markdown-body {
+ background: #ffffff;
+ color: #000000;
+ }
+
+ a {
+ color: #000000;
+ border: none;
+ }
+}
diff --git a/english/index.md b/english/index.md
index 8ca1a35..3b7c8be 100644
--- a/english/index.md
+++ b/english/index.md
@@ -1,10 +1,12 @@
---
pdf_options:
format: a4
- margin: 20mm 10mm
+ margin: 0mm 0mm
printBackground: true
+trim_trailing_whitespace: false
stylesheet:
- - https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/5.5.1/github-markdown.css
+ - ./css/nord_dark.css
+
body_class: markdown-body
css: |-
.markdown-body {
@@ -13,54 +15,76 @@ css: |-
.page-break { page-break-after: always; }
---
-## Nikolai Rodionov
+
+
-```
-> Location: Hamburg, Germany
-> Email: allanger@zohomail.com
-> Github: https://github.com/allanger
-```
+## Nikolai Rodionov
+### Senior DevOps Engineer
+
+
+
+> **Location:** **Hamburg, Germany**
+> **Email:** allanger@zohomail.com
+> **Phone:** **4915223284008**
+> **GitHub:** https://github.com/allanger
### About me
-I'm a DevOps engineer with almost 10 years of hands-on experience. I've been mostly focused on Kubernetes and CI/CD pipelines, but it doesn't mean that I would like to avoid tasks in other areas.
-A couple of interesting tasks, that I've been working on:
+Senior DevOps Engineer focused on **Kubernetes** and **CI/CD pipelines**. I build and run **scalable systems**, write **Go** and **Rust**, manage **servers** and **databases**, and help developers perform at their best.
-- Migration from Datadog to the self-managed monitoring stack (Mimir/Loki/Tempo/Grafana)
-- GCP Kafka access management with a self-written k8s operator ()
-- Migration of several MySQL Percona clusters to Kubernetes using the Percona Operator
-- Implementation of a downtime-free blue-green deployment for RabbitMQ
-- A data streaming automation from ~800 Postgres databases with structural changes via Kafka deployed to Kubernetes
-- Implementation of a Kubernetes backend for Selenoid for running e2e tests in k8s environments
+In addition, I'm a maintainer of an open-source **Kubernetes operator** designed to help users manage databases through CRDs:
+
-Also, I'm a maintainer of a Kubernetes operator that should help users manage databases via CRDs:
+
+---
+
+### Skills
+
+**Linux** - **Docker** - **Kubernetes** - **CI/CD** - **Automations and Scripting** - **Bash/Golang/Rust** - **GitOps**
+**Database Administration** - **Observability and Monitoring** - **Terraform/OpenTofu/Ansible** - **AWS/GCP/Azure**
+
+---
### Experience
-| Company | Position | Dates |
-|------------------|-------------------|---------------------|
-| **Onpier** | DevOps Engineer | 06.2024 - Until Now |
-| **Giant Swarm** | Platform Engineer | 12.2023 - 05.2024 |
-| **Grandcentrix** | SRE | 02.2023 - 11.2023 |
-| **Klöckner.I** | DevOps Engineer | 01.2022 - 01.2023 |
-| **Itigris** | DevOps Engineer | 07.2019 - 12.2021 |
-| **Etersoft** | DevOps Engineer | 03.2017 - 06.2019 |
+#### Onpier - DevOps Engineer [06.2024 - Until now]
+ - Bootstrapped deployment workflows and CI/CD pipelines for the monitoring stack using **helmfile** and **Github Actions**
+ - Configured and maintained a self-managed observability stack (**Mimir**/**Loki**/**Tempo**/**Grafana Alloy**/**Grafana**)
+ - Operated and supported **Tekton CD** and **ArgoCD** instances for developers
+ - Built and maintained [an open-source Kubernetes operator](https://github.com/ONPIER-OSS/gcp-kafka-auth-operator) for access management in **GCP Kafka**
+ - Implemented a custom [selenoid backend](https://github.com/ONPIER-OSS/selenoid) to run **e2e-tests** natively in **Kubernetes**
-### Tools
+#### Giant Swarm - Platform Engineer [12.2023 - 05.2024]
+ - Deployed and actively used **FluxCD** for GitOps-based workflows
+ - Maintained a large set of customer-facing **Helm charts**
+ - Contributed to and maintained multiple **Go** and **Rust** project
-- **Environments**: Linux - Containers - Kubernetes - Proxmox
-- **Kubernetes**: Helm - Kustomize - Kubebuilder - Helmfile
-- **Scripting/Coding**: Bash - Go - Rust - Perl - Python
-- **Continuous Integration**: Gitlab-CI - Github Actions - Circle-CI - Woodpecker-CI - Drone-CI
-- **Continuous Delivery**: ArgoCD - Flux - Tekton
-- **Infrastructure as Code**: Ansible - Terraform - Opentofu - Cluster API
-- **Cloud Providers**: Microsoft Azure - Google Cloud - AWS - Yandex Cloud - Hetzner
-- **Observability**: Prometheus - Mimir - Grafana - Loki - Elasticsearch - Kibana - FluentBit - Promtail - Fluentd - Grafana Alloy - Faro - Tempo
-- **Secret Management**: Sops - Age - Helm Secrets - Hashicorp Vault
-- **Databases**: PostgreSQL - MySQL - Percona MySQL - Redis - Mongo - Dragonfly
-- **Storages**: Minio - Ceph - Longhorn
-- **Others**: Kafka - RabbitMQ - Selenium - Selenoid - Kyverno - K3s - Kubeadm
+#### Grandcentrix - SRE [02.2023 - 11.2023]
+ - Streamlined database management using the [db-operator](https://github.com/db-operator/db-operator)
+ - Configured, maintained, and actively used **ArgoCD**
+ - Refactored a large **Terraform** codebase with zero downtime
+
+#### Klöckner.I - DevOps Engineer [01.2022 - 01.2022]
+ - Migrated multiple **Percona MySQL** clusters to **Kubernetes** using **Percona Operator**
+ - Replaced a custom CD solution with **ArgoCD**
+ - Managed **GitLab** and **GitLab CI/CD** installations
+ - Implemented a cross-cloud backup solution using **Restic**
+ - Operated **Elasticsearch**, **Kibana**, and **FluentBit**
+ - Maintained federated **Prometheus** clusters across **Kubernetes** and **Linux Servers**
+ - Deployed and maintained **Vaultwarden** for company-wide secret management
+ - Maintained and contributed to **db-operator**
+
+#### Itigris - DevOps Engineer [07.2019 - 12.2021]
+ - Built **preview environments** using **ArgoCD**
+ - Implemented data streaming from **~800 PostgreSQL databases** using **Kafka** running in **Kubernetes**
+ - Designed and rolled out company-wide **Gitlab-CI/CD** pipelines for **Java** and **JavaScript** projects
+ - Developed a [cli tool](https://github.com/allanger/gitlab-user-manager) to manage access to **Gitlab** repositories
+ - Designed, implemented, and maintained **CI** pipelines for **e2e-tests**.
+
+#### Etersoft - DevOps Engineer [03.2017 - 06.2019]
+ - Designed, implemented, and maintained **CI** pipelines for **e2e-tests**.
+ - Maintained **Linux Servers**
---
diff --git a/fonts/fira_sans/FiraSans-Black.ttf b/fonts/fira_sans/FiraSans-Black.ttf
new file mode 100644
index 0000000..113cd3b
Binary files /dev/null and b/fonts/fira_sans/FiraSans-Black.ttf differ
diff --git a/fonts/fira_sans/FiraSans-BlackItalic.ttf b/fonts/fira_sans/FiraSans-BlackItalic.ttf
new file mode 100644
index 0000000..1c49fb2
Binary files /dev/null and b/fonts/fira_sans/FiraSans-BlackItalic.ttf differ
diff --git a/fonts/fira_sans/FiraSans-Bold.ttf b/fonts/fira_sans/FiraSans-Bold.ttf
new file mode 100644
index 0000000..e3593fb
Binary files /dev/null and b/fonts/fira_sans/FiraSans-Bold.ttf differ
diff --git a/fonts/fira_sans/FiraSans-BoldItalic.ttf b/fonts/fira_sans/FiraSans-BoldItalic.ttf
new file mode 100644
index 0000000..305b0b8
Binary files /dev/null and b/fonts/fira_sans/FiraSans-BoldItalic.ttf differ
diff --git a/fonts/fira_sans/FiraSans-ExtraBold.ttf b/fonts/fira_sans/FiraSans-ExtraBold.ttf
new file mode 100644
index 0000000..83744c1
Binary files /dev/null and b/fonts/fira_sans/FiraSans-ExtraBold.ttf differ
diff --git a/fonts/fira_sans/FiraSans-ExtraBoldItalic.ttf b/fonts/fira_sans/FiraSans-ExtraBoldItalic.ttf
new file mode 100644
index 0000000..54bcaca
Binary files /dev/null and b/fonts/fira_sans/FiraSans-ExtraBoldItalic.ttf differ
diff --git a/fonts/fira_sans/FiraSans-ExtraLight.ttf b/fonts/fira_sans/FiraSans-ExtraLight.ttf
new file mode 100644
index 0000000..2d4e331
Binary files /dev/null and b/fonts/fira_sans/FiraSans-ExtraLight.ttf differ
diff --git a/fonts/fira_sans/FiraSans-ExtraLightItalic.ttf b/fonts/fira_sans/FiraSans-ExtraLightItalic.ttf
new file mode 100644
index 0000000..ef666ad
Binary files /dev/null and b/fonts/fira_sans/FiraSans-ExtraLightItalic.ttf differ
diff --git a/fonts/fira_sans/FiraSans-Italic.ttf b/fonts/fira_sans/FiraSans-Italic.ttf
new file mode 100644
index 0000000..27d32ed
Binary files /dev/null and b/fonts/fira_sans/FiraSans-Italic.ttf differ
diff --git a/fonts/fira_sans/FiraSans-Light.ttf b/fonts/fira_sans/FiraSans-Light.ttf
new file mode 100644
index 0000000..663d1de
Binary files /dev/null and b/fonts/fira_sans/FiraSans-Light.ttf differ
diff --git a/fonts/fira_sans/FiraSans-LightItalic.ttf b/fonts/fira_sans/FiraSans-LightItalic.ttf
new file mode 100644
index 0000000..d1b1fc5
Binary files /dev/null and b/fonts/fira_sans/FiraSans-LightItalic.ttf differ
diff --git a/fonts/fira_sans/FiraSans-Medium.ttf b/fonts/fira_sans/FiraSans-Medium.ttf
new file mode 100644
index 0000000..001ebe7
Binary files /dev/null and b/fonts/fira_sans/FiraSans-Medium.ttf differ
diff --git a/fonts/fira_sans/FiraSans-MediumItalic.ttf b/fonts/fira_sans/FiraSans-MediumItalic.ttf
new file mode 100644
index 0000000..b7640be
Binary files /dev/null and b/fonts/fira_sans/FiraSans-MediumItalic.ttf differ
diff --git a/fonts/fira_sans/FiraSans-Regular.ttf b/fonts/fira_sans/FiraSans-Regular.ttf
new file mode 100644
index 0000000..6f80647
Binary files /dev/null and b/fonts/fira_sans/FiraSans-Regular.ttf differ
diff --git a/fonts/fira_sans/FiraSans-SemiBold.ttf b/fonts/fira_sans/FiraSans-SemiBold.ttf
new file mode 100644
index 0000000..0c93b7e
Binary files /dev/null and b/fonts/fira_sans/FiraSans-SemiBold.ttf differ
diff --git a/fonts/fira_sans/FiraSans-SemiBoldItalic.ttf b/fonts/fira_sans/FiraSans-SemiBoldItalic.ttf
new file mode 100644
index 0000000..e1a2989
Binary files /dev/null and b/fonts/fira_sans/FiraSans-SemiBoldItalic.ttf differ
diff --git a/fonts/fira_sans/FiraSans-Thin.ttf b/fonts/fira_sans/FiraSans-Thin.ttf
new file mode 100644
index 0000000..c925f94
Binary files /dev/null and b/fonts/fira_sans/FiraSans-Thin.ttf differ
diff --git a/fonts/fira_sans/FiraSans-ThinItalic.ttf b/fonts/fira_sans/FiraSans-ThinItalic.ttf
new file mode 100644
index 0000000..dd39092
Binary files /dev/null and b/fonts/fira_sans/FiraSans-ThinItalic.ttf differ
diff --git a/german/index.md b/german/index.md
index 9060c75..ce8ba6f 100644
--- a/german/index.md
+++ b/german/index.md
@@ -1,10 +1,12 @@
---
pdf_options:
format: a4
- margin: 20mm 10mm
+ margin: 0mm 0mm
printBackground: true
+trim_trailing_whitespace: false
stylesheet:
- - https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/5.5.1/github-markdown.css
+ - ./css/nord_dark.css
+
body_class: markdown-body
css: |-
.markdown-body {
@@ -13,54 +15,74 @@ css: |-
.page-break { page-break-after: always; }
---
-## Nikolai Rodionov
+
+
-```
-> Standort: Hamburg, Deutschland
-> E-mail: allanger@zohomail.com
-> Github: https://github.com/allanger
-```
+## Nikolai Rodionov
+### Senior DevOps Ingenieur
+
+
+
+> **Standort:** Hamburg, Deutschland
+> **E-mail:** allanger@zohomail.com
+> **Telefon:** 4915223284008
+> **GitHub:** https://github.com/allanger
### Über mich
-Ich bin ein DevOps-Ingenieur mit fast 10 Jahren praktischer Erfahrung und einer breiten Palette an Tools. Mein Fokus lag hauptsächlich auf Kubernetes und CI/CD-Pipelines, das bedeutet jedoch nicht, dass ich andere Themenbereiche meide.
+Senior-DevOps-Ingenieur konzentrierte sich auf **Kubernetes** und **CI/CD Pipelines**. Ich baue und betreibe **skalierbare Systeme**, schreibe **Go** und **Rust**, verwalte **Servern** und **Datenbanken**, und helfe Entwicklern, Höchstleistungen zu erbringen.
-Ein paar interessante Aufgaben, an denen ich gearbeitet habe:
+Außerdem bin ich ein Maintainer eines **Open-Source-Kubernetes-Operators**, der Benutzern bei der Verwaltung von Datenbanken über CRDs helfen soll:
+
-- Migration von Datadog zu einem self-managed Monitoring-Stack (Mimir/Loki/Tempo/Grafana)
-- GCP-Kafka-Zugriffsverwaltung mit einem selbstgeschriebenen k8s Operator ()
-- Migration mehrerer MySQL Percona-Cluster zu Kubernetes mithilfe des Percona-Operators
-- Implementierung eines downtime-freien Blue-Green-RabbitMQ-Deployments
-- Automatisierung des Data-Streamings von ~800 PostgreSQL-Datenbanken inklusive struktureller Änderungen via Kafka in Kubernetes
-- Implementierung eines Kubernetes-Backends für Selenoid, um E2E-Tests nativ in Kubernetes auszuführen
+---
-Außerdem bin ich Maintainer eines Kubernetes-Operators, der die Verwaltung von Datenbanken über CRDs vereinfacht:
+### Fähigkeiten
+
+**Linux** - **Docker** - **Kubernetes** - **CI/CD** - **Automatisierung und Skripting** - **Bash/Golang/Rust** - **GitOps**
+**Datenbankverwaltung** - **Observability und Monitoring** - **Terraform/OpenTofu/Ansible** - **AWS/GCP/Azure**
+
+---
### Erfahrung
-| Firma | Position | Zeitraum |
-|------------------|---------------------|---------------------|
-| **Onpier** | DevOps Ingenieur | 06.2024 - Bis jetzt |
-| **Giant Swarm** | Plattform Ingenieur | 12.2023 - 05.2024 |
-| **Grandcentrix** | SRE | 02.2023 - 11.2023 |
-| **Klöckner.I** | DevOps Ingenieur | 01.2022 - 01.2023 |
-| **Itigris** | DevOps Ingenieur | 07.2019 - 12.2021 |
-| **Etersoft** | DevOps Ingenieur | 03.2017 - 06.2019 |
+#### Onpier - DevOps-Ingenieur [06.2024 - bis jetzt]
+ - Aufbau und Einführung von Deployment-Workflows und CI/CD-Pipelines für einen Monitoring-Stack mit **helmfile** und **GitHub Actions**
+ - Konfiguration und Betrieb eines selbstverwalteten Observability-Stacks (**Mimir**, **Loki**, **Tempo**, **Grafana Alloy**, **Grafana**)
+ - Betrieb und Support von **Tekton CD-** und **ArgoCD-**Instanzen für Entwicklungsteams
+ - Entwicklung und Wartung eines [Open-Source-Kubernetes-Operators](https://github.com/ONPIER-OSS/gcp-kafka-auth-operator) für Zugriffsmanagement in **GCP Kafka**
+ - Implementierung eines eigenen [Selenoid-Backends](https://github.com/ONPIER-OSS/selenoid) zur nativen Ausführung von **E2E-Tests** in **Kubernetes**
-### Tools
+#### Giant Swarm - Plattform-Ingenieur [12.2023 - 05.2024]
+ - Einführung und aktive Nutzung von **FluxCD** für **GitOps** Deployments
+ - Wartung einer größeren Anzahl kundenorientierter **Helm Charts**
+ - Mitarbeit an sowie Wartung mehrerer **Go-** und **Rust-**Projekte
-- **Umgebungen**: Linux - Containers - Kubernetes - Proxmox
-- **Kubernetes**: Helm - Kustomize - Kubebuilder - Helmfile
-- **Skripting/Programmierung**: Bash - Go - Rust - Perl - Python
-- **Continuous Integration**: Gitlab-CI - Github Actions - Circle-CI - Woodpecker-CI - Drone-CI
-- **Continuous Delivery**: ArgoCD - Flux - Tekton
-- **IaC**: Ansible - Terraform - Opentofu - Cluster API
-- **Cloud Providers**: Microsoft Azure - Google Cloud - AWS - Yandex Cloud - Hetzner
-- **Observability**: Prometheus - Mimir - Grafana - Loki - Elasticsearch - Kibana - FluentBit - Promtail - Fluentd - Grafana Alloy - Faro - Tempo
-- **Secret-Management**: Sops - Age - Helm Secrets - Hashicorp Vault
-- **Datenbanken**: PostgreSQL - MySQL - Percona MySQL - Redis - Mongo - Dragonfly
-- **Storages**: Minio - Ceph - Longhorn
-- **Sonstiges**: Kafka - RabbitMQ - Selenium - Selenoid - Kyverno - K3s - Kubeadm
+#### Grandcentrix - SRE [02.2023 - 11.2023]
+ - Optimierung des Datenbank-Lifecycle-Managements mit dem [db-operator](https://github.com/db-operator/db-operator)
+ - Konfiguration, Wartung und aktive Nutzung von **ArgoCD**
+ - Refactoring einer umfangreichen Terraform-Codebasis ohne Downtime
+
+#### Klöckner.I - DevOps-Ingenieur [01.2022 - 01.2022]
+ - Migration mehrerer **Percona MySQL-Cluster** nach **Kubernetes** mithilfe des **Percona Operators**
+ - Ablösung einer selbst entwickelten CD-Lösung durch **ArgoCD**
+ - Betrieb und Wartung von **GitLab** und **GitLab CI/CD**
+ - Implementierung von Cross-Cloud-Backup-Strategien mit **Restic**
+ - Betrieb von **Elasticsearch**, **Kibana**, und **FluentBit**
+ - Wartung **Federated-Prometheus-Cluster** auf **Kubernetes** und **Linux-Servern**
+ - Einführung und Betrieb von **Vaultwarden** für unternehmensweites Secret-Management
+ - Wartung **db-operator**
+
+#### Itigris - DevOps-Ingenieur [07.2019 - 12.2021]
+ - Aufbau **Preview-Environments** mithilfe **ArgoCD**
+ - Umsetzung von Daten-Streaming aus ca. **800 PostgreSQL-Datenbanken** in einen auf **Kubernetes** betriebenen **Kafka-Cluster**
+ - Konzeption und Einführung unternehmensweiter **GitLab CI/CD-Pipelines** für **Java-** und **JavaScript-**Projekte
+ - Entwicklung eines [Cli-Tools](https://github.com/allanger/gitlab-user-manager) zur Verwaltung von Zugriffsrechten auf **GitLab**-Repositories
+ - Konzeption, Implementierung und Betrieb von **CI-Pipelines** für **E2E-Tests**
+
+#### Etersoft - DevOps-Ingenieur [03.2017 - 06.2019]
+ - Konzeption, Implementierung und Betrieb von **CI-Pipelines** für **E2E-Tests**
+ - Betrieb und Wartung von **Linux-Servern**
---
diff --git a/package-lock.json b/package-lock.json
index 4b9632d..1e3a139 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,7 +10,7 @@
"license": "ISC",
"dependencies": {
"markdown-spellcheck": "^1.3.1",
- "md-to-pdf": "^5.2.4"
+ "md-to-pdf": "^5.2.5"
}
},
"node_modules/@babel/code-frame": {
@@ -37,9 +37,9 @@
}
},
"node_modules/@puppeteer/browsers": {
- "version": "2.11.2",
- "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.11.2.tgz",
- "integrity": "sha512-GBY0+2lI9fDrjgb5dFL9+enKXqyOPok9PXg/69NVkjW3bikbK9RQrNrI3qccQXmDNN7ln4j/yL89Qgvj/tfqrw==",
+ "version": "2.12.0",
+ "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.12.0.tgz",
+ "integrity": "sha512-Xuq42yxcQJ54ti8ZHNzF5snFvtpgXzNToJ1bXUGQRaiO8t+B6UM8sTUJfvV+AJnqtkJU/7hdy6nbKyA12aHtRw==",
"license": "Apache-2.0",
"dependencies": {
"debug": "^4.4.3",
@@ -84,9 +84,9 @@
"license": "MIT"
},
"node_modules/@types/node": {
- "version": "25.2.0",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.0.tgz",
- "integrity": "sha512-DZ8VwRFUNzuqJ5khrvwMXHmvPe+zGayJhr2CDNiKB1WBE1ST8Djl00D0IC4vvNmHMdj6DlbYRIaFE7WHjlDl5w==",
+ "version": "25.2.3",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz",
+ "integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==",
"license": "MIT",
"optional": true,
"dependencies": {
@@ -513,9 +513,9 @@
}
},
"node_modules/chromium-bidi": {
- "version": "13.0.1",
- "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-13.0.1.tgz",
- "integrity": "sha512-c+RLxH0Vg2x2syS9wPw378oJgiJNXtYXUvnVAldUlt5uaHekn0CCU7gPksNgHjrH1qFhmjVXQj4esvuthuC7OQ==",
+ "version": "13.1.1",
+ "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-13.1.1.tgz",
+ "integrity": "sha512-zB9MpoPd7VJwjowQqiW3FKOvQwffFMjQ8Iejp5ZW+sJaKLRhZX1sTxzl3Zt22TDB4zP0OOqs8lRoY7eAW5geyQ==",
"license": "Apache-2.0",
"dependencies": {
"mitt": "^3.0.1",
@@ -852,9 +852,9 @@
}
},
"node_modules/devtools-protocol": {
- "version": "0.0.1551306",
- "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1551306.tgz",
- "integrity": "sha512-CFx8QdSim8iIv+2ZcEOclBKTQY6BI1IEDa7Tm9YkwAXzEWFndTEzpTo5jAUhSnq24IC7xaDw0wvGcm96+Y3PEg==",
+ "version": "0.0.1566079",
+ "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1566079.tgz",
+ "integrity": "sha512-MJfAEA1UfVhSs7fbSQOG4czavUp1ajfg6prlAN0+cmfa2zNjaIbvq8VneP7do1WAQQIvgNJWSMeP6UyI90gIlQ==",
"license": "BSD-3-Clause"
},
"node_modules/dunder-proto": {
@@ -2644,17 +2644,17 @@
}
},
"node_modules/puppeteer": {
- "version": "24.36.1",
- "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.36.1.tgz",
- "integrity": "sha512-uPiDUyf7gd7Il1KnqfNUtHqntL0w1LapEw5Zsuh8oCK8GsqdxySX1PzdIHKB2Dw273gWY4MW0zC5gy3Re9XlqQ==",
+ "version": "24.37.2",
+ "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.37.2.tgz",
+ "integrity": "sha512-FV1W/919ve0y0oiS/3Rp5XY4MUNUokpZOH/5M4MMDfrrvh6T9VbdKvAHrAFHBuCxvluDxhjra20W7Iz6HJUcIQ==",
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
- "@puppeteer/browsers": "2.11.2",
- "chromium-bidi": "13.0.1",
+ "@puppeteer/browsers": "2.12.0",
+ "chromium-bidi": "13.1.1",
"cosmiconfig": "^9.0.0",
- "devtools-protocol": "0.0.1551306",
- "puppeteer-core": "24.36.1",
+ "devtools-protocol": "0.0.1566079",
+ "puppeteer-core": "24.37.2",
"typed-query-selector": "^2.12.0"
},
"bin": {
@@ -2665,15 +2665,15 @@
}
},
"node_modules/puppeteer-core": {
- "version": "24.36.1",
- "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.36.1.tgz",
- "integrity": "sha512-L7ykMWc3lQf3HS7ME3PSjp7wMIjJeW6+bKfH/RSTz5l6VUDGubnrC2BKj3UvM28Y5PMDFW0xniJOZHBZPpW1dQ==",
+ "version": "24.37.2",
+ "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.37.2.tgz",
+ "integrity": "sha512-nN8qwE3TGF2vA/+xemPxbesntTuqD9vCGOiZL2uh8HES3pPzLX20MyQjB42dH2rhQ3W3TljZ4ZaKZ0yX/abQuw==",
"license": "Apache-2.0",
"dependencies": {
- "@puppeteer/browsers": "2.11.2",
- "chromium-bidi": "13.0.1",
+ "@puppeteer/browsers": "2.12.0",
+ "chromium-bidi": "13.1.1",
"debug": "^4.4.3",
- "devtools-protocol": "0.0.1551306",
+ "devtools-protocol": "0.0.1566079",
"typed-query-selector": "^2.12.0",
"webdriver-bidi-protocol": "0.4.0",
"ws": "^8.19.0"
@@ -2833,9 +2833,9 @@
}
},
"node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
diff --git a/package.json b/package.json
index 44e4877..464c7e3 100644
--- a/package.json
+++ b/package.json
@@ -15,6 +15,6 @@
"license": "ISC",
"dependencies": {
"markdown-spellcheck": "^1.3.1",
- "md-to-pdf": "^5.2.4"
+ "md-to-pdf": "^5.2.5"
}
}
diff --git a/resources/photo.jpeg b/resources/photo.jpeg
new file mode 100644
index 0000000..da9dead
Binary files /dev/null and b/resources/photo.jpeg differ
diff --git a/resources/photo.jpg b/resources/photo.jpg
new file mode 100644
index 0000000..508b0c1
Binary files /dev/null and b/resources/photo.jpg differ
diff --git a/resources/photo.png b/resources/photo.png
new file mode 100644
index 0000000..5d38102
Binary files /dev/null and b/resources/photo.png differ