본문 바로가기
Information Technology/Programming

Code Server - 구축편

by hakawati 2020. 10. 3.

페이지 목차

  • Code Server - 구축편

컨텐츠 목차

  • 소개
  • 구축
    • code-server 구축 및 설정
      • code-server 구축
      • code-server 운영 옵션
      • code-server 시스템 서비스 설정
    • NginX 구축 및 설정
      • NginX 구축 
      • NginX의 패스워드 인증 구성
      • NginX와 Certbot을 이용한 https 통신 설정
  • 참고

소개

대 클라우드 시대가 시작되면서 IDE를 로컬에 설치할 필요 없이 서버에 IDE를 구축하고 언제 어디서든 브라우저로 코딩을 할 수 있는 시대가 왔다. 이러한 환경은 개발자가 자신이 개발한 코드를 Github에 Push하고 다른 개발자가 Pull하여 받은 다음 개발하고, 충돌 문제를 해결하는 등의 환경을 실시간 동시 개발을 진행하도록 도와주어 더욱 편리한 개발을 할 수 있게 해준다. 또한 로컬에 설치된 라이브러리나 쿠버네틱스와 같은 환경도 일원화할 수 있다는 장점이 있다. 대표적인 클라우드 IDE는 구글의 Cloud Code, Amazon의 Cloud9과 구름의 goormIDE가 있다.

여기서 소개하려는 Cloud IDE는 Visual Studio Code를 서버 버전으로 제작된 code-server다. Visual Studio Code가 익숙하다면 code-server를 사용하는 것이 편리하다. 구글의 Cloud Code에서 Visual Studio Code를 사용할 수 있으나, 클라우드 IDE는 테스트하는 여러 환경에 대한 비용이 발생한다. 따라서, Private으로 운영하기 위해 자체 서버에 구축을 진행했다. code-server는 오픈소스고 공개되어 있다. 아주 감사하게도 라이선스는 MIT 라이선스를 채택했다. 상용/비사용 여부를 떠나 어떠한 조건 없이 무료로 사용할 수 있는 라이선스다. 

구축

code-server 구축 및 설정

code-server 구축

구축은 우분투 서버 18.04에서 진행되었다. 초기 운영체제 설치 시 운영체제 업데이트를 진행했고, 설치가 끝나면 openssh-server를 설치했다. 설치는 단순하게 다음 명령으로 진행할 수 있다. 포스팅하는 과정에 설치되는 버전은 3.5.0이다.

curl -fsSL https://code-server.dev/install.sh | sh
Ubuntu 18.04.5 LTS
Installing v3.5.0 deb package from GitHub releases.

+ mkdir -p ~/.cache/code-server
+ curl -#fL -o ~/.cache/code-server/code-server_3.5.0_amd64.deb.incomplete -C - https://github.com/cdr/code-server/releases/download/v3.5.0/code-server_3.5.0_amd64.deb
######################################################################## 100.0%######################################################################### 100.0%
+ mv ~/.cache/code-server/code-server_3.5.0_amd64.deb.incomplete ~/.cache/code-server/code-server_3.5.0_amd64.deb
+ sudo dpkg -i ~/.cache/code-server/code-server_3.5.0_amd64.deb
Selecting previously unselected package code-server.
(Reading database ... 67091 files and directories currently installed.)
Preparing to unpack .../code-server_3.5.0_amd64.deb ...
Unpacking code-server (3.5.0) ...
Setting up code-server (3.5.0) ...

To have systemd start code-server now and restart on boot:
  sudo systemctl enable --now code-server@$USER
Or, if you don't want/need a background service you can run:
  code-server

설치가 끝나면 code-server 명령으로 서버를 실행할 수 있다.

code-server
[2020-10-02T13:28:04.566Z] info  Wrote default config file to ~/.config/code-server/config.yaml
[2020-10-02T13:28:04.568Z] info  Using config file ~/.config/code-server/config.yaml
[2020-10-02T13:28:04.827Z] info  Using user-data-dir ~/.local/share/code-server
[2020-10-02T13:28:04.831Z] info  code-server 3.5.0 de41646fc402b968ca6d555fdf2da7de9554d28a
[2020-10-02T13:28:04.834Z] info  HTTP server listening on http://127.0.0.1:8080
[2020-10-02T13:28:04.834Z] info      - Using password from ~/.config/code-server/config.yaml
[2020-10-02T13:28:04.835Z] info      - To disable use `--auth none`
[2020-10-02T13:28:04.835Z] info    - Not serving HTTPS

code-server 운영 옵션

code-server는 환경 변수에 값을 설정하거나, 서버 동작시 옵션을 주거나, 설정 파일을 지정하여 다양한 옵션을 활용하여 서비스를 운영할 수 있다. code-server.dev/install.sh로 설치한 경우 설치한 사용자 디렉터리에서 .config/code-server/config.yaml 파일이 기본 설정 파일이 된다. 이 설정 파일에는 네 가지 설정이 구성된다.

bind-addr은 서버의 아이피와 포트 정보를 설정하며, auth는 패스워드 설정 유무(password 또는 none을 지정)를 결정한다. 패스워드 유형은 단순한 형태로 config.yaml을 수정하여 OTP를 사용하거나 LDAP, AD에 Join할 수 없다. auth를 password로 설정한 경우 password 키에 지정한 값으로 code-server에 로그인할 수 있다. 마지막으로 cert는 https 통신에 사용할 인증서를 의미한다. true로 설정하여 사용한 경우 로컬 인증서를 자동 생성해서 사용하는데 안전하진 않다. 사설 인증서를 사용할 경우 cert 대신 cert-key를 사용하여 인증서 경로를 지정할 수 있다.

vim .config/code-server/config.yaml
bind-addr: 127.0.0.1:8080
auth: password
password: 1bc76233f828b459af0a4a6f
cert: false

개인적으로 이런 방식의 서버 구성을 지원하는 것은 단편적인 사용에 용이할 수 있으나 확장성과 서버 운영 안전성에 좋진 않은 것 같다. 따라서 NginX를 구성하여 인증과 https 통신을 구성하는 것을 추천한다. 따라서 다음과 같이 설정을 변경한다.

vim .config/code-server/config.yaml
bind-addr: 127.0.0.1:8080
auth: none

code-server가 사용할 수 있는 옵션과 환경 변수 이름 등은 help 명령을 통해 확인할 수 있다.

code-server --help
[2020-10-02T15:44:33.999Z] info  Using config file ~/.config/code-server/config.yaml
code-server 3.5.0 de41646fc402b968ca6d555fdf2da7de9554d28a

Usage: code-server [options] [path]

Options
      --auth                The type of authentication to use. [password, none]
      --password            The password for password authentication (can only be passed in via $PASSWORD or the config file).
      --cert                Path to certificate. Generated if no path is provided.
      --cert-key            Path to certificate key when using non-generated cert.
      --disable-telemetry   Disable telemetry.
   -h --help                Show this output.
      --open                Open in browser on startup. Does not work remotely.
      --bind-addr           Address to bind to in host:port. You can also use $PORT to override the port.
      --config              Path to yaml config file. Every flag maps directly to a key in the config file.
      --socket              Path to a socket (bind-addr will be ignored).
   -v --version             Display version information.
      --user-data-dir       Path to the user data directory.
      --extensions-dir      Path to the extensions directory.
      --list-extensions     List installed VS Code extensions.
      --force               Avoid prompts when installing VS Code extensions.
      --install-extension   Install or update a VS Code extension by id or vsix. The identifier of an extension is `${publisher}.${name}`. To install a specific version provide `@${version}`. For example: 'vscode.csharp@1.2.3'.
      --enable-proposed-api Enable proposed API features for extensions. Can receive one or more extension IDs to enable individually.
      --uninstall-extension Uninstall a VS Code extension by id.
      --show-versions       Show VS Code extension versions.
      --proxy-domain        Domain used for proxying ports.
   -n --new-window          Force to open a new window. (use with open-in)
   -r --reuse-window        Force to open a file or folder in an already opened window. (use with open-in)
 -vvv --verbose             Enable verbose logging.

code-server 시스템 서비스 설정

code-server가 백그라운드에서 동작, 시스템이 부팅 시 자동으로 실행 등 운영에 있어 보조적으로 도움이 되도록 운영하려면 시스템이 관리하도록 설정하는 것이 좋다.

systemctl --user enable --now code-server
Created symlink /home/hakawati/.config/systemd/user/default.target.wants/code-server.service → /usr/lib/systemd/user/code-server.service.

이렇게 설정하면 바로 code-server는 systemctl의 관리 대상에 포함된다. 잘 동작하는지는 다음과 같이 확인할 수 있다.

systemctl --user status code-server
● code-server.service - code-server
   Loaded: loaded (/usr/lib/systemd/user/code-server.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2020-10-02 15:54:22 UTC; 4min 40s ago
 Main PID: 7389 (node)
   CGroup: /user.slice/user-1000.slice/user@1000.service/code-server.service
           ├─7389 /usr/lib/code-server/lib/node /usr/lib/code-server
           ├─7407 /usr/lib/code-server/lib/node /usr/lib/code-server
           ├─7420 /usr/lib/code-server/lib/node /usr/lib/code-server/lib/vscode/out/vs/server/fork
           └─7434 /usr/lib/code-server/lib/node /usr/lib/code-server/lib/vscode/out/bootstrap-fork --type=extensionHost

Oct 02 15:54:22 codeserver systemd[1381]: Started code-server.
Oct 02 15:54:23 codeserver code-server[7389]: [2020-10-02T15:54:23.018Z] info  Using config file ~/.config/code-server/config.yaml
Oct 02 15:54:23 codeserver code-server[7389]: [2020-10-02T15:54:23.155Z] info  Using user-data-dir ~/.local/share/code-server
Oct 02 15:54:23 codeserver code-server[7389]: [2020-10-02T15:54:23.158Z] info  code-server 3.5.0 de41646fc402b968ca6d555fdf2da7de9554d28a
Oct 02 15:54:23 codeserver code-server[7389]: [2020-10-02T15:54:23.160Z] info  HTTP server listening on http://127.0.0.1:8080
Oct 02 15:54:23 codeserver code-server[7389]: [2020-10-02T15:54:23.160Z] info    - No authentication
Oct 02 15:54:23 codeserver code-server[7389]: [2020-10-02T15:54:23.160Z] info    - Not serving HTTPS

이제 시스템에 문제가 생겨 재부팅이 되더라도 자동으로 code-server가 운영될 것이다. 로그는 남겨지지 않도록 설정해도된다. NginX에서 시스템 로그로 생성되기 때문이다.

NginX 구축 및 설정

NginX 구축

NginX는 Apache처럼 웹 서버 애플리케이션이다. 여기서는 code.hakawati.co.kr(필자가 code-server에 할당할 도메인)로 접속하면 NginX가 수신한 후 code-server의 127.0.0.1:8080으로 리디렉션하여 IDE를 브라우저로 사용할 수 있다. 이렇게 사용하려면 Proxy Redirection 역할을 하도록 구성한다. 설치는 apt로 간단하게 진행한다.

sudo apt install nginx

Proxy Redirection을 위해 NginX 설정 파일을 생성할 필요가 있는데, https 통신을 설정하기 앞서 http 통신으로 접속하도록 설정 파일을 생성한다.

sudo vim /etc/nginx/sites-available/code-server.conf
upstream code-server {
        server 127.0.0.1:8080;
}

server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name codeserver;

        location / {
                proxy_pass http://code-server;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection upgrade;
                proxy_set_header Host $host;
                proxy_set_header Accept-Encoding gzip;
        }
}

Apache 디폴트 페이지 처럼 NginX도 디폴트 페이지가 있다. 디폴트 페이지를 비활성화하고, code-server는 활성화하는 작업을 진행한다.

sudo rm /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/code-server.conf /etc/nginx/sites-enabled/code-server.conf

설정 파일에 오타가 없는지, 동작하는데 문제가 없는지 테스트를 진행하고, 문제가 없다면 NginX 서비스를 재시작한다. code-server에 http로 접근되는 것을 확인할 수 있다.

sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
sudo systemctl reload nginx.service

code-server 동작 확인

NginX의 패스워드 인증 구성

웹 서비스에 로그인 없이 바로 접근되는 것은 불안한 일이다. code-server는 터미널을 제공하기에 만약 공인 아이피였다면 공격자가 시스템에 침투한 것과 동일한 수준의 서비스를 제공한다. NginX의 간단한 사용자 인증 기능을 넣어 안전성을 조금이라도 높일 수 있다. NginX의 패스워드 설정은 htpasswd를 이용하여 구성할 수 있다. htpasswd를 사용하려면 apache2의 유틸리티를 설치하여 htpasswd 명령을 이용하거나 Openssl의 passwd 명령을 이용하여 구성할 수 있다.

sudo apt install apache2-utils

code-server의 패스워드 인증은 사용자 구분을 할 수 없는데, htpasswd는 사용자별 패스워드를 구성할 수 있다. 최초 사용자와 패스워드 파일을 생성할 때 -c 옵션을 사용하며, 추가 사용자와 패스워드 파일을 생성할 땐 -c 옵션을 빼고 사용한다.

sudo htpasswd -c /etc/nginx/.htpasswd hakawati
New password:
Re-type new password:
Adding password for user hakawati

NginX의 설정 파일인 code-server.conf 파일의 location /auth_basicauth_basic_user_file를 설정한다.

sudo vim /etc/nginx/sites-available/code-server.conf
upstream code-server {
        server 127.0.0.1:8080;
}

server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name codeserver;

        location / {
                proxy_pass http://code-server;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection upgrade;
                proxy_set_header Host $host;
                proxy_set_header Accept-Encoding gzip;
                auth_basic "Authentication Page";
                auth_basic_user_file /etc/nginx/.htpasswd;
        }
}

sudo nginx -t 명령으로 설정 파일에 오류가 있는지 확인하고, 문제 없다면 sudo systemctl reload nginx.server로 NginX를 재시작한다. 그리고 다시 code-server에 방문하면 다음과 같이 계정과 패스워드를 입력하는 창을 볼 수 있다.

로그인 설정 테스트

NginX와 Certbot을 이용한 https 통신 설정

암호화 통신은 네트워크 통신에 있어서 중요한 보안 요소 중 하나다. NginX를 이용하고 있다면 Certbot으로 무료 인증서를 쉽게 설정할 수 있다. Certbot을 설치한다.

sudo apt install certbot python3-certbot-nginx

certbot은 http-01 방식과 dns-01 방식으로 https 인증서를 발행하기 앞서 정당한 인증서 발행인지 확인하는 과정을 진행한다. http-01 방식은 공인 아이피가 필요하고, dns-01 방식은 도메인이 필요하다. 목적에 따라 사용하는 방식이 다르기에 도메인은 고정으로 사용하고 서버 아이피를 자유롭게 변경하고 싶다면, 또는 서브 도메인이 어떤 것이 오든 인증서가 받아들이게 구성하려면 dns-01 방식을 사용해야한다. 도메인 소유주가 도메인의 txt 레코드에 인증 값을 설정하여 인증서를 발행할 수 있다.

Are you OK with your IP being logged? 질문에 무조건 y를 해야 진행할 수 있다. 생성된 8TFRb_ecZvl8wxj8uY81Xo41rRdAGxDaJhEybeOqM3g 값은 _acme-challenge.code.hakawati.co.kr 키로 매칭되도록 도메인의 TXT 레코드에 등록한다. 그리고 Enter를 누르면 TXT 키의 값을 확인하고 검증이 통과되면 /etc/letsencrypt/live/code.hakawati.co.kr/ 디렉터리에 공개키인 fullchain.pem과 비밀키인 privkey.pem이 생성된 것을 확인할 수 있다.

sudo certbot -d code.hakawati.co.kr --manual --preferred-challenges dns certonly
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for code.hakawati.co.kr

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not
your server, please ensure you're okay with that.

Are you OK with your IP being logged?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.code.hakawati.co.kr with the following value:

8TFRb_ecZvl8wxj8uY81Xo41rRdAGxDaJhEybeOqM3g

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/code.hakawati.co.kr/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/code.hakawati.co.kr/privkey.pem
   Your cert will expire on 2020-12-31. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - 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

이제 NginX의 설정 파일인 code-server.conf 파일을 수정하여 https 통신을 하도록 구성한다. 이 과정은 certbot이 자동으로 구성하도록 도와주기 때문에 다음과 같이 진행한다.

첫번째 질문은 인증서를 다시 설치하겠는가? 아니면 인증서를 다시 받을 것인가? 를 질문하는 것이다. 다시 설치하는 1을 선택한다. 두번째 질문은 http로 접근하면 https로 리디렉션하겠는가의 질문이다. 리디렉션하도록 2을 선택한다.

sudo certbot --nginx -d code.hakawati.co.kr
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Cert not yet due for renewal

You have an existing certificate that has exactly the same domains or certificate name you requested and isn't close to expiry.
(ref: /etc/letsencrypt/renewal/code.hakawati.co.kr.conf)

What would you like to do?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Attempt to reinstall this existing certificate
2: Renew & replace the cert (limit ~5 per 7 days)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1
Keeping the existing certificate
Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/code-server.conf

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
Redirecting all traffic on port 80 to ssl in /etc/nginx/sites-enabled/code-server.conf

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://code.hakawati.co.kr

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=code.hakawati.co.kr
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/code.hakawati.co.kr/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/code.hakawati.co.kr/privkey.pem
   Your cert will expire on 2020-12-31. 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"
 - 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

인증서가 잘 생성되었는지는 다음과 같이 확인할 수 있다.

sudo certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
  Certificate Name: code.hakawati.co.kr
    Domains: code.hakawati.co.kr
    Expiry Date: 2020-12-31 14:23:20+00:00 (VALID: 89 days)
    Certificate Path: /etc/letsencrypt/live/code.hakawati.co.kr/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/code.hakawati.co.kr/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

설정 로그처럼 code-server.conf 파일을 자동으로 인식하여 https 통신을 하도록 내용이 구성된다. 기존에 우리가 구성했던 부분을 삭제하여 설정을 정리한다.

삭제된 설정

server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name codeserver;

        location / {
                proxy_pass http://code-server;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection upgrade;
                proxy_set_header Host $host;
                proxy_set_header Accept-Encoding gzip;
                auth_basic "Authentication Page";
                auth_basic_user_file /etc/nginx/.htpasswd;
        }
}

최종 설정

upstream code-server {
        server 127.0.0.1:8080;
}

server {
    server_name code.hakawati.co.kr; # managed by Certbot

        location / {
                proxy_pass http://code-server;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection upgrade;
                proxy_set_header Host $host;
                proxy_set_header Accept-Encoding gzip;
                auth_basic "Authentication Page";
                auth_basic_user_file /etc/nginx/.htpasswd;
        }

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/code.hakawati.co.kr/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/code.hakawati.co.kr/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    if ($host = code.hakawati.co.kr) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

        listen 80 ;
        listen [::]:80 ;
    server_name code.hakawati.co.kr;
    return 404; # managed by Certbot
}

이제 https로 접속하면 code-server가 잘 동작하는 것을 확인할 수 있다.

certbot을 통해 설정한 무료 인증서는 90일 갱신 주기를 가지며, certbot의 유료 인증서의 갱신 주기는 1년이다. 공인 아이피로 인증하는 http-01이 아닌 dns-01 방식으로 구성했기에 자동 갱신이 되지 않는다. 수동으로 갱신하려면 다음 명령 후 2번을 선택하면 수동 갱신(특히 이 명령으로 갱신할 경우 강제 갱신된다.)을 할 수 있다.

sudo certbot -d code.hakawati.co.kr --manual --preferred-challenges dns certonly
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Cert not yet due for renewal

You have an existing certificate that has exactly the same domains or certificate name you requested and isn't close to expiry.
(ref: /etc/letsencrypt/renewal/code.hakawati.co.kr.conf)

What would you like to do?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Keep the existing certificate for now
2: Renew & replace the cert (limit ~5 per 7 days)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Renewing an existing certificate
Performing the following challenges:
dns-01 challenge for code.hakawati.co.kr

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not
your server, please ensure you're okay with that.

Are you OK with your IP being logged?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.code.hakawati.co.kr with the following value:

8TFRb_ecZvl8wxj8uY81Xo41rRdAGxDaJhEybeOqM3g

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/code.hakawati.co.kr/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/code.hakawati.co.kr/privkey.pem
   Your cert will expire on 2020-12-31. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - 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의 숨겨진 옵션과 리눅스의 명령을 조합해 자동화 할 수 있다. 아래 명령을 쉘 스크립트 파일로 만들고 crontab을 이용하여 3달마다 갱신하도록 설정하면 된다. 당연히 crontab에 의해 실행되는 명령의 주체는 root 여야 한다. 참고로 crontab은 sudo crontab -e를 이용하면 기본으로 root 권한으로 동작하게 설정되며, /etc/crontab 파일을 수정할 경우 root 사용자로 실행한다는 것을 명시해야 한다.

echo "\n" | sudo certbot --text --agree-tos -d code.hakawati.co.kr --manual --preferred-challenges dns --expand --renew-by-default --manual-public-ip-logging-ok certonly --post-hook "systemctl start nginx.service"

인증서 기간까지 고려해 스크립트를 만든다면 다음과 같다.

#!⁄bin⁄bash
VALID=($(certbot certificates | grep VALID))
VALID_DATE=$(expr ${VALID[5]})
if [ $VALID_DATE -lt 30 ]; then 
	echo "\n" | certbot --text --agree-tos -d code.hakawati.co.kr --manual --preferred-challenges dns --expand --renew-by-default --manual-public-ip-logging-ok certonly --post-hook "systemctl start nginx.service"
fi

참고

 

How to Install Visual Studio Code - Server IDE on Ubuntu 20.04 LTS

Code-server is a Visual Studio Code (VS) that can be run remotely on the server and which is accessible through a web browser. It allows you to create...

www.howtoforge.com

 

How To Set Up Password Authentication with Nginx on Ubuntu 14.04 | DigitalOcean

When setting up a web server, there are often sections of the site that you wish to restrict access to. Web applications often provide their own authentication and authorization methods, but the web server itself can be used to restrict access if thes

www.digitalocean.com

 

AWS EC2에 code-server 설치하고 커스텀 도메인 ssl 배포까지

code-server는 웹에서 VS-Code를 쓸 수 있도록 해주는 서비스다. 전역 후 아이패드로 코딩할 생각에 행복회로를 돌리던 나는 미리 구현해놓기로 했다...

velog.io

 

Renew domains using certbot and using DNS challenge

I created several SSL certificates for several domains using the standalone method. I am only interested in the certificates, without server integration. They are now for renewal. So, I ran: cert...

serverfault.com

 

User Guide — Certbot 1.8.0.dev0 documentation

To view a list of the certificates Certbot knows about, run the certificates subcommand: Certificate Name shows the name of the certificate. Pass this name using the --cert-name flag to specify a particular certificate for the run, certonly, certificates,

certbot.eff.org

 

How to setup Code Server on Ubuntu 20.04 LTS

Code-server is a cloud development environment based on the popular code editor Visual Studio Code. Visual Studio Code is a powerful code editor developed by Microsoft capable of running on multiple platforms. It supports many languages built-in and a lot

bitlaunch.io

댓글2