Uncategorized

Saving Energy in Self-Hosting, Wake-on-LAN, and Rust

Saving Energy in Self-Hosting: My Journey with Wake-on-LAN and Rust

A story of how I reduced my energy consumption while self-hosting

I still remember the day I started exploring the world of self-hosting. It’s an addictive hobby, and you always find yourself thinking about which new services you could host. I have a pretty simple machine, an Intel i3 (4th gen) with an RTX 1650 4GB GPU, which isn’t too power-hungry.

Since my GPU was underused, I decided to install Ollama, a tool that allows running AI models locally. After testing Ollama, I quickly realized that 4GB wasn’t enough to run the latest models. This was the perfect excuse to upgrade my other machine, the one I use for gaming.

Upgrading my hardware

After a lot of research, I managed to get a good deal on an RX 7900 XTX. Now I have 24GB to run the latest models. But I was surprised by its power consumption, easily pulling around 45 watts in idle. This raised a red flag: keeping this machine on 24/7 would be far from energy-efficient.

I started thinking about how I could power on the machine only when I needed it. I’d need another device to manage it. A Raspberry Pi would be perfect, since I could leave it running 24/7 (its power draw is minimal), and it could turn the power-hungry machine on and off.

Discovering Wake-on-LAN

With that in mind, I started looking into ways to remotely turn my machine on. That’s when I discovered Wake-on-LAN, or simply WoL. After configuring my motherboard and operating system, I was able to power on my machine remotely with a simple command: wakeonlan <MAC_ADDRESS>

Because of how WoL works, it sends a “magic packet” over the local network, meaning you need to be on the same LAN to wake the machine. That’s fine, one less problem. Now I could turn the machine on remotely, which led to the next question: when do I need to power it on? The answer was simple: whenever I needed to access services running on it, like Ollama or any other self-hosted service.

Intercepting traffic

Most services use a specific port, such as 11434 for Ollama (where it opens a TCP connection). I thought of using a reverse proxy to intercept the traffic and, when necessary, wake the server. Once the server was online, the proxy could redirect the traffic to it. Perfect! Now we’d have the ability to wake the server remotely only when needed.

Here’s a sequence diagram that illustrates the process:


participant User as User
participant Proxy as Reverse Proxy (Wakezilla)
participant Server as Server (Ollama – port 11434)
User–>>Proxy: TCP Request (port 11434)
Proxy–>>Server: Check if online
alt Server OFF
Proxy–>>Server: Send Wake-on-LAN (power on server)
Server–>>Proxy: Server initialized
end
Proxy–>>Server: Redirect traffic
Server–>>Proxy: Response
Proxy–>>User: Return data

When to shut down the server?

Now that we can remotely power on the server, we also need to decide when to shut it down. I don’t want it running 24/7, so I thought, since we’re already intercepting traffic, why not monitor it? When no more requests come in, the server can be shut down. By adding a requests-per-minute threshold, if no requests are made, the server can be turned off.

Building Wakezilla

After some research, I didn’t find many tools that did exactly what I wanted, so I decided to build my own solution. Since the target machine would need some software anyway to receive the shutdown command, I kept it simple: a CLI that starts a small web server. When it receives an unauthenticated HTTP request (for now), it shuts down the machine. I also added a health check so the reverse proxy can verify whether the machine is online.

I built Wakezilla, a simple tool that does exactly this: it intercepts traffic, wakes the server with WoL when needed, and powers it down when there’s no more traffic. All of this in a straightforward way, written in Rust, packaged as a single binary with no external dependencies, making it easy to use anywhere.

Open-source project

The project is available on GitHub, and contributions are welcome, whether to add new features or improve documentation. If you’d like to try it out, just follow the instructions in the project’s README. If you have any questions, feel free to open an issue, and I’ll be happy to help.

Wakezilla is a simple yet effective solution for saving energy while self-hosting. By using Wake-on-LAN and a reverse proxy, you can power on your server only when needed, reducing energy consumption and saving money. Give it a try and see how it works for you!

Oszczędzanie energii w samo-hostingu: Moja przygoda z Wake-on-LAN i Rust

Historia tego, jak zmniejszyłem zużycie energii podczas samo-hostingu

Nadal pamietam dzień, w którym zacząłem eksplorować świat samo-hostingu. Jest to uzależniające hobby, i zawsze znajdujesz się w sytuacji, w której myślisz o tym, które nowe usługi możesz hostować. Mam dość prostą maszynę, Intel i3 (4 generacji) z kartą graficzną RTX 1650 4GB, która nie jest zbyt energochłonna.

Ponieważ moja karta graficzna była niewykorzystana, postanowiłem zainstalować Ollamę, narzędzie, które pozwala na uruchamianie modeli AI lokalnie. Po przetestowaniu Ollamy, szybko zorientowałem się, że 4GB nie jest wystarczające do uruchamiania najnowszych modeli. To był idealny pretekst do uaktualnienia mojej innej maszyny, tej, którą używam do gier.

Uaktualnienie sprzętu

Po długich poszukiwaniach, udało mi się kupić dobrą ofertę na kartę graficzną RX 7900 XTX. Teraz mam 24GB, aby uruchamiać najnowsze modele. Ale byłem zaskoczony jej zużyciem energii, łatwo przekraczającym 45 watów w trybie czuwania. To podniosło czerwoną flagę: pozostawienie tej maszyny włączonej 24/7 byłoby daleko od efektywności energetycznej.

Zacząłem myśleć o tym, jak mogę włączyć maszynę tylko wtedy, gdy jej potrzebuję. Potrzebuję innego urządzenia do zarządzania nią. Raspberry Pi byłby idealny, ponieważ mogę go pozostawić włączonego 24/7 (jego zużycie energii jest minimalne), i może włączyć lub wyłączyć maszynę.

Odkrycie Wake-on-LAN

Z tym na myśli, zacząłem szukać sposobów na zdalne włączenie mojej maszyny. To jest moment, w którym odkryłem Wake-on-LAN, czyli WoL. Po skonfigurowaniu mojej płyty głównej i systemu operacyjnego, byłem w stanie włączyć moją maszynę zdalnie za pomocą prostej komendy: wakeonlan <MAC_ADDRESS>

Ponieważ WoL działa w ten sposób, wysyła „magiczny pakiet” po sieci lokalnej, co oznacza, że musisz być na tej samej sieci LAN, aby włączyć maszynę. To jest OK, mniej problemów. Teraz mogłem włączyć maszynę zdalnie, co prowadzi do następnego pytania: kiedy powinienem ją włączyć? Odpowiedź była prosta: wszędzie tam, gdzie potrzebuję dostępu do usług uruchomionych na niej, takich jak Ollama lub inne usługi samo-hostowane.

Przechwytywanie ruchu

Większość usług używa specyficznego portu, takiego jak 11434 dla Ollamy (gdzie otwiera połączenie TCP). Pomyślałem o użyciu odwrotnego serwera proxy, aby przechwycić ruch i, w razie potrzeby, włączyć serwer. Gdy serwer jest już włączony, serwer proxy może przekierować ruch do niego. Idealnie! Teraz mielibyśmy możliwość włączenia serwera zdalnie tylko wtedy, gdy jest to potrzebne.

Oto diagram sekwencji, który ilustruje ten proces:


participant User as Użytkownik
participant Proxy as Odwrotny serwer proxy (Wakezilla)
participant Server as Serwer (Ollama – port 11434)
User–>>Proxy: Żądanie TCP (port 11434)
Proxy–>>Server: Sprawdź, czy serwer jest włączony
alt Serwer wyłączony
Proxy–>>Server: Wysłanie Wake-on-LAN (włączenie serwera)
Server–>>Proxy: Serwer zainicjowany
end
Proxy–>>Server: Przekierowanie ruchu
Server–>>Proxy: Odpowiedź
Proxy–>>User: Zwrócenie danych

Kiedy wyłączyć serwer?

Teraz, gdy możemy zdalnie włączyć serwer, również musimy zdecydować, kiedy go wyłączyć. Nie chcę, aby był włączony 24/7, więc pomyślałem, że skoro już przechwytujemy ruch, to możemy go monitorować. Gdy nie ma już żadnych żądań, serwer może być wyłączony. Dodając próg żądań na minutę, jeśli nie ma żadnych żądań, serwer może być wyłączony.

Budowanie Wakezilla

Po przeprowadzeniu badań, nie znalazłem zbyt wielu narzędzi, które robili dokładnie to, czego chciałem, więc postanowiłem zbudować własne rozwiązanie. Ponieważ docelowa maszyna potrzebowałaby i tak oprogramowania do otrzymania polecenia wyłączenia, trzymałem to prosto: CLI, który uruchamia mały serwer internetowy. Gdy otrzyma nieuwierzytelnione żądanie HTTP (na razie), wyłącza maszynę. Dodatkowo dodałem sprawdzenie stanu, aby serwer proxy mógł zweryfikować, czy maszyna jest włączona.

Zbudowałem Wakezilla, proste narzędzie, które robi dokładnie to: przechwytuje ruch, włącza serwer za pomocą WoL, gdy jest to potrzebne, i wyłącza go, gdy nie ma już ruchu. Wszystko to w prosty sposób, napisane w Rust, zapakowane jako pojedynczy plik wykonywalny bez zewnętrznych zależności, co sprawia, że jest łatwe w użyciu gdziekolwiek.

Projekt open-source

Projekt jest dostępny na GitHub, i zachęcam do współpracy, niezależnie od tego, czy chcesz dodać nowe funkcje, czy poprawić dokumentację. Jeśli chcesz spróbować, wystarczy postępować zgodnie z instrukcjami w pliku README. Jeśli masz jakieś pytania, nie wahaj się otworzyć issue, i będę szczęśliwy, aby pomóc.

Wakezilla to proste, ale skuteczne rozwiązanie dla oszczędności energii podczas samo-hostingu. Używając Wake-on-LAN i serwera proxy, możesz włączyć serwer tylko wtedy, gdy jest to potrzebne, zmniejszając zużycie energii i oszczędzając pieniądze. Spróbuj i zobacz, jak to działa dla Ciebie!

Leave a Reply

Your email address will not be published. Required fields are marked *

WordPress Appliance - Powered by TurnKey Linux