mirror of
https://github.com/apricote/apricote.de.git
synced 2026-01-13 12:51:00 +00:00
feat: initial content
This commit is contained in:
parent
aba4b1c795
commit
212a1151d5
17 changed files with 550 additions and 3 deletions
0
assets/.gitkeep
Normal file
0
assets/.gitkeep
Normal file
|
|
@ -1,3 +0,0 @@
|
|||
baseURL = 'http://example.org/'
|
||||
languageCode = 'en-us'
|
||||
title = 'My New Hugo Site'
|
||||
61
config.yaml
Normal file
61
config.yaml
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
title: "Julian Tölle"
|
||||
baseURL: "https://apricote.de/"
|
||||
languageCode: "en-us"
|
||||
|
||||
author:
|
||||
name: Julian Tölle
|
||||
|
||||
module:
|
||||
imports:
|
||||
- path: "github.com/adityatelange/hugo-PaperMod"
|
||||
|
||||
params:
|
||||
DateFormat: "2006-01-02"
|
||||
|
||||
keywords: ["cv", "resume", "julian tölle", "personal site"]
|
||||
|
||||
profileMode:
|
||||
enabled: true
|
||||
title: "Julian Tölle"
|
||||
subtitle: |
|
||||
Cloud Infrastructure / Kubernetes / DevOps
|
||||
|
||||
Working at [Hetzner Cloud](https://hetzner.com/cloud) on [Open Source Integrations](https://github.com/hetznercloud)
|
||||
|
||||
imageUrl: ./profile.jpg
|
||||
imageWidth: 240
|
||||
imageHeight: 240
|
||||
imageTitle: Headshot of myself
|
||||
|
||||
buttons:
|
||||
- name: "About Me"
|
||||
url: "about-me"
|
||||
- name: "Favorite Music"
|
||||
url: listory
|
||||
|
||||
socialIcons:
|
||||
- name: github
|
||||
url: "https://github.com/apricote"
|
||||
- name: linkedin
|
||||
url: "https://www.linkedin.com/in/julian-toelle/"
|
||||
- name: xing
|
||||
url: "https://www.xing.com/profile/Julian_Toelle3/cv"
|
||||
- name: twitch
|
||||
url: "https://twitch.tv/apricote4"
|
||||
- name: mastodon
|
||||
url: "https://hachyderm.io/@apricote"
|
||||
|
||||
menu:
|
||||
main:
|
||||
- identifier: about
|
||||
name: About Me
|
||||
url: about-me
|
||||
- identifier: work
|
||||
name: Work
|
||||
url: work
|
||||
- identifier: projects
|
||||
name: Projects
|
||||
url: projects
|
||||
- identifier: listory
|
||||
name: Favorite Music
|
||||
url: listory
|
||||
16
content/about-me.md
Normal file
16
content/about-me.md
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
---
|
||||
title: "About Me"
|
||||
---
|
||||
|
||||
## Basic
|
||||
|
||||
- {{< years-till-today "1997-09-08" >}} years old
|
||||
- Living in [Bielefeld, Germany](https://en.wikipedia.org/wiki/Bielefeld)
|
||||
|
||||
## Skills
|
||||
|
||||
{{< about-me-skills >}}
|
||||
|
||||
## Interests
|
||||
|
||||
{{< about-me-interests >}}
|
||||
6
content/listory.md
Normal file
6
content/listory.md
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
---
|
||||
title: "My Favorite Music"
|
||||
type: listory
|
||||
---
|
||||
|
||||
> Work in Progress
|
||||
5
content/projects.md
Normal file
5
content/projects.md
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: "Projects"
|
||||
---
|
||||
|
||||
{{< projects >}}
|
||||
5
content/work.md
Normal file
5
content/work.md
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: "Work Experiences"
|
||||
---
|
||||
|
||||
{{< work >}}
|
||||
364
data/resume.yaml
Normal file
364
data/resume.yaml
Normal file
|
|
@ -0,0 +1,364 @@
|
|||
# yaml-language-server: $schema=https://raw.githubusercontent.com/jsonresume/resume-schema/v1.0.0/schema.json
|
||||
basics:
|
||||
name: Julian Tölle
|
||||
label: Infrastructure & Backend
|
||||
image: https://www.gravatar.com/avatar/bd55c8a01a6dd038f86c8e9fd60674b5?s=800
|
||||
email: julian.toelle97@gmail.com
|
||||
location:
|
||||
city: Bielefeld
|
||||
countryCode: Germany
|
||||
profiles:
|
||||
- network: GitHub
|
||||
username: apricote
|
||||
url: https://github.com/apricote
|
||||
- network: LinkedIn
|
||||
username: Julian Tölle
|
||||
url: https://www.linkedin.com/in/julian-toelle/
|
||||
- network: Twitch
|
||||
username: Apricote4
|
||||
url: https://twitch.tv/apricote4
|
||||
- network: XING
|
||||
username: Julian_Toelle3
|
||||
url: https://www.xing.com/profile/Julian_Toelle3/cv
|
||||
|
||||
skills:
|
||||
- name: Kubernetes
|
||||
level: expert
|
||||
keywords:
|
||||
- Cluster API
|
||||
- Operators
|
||||
- GitOps
|
||||
|
||||
- name: Node.js
|
||||
level: expert
|
||||
keywords:
|
||||
- Typescript
|
||||
- Nest.js
|
||||
|
||||
- name: CI/CD
|
||||
level: advanced
|
||||
keywords:
|
||||
- GitLab CI
|
||||
- Jenkins
|
||||
|
||||
- name: Infrastructure as Code
|
||||
level: advanced
|
||||
keywords:
|
||||
- Terraform
|
||||
- Ansible
|
||||
|
||||
- name: Backend Development
|
||||
level: advanced
|
||||
keywords:
|
||||
- REST APIs
|
||||
|
||||
- name: Cloud
|
||||
level: advanced
|
||||
keywords:
|
||||
- AWS
|
||||
- OpenStack
|
||||
- Hetzner Cloud
|
||||
|
||||
- name: Databases
|
||||
level: advanced
|
||||
keywords:
|
||||
- Redis
|
||||
- PostgreSQL
|
||||
- MySQL
|
||||
- etcd
|
||||
|
||||
- name: Go
|
||||
level: intermediate
|
||||
keywords:
|
||||
- kubebuilder
|
||||
|
||||
work:
|
||||
- name: Hetzner Cloud GmbH
|
||||
position: Software Developer Open Source Integrations
|
||||
website: https://hetzner.com/cloud
|
||||
startDate: "2022-11"
|
||||
keywords:
|
||||
- Kubernetes
|
||||
- Terraform
|
||||
- Ansible
|
||||
- Go
|
||||
- Python
|
||||
summary: ""
|
||||
- name: teuto.net Netzdienste GmbH
|
||||
position: Cloud Engineer
|
||||
website: https://teuto.net/
|
||||
startDate: "2021-04"
|
||||
endDate: "2022-09"
|
||||
keywords:
|
||||
- Kubernetes
|
||||
- Cluster API
|
||||
- OpenStack
|
||||
- GitLab CI
|
||||
- GitOps
|
||||
- Prometheus & Alertmanager
|
||||
- Go
|
||||
- kubebuilder
|
||||
- Ansible
|
||||
summary: |-
|
||||
teuto.net provides public and private clouds based on OpenStack,
|
||||
managed Kubernetes on top of these clouds, and additional services like
|
||||
consulting or training. Within teuto.net, I worked on the Kubernetes team,
|
||||
where I was responsible for the next iteration of our managed Kubernetes
|
||||
offering.
|
||||
|
||||
At the beginning of 2021, teuto.net decided to replace the existing custom
|
||||
tooling for managing Kubernetes clusters with Cluster API and Cluster API
|
||||
Provider OpenStack. I authored a proposal for the new implementation and
|
||||
implemented it over the following months. This included GitLab CI
|
||||
pipelines for building VM images, writing templates for clusters, an
|
||||
Ansible playbook to bootstrap new Cluster API Management Cluster,
|
||||
extensive internal documentation and runbooks, Prometheus alerting, an E2E
|
||||
test pipeline, and a custom Kubernetes operator to tie it all together
|
||||
into one coherent API.
|
||||
|
||||
As I always liked to work upstream, and a stable foundation is necessary
|
||||
for this offering, I started contributing to Cluster API Provider and
|
||||
became a reviewer for the project, participating in the office hours and
|
||||
wherever else help was needed.
|
||||
|
||||
When not working on new features, I packaged newly released Kubernetes
|
||||
versions for our platform and rolled out the changes to our managed
|
||||
clusters while communicating with our customers about upcoming changes and
|
||||
maintenance windows.
|
||||
|
||||
For 3 months in 2021, I lead an initiative to improve alert fatigue for
|
||||
our on-call engineers, by analyzing the pains they were experiencing and
|
||||
then applying a consistent labeling strategy on the alerts, as well as
|
||||
filtering unwanted alerts in Alertmanager and Prometheus.
|
||||
|
||||
highlights:
|
||||
- Tech Lead for managed Kubernetes offering
|
||||
- Upstream contributions to Cluster API Provider OpenStack
|
||||
|
||||
- name: narando GmbH
|
||||
position: Lead Developer
|
||||
website: https://about.narando.com/
|
||||
startDate: "2017-07"
|
||||
endDate: "2021-02"
|
||||
keywords:
|
||||
- AWS
|
||||
- Node.js
|
||||
- Gitlab CI
|
||||
- Terraform
|
||||
- Nest.js
|
||||
- Typescript
|
||||
summary: |
|
||||
narando provides a crowd-working platform where texts such as magazine
|
||||
articles and blog posts are recorded by professional narrators and
|
||||
subsequently published to websites and podcast platforms such as Spotify.
|
||||
It is a small company, so I wore many hats, often simultaneously, in the 5
|
||||
years I worked there.
|
||||
|
||||
As the Lead Developer, I was responsible for the 3-person dev team. In
|
||||
that role, I planned the implementation of new features and oversaw our
|
||||
bi-weekly planning sessions. I introduced modern development practices
|
||||
such as merge requests and taught the other engineers to get them to excel
|
||||
at their tasks.
|
||||
|
||||
In my role as a Backend Engineer, I planned and implemented a new version
|
||||
of the production and publishing platforms that power narando, as the
|
||||
previous proof of concept was hitting its limits. This new platform was
|
||||
built using multiple Node.js services for different use-cases such as core
|
||||
production, file handling, post-production, and publishing feeds.
|
||||
|
||||
As the Cloud Infrastructure Engineer, I planned and implemented our
|
||||
infrastructure in AWS. Most of our services were deployed as containers to
|
||||
ECS and were backed by RDS MySQL. I also built an event queue for our
|
||||
services on top of SNS+SQS. Everything was configured by Terraform and by
|
||||
using common templates, new services could be launched in less than a day.
|
||||
|
||||
To improve our development velocity and reduce toil, I build automated
|
||||
pipelines for our services to run tests and linting for each commit
|
||||
merge request and to automatically release and deploy the services once
|
||||
they are merged. During the first year we got started with Jenkins but
|
||||
then switched to GitLab CI because Jenkins needed too much maintenance and
|
||||
we liked the Gitlab CI syntax better.
|
||||
|
||||
highlights:
|
||||
- Built out the infrastructure on AWS using mostly container technology (ECS)
|
||||
- Planned and implemented a Node.js microservice architecture
|
||||
- Introduced code reviews to improve the code quality and learn from each other
|
||||
|
||||
- name: TrackCode GmbH
|
||||
position: Software Engineer Infrastructure & Backend
|
||||
website: https://trackcode.de/
|
||||
startDate: "2016-12"
|
||||
endDate: "2020-04"
|
||||
keywords:
|
||||
- Kubernetes
|
||||
- Backend
|
||||
- CI/CD
|
||||
- Node.js
|
||||
- Jenkins
|
||||
summary: |
|
||||
TrackCode is a Transport Management System for the last-mile delivery
|
||||
logistics companies, importing shipment data directly from the customers'
|
||||
systems and exporting scan events and signatures back to the logistics
|
||||
networks.
|
||||
|
||||
When I joined TrackCode, I initially focused on the Node.js backend
|
||||
software, which was talking to the Web and Android Apps through a JSON
|
||||
API and persisting data in MySQL and MongoDB.
|
||||
|
||||
Later on, my role at TrackCode shifted and I started working more on
|
||||
infrastructure and DevOps topics. I planned and implemented a new
|
||||
development platform for our growing team on top of Kubernetes with
|
||||
Rancher. To sustainably learn from past issues and avoid being waken up by
|
||||
alerts, I established a postmortem culture, which helped us fully
|
||||
explore incidents and solve the root causes.
|
||||
|
||||
To improve our confidence and velocity during development and deployment,
|
||||
I implemented the full CI/CD lifecycle for all of our services, using
|
||||
Jenkins, Unit Tests, and finally an automated release to Kubernetes.
|
||||
|
||||
To help us debug any incidents and investigate for customer support
|
||||
tickets, we used Splunk, but this proved to be too expensive in the long
|
||||
run. I developed our alternative monitoring and observability stack using
|
||||
Graylog, Grafana, and Prometheus. Using these, I also established SLOs for
|
||||
one of our core metrics, "time to export events".
|
||||
|
||||
highlights:
|
||||
- Planned and implemented a new development platform on top of Kubernetes
|
||||
- Established a structured process to analyze incidents (postmortems)
|
||||
- Implemented a full CI/CD lifecycle for all services (Jenkins, Tests, Release to Kubernetes)
|
||||
|
||||
- name: narando GmbH
|
||||
position: Working student
|
||||
website: https://about.narando.com/
|
||||
startDate: "2016-04"
|
||||
endDate: "2017-06"
|
||||
keywords:
|
||||
- Ruby on Rails
|
||||
- Android
|
||||
summary: |-
|
||||
While finishing my Abitur I started working at narando and started
|
||||
maintaining the initial proof of concept that was built using Rails.
|
||||
I was also responsible for our Android app and added offline support to it.
|
||||
|
||||
languages:
|
||||
- language: German
|
||||
fluency: Native speaker
|
||||
- language: English
|
||||
fluency: Fluent (C2)
|
||||
|
||||
interests:
|
||||
- name: Video Games
|
||||
keywords:
|
||||
- RPG
|
||||
- Strategy
|
||||
- name: Pen & Paper RPGs
|
||||
keywords:
|
||||
- Fantasy
|
||||
- DnD 5e
|
||||
- name: Music
|
||||
keywords:
|
||||
- Rock
|
||||
- Metal
|
||||
- Techno
|
||||
- Festivals & Concerts
|
||||
|
||||
references: []
|
||||
|
||||
education:
|
||||
- institution: Paderborn University
|
||||
studyType: Computer Science
|
||||
startDate: "2016-10"
|
||||
endDate: "2016-11"
|
||||
summary: |
|
||||
As a child and teenager, I always knew that I wanted to study Computer
|
||||
Science. But once I started my studies, I realized that the actual
|
||||
real-life work as a software engineer was far more interesting to me. I
|
||||
dropped out after one month and instead started working at a second
|
||||
startup.
|
||||
|
||||
- institution: Ev. Gymnasium Werther
|
||||
studyType: Abitur
|
||||
startDate: "2008"
|
||||
endDate: "2016-07-01"
|
||||
gpa: "2.2"
|
||||
courses:
|
||||
- LK Mathematik
|
||||
- LK Physik
|
||||
|
||||
projects:
|
||||
- name: Listory
|
||||
summary: |
|
||||
Self-hosted app to track all your Spotify listens and show interesting
|
||||
insights that I develop to fill my own needs.
|
||||
startDate: 2020-01
|
||||
url: https://github.com/apricote/Listory
|
||||
type: application
|
||||
keywords:
|
||||
- Node.js
|
||||
- Nest.js
|
||||
- Helm
|
||||
- React
|
||||
|
||||
- name: Streaming on Twitch
|
||||
summary: |
|
||||
When I still have creative energy left at the end of the week, I like to
|
||||
stream software development on Twitch. I mostly stream my work on Listory,
|
||||
but in December 2021 I streamed my Advent of Code attempts every day.
|
||||
startDate: 2020-10
|
||||
url: https://twitch.tv/apricote4
|
||||
type: presentation
|
||||
keywords:
|
||||
- Go
|
||||
- Node.js
|
||||
- AV production
|
||||
- Public Talking
|
||||
|
||||
- name: cluster-api-provider-openstack
|
||||
summary: |
|
||||
I am a reviewer of the project and actively contribute new features.
|
||||
startDate: 2022-03
|
||||
endDate: 2022-09
|
||||
url: https://sigs.k8s.io/cluster-api-provider-openstack
|
||||
type: application
|
||||
keywords:
|
||||
- Cluster API
|
||||
- OpenStack
|
||||
- Go
|
||||
- Kubernetes
|
||||
|
||||
- name: "@narando/nest-xray"
|
||||
summary: |
|
||||
A package that integrates AWS X-Ray tracing with the Nest.js framework.
|
||||
Initially developed by me while I was working at narando.
|
||||
startDate: 2019-10
|
||||
endDate: 2020-10
|
||||
url: https://github.com/narando/nest-xray
|
||||
keywords:
|
||||
- Node.js
|
||||
- Nest.js
|
||||
- Tracing
|
||||
- AWS
|
||||
|
||||
- name: hcloud-csi-driver
|
||||
summary: |
|
||||
Kubernetes CSI Driver to integrate with Hetzner Cloud Volumes.
|
||||
Based on the DigitalOcean CSI driver. Archived since Hetzner Cloud
|
||||
released an official driver.
|
||||
startDate: 2018-10
|
||||
endDate: 2019-09
|
||||
url: https://github.com/apricote/hcloud-csi-driver
|
||||
type: application
|
||||
keywords:
|
||||
- Go
|
||||
- Kubernetes
|
||||
|
||||
volunteer: []
|
||||
awards: []
|
||||
publications:
|
||||
- name: Various Presentations
|
||||
website: https://apricote.github.io/presentations/
|
||||
summary: |
|
||||
Multiple presentations at local meetups from 2017 to 2019.
|
||||
|
||||
Topics included: Kubebuilder, CI/CD practices at my employer,
|
||||
JavaScript/Node.js patterns and practices
|
||||
5
go.mod
Normal file
5
go.mod
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
module github.com/apricote/apricote.de
|
||||
|
||||
go 1.20
|
||||
|
||||
require github.com/adityatelange/hugo-PaperMod v0.0.0-20230218071112-e6b697f36512 // indirect
|
||||
2
go.sum
Normal file
2
go.sum
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
github.com/adityatelange/hugo-PaperMod v0.0.0-20230218071112-e6b697f36512 h1:G1oNdjwZCYC0D0C5PddChC4mKBjfCyDvj4i+/rrO3MY=
|
||||
github.com/adityatelange/hugo-PaperMod v0.0.0-20230218071112-e6b697f36512/go.mod h1:HCHxNMKYdGafUYjVV3ICiAqznZK2yH0iI53jqcDFDdQ=
|
||||
0
layouts/.gitkeep
Normal file
0
layouts/.gitkeep
Normal file
12
layouts/shortcodes/about-me-interests.html
Normal file
12
layouts/shortcodes/about-me-interests.html
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
<ul>
|
||||
{{ $interests := $.Site.Data.resume.interests }} {{ range $interests }}
|
||||
<li>
|
||||
<span style="font-weight: 600">{{ .name }}</span>
|
||||
<span style="font-size: 0.8em">
|
||||
{{ range .keywords}}
|
||||
<code>{{.}}</code>
|
||||
{{ end}}
|
||||
</span>
|
||||
</li>
|
||||
{{end}}
|
||||
</ul>
|
||||
12
layouts/shortcodes/about-me-skills.html
Normal file
12
layouts/shortcodes/about-me-skills.html
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
<ul>
|
||||
{{ $skills := $.Site.Data.resume.skills }} {{ range $skills }}
|
||||
<li>
|
||||
<span style="font-weight: 600">{{ .name }}</span>
|
||||
<span style="font-size: 0.8em">
|
||||
{{ range .keywords}}
|
||||
<code>{{.}}</code>
|
||||
{{ end}}
|
||||
</span>
|
||||
</li>
|
||||
{{end}}
|
||||
</ul>
|
||||
29
layouts/shortcodes/projects.html
Normal file
29
layouts/shortcodes/projects.html
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
{{ $projects := $.Site.Data.resume.projects }} {{ range $projects }}
|
||||
|
||||
<div style="margin-bottom: 2em">
|
||||
<div style="font-weight: 200">
|
||||
{{ if not (isset . "endDate")}} {{ .startDate }} - Current {{ else }} {{
|
||||
.startDate }} - {{ .endDate }} {{end}}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<a href="{{.url}}" target="_blank" style="font-weight: 600">{{ .name }}</a>
|
||||
</div>
|
||||
|
||||
<div style="font-size: 0.8em">
|
||||
{{ range .keywords}}
|
||||
<code>{{.}}</code>
|
||||
{{ end}}
|
||||
</div>
|
||||
|
||||
<div>{{.summary | markdownify}}</div>
|
||||
|
||||
{{ if (isset . "highlights") }}
|
||||
<ul>
|
||||
{{ range .highlights }}
|
||||
<li>{{.}}</li>
|
||||
{{end}}
|
||||
</ul>
|
||||
{{end}}
|
||||
</div>
|
||||
{{ end }}
|
||||
31
layouts/shortcodes/work.html
Normal file
31
layouts/shortcodes/work.html
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
{{ $jobs := $.Site.Data.resume.work }} {{ range $jobs }}
|
||||
|
||||
<div style="margin-bottom: 2em">
|
||||
<div style="font-weight: 200">
|
||||
{{ if not (isset . "endDate")}} {{ .startDate }} - Current {{ else }} {{
|
||||
.startDate }} - {{ .endDate }} {{end}}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<span style="font-weight: 600">{{ .position }}</span>
|
||||
at
|
||||
<a href="{{.website}}" target="_blank">{{ .name }}</a>
|
||||
</div>
|
||||
|
||||
<div style="font-size: 0.8em">
|
||||
{{ range .keywords}}
|
||||
<code>{{.}}</code>
|
||||
{{ end}}
|
||||
</div>
|
||||
|
||||
<div>{{.summary | markdownify}}</div>
|
||||
|
||||
{{ if (isset . "highlights") }}
|
||||
<ul>
|
||||
{{ range .highlights }}
|
||||
<li>{{.}}</li>
|
||||
{{end}}
|
||||
</ul>
|
||||
{{end}}
|
||||
</div>
|
||||
{{ end }}
|
||||
2
layouts/shortcodes/years-till-today.html
Normal file
2
layouts/shortcodes/years-till-today.html
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
{{ $diff := now.Sub (time (.Get 0)) }} {{ $years := div (div $diff.Hours 24) 365
|
||||
}} {{ math.Floor $years }}
|
||||
BIN
static/profile.jpg
Normal file
BIN
static/profile.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 213 KiB |
Loading…
Add table
Add a link
Reference in a new issue