diff --git a/backend/db/init.js b/backend/db/init.js index 313848a..22a0c29 100644 --- a/backend/db/init.js +++ b/backend/db/init.js @@ -24,157 +24,209 @@ export async function initDB() { await db('cv_data').insert({ id: 1, data: JSON.stringify({ - personal: { - name: "Tuan-Dat Tran", - title: "DevOps Engineer", - intro: "DevOps Engineer and Homelab Enthusiast based in Essen, Germany. Primary owner of a production aviation SaaS platform on Azure AKS, with a research background in P4 programmable networks and a co-authored IEEE publication.", - email: "tuan-dat.tran@dextradata.com", - github: "https://github.com/TuDatTr", - linkedin: "https://www.linkedin.com/in/tudattr/", - location: "Essen, Germany" - }, - experience: [ - { - id: 1, - role: "DevOps Engineer", - company: "DextraData GmbH", - period: "2025 – present", - type: "Full-time", - description: "Primary owner of the Logipad aviation SaaS platform and secondary owner of the GRASP GRC platform, both running on Azure AKS and Rancher-managed Kubernetes clusters.", - highlights: [ - "Drives GitOps adoption with ArgoCD across production Kubernetes clusters", - "Manages CI/CD pipelines with Jenkins and Bitbucket Pipelines", - "Leads incident response for production outages", - "Implemented Azure Container Registry mirroring to resolve Docker Hub rate limits", - "Built internal AI tooling with LiteLLM and Ollama", - "Promoted from Junior DevOps Engineer in January 2026" - ] - }, - { - id: 2, - role: "Research Assistant", - company: "NCS Group, Universität Duisburg-Essen", - period: "2021 – 2024", - type: "Part-time", - description: "Hands-on P4 and programmable data plane research on Intel Tofino ASICs and BMv2, culminating in a co-authored publication at IEEE LCN 2023 (Reverse Path Congestion Marking).", - highlights: [ - "Co-authored RPM paper published at IEEE LCN 2023", - "Built a Dockerized federated LSTM system with custom client-selection strategies for 5G network research", - "Implemented low-latency DASH video streaming on Kubernetes and WebRTC SVC simulcast", - "Managed lab infrastructure: Ansible-automated servers, 100G NIC testbeds (Intel E810, Netronome)", - "Administered AWS accounts, PartDB inventory system, and the group website" - ] - }, - { - id: 3, - role: "Student Mentor", - company: "Universität Duisburg-Essen", - period: "2021 – 2022", - type: "Volunteer", - description: "Introduced groups of ~20 freshmen to their new academic environment at the start of each semester, providing organizational and technical guidance throughout their first year in the computer science programme.", - highlights: [ - "Guided new students through academic orientation each semester", - "Provided technical and organizational support throughout the first year" - ] - }, - { - id: 4, - role: "Software Engineer", - company: "gefeba Engineering GmbH", - period: "2018 – 2020", - type: "Part-time", - description: "Worked on the company's main product — a frame-based data exchange system for monitoring industrial machinery — and developed a real-time log visualization application.", - highlights: [ - "Developed features for a frame-based industrial data exchange system", - "Built a real-time log visualization application for industrial machinery", - "Stack: C#, Angular, Bootstrap, Entity Framework" - ] - }, - { - id: 5, - role: "Student Council Member", - company: "Universität Duisburg-Essen", - period: "2016 – 2019", - type: "Volunteer", - description: "Participated in faculty committees and organized social events. Main responsibilities included managing the faculty's IT infrastructure and providing support to fellow students.", - highlights: [ - "Managed faculty IT infrastructure (Linux, Networking)", - "Organized social events and participated in faculty committees", - "Provided subject-specific and organizational support to fellow students" - ] - }, - { - id: 6, - role: "Software Engineer", - company: "gefeba Engineering GmbH", - period: "2013 – 2015", - type: "Part-time", - description: "Joined after a school internship. Worked on internal ERP projects, designed a mail traffic management tool, and contributed to the internal master data management tool.", - highlights: [ - "Developed internal ERP project features", - "Designed a tool for managing project-related mail traffic", - "Contributed to internal master data management tooling", - "Stack: C#, HTML, CSS, JavaScript" - ] - } - ], - skills: { - "Container & Orchestration": ["Kubernetes", "Docker", "Helm"], - "CI/CD & GitOps": ["ArgoCD", "Jenkins", "Bitbucket Pipelines", "Git"], - "Cloud": ["Azure", "Azure AKS"], - "Infrastructure as Code": ["Ansible"], - "Observability": ["ELK Stack"], - "Programming": ["Rust", "Python", "Bash", "P4"], - "Research": ["Intel Tofino", "BMv2", "DPDK"] - }, - education: [ - { - id: 1, - degree: "B.Sc. Systems Engineering", - institution: "Universität Duisburg-Essen", - period: "2015 – present", - status: "Bachelor thesis ongoing" - } - ], - projects: [ - { - id: 1, - name: "Ethereum Smart Contract Fuzzer", - description: "A fuzzer for Ethereum smart contracts built as part of the bachelor thesis project.", - url: "#", - tech: ["Rust"] - }, - { - id: 2, - name: "Homelab", - description: "Ansible-managed homelab serving as a platform for learning and experimenting with new technologies through automated provisioning and configuration management.", - url: "https://git.tudattr.dev", - tech: ["Ansible", "Kubernetes"] - }, - { - id: 3, - name: ".dotfiles", - description: "Configuration files for daily-use tools providing a reproducible baseline for any personal ArchLinux system, including NeoVim (LazyVim), Zellij, and k9s setups.", - url: "https://github.com/TuDatTr", - tech: ["Shell", "NeoVim", "ArchLinux"] - }, - { - id: 4, - name: "tudattr.dev", - description: "Full-stack WebAssembly personal website built with the Rust-based Dioxus framework and Tailwind CSS.", - url: "https://www.tudattr.dev", - tech: ["Rust", "Dioxus", "Tailwind CSS"] - }, - { - id: 5, - name: "mtg-builder", - description: "CLI Magic: The Gathering (Commander/EDH) deck-builder and collection manager using the Scryfall API, with exponential backoff retry logic.", - url: "https://git.tudattr.dev/tudattr/mtg-builder", - tech: ["Rust"] - } - ] - }) - }); + "personal": { + "name": "Tuan-Dat Tran", + "title": "Junior DevOps Engineer", + "intro": "DevOps Engineer and Homelab Enthusiast based in Essen, Germany. Primary owner of a production aviation SaaS platform on Azure AKS, with a research background in P4 programmable networks and a co-authored IEEE publication.", + "email": "tuan-dat.tran@dextradata.com", + "github": "https://github.com/TuDatTr", + "linkedin": "https://www.linkedin.com/in/tudattr/", + "location": "Essen, Germany" + }, + "experience": [ + { + "id": 1, + "role": "Junior DevOps Engineer", + "company": "DextraData GRC Technologies GmbH", + "period": "2025 – present", + "type": "Full-time", + "description": "Primary owner of the GRASP GRC platform and Logipad aviation SaaS platform, running on Azure AKS and Rancher-managed Kubernetes clusters.", + "highlights": [ + "Drives GitOps adoption with ArgoCD across production Kubernetes clusters", + "Manages CI/CD pipelines with Bitbucket Pipelines", + "Leads incident response and on-call for production outages", + "Reduced GRASP frontend pipeline from 30 to 16 minutes", + "Eliminated ~$2k/month Azure logging costs via workspace restructuring", + "Built internal AI tooling with LiteLLM and Ollama", + "Implemented Azure Container Registry mirroring to resolve Docker Hub rate limits" + ] + }, + { + "id": 2, + "role": "Research Assistant", + "company": "NCS Group, Universität Duisburg-Essen", + "period": "2021 – 2024", + "type": "Part-time", + "description": "Hands-on P4 and programmable data plane research on Intel Tofino ASICs and BMv2, culminating in a co-authored publication at IEEE LCN 2023 (Reverse Path Congestion Marking).", + "highlights": [ + "Co-authored RPM: Reverse Path Congestion Marking on P4 Programmable Switches — IEEE LCN 2023", + "Built a Dockerized federated LSTM system with custom client-selection strategies for 5G network research", + "Implemented low-latency DASH video streaming on Kubernetes and WebRTC SVC simulcast via Janus", + "Managed lab infrastructure: Ansible-automated servers, 100G NIC testbeds (Intel E810, Netronome), DPDK", + "Administered AWS accounts, PartDB inventory system, and the group website" + ] + }, + { + "id": 3, + "role": "Student Mentor", + "company": "Universität Duisburg-Essen", + "period": "2021 – 2022", + "type": "Volunteer", + "description": "Introduced groups of ~20 freshmen to their new academic environment each semester, providing organizational and technical guidance throughout their first year.", + "highlights": [ + "Guided new students through academic orientation each semester", + "Provided technical and organizational support throughout the first year" + ] + }, + { + "id": 4, + "role": "Software Engineer", + "company": "gefeba Engineering GmbH", + "period": "2018 – 2020", + "type": "Part-time", + "description": "Worked on the company's main product — a frame-based data exchange system for monitoring industrial machinery — and developed a real-time log visualization application.", + "highlights": [ + "Developed features for a frame-based industrial data exchange system", + "Built a real-time log visualization application for industrial machinery", + "Stack: C#, Angular, Bootstrap, Entity Framework" + ] + }, + { + "id": 5, + "role": "Student Council Member", + "company": "Universität Duisburg-Essen", + "period": "2016 – 2019", + "type": "Volunteer", + "description": "Participated in faculty committees and organized social events. Managed the faculty's IT infrastructure and provided support to fellow students.", + "highlights": [ + "Managed faculty IT infrastructure (Linux, Networking, LaTeX)", + "Organized social events and participated in faculty committees", + "Provided subject-specific and organizational support to fellow students" + ] + }, + { + "id": 6, + "role": "Software Engineer", + "company": "gefeba Engineering GmbH", + "period": "2013 – 2015", + "type": "Part-time", + "description": "Joined after a school internship. Worked on internal ERP projects, designed a mail traffic management tool, and contributed to master data management tooling.", + "highlights": [ + "Developed internal ERP project features", + "Designed a tool for managing project-related mail traffic", + "Contributed to internal master data management tooling", + "Stack: C#, HTML, CSS, JavaScript" + ] + } + ], + "skills": { + "Container & Orchestration": [ + "Kubernetes", + "Docker", + "Helm", + "ArgoCD" + ], + "CI/CD": [ + "Bitbucket Pipelines", + "Git" + ], + "Cloud": [ + "Azure", + "Azure AKS", + "Azure App Gateway", + "Azure Entra ID" + ], + "Infrastructure as Code": [ + "Ansible" + ], + "Observability": [ + "ELK Stack", + "Checkmk", + "UptimeRobot" + ], + "Databases": [ + "PostgreSQL", + "MongoDB", + "CouchDB" + ], + "Programming": [ + "Rust", + "Python", + "Bash", + "P4" + ], + "Research": [ + "Intel Tofino", + "BMv2", + "DPDK" + ] + }, + "education": [ + { + "id": 1, + "degree": "B.Sc. Systems Engineering", + "institution": "Universität Duisburg-Essen", + "period": "2015 – present", + "status": "Bachelor thesis ongoing" + } + ], + "projects": [ + { + "id": 1, + "name": "Ethereum Smart Contract Fuzzer", + "description": "A fuzzer for Ethereum smart contracts built as part of the bachelor thesis project.", + "url": "#", + "tech": [ + "Rust" + ] + }, + { + "id": 2, + "name": "Homelab", + "description": "Ansible-managed homelab running on Debian Linux with Raspberry Pi, Mikrotik networking, Pihole, and self-hosted services.", + "url": "https://git.tudattr.dev/tudattr/ansible", + "tech": [ + "Ansible", + "Kubernetes", + "Debian Linux" + ] + }, + { + "id": 3, + "name": ".dotfiles", + "description": "Configuration files for daily-use tools providing a reproducible baseline for any personal ArchLinux system, including NeoVim (LazyVim), Zellij, and k9s.", + "url": "https://github.com/TuDatTr/dotfiles", + "tech": [ + "Zsh", + "NeoVim", + "Zellij", + "ArchLinux" + ] + }, + { + "id": 4, + "name": "tudattr.dev", + "description": "Full-stack WebAssembly personal website built with the Rust-based Dioxus framework and Tailwind CSS.", + "url": "https://www.tudattr.dev", + "tech": [ + "Rust", + "Dioxus", + "Tailwind CSS", + "WebAssembly" + ] + }, + { + "id": 5, + "name": "mtg-builder", + "description": "CLI Magic: The Gathering (Commander/EDH) deck-builder and collection manager using the Scryfall API, with exponential backoff retry logic.", + "url": "https://git.tudattr.dev/tudattr/mtg-builder", + "tech": [ + "Rust" + ] + } + ] + }) + }); console.log('Initialized database with default CV data'); } diff --git a/package.json b/package.json index 4c83b20..ea5a727 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "version": "1.1.0", "type": "module", "scripts": { + "sync-profile": "node scripts/sync-profile.mjs", "dev": "vite", "build": "vite build", "lint": "eslint .", diff --git a/scripts/sync-profile.mjs b/scripts/sync-profile.mjs new file mode 100644 index 0000000..9201f89 --- /dev/null +++ b/scripts/sync-profile.mjs @@ -0,0 +1,60 @@ +#!/usr/bin/env node +/** + * Reads cv-data.json from the persons profile directory and writes it into: + * - src/lib/cv.json (frontend default / compile-time fallback) + * - backend/db/init.js (backend DB seed on first boot) + * + * Usage: + * node scripts/sync-profile.mjs [path/to/cv-data.json] + * + * Default source path: ~/workspace/persons/tuan-dat.tran/cv-data.json + */ + +import { readFileSync, writeFileSync } from 'fs'; +import { resolve } from 'path'; +import { homedir } from 'os'; +import { fileURLToPath } from 'url'; +import { dirname } from 'path'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const root = resolve(__dirname, '..'); + +const sourcePath = process.argv[2] + ?? resolve(homedir(), 'workspace/persons/tuan-dat.tran/cv-data.json'); + +let data; +try { + data = JSON.parse(readFileSync(sourcePath, 'utf8')); +} catch (e) { + console.error(`Failed to read ${sourcePath}: ${e.message}`); + process.exit(1); +} + +// 1. Write src/lib/cv.json +const cvJsonPath = resolve(root, 'src/lib/cv.json'); +writeFileSync(cvJsonPath, JSON.stringify(data, null, 2) + '\n'); +console.log(`wrote ${cvJsonPath}`); + +// 2. Rewrite the seed block in backend/db/init.js +const initPath = resolve(root, 'backend/db/init.js'); +const initSrc = readFileSync(initPath, 'utf8'); + +const seedJson = JSON.stringify(data, null, 8) + .split('\n') + .map((line, i) => i === 0 ? line : ' ' + line) + .join('\n'); + +const updated = initSrc.replace( + /data: JSON\.stringify\([\s\S]*?\)\s*\}\);/, + `data: JSON.stringify(${seedJson})\n });` +); + +if (updated === initSrc) { + console.error('Could not find seed block in backend/db/init.js — pattern mismatch'); + process.exit(1); +} + +writeFileSync(initPath, updated); +console.log(`wrote ${initPath}`); + +console.log('done — rebuild Docker images and restart with a fresh volume to apply'); diff --git a/src/lib/cv.json b/src/lib/cv.json index 11a36b6..9abd590 100644 --- a/src/lib/cv.json +++ b/src/lib/cv.json @@ -1,7 +1,7 @@ { "personal": { "name": "Tuan-Dat Tran", - "title": "DevOps Engineer", + "title": "Junior DevOps Engineer", "intro": "DevOps Engineer and Homelab Enthusiast based in Essen, Germany. Primary owner of a production aviation SaaS platform on Azure AKS, with a research background in P4 programmable networks and a co-authored IEEE publication.", "email": "tuan-dat.tran@dextradata.com", "github": "https://github.com/TuDatTr", @@ -11,18 +11,19 @@ "experience": [ { "id": 1, - "role": "DevOps Engineer", - "company": "DextraData GmbH", + "role": "Junior DevOps Engineer", + "company": "DextraData GRC Technologies GmbH", "period": "2025 – present", "type": "Full-time", - "description": "Primary owner of the Logipad aviation SaaS platform and secondary owner of the GRASP GRC platform, both running on Azure AKS and Rancher-managed Kubernetes clusters.", + "description": "Primary owner of the GRASP GRC platform and Logipad aviation SaaS platform, running on Azure AKS and Rancher-managed Kubernetes clusters.", "highlights": [ "Drives GitOps adoption with ArgoCD across production Kubernetes clusters", - "Manages CI/CD pipelines with Jenkins and Bitbucket Pipelines", - "Leads incident response for production outages", - "Implemented Azure Container Registry mirroring to resolve Docker Hub rate limits", + "Manages CI/CD pipelines with Bitbucket Pipelines", + "Leads incident response and on-call for production outages", + "Reduced GRASP frontend pipeline from 30 to 16 minutes", + "Eliminated ~$2k/month Azure logging costs via workspace restructuring", "Built internal AI tooling with LiteLLM and Ollama", - "Promoted from Junior DevOps Engineer in January 2026" + "Implemented Azure Container Registry mirroring to resolve Docker Hub rate limits" ] }, { @@ -33,10 +34,10 @@ "type": "Part-time", "description": "Hands-on P4 and programmable data plane research on Intel Tofino ASICs and BMv2, culminating in a co-authored publication at IEEE LCN 2023 (Reverse Path Congestion Marking).", "highlights": [ - "Co-authored RPM paper published at IEEE LCN 2023", + "Co-authored RPM: Reverse Path Congestion Marking on P4 Programmable Switches — IEEE LCN 2023", "Built a Dockerized federated LSTM system with custom client-selection strategies for 5G network research", - "Implemented low-latency DASH video streaming on Kubernetes and WebRTC SVC simulcast", - "Managed lab infrastructure: Ansible-automated servers, 100G NIC testbeds (Intel E810, Netronome)", + "Implemented low-latency DASH video streaming on Kubernetes and WebRTC SVC simulcast via Janus", + "Managed lab infrastructure: Ansible-automated servers, 100G NIC testbeds (Intel E810, Netronome), DPDK", "Administered AWS accounts, PartDB inventory system, and the group website" ] }, @@ -46,7 +47,7 @@ "company": "Universität Duisburg-Essen", "period": "2021 – 2022", "type": "Volunteer", - "description": "Introduced groups of ~20 freshmen to their new academic environment at the start of each semester, providing organizational and technical guidance throughout their first year in the computer science programme.", + "description": "Introduced groups of ~20 freshmen to their new academic environment each semester, providing organizational and technical guidance throughout their first year.", "highlights": [ "Guided new students through academic orientation each semester", "Provided technical and organizational support throughout the first year" @@ -71,9 +72,9 @@ "company": "Universität Duisburg-Essen", "period": "2016 – 2019", "type": "Volunteer", - "description": "Participated in faculty committees and organized social events. Main responsibilities included managing the faculty's IT infrastructure and providing support to fellow students.", + "description": "Participated in faculty committees and organized social events. Managed the faculty's IT infrastructure and provided support to fellow students.", "highlights": [ - "Managed faculty IT infrastructure (Linux, Networking)", + "Managed faculty IT infrastructure (Linux, Networking, LaTeX)", "Organized social events and participated in faculty committees", "Provided subject-specific and organizational support to fellow students" ] @@ -84,7 +85,7 @@ "company": "gefeba Engineering GmbH", "period": "2013 – 2015", "type": "Part-time", - "description": "Joined after a school internship. Worked on internal ERP projects, designed a mail traffic management tool, and contributed to the internal master data management tool.", + "description": "Joined after a school internship. Worked on internal ERP projects, designed a mail traffic management tool, and contributed to master data management tooling.", "highlights": [ "Developed internal ERP project features", "Designed a tool for managing project-related mail traffic", @@ -94,13 +95,46 @@ } ], "skills": { - "Container & Orchestration": ["Kubernetes", "Docker", "Helm"], - "CI/CD & GitOps": ["ArgoCD", "Jenkins", "Bitbucket Pipelines", "Git"], - "Cloud": ["Azure", "Azure AKS"], - "Infrastructure as Code": ["Ansible"], - "Observability": ["ELK Stack"], - "Programming": ["Rust", "Python", "Bash", "P4"], - "Research": ["Intel Tofino", "BMv2", "DPDK"] + "Container & Orchestration": [ + "Kubernetes", + "Docker", + "Helm", + "ArgoCD" + ], + "CI/CD": [ + "Bitbucket Pipelines", + "Git" + ], + "Cloud": [ + "Azure", + "Azure AKS", + "Azure App Gateway", + "Azure Entra ID" + ], + "Infrastructure as Code": [ + "Ansible" + ], + "Observability": [ + "ELK Stack", + "Checkmk", + "UptimeRobot" + ], + "Databases": [ + "PostgreSQL", + "MongoDB", + "CouchDB" + ], + "Programming": [ + "Rust", + "Python", + "Bash", + "P4" + ], + "Research": [ + "Intel Tofino", + "BMv2", + "DPDK" + ] }, "education": [ { @@ -117,35 +151,53 @@ "name": "Ethereum Smart Contract Fuzzer", "description": "A fuzzer for Ethereum smart contracts built as part of the bachelor thesis project.", "url": "#", - "tech": ["Rust"] + "tech": [ + "Rust" + ] }, { "id": 2, "name": "Homelab", - "description": "Ansible-managed homelab serving as a platform for learning and experimenting with new technologies through automated provisioning and configuration management.", - "url": "https://git.tudattr.dev", - "tech": ["Ansible", "Kubernetes"] + "description": "Ansible-managed homelab running on Debian Linux with Raspberry Pi, Mikrotik networking, Pihole, and self-hosted services.", + "url": "https://git.tudattr.dev/tudattr/ansible", + "tech": [ + "Ansible", + "Kubernetes", + "Debian Linux" + ] }, { "id": 3, "name": ".dotfiles", - "description": "Configuration files for daily-use tools providing a reproducible baseline for any personal ArchLinux system, including NeoVim (LazyVim), Zellij, and k9s setups.", - "url": "https://github.com/TuDatTr", - "tech": ["Shell", "NeoVim", "ArchLinux"] + "description": "Configuration files for daily-use tools providing a reproducible baseline for any personal ArchLinux system, including NeoVim (LazyVim), Zellij, and k9s.", + "url": "https://github.com/TuDatTr/dotfiles", + "tech": [ + "Zsh", + "NeoVim", + "Zellij", + "ArchLinux" + ] }, { "id": 4, "name": "tudattr.dev", "description": "Full-stack WebAssembly personal website built with the Rust-based Dioxus framework and Tailwind CSS.", "url": "https://www.tudattr.dev", - "tech": ["Rust", "Dioxus", "Tailwind CSS"] + "tech": [ + "Rust", + "Dioxus", + "Tailwind CSS", + "WebAssembly" + ] }, { "id": 5, "name": "mtg-builder", "description": "CLI Magic: The Gathering (Commander/EDH) deck-builder and collection manager using the Scryfall API, with exponential backoff retry logic.", "url": "https://git.tudattr.dev/tudattr/mtg-builder", - "tech": ["Rust"] + "tech": [ + "Rust" + ] } ] }