Indeks dziennikaDockup / notatka terenowa
Note / self-host-code-server

Jak samodzielnie hostować code-server w 2026 roku: WebSockets, workspace’y i kontrola dostępu

Samodzielnie hostuj code-server z poprawnie skonfigurowanymi portami, trwałym storage’em, HTTPS, sekretami, backupami i kontrolą aktualizacji. Dowiedz się, jak naprawić sytuację, w której proxy blokuje WebSockets.

Nieudane wdrożenie code-server nie zawsze kończy się awarią. Aplikacja może wyświetlać stronę logowania, podczas gdy proxy blokuje WebSockets albo właściciel plików uniemożliwia instalowanie rozszerzeń. Zamiast tego zacznij od testu end-to-end: zaloguj się, otwórz zamontowane repozytorium, utwórz plik, uruchom polecenie w terminalu, zainstaluj rozszerzenie i ponownie nawiąż połączenie WebSocket edytora.

Taki test odpowiada katalogowemu przeznaczeniu code-server: uruchamianiu VS Code w przeglądarce na zdalnej maszynie. Wcześniej niż test dostępności ujawnia też brakujące zależności, błędne założenia dotyczące proxy oraz efemeryczne dane.

Od czego zależy code-server

Wyznacz trzy granice wokół code-server: ingress do portu 8080, trwały stan oraz wymagania pomocnicze. Kontener można zastąpić, ale pozostałe dwa elementy wymagają jednoznacznego przypisania odpowiedzialności. Lokalne wymaganie środowiska uruchomieniowego to mount workspace’a zawierający wyłącznie projekty, do których edytor powinien mieć dostęp. Przetestuj tę granicę przed udostępnieniem usługi i ponownie po wymianie kontenera.

Diagram jest kompletny, gdy czysty klient może się zalogować, otworzyć zamontowane repozytorium, utworzyć plik, uruchomić polecenie w terminalu, zainstalować rozszerzenie i ponownie nawiązać połączenie WebSocket edytora. Zbieraj dane o czasie i zasobach — pamięci oraz CPU używanych przez language servers, buildy, extension hosts i terminale — zamiast danych dotyczących web shellu code-server. Jeśli transakcja się nie powiedzie, pierwsza granica, która nie działa zgodnie z dokumentacją, wskazuje, czy należy zbadać routing, lokalną wydajność czy usługę pomocniczą.

Zamień lokalne polecenie w usługę, którą można kontrolować

Uruchomienie zbliżone do produkcyjnego jest celowo proste: nazwany stan, jawny port i brak sekretu w obrazie.

docker run -d \
  --name code-server \
  --restart unless-stopped \
  -p 127.0.0.1:8080:8080 \
  -v code-server-data:/home/coder \
  -e PASSWORD=replace-with-a-long-random-value \
  codercom/code-server:latest \
  --bind-addr 0.0.0.0:8080 --auth password .

Ten przykład stanowi punkt wyjścia, a nie kompletny stack pomocniczy. Przed udostępnieniem usługi potwierdź lokalne wymaganie: mount workspace’a zawierający wyłącznie projekty, do których edytor powinien mieć dostęp. Sprawdź rzeczywiste mounty i listener, a następnie spróbuj się zalogować, otworzyć zamontowane repozytorium, utworzyć plik, uruchomić polecenie w terminalu, zainstalować rozszerzenie i ponownie nawiązać połączenie WebSocket edytora. Przypnij działający obraz przed kolejnym restartem.

Ujednoznacznij publiczny origin

Umieść edytor za HTTPS i zachowaj obsługę upgrade’ów WebSocket. Kieruj wybraną nazwę hosta do portu kontenera 8080, przekazuj oryginalny host i schemat HTTPS oraz unikaj publikowania drugiego, bezpośredniego originu.

Przetestuj code-server z czystego klienta zewnętrznego. Oddziel awarię ingressu od znanej granicy aplikacji — proxy blokuje WebSockets albo właściciel plików uniemożliwia instalowanie rozszerzeń. Błąd certyfikatu, DNS lub 502 należy do routingu; żądanie, które dociera do code-server i dopiero później kończy się niepowodzeniem, dotyczy stanu aplikacji, wydajności lub jej wymagania pomocniczego. Przewodnik po TLS dla własnej domeny obejmuje pierwszą grupę problemów.

Twórz backupy stanu, którego code-server nie odtworzy

Obraz kontenera można pobrać ponownie, ale konfiguracji, rozszerzeń i jawnie zamontowanych katalogów projektów nie da się odtworzyć w ten sam sposób. Zamontuj /home/coder przed bootstrapem, zapisz nieszkodliwe przykładowe dane i zastąp kontener, aby sprawdzić, czy ta ścieżka rzeczywiście jest trwała. Sprawdź rzeczywisty mount zamiast ufać nazwie pliku Compose i upewnij się, że użytkownik środowiska uruchomieniowego może zapisywać w miejscu, którego oczekuje code-server.

Ustal retencję i lokalizację poza hostem, a następnie przećwicz odtwarzanie bez dotykania produkcji. Test przechodzi tylko wtedy, gdy ustawienia, rozszerzenia i pliki workspace’a wracają z poprawnym właścicielem, a terminal uruchamia się z użyciem docelowego użytkownika. W przypadku stanu opartego na bazie danych połącz snapshoty storage’u z eksportami spójnymi na poziomie aplikacji, zgodnie z opisem w artykule Odtwarzanie do punktu w czasie a snapshoty.

Zabezpiecz code-server po bootstrapie

W przypadku code-server najcenniejszy obszar nie musi być stroną startową. Najczęstszym błędem jest beztroskie przyznanie kontenerowi dostępu do socketu Dockera lub całego systemu plików hosta. Przeciwdziałaj temu świadomie: montuj wyłącznie przeznaczone do tego workspace’y, unikaj socketu Dockera hosta i umieść edytor za HTTPS oraz silnym uwierzytelnianiem.

Natychmiast zastąp przykładowe PASSWORD, przechowuj je poza obrazem i zmieniaj jak poświadczenie administratora, jeśli dojdzie do jego ujawnienia. Używaj nieuprzywilejowanego użytkownika kontenera, gdy obraz to umożliwia, i nie montuj niepowiązanych poświadczeń. Stosuj limity liczby żądań lub rozmiaru na ingressie, ponieważ niezaufana praca może zużywać pamięć i CPU używane przez language servers, buildy, extension hosts i terminale, a nie przez web shell code-server.

Diagnozuj code-server, który wygląda na zdrowy

Monitoruj pracę wykonywaną przez code-server: pamięć i CPU używane przez language servers, buildy, extension hosts i terminale, a nie przez web shell code-server. Ustaw limity z zapasem na tę pracę i unikaj liveness probe, która z nią konkuruje. Kontrola operatorska powinna jednak cyklicznie próbować się zalogować, otworzyć zamontowane repozytorium, utworzyć plik, uruchomić polecenie w terminalu, zainstalować rozszerzenie i ponownie nawiązać połączenie WebSocket edytora.

W przypadku aktualizacji pamiętaj, że kompatybilność rozszerzeń i toolchainy obrazu bazowego mogą się zmienić, nawet jeśli interfejs code-server nadal się uruchamia. Wdróż kandydata na odtworzonej kopii i powtórz znany test. Jeśli proxy blokuje WebSockets albo właściciel plików uniemożliwia instalowanie rozszerzeń, użyj logów środowiska uruchomieniowego i rzeczywistego żądania sieciowego, aby ustalić, które założenie uległo zmianie.

Zbierz dowody przed uruchomieniem code-server

Utwórz mały, jednorazowy fixture code-server i zachowuj go dla każdej wersji. Fixture powinien odwzorowywać rzeczywisty workflow: zaloguj się, otwórz zamontowane repozytorium, utwórz plik, uruchom polecenie w terminalu, zainstaluj rozszerzenie i ponownie nawiąż połączenie WebSocket edytora. Zapisz digest obrazu, zewnętrzną nazwę hosta, adres zależności i oczekiwany rezultat, aby kolejny operator mógł powtórzyć test bez interpretowania tego przewodnika.

Uruchom fixture trzy razy. Najpierw użyj świeżego wdrożenia. Następnie zastąp kontener bez zmieniania trwałego stanu. Na końcu odtwórz backup w pustym środowisku. Trzeci przebieg przechodzi tylko wtedy, gdy ustawienia, rozszerzenia i pliki workspace’a wracają z poprawnym właścicielem, a terminal uruchamia się z użyciem docelowego użytkownika. Podczas każdego przebiegu rejestruj opóźnienia i zużycie zasobów wokół pamięci i CPU używanych przez language servers, buildy, extension hosts i terminale, a nie przez web shell code-server; stanie się to bazą dla alertów zamiast arbitralnego procentowego limitu CPU.

Na koniec celowo przetestuj ścieżkę negatywną: prześlij nieszkodliwe dane w pobliżu limitu zasobów lub formatu związanego z tą granicą: proxy blokuje WebSockets albo właściciel plików uniemożliwia instalowanie rozszerzeń. Potwierdź, że code-server kończy działanie w widoczny sposób bez uszkodzenia stanu, przywróć prawidłowy warunek i powtórz udaną transakcję. Rekord wydania zawierający te cztery rezultaty stanowi mocniejszy dowód niż zrzuty ekranu dashboardu lub jednorazowa odpowiedź curl.

Przenieś powtarzalne zadania infrastrukturalne do Dockup

Dockup może zarządzać wymiennymi elementami platformy: kierować ruch na port 8080, wystawiać domenę i certyfikat, wstrzykiwać sekrety, podłączać trwały storage oraz łączyć code-server z usługami zarządzanymi lub prywatnie podłączonymi. Może to robić na infrastrukturze Dockup albo na dołączonym przez Ciebie serwerze.

Akceptacja code-server nadal wymaga jawnego wykonania. Po wdrożeniu jednym kliknięciem umieść edytor za HTTPS i zachowaj obsługę upgrade’ów WebSocket, potwierdź lokalne wymaganie — mount workspace’a zawierający wyłącznie projekty, do których edytor powinien mieć dostęp — i uruchom ten scenariusz: zaloguj się, otwórz zamontowane repozytorium, utwórz plik, uruchom polecenie w terminalu, zainstaluj rozszerzenie i ponownie nawiąż połączenie WebSocket edytora. Ten podział jest celowy: Dockup usuwa powtarzalną konfigurację infrastruktury, nie udając, że role aplikacji, poświadczenia dostawcy lub polityka odtwarzania wybierają się same.

Najczęściej zadawane pytania

Czego code-server potrzebuje w środowisku produkcyjnym?

Kieruj kontener code-server na porcie 8080 przez jeden origin HTTPS. Lokalne wymaganie środowiska uruchomieniowego to mount workspace’a zawierający wyłącznie projekty, do których edytor powinien mieć dostęp. Nie uznawaj code-server za gotowy, dopóki nie możesz się zalogować, otworzyć zamontowanego repozytorium, utworzyć pliku, uruchomić polecenia w terminalu, zainstalować rozszerzenia i ponownie nawiązać połączenia WebSocket edytora.

Które dane code-server powinny znaleźć się w backupie?

Utrwal /home/coder i uwzględnij konfigurację, rozszerzenia oraz jawnie zamontowane katalogi projektów w tym samym manifeście odtwarzania. Czyste odtworzenie code-server przechodzi tylko wtedy, gdy ustawienia, rozszerzenia i pliki workspace’a wracają z poprawnym właścicielem, a terminal uruchamia się z użyciem docelowego użytkownika.

Czy code-server wymaga HTTPS za reverse proxy?

Używaj HTTPS dla publicznego originu code-server i pozostaw port 8080 na trasie wewnętrznej. Poprawnie zastosuj ustawienie code-server: umieść edytor za HTTPS i zachowaj obsługę upgrade’ów WebSocket. W przypadku code-server HTTPS chroni poświadczenia lub treści użytkownika podczas przesyłania i zapewnia spójne działanie klienta zależne od originu.

Jak testować aktualizację code-server?

Odtwórz bieżący stan code-server w odizolowanym wdrożeniu, zastosuj wersję kandydującą i powtórz transakcję akceptacyjną. Zwróć szczególną uwagę na to, że kompatybilność rozszerzeń i toolchainy obrazu bazowego mogą się zmienić, nawet jeśli interfejs code-server nadal się uruchamia. Zachowaj poprzedni obraz code-server do czasu zrozumienia granic migracji danych i rollbacku.