From f1d4df5dcbfbb36cb4b3024a6dd4d9df59eb2bb0 Mon Sep 17 00:00:00 2001 From: Proxyfil Date: Sun, 22 Jun 2025 12:15:48 +0200 Subject: [PATCH 1/3] fix : Corrected title from french to english --- src/pages/blog/posts/create-deb-package.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/blog/posts/create-deb-package.md b/src/pages/blog/posts/create-deb-package.md index b1ddf5b..7615626 100644 --- a/src/pages/blog/posts/create-deb-package.md +++ b/src/pages/blog/posts/create-deb-package.md @@ -120,7 +120,7 @@ Congratulation, you have your signed package ! 👏 ## 🗄️ How to create a mirror and authentify it -### 🪞 Comment on créer le mirroir trivial +### 🪞 How to create a simple mirror --- From e9a9cd68ae952fae8d7fbe4ae95e5a528de61dea Mon Sep 17 00:00:00 2001 From: Proxyfil Date: Sun, 22 Jun 2025 18:28:29 +0200 Subject: [PATCH 2/3] feat: Added infos about real life mirrors --- src/pages/blog/posts/create-deb-package.md | 27 ++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/pages/blog/posts/create-deb-package.md b/src/pages/blog/posts/create-deb-package.md index 7615626..bef891d 100644 --- a/src/pages/blog/posts/create-deb-package.md +++ b/src/pages/blog/posts/create-deb-package.md @@ -172,6 +172,33 @@ gpg --default-key [key_id] --clearsign -o InRelease Release Congratulation you've created your package along with your mirror and secured it ! 👏 +### 🔍 How is it done in real life + +In many cases you will only create `InRelease` and `Release` files because it is more recent and it cost less for apt. +You can also create a `Release.gpg` file but it is the old way and it requires apt to do 2 requests to the server instead of one. + +Signing the package is not really used nowadays, it is more used to sign the Release file of the mirror. + +In example we can see down below how a mirror is often structured : + +```bash +dists/ +└── stable/ + ├── Release + ├── InRelease + └── main/ + ├── binary-amd64/ + │ └── Packages + ├── binary-i386/ + │ └── Packages + └── source/ + └── Sources +``` + +We can create multiple release for deferent programs and architectures, this is really useful when you want to distribute a lot of packages. +As we can see we only have one file `Release` and `InRelease` for the whole mirror, this is because we are not going to sign the packages but only the release file. +This is the most common way to create a mirror and distribute packages, it is also the way used by the official Debian and Ubuntu mirrors. + ## 💚 Conclusion Creating a package can be useful in so much situations, this is one of the way to do it and manage your system but you have plenty of other ways to do so. From 1358fb7fc77451fa2bf8cc94eff0841d8b3bdfd5 Mon Sep 17 00:00:00 2001 From: Proxyfil Date: Wed, 17 Sep 2025 20:39:59 +0200 Subject: [PATCH 3/3] feat(blog): Added blogpost about ZEvent2025 --- public/images/posts/retex-zevent2025.webp | Bin 0 -> 47070 bytes src/pages/blog/posts/retex-zevent2025.md | 123 ++++++++++++++++++++++ 2 files changed, 123 insertions(+) create mode 100644 public/images/posts/retex-zevent2025.webp create mode 100644 src/pages/blog/posts/retex-zevent2025.md diff --git a/public/images/posts/retex-zevent2025.webp b/public/images/posts/retex-zevent2025.webp new file mode 100644 index 0000000000000000000000000000000000000000..44a9aeb54dc34ea60ed527912b08ec8fbb6ed732 GIT binary patch literal 47070 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 literal 0 HcmV?d00001 diff --git a/src/pages/blog/posts/retex-zevent2025.md b/src/pages/blog/posts/retex-zevent2025.md new file mode 100644 index 0000000..1e5c2c9 --- /dev/null +++ b/src/pages/blog/posts/retex-zevent2025.md @@ -0,0 +1,123 @@ +--- +layout: /src/layouts/MarkdownPostLayout.astro +title: Counter-DDOS, Rust and learning by mistakes +author: Pierre-Louis Leclerc | Proxyfil +description: "For now 4 years in a row I've collected statistics around the charity event 'ZEvent'. And even if I'm used to it their is always many problems that I have to face when doing things at that scale ! Let's talk a bit about problems around charity events and poor technical choices." +image: + url: "/images/posts/retex-zevent2025.webp" + alt: "Illustration of ZEvent2025 with the title of the blog post" +pubDate: 2025-09-17 +tags: + [ + "Retex", "System", "Twitch", "Rust" + + ] +languages: ["vue", "kubernetes", "cloudflare"] +--- + +Since 2020, I do community work around ZEvent. This event is the biggest french charity event hosted on Twitch, with more than 16,000,000€ collected in 2025 it is the most important fund raising with streamers each year. + +Every year there is more people that tries to participate, more POV to follow, more donation goals to see and an average viewer can be rapidly overwhelmed by all those informations. +For 5 years now I work with a group of people to give viewers tools and metrics to better follow and understand this event in real time or after the event. + +Let's talk a bit about my work and what makes this year special ! + +## 📱 Usual work + + +### 📜 Donation goals list + +Since 2020 we work together with [the team](https://gdoc.fr/team) to give everyone one place with every donation goals. +Donation goals are objectives with amounts in euros, each streamer have his own ones for his donations raised. + +In 2021 it was 49 streamers that were together for ~54 hours, raising all together more than 10,000,000€ for the first time. +This year about 800 donation goals were created and 682 achieved, way more than an average viewer can follow. + + + + +### 📊 Statistics + +Since 2021 we create infographics and visuals with many data around ZEvent and twitch metrics. + +The data can be about time streamed, time viewed, number of emotes or messages sent. +Everything is collected through Twitch official API into postgresql, behind everything we have NodeJS and Python scripts to do all the work. +Every visual is planned before the event on Figma (it is wonderful). + +Here is an example of what we have designed for 2025 : + + + +Throughout the years we have increased our capabilities. Nowadays we can handle up to 350 channels at the same time with real time metrics generation. +The event ends on Monday at 1am every year, about 5 hours later we have all our visuals ready. + +For 2 years now we also generate infographics personnalized for every streamer, this year it is about ~350 visuals that have been generated automatically. +This year everything is available [here](https://stats.gdoc.fr/) + +### 🖼️ Place Atlas + +Since 2022 the ZEvent organization give 2 games available for the time of the event : ZEventPlaysPokémon and ZEventPlace. + +The first one is joined to channel's statistics but the second one is a pixel war for the time of the week-end : 1€ = 10 pixels to place. +This is really fun and it creates a new way for people to give for another reason than charity only. + +With this we have deployed a tool that collect images of the canvas every X minutes and displays the descriptions that the community submits. +This workflow is not perfect and we have changed things along the way but it works almost perfectly since 2022. + +You can see the atlas [here](https://atlas.gdoc.fr/) + +## ❓ What changed this year ? + +### 🤖 Capabilities and technologies enhancement + +Sometimes NodeJS and Python are not enough. +Because I haven't really upgraded scripts for 3 years now many of my stack is about NodeJS and Python with poor performances and a taste of scripts started on screens without orchestration or failover. + +That worked for 3 years, now it had to change. +With this goal I've started to containerize some of my stack for this ZEvent and started to rework my statistics collecting tools with rust and master/slave design. + +Back in the days 1 script was handling every channel, now we have a master node that store every channel and event informations. Slaves connect to master in order to collect data and send them through RabbitMQ to add a layer of buffer and load-balancing. + +In the end consummers get data from RabbitMQ and store data to MongoDB. + +**Why changing this ?** + +My old system had a lot of issues : +- Only one script for everything +- No way to balance the flow of requests +- No resilience +- Only one DB for everything + +Now we have small services with each his role. +If a service crashes he is replaced almost instantly by another one, making it resilient. + +And if a problem occurs with MongoDB or consummers it's not a big deal : the RabbitMQ will buffer messages and standby. +Big changes about DB improved the way objects are stored but also adaptability of the DB and performances by using great indexes. + +### 📦 Going from bare metal to K8S + +Old services were scripts, now I have containers with registry and helm deployment specifically for this. +It allows fast deploy and easy changes of node. + +On top of that no worries are crashes now : everything restarts alone. + +To make it safe this year 3 servers were deployed to handle applications and backups in order to keep all the data without failling. + +### 👀 Did it worked ? + +Yes it worked perfectly ! And even if this system was not the main one but more like a backup this year it is in good way to be the main system for 2026. +Tungstene will soon be part of the **Chronobreak** projects but we will talk a bit more about this later. + +## 📅 Next objectives + +It went well this year but a lot of things could be done about my work. + +For the next year I plan to upgrade the statistics collecting projects with new way to diplay data for every viewer. +I would like to uniformize our infrastructure and website with Maniarr to get every subpart of our tools connected together. + +The next plans are to developp a unique way to manage authorizations, continuing upgrading my scripts to general containers and behing more an Ops that a Dev. + +I have good hopes that next year every will be cleaner. +From statistics to atlas I will try to keep you in touch and work on it regularly. + +See you soon 🫡 \ No newline at end of file