GitLab 13.5.X+ 업그레이드시 nginx socket 파일 관련 이슈 (502 Bad Gateway, No such file or directory)

GitLab Omnibus를 nginx와 함께 설치하여 사용하고 있었습니다. 13.5.X 버전 이상으로 업그레이드할 일이 있었는데, 어이없는 일이 발생했네요.

뜬금없는 502 오류.

NGINX를 웹서버로 사용중이고, 이 뒤에 Proxy 형식으로 서버를 운영중입니다. 업그레이드를 하자마자 이슈가 생겼네요. 찾아보니까 정말 어이없는 이유였습니다. 아래는 NGINX 설정파일입니다(보통의 설치와 동일한 내용으로 되어있습니다).

??????????

파일이 없답니다. 분명 gitlab-ctl start로 돌려놓았는데….
그래서 한번 찾아보니, 소켓 파일 위치가 변경되었다는 GitLab 이슈 글이 눈에 띄네요.

NGINX configuration의 내용을 아래처럼 바꿉니다.

# 기존 코드
upstream gitlab-workhorse {
    server unix:/var/opt/gitlab/gitlab-workhorse/socket fail_timeout=0;
}

# 변경 코드
upstream gitlab-workhorse {
    server unix:/var/opt/gitlab/gitlab-workhorse/sockets/socket fail_timeout=0;
}

간단히 socket 부분을 sockets/socket 으로 변경하면 문제없이 작동합니다.
정말로 Documentation이 중요한 부분인데 다행히 Issue에 내용이 있었군요…

[Tutorial] Installing OpenCV on Raspberry Pi 4B with Ubuntu 20.04

This guide will show how to install OpenCV 4.5.0 (latest) on Raspberry Pi 4B running Ubuntu Server 20.04, where architecture is ARM64 (aarch64) – which is unusal part.

but installing procedure never changes – thanks to CMake. We can build own library within Raspberry Pi with following tutorials.

OpenCV-aarch64

This is a guide to natively install OpenCV on aarch64/arm64 devices (Updated 2020-12-13, by @LimeOrangePie)

Pre-requisites

Your aarch64 device should have Ubuntu/Debian/Armbian OS flashed on it.

Steps

  1. Install dependencies
sudo apt-get install python3-dev python3-pip python3-numpy

sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev  libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev protobuf-compiler libgflags-dev libgoogle-glog-dev libblas-dev libhdf5-serial-dev liblmdb-dev libleveldb-dev liblapack-dev libsnappy-dev libprotobuf-dev libopenblas-dev libgtk2.0-dev libboost-dev libboost-all-dev libeigen3-dev libatlas-base-dev libne10-10 libne10-dev

pip3 install neon

sudo apt-get install libneon27-dev

sudo apt-get install libneon27-gnutls-dev
  1. Download Source
cd ~/

git clone https://github.com/opencv/opencv.git -b 4.5.0 --single-branch

git clone https://github.com/opencv/opencv_contrib.git -b 4.5.0 --single-branch
  1. Configuring OpenCV using cmake:

Put your username in place of [username] below for the path to opencv_contrib/modules

mkdir opencv_build

cd opencv_build

cmake -D CMAKE_BUILD_TYPE=RELEASE -D ENABLE_NEON=ON -D ENABLE_TBB=ON -D ENABLE_IPP=ON -D ENABLE_VFVP3=ON -D WITH_OPENMP=ON -D WITH_CSTRIPES=ON -D WITH_OPENCL=ON -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules/ ../opencv
  1. Compilation:
make -j${nproc}

sudo make install
  1. Testing:
python3
>>import cv2
>>

Repository: https://github.com/jungin500/OpenCV-aarch64

Original Repository: https://github.com/huzz/OpenCV-aarch64

[튜토리얼] Oracle Cloud로 내 개인 서버를 열어보자

오늘은 Oracle Cloud를 이용해 평생 무료의(!!!) 개인 서버를 구축해보도록 하겠습니다.
앞 부분에는 간단한 배경 설명으로 채웠습니다. 실제 구축 과정은 여기(클릭)서 시작합니다.

Oracle Cloud란?

요즘 들어 클라우드 컴퓨팅이 대세인 것 같습니다. 인터넷 쇼핑으로 유명한 Amazon의 Amazon Web Service(링크), 세계 최대 검색 엔진 Google의 Google Cloud(링크), Microsoft사의 Azure까지, 가장 유명한 클라우드 서비스라고 하면 저는 이 3개가 먼저 생각납니다. 이 외에도, 중소규모의 클라우드 서비스들이 다양히 존재하고 또 새로이 우후죽순으로 생겨나는 클라우드 서비스들이 있습니다.

Java와 SQL로 유명한 Oracle 역시, 기존 기업을 대상으로 클라우드 서비스를 제공해주고 있었습니다. 그러던 중, 2019년 9월 Free Tier라는 이름으로 평생 무료 클라우드 서비스를 선보였습니다(링크). 기존 클라우드 서비스 업계에서 기간 무료(AWS – 12개월), 혹은 크레딧 제공(Azure, Google Cloud) 등의 이벤트성으로 클라우드를 무료로 사용해볼 수 있었지만, 이제는 무료로 사용할 수 있는 클라우드 서비스가 있다는 점에서 그 강점이 있습니다.

클라우드 리젼 및 가용성

현재 2020년 8월 기준으로, Oracle Cloud에는 한국 내 2개의 Region(서울, 춘천)이 존재합니다. 사실상 위에서 언급한 3대 클라우드사들은 모두 한국에 Region이 존재합니다. 다만 춘천이라는 생소한(!) 곳에 리젼이 존재하는 것은 처음 봐서 너무 신기했습니다.

사실 클라우드 리젼 그 자체보다는 1. 가격과 2. 네트워크 연결성, 그리고 3. 가용성이 가장 큰 선택의 요소가 될 것 같습니다. 저는 체감적으로는 Oracle사가 가격으로는 가장 저렴한 클라우드 서비스가 아닐까 하고 생각합니다. 실제로도 Oracle은 AWS와 비교하며 가격 경쟁력을 무기로 마케팅을 하고 있습니다.

다만 저는 Azure를 주 클라우드로 사용하고 있습니다. 주 신분이 학생이라, 학생 크레딧으로 체험 형식으로 사용중입니다. 개인적으로 테스트해본 결과 네트워크가 가장 빠른 클라우드가 Azure였네요.

1. Oracle Cloud 가입

본격적으로 Oracle Cloud를 사용해보도록 하겠습니다. 여기서는 가입보다는 클라우드 인터페이스 사용을 중점으로 언급하도록 하겠습니다. 가입은 여기(링크)서 “무료로 시작하기” 링크로 시작하실 수 있습니다.

2. 홈 리젼(Home Region) 설정

Oracle Cloud 내 Region을 의미하는 “인프라 지역”

Oracle Cloud를 가입할 당시, 홈 리젼을 선택하는 과정이 포함되어 있습니다. 이 과정에서 “South Korea Central (ap-seoul-1)”과 “South Korea North (ap-chuncheon-1)” 둘 중에서 선택할 수 있습니다 (한번 선택한 리젼은 바꾸기 어려우므로 신중하게 정하시는것이 좋습니다). 저는 춘천을 선택하도록 하겠습니다.

3. VM 인스턴스 생성

Oracle Cloud 첫 화면

Oracle Cloud의 첫 화면으로 이동합니다(좌측 상단의 Oracle Cloud 로고를 클릭하시면 됩니다). 위 빠른 작업 창에 “VM 인스턴스 생성”을 눌러 VM 생성을 시작합니다.

VM 인스턴스 생성 화면 – 이미지 선택 창

VM 인스턴스 생성을 위해 위 인스턴스 이름(ID)을 입력합니다. 저는 임의로 my-vm-instance라는 이름을 사용했습니다. 다음으로, 세번째 선택란에서 “이미지 변경”을 선택해 위 그림처럼 이미지 선택 창을 띄웁니다.

여기서 이미지란, 마치 PC를 새로 설치할 때 사용할 부팅 USB를 고르는 것과 동일한 작업입니다. 어떤 운영체제를 설치할지 고르는 과정으로, 저는 최신 Ubuntu 20.04를 선택하도록 하겠습니다. (선택한 후 반드시 맨 아래까지 페이지를 내려 “이미지 선택”을 눌러야 적용됩니다.)

SSH 개인 키(여기서는 전용 키) 다운로드 화면

마지막으로, SSH 키 추가 부분에서 전용 키 다운로드 버튼을 클릭해 SSH 개인 키를 다운로드합니다. 추후 이 키를 이용해 SSH 원격 접속이 가능하므로 반드시 이 키를 다운로드하고 진행해야 합니다!!

4. 인스턴스 접속

생성중인 VM 인스턴스

인스턴스가 다 만들어지면, 우측 기본 VNIC 아래, 전용 IP 주소가 생성됩니다. 이 주소가 곧 우리가 외부에서 SSH로 접속하는 주소입니다. 이 주소를 이용해 접속하도록 합니다. 그러나…

응? Windows 10에서 SSH로 접속이 안된다.

위 화면은, 다운로드 받은 개인 키를 이용해, Windows 10에서 WSL나 기본 SSH 클라이언트로 해당 IP에 접속할 때 발생하는 오류입니다. (해결 방법)

해결하고 접속을 완료한 화면

이제 이 VM에, 원하시는 어플리케이션을 설치하셔서 웹 서버 등을 운용할 수 있습니다.

참고자료

[1] Windows SSH: Permissions for ‘private-key’ are too open
[2] Oracle Cloud Infrastructure (OCI) : Create a Compute VM

WSL2 CUDA – WSL2에서 Ubuntu와 CUDA 사용하기

Windows Insider Preview 버전 문제 (2020-10-16 빌드에서 해결됨)

Windows 10 Insider Preview 버전에 따라서, WSL2나 CUDA가 아예 동작하지 않는 경우가 많습니다. 여기에서 버전별 작동여부를 확인 후에 설치하시는것이 좋을것 같네요.

WSL2에서 Ubuntu와 CUDA 사용하기

이제 Windows 10 Build 2020에서는 Windows Subsystem for Linux 2와 GPU 가속 지원 기능을 함께 사용할 수 있습니다. 이 가이드에서는 Windows 10 디바이스에서 WSL2와 Ubuntu를 이용하여 CUDA 개발 환경을 구축할 수 있도록 합니다.

이 튜토리얼에서는 WSL에 Docker를 구동하여, 결과적으로 Jupyter Notebook 내에서 CUDA를 End-to-End로 실행할 수 있도록 합니다. 구체적으로는 아래와 같은 구성으로 진행됩니다.

In the Linux guest, the dxgkrnl driver creates the /dev/dxg device for user mode components to access. The requests that come from GPU applications get forwarded to the Windows host system via VMBus where for those the host dxgkrnl driver makes calls to the KMD (Kernel Mode Driver) DDI handlers.
WSL2에서 dxgkrnl(자세히 보기)을 통한 NVIDIA GPU 지원

Windows 10 Insider Preview 채널로 변경하기

이 과정에 앞서, 설치된 Windows 10을 2020년 6월 17일자로 릴리즈된 Windows 10 Insider 빌드로 업그레이드해야 합니다. 이를 위해서 Windows Insider에 가입하여, 사용중인 기기를 Dev Channel에 등록할 수 있습니다(주로 “Fast Ring” 또는 한국어로 “초기”라고도 쓰입니다). 이 후, Windows 10 빌드 20150 버전으로 업그레이드할 수 있습니다.

Windows Insider 프로그램에 가입해서 프리뷰 버전으로 업데이트하기

Windows 10 Insider Preview 빌드 시작 페이지 또는 Windows 10 21H1 빌드 배포 노트(홍차의 꿈님 블로그)를 참조하여 개발자 빌드에 참여하는 방법을 확인하세요.

WSL2 활성화하기 – Step #1

먼저, WSL Version 1을 먼저 활성화합니다. 이 과정 이후, 추후에 WSL2로 업그레이드를 합니다.

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
WSL1 활성화 과정

필요시 재부팅을 해야할 수 있습니다. 보통의 경우 바로 이어서 WSL2를 활성화할 수 있습니다.

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

이 뒤, Windows를 재시작합니다.

Restart-Computer

WSL2 활성화하기 – Step #2

이제 재부팅을 완료하면, 시스템이 WSL2를 구동할 수 있는 상태입니다. 다만, 아직은 호환성 등을 이유로 기본값은 WSL Version 1입니다. 아래 코드로 기본 버전을 변경할 수 있습니다(원할 시 Distro마다, 기존 Version 1으로 다시 설치할 수 있습니다)

wsl.exe --set-default-version 2
WSL2를 기본값으로 설정하기

Ubuntu를 WSL에 설치하기

Microsoft Store으로부터 Ubuntu를 설치할 수 있습니다(링크).

Microsoft Store으로부터 WSL Ubuntu 다운로드

WSL에 Ubuntu를 다른 방식으로 설치할 수 있습니다(링크, 영문).

(옵션) Windows Terminal 설치하기

Windows Terminal은 MS사에서 개발한 대체 터미널 어플리케이션입니다. 기존 MobaXterm이나 Cygwin, ConEmu 등의 솔루션을 대체할 수 있는 Lightweight한 오픈소스 터미널 도구입니다(링크 또는 GitHub). 화면 렌더링의 GPU 가속 및 커스터마이징 등, 다양한 기능들을 가지고 있으며 기존 Windows의 콘솔(cmd, powershell)을 이어 더 나은 사용성을 제공합니다.

Microsoft Store으로부터 Windows Terminal 다운로드

WSL에서 Ubuntu 설치하기

Windows의 시작 메뉴에서 Ubuntu를 선택하고, 초기 실행이므로 WSL내의 Ubuntu 사용자를 설정합니다. 이 Ubuntu 사용자Windows 사용자는 독립입니다(서로 관계가 없으며 이름이 같아도 됩니다).

WSL 초기 실행 시 Linux 계정(사용자) 생성하기

이전 단계에서 Windows Terminal을 다운로드받았다면, 사용자를 생성했던 이전 콘솔을 닫고, + 아이콘을 눌러 새로운 Ubuntu 콘솔을 열 수 있습니다:

새로운 Ubuntu 콘솔 열기

이제, 설치가 완료되었으므로 Ubuntu가 WSL2에서 구동되는지 확인해봅니다:

uname -r
Ubuntu의 커널 버전 확인

커널 버전을 확인했을 때, 4.19.121보다 높아야 합니다.
※ 그렇지 않다면, 아래 명령어를 cmd 또는 powershell 터미널에서 실행해보세요:

wsl.exe --update

위 명령어를 실행한 뒤에도 동일한 커널 버전으로 나타난다면(WSL이나 Windows를 재시작해야할 수도 있습니다), Windows Updates 설정에서 “고급 옵션 > Windows를 업데이트할 때 다른 Microsoft 제품에 대한 업데이트 받기”가 켜져 있는지 확인합니다:

Windows Update “고급 옵션” 창
(변경할 설정확인이 쉽도록 한글로 써 두었습니다.)

이 뒤에, Windows Update를 다시 확인합니다.

Windows 업데이트 시 “Windows Subsystem for Linux Update” 표시

Windows 10용 NVIDIA 드라이버 설치

CUDA on WSL용 NVIDIA 그래픽 드라이버(WDDM 2.9) 다운로드(링크)

이 다음, 시스템에 설치된 GeForce 또는 Quadro 그래픽카드에 따라 적절한 드라이버를 다운로드합니다. 몇 달 내로 Windows Update를 통해 드라이버가 배포될 예정이지만, 그 때까지는 직접 설치하는 과정이 필요합니다.

드라이버를 얼리-엑세스로 다운로드하기 위해서는 NVIDIA Developer Program에 가입되어 있어야 합니다. NVIDIA 개발자 블로그(영문)에서 CUDA on WSL에 관련한 기술적 내용을 찾아볼 수 있습니다.

WSL에 Docker 설치

기본적으로 Canonical에서 제공하는 Docker를 설치할 수 있습니다(Docker Hub에서 제공하는 최신 Docker Engine을 설치하기 위해서는 아래 명령어 대신 이 링크의 튜토리얼을 따라하시면 됩니다. 영어입니다.)

sudo apt -y install docker.io
WSL2 Ubuntu에 Canonical 기본 레포지토리 Docker(docker.io 패키지) 설치

sudo 없이 docker 명령어를 이용하기 위해서는, 추가로 아래 명령어를 입력할 수 있습니다(보안상 이슈가 있을 수 있으며, 선택입니다):

sudo adduser $USER docker

NVIDIA Container Toolkit 설치

변수 distribution을 설정하고, NVIDIA 레포지토리 GPG 키를 가져온 뒤, NVIDIA 레포지토리를 Ubuntu의 apt 패키지 매니저에 추가합니다.

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)

curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -

curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

curl -s -L https://nvidia.github.io/libnvidia-container/experimental/$distribution/libnvidia-container-experimental.list | sudo tee /etc/apt/sources.list.d/libnvidia-container-experimental.list
Apt 패키지 매니저에 NVIDIA 레포지토리 추가

Ubuntu의 기본 레포지토리를 한국 서버로 변경합니다. apt updateapt upgrade 등의 작업이 훨씬 빨라집니다.

sudo sed -i "s/archive.ubuntu.com/mirror.kakao.com/g" /etc/apt/sources.list

Ubuntu의 apt 레포지토리를 초기화한 뒤, NVIDIA 런타임을 설치합니다.

sudo apt update && sudo apt install -y nvidia-docker2
apt 패키지 매니저를 통한 NVIDIA 컨테이너 런타임 설치 과정

설치 완료 시, 모든 Ubuntu 터미널을 종료하고, Powershell 터미널을 열어 모든 Ubuntu WSL 인스턴스를 종료합니다:

wsl.exe --shutdown Ubuntu
WSL Ubuntu 인스턴스 종료

GPU 컴퓨팅 테스트

새로운 Ubuntu 터미널을 열어, Docker 서비스를 시작합니다.

sudo service docker start

그리고 아래 명령어를 실행합니다:

sudo docker run --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark

모든 과정이 이상없이 진행되었다면, 아래와 같이 GPU의 성능 정보들이 정상적으로 표시됩니다:

CUDA sample 코드 실행 결과

Tensorflow 컨테이너 시작하기

새로운 Ubutnu 터미널을 열어, 아래 명령어를 실행합니다:

docker run -u $(id -u):$(id -g) -it --gpus all -p 8888:8888 tensorflow/tensorflow:latest-gpu-py3-jupyter
Tensorflow 실행 가능한 Jupyter Notebook가 GPU와 함께 구동

또다른 새로운 Ubuntu 터미널을 열어, wslview를 입력 후, 그 뒤에 Jupyter Notebook URL을 입력합니다. 단, 여기서 127.0.0.1localhost로 바꿔 입력합니다!

wslview http://localhost:8888/?token=a83a1ad288a7bf1bd1deb694c8a7f19223c8d0baa7d5fb3c

기본 브라우저에 Jupyter Notebook이 실행되고, 이를 통해 GPU 가속이 가능한 Tensorflow 라이브러리를 사용할 수 있습니다! 이제 Tensorflow, CUDA를 WSL에서 사용할 수 있습니다.

Related blog posts

Additional resources

번역 원본

https://ubuntu.com/blog/getting-started-with-cuda-on-ubuntu-on-wsl-2

Sharif Judge × OpenCV 4.0.1 연동 사용기 – Part 1

설치를 해보자

Sharif Judge는 온라인 채점 프로그램을 Web과 Bash 코드로 구현한 Application이다. 모 교수님이 이걸로 채점을 하고 계신다지 실제로 써보면 백준과 비슷하다. 다만 간단하게 과제 풀이 형식으로만 되어있고, 언어도 Python2/3, Java, C, C++ 이렇게만 지원한다. 정말 과제 내기엔 딱좋은 어플리케이션이다…

준비물

맨땅에 헤딩

먼저 필요한 패키지를 설치하는 것부터 시작해보자. 여기서는 Ubuntu 18.04에 PHP 7.2를 사용한다.

sudo apt-get install apache2 libapache2-mod-php7.2 \
    php7.2 php7.2-mysql mysql-server mysql-client

다음은 MySQL 서버를 세팅해보자. mysql_secure_installation을 사용하여 기본적인 권한 세팅을 해주자.

sudo mysql_secure_installation

그런데 이제 mysql에 root계정으로 접속하려니까 안된다. 알아보니 MySQL 5.7 이상으로는 기본적으로는 root 계정 접속에 auth_socket 플러그인이 활성화되어있는데, 비밀번호 없이 socket으로 로그인하는 플러그인이다. 우리는 기존 legacy한 방법(패스워드 로그인)으로 변경을 해보자.

$ sudo mysql -uroot -p
> SELECT User,Host FROM mysql.user;
> ALTER USER "root"@"localhost" IDENTIFIED BY "<password>";

이제 마음껏 로그인할 수 있을것 같다. Sharif Judge가 사용할 수 있도록 데이터베이스와 여기에 접근하는 별도의 사용자를 만들자(보안상의 이유로).

$ mysql -uroot -p
> CREATE DATABASE sharif;
> CREATE USER "sharif"@"localhost" IDENTIFIED BY "<sharif-password>";
> GRANT ALL PRIVILEGES ON sharif.* TO "sharif"@"localhost";

DB 세팅은 끝났지만, 아직 한국에 최적화(?)되어 있지 않다. 유니코드를 기본 charset으로 설정해보도록 하자.

$ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
i (입� � 모드)
... 40번째 줄
character-set-server = utf8
... 추가 후
ESC (명� � 모드)
:wq! (강� � � �장후 종료)
$ sudo service mysql restart

이제 DB 세팅은 끝났다. sharif-judge를 설치해보도록 하자.

wget https://github.com/mjnaderi/Sharif-Judge/archive/v1.4.1.tar.gz
tar xzf v1.4.1.tar.gz
sudo cp -R Sharif-Judge-1.4.1/ /var/www/
cd /var/www/
sudo rm -rf html/
sudo mv Sharif-Judge-1.4.1 html
sudo chown www-data:www-data -R html/

다운로드와 압축을 풀었다면, 설정 파일을 수정해 DB와 연결하도록 하자.

$ sudo vi /var/www/html/application/config/database.php
i (입� � 모드)
... 86번째 줄
        /*  Enter database connection settings here:  */
        'dbdriver' => 'mysqli',     // database driver (mysqli, postgre)
        'hostname' => 'localhost',  // database host
        'username' => '',           // database username
        'password' => '',           // database password
        'database' => '',           // database name
        'dbprefix' => 'shj_',       // table prefix
        /**********************************************/
... 수� � 후
ESC (명� � 모드)
:wq! (강� �로 � �장 후 닫기)

헤딩도 쉬어가면서

Part 1에서는 MySQL, Apache2, PHP7.2를 설치하고, MySQL을 설정 완료하고 Sharif Judge까지 세팅해두었다. Apache2와 PHP.2는 따로 세팅이 필요하지 않으므로 스킵-

다음 Part2에서는 Sharif Judge의 Installation을 진행하고, 거기에 OpenCV를 연동하는 고난작업을 해보도록 하자.

구름 반값/성능두배! & 구름에서 VNC를?

구름IDE 로고 클라우드형 코딩 서비스 구름

설치가 필요 없는 클라우드 통합개발환경에 당신의 아이디어를 쏟아내세요! 클라우드 통합개발환경 – 구름IDE

기존에 Java를 공부하려면 Eclipse부터, C나 C++등을 공부하려면 Visual Studio부터, Python을 공부하려면 Anaconda부터 설치해야 했던 기억들이 납니다. 이걸 매일 해야하는 곳이 있습니다. 군부대라고…

그래서 오늘은 웬 메일이 한통 와있더군요. 구름이 새롭게 바뀐 가격 정책을 내일(4/19)부터 선보인다고 합니다.

변경된 구름IDE 가격 정책

정말 신나는군요. 이제 결제하고 코딩만 하면 되겠군요! …그런데 잠시만, 그래도 한번씩 써본지라, 개인적으로 생각한 장단점 대표적으로 몇가지만 끄적여봅니다.

구름의 장단점?

Q. 장점?

A. 아무래도 클라우드 서비스이다 보니까, 공유기능이나 코드 같이 수정하기각종 단축키 지원Markdown 자체 지원SSH 원격접속 기능 지원디버깅 지원, 그리고 무려 채팅 기능 지원! 이정도겠네요. 쓰면서 신나는 타이핑도 나쁘지않은 기능인거같네요. 지루하지 않을뿐

Q. 단점?

A1Linux입니다. 아무래도 Windows에서 많이 작업하시다가 Linux에서 개발환경을 접하게 되면 조금(많이) 당황스러우실 수도 있습니다. 이점 참고하세요. A2컴파일링이 조금 귀찮습니다. 마찬가지로 리눅스라서 그런것도 있기는 한데, 초기 Java 컨테이너나 Python 컨테이너를 생성한 뒤에, 뭔가 하나 새로 만들려고 하는데 컴파일 위치지정 등이 Windows에서 하던 것보다(비교적) 상당히 귀찮더군요. (와중에 Jupyter Notebook용으로 쓰는것도 나쁘지 않을것 같네요)

결론

저는 뭐 구름 홍보대사도 아니고, 그냥 일개 군인에 불과할 뿐입니다. 다만 같은 처지에 놓이신 프로그래머or컴공생 여러분들에게는 좋은 정보가 되길 바랄 뿐이겠네요. 하핳.

추가로! VNC도!

제가 구름 컨테이너 쓰면서 이것저것 괜찮은 스크립트를 만들어봤었네요. Linux 환경이다 보니까 VNC로 데스크톱 환경을 구현할 수 있는데, 이것저것 시도하시기에 시간이 없으신 여러분들께! 제가 미리 만들어놓은 스크립트들을 공개합니다.

Let’s Encrypt로 와일드카드 인증서 발급하기

Let’s Encrypt는 자동화된 무료 공인 인증 기관(CA)입니다(Let’s Encrypt is a free, automated, and open Certificate Authority).

기존 Let’s Encrypt 사용자 여러분들에게 특별한 소식입니다. 무려 Wildcard Certificate1를 지원한다는 소식( 원문보기)이죠!

ACMEv2가 Production으로 공식 지원된지는 지난 3월 13일부터 벌써 한달이 다 되어가는데, 아직 한국에는 관련한 소식을 접할 수가 없네요. Let’s Encrypt 공식 포럼에서 관련한 내용을 접할 수 있었습니다.

1. 준비물

그럼 본론으로 들어가서 준비물을 알아보도록 하겠습니다.

  • Certbot ( >= 0.22.0)
  • 갱신할 도메인 주소 (e.g. blending.kr)
  • 도메인 공급업체 또는 DNS 관리업체 로그인 계정 (e.g. 가비아dnsever, 또는 개인 DNS 서버 bind9 등)

여기서는 blending.kr, *.blending.kr 주소의 와일드카드 도메인을 개인 도메인 서버 bind9를 이용해 발급받는 것을 목표로 시작합니다.

개인 도에인 공급업체에서 해당 내용을 변경하기 위해서는, 각 도메인 관리자 사이트에서 아래와 동일하게 DNS TXT 레코드를 변경하시면 됩니다.

2. 구성요소 확인

먼저 설치된 Certbot이 최신 버전인지 확인합니다.

> certbot --version
certbot 0.22.2

버전이 0.22.0 이상이라면 다음으로 넘어가도 좋습니다.

3. DNS-01 challenge 준비

certbot을 이용하여 다음과 같은 명령어를 관리자 권한(root)으로 입력합니다.

> certbot certonly \
        --manual \
        --preferred-challenges dns-01 \
        --server https://acme-v02.api.letsencrypt.org/directory \
        -d *.blending.kr \
        -d blending.kr

해당 명령어는 dns-01 challenge를 이용하여 수동 발급 요청을 ACMEv2 서버로 전송합니다. 아래와 같이 “IP 로그를 활성화할 것이냐”라고 물으면 Y를 입력하고 넘어갑니다.

Performing the following challenges:
dns-01 challenge for blending.kr
dns-01 challenge for blending.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:

다음으로, 생성된 DNS TXT 레코드를 메모장 같은 곳에 임시로 적어둡니다. 다음 단계에서 TXT 레코드에 추가할 내용입니다.

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

<TXT 값 1>

Before continuing, verify the record is deployed.
-------------------------------------------------------------------------------
Press Enter to Continue

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

<TXT 값 2>

Before continuing, verify the record is deployed.
-------------------------------------------------------------------------------
Press Enter to Continue

위의 경우 Press Enter to Continue가 한번 뜨면 Enter를 눌러주셔아만 두번째 TXT값이 뜹니다.

두 번 이상 계속하면 DNS TXT값 없이 Challenge를 진행하게 되므로 오류가 발생하므로, 한번만 눌러서 위와 같이 만들어 주셔야 합니다!

4. DNS 레코드 수정

여기서는 bind9의 설정 파일을 수정해 DNS TXT 레코드를 추가해 보도록 하겠습니다. 파일 위치는 시스템 설정마다 다를 수 있으므로 참고하시기 바랍니다.

> sudo vi /etc/bind/zones/db.<도메인명>
840x1010

위와 같이 <TXT 값 1>과 <TXT 값 2>를 넣어주고, serial 부분을 업데이트(e.g. 2018040701) 해준 뒤, [ESC], :wq!를 입력하여 빠져나와 다음과 같이 DNS 설정을 적용시켜줍니다.

> sudo service bind9 restart

5. DNS TXT 레코드 적용여부 확인

직접 확인하는 방법은 dig 명령어를 이용해 가능합니다.

> dig +noall +answer _acme-challenge.blending.kr txt
_acme-challenge.blending.kr. 604800 IN  TXT     "<TXT 값 1>"
_acme-challenge.blending.kr. 604800 IN  TXT     "<TXT 값 2>"

위와 같이 TXT값이 나타났다면 성공! 그렇지 않은 경우 업데이트가 안되었다는 것이니 4번의 설정이 잘 저장되고, 다시 로드되었는지 확인해볼 필요가 있겠네요.

6. 적용된 DNS TXT 레코드로 Challenge 마무리

아까의 터미널 창으로 돌아가, Enter만 눌러주면 모른 동작이 완료됩니다.

Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/blending.kr/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/blending.kr/privkey.pem
   Your cert will expire on 2018-07-06. 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

이제 SSL 인증서가 모두 Wildcard로 작동할 것입니다. 기존처럼 길게 -d <도메인명> -d <도메인명2> -d <도메인명3> ... 이런식으로 진행하지 않아도 되겠군요.

7. 아쉬운 마무리.

이렇다할 인증 과정이 필요한 이유는 아직까지는 ACMEv2 인증이 DNS-01 챌린지밖에 지원하지 않기 때문입니다. 다른 인증밥업을 지원했더라면 쉽게 할 수도 있겠네요.

그런데, 무엇보다도 certbot renew 가 안됩니다. 뭐든 수동으로 해야합니다.

아쉽게도 이런 과정을 자동화할 스크립트가 필요하겠네요. 직접 만들어볼까 하는데 얼마나 시간이 걸릴 지는 모르겠네요. 하하.

긴글 따라오시느라 수고하셨습니다. 다음에는 아무래도 이러한 과정을 쉽게 자동화할 수 있는 스크립트를 구상해올께요.

  1. Wildcard Certificate(와일드카드 인증서)란 기존 home.domain.kr, wiki.domain.kr 등 각 subdomain(home, wiki)에 한정적으로 1개씩 가능했던 것이 *.blending.kr처럼 모든 서브도메인에 발급받는 것이 가능한 SSL 인증서입니다.