
# valheim-proxmox
**Serwer dedykowany Valheima we własnym LXC, z panelem WWW do zarządzania nim.**
**Gracze dostają launcher na Windows, macOS i Linuksa — z modami serwera działającymi na wszystkich trzech.**
[English →](README.md) · **[Aktualizacja ze starszej wersji](#masz-już-serwer-zaktualizuj-raz--dalej-aktualizuje-się-sam)** · [Zrzuty ekranu](#jak-to-wygląda) · [Panel](#panel) · [Mody](#mody-z-kodu-udostępniania)
[](https://buymeacoffee.com/cygan)
---
## Masz już serwer? Zaktualizuj raz — dalej aktualizuje się sam
> [!IMPORTANT]
> **Od v1.20.0 panel aktualizuje się sam.** Gdy wyjdzie nowa wersja, pokazuje baner i instaluje
> ją sam, gdy nikt nie gra — najpierw backup świata, a jeśli nowa wersja nie wstanie, wraca
> poprzednia. Można to wyłączyć w Ustawieniach.
>
> **Instalacja sprzed v1.20.0?** Zaktualizuj raz, potem już automatycznie. Świat, ustawienia,
> loginy i mody zostają; gra działa dalej.
**Instalacja z 7 września 2026 lub nowsza** — w Ustawieniach panelu jest przycisk
**Aktualizuj panel**. Kliknij go raz.
**Starsza instalacja albo brak przycisku** — uruchom raz **na hoście Proxmox** (w miejsce `CTID`
numer kontenera, pokaże go `pct list`):
```bash
pct exec CTID -- bash -c "curl -fsSL https://raw.githubusercontent.com/PawelSzymanski89/valheim-proxmox/main/panel/panel-update.sh | bash"
```
Instalacja przez `setup.sh` prosto na Debianie — uruchom tam, jako root:
```bash
curl -fsSL https://raw.githubusercontent.com/PawelSzymanski89/valheim-proxmox/main/panel/panel-update.sh | bash
```
**Docker** — tam aktualizacją jest obraz. W katalogu `docker/` swojego klona:
`git fetch --tags && git checkout vX.Y.Z && docker compose up -d --build` — baner w panelu podaje
dokładne polecenie dla najnowszego wydania. Tag wydania, nie `main`: tagów nie da się na GitHubie
przesunąć ani usunąć, więc budujesz sprawdzone, podpisane wydanie, a nie to, co akurat jest na `main`.
Na końcu pojawi się `updated to v… - world and settings untouched`. Szczegóły: [Aktualizacje](#aktualizacje).
## Instalacja
Trzy drogi, zależnie od tego, na czym instalujesz. Wszystkie kończą się tym samym:
serwerem gry, panelem, timerami backupu i aktualizacji.
### Na hoście Proxmox VE — sam tworzy kontener
Uruchom jako root **na hoście Proxmoxa**. Buduje nieuprzywilejowany kontener LXC z
Debianem, instaluje w nim wszystko i wypisuje adres, login oraz hasło do gry.
```bash
bash -c "$(curl -fsSL https://raw.githubusercontent.com/PawelSzymanski89/valheim-proxmox/main/install.sh)"
```
Kontener dostaje własne reguły firewalla Proxmoxa: porty gry (UDP) otwarte dla wszystkich,
panel tylko z sieci prywatnych (LAN i zakresy CGNAT, np. Tailscale), cała reszta blokowana —
także port RCON narzędzi admina, który słucha na każdym interfejsie i nie ma opcji, żeby to
zmienić. Reguły działają tylko przy włączonym firewallu Proxmoxa na poziomie Datacenter;
instalator powie, jeśli jest wyłączony. `--no-firewall` je pomija.
```bash
# na hoście Proxmox, dla istniejącego kontenera (CTID = jego numer; porty jak przy instalacji)
cat > /etc/pve/firewall/CTID.fw <<'FW'
[OPTIONS]
enable: 1
policy_in: DROP
dhcp: 1
ndp: 1
[RULES]
IN ACCEPT -p udp -dport 2456:2458 -log nolog
IN ACCEPT -p tcp -dport 2460 -source 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,100.64.0.0/10 -log nolog
IN Ping(ACCEPT) -log nolog
FW
pct set CTID --net0 "$(pct config CTID | sed -n 's/^net0: //p'),firewall=1"
```
Domyślnie: 4 rdzenie, 6 GB RAM, 30 GB dysku, DHCP. Każdą wartość zmienisz flagą —
`--ram 12288 --disk 40 --ip 192.168.1.50/24 --gw 192.168.1.1`, a `--help` wypisze resztę.
### Na dowolnym Debianie 12/13 — instaluje w systemie, na którym stoisz
Bez Proxmoxa, bez kontenera: VPS, wolny komputer, LXC, który już masz. Uruchom jako
root **wewnątrz tego systemu**.
```bash
curl -fsSL https://raw.githubusercontent.com/PawelSzymanski89/valheim-proxmox/main/setup.sh -o setup.sh && bash setup.sh
```
Te same zmienne środowiskowe co flagi wyżej (`RAM=` i `DISK=` tu nie mają zastosowania —
maszyna jest tym, czym już jest).
### Docker — na dowolnym Linuksie, który już ma Dockera
Jeden kontener z systemd w środku, więc panel działa dokładnie jak na pozostałych dwóch
drogach. Gra pobiera się ze Steama przy pierwszym starcie; porty, nazwy i hasła pochodzą
z `.env` i są czytane raz — potem rządzi nimi panel.
```bash
git clone https://github.com/PawelSzymanski89/valheim-proxmox && cd valheim-proxmox/docker
cp .env.example .env # opcjonalnie
docker compose up -d --build
```
Sieć hosta: `GAME_PORT` (udp, plus kolejny) i `PANEL_PORT` (tcp) to porty w środku i na
zewnątrz, bez mapowania. Szczegóły, goła forma `docker run` i czego to wymaga
(`privileged`) są w [docker/README.md](docker/README.md). Nie dla Docker Desktop na
macOS/Windows.
Tak czy inaczej trwa to kilka minut, większość to ~1,5 GB pobierane ze Steama. Potem
panel stoi pod **http://ADRES:2460**, login `admin` i hasło wypisane przez instalator na końcu —
wylosowane dla tej instalacji.
---
## Strona publiczna
Adres logowania to jedyna strona, którą obcy w ogóle zobaczą, więc jest zarazem **stroną
statusu**: czy serwer działa, od kiedy, ilu gra i jak wejść — a obok formularz logowania.
Jest **celowo minimalna**. Każde pole jest wyłączone, dopóki go nie włączysz w
**Ustawieniach → Strona publiczna**, bo to widzi cały internet: numer wersji zawęża listę rzeczy
do wypróbowania przeciw serwerowi, a lista modów i wykres obciążenia mówią obcemu, co tam chodzi
i kiedy nikt nie patrzy. Do włączenia: liczba graczy, ich nicki, parametry maszyny z odczytem CPU i pamięci na żywo, lista modów z kodem udostępniania
(wygodne — gracz ma wszystko, zanim zapyta), wykresy obciążenia, wersja serwera, port i to, czy
potrzebne jest hasło. Plus własne zdanie, np. o której serwer się restartuje.
**Hasło do gry nie pojawia się przy żadnym ustawieniu.** Ani nic innego, co panel wie: dysk, logi,
testy i ustawienia siedzą za logowaniem, a `/api/public` to jedyna trasa odpowiadająca bez niego.
Przy dużym zestawie strona układa się inaczej: status i logowanie dzielą górny rząd, lista modów
zajmuje całą szerokość jako siatka kafelków z wyszukiwarką, a wykresy idą pod spód. Siedemdziesiąt
dwa mody w wąskiej kolumnie obok pustego miejsca to była pierwsza wersja i tak właśnie wyglądała.

## Jak to wygląda
Panel ma własną mroczną nordycką skórę — kamień, sadza i przygaszone złoto — na ekranie
logowania i w środku. Interfejs po polsku albo angielsku, przełącznik w prawym górnym rogu.
| | |
|---|---|
|  |  |
| **Mody** — wklejasz kod i wybierasz, co zainstalować | **Konfiguracja** — formularz z metadanych samego pliku |

**Podsumowanie** — adresy do wklejenia z przyciskiem kopiowania, żywe obciążenie kontenera
i testy, które mówią wprost, czego dowodzą. Adresy i sekrety na tych zrzutach maskuje sam
panel: otwierasz go z `?demo=1` i każde IP, hasło, kod dołączenia i kod profilu zamienia się
na wartość przykładową — zrzut nigdy nie wynosi sieci, w której powstał.

**Ustawienia** — nazwa serwera, świat, porty, widoczność, crossplay, preset i modyfikatory
świata oraz logowanie do panelu.
## Co dostajesz
| | |
|---|---|
| **Serwer gry** | Valheim dedicated, systemd z czystym stopem (`SIGINT`, więc świat się zapisuje) |
| **Panel** | WWW na porcie **2460**, autoryzacja HTTP Basic, hasło losowane przy instalacji |
| **Backupy** | kopia świata co 2 h, trzyma 30 (oba do ustawienia w panelu), przywracanie jednym klikiem |
| **Aktualizacje** | sprawdza Steama co 2 h i restartuje **tylko** gdy jest nowy build |
| **Domyślnie** | 4 rdzenie, 6 GB RAM, 30 GB dysku, kontener wstaje z hostem |
## Panel
| Zakładka | Co daje |
|---|---|
| **Summary** | adresy do wklejenia — z LAN-u i z internetu (z kopiowaniem), żywe obciążenie / RAM / dysk kontenera oraz testy łączności, które mówią wprost, czego dowodzą, a czego nie |
| **Players** | kto gra teraz — nick, identyfikator, **licznik czasu sesji na żywo** — oraz trwała historia logowań (pierwszy raz / ostatnio / ile wejść) |
| **Access & bans** | lista adminów, lista banów, whitelista; ban prosto z listy online albo z historii. **Niepusta whitelista wpuszcza wyłącznie wpisanych** — to reguła samego Valheima, nie panelu |
| **World** | lista światów, przełączanie aktywnego, pobieranie, kasowanie, wgrywanie świata — folderu świata z Valheima 1.0 albo starej pary `.db` + `.fwl`, którą serwer przekonwertuje |
| **Backups** | przywróć, pobierz, usuń; kopie na inną maszynę po SSH; przełączniki timerów auto-backup i auto-update |
| **Settings** | nazwa serwera, świat, hasło, **port gry**, **port panelu**, widoczność na liście serwerów, crossplay, preset i modyfikatory świata (walka, kara za śmierć, surowce, najazdy, portale) oraz przełączniki (`nobuildcost`, `playerevents`, `passivemobs`, `nomap`) |
| **Mods** | wklejasz **kod udostępniania** z Thunderstore Mod Managera / r2modman: panel go rozwija, pokazuje zawartość i instaluje zaznaczone paczki (BepInEx w komplecie, świat najpierw do kopii). Umie też pojedyncze paczki po nazwie |
| **Log** | zdarzenia serwera, bez szumu keepalive od PlayFaba |
Plus Start / Stop / Restart / Backup teraz / Sprawdź update.
### Logowanie do panelu i odzyskiwanie dostępu
Logujesz się na własnym ekranie panelu, nie w szarym okienku przeglądarki: ciasteczko sesji
podpisane sekretem **i** skrótem aktualnego hasła, więc zmiana hasła kończy wszystkie sesje.
HTTP Basic dalej działa — dla `curl`a i skryptów.
Pierwsze hasło jest losowane dla każdej instalacji i wypisywane na jej końcu (w Dockerze:
`docker compose logs | grep "panel login"`). Do v1.20.1 wszędzie było to `valheim123`;
instalacja, która wciąż je ma, pokazuje czerwony baner, dopóki nie zmienisz go w
**Ustawieniach → Logowanie do panelu** (panel zapyta najpierw o obecne hasło).
Wpisałeś `valheim123` i panel mówi, że zostało wyłączone? Każda instalacja do v1.21.0 startowała
z tym hasłem, a aktualizacja go nie ruszała — więc od v1.22.0 panel przy pierwszym starcie zamienia
je na losowe. Własne ustawiasz tak samo jak po zablokowaniu:
Zablokowałeś się? Nie ma żadnej procedury resetu — ustawiasz nowe hasło z hosta Proxmoxa:
```bash
pct exec