Индекс на дневникаDockup / бележка от практиката
Note / self-host-code-server

Как да хоствате code-server самостоятелно през 2026 г.: WebSockets, работни пространства и контрол на достъпа

Хоствайте code-server самостоятелно с правилни портове, persistent storage, HTTPS, secrets, backups и проверки при upgrade. Научете как да отстраните проблеми, когато proxy блокира WebSockets.

Неуспешният deployment на code-server невинаги води до срив. Възможно е да се показва страница за вход, докато proxy блокира WebSockets или правата върху файловете възпрепятстват инсталирането на extensions. Вместо това започнете с end-to-end проверка: влезте в системата, отворете монтирано repository, създайте файл, изпълнете terminal команда, инсталирайте extension и се свържете отново с WebSocket връзката на editor-а.

Тази проверка съответства на описаното предназначение на code-server: VS Code, който работи в browser на отдалечена машина. Тя също така открива по-рано липсващи dependencies, грешни предположения за proxy конфигурацията и ephemeral data, отколкото може да го направи uptime probe.

От какво зависи code-server

Очертайте три граници около code-server: ingress към порт 8080, durable state и supporting requirements. Container-ът може да бъде заменен, но за останалите две граници трябва да има изрично определени отговорни компоненти. Локалното runtime изискване е workspace mount, който съдържа само проектите, до които editor-ът трябва да има достъп. Тествайте тази граница преди публикуване и отново след подмяна на container.

Диаграмата е пълна, когато чист client може да влезе в системата, да отвори монтирано repository, да създаде файл, да изпълни terminal команда, да инсталира extension и да се свърже отново с WebSocket връзката на editor-а. Събирайте данни за времето и ресурсите — memory и CPU, използвани от language servers, builds, extension hosts и terminals, а не от web shell-а на code-server. Ако транзакцията се провали, първата граница, която не се държи според документацията, показва дали трябва да проверите routing, локалния капацитет или supporting service.

Превърнете локалната команда в услуга, която може да се инспектира

Стартирането, подобно на production, умишлено е семпло: именувано state, изрично зададен порт и без secret вътре в image-а.

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 .

Примерът е базова конфигурация, а не завършен supporting stack. Потвърдете локалното изискване преди експониране: workspace mount, който съдържа само проектите, до които editor-ът трябва да има достъп. Проверете effective mounts и listener-а, след което опитайте да влезете в системата, да отворите монтирано repository, да създадете файл, да изпълните terminal команда, да инсталирате extension и да се свържете отново с WebSocket връзката на editor-а. Фиксирайте работещия image преди следващия restart.

Направете публичния origin еднозначен

Поставете editor-а зад HTTPS и запазете WebSocket upgrades. Изпратете избрания hostname към порт 8080 на container-а, препратете оригиналния host и HTTPS scheme и избягвайте публикуването на втори директен origin.

Тествайте code-server от чист външен client. Разграничете ingress проблема от известната граница на приложението — proxy блокира WebSockets или правата върху файловете възпрепятстват инсталирането на extensions. Грешка със certificate, DNS или 502 принадлежи на routing; заявка, която достига до code-server и се проваля по-късно, е свързана с application state, капацитет или неговото supporting requirement. Ръководството за TLS с custom domain разглежда първата група.

Създайте backup на state-а, който code-server не може да възстанови

Container image може да бъде изтеглен отново, но configuration-ът, extensions и изрично монтираните project директории не могат. Монтирайте /home/coder преди bootstrap, запишете безвредни примерни данни и заменете container-а, за да докажете, че този path действително е persistent. Проверете effective mount-а, вместо да се доверявате на име на Compose файл, и се уверете, че runtime user-ът може да записва там, където code-server очаква.

Изберете retention и off-host destination, след което репетирайте recovery без да засягате production. Тестът е успешен само когато settings, extensions и workspace файловете се възстановят с правилните ownership права и terminal-ът стартира с предвидения user. При state, базиран на database, комбинирайте storage snapshots с application-consistent exports, както е описано в point-in-time recovery спрямо snapshots.

Защитете code-server след bootstrap

При code-server ценната surface area не е непременно landing page-ът. Основната грешка е container-ът безразсъдно да получи достъп до Docker socket-а или до цялата filesystem на host-а. Противодействайте целенасочено: монтирайте само предвидените workspaces, избягвайте Docker socket-а на host-а и поставете editor-а едновременно зад HTTPS и силна authentication.

Заменете примерния PASSWORD незабавно, съхранявайте го извън image-а и го ротирайте като administrator credential, ако бъде разкрит. Използвайте unprivileged container user, когато image-ът го поддържа, и не монтирайте несвързани credentials. Прилагайте rate или size limits на ingress ниво, където ненадеждна работа може да консумира memory и CPU, използвани от language servers, builds, extension hosts и terminals, а не от web shell-а на code-server.

Диагностицирайте code-server, който изглежда здрав

Наблюдавайте работата, която code-server извършва: memory и CPU, използвани от language servers, builds, extension hosts и terminals, а не от web shell-а на code-server. Задайте limits с достатъчен headroom за тази работа и избягвайте liveness probe, която се конкурира с нея. Operator проверката все пак трябва периодично да опитва да влезе в системата, да отвори монтирано repository, да създаде файл, да изпълни terminal команда, да инсталира extension и да се свърже отново с WebSocket връзката на editor-а.

При updates помнете, че extension compatibility и toolchain-ите в base image-а могат да се променят, дори когато UI-ят на code-server все още стартира. Deploy-нете candidate версията срещу възстановено копие и повторете познатия тест. Ако proxy блокира WebSockets или правата върху файловете възпрепятстват инсталирането на extensions, използвайте runtime logs и реалната network заявка, за да откриете кое предположение се е променило.

Данни, които да съберете, преди code-server да заработи

Създайте малък, disposable fixture за code-server и го запазете за всеки release. Fixture-ът трябва да изпълнява реалния workflow: вход в системата, отваряне на монтирано repository, създаване на файл, изпълнение на terminal команда, инсталиране на extension и повторно свързване с WebSocket връзката на editor-а. Запишете image digest-а, външния hostname, dependency address-а и очаквания резултат, така че следващ operator да може да повтори теста, без да интерпретира това ръководство.

Стартирайте fixture-а три пъти. Първо използвайте новия deployment. Второ, заменете container-а, без да променяте durable state. Трето, възстановете backup-а в празна среда. Третото изпълнение е успешно само когато settings, extensions и workspace файловете се възстановят с правилните ownership права и terminal-ът стартира с предвидения user. По време на всяко изпълнение събирайте latency и resource usage около memory и CPU, използвани от language servers, builds, extension hosts и terminals, а не от web shell-а на code-server; това става baseline за alerts, вместо произволен процент CPU.

Накрая тествайте умишлено negative path: изпратете безвреден input близо до resource или format limit, свързан с тази граница: proxy блокира WebSockets или правата върху файловете възпрепятстват инсталирането на extensions. Потвърдете, че code-server се проваля видимо, без да повреди state-а, възстановете правилното условие и повторете успешната транзакция. Release record с тези четири резултата е по-силно доказателство от screenshots на dashboard или еднократен curl отговор.

Преместете повтаряемата инфраструктурна работа към Dockup

Dockup може да поеме заменяемите части на platform-а: да насочи traffic към порт 8080, да издаде domain и certificate, да инжектира secrets, да прикачи persistent storage и да свърже code-server с managed или privately attached services. Това може да се направи върху инфраструктурата на Dockup или на server, който прикачите.

Acceptance работата за code-server остава изрична. След one-click deployment поставете editor-а зад HTTPS и запазете WebSocket upgrades, потвърдете локалното изискване — workspace mount, който съдържа само проектите, до които editor-ът трябва да има достъп, и изпълнете този сценарий: влезте в системата, отворете монтирано repository, създайте файл, изпълнете terminal команда, инсталирайте extension и се свържете отново с WebSocket връзката на editor-а. Това разделение е умишлено: Dockup премахва повтарящата се infrastructure setup работа, без да се преструва, че application roles, provider credentials или restore policy се избират сами.

Често задавани въпроси

Какво е необходимо на code-server за production deployment?

Насочете container-а на code-server през порт 8080 към един HTTPS origin. Локалното runtime изискване е workspace mount, който съдържа само проектите, до които editor-ът трябва да има достъп. Не считайте code-server за готов, докато не можете да влезете в системата, да отворите монтирано repository, да създадете файл, да изпълните terminal команда, да инсталирате extension и да се свържете отново с WebSocket връзката на editor-а.

Кои данни на code-server трябва да бъдат включени в backup?

Запазете /home/coder и включете configuration-а, extensions и изрично монтираните project директории в един и същ recovery manifest. Чистото възстановяване на code-server е успешно само когато settings, extensions и workspace файловете се върнат с правилните ownership права и terminal-ът стартира с предвидения user.

Необходим ли е HTTPS за code-server зад reverse proxy?

Използвайте HTTPS за публичния code-server origin и оставете порт 8080 във вътрешния route. Прилагайте правилно настройката на code-server: поставете editor-а зад HTTPS и запазете WebSocket upgrades. При code-server HTTPS защитава credentials или user content при пренос и поддържа последователно поведение на client-а, зависимо от origin.

Как трябва да се тества upgrade на code-server?

Възстановете текущия state на code-server в изолиран deployment, приложете candidate версията и повторете acceptance транзакцията. Обърнете особено внимание, защото extension compatibility и toolchain-ите в base image-а могат да се променят, дори когато UI-ят на code-server все още стартира. Запазете предишния code-server image, докато не изясните неговата граница за data migration и rollback.