Author: byun1114

  • Docker 에서 build 하기

    Docker를 사용한다고 했을 때 자기가 원하는 이미지를 만들 수 있어야, 최소한 이 사람은 Docker를 어느 정도는 사용할 수 있겠구나라고 할 수 있을 것 같다.

    Python이나 R 을 사용할 경우 패지키 별 상호 의존성이 있는 경우가 많다. 나중에 가면 이 패키지가 기본인지 아니면 내가 어떤 경로를 통하여 설치했는지 기억이 가물거리게 된다. 물론 Anaconda에서도 가상 환경을 지원해 주고 있기 때문에 이것을 이용해 볼 수도 있겠다. 그렇다고 하더라도 시스템에서 설치하는 프로그램에 따른 종속성도 있으므로 Docker로 구현해 보도록 하겠다.

    Docker에서 이미지를 생성하는 것은 어렵지 않다. 빈 폴더에서 Dockerfile 이라는 파일을 만들고, 여기에 적절한 명령어를 입력해 둔다. 잘 구성된 파일이라면 새로운 이미지를 생성할 수 있다.

    예전에 apt-cacher-ng를 알게 되었을 때, Docker와 commit 이야기가 나왔었는데, 실제로 해보니 알 것 같다. Docker로 commit 까지 작업을 하는 곳에서는 미러나 캐시 서버가 있어야 확실히 편하다.

    Ubuntu에서 Python 을 컴파일하여 설치하는 것을 구현한 것은 다음과 같다. 블로그 가로폭의 문제로 잘려 보일지라도 알아서 잘 설정하면 된다.

    • 우선 도커 이미지에서 캐시 서버를 이용할 수 있도록 미리 설정된 apt.conf 파일을 컨테이너 내부의 /etc/apt 폴더에 복사해 둔다.
    • Python 파일도 복사한다.
    • 나중에 프로그램 설치하는 과정에서 시간대 설정 부분이 나오기 때문에 미리 시간대를 맞추어 둔다.
    • 여러 번의 삽질을 통하여 미리 파악한 최소한의 패키지를 설치한다.
    • Python을 컴파일 한다.
    FROM ubuntu
    ADD http://file.welovedoctor.com/share/FILE/PYTHON/apt.conf /etc/apt/
    ADD http://file.welovedoctor.com/share/FILE/PYTHON/Python-3.9.6.tgz /tmp
    RUN rm -rf /etc/localtime 
    RUN ln -s /usr/share/zoneinfo/Asia/Seoul/etc/localtime
    WORKDIR /tmp
    RUN tar -xzf Python-3.9.6.tgz && rm Python-3.9.6.tgz
    RUN apt -y update && apt -y upgrade
    RUN apt -y install curl build-essential \
     libssl-dev libssl-ocaml-dev libbz2-dev libgdbm-dev liblzma-dev \
     libffi-dev uuid-dev libzip-dev libzip-ocaml-dev libsqlite3-dev \
     libdb-dev tk libreadline-dev tk8.6-dev
    WORKDIR /tmp/Python-3.9.6
    RUN ./configure --enable-optimizations && make -j 8 && make install
    
  • WebDAV

    https://zetawiki.com/wiki/%EC%9A%B0%EB%B6%84%ED%88%AC_%EC%95%84%ED%8C%8C%EC%B9%98_WebDAV_%EC%84%A4%EC%A0%95

    우연히 WebDAV이 ‘웹 기반의 읽고 쓰는’이라는 구절을 보았다. 혹시나 싶어서 Apache에서 우선 WebDAV이 가능하도록 하였더니 curl 에서 파일이 업로드 된다. 보안 설정을 확인해 보아야 하겠지만, 클라이언트가 통제가 안된다면 차라리 SCP가 좋을 것 같다.

  • 리버스 프록시를 위한 NGINX 구성 – 작성중

    인터넷에도 정보는 많지만, 그래도 신뢰할 수 있는 정보인 책(NGINX HTTP SERVER)을 참고하였다.

    • ssl on; 보다는 listen 443 ssl; 을 이용한다.
    • TLS 버젼: 다음과 네이버는 TLS v1.2가 기본이다. SCI-HUB와 PubMed는 TLS v1.3을 이용한다. v1.2도 충분히 안전하다고는 한다.
    • 암호화 방식: 선택할 수 있는 옵션은 많다. openssl ciphers 명령어를 통하여 사용할 수 있는 목록을 확인할 수 있다. 확실하지는 않은데, 공개키 암호 방식의 대표주자인 RSA가 있는 것 1개와 대칭 열쇠 암호와 관련된 것이 포함되어야 하는 것 같다.
    • allow와 deny: 위에서 아래 순서대로 적용된다. 먼저 언급된 것이 더 큰 범위라면 아래쪽의 범위는 무시된다.
    server {
            listen 443 ssl;
            ssl_certificate test.crt;
            ssl_certificate_key test.key;
            ssl_protocols TLSv1.3;
            ssl_prefer_server_ciphers on;
            ssl_ciphers "TLS-AES-128-GCM-SHA256:ECDHE-RSA-AES128-SHA256";
            location / {
                    allow 190.70.0.0/0;
                    deny all;
                    proxy_pass http://127.0.0.1:3000;
            }
    }
    
  • HTTPS로 전송하기

    postgREST가 HTTPS를 지원하지 않고, 리버스 프록시를 이용하라고 하고 있으므로, 그대로 따라해 보았다.

    NGINX를 설치하는 과정에서 생성되는 /etc/nginx/nginx.conf 파일을 보면 다음과 같은 내용이 있다. 즉, conf.d 폴더 내부의 설정 파일을 반영한다는 것이다.

    {... 
       include /etc/nginx/conf.d/*.conf;
    }

    HTTPS를 이용하려면 인증서, 인증키가 필요하다. 테스트 목적이기 때문에 openssl 명령어를 이용해서 만들어 주었다. 나중에 클라이언트에서 접속하기 위해서 공개키를 만들어야 한다. 인터넷에 있는 수 많은 방법 중에서 다음의 방법이 가장 쉬웠다.

    $ openssl req -new -newkey rsa:2048 -nodes -keyout test.key -out test.csr
    $ openssl x509 -req -days 365 -in test.csr -signkey test.key -out test.crt
    $ openssl rsa -in test.key -out public.key -pubout

    초보자라서 conf.d 폴더에 있는 default.conf 파일을 수정하는 방법을 이용하였다. 다음과 관련된 내용을 추가해 준다.

    • HTTP로 접속되면 HTTPS로 변환하도록 하는 부분
    • HTTPS 설정과 관련된 부분
    • postgREST 포트인 3000으로 연결해 주는 부분
    
    server {
            listen 443;
            server_name SERVERNAME;
            ssl on;
            ssl_certificate test.crt;
            ssl_certificate_key test.key;
    
            location / {
                    proxy_pass http://127.0.0.1:3000;
            }
    }
    server {
            listen       80;
            server_name  SERVERNAME;
            return 301 https://SERVERNAME;
    }

    이렇게 하면 requests.post에서 https로 자료를 전송할 수 있다. 원래는 생성된 공개키로 문제없이 되어야 하는데, 뭐가 문제인지 connection과 관련된 오류 메세지가 발생한다. 일다 verifty=False로 해당 부분은 넘어가는 걸로 해결하고 있다.