271 lines
7.3 KiB
Markdown
271 lines
7.3 KiB
Markdown
# Konstantin Hintermayer
|
|
|
|
## Rolle im Projekt
|
|
|
|
::: columns
|
|
|
|
:::: column
|
|
**Aufgabenbereiche**:
|
|
|
|
- Product Owner
|
|
- Kundenschnittstelle
|
|
- Infrastruktur & CI/CD
|
|
|
|
**Softwareentwicklung:**
|
|
|
|
- Event Registration
|
|
- Black Board
|
|
- Report System
|
|
- Mass Mailer
|
|
|
|
::::
|
|
|
|
:::: column
|
|
|
|
\begin{tikzpicture}
|
|
\clip (0,0) circle (3em);
|
|
\node at (0,0) {\includegraphics[width=6em]{./Images/images/konstantin/profile.jpg}};
|
|
\draw[accent, line width=3pt] (0,0) circle (3em);
|
|
\end{tikzpicture}
|
|
|
|
::::
|
|
|
|
:::
|
|
|
|
## Infrastruktur
|
|
|
|
::: columns
|
|
:::: column
|
|
|
|
**Entwicklung:**
|
|
|
|
- **Gitea:** Versionskontrollsystem
|
|
- **Wireguard:** VPN
|
|
- **Docker:** Containerisierung
|
|
- **GitHub:** Transfer
|
|
- **Gitea Actions:** CI/CD
|
|
|
|
::::
|
|
:::: column
|
|
|
|
**Produktion:**
|
|
|
|
- **Debian:** Betriebssystem
|
|
- **NginX:** Reverse Proxy
|
|
- **PostgreSQL:** Datenbank
|
|
- **Oqtane:** CMS
|
|
|
|
::::
|
|
:::
|
|
|
|
\vfill
|
|
|
|
\begin{center}
|
|
\includegraphics[width=2.5em]{./Images/images/konstantin/logos/debian.pdf} \hspace{1em}
|
|
\includegraphics[width=2.5em]{./Images/images/konstantin/logos/docker.pdf} \hspace{1em}
|
|
\includegraphics[width=2.5em]{./Images/images/konstantin/logos/gitea.pdf} \hspace{1em}
|
|
\includegraphics[width=2.5em]{./Images/images/konstantin/logos/wireguard.pdf} \hspace{1em}
|
|
\includegraphics[width=2.5em]{./Images/images/konstantin/logos/github.pdf} \hspace{1em}
|
|
\includegraphics[width=2.5em]{./Images/images/konstantin/logos/nginx.pdf} \hspace{1em}
|
|
\includegraphics[width=2.5em]{./Images/images/konstantin/logos/postgres.pdf} \hspace{1em}
|
|
\includegraphics[width=2.5em]{./Images/images/konstantin/logos/oqtane.pdf}
|
|
\end{center}
|
|
|
|
\vfill
|
|
<!-- { width=100% } -->
|
|
|
|
---
|
|
|
|
```mermaid
|
|
sequenceDiagram
|
|
participant browser as Client
|
|
participant nginx as NginX
|
|
participant oqtane as Oqtane
|
|
participant db as PostgreSQL
|
|
|
|
browser->>+nginx: HTTPS => 0.0.0.0:443
|
|
nginx->>nginx: SSL Terminierung
|
|
nginx->>+oqtane: HTTP => 127.0.0.1:5000
|
|
oqtane->>+db: SQL => 127.0.0.1:5432
|
|
db-->>-oqtane: SQL
|
|
oqtane-->>-nginx: HTTP
|
|
nginx-->>-browser: HTTPS
|
|
```
|
|
|
|
|
|
## Von Commit zu Paket
|
|
|
|
\begin{tikzpicture}[
|
|
node distance=1cm,
|
|
stepnode/.style={circle, minimum size=1.2cm, draw, line width=1.5pt, fill=white, inner sep=0pt},
|
|
labelnode/.style={align=center, font=\small\bfseries},
|
|
textnode/.style={align=center, font=\scriptsize, color=gray},
|
|
track/.style={line width=2pt, gray!20}
|
|
]
|
|
% Central Track
|
|
\draw[track] (-1,0) -- (12,0);
|
|
|
|
\node[stepnode, draw=gray!60!black] (n1) at (0,0) {\color{gray!60!black}\small\faCodeBranch};
|
|
\node[stepnode, draw=green!60!black, right=of n1] (n2) {\color{green!60!black}\small\faCheckCircle};
|
|
\node[stepnode, draw=blue!60!black, right=of n2] (n3) {\color{blue!60!black}\small\faCogs};
|
|
\node[stepnode, draw=green!60!black, right=of n3] (n4) {\color{green!60!black}\small\faBoxOpen};
|
|
\node[stepnode, draw=blue!60!black, right=of n4] (n5) {\color{blue!60!black}\small\faDatabase};
|
|
|
|
% Labels Above
|
|
\node[labelnode, below=0.2cm of n1, color=gray!60!black] {Commit};
|
|
\node[labelnode, below=0.2cm of n2, color=green!60!black] {Tag};
|
|
\node[labelnode, below=0.2cm of n3, color=blue!60!black] {CI/CD};
|
|
\node[labelnode, below=0.2cm of n4, color=green!60!black] {.deb Paket};
|
|
\node[labelnode, below=0.2cm of n5, color=blue!60!black] {Registry};
|
|
\end{tikzpicture}
|
|
|
|
\vspace{1em}
|
|
|
|
**Ablauf:**
|
|
|
|
1. laufende Entwicklung
|
|
2. Commit zu einem Release zusammenfassen (Tag)
|
|
3. CI/CD Pipeline beginnt zu laufen
|
|
4. .deb Paket wird gebaut
|
|
5. .deb Paket wird in der Registry abgelegt
|
|
|
|
## Softwarearchitektur (.NET / Oqtane)
|
|
|
|
**Design Patterns:**
|
|
|
|
\vspace{1em}
|
|
|
|
\begin{tikzpicture}[
|
|
node distance=0.15cm,
|
|
stepnode/.style={rectangle, draw, line width=1.5pt, minimum width=1.5cm, minimum height=1.5cm, fill=white, inner sep=0pt},
|
|
]
|
|
\node[stepnode, draw=gray!60!black] (n1) at (0,0) {\LARGE\color{gray!60!black}S};
|
|
\node[stepnode, draw=green!60!black, right=of n1] (n2) {\LARGE\color{green!60!black}O};
|
|
\node[stepnode, draw=blue!60!black, right=of n2] (n3) {\LARGE\color{blue!60!black}L};
|
|
\node[stepnode, draw=orange, right=of n3] (n4) {\LARGE\color{orange}I};
|
|
\node[stepnode, draw=orange!70!black, right=of n4] (n5) {\LARGE\color{orange!70!black}D};
|
|
\end{tikzpicture}
|
|
|
|
\vspace{1em}
|
|
|
|
- Open-Closed Principle
|
|
- Dependency Injection (IServiceProvider)
|
|
- Repository-Pattern (EntityFramework)
|
|
|
|
## Module
|
|
|
|
::: columns
|
|
:::: column
|
|
**Admin Module:**
|
|
|
|
- Mass Mailer
|
|
- Token Lifetime
|
|
- Report System
|
|
|
|
**Allgemeine Module:**
|
|
|
|
- Event Registration
|
|
- Black Board
|
|
|
|
::::
|
|
:::: column
|
|

|
|
::::
|
|
:::
|
|
|
|
## Produktion $\neq$ Staging
|
|
|
|
\begin{tikzpicture}[
|
|
node distance=2.2cm,
|
|
stepnode/.style={circle, minimum size=1.2cm, draw, line width=1.5pt, fill=white, inner sep=0pt},
|
|
labelnode/.style={align=center, font=\small\bfseries},
|
|
textnode/.style={align=center, font=\scriptsize, color=gray},
|
|
track/.style={line width=2pt, gray!20}
|
|
]
|
|
% Central Track
|
|
\draw[track] (-1,0) -- (12,0);
|
|
|
|
% Steps
|
|
\node[stepnode, draw=green!60!black] (s1) at (0,0) {\color{green!60!black}\Large\faCheck};
|
|
\node[stepnode, draw=accent, right=of s1] (s2) {\color{accent}\Large\faCodeBranch};
|
|
\node[stepnode, draw=red, right=of s2] (s3) {\color{red}\Large\faExclamationTriangle};
|
|
\node[stepnode, draw=orange, right=of s3] (s4) {\color{orange}\Large\faLightbulb};
|
|
|
|
% Labels Above
|
|
\node[labelnode, above=0.2cm of s1, color=green!60!black] {Staging};
|
|
\node[labelnode, above=0.2cm of s2, color=accent] {Deploy};
|
|
\node[labelnode, above=0.2cm of s3, color=red] {Bruch};
|
|
\node[labelnode, above=0.2cm of s4, color=orange] {Erkenntnis};
|
|
\end{tikzpicture}
|
|
|
|
\vfill
|
|
|
|
::: columns
|
|
:::: column{.column width=33%}
|
|
"It works on my Machine"
|
|
::::
|
|
:::: column{.column width=66%}
|
|
**Deploymentprobleme bei Hetzner**
|
|
Problem: schlechte Dokumentation.
|
|
Lösung: Debugging mithilfe von Wireshark und lesen des Source Codes um das Framework zu verstehen und den Fehler zu finden.
|
|
::::
|
|
:::
|
|
|
|
|
|
## Teamleitung & PM
|
|
|
|
::: columns
|
|
:::: column
|
|
**Scrum Workflow:**
|
|
|
|
- 14-tägige Sprints
|
|
- Weeklies & Retrospektiven
|
|
- Definition of Done (DoD)
|
|
::::
|
|
:::: column
|
|
**Gitea Issues / Board:**
|
|
|
|
- Integrierter Workflow
|
|
- Single Source of Truth
|
|
|
|
::::
|
|
:::
|
|
|
|
{ width=60% }
|
|
|
|
## Was bleibt
|
|
|
|
\vspace{0.5em}
|
|
|
|
\begin{tikzpicture}[x=\linewidth/10, y=1cm, every node/.style={font=\sffamily}]
|
|
% Rule: 90/90
|
|
\fill[black!5] (0, 2.8) rectangle (10, 3.4);
|
|
\fill[green!60!black] (0, 2.8) rectangle (9, 3.4);
|
|
\node[anchor=north west, inner sep=3pt] at (0, 2.8) {\scriptsize Erste \textbf{90\,\%} des Codes $\rightarrow$ \textbf{90\,\%} der Zeit};
|
|
|
|
\fill[black!5] (0, 1.2) rectangle (10, 1.8);
|
|
\fill[accent] (0, 1.2) rectangle (1, 1.8);
|
|
\node[anchor=north west, inner sep=3pt, text=accent] at (0, 1.2) {\scriptsize \textbf{Letzte 10\,\% des Codes $\rightarrow$ weitere 90\,\% der Zeit}};
|
|
\end{tikzpicture}
|
|
|
|
\vspace{0.5em}
|
|
|
|
::: columns
|
|
:::: { .column width=33% }
|
|
\begin{block}{Lean beats Perfect}
|
|
\scriptsize Weniger bauen, dafür fertig stellen.
|
|
\end{block}
|
|
::::
|
|
|
|
:::: { .column width=33% }
|
|
\begin{block}{Environment First}
|
|
\scriptsize Zielumgebung testen, nicht nur lokal.
|
|
\end{block}
|
|
::::
|
|
|
|
:::: { .column width=33% }
|
|
\begin{block}{Fragen ist Architektur}
|
|
\scriptsize Wer früh fragt, spart später Monate.
|
|
\end{block}
|
|
::::
|
|
::: |