УСТАНОВКА ОБЛАЧНОЙ IDE-ПЛАТФОРМЫ CODE-SERVER

Thank you for reading this post, don't forget to subscribe!

С пере­хо­дом инстру­мен­тов раз­ра­бот­ки в облач­ную сре­ду нача­ла рас­ти потреб­ность в созда­нии и внед­ре­нии облач­ных плат­форм IDE (Integrated Development Environment, инте­гри­ро­ван­ная сре­да раз­ра­бот­ки). Облач­ные IDE-сре­ды поз­во­ля­ют боль­шим коман­дам раз­ра­бот­чи­ков сов­мест­но раз­ви­вать про­ект в режи­ме реаль­но­го вре­ме­ни. При этом они исполь­зу­ют еди­ную сре­ду, что сво­дит к мини­му­му несов­ме­сти­мо­сти и повы­ша­ет про­из­во­ди­тель­ность. Облач­ные IDE, доступ­ные в веб-бра­у­зе­рах, рабо­та­ют с любо­го типа совре­мен­но­го устройства.

code-server – это сре­да Microsoft Visual Studio Code, рабо­та­ю­щая на уда­лен­ном сер­ве­ре и доступ­ная в про­стом бра­у­зе­ре. Visual Studio Code – это совре­мен­ный редак­тор кода со встро­ен­ной под­держ­кой Git, отлад­чи­ком кода, умным авто­за­пол­не­ни­ем и настра­и­ва­е­мы­ми и рас­ши­ря­е­мы­ми функ­ци­я­ми. Это озна­ча­ет, что вы може­те исполь­зо­вать раз­лич­ные устрой­ства под управ­ле­ни­ем раз­ных опе­ра­ци­он­ных систем и при этом все­гда иметь под рукой согла­со­ван­ную сре­ду разработки.

В этом мануа­ле вы узна­е­те, как настро­ить облач­ную IDE-плат­фор­му на сво­ем сер­ве­ре CentOS 7 и открыть к ней доступ на сво­ем домене, исполь­зуя бес­плат­ные сер­ти­фи­ка­ты Let’s Encrypt. В резуль­та­те у вас будет уста­нов­ка Microsoft Visual Studio Code, доступ­ная по ваше­му доме­ну и защи­щен­ная паролем.

Требования

  • Сер­вер CentOS 7,
  • 2 Гб опе­ра­тив­ной памя­ти минимум.
  • Веб-сер­вер Nginx
  • Две DNS-запи­си А (для your-domain и www.your-domain), направ­лен­ные на ваш внеш­ний IP-адрес.
  • Пол­но­стью заре­ги­стри­ро­ван­ное домен­ное имя для хоста code-server, ука­зы­ва­ю­щее на ваш сер­вер. В этом мануа­ле будет исполь­зо­вать­ся домен code-server.your-domain.

1: Установка code-server

Сна­ча­ла мы уста­но­вим code-server. Для это­го нуж­но загру­зить послед­нюю вер­сию и создать сер­вис systemd, кото­рый будет посто­ян­но под­дер­жи­вать code-server в фоно­вом режи­ме. Так­же необ­хо­ди­мо настро­ить поли­ти­ку пере­за­пус­ка сер­ви­са, что­бы code-server вос­ста­нав­ли­вал­ся после воз­мож­ных сбо­ев или перезагрузок.

Все дан­ные, отно­ся­щи­е­ся к code-server, будут хра­нить­ся в пап­ке ~/code-server. Создай­те эту пап­ку, выпол­нив сле­ду­ю­щую команду:

mkdir ~/code-server

Перей­ди­те в нее:

cd ~/code-server

Затем нуж­но перей­ти на стра­ни­цу рели­зов code-server на Github и выбрать послед­нюю сбор­ку для Linux (файл будет содер­жать «linux» в назва­нии). На момент напи­са­ния ста­тьи послед­няя вер­сия – это 2.1692. Загру­зи­те ее с помо­щью инстру­мен­та curl , выпол­нив сле­ду­ю­щую команду:

curl -LO https://github.com/cdr/code-server/releases/download/2.1692-vsc1.39.2/code-server2.1692-vsc1.39.2-linux-x86_64.tar.gz

Рас­па­куй­те архив:

tar -xzvf code-server2.1692-vsc1.39.2-linux-x86_64.tar.gz

Имя полу­чен­ной пап­ки будет точ­но сов­па­дать с име­нем исход­но­го фай­ла code-server, кото­рый вы ска­ча­ли. Перей­ди­те в эту папку:

cd code-server2.1692-vsc1.39.2-linux-x86_64

Ско­пи­руй­те испол­ня­е­мый файл code-server в /usr/local/bin, что­бы сде­лать его обще­до­ступ­ным в систе­ме, выпол­нив сле­ду­ю­щую команду:

sudo cp code-server /usr/local/bin

Затем создай­те пап­ку, где будут хра­нить­ся поль­зо­ва­тель­ские дан­ные code-server:

sudo mkdir /var/lib/code-server

Теперь, когда вы ска­ча­ли code-server и сде­ла­ли при­ло­же­ние доступ­ным во всей систе­ме, вы може­те создать сер­вис systemd – это поз­во­ля­ет посто­ян­но под­дер­жи­вать рабо­ту code-server в фоно­вом режиме.

Кон­фи­гу­ра­цию сер­ви­са нуж­но хра­нить в фай­ле code-server.service, в ката­ло­ге /usr/lib/systemd/system, где systemd хра­нит дру­гие свои сер­ви­сы. Создай­те такой файл в тек­сто­вом редак­то­ре vi:

sudo vi /usr/lib/systemd/system/code-server.service

Вставь­те в него такие строки:

[Unit]
Description=code-server
After=nginx.service
[Service]
Type=simple
Environment=PASSWORD=your_password
ExecStart=/usr/local/bin/code-server --host 127.0.0.1 --user-data-dir /var/lib/code-server --auth password
Restart=always
[Install]
WantedBy=multi-user.target

Сна­ча­ла в этом фай­ле идет опи­са­ние сер­ви­са. Затем ука­зы­ва­ет­ся, что сер­вис nginx дол­жен быть запу­щен рань­ше, чем дан­ный сер­вис. После раз­де­ла [Unit] опре­де­ля­ет­ся тип сер­ви­са (simple озна­ча­ет, что про­цесс нуж­но про­сто запу­стить) и зада­ет­ся коман­да, кото­рую нуж­но выполнить.

Так­же здесь ска­за­но, что гло­баль­ный испол­ня­е­мый файл code-server дол­жен запус­кать­ся с несколь­ки­ми спе­ци­аль­ны­ми аргу­мен­та­ми. Флаг —host 127.0.0.1 при­вя­зы­ва­ет его к localhost, поэто­му он досту­пен толь­ко внут­ри ваше­го сер­ве­ра. Флаг —user-data-dir /var/lib/code-server уста­нав­ли­ва­ет ката­лог поль­зо­ва­тель­ских дан­ных, а —auth password настра­и­ва­ет пароль­ную аутен­ти­фи­ка­цию посе­ти­те­лей (она про­ис­хо­дит с помо­щью паро­ля, ука­зан­но­го в пере­мен­ной сре­ды PASSWORD, объ­яв­лен­ной в стро­ке выше).

Не забудь­те заме­нить your_password на слож­ный пароль. Затем сохра­ни­те и закрой­те файл.

Сле­ду­ю­щая стро­ка поз­во­ля­ет systemd пере­за­пус­кать code-server при любых собы­ти­ях сбоя (напри­мер, в слу­чае оста­нов­ки про­цес­са). Раз­дел [Install] рас­ска­зы­ва­ет systemd, как запус­кать этот сер­вис при запус­ке сервера.

Запу­сти­те сер­вис code-server, выпол­нив сле­ду­ю­щую команду:

sudo systemctl start code-server

Убе­ди­тесь, что он запустился:

sudo systemctl status code-server
code-server.service - code-server
Loaded: loaded (/usr/lib/systemd/system/code-server.service; disabled; vendor preset: disabled)
Active: active (running) since Thu 2019-12-19 19:24:42 UTC; 5s ago
Main PID: 1668 (code-server)
CGroup: /system.slice/code-server.service
├─1668 /usr/local/bin/code-server --host 127.0.0.1 --user-data-dir /var/lib/code-server --auth password

└─1679 /usr/local/bin/code-server --host 127.0.0.1 --user-data-dir /var/lib/code-server --auth password

Dec 19 19:24:42 code-server-centos systemd[1]: Started code-server.

Dec 19 19:24:44 code-server-centos code-server[1668]: info  Server listening on http://127.0.0.1:8080

Dec 19 19:24:44 code-server-centos code-server[1668]: info    - Using custom password for authentication

Dec 19 19:24:44 code-server-centos code-server[1668]: info    - Not serving HTTPS

Что­бы code-server запус­кал­ся авто­ма­ти­че­ски после пере­за­груз­ки сер­ве­ра, вклю­чи­те сер­вис, выпол­нив сле­ду­ю­щую команду:

sudo systemctl enable code-server

Итак, вы загру­зи­ли code-server и сде­ла­ли его доступ­ным гло­баль­но. Затем вы созда­ли для него систем­ный сер­вис и вклю­чи­ли его, что доба­ви­ло code-server в авто­за­груз­ку. Сей­час мы откро­ем доступ к нему на сво­ем домене, настро­ив Nginx в каче­стве обрат­но­го прок­си-сер­ве­ра меж­ду посе­ти­те­ля­ми и code-server.

2: Настройка доступа к code-server в интернете

В этом раз­де­ле вы узна­е­те, как настро­ить Nginx в каче­стве обрат­но­го прок­си-сер­ве­ра для code-server.

Как вы уже зна­е­те, кон­фи­гу­ра­ции сай­та в Nginx хра­нят­ся в ката­ло­ге /etc/nginx/conf.d.

Вы буде­те хра­нить кон­фи­гу­ра­цию code-server для настрой­ки досту­па к нему по ваше­му доме­ну в фай­ле code-server.conf, в ката­ло­ге /etc/nginx/conf.d. Нач­ни­те с созда­ния это­го файла:

sudo vi /etc/nginx/conf.d/code-server.conf

Вставь­те в файл:

server {
listen 80;
listen [::]:80;
server_name code-server.your-domain;
location / {
proxy_pass http://localhost:8080/;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection upgrade;
proxy_set_header Accept-Encoding gzip;
}
}

Заме­ни­те code-server.your-domain вашим доме­ном, а затем сохра­ни­те и закрой­те файл.

В этом фай­ле вы опре­де­ли­ли HTTP порт 80, кото­рый дол­жен про­слу­ши­вать Nginx. Затем вы ука­за­ли пара­метр server_name, кото­рый сооб­ща­ет Nginx, для како­го доме­на при­ни­мать запро­сы и при­ме­нять эту кон­крет­ную конфигурацию.

В сле­ду­ю­щем бло­ке location (/) вы ука­за­ли, что запро­сы долж­ны пере­да­вать­ся для code-server, рабо­та­ю­ще­го на localhost:8080. Сле­ду­ю­щие три стро­ки (начи­ная с proxy_set_header) поз­во­ля­ют Nginx пере­но­сить неко­то­рые заго­лов­ки HTTP-запро­сов, необ­хо­ди­мые для пра­виль­но­го функ­ци­о­ни­ро­ва­ния веб-соке­тов, кото­рые широ­ко исполь­зу­ет code-server.

Что­бы про­ве­рить пра­виль­ность кон­фи­гу­ра­ции, выпол­ни­те сле­ду­ю­щую команду:

sudo nginx -t

Вы уви­ди­те сле­ду­ю­щий вывод:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Что­бы настрой­ки всту­пи­ли в силу, нуж­но пере­за­пу­стить Nginx:

sudo systemctl restart nginx

В CentOS 7 по умол­ча­нию вклю­че­на под­держ­ка SELinux со стро­гим набо­ром пра­вил, из-за чего Nginx не смо­жет под­клю­чить­ся к локаль­ным соке­там TCP. По этой при­чине Nginx не будет обслу­жи­вать обрат­ное прок­си­ро­ва­ние для code-server. Запу­сти­те сле­ду­ю­щую коман­ду, что­бы на посто­ян­ной осно­ве смяг­чить набор правил:

sudo setsebool httpd_can_network_connect 1 -P

Открой­те в бра­у­зе­ре ваш домен, по кото­ро­му обслу­жи­ва­ет­ся уста­нов­ка code-server. Вы уви­ди­те фор­му вхо­да на code-server.

code-server запро­сит ваш пароль. Вве­ди­те тот пароль, кото­рый вы уста­но­ви­ли ранее, и нажми­те Enter IDE. Вы полу­чи­те доступ к code-server и уви­ди­те его гра­фи­че­ский редактор.

Теперь code-server досту­пен на вашем домене. На сле­ду­ю­щем эта­пе мы защи­тим его, уста­но­вив бес­плат­ный TLS сер­ти­фи­кат Let’s Encrypt.

3: Установка сертификата Let’s Encrypt

В этом раз­де­ле вы защи­ти­те свой домен с помо­щью сер­ти­фи­ка­та Let’s Encrypt, кото­рый вы полу­чи­те с помо­щью кли­ен­та Certbot.

Для нача­ла уста­но­ви­те Certbot и его пла­гин для Nginx.

sudo yum install certbot python2-certbot-nginx

Что­бы запро­сить сер­ти­фи­ка­ты для ваше­го доме­на, выпол­ни­те сле­ду­ю­щую команду:

sudo certbot --nginx -d code-server.your-domain

Эта коман­да запус­ка­ет certbot для запро­са сер­ти­фи­ка­тов для ваше­го доме­на: в коман­де вы пере­да­е­те домен с пара­мет­ром -d. Флаг —nginx поз­во­ля­ет кли­ен­ту авто­ма­ти­че­ски изме­нять кон­фи­гу­ра­цию сай­та Nginx для под­держ­ки HTTPS. Не забудь­те заме­нить услов­ный домен code-server.your-domain сво­им доменом.

Если вы впер­вые запус­ка­е­те Certbot, он попро­сит ука­зать адрес элек­трон­ной почты для сроч­ных уве­дом­ле­ний и при­нять усло­вия обслу­жи­ва­ния EFF. Затем Certbot запро­сит сер­ти­фи­ка­ты для ваше­го доме­на у Let’s Encrypt и спро­сит, хоти­те ли вы пере­на­пра­вить весь HTTP-тра­фик на HTTPS:

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

Реко­мен­ду­ем выбрать вари­ант 2, он без­опас­нее. Сде­лав свой выбор, нажми­те ввод.

Вы полу­чи­те такой вывод:

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/code-server.your-domain/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/code-server.your-domain/privkey.pem
Your cert will expire on ... To obtain a new or tweaked
version of this certificate in the future, simply run certbot again
with the "certonly" option. To non-interactively renew *all* of
your certificates, run "certbot renew"
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
Donating to EFF:                    https://eff.org/donate-le

Это озна­ча­ет, что Certbot успеш­но сге­не­ри­ро­вал сер­ти­фи­ка­ты TLS и при­ме­нил их к кон­фи­гу­ра­ции Nginx для ваше­го доме­на. Теперь вы може­те пере­за­гру­зить стра­ни­цу code-server в бра­у­зе­ре: сей­час вы уви­ди­те зеле­ный замо­чек в адрес­ной стро­ке (сле­ва от адре­са сай­та), что озна­ча­ет, что ваше соеди­не­ние надеж­но защищено.

Теперь нуж­но настро­ить авто­ма­ти­че­ское обнов­ле­ние сер­ти­фи­ка­та. Мы настро­им еже­днев­ную про­вер­ку сер­ти­фи­ка­тов с помо­щью cron. Открой­те свой crontab:

sudo crontab -e

На экране появит­ся стан­дарт­ный файл crontab (если вы не редак­ти­ро­ва­ли его ранее, это будет обыч­ный пустой тек­сто­вый файл). Вставь­те в него такую стро­ку, затем сохра­ни­те и закрой­те файл:

. . .
15 3 * * * /usr/bin/certbot renew --quiet

Теперь ука­зан­ная в фай­ле коман­да будет авто­ма­ти­че­ски запус­кать­ся каж­дый день в 3:15 утра.

Коман­да renew поз­во­ля­ет кли­ен­ту Certbot про­ве­рять все уста­нов­лен­ные сер­ти­фи­ка­ты в теку­щей систе­ме и обнов­лять те из них, до исте­че­ния сро­ка кото­рых оста­ет­ся менее 30 дней. Флаг —quiet пере­во­дит Certbot в тихий режим, что­бы он не запра­ши­вал под­твер­жде­ний и не выво­дил ниче­го на экран.

Теперь все сер­ти­фи­ка­ты будут зара­нее авто­ма­ти­че­ски обновляться.

4: Использование интерфейса

В этом раз­де­ле мы попро­бу­ем исполь­зо­вать неко­то­рые функ­ции интер­фей­са code-server. Посколь­ку code-server пред­став­ля­ет собой Visual Studio Code, рабо­та­ю­щий в обла­ке, он име­ет тот же интер­фейс, что и вер­сия Visual Studio Code для настоль­ных компьютеров.

С левой сто­ро­ны пане­ли IDE рас­по­ло­жен вер­ти­каль­ный ряд из шести кно­пок, они пред­став­ля­ют наи­бо­лее часто исполь­зу­е­мые функ­ции боко­вой пане­ли (она назы­ва­ет­ся Activity Bar).

Эту панель вы може­те настро­ить само­сто­я­тель­но: при жела­нии мож­но лег­ко изме­нить поря­док этих кно­пок, пере­ме­стить или уда­лить их из пане­ли. По умол­ча­нию пер­вая кноп­ка откры­ва­ет общее меню, а вто­рая – панель Explorer, кото­рая предо­став­ля­ет дре­во­вид­ную нави­га­цию по струк­ту­ре про­ек­та. Здесь вы може­те управ­лять сво­и­ми пап­ка­ми и фай­ла­ми, созда­вая, уда­ляя, пере­ме­щая и пере­име­но­вы­вая их по мере необ­хо­ди­мо­сти. Сле­ду­ю­щее пред­став­ле­ние предо­став­ля­ет доступ к функ­ци­ям поис­ка и замены.

После это­го по умол­ча­нию идет систе­ма кон­тро­ля вер­сий (напри­мер, Git). Visual Studio Code так­же под­дер­жи­ва­ет дру­гих про­вай­де­ров для управ­ле­ния исход­ным кодом, вы може­те най­ти допол­ни­тель­ные инструк­ции по рабо­чим про­цес­сам управ­ле­ния исход­ным кодом в этой доку­мен­та­ции.

Опция отлад­чи­ка в Activity Bar предо­став­ля­ет все общие дей­ствия для отлад­ки. Visual Studio Code постав­ля­ет­ся со встро­ен­ной под­держ­кой отлад­чи­ка сре­ды выпол­не­ния Node.js и любо­го язы­ка, кото­рый пере­но­сит­ся в Javascript. Для дру­гих язы­ков вы може­те уста­но­вить рас­ши­ре­ния отлад­чи­ка. Настрой­ки отлад­ки мож­но сохра­нить в фай­ле launch.json.

Послед­няя кноп­ка в Activity Bar содер­жит меню для досту­па к рас­ши­ре­ни­ям на Marketplace.

Цен­тром GUI явля­ет­ся ваш редак­тор, кото­рый вы може­те раз­де­лить вклад­ка­ми для редак­ти­ро­ва­ния кода. Вы так­же може­те изме­нить вид редак­ти­ро­ва­ния на сеточ­ную систе­му или парал­лель­ные файлы.

После созда­ния ново­го фай­ла через меню File  в новой вклад­ке откро­ет­ся пустой файл, а после сохра­не­ния его имя будет отоб­ра­жать­ся на боко­вой пане­ли Explorer. Созда­ние папок про­ис­хо­дит при помо­щи кли­ка пра­вой кноп­кой мыши по боко­вой пане­ли Explorer; здесь выбе­ри­те New Folder. Вы може­те раз­вер­нуть пап­ку, клик­нув на ее имя; пере­та­щив фай­лы и пап­ки в верх­ние части иерар­хии, вы пере­ме­сти­те их в новое место.

Вы може­те полу­чить доступ к тер­ми­на­лу с помо­щью соче­та­ния кла­виш CTRL+SHIFT+`. Так­же мож­но нажать Terminal в рас­кры­ва­ю­щем­ся меню ввер­ху и выбрать New Terminal. Тер­ми­нал откро­ет­ся в ниж­ней пане­ли. Его рабо­чий ката­лог будет нахо­дить­ся в рабо­чей обла­сти про­ек­та, кото­рая содер­жит фай­лы и пап­ки, пока­зан­ные на боко­вой пане­ли Explorer.