Як розгорнути code-server на власному сервері у 2026 році: WebSockets, робочі простори та контроль доступу
Розгорніть code-server на власному сервері з правильними портами, постійним сховищем, HTTPS, секретами, резервними копіями та перевірками оновлень. Дізнайтеся, як виправити ситуацію, коли proxy блокує WebSockets.
Невдале розгортання code-server не завжди завершується аварійною зупинкою. Сервіс може показувати сторінку входу, тоді як proxy блокує WebSockets або права власності на файли не дають встановлювати extensions. Замість цього почніть із наскрізної перевірки: увійдіть у систему, відкрийте змонтований репозиторій, створіть файл, виконайте команду в terminal, встановіть extension і повторно підключіть WebSocket редактора.
Ця перевірка відповідає задокументованому призначенню code-server: запускати VS Code у браузері на віддаленій машині. Вона також раніше за перевірку доступності виявляє відсутні залежності, хибні припущення щодо proxy та тимчасові дані.
Від чого залежить code-server
Окресліть навколо code-server три межі: вхідний трафік до порту 8080, постійний стан і допоміжні вимоги. Контейнер можна замінити, але для двох інших складових потрібно явно визначити відповідальних. Вимога локального середовища виконання — це mount робочого простору, що містить лише ті проєкти, до яких редактор має отримувати доступ. Перевірте цю межу до публікації сервісу та ще раз після заміни контейнера.
Схема є повною, коли чистий клієнт може увійти в систему, відкрити змонтований репозиторій, створити файл, виконати команду в terminal, встановити extension і повторно підключити WebSocket редактора. Збирайте дані про час виконання та використання ресурсів language servers, збірками, extension hosts і terminals, а не web shell code-server: ідеться про використання пам’яті та CPU. Якщо транзакція завершується помилкою, перша межа, яка не працює відповідно до документації, підкаже, чи потрібно досліджувати маршрутизацію, локальні ресурси або допоміжний сервіс.
Перетворіть локальну команду на сервіс, який можна перевіряти
Запуск, наближений до 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 .
Приклад є базовою конфігурацією, а не повним набором допоміжних сервісів. Перед відкриттям доступу підтвердьте вимогу локального середовища виконання: mount робочого простору, що містить лише ті проєкти, до яких редактор має отримувати доступ. Перевірте фактичні mounts і listener, а потім спробуйте увійти в систему, відкрити змонтований репозиторій, створити файл, виконати команду в terminal, встановити extension і повторно підключити WebSocket редактора. Перш ніж виконувати наступний restart, зафіксуйте робочий image.
Зробіть публічний origin однозначним
Розмістіть редактор за HTTPS і збережіть оновлення WebSocket. Спрямовуйте вибране ім’я хоста на порт контейнера 8080, передавайте початкові host і HTTPS scheme та не публікуйте додатковий прямий origin.
Перевірте code-server із чистого зовнішнього клієнта. Відокремте помилку ingress від відомої межі застосунку — proxy блокує WebSockets або права власності на файли не дають встановлювати extensions. Помилка сертифіката, DNS або 502 належить до маршрутизації; запит, який доходить до code-server і завершується помилкою пізніше, стосується стану застосунку, доступних ресурсів або його допоміжної вимоги. У посібнику з TLS для custom domain описано першу групу проблем.
Створюйте резервні копії стану, який code-server не може відновити самостійно
Container image можна завантажити повторно, а конфігурацію, extensions і явно змонтовані каталоги проєктів — ні. Змонтуйте /home/coder до bootstrap, запишіть нешкідливі тестові дані та замініть контейнер, щоб перевірити фактичну постійність цього шляху. Перевіряйте фактичний mount, а не покладайтеся на назву Compose-файлу, і переконайтеся, що runtime user може записувати дані туди, де їх очікує code-server.
Визначте політику зберігання та зовнішнє сховище, а потім відпрацюйте відновлення, не змінюючи production. Перевірка успішна лише тоді, коли settings, extensions і файли робочого простору повертаються з правильним owner і terminal запускається від імені потрібного user. Для стану, що зберігається в базі даних, поєднуйте snapshot-и сховища з exports, узгодженими із застосунком, як описано в матеріалі відновлення до моменту часу проти snapshot-ів.
Захистіть code-server після bootstrap
Для code-server цінною поверхнею атаки не обов’язково є landing page. Основна помилка — без потреби надавати контейнеру доступ до Docker socket або всієї файлової системи host. Протидійте цьому свідомо: монтуйте лише потрібні workspaces, не використовуйте Docker socket host і розміщуйте редактор за HTTPS та надійною автентифікацією.
Негайно замініть приклад PASSWORD, зберігайте його поза image і змінюйте як облікові дані адміністратора, якщо їх було розкрито. Використовуйте unprivileged container user, якщо image це підтримує, і не монтуйте сторонні credentials. Застосовуйте обмеження швидкості або розміру на ingress, де ненадійна робота може споживати пам’ять і CPU language servers, build-ами, extension hosts і terminals, а не web shell code-server.
Діагностуйте code-server, який виглядає справним
Спостерігайте за роботою, яку виконує code-server: використанням пам’яті та CPU language servers, build-ами, extension hosts і terminals, а не web shell code-server. Встановлюйте ліміти із запасом для цієї роботи та уникайте liveness probe, яка конкурує з нею за ресурси. Операторська перевірка все одно має регулярно намагатися увійти в систему, відкрити змонтований репозиторій, створити файл, виконати команду в terminal, встановити extension і повторно підключити WebSocket редактора.
Під час оновлень пам’ятайте, що сумісність extensions і toolchains базового image можуть змінитися, навіть якщо UI code-server продовжує запускатися. Розгорніть candidate-версію на відновленій копії та повторіть відому перевірку. Якщо proxy блокує WebSockets або права власності на файли не дають встановлювати extensions, використовуйте runtime logs і фактичний мережевий запит, щоб визначити, яке припущення змінилося.
Які дані зібрати до запуску code-server у production
Створіть невеликий disposable fixture для code-server і зберігайте його для кожного release. Fixture має перевіряти реальний workflow: увійти в систему, відкрити змонтований репозиторій, створити файл, виконати команду в terminal, встановити extension і повторно підключити WebSocket редактора. Запишіть digest image, зовнішнє ім’я хоста, адресу залежності та очікуваний результат, щоб наступний оператор міг повторити перевірку без інтерпретації цього посібника.
Запустіть fixture тричі. Спочатку використайте свіже розгортання. Потім замініть контейнер, не змінюючи постійний стан. Втретє відновіть резервну копію в порожньому середовищі. Третій запуск успішний лише тоді, коли settings, extensions і файли робочого простору повертаються з правильним owner, а terminal запускається від імені потрібного user. Під час кожного запуску збирайте latency і використання ресурсів навколо пам’яті та CPU language servers, build-ів, extension hosts і terminals, а не web shell code-server; це стане базовим показником для alert-ів замість довільного відсотка CPU.
Нарешті, навмисно перевірте негативний сценарій: надішліть нешкідливі дані поблизу обмеження ресурсу або формату, пов’язаного з цією межею: proxy блокує WebSockets або права власності на файли не дають встановлювати extensions. Переконайтеся, що code-server помітно повідомляє про помилку, не пошкоджуючи стан, відновіть правильну умову та повторіть успішну транзакцію. Запис про release із цими чотирма результатами є надійнішим доказом, ніж screenshots dashboard або одноразова відповідь curl.
Перенесіть повторювану інфраструктурну роботу до Dockup
Dockup може відповідати за замінні компоненти платформи: спрямовувати трафік на порт 8080, видавати domain і certificate, передавати secrets, під’єднувати persistent storage і з’єднувати code-server із керованими або приватно під’єднаними сервісами. Це можна робити на інфраструктурі Dockup або на під’єднаному вами сервері.
Приймання code-server залишається явною процедурою. Після one-click deployment розмістіть редактор за HTTPS і збережіть оновлення WebSocket, підтвердьте локальну вимогу — mount робочого простору, що містить лише ті проєкти, до яких редактор має отримувати доступ, — і виконайте цей сценарій: увійдіть у систему, відкрийте змонтований репозиторій, створіть файл, виконайте команду в terminal, встановіть extension і повторно підключіть WebSocket редактора. Такий поділ є навмисним: Dockup усуває повторюване налаштування інфраструктури, не вдаючи, що ролі застосунку, credentials провайдера або політика відновлення визначаються самі собою.
Часті запитання
Що потрібно code-server для розгортання в production?
Спрямуйте контейнер code-server через порт 8080 до одного HTTPS origin. Вимога локального середовища виконання — це mount робочого простору, що містить лише ті проєкти, до яких редактор має отримувати доступ. Не вважайте code-server готовим, доки не зможете увійти в систему, відкрити змонтований репозиторій, створити файл, виконати команду в terminal, встановити extension і повторно підключити WebSocket редактора.
Які дані code-server потрібно включати до резервної копії?
Зберігайте /home/coder і включіть конфігурацію, extensions та явно змонтовані каталоги проєктів до одного recovery manifest. Чисте відновлення code-server успішне лише тоді, коли settings, extensions і файли робочого простору повертаються з правильним owner, а terminal запускається від імені потрібного user.
Чи потрібен code-server HTTPS за reverse proxy?
Використовуйте HTTPS для публічного origin code-server і залиште порт 8080 у внутрішньому маршруті. Правильно застосуйте налаштування code-server: розмістіть редактор за HTTPS і збережіть оновлення WebSocket. Для code-server HTTPS захищає credentials або користувацький контент під час передавання та забезпечує узгоджену поведінку клієнта, чутливу до origin.
Як тестувати оновлення code-server?
Відновіть поточний стан code-server в ізольованому розгортанні, застосуйте candidate-версію та повторіть acceptance transaction. Зверніть особливу увагу на те, що сумісність extensions і toolchains базового image можуть змінитися, навіть якщо UI code-server продовжує запускатися. Зберігайте попередній image code-server, доки не буде зрозумілою межа міграції даних і rollback.
