1
0
generated from avinay/discord-bot

<feat>(all): adding configuration files

This commit is contained in:
avinay
2026-06-04 16:01:31 +02:00
parent eb4d9fc33e
commit 8c848d8986
11 changed files with 1424 additions and 0 deletions
+73
View File
@@ -0,0 +1,73 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Achievements — Anthony Vinay</title>
<link href="https://fonts.googleapis.com/css2?family=EB+Garamond:ital,wght@0,400;0,600;1,400&family=Source+Sans+3:wght@400;600&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="/css/achievements.css" />
</head>
<body>
<a class="back" href="/">← Accueil</a>
<div class="page">
<div class="page-header">
<h1>Achievements</h1>
<p class="subtitle">Expérimentations techniques &amp; retours d'expérience</p>
</div>
<hr class="thick" />
<div class="articles">
<!-- =====================================================
ARTICLE TEMPLATE — duplique ce bloc pour en ajouter
=====================================================
<article class="article">
<div class="article-meta">
<span class="article-date">JJ Mois AAAA</span>
<div class="article-tags">
<span class="tag">Tag1</span>
<span class="tag">Tag2</span>
</div>
</div>
<h2 class="article-title">Titre de l'article</h2>
<p class="article-summary">Résumé court — 1 ou 2 phrases.</p>
<div class="article-body">
<h3>Contexte</h3>
<p>Texte...</p>
</div>
<button class="toggle-btn" onclick="toggleArticle(this)">
Lire <span class="toggle-arrow"></span>
</button>
</article>
-->
<article class="article">
<div class="article-meta">
<span class="article-date"></span>
</div>
<h2 class="article-title">Mise en place d'un serveur proxy <span class="todo">(TODO)</span></h2>
</article>
<article class="article">
<div class="article-meta">
<span class="article-date"></span>
</div>
<h2 class="article-title">Déploiement d'un serveur VPN WireGuard <span class="todo">(TODO)</span></h2>
</article>
</div>
<div class="page-footer">
<span>Anthony Vinay</span>
<span>avinay.ddns.net/achievements</span>
</div>
</div>
<script src="/js/achievements.js" defer></script>
</body>
</html>
+256
View File
@@ -0,0 +1,256 @@
*, *::before, *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
background: #fff;
font-family: 'Source Sans 3', Georgia, sans-serif;
color: #111;
font-size: 15px;
line-height: 1.6;
}
.page {
max-width: 780px;
margin: 0 auto;
padding: 3rem 2.5rem 5rem;
}
/* BACK BUTTON */
.back {
position: fixed;
top: 1.2rem;
left: 1.5rem;
font-family: 'Source Sans 3', sans-serif;
font-size: 0.72rem;
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
text-decoration: none;
color: #aaa;
transition: color 0.15s;
z-index: 101;
}
.back:hover {
color: #111;
}
/* HEADER */
.page-header {
margin-bottom: 1.5rem;
}
.page-header h1 {
font-family: 'EB Garamond', Georgia, serif;
font-size: 2rem;
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
color: #111;
margin-bottom: 0.3rem;
}
.page-header .subtitle {
font-family: 'EB Garamond', Georgia, serif;
font-size: 1rem;
font-style: italic;
color: #666;
}
hr.thick {
border: none;
border-top: 2px solid #111;
margin: 1rem 0 0;
}
/* ARTICLE LIST */
.articles {
margin-top: 2rem;
display: flex;
flex-direction: column;
}
.article {
padding: 2rem 0;
border-bottom: 0.5px solid #ddd;
}
.article:last-child {
border-bottom: none;
}
.article-meta {
display: flex;
align-items: center;
gap: 1rem;
margin-bottom: 0.6rem;
}
.article-date {
font-family: 'Source Sans 3', sans-serif;
font-size: 0.72rem;
color: #aaa;
letter-spacing: 0.06em;
}
.article-tags {
display: flex;
gap: 0.4rem;
flex-wrap: wrap;
}
.tag {
font-family: 'Source Sans 3', sans-serif;
font-size: 0.65rem;
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
color: #888;
border: 0.5px solid #ddd;
padding: 0.15rem 0.5rem;
border-radius: 2px;
}
.article-title {
font-family: 'EB Garamond', Georgia, serif;
font-size: 1.3rem;
font-weight: 600;
color: #111;
line-height: 1.3;
margin-bottom: 0.5rem;
}
.todo {
font-family: 'Source Sans 3', sans-serif;
font-size: 0.65rem;
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
color: #aaa;
vertical-align: middle;
margin-left: 0.6rem;
}
.article-summary {
font-size: 0.88rem;
color: #555;
line-height: 1.7;
margin-bottom: 1rem;
}
/* ARTICLE BODY — visible when expanded */
.article-body {
display: none;
font-size: 0.88rem;
color: #333;
line-height: 1.8;
border-left: 2px solid #111;
padding-left: 1.25rem;
margin-bottom: 1rem;
}
.article-body p {
margin-bottom: 0.75rem;
}
.article-body p:last-child {
margin-bottom: 0;
}
.article-body code {
font-family: 'Courier New', monospace;
font-size: 0.82rem;
background: #f5f5f5;
padding: 0.1rem 0.35rem;
border-radius: 2px;
color: #333;
}
.article-body pre {
background: #f5f5f5;
padding: 1rem 1.25rem;
border-radius: 3px;
overflow-x: auto;
margin: 0.75rem 0;
font-size: 0.8rem;
font-family: 'Courier New', monospace;
line-height: 1.6;
}
.article-body h3 {
font-family: 'Source Sans 3', sans-serif;
font-size: 0.78rem;
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
color: #111;
margin: 1.25rem 0 0.5rem;
padding-bottom: 0.2rem;
border-bottom: 1px solid #eee;
}
.article-body ul {
list-style: disc;
margin-left: 1.2rem;
display: flex;
flex-direction: column;
gap: 0.25rem;
margin-bottom: 0.75rem;
}
/* READ MORE / CLOSE toggle */
.toggle-btn {
background: none;
border: none;
cursor: pointer;
font-family: 'Source Sans 3', sans-serif;
font-size: 0.72rem;
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
color: #111;
padding: 0;
display: flex;
align-items: center;
gap: 0.4rem;
transition: opacity 0.15s;
}
.toggle-btn:hover {
opacity: 0.6;
}
.toggle-arrow {
display: inline-block;
transition: transform 0.2s;
font-size: 0.8rem;
}
.toggle-btn.open .toggle-arrow {
transform: rotate(90deg);
}
/* FOOTER */
.page-footer {
margin-top: 3rem;
padding-top: 0.65rem;
border-top: 0.5px solid #ccc;
display: flex;
justify-content: space-between;
font-size: 0.72rem;
color: #aaa;
}
@media (max-width: 560px) {
.page { padding: 3rem 1.5rem 4rem; }
.article-meta { flex-direction: column; align-items: flex-start; gap: 0.4rem; }
}
@media print {
.back { display: none; }
.article-body { display: block !important; }
.toggle-btn { display: none; }
}
+103
View File
@@ -0,0 +1,103 @@
*, *::before, *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
background: #fff;
font-family: 'Source Sans 3', Georgia, sans-serif;
color: #111;
font-size: 15px;
line-height: 1.6;
}
.page {
max-width: 780px;
margin: 0 auto;
padding: 3rem 2.5rem 5rem;
}
.back {
position: fixed;
top: 1.2rem;
left: 1.5rem;
font-family: 'Source Sans 3', sans-serif;
font-size: 0.72rem;
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
text-decoration: none;
color: #aaa;
transition: color 0.15s;
z-index: 101;
}
.back:hover {
color: #111;
}
.page-header {
margin-bottom: 1.5rem;
}
.page-header h1 {
font-family: 'EB Garamond', Georgia, serif;
font-size: 2rem;
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
color: #111;
margin-bottom: 0.3rem;
}
.page-header .subtitle {
font-family: 'EB Garamond', Georgia, serif;
font-size: 1rem;
font-style: italic;
color: #666;
}
hr.thick {
border: none;
border-top: 2px solid #111;
margin: 1rem 0 0;
}
.placeholder {
margin-top: 3rem;
padding: 2rem 0 2rem 1.5rem;
border-left: 2px solid #111;
}
.placeholder-status {
font-family: 'Source Sans 3', sans-serif;
font-size: 0.72rem;
font-weight: 600;
letter-spacing: 0.18em;
text-transform: uppercase;
color: #aaa;
margin-bottom: 0.75rem;
}
.placeholder-message {
font-family: 'EB Garamond', Georgia, serif;
font-size: 1.1rem;
font-style: italic;
color: #555;
line-height: 1.7;
}
.page-footer {
margin-top: 3rem;
padding-top: 0.65rem;
border-top: 0.5px solid #ccc;
display: flex;
justify-content: space-between;
font-size: 0.72rem;
color: #aaa;
}
@media (max-width: 560px) {
.page { padding: 3rem 1.5rem 4rem; }
}
+312
View File
@@ -0,0 +1,312 @@
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
background: #fff;
font-family: 'Source Sans 3', Georgia, sans-serif;
color: #111;
font-size: 15px;
line-height: 1.6;
}
.page {
max-width: 1100px;
margin: 0 auto;
padding: 3rem 3.5rem 4rem;
}
.cv-header {
margin-bottom: 1.2rem;
}
.cv-header h1 {
font-family: 'EB Garamond', Georgia, serif;
font-size: 2rem;
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
color: #111;
margin-bottom: 0.1rem;
}
.cv-header .subtitle {
font-family: 'EB Garamond', Georgia, serif;
font-size: 1rem;
font-style: italic;
color: #444;
margin-bottom: 0.45rem;
}
.cv-header .contact-line {
font-size: 0.82rem;
color: #444;
}
.cv-header .contact-line a {
color: #444;
text-decoration: none;
}
.cv-header .contact-line a:hover { text-decoration: underline; }
hr.thick {
border: none;
border-top: 2px solid #111;
margin: 1rem 0 0;
}
/* SECTION HEADING */
.section-heading {
font-family: 'Source Sans 3', sans-serif;
font-size: 0.82rem;
font-weight: 600;
letter-spacing: 0.06em;
text-transform: uppercase;
color: #111;
margin: 1.8rem 0 0;
padding-bottom: 0.2rem;
border-bottom: 1.5px solid #111;
}
/* PROFILE */
.profile-text {
margin-top: 0.85rem;
font-size: 0.9rem;
color: #222;
line-height: 1.7;
}
/* ENTRY ROW */
.entry {
display: grid;
grid-template-columns: 160px 1fr;
gap: 0 1.25rem;
margin-top: 0.85rem;
align-items: start;
}
.entry-date {
font-size: 0.82rem;
color: #555;
line-height: 1.5;
padding-top: 0.05rem;
}
.entry-org {
font-size: 0.88rem;
font-weight: 600;
color: #111;
line-height: 1.4;
}
.entry-title {
font-family: 'EB Garamond', Georgia, serif;
font-size: 0.98rem;
font-style: italic;
color: #111;
margin-top: 0.05rem;
line-height: 1.4;
}
.entry-title strong {
font-style: normal;
font-weight: 600;
}
.entry-detail {
font-size: 0.83rem;
color: #555;
margin-top: 0.1rem;
line-height: 1.5;
}
.entry-bullets {
list-style: disc;
margin-top: 0.3rem;
margin-left: 1rem;
display: flex;
flex-direction: column;
gap: 0.18rem;
}
.entry-bullets li {
font-size: 0.85rem;
color: #222;
line-height: 1.55;
}
/* BADGE */
.badge-current {
display: inline-block;
font-family: 'Source Sans 3', sans-serif;
font-size: 0.62rem;
font-weight: 600;
letter-spacing: 0.07em;
text-transform: uppercase;
background: #111;
color: #fff;
padding: 0.08rem 0.42rem;
vertical-align: middle;
margin-left: 0.45rem;
position: relative;
top: -1px;
}
/* SKILLS */
.skills-grid {
margin-top: 0.85rem;
display: flex;
flex-direction: column;
gap: 0.6rem;
}
.skill-row {
display: grid;
grid-template-columns: 160px 1fr;
gap: 0 1.25rem;
align-items: baseline;
font-size: 0.85rem;
}
.skill-cat {
font-weight: 600;
color: #111;
font-size: 0.82rem;
}
.skill-list { color: #333; }
.skill-list span::after { content: ' · '; color: #aaa; }
.skill-list span:last-child::after { content: ''; }
/* LANGUAGES */
.lang-rows {
margin-top: 0.85rem;
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.lang-row {
display: grid;
grid-template-columns: 160px 1fr;
gap: 0 1.25rem;
font-size: 0.85rem;
align-items: baseline;
}
.lang-name { font-weight: 600; color: #111; font-size: 0.82rem; }
.lang-level { color: #333; }
/* FOOTER */
.cv-footer {
margin-top: 3rem;
padding-top: 0.65rem;
border-top: 0.5px solid #ccc;
display: flex;
justify-content: space-between;
font-size: 0.72rem;
color: #aaa;
}
/* PHOTO HEADER */
.cv-header-inner {
display: flex;
align-items: center;
justify-content: flex-start;
gap: 2rem;
margin-bottom: 1.2rem;
}
.cv-photo {
width: 160px;
height: 160px;
object-fit: cover;
object-position: center 15%;
border: 1px solid #ddd;
flex-shrink: 0;
border-radius: 50%;
}
.cv-header-text { text-align: center; }
@media (max-width: 560px) {
.entry, .skill-row, .lang-row { grid-template-columns: 1fr; }
.entry-date { color: #888; font-size: 0.78rem; }
.cv-header-inner { flex-direction: column; gap: 1rem; }
.cv-header-text { text-align: center; }
}
/* LANG TOGGLE */
.lang-toggle {
position: fixed;
top: 1.2rem;
right: 1.5rem;
display: flex;
gap: 0;
border: 1px solid #bbb;
border-radius: 3px;
overflow: hidden;
font-family: 'Source Sans 3', sans-serif;
font-size: 0.72rem;
font-weight: 600;
z-index: 100;
background: #fff;
}
.lang-toggle button {
border: none;
background: transparent;
padding: 0.3rem 0.65rem;
cursor: pointer;
color: #888;
letter-spacing: 0.05em;
transition: background 0.15s, color 0.15s;
}
.lang-toggle button.active {
background: #111;
color: #fff;
}
.lang-toggle button:hover:not(.active) {
background: #f5f5f5;
color: #111;
}
@media print { .lang-toggle { display: none; } }
@media print {
.page { padding: 1.5rem 2rem; }
body { font-size: 13px; }
}
/* BACK HOME BUTTON */
.back-home {
position: fixed;
top: 1.2rem;
left: 1.5rem;
font-family: 'Source Sans 3', sans-serif;
font-size: 0.72rem;
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
text-decoration: none;
color: #aaa;
transition: color 0.15s;
z-index: 101;
}
.back-home:hover {
color: #111;
}
@media print {
.back-home { display: none; }
}
.school-link {
color: #111;
text-decoration: none;
border-bottom: 0.5px solid #bbb;
}
.school-link:hover {
border-bottom-color: #111;
}
+105
View File
@@ -0,0 +1,105 @@
*, *::before, *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
background: #fff;
font-family: 'Source Sans 3', Georgia, sans-serif;
color: #111;
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
.wrap {
max-width: 580px;
width: 100%;
padding: 3rem 2rem;
text-align: center;
}
.name {
font-family: 'EB Garamond', Georgia, serif;
font-size: clamp(2.8rem, 8vw, 4.5rem);
font-weight: 600;
letter-spacing: 0.06em;
text-transform: uppercase;
color: #111;
line-height: 1;
margin-bottom: 0.6rem;
}
hr.thick {
border: none;
border-top: 2px solid #111;
margin: 1rem auto;
width: 100%;
}
.role {
font-size: 0.72rem;
font-weight: 600;
letter-spacing: 0.2em;
text-transform: uppercase;
color: #888;
font-family: 'Source Sans 3', sans-serif;
margin-bottom: 3rem;
}
nav {
display: flex;
flex-direction: column;
gap: 0;
border-top: 1.5px solid #111;
border-bottom: 1.5px solid #111;
}
nav a {
display: grid;
grid-template-columns: 160px 1fr auto;
align-items: center;
text-decoration: none;
padding: 1rem 0.25rem;
border-bottom: 0.5px solid #ddd;
transition: background 0.15s;
}
nav a:last-child {
border-bottom: none;
}
nav a:hover {
background: #f9f8f6;
}
.nav-label {
font-family: 'Source Sans 3', sans-serif;
font-size: 0.8rem;
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
color: #111;
}
.nav-desc {
font-family: 'EB Garamond', Georgia, serif;
font-size: 0.95rem;
font-style: italic;
color: #888;
}
.nav-arrow {
font-size: 0.8rem;
color: #aaa;
}
.footer {
margin-top: 2.5rem;
font-size: 0.72rem;
color: #bbb;
font-family: 'Source Sans 3', sans-serif;
letter-spacing: 0.08em;
}
+11
View File
@@ -0,0 +1,11 @@
function toggleArticle(btn) {
const article = btn.closest('.article');
const body = article.querySelector('.article-body');
const isOpen = body.style.display === 'block';
body.style.display = isOpen ? 'none' : 'block';
btn.classList.toggle('open', !isOpen);
btn.innerHTML = isOpen
? 'Lire <span class="toggle-arrow"></span>'
: 'Fermer <span class="toggle-arrow"></span>';
}
+157
View File
@@ -0,0 +1,157 @@
const translations = {
subtitle: { fr: "Ingénieur Systèmes & Réseaux", en: "Systems & Network Engineer" },
contact: {
fr: "La Garenne Colombes, France &nbsp;·&nbsp; Permis B",
en: "La Garenne Colombes, France &nbsp;·&nbsp; French Driving License B"
},
s_profile: { fr: "Profil", en: "Profile" },
s_exp: { fr: "Expérience professionnelle", en: "Professional Experience" },
s_edu: { fr: "Formation", en: "Education" },
s_proj: { fr: "Projets", en: "Projects" },
s_skills: { fr: "Compétences & Technologies", en: "Skills & Technologies" },
s_lang: { fr: "Langues", en: "Languages" },
profile_text: {
fr: "Ingénieur systèmes et réseaux passionné par les technologies de l'information, avec une expérience confirmée en administration d'infrastructures critiques, supervision réseau et déploiement de solutions logicielles. Habitué à intervenir sur des environnements complexes, je m'attache à renforcer continuellement mes compétences techniques tout en apportant une vision opérationnelle fiable.",
en: "Systems and network engineer with a strong passion for information technologies, with proven experience in critical infrastructure administration, network monitoring, and software deployment. Experienced in complex environments, I continuously develop my technical expertise while delivering reliable operational insights."
},
badge: { fr: "En poste", en: "Current" },
// Exp 1
org1: { fr: "Groupe Vivendi Africa / Canal+ Télécoms Africa", en: "Groupe Vivendi Africa / Canal+ Télécoms Africa" },
title1: { fr: "Ingénieur Systèmes et Stockage", en: "Systems & Storage Engineer" },
b1_1: { fr: "Administration de l'ensemble de l'infrastructure systèmes en France et dans les filiales africaines", en: "Administration of the entire systems infrastructure in France and African subsidiaries" },
b1_2: { fr: "Gestion des serveurs physiques et machines virtuelles associées aux hyperviseurs", en: "Management of physical servers and virtual machines across hypervisors" },
b1_3: { fr: "Administration des systèmes Debian et FreeBSD ; gestion des solutions de stockage NetApp", en: "Administration of Debian and FreeBSD systems; management of NetApp storage solutions" },
b1_4: { fr: "Automatisation et déploiement de configurations via Ansible et Python", en: "Automation and configuration deployment via Ansible and Python" },
b1_5: { fr: "Supervision réseau SNMP, administration des firewalls PfSense et équipements Juniper", en: "SNMP network monitoring, PfSense firewall and Juniper equipment administration" },
b1_6: { fr: "Support IT et maintien en condition opérationnelle des environnements critiques", en: "IT support and operational maintenance of critical environments" },
// Exp 2
title2: { fr: "Ingénieur Intégrateur Logiciel", en: "Software Integration Engineer" },
b2_1: { fr: "Intégration et déploiement de solutions logicielles chez le client", en: "Integration and deployment of software solutions at client sites" },
b2_2: { fr: "Validation — gestion et traitement des Faits Techniques", en: "Validation — management and processing of Technical Facts" },
b2_3: { fr: "Vérification — constat technique accompagné du client", en: "Verification — technical assessment alongside the client" },
b2_4: { fr: "Qualification — non-régression de la solution via fiches de tests", en: "Qualification — non-regression testing via test sheets" },
// Exp 3
title3: { fr: "Apprenti Ingénieur Appui Réseau", en: "Network Support Engineer Apprentice" },
b3_1: { fr: "Support de niveau 2 et 3 sur les incidents réseaux", en: "Level 2 and 3 support on network incidents" },
b3_2: { fr: "Contribution à des projets techniques et de gestion", en: "Contribution to technical and management projects" },
b3_3: { fr: "Analyse, suivi et résolution des problématiques complexes", en: "Analysis, monitoring and resolution of complex issues" },
// Exp 4
title4: { fr: "Apprenti Technicien Informatique", en: "IT Technician Apprentice" },
b4_1: { fr: "Maintenance opérationnelle des infrastructures réseaux", en: "Operational maintenance of network infrastructures" },
b4_2: { fr: "Gestion des serveurs, postes de travail et terminaux", en: "Management of servers, workstations and terminals" },
b4_3: { fr: "Support de niveau 2 aux distributeurs Enedis et GRDF", en: "Level 2 support for Enedis and GRDF distributors" },
b4_4: { fr: "Suivi et mise à jour des outils associés à l'infrastructure", en: "Monitoring and updating infrastructure-related tools" },
// Education
edu1_title: { fr: "Ingénieur Réseaux & Sécurité", en: "Network & Security Engineer" },
edu1_detail: { fr: "Formation en alternance — Administration des systèmes, sécurité des réseaux, gestion de projets techniques", en: "Work-study program — Systems administration, network security, technical project management" },
edu2_detail: { fr: "Mobilité académique internationale — Espagne", en: "International academic exchange — Spain" },
edu2_title: { fr: "Erasmus Exchange Program", en: "Erasmus Exchange Program" },
edu3_title: { fr: "Licence Professionnelle — Administration & Sécurité des Systèmes et des Réseaux", en: "Professional Degree — Systems and Network Administration & Security" },
edu4_title: { fr: "DUT Réseaux & Télécommunications", en: "Technical Degree in Networks & Telecommunications" },
// Projects
proj1_title: { fr: "Intégration d'une solution de supervision dans un environnement complexe", en: "Integration of a Monitoring Solution in a Complex Environment" },
proj1_b1: { fr: "Mise en place d'un environnement sécurisé de supervision avec Zabbix et Grafana à des fins de qualification", en: "Setup of a secure monitoring environment using Zabbix and Grafana for qualification purposes" },
proj1_b2: { fr: "Intégration, configuration et support technique de la solution", en: "Integration, configuration, and technical support of the solution" },
proj2_title: { fr: "QualiPoste — Solution d'analyse de poste de travail", en: "QualiPoste — Workstation Analysis Solution" },
proj2_b1: { fr: "Qualification rapide des postes de travail pour optimiser le support au centre d'appels", en: "Rapid workstation qualification to optimize call center support" },
proj2_b2: { fr: "Encadrement d'une équipe de 3 alternants", en: "Management of a team of 3 apprentices" },
// Skills
cat1: { fr: "Systèmes", en: "Systems" },
cat2: { fr: "Réseaux", en: "Networks" },
cat3: { fr: "Stockage & Virtualisation", en: "Storage & Virtualization" },
cat4: { fr: "Supervision", en: "Monitoring" },
cat5: { fr: "Automatisation", en: "Automation" },
// Languages
lang1: { fr: "Français", en: "French" },
lvl1: { fr: "Langue maternelle", en: "Native language" },
lang2: { fr: "Anglais", en: "English" },
lvl2: { fr: "Niveau professionnel B2 — TOEIC 910 / 990", en: "Professional level B2 — TOEIC 910 / 990" },
// Footer
footer_updated: { fr: "Mis à jour — Mai 2026", en: "Last updated — May 2026" }
};
function setLang(lang) {
document.getElementById('btn-fr').classList.toggle('active', lang === 'fr');
document.getElementById('btn-en').classList.toggle('active', lang === 'en');
const t = (key) => {
if (!translations[key]) { console.error('Missing key:', key); return ''; }
return translations[key][lang] || '';
};
document.querySelector('.cv-header .subtitle').textContent = t('subtitle');
document.querySelector('.contact-first').innerHTML = t('contact');
document.querySelector('.badge-current').textContent = t('badge');
document.querySelectorAll('.section-heading')[0].textContent = t('s_profile');
document.querySelectorAll('.section-heading')[1].textContent = t('s_exp');
document.querySelectorAll('.section-heading')[2].textContent = t('s_edu');
document.querySelectorAll('.section-heading')[3].textContent = t('s_proj');
document.querySelectorAll('.section-heading')[4].innerHTML = t('s_skills');
document.querySelectorAll('.section-heading')[5].textContent = t('s_lang');
document.querySelector('.profile-text').textContent = t('profile_text');
// Exp entries
const orgs = document.querySelectorAll('.entry-org');
const titles = document.querySelectorAll('.entry-title');
const bullets = document.querySelectorAll('.entry-bullets');
titles[0].textContent = t('title1');
bullets[0].children[0].textContent = t('b1_1');
bullets[0].children[1].textContent = t('b1_2');
bullets[0].children[2].textContent = t('b1_3');
bullets[0].children[3].textContent = t('b1_4');
bullets[0].children[4].textContent = t('b1_5');
bullets[0].children[5].textContent = t('b1_6');
titles[1].textContent = t('title2');
bullets[1].children[0].textContent = t('b2_1');
bullets[1].children[1].textContent = t('b2_2');
bullets[1].children[2].textContent = t('b2_3');
bullets[1].children[3].textContent = t('b2_4');
titles[2].textContent = t('title3');
bullets[2].children[0].textContent = t('b3_1');
bullets[2].children[1].textContent = t('b3_2');
bullets[2].children[2].textContent = t('b3_3');
titles[3].textContent = t('title4');
bullets[3].children[0].textContent = t('b4_1');
bullets[3].children[1].textContent = t('b4_2');
bullets[3].children[2].textContent = t('b4_3');
bullets[3].children[3].textContent = t('b4_4');
// Education
titles[4].textContent = t('edu1_title');
document.querySelectorAll('.entry-detail')[0].textContent = t('edu1_detail');
titles[5].textContent = t('edu2_title');
document.querySelectorAll('.entry-detail')[1].textContent = t('edu2_detail');
titles[6].textContent = t('edu3_title');
titles[7].textContent = t('edu4_title');
// Projects
titles[8].querySelector('strong').textContent = t('proj1_title');
bullets[4].children[0].textContent = t('proj1_b1');
bullets[4].children[1].textContent = t('proj1_b2');
titles[9].querySelector('strong').textContent = t('proj2_title');
bullets[5].children[0].textContent = t('proj2_b1');
bullets[5].children[1].textContent = t('proj2_b2');
// Skills cats
const cats = document.querySelectorAll('.skill-cat');
cats[0].textContent = t('cat1');
cats[1].textContent = t('cat2');
cats[2].innerHTML = t('cat3');
cats[3].textContent = t('cat4');
cats[4].textContent = t('cat5');
// Languages
document.querySelectorAll('.lang-name')[0].textContent = t('lang1');
document.querySelectorAll('.lang-level')[0].textContent = t('lvl1');
document.querySelectorAll('.lang-name')[1].textContent = t('lang2');
document.querySelectorAll('.lang-level')[1].textContent = t('lvl2');
// Footer
document.querySelectorAll('.cv-footer span')[1].textContent = t('footer_updated');
}
+37
View File
@@ -0,0 +1,37 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Blog — Anthony Vinay</title>
<link href="https://fonts.googleapis.com/css2?family=EB+Garamond:ital,wght@0,400;0,600;1,400&family=Source+Sans+3:wght@400;600&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="/css/blog.css" />
</head>
<body>
<a class="back" href="/">← Accueil</a>
<div class="page">
<div class="page-header">
<h1>Blog</h1>
<p class="subtitle">Carnets de voyages &amp; activités personnelles</p>
</div>
<hr class="thick" />
<div class="placeholder">
<p class="placeholder-status">En construction</p>
<p class="placeholder-message">
Cette section accueillera prochainement mes carnets de voyages, expériences personnelles et autres réflexions.
</p>
</div>
<div class="page-footer">
<span>Anthony Vinay</span>
<span>avinay.ddns.net/blog</span>
</div>
</div>
</body>
</html>
Executable
+42
View File
@@ -0,0 +1,42 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Anthony Vinay</title>
<link href="https://fonts.googleapis.com/css2?family=EB+Garamond:ital,wght@0,400;0,600;1,400&family=Source+Sans+3:wght@400;600&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="/css/home.css" />
</head>
<body>
<div class="wrap">
<h1 class="name">Anthony Vinay</h1>
<hr class="thick" />
<p class="role">Ingénieur Systèmes &amp; Réseaux</p>
<nav>
<a href="/my-cv">
<span class="nav-label">Curriculum Vitae</span>
<span class="nav-desc">Parcours &amp; compétences</span>
<span class="nav-arrow"></span>
</a>
<!-- <a href="/achievements">
<span class="nav-label">Achievements</span>
<span class="nav-desc">Expérimentations techniques</span>
<span class="nav-arrow">→</span>
</a>
<a href="/blog">
<span class="nav-label">Blog</span>
<span class="nav-desc">Carnets de voyages &amp; activités</span>
<span class="nav-arrow">→</span>
</a> -->
<a href="/gitea">
<span class="nav-label">Projets</span>
<span class="nav-desc">Réalisations techniques</span>
<span class="nav-arrow"></span>
</a>
</nav>
<p class="footer">avinay.ddns.net</p>
</div>
</body>
</html>
+225
View File
@@ -0,0 +1,225 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Anthony Vinay — CV Académique</title>
<link href="https://fonts.googleapis.com/css2?family=EB+Garamond:ital,wght@0,400;0,600;1,400&family=Source+Sans+3:wght@400;600&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="/css/cv.css" />
</head>
<body>
<div class="lang-toggle">
<button id="btn-fr" class="active" onclick="setLang('fr')">FR</button>
<button id="btn-en" onclick="setLang('en')">EN</button>
</div>
<a class="back-home" href="/">← Accueil</a>
<div class="page">
<!-- HEADER -->
<div class="cv-header">
<div class="cv-header-text">
<h1>Anthony Vinay</h1>
<p class="subtitle">Ingénieur Systèmes &amp; Réseaux</p>
<p class="contact-line">
<span class="contact-first">La Garenne Colombes, France &nbsp;·&nbsp; Permis B</span><br/>
<a href="mailto:anthonyvinay@ikmail.com">anthonyvinay@ikmail.com</a>
&nbsp;·&nbsp;
<a href="https://linkedin.com/in/anthony-vinay" target="_blank">linkedin.com/in/anthony-vinay</a>
</p>
</div>
</div>
<hr class="thick" />
<!-- PROFIL -->
<div class="section-heading">Profil</div>
<p class="profile-text">
Ingénieur systèmes et réseaux passionné par les technologies de l'information, avec une expérience confirmée en administration d'infrastructures critiques, supervision réseau et déploiement de solutions logicielles. Habitué à intervenir sur des environnements complexes, je m'attache à renforcer continuellement mes compétences techniques tout en apportant une vision opérationnelle fiable.
</p>
<!-- EXPÉRIENCE -->
<div class="section-heading">Expérience professionnelle</div>
<div class="entry">
<div class="entry-date">Déc. 2025 — Présent</div>
<div class="entry-body">
<div class="entry-org">Groupe Vivendi Africa / Canal+ Télécoms Africa <span class="badge-current">En poste</span></div>
<div class="entry-title">Ingénieur Systèmes et Stockage</div>
<ul class="entry-bullets">
<li>Administration de l'ensemble de l'infrastructure systèmes en France et dans les filiales africaines</li>
<li>Gestion des serveurs physiques et machines virtuelles associées aux hyperviseurs Proxmox</li>
<li>Administration des systèmes Debian et FreeBSD ; gestion des solutions de stockage NetApp</li>
<li>Automatisation et déploiement de configurations via Ansible et Python</li>
<li>Supervision réseau, administration des firewalls PfSense et équipements Juniper</li>
<li>Support IT et maintien en condition opérationnelle des environnements critiques</li>
</ul>
</div>
</div>
<div class="entry">
<div class="entry-date">Sept. 2024 — Nov. 2025</div>
<div class="entry-body">
<div class="entry-org">SII / Thales Six GTS France</div>
<div class="entry-title">Ingénieur Intégrateur Logiciel</div>
<ul class="entry-bullets">
<li>Intégration et déploiement de solutions logicielles chez le client</li>
<li>Validation — gestion et traitement des Faits Techniques</li>
<li>Vérification — constat technique accompagné du client</li>
<li>Qualification — non-régression de la solution via fiches de tests</li>
</ul>
</div>
</div>
<div class="entry">
<div class="entry-date">Sept. 2021 — Sept. 2024</div>
<div class="entry-body">
<div class="entry-org">Enedis</div>
<div class="entry-title">Apprenti Ingénieur Appui Réseau</div>
<ul class="entry-bullets">
<li>Support de niveau 2 et 3 sur les incidents réseaux</li>
<li>Contribution à des projets techniques et de gestion</li>
<li>Analyse, suivi et résolution des problématiques complexes</li>
</ul>
</div>
</div>
<div class="entry">
<div class="entry-date">Sept. 2020 — Sept. 2021</div>
<div class="entry-body">
<div class="entry-org">Enedis / GRDF</div>
<div class="entry-title">Apprenti Technicien Informatique</div>
<ul class="entry-bullets">
<li>Maintenance opérationnelle des infrastructures réseaux</li>
<li>Gestion des serveurs, postes de travail et terminaux</li>
<li>Support de niveau 2 aux distributeurs Enedis et GRDF</li>
<li>Suivi et mise à jour des outils associés à l'infrastructure</li>
</ul>
</div>
</div>
<!-- FORMATION -->
<div class="section-heading">Formation</div>
<div class="entry">
<div class="entry-date">2021 — 2024</div>
<div class="entry-body">
<div class="entry-org"><a href="https://www.esiee-it.fr/fr" target="_blank" class="school-link">ESIEE-IT</a></div>
<div class="entry-title">Ingénieur Réseaux &amp; Sécurité</div>
<div class="entry-detail">Formation en alternance — Administration des systèmes, sécurité des réseaux, gestion de projets techniques</div>
</div>
</div>
<div class="entry">
<div class="entry-date">Sept. 2023 — Fév. 2024</div>
<div class="entry-body">
<div class="entry-org"><a href="https://www.upm.es/" target="_blank" class="school-link">Universidad Politécnica de Madrid</a></div>
<div class="entry-title">Erasmus Exchange Program</div>
<div class="entry-detail">Mobilité académique internationale — Espagne</div>
</div>
</div>
<div class="entry">
<div class="entry-date">2020 — 2021</div>
<div class="entry-body">
<div class="entry-org"><a href="https://iutv.univ-paris13.fr/" target="_blank" class="school-link">Université Sorbonne Paris Nord</a></div>
<div class="entry-title">Licence Professionnelle — Administration &amp; Sécurité des Systèmes et des Réseaux</div>
</div>
</div>
<div class="entry">
<div class="entry-date">2018 — 2020</div>
<div class="entry-body">
<div class="entry-org"><a href="https://iutv.univ-paris13.fr/" target="_blank" class="school-link">Université Sorbonne Paris Nord</a></div>
<div class="entry-title">DUT Réseaux &amp; Télécommunications</div>
</div>
</div>
<!-- PROJETS -->
<div class="section-heading">Projets</div>
<div class="entry">
<div class="entry-date">2023 — 2024</div>
<div class="entry-body">
<div class="entry-title"><strong>Intégration d'une solution de supervision dans un environnement complexe</strong></div>
<ul class="entry-bullets">
<li>Mise en place d'un environnement sécurisé de supervision avec Zabbix et Grafana à des fins de qualification</li>
<li>Intégration, configuration et support technique de la solution</li>
</ul>
</div>
</div>
<div class="entry">
<div class="entry-date">2022 — 2023</div>
<div class="entry-body">
<div class="entry-title"><strong>QualiPoste — Solution d'analyse de poste de travail</strong></div>
<ul class="entry-bullets">
<li>Qualification rapide des postes de travail pour optimiser le support au centre d'appels</li>
<li>Encadrement d'une équipe de 3 alternants</li>
</ul>
</div>
</div>
<!-- COMPÉTENCES -->
<div class="section-heading">Compétences &amp; Technologies</div>
<div class="skills-grid">
<div class="skill-row">
<div class="skill-cat">Systèmes</div>
<div class="skill-list">
<span>Debian</span><span>Red Hat</span><span>FreeBSD</span><span>Windows Server</span>
</div>
</div>
<div class="skill-row">
<div class="skill-cat">Réseaux</div>
<div class="skill-list">
<span>Cisco</span><span>Juniper</span><span>Aruba</span><span>Stormshield</span><span>PfSense</span>
</div>
</div>
<div class="skill-row">
<div class="skill-cat">Stockage &amp; Virtualisation</div>
<div class="skill-list">
<span>NetApp</span><span>VMware</span><span>VirtualBox</span><span>GNS3</span><span>Veeam Backup</span>
</div>
</div>
<div class="skill-row">
<div class="skill-cat">Supervision</div>
<div class="skill-list">
<span>Zabbix</span><span>Grafana</span><span>SolarWinds</span><span>WhatsUp Gold</span><span>Suite Elastic</span>
</div>
</div>
<div class="skill-row">
<div class="skill-cat">Automatisation</div>
<div class="skill-list">
<span>Ansible</span><span>Python</span><span>Bash</span><span>Perl</span><span>PowerShell</span>
</div>
</div>
</div>
<!-- LANGUES -->
<div class="section-heading">Langues</div>
<div class="lang-rows">
<div class="lang-row">
<div class="lang-name">Français</div>
<div class="lang-level">Langue maternelle</div>
</div>
<div class="lang-row">
<div class="lang-name">Anglais</div>
<div class="lang-level">Niveau professionnel B2 — TOEIC 910 / 990</div>
</div>
</div>
<!-- FOOTER -->
<div class="cv-footer">
<span>Anthony Vinay</span>
<span>Mis à jour — Mai 2026</span>
</div>
</div>
<script src="/js/cv.js" defer></script>
</body>
</html>
+103
View File
@@ -0,0 +1,103 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Projets — Anthony Vinay</title>
<link href="https://fonts.googleapis.com/css2?family=EB+Garamond:ital,wght@0,400;0,600;1,400&family=Source+Sans+3:wght@400;600&display=swap" rel="stylesheet" />
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
background: #fff;
font-family: 'Source Sans 3', Georgia, sans-serif;
color: #111;
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
.wrap {
max-width: 580px;
width: 100%;
padding: 3rem 2rem;
}
.back {
display: inline-flex;
align-items: center;
gap: 0.4rem;
font-size: 0.72rem;
font-weight: 600;
letter-spacing: 0.1em;
text-transform: uppercase;
text-decoration: none;
color: #aaa;
margin-bottom: 2.5rem;
transition: color 0.15s;
}
.back:hover { color: #111; }
h1 {
font-family: 'EB Garamond', Georgia, serif;
font-size: clamp(2rem, 6vw, 3rem);
font-weight: 600;
letter-spacing: 0.06em;
text-transform: uppercase;
color: #111;
line-height: 1;
margin-bottom: 0.5rem;
}
hr.thick {
border: none;
border-top: 2px solid #111;
margin: 0.75rem 0 1.25rem;
}
.status {
font-size: 0.72rem;
font-weight: 600;
letter-spacing: 0.18em;
text-transform: uppercase;
color: #aaa;
margin-bottom: 2rem;
}
.message {
font-family: 'EB Garamond', Georgia, serif;
font-size: 1.05rem;
font-style: italic;
color: #666;
line-height: 1.75;
border-left: 2px solid #111;
padding-left: 1.25rem;
}
.footer {
margin-top: 3rem;
font-size: 0.72rem;
color: #bbb;
letter-spacing: 0.08em;
}
</style>
</head>
<body>
<div class="wrap">
<a class="back" href="/">← Retour</a>
<h1>Projets</h1>
<hr class="thick" />
<p class="status">En construction</p>
<p class="message">
Cette section présentera mes réalisations techniques.<br>
Les projets seront disponibles sur Gitea prochainement.
</p>
<p class="footer">avinay.ddns.net</p>
</div>
</body>
</html>