chore(deps): update rust dependencies

Signed-off-by: Tuan-Dat Tran <tuan-dat.tran@tudattr.dev>
This commit is contained in:
Tuan-Dat Tran
2025-08-15 08:18:54 +02:00
parent 6e3db0294f
commit 538c99166f
11 changed files with 772 additions and 569 deletions

View File

@@ -1,18 +0,0 @@
name: Build Docker Image
on:
push:
branches:
- main
- dev
- cicd
jobs:
build:
name: Build
runs-on: [ubuntu-latest, aya01]
steps:
- uses: docker/setup-buildx-action@v3
- uses: docker/build-push-action@v5
with:
tags: tudattr/athome:latest

1155
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -14,6 +14,7 @@ dioxus = { version = "0.6", features = ["fullstack", "router"] }
tracing = "0.1.40"
dioxus-logger = "0.6.0"
dioxus-i18n = "0.4.0"
tracing-subscriber = { version = "0.3", features = ["json", "env-filter"] }
[features]
default = []

View File

@@ -19,7 +19,10 @@ ENV PATH="/.cargo/bin:$PATH"
# Create the final bundle folder. Bundle always executes in release mode with optimizations enabled
RUN dx bundle --platform web
FROM chef AS runtime
FROM debian:bookworm-slim AS runtime
# Install ca-certificates for HTTPS requests if the server makes any outgoing calls
RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*
COPY --from=builder /app/target/dx/athome/release/web/ /usr/local/app
# set our port and make sure to listen for all connections

View File

@@ -1,7 +1,6 @@
headers_home = Home
headers_cv = Lebenslauf
headers_publications_projects = Artikel/Projekte
headers_consulting = Consulting
headers_about = Impressum
headers_language_buttons_english = 🇬🇧 Englisch
headers_language_buttons_german = 🇩🇪 Deutsch
@@ -16,7 +15,7 @@ cv_introduction_title = DevOps Engineer | Homelab Enthusiast
cv_introduction_0 =
DevOps Engineer und Softwareentwickler mit starkem akademischen Hintergrund
in Netzwerktechnologien und Softwareentwicklung. Spezialisiert auf Kubernetes,
Ansible, Azure und moderne Cloud-Technologien. Praxisnahe
Ansible, Azure und modernen Cloud-Technologien. Praxisnahe
Forschungserfahrung in Software-Defined Networking, 5G und Maschinellem Lernen.
Leidenschaft für effiziente IT-Infrastrukturen, Automatisierung und
innovative Softwarelösungen.
@@ -75,7 +74,6 @@ cv_socials_title = Profile
cv_education_title = Bildungsweg
cv_education_bachelor_title = BSc Angewandte Informatik - Systems Engineering
cv_education_bachelor_time = 2015 - jetzt
cv_education_bachelor_description = ""
cv_skills_title = Fähigkeiten
cv_skills_devops_title = DevOps
cv_skills_devops_ansible = Ansible
@@ -111,7 +109,6 @@ publications_projects_publications_rpm_description = In diesem Artikel stellen
publications_projects_publications_iot_fuzzers_title = Overview of IoT Fuzzing Techniques
publications_projects_publications_iot_fuzzers_authors = Tuan-Dat Tran
publications_projects_publications_iot_fuzzers_conference = Seminar
publications_projects_publications_iot_fuzzers_url = https://git.tudattr.dev/AISE/seminar/src/branch/main/paper.pdf
publications_projects_publications_iot_fuzzers_description = In dieser Arbeit
vergleichen wir Methoden, die speziell von IoT Fuzzern genutzt werden um die
von IoT Geräten stammenden Herausforderungen und Einschränkungen zu umgehen.
@@ -119,13 +116,11 @@ publications_projects_projects_title = Projekte
publications_projects_projects_bpba_title = Unbenannter Ethereum Smart Contract Fuzzer
publications_projects_projects_bpba_authors = Tuan-Dat Tran
publications_projects_projects_bpba_kind = Bachelorprojekt/Bachelorarbeit
publications_projects_projects_bpba_url = https://git.ude-syssec.de/uni-due-syssec/students/2022_tuan-dat_tran_libAFLEVMFuzzer/ethfuzz/
publications_projects_projects_bpba_description = In diesem aktuell laufendem
Projekt entwickle ich einen Ethereum Smart Contract Fuzzer. Mehr Infos folgen...
publications_projects_projects_dotfiles_title = .dotfiles
publications_projects_projects_dotfiles_authors = Tuan-Dat Tran
publications_projects_projects_dotfiles_kind = Personal
publications_projects_projects_dotfiles_url = https://git.tudattr.dev/tudattr/dotfiles
publications_projects_projects_dotfiles_description = dotfiles ist ein
umgangssprachlicher Begriff, der normalerweise für Konfigurationsdateien in
Linux-basierten Systemen verwendet wird. Meine Dotfiles enthalten
@@ -137,7 +132,6 @@ publications_projects_projects_dotfiles_description = dotfiles ist ein
publications_projects_projects_homelab_title = Homelab
publications_projects_projects_homelab_authors = Tuan-Dat Tran
publications_projects_projects_homelab_kind = Personal
publications_projects_projects_homelab_url = https://git.tudattr.dev/tudattr/ansible
publications_projects_projects_homelab_description = Ansible ist ein
Automatisierungs-Werkzeug, die eine automatische Maschinenbereitstellung,
Konfigurationsverwaltung und Anwendungsbereitstellung ermöglicht. Ich
@@ -146,15 +140,14 @@ publications_projects_projects_homelab_description = Ansible ist ein
publications_projects_projects_athome_title = Diese Website
publications_projects_projects_athome_authors = Tuan-Dat Tran
publications_projects_projects_athome_kind = Personal
publications_projects_projects_athome_url = /#
publications_projects_projects_athome_description = Diese Website ist eine mit
dem auf Rust basiertem Dioxus Framwork und TailwindCSS gebaute Full Stack
WASM Website, die sowohl zum Auffrischen von Web Themen, sowie als Rust
Hobbyprojekt dient.
impressum_off = Impressum anzeigen
impressum_on = Impressum
component_under_construction = Diese Seite befindet sich gerade im Aufbau
footer_year = © 2025
footer_name = Tuan-Dat Tran
footer_rights = . All Rights Reserved.
footer_contact = Kontakt
link_opens_new_tab = (öffnet in neuem Tab)

View File

@@ -1,7 +1,6 @@
headers_home = Home
headers_cv = Résumé
headers_publications_projects = Publications/Projects
headers_consulting = Consulting
headers_about = About
headers_language_buttons_english = 🇬🇧 English
headers_language_buttons_german = 🇩🇪 German
@@ -58,19 +57,18 @@ cv_workexperience_ra_ude_description = While working at the Network
infractructure, inventory system and online presence.
cv_workexperience_dd_devops_title = DevOps Engineer @ DextraData
cv_workexperience_dd_devops_time = 2025 - now
cv_workexperience_dd_devops_description = At DextraData as a DevOps Engineer,
I am responsible for the cloud-based infrastructure hosting our companies
diverse portfolio of SaaS products, collaborating with Software Developers,
Customer Success Managers, and Customer Success Engineers to ensure
operational excellence and uninterrupted service delivery for our customers
with their specific requirements at the forefront. I manage
Kubernetes cluster deployments, continuously monitor deployment health metrics,
and implement Infrastructure as Code solutions.
cv_workexperience_dd_devops_description = As a DevOps Engineer at DextraData,
I'm responsible for the cloud-based infrastructure behind the company's many
SaaS products. I work closely with software developers, Customer Success
Managers, and Customer Success Engineers to ensure operational excellence
and seamless service delivery for our customers, always keeping their
specific needs in mind. My duties include managing Kubernetes cluster
deployments, continuously monitoring deployment health metrics, and
implementing Infrastructure-as-Code solutions.
cv_socials_title = Socials
cv_education_title = Education
cv_education_bachelor_title = BSc Systems Engineering
cv_education_bachelor_time = 2015 - now
cv_education_bachelor_description = ""
cv_skills_title = Skills
cv_skills_devops_title = DevOps
cv_skills_devops_ansible = Ansible
@@ -106,7 +104,6 @@ publications_projects_publications_rpm_description = In this paper, we present
publications_projects_publications_iot_fuzzers_title = Overview of IoT Fuzzing Techniques
publications_projects_publications_iot_fuzzers_authors = Tuan-Dat Tran
publications_projects_publications_iot_fuzzers_conference = Seminar
publications_projects_publications_iot_fuzzers_url = https://git.tudattr.dev/AISE/seminar/src/branch/main/paper.pdf
publications_projects_publications_iot_fuzzers_description = In this paper, we
are comparing techniques used by IoT fuzzers to circumvent the challenges
presented by IoT devices and the constraints of the solutions proposed by the
@@ -115,12 +112,10 @@ publications_projects_projects_title = Projects
publications_projects_projects_bpba_title = Undisclosed Ethereum Smart Contract Fuzzer
publications_projects_projects_bpba_authors = Tuan-Dat Tran
publications_projects_projects_bpba_kind = Bachelor Project/Bachelor Thesis
publications_projects_projects_bpba_url = https://git.ude-syssec.de/uni-due-syssec/students/2022_tuan-dat_tran_libAFLEVMFuzzer/ethfuzz/
publications_projects_projects_bpba_description = In this ongoing project I am building an Ethereum Smart Contract Fuzzer. More info will follow.
publications_projects_projects_dotfiles_title = .dotfiles
publications_projects_projects_dotfiles_authors = Tuan-Dat Tran
publications_projects_projects_dotfiles_kind = Personal
publications_projects_projects_dotfiles_url = https://git.tudattr.dev/tudattr/dotfiles
publications_projects_projects_dotfiles_description = dotfiles is a slang term
usually used for configuration files in Linux based systems. My dotfiles
contain configurations for tools I frequently use as well as a documentation
@@ -130,7 +125,6 @@ publications_projects_projects_dotfiles_description = dotfiles is a slang term
publications_projects_projects_homelab_title = Homelab
publications_projects_projects_homelab_authors = Tuan-Dat Tran
publications_projects_projects_homelab_kind = Personal
publications_projects_projects_homelab_url = https://git.tudattr.dev/tudattr/ansible
publications_projects_projects_homelab_description = Ansible is a automation
tool which allows for automatic provisioning, configuration management and
application deployment. I use ansible to set up my homelab, which serves as a
@@ -138,15 +132,14 @@ publications_projects_projects_homelab_description = Ansible is a automation
publications_projects_projects_athome_title = This Website
publications_projects_projects_athome_authors = Tuan-Dat Tran
publications_projects_projects_athome_kind = Personal
publications_projects_projects_athome_url = /#
publications_projects_projects_athome_description = This website is a
full-stack WASM site built using the Rust-based Dioxus framework and
TailwindCSS. It serves both as a way to refresh web development topics and as
a Rust hobby project.
impressum_off = Show Impressum
impressum_on = Impressum
component_under_construction = This page is currently under construction
footer_year = © 2025
footer_name = Tuan-Dat Tran
footer_rights = . All Rights Reserved.
footer_contact = Contact
link_opens_new_tab = (opens in a new tab)

61
scripts/check_i18n.py Normal file
View File

@@ -0,0 +1,61 @@
import os
import re
def check_i18n_keys(project_root):
src_dir = os.path.join(project_root, "src")
languages_dir = os.path.join(project_root, "languages")
rust_key_regex = re.compile(r't!\("([a-zA-Z0-9_.]+)"\)')
ftl_key_regex = re.compile(r"^([a-zA-Z0-9_.-]+)\s*=")
used_keys = set()
defined_keys = set()
# Extract keys from Rust files
for root, _, files in os.walk(src_dir):
for file in files:
if file.endswith(".rs"):
file_path = os.path.join(root, file)
with open(file_path, "r", encoding="utf-8") as f:
content = f.read()
for match in rust_key_regex.finditer(content):
used_keys.add(match.group(1))
# Extract keys from FTL files
for root, _, files in os.walk(languages_dir):
for file in files:
if file.endswith(".ftl"):
file_path = os.path.join(root, file)
with open(file_path, "r", encoding="utf-8") as f:
for line in f:
match = ftl_key_regex.match(line)
if match:
defined_keys.add(match.group(1))
print("--- i18n Key Check Report ---")
missing_keys = used_keys - defined_keys
if not missing_keys:
print("✅ No missing translation keys found in FTL files.")
else:
print(
"❌ Missing translation keys (used in code but not defined in FTL files):"
)
for key in sorted(list(missing_keys)):
print(f" - {key}")
unused_keys = defined_keys - used_keys
if not unused_keys:
print("✅ No unused translation keys found in FTL files.")
else:
print("⚠️ Unused translation keys (defined in FTL files but not used in code):")
for key in sorted(list(unused_keys)):
print(f" - {key}")
print("-----------------------------")
if __name__ == "__main__":
project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
check_i18n_keys(project_root)

View File

@@ -280,3 +280,35 @@ fn random_badge_color(seed: usize) -> String {
colors[seed % colors.len()].to_string()
}
#[derive(PartialEq, Props, Clone)]
pub struct AccessibleLinkProps {
to: String,
#[props(default = "".to_string())]
class: String,
#[props(default = false)]
new_tab: bool,
children: Element,
}
#[component]
pub fn AccessibleLink(props: AccessibleLinkProps) -> Element {
let mut aria_label = String::new();
let mut rel = String::new();
if props.new_tab {
aria_label = t!("link_opens_new_tab").to_string();
rel = "noopener noreferrer".to_string();
}
rsx! {
Link {
to: "{props.to}",
class: "{props.class}",
new_tab: props.new_tab,
rel: "{rel}",
aria_label: "{aria_label}",
{props.children}
}
}
}

View File

@@ -39,11 +39,11 @@ fn Introduction() -> Element {
P {
{ t!("cv_introduction_tools") },
" ",
Link { new_tab: true, to: "https://www.lazyvim.org/", "NeoVim (LazyVim)" },
AccessibleLink { new_tab: true, to: "https://www.lazyvim.org/", "NeoVim (LazyVim)" },
", ",
Link { new_tab: true, to: "https://zellij.dev/", "Zellij" },
AccessibleLink { new_tab: true, to: "https://zellij.dev/", "Zellij" },
", ",
Link { new_tab: true, to: "https://k9scli.io/", "k9s" }
AccessibleLink { new_tab: true, to: "https://k9scli.io/", "k9s" }
},
},
}
@@ -210,7 +210,7 @@ fn Socials() -> Element {
H4 { { t!("cv_socials_title") } },
div {
class: "flex justify-center items-center space-x-4",
P { Link { to:"https://www.linkedin.com/in/tudattr/", class:"hover:underline", new_tab: true, img { class: "h-8", src:asset!("./assets/pictures/LI-Bug.svg.original.svg"), alt:"LinkedIn Logo" } }},
P { AccessibleLink { to:"https://www.linkedin.com/in/tudattr/", class:"hover:underline", new_tab: true, img { class: "h-8", src:asset!("./assets/pictures/LI-Bug.svg.original.svg"), alt:"LinkedIn Logo" } }},
}
}
}

View File

@@ -1,4 +1,4 @@
use crate::components::{Card, P};
use crate::components::{AccessibleLink, Card, P};
use dioxus::prelude::*;
use dioxus_i18n::t;
@@ -20,9 +20,10 @@ pub fn Home() -> Element {
}
},
},
Link {
AccessibleLink {
to: "mailto:tuan-dat.tran@tudattr.dev",
class: "text-gray-900 bg-gradient-to-br from-green-400 to-blue-600 group-hover:from-green-400 group-hover:to-blue-600 hover:text-white rounded-full shadow-lg py-4 px-4",
new_tab: true,
{ t!("home_card_contact_button") }
}
},

View File

@@ -9,7 +9,8 @@ use dioxus_i18n::prelude::Locale;
use dioxus_i18n::unic_langid::langid;
use layout::footer::Footer;
use layout::header::Header;
use tracing::Level;
use tracing::{Level, info};
use tracing_subscriber::{fmt, prelude::*, EnvFilter};
pub mod components;
mod cv;
@@ -35,14 +36,27 @@ pub enum Route {
PublicationsProjects {},
#[route("/resume")]
CV {},
#[route("/health")]
Health {},
#[end_layout]
#[route("/:..route")]
PageNotFound { route: Vec<String> },
}
fn main() {
dioxus_logger::init(Level::DEBUG).expect("failed to init logger");
LaunchBuilder::new().launch(App)
// Configure tracing to output JSON logs
tracing_subscriber::registry()
.with(EnvFilter::from_default_env().add_directive(Level::INFO.into()))
.with(fmt::layer().json())
.init();
info!("Starting Dioxus application...");
LaunchBuilder::new().launch(App);
}
#[component]
fn Health() -> Element {
rsx! { "OK" }
}
fn App() -> Element {