Индекс журналаDockup / заметка с места
Note / self-host-code-server

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

Самостоятельно разместите code-server с корректными портами, постоянным хранилищем, HTTPS, секретами, резервными копиями и проверками обновлений. Узнайте, как устранить проблему, из-за которой proxy блокирует WebSockets.

Неудачное развёртывание code-server не всегда приводит к сбою. Сервис может показывать страницу входа, пока proxy блокирует WebSockets, а права на файлы не позволяют устанавливать extensions. Вместо этого начните с комплексной проверки: войдите в систему, откройте смонтированный repository, создайте файл, выполните команду в terminal, установите extension и заново подключите WebSocket редактора.

Эта проверка соответствует заявленному назначению code-server: VS Code, работающий в браузере на удалённой машине. Она также раньше, чем проверка доступности, выявляет отсутствующие зависимости, неверные предположения о proxy и ephemeral data.

От чего зависит code-server

Проведите вокруг code-server три границы: ingress к порту 8080, постоянное состояние и вспомогательные требования. Контейнер можно заменить, но для двух других компонентов нужно явно определить владельцев. Локальное требование среды выполнения — mount workspace, содержащий только те проекты, к которым редактор должен иметь доступ. Проверьте эту границу до публикации и повторно после замены контейнера.

Схема считается полной, когда чистый клиент может войти в систему, открыть смонтированный repository, создать файл, выполнить команду в terminal, установить extension и заново подключить WebSocket редактора. Собирайте данные о времени выполнения и ресурсах, затраченных language servers, builds, extension hosts и terminals, а не web shell code-server. Если транзакция завершается ошибкой, первая граница, которая работает не так, как описано в документации, показывает, нужно ли исследовать маршрутизацию, локальную ёмкость или вспомогательный сервис.

Превратите локальную команду в контролируемый сервис

Запуск, приближенный к production, намеренно прост: именованное состояние, явно заданный порт и отсутствие секрета внутри 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. Перед публикацией подтвердите локальное требование: mount workspace, содержащий только те проекты, к которым редактор должен иметь доступ. Проверьте фактические mounts и listener, затем попробуйте войти в систему, открыть смонтированный repository, создать файл, выполнить команду в terminal, установить extension и заново подключить WebSocket редактора. Зафиксируйте рабочий image до следующего перезапуска.

Сделайте public origin однозначным

Разместите редактор за HTTPS и сохраните WebSocket upgrades. Направляйте выбранный hostname на порт контейнера 8080, передавайте исходные host и HTTPS scheme и не публикуйте второй прямой origin.

Проверьте code-server с чистого внешнего клиента. Отделяйте сбой ingress от известной границы приложения — proxy блокирует WebSockets или права на файлы не позволяют устанавливать extensions. Ошибка certificate, DNS или 502 относится к маршрутизации; запрос, который доходит до code-server и завершается ошибкой позже, связан с состоянием приложения, ёмкостью или его supporting requirement. В руководстве по TLS для custom domain описана первая группа проблем.

Создайте резервную копию состояния, которое code-server не может восстановить

Container image можно скачать заново, а configuration, extensions и явно смонтированные каталоги проектов — нельзя. Смонтируйте /home/coder до bootstrap, запишите безвредные тестовые данные и замените контейнер, чтобы убедиться, что этот путь действительно persistent. Проверяйте фактический mount, а не доверяйте имени Compose-файла, и убедитесь, что runtime user может записывать данные туда, где это ожидает code-server.

Определите срок хранения и off-host destination, затем отрепетируйте восстановление, не затрагивая production. Проверка считается успешной только тогда, когда settings, extensions и файлы workspace возвращаются с корректными владельцами, а terminal запускается от нужного пользователя. Для состояния, хранящегося в database, объединяйте snapshots хранилища с exports, согласованными с приложением, как описано в материале восстановление на момент времени и snapshots.

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

Для code-server ценная поверхность атаки не обязательно совпадает с landing page. Главная ошибка — бездумно предоставлять контейнеру Docker socket или всю файловую систему host. Противодействуйте этому намеренно: монтируйте только нужные workspaces, не используйте Docker socket host и размещайте редактор за HTTPS и надёжной authentication.

Немедленно замените пример PASSWORD, храните его вне image и ротируйте как credential администратора, если он стал доступен посторонним. Используйте unprivileged container user, если image это поддерживает, и не монтируйте сторонние credentials. Применяйте ограничения rate или size на 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 с запасом для этой работы и не используйте liveness probe, которая конкурирует с ней за ресурсы. Операторская проверка всё равно должна по расписанию пытаться войти в систему, открыть смонтированный repository, создать файл, выполнить команду в terminal, установить extension и заново подключить WebSocket редактора.

При обновлениях помните, что совместимость extensions и toolchains base image может измениться, даже если UI code-server по-прежнему запускается. Разверните candidate-версию на восстановленной копии и повторите известный тест. Если proxy блокирует WebSockets или права на файлы не позволяют устанавливать extensions, используйте runtime logs и фактический network request, чтобы выяснить, какое предположение изменилось.

Какие данные собрать до запуска code-server

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

Запустите fixture три раза. Сначала используйте свежее развёртывание. Затем замените контейнер, не затрагивая durable state. В третий раз восстановите backup в пустой environment. Третий запуск считается успешным только тогда, когда settings, extensions и файлы workspace возвращаются с корректными владельцами, а terminal запускается от нужного пользователя. Во время каждого запуска собирайте latency и сведения об использовании ресурсов для memory и CPU, затраченных language servers, builds, extension hosts и terminals, а не web shell code-server; это станет baseline для alerts вместо произвольного значения CPU в процентах.

Наконец, намеренно проверьте negative path: отправьте безвредные данные, близкие к 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. Это можно сделать на infrastructure Dockup или на подключённом вами server.

Проверка code-server остаётся явной задачей. После one-click deployment разместите редактор за HTTPS и сохраните WebSocket upgrades, подтвердите локальное требование — mount workspace, содержащий только те проекты, к которым редактор должен иметь доступ, — и выполните следующий сценарий: войдите в систему, откройте смонтированный repository, создайте файл, выполните команду в terminal, установите extension и заново подключите WebSocket редактора. Такое разделение намеренно: Dockup устраняет повторяющуюся настройку infrastructure, но не делает вид, что application roles, credentials провайдера или политика восстановления выбираются автоматически.

Часто задаваемые вопросы

Что требуется code-server для production-развёртывания?

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

Какие данные code-server нужно включить в backup?

Сохраняйте /home/coder и включайте configuration, extensions и явно смонтированные каталоги проектов в один recovery manifest. Чистое восстановление code-server считается успешным только тогда, когда settings, extensions и файлы workspace возвращаются с корректными владельцами, а terminal запускается от нужного пользователя.

Нужен ли code-server HTTPS за reverse proxy?

Используйте HTTPS для public origin code-server, а порт 8080 оставьте во внутреннем route. Корректно применяйте настройку code-server: размещайте редактор за HTTPS и сохраняйте WebSocket upgrades. Для code-server HTTPS защищает credentials или пользовательские данные при передаче и обеспечивает согласованное поведение client, зависящее от origin.

Как тестировать обновление code-server?

Восстановите текущее состояние code-server в изолированном deployment, примените candidate-версию и повторите acceptance transaction. Уделите этому особое внимание, поскольку совместимость extensions и toolchains base image может измениться, даже если UI code-server по-прежнему запускается. Сохраняйте предыдущий image code-server, пока не будут понятны границы data migration и rollback.