Create TOC

레이블이 let's encrypt인 게시물을 표시합니다. 모든 게시물 표시
레이블이 let's encrypt인 게시물을 표시합니다. 모든 게시물 표시

2019년 12월 16일

Raspbian/사용하던 서비스를 docker로 이전

기존에 사용하던 서비스를 docker로 옮기는 과정을 기술한다.

docker로 옮길 서비스는 아래와 같다.

  • certbot
  • pihole + dnscrypt
  • tvheadend
  • nginx
  • homebridge

docker 환경 구성

docker 설치

get-docker.sh 를 이용해 설치한다.

$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh

docker 그룹에 계정을 추가하면 sudo 없이 docker를 실행할 수 있다.

$ usermod -aG docker pi
$ sudo mkdir /docker
$ chown pi /docker

docker-compose 설치

$ sudo apt-get install docker-compose

certbot

설정 옮김

$ mkdir /docker/certbot
$ sudo cp -R /etc/letsencrypt /docker/certbot/config

docker-compose.yml

아래와 같은 /docker/certbot/docker-compose.yml 파일을 만든다.

version: "3"

services:
    certbot:
        container_name: certbot
        image: tobi312/rpi-certbot
        ports:
            - "80:80/tcp"
            - "443:443/tcp"
        entrypoint: certbot renew
        volumes:
            - '/docker/certbot/config/letsencrypt:/etc/letsencrypt'

테스트

$ cd /docker/certbot
$ docker-compose up

문제 없다면 /docker/certbot/docker-compose.yml 파일에서 entrypoint 를 아래와 같이 변경한다.

entrypoint: certbot -q renew

cron

2일 간격으로 인증서 갱신을 위해 certbot을 실행하도록 /etc/cron.d/certbot 파일을 만든다.

0 0 */2 * * root test -x /usr/bin/docker-compose && perl -e 'sleep int(rand(43200))' && docker-compose -f /docker/certbot/docker-compose.yml up

pihole

dnscrypt-proxy-2 대신 cloudflared 를 사용하게 변경했다.

설정 옮김

$ mkdir -p /docker/pihole/
$ sudo cp -R /etc/dnsmasq.d /docker/pihole/config
$ sudo cp -R /etc/pihole /docker/pihole/config

설정 수정

/docker/pihole/config/dnsmasq.d/01-pihole.conf 파일에서 server 를 아래와 같이 수정한다.

server=10.0.0.2#54

/docker/pihole/config/pihole/setupVars.conf 파일에서 PIHOLE_DNS 를 아래와 같이 수정한다.

PIHOLE_DNS_1='10.0.0.2#54'PIHOLE_DNS_2=''

docker-compose.yml

아래와 같이 /docker/pihole/docker-compose.yml 파일을 만든다.

version: "3"

services:
    cloudflared:
        image: visibilityspots/cloudflared
        environment:
            - TZ=Asia/Seoul
        networks:
            pihole_net:
                ipv4_address: 10.0.0.2
        restart: unless-stopped

    app:
        image: pihole/pihole:latest
        ports:
            - '53:53/tcp'
            - '53:53/udp'
            - '8888:80/udp'
        environment:
            - TZ=Asia/Seoul
            - DNS1=10.0.0.2#54
            - DNS2=
            - DNSSEC=true
            - IPv6=false
            - PUID=1000
            - PGID=1000

        volumes:
            - '/docker/pihole/config/pihole/:/etc/pihole/'
            - '/docker/pihole/config/dnsmasq.d/:/etc/dnsmasq.d/'
        networks:
            pihole_net:
                ipv4_address: 10.0.0.3
        dns:
            - 127.0.0.1
            - 1.1.1.1
        restart: unless-stopped

networks:
    pihole_net:
        driver: bridge
        ipam:
            config:
                - subnet: 10.0.0.0/29

테스트

아래와 같이 기존 서비스를 중지하고 docker로 pihole 을 실행한다.

$ sudo systemctl stop dnscrypt-proxy.service
$ sudo pihole disable
$ cd /docker/pihole
$ docker-compose up -d

nslookup 으로 dns query가 잘 되는지 확인한다. 문제가 있다면 docker-compose -f /docker/pihole/docker-compose.yml logs app 명령으로 로그를 확인해 본다.

문제가 없는 것이 확인되면 설치되어 있던 dnscrypt-proxy-2와 pihole는 삭제한다.

기타

pihole-FTL 사용법

pihole-FTL은 아래와 같이 container에서 명령을 실행해서 사용할 수 있다.

$ docker-compose -f /docker/pihole/docker-compose.yml exec app bash -c 'echo ">stats" | nc -w 1 127.0.0.1 4711'

lighttpd 중지

안쓰는 웹서버는 아래 명령으로 중지해놓는다.

$ docker-compose -f /docker/pihole/docker-compose.yml exec app service lighttpd stop

tvheadend

설정 옮김

$ mkdir /docker/tvheadend
$ mkdir /docker/tvheadend/rec
$ sudo -s
# cd /home/hts/.hts
# tar cvfj /docker/tvheadend/tvh.tar.bz2 tvheadend
# exit
$ cd /docker/tvheadend
$ sudo tar xvfj tvh.tar.bz2
$ sudo mv tvheadend config
$ sudo rm tvh.tar.bz2

docker-compose.yml

아래와 같이 /docker/tvheaded/docker-compose.yml 파일을 만든다.

version: "3"

services:
    app:
        image: linuxserver/tvheadend
        ports:
            - "9981:9981/tcp"
            - "9982:9982/tcp"
        environment:
            - TZ=Asia/Seoul
            - PUID=1000
            - PGID=1000
        devices:
            - "/dev/dvb:/dev/dvb"
        volumes:
            - '/docker/tvheadend/config:/config'
            - '/docker/tvheadend/rec:/recordings'
        restart: unless-stopped

테스트

$ cd /docker/tvheadend
$ docker-compose up -d

문제

encoding 이슈

nginx

설정 옮김

기존 설치된 nginx 설정 구조와 docker image의 구조가 달라서 우선 docker image를 설치하고 설정을 수정한다.

docker-compose.yml

아래와 같이 /docker/nginx/docker-compose.yml 파일을 만든다.

version: "3"

services:
    app:
        image: linuxserver/nginx
        network_mode: host
        environment:
            - TZ=Asia/Seoul
            - PUID=1000
            - PGID=1000
        volumes:
            - '/docker/certbot/config/letsencrypt:/etc/letsencrypt'
            - '/docker/nginx/config:/config'
            - '/media/www:/mediw/www'
        restart: unless-stopped

설정 수정

우선 container를 실행한다.

$ cd /docker/nginx
$ docker-compose up -d

ssl

/etc/nginx/ssl 폴더가 있다면 /docker/nginx/config/nginx/ssl 로 복사

nginx

linuxserver/nginx 이미지를 그대로 사용하면 nginx에 많은 모듈이 동작하게 된다.

원하는 모듈만 동작하게 하기 위해 /docker/nginx/config/nginx/nginx.conf 파일에서 기존 /etc/nginx/modules/*.conf 대신 /config/nginx/modules/*.conf 를 사용하도록 수정한다.

# include /etc/nginx/modules/*.conf;
include /config/nginx/modules/*.conf;

/docker/nginx/config/nginx/modules 폴더를 만들고 원하는 모듈의 *.conf만 복사한다.

사용가능한 모듈의 conf는 아래 명령으로 확인할 수 있다.

$ docker-compose -f ~/docker/nginx/docker-compose.yml exec app ls /etc/nginx/modules

복사는 아래와 같이 한다.

$ docker-compose -f ~/docker/nginx/docker-compose.yml exec app cp /etc/nginx/modules/http_echo.conf /config/nginx/modules

site-confs

/docker/nginx/config/nginx/site-confs/default 파일 내용을 비우고 /etc/nginx/site-enabled 파일을 가져온다.

가져온 site 설정에서 아래 내용을 수정한다.

  1. /etc/nginx/ssl 부분을 /config/nginx/ssl 로 변경
  2. log 경로를 /config/nginx/log 로 변경
  3. auth_basic_user_file 을 사용하고 있었다면 파일 경로를 /config/nginx 아래로 변경하고 기존에 사용하던 auth_basic_user_file/docker/nginx/config/nginx 의 정해둔 경로로 복사.

homebridge

설정 옮김

$ mkdir /docker/homebridge
$ cp -R ~/.homebridge /docker/homebridge/config

/docker/homebridge/config/startup.sh 파일을 만들고 설치할 package를 등록한다.

#!/bin/sh

if [ ! -f /homebridge/.install_done ]; then
    npm i miio
    npm i homebridge-websocket
    npm i homebridge-mi-fan
    npm i homebridge-mi-pm2_5
    npm i homebridge-http-temperature-humidity
    touch /homebridge/.install_done
fi;

docker-compose.yml

아래와 같이 /docker/nginx/docker-compose.yml 파일을 만든다.

version: "3"

services:
    app:
        image: oznu/homebridge:raspberry-pi
        network_mode: host
        environment:
            - TZ=Asia/Seoul
            - PUID=1000
            - PGID=1000
            - HOMEBRIDGE_INSECURE=1
            - HOMEBRIDGE_CONFig_UI=1
            - HOMEBRIDGE_CONFig_UI_PORT=18080
        volumes:
            - '/docker/homebridge/config:/homebridge'
        restart: unless-stopped

테스트

기존에 실행하던 homebridge를 중지하고 homebridge container를 실행한다.

$ cd /docker/homebridge
$ docker-compose up -d

로그를 확인해보고 web ui 접속도 해본다.

$ docker-compose -f /docker/homebridge/docker-compose.yml logs app

2019년 3월 13일

Raspbian/certbot 업그레이드

How to stop using TLS-SNI–01 with Certbot을 적용하려면 certbot 버전이 0.28 이상이어야 한다. 그러나 raspbian에 포함된 버전은 0.10 이다. 아래와 같은 방법으로 certbot을 업그레이드 한다.

우선 /etc/apt/sources.list.d/debian-stretch-backports.liststretch-backports 를 추가한다.

deb http://deb.debian.org/debian stretch-backports main

업데이트 할 때 key 오류가 난다.

$ sudo apt-get update

...
W: GPG error: http://ftp.debian.org jessie-backports InRelease:
   The following signatures couldn't be verified because the public
   key is not available: NO_PUBKEY 8B48AD6246925553 NO_PUBKEY
   7638D0442B90D010

아래 명령으로 key를 가져온다.

$ sudo gpg --keyserver pgp.mit.edu --recv-keys 8B48AD6246925553 7638D0442B90D010

결과 메시지에서 가져온 key 정보를 확인한다.


gpg: key 8B48AD6246925553: 28 signatures not checked due to missing keys
gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key 8B48AD6246925553: public key "Debian Archive Automatic Signing Key (7.0/wheezy) <ftpmaster@debian.org>" imported
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg:               imported: 1

가져온 키를 추가한다. 이때는 sudo 대신 root shell 에서 작업한다.

$ sudo -s
# gpg --armor --export 8B48AD6246925553 | apt-key add -

패키지 목록을 갱신하고 certbot을 업그레이드 한다.

$ sudo apt-get update
$ apt-get install certbot -t stretch-backports

2016년 11월 28일

nginx에 let's encrypt 인증서 적용

/etc/nginx/sites-available에 원하는 이름의 설정 파일을 만들고 아래와 같이 설정한다.

server {
 listen 443 ssl;
 listen [::]:443 ssl;
 server_name 서버명;
 root /var/www/html;

 add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
 add_header X-Frame-Options DENY;
 ssl on;
 ssl_certificate /etc/letsencrypt/live/서버명/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/서버명/privkey.pem;

 #OCSP Stapling
 ssl_dhparam /etc/nginx/ssl/서버명.dhparam;
 ssl_stapling on;
 ssl_stapling_verify on;
 ssl_trusted_certificate /etc/letsencrypt/live/서버명/fullchain.pem;
 resolver 8.8.8.8 8.8.4.4;

 ssl_protocols   TLSv1 TLSv1.1 TLSv1.2;
 ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128  -GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECD  HE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-  SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES25  6-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';

 ssl_prefer_server_ciphers on;
 ssl_session_timeout 1d;
 ssl_session_cache shared:SSL:10m;

 # 이후 원하는 설정 추가
}

dhparam파일도 만든다.

$ sudo mkdir /etc/nginx/ssl
$ sudo openssl dhparam -out /etc/nginx/ssl/서버명.dhparam 2048

서버 설정 파일을 활성화시킨다

$ sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/

설정에 문제가 없는지 테스트 해본다.

$ sudo nginx -t

Raspbian/Let's encrypt 설정

Raspbian에서 Let's encrypt 인증서를 설치하는 방법을 기술한다.

letsencrypt 설치

$ sudo -s
# gpg --keyserver pgpkeys.mit.edu --recv-key  8B48AD6246925553      
# gpg -a --export 8B48AD6246925553 | apt-key add -
# gpg --keyserver pgpkeys.mit.edu --recv-key 7638D0442B90D010      
# gpg -a --export 7638D0442B90D010 | apt-key add -
# echo "deb http://httpredir.debian.org/debian jessie-backports main contrib non-free" > /etc/apt/sources.list.d/debian-jessie-backports.list
# exit
$ sudo apt-get update
$ sudo apt-get install letsencrypt -t jessie-backports

인증서 생성

인증서 생성 전에 외부에서 433 포트로 접속 가능하도록 설정해야 한다.

$ sudo letsencrypt certonly --agree-tos --email 이메일주소 --standalone --domains 서버명

생성에 성공하면 /etc/letsencrypt/archive/서버명 디렉토리에 인증서가 저장되고 /etc/letsencrypt/live 디렉토리에 링크가 생성된다.

인증서 갱신

apt-get으로 letsencrypt을 설치한 경우에는 /etc/cron.d/certbot이 등록되기 때문에 갱신에 대해 따로 설정하지 않아도 된다.

현재 환경에서 인증서 갱신이 되는지는 아래 명령으로 테스트해보면 된다.

$ sudo cert-bot renew --dry-run