diff --git a/assets/.gitkeep b/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/config.toml b/config.toml deleted file mode 100644 index 1d7c819..0000000 --- a/config.toml +++ /dev/null @@ -1,3 +0,0 @@ -baseURL = 'http://example.org/' -languageCode = 'en-us' -title = 'My New Hugo Site' diff --git a/config.yaml b/config.yaml new file mode 100644 index 0000000..4dbfc61 --- /dev/null +++ b/config.yaml @@ -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 diff --git a/content/about-me.md b/content/about-me.md new file mode 100644 index 0000000..ba50d29 --- /dev/null +++ b/content/about-me.md @@ -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 >}} diff --git a/content/listory.md b/content/listory.md new file mode 100644 index 0000000..efcb94c --- /dev/null +++ b/content/listory.md @@ -0,0 +1,6 @@ +--- +title: "My Favorite Music" +type: listory +--- + +> Work in Progress diff --git a/content/projects.md b/content/projects.md new file mode 100644 index 0000000..518cff4 --- /dev/null +++ b/content/projects.md @@ -0,0 +1,5 @@ +--- +title: "Projects" +--- + +{{< projects >}} diff --git a/content/work.md b/content/work.md new file mode 100644 index 0000000..4cc7f7b --- /dev/null +++ b/content/work.md @@ -0,0 +1,5 @@ +--- +title: "Work Experiences" +--- + +{{< work >}} diff --git a/data/resume.yaml b/data/resume.yaml new file mode 100644 index 0000000..8672b47 --- /dev/null +++ b/data/resume.yaml @@ -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 diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..32f1107 --- /dev/null +++ b/go.mod @@ -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 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..4fe82cd --- /dev/null +++ b/go.sum @@ -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= diff --git a/layouts/.gitkeep b/layouts/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/layouts/shortcodes/about-me-interests.html b/layouts/shortcodes/about-me-interests.html new file mode 100644 index 0000000..c2017ca --- /dev/null +++ b/layouts/shortcodes/about-me-interests.html @@ -0,0 +1,12 @@ +
{{.}}
+ {{ end}}
+
+ {{.}}
+ {{ end}}
+
+ {{.}}
+ {{ end}}
+ {{.}}
+ {{ end}}
+