본문 바로가기

취미, 관심/NAS, Server

Freenom 무료도메인과 LuaDNS, 도커(docker)를 이용해 DDNS 및 도메인 인증서 발행(ddns-updater, nginx-proxy-manager) #3

#1. Freenom.com 도메인 발급

#2. LuaDNS 설정(freenom 네임서버 설정)

#3. 오라클 프리티어 인스턴스 Ubuntu 22.04 LTS 초기설정과 Docker 설치, docker-compose 실행

#4. nginx-proxy-manager 설정(와일드카드 인증서 적용, 서브도메인 생성)

 

아무래도 제가 오라클 클라우드 프리티어를 사용하여 설명중이라, 한번 언급을 하려고 합니다.

자주 만들었다 지웠다 하다보니;; 나중엔 스크립트 만들어서 쓰지 않을까 싶을 정도입니다 ㅎㅎ

원리의 설명보다는 따라하기 방식이라서 특별한 문제가 없다면 그대로 진행이 가능할거에요.

 

인스턴스가 이미 생성되어있고, ssh접속이 가능함을 기준으로 설명합니다.

저는 mobaxterm을 사용합니다.

 

시스템 시간 변경

인스턴스를 새로 생성하면 UTC시간이 세팅되어있습니다. 한국 시간에 맞춥니다.

sudo timedatectl set-timezone Asia/Seoul

패키지 최신화, 업데이트, 찌꺼기제거

sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y

ARM 인스턴스는 4OCPU, 24GB 메모리까지 사용할 수 있어 부담이 없습니다만, E.1 Micro 인스턴스는 1CPU, 1GB 메모리만을 제공하기 떄문에 조금 부족합니다.

 

스왑을 생성해 가용 메모리를 늘려줍니다.

# 스왑 생성(기본 메모리가 1GB밖에 안되므로 추가 스왑메모리 생성 2GB)
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile

# 스왑 시작
sudo swapon /swapfile

# 생성 확인
sudo swapon --show

# 시스템 메모리 공간 확인(생략가능)
free -h

# 고정
sudo vim /etc/fstab

fstab 내용 아래에 아래 내용을 붙여넣기해줍니다.
/swapfile swap swap defaults 0 0

이렇게 되겠죠

 

docker 설치 및 docker-compose 최신버전 설치

#필요 패키지 설치
sudo apt update && sudo apt -y install apt-transport-https ca-certificates curl gnupg lsb-release

#Docker Official GPG Key 등록
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

#Stable Repository 등록
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

#docker engine 설치
sudo apt update && sudo apt -y install docker-ce docker-ce-cli containerd.io

#설치완료 후 docker 버전확인(설치확인)
docker --version

#Docker Compose 설치(최신버전)
sudo apt install jq -y
VERSION=$(curl --silent https://api.github.com/repos/docker/compose/releases/latest | jq .name -r)
DESTINATION=/usr/bin/docker-compose
sudo curl -L https://github.com/docker/compose/releases/download/${VERSION}/docker-compose-$(uname -s)-$(uname -m) -o $DESTINATION
sudo chmod 755 $DESTINATION

#실행권한 부여
sudo chmod +x /usr/bin/docker-compose

#설치확인
docker-compose --version

#sudo 없이 docker 명령어 실행하기
#접속중인 사용자를 docker그룹에 추가
sudo usermod -aG docker $USER

내용을 그대로 복사해서 넣어 실행해도 됩니다. 

 

ddns-updater 설정파일 작성

이제 컨테이너를 올릴거에요.

ddns-updater는 설정파일을 미리 넣어둬야 합니다. 폴더 생성 및 권한부여를 해 볼게요.

저는 /docker 폴더를 생성하고, 컨테이너별로 폴더를 하나씩 생성해 설정파일 등을 넣어둡니다.

docker-compose 실행 시 폴더가 없으면 알아서 생성하므로, ddns-updater 설정파일만 만들어주면 되요.

 

ddns-updater 개발자의 github에 설명이 있습니다만, 제 방식대로 조금 변경했습니다;

# root 권한 획득
sudo -i
# 폴더생성
mkdir /docker/ddns-updater
touch /docker/ddns-updater/config.json
# 폴더,파일 소유권 설정
chown -R 1000 /docker/ddns-updater
# 권한부여(폴더, 소유자만 변경가능)
chmod 700 /docker/ddns-updater
# 권한부여(파일, 읽기전용)
chmod 400 /docker/ddns-updater/config.json

# 파일 편집
vim /docker/ddns-updater/config.json

config.json 에 들어갈 내용은 아래와 같습니다.

{
  "settings": [
    {
      "provider": "luadns",
      "domain": "siane.ga",
      "host": "@",
      "email": "email@example.com",
      "token": "API_TOKEN",
      "ip_version": "ipv4"
    }
  ]
}

domain - freenom에서 만든 도메인

host - @(루트 도메인)

email - LuaDNS 가입한 이메일

token - LuaDNS API 토큰

 

docker-compose.yml 파일 생성 및 docker-compose 실행

이제 거의 다 했어요. docker-compose.yml 파일을 생성해 한번에 실행합니다.

version: "3.8"
services:
  ddns-updater:
    image: qmcgaw/ddns-updater
    container_name: ddns-updater
    restart: always
    #ports:
      #- 8000:8000/tcp
    environment:
      #- CONFIG=
      - PERIOD=5m
      - UPDATE_COOLDOWN_PERIOD=5m
      - PUBLICIP_FETCHERS=all
      - PUBLICIP_HTTP_PROVIDERS=all
      - PUBLICIPV4_HTTP_PROVIDERS=all
      - PUBLICIPV6_HTTP_PROVIDERS=all
      - PUBLICIP_DNS_PROVIDERS=all
      - PUBLICIP_DNS_TIMEOUT=3s
      - HTTP_TIMEOUT=10s
      # Web UI
      - LISTENING_PORT=8000
      - ROOT_URL=/
      # Backup
      - BACKUP_PERIOD=0 # 0 to disable
      - BACKUP_DIRECTORY=/updater/data
      # Other
      - LOG_LEVEL=info
      - LOG_CALLER=hidden
      #- SHOUTRRR_ADDRESSES=
    volumes:
      - ./ddns-updater:/updater/data
    
  db:
    image: mariadb
    container_name: mariadb
    restart: always
    #ports:
    # - 3306:3306
    environment:
      TZ: Asia/Seoul
      MYSQL_ROOT_PASSWORD: "Qwer1234!!"
      MARIADB_USER: npm
      MARIADB_DATABASE: npm
      MARIADB_PASSWORD: "Qwer1234!!"
    volumes:
      - ./mysql/data:/var/lib/mysql

  npm:
    image: jc21/nginx-proxy-manager:latest
    container_name: nginx-proxy-manager
    restart: always
    ports:
      - 81:81 #관리포트
      - 80:80 #http
      - 443:443 #https
    volumes:
      - ./nginx-proxy-manager/data:/data
      - ./nginx-proxy-manager/letsencrypt:/etc/letsencrypt
    environment:
      DB_MYSQL_HOST: db
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: npm
      DB_MYSQL_PASSWORD: "Qwer1234!!"
      DB_MYSQL_NAME: npm
    depends_on:
      - db

  pma:
    image: phpmyadmin
    container_name: phpmyadmin
    restart: always
    # ports:
    #  - 8888:80
    environment:
      PMA_HOSTS: db
      #PMA_PORTS: 3306
    depends_on:
      - db

  portainer:
    image: portainer/portainer-ce:latest
    container_name: portainer
    restart: always
    #ports:
    #  - '9000:9000'
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./portainer:/data

  watchtower:
    image: containrrr/watchtower:latest
    container_name: watchtower
    environment:
      TZ: Asia/Seoul
      WATCHTOWER_CLEANUP: true
      WATCHTOWER_REMOVE_VOLUMES: true
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

networks:
  default:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.18.0.0/16

포트를 주석처리한 이유는 docker-compose의 services에 묶인 컨테이너들은 링크와 같은 효과를 얻기 때문에, nginx-proxy-manager에서 host를 설정한 service명으로 넣어주면 됩니다. 아래에서 설명을 할게요.

 

위 파일에서 environment 부분에 - 로 시작하는게 있고 아닌게 있습니다. 결과는 동일해요.

PASSWORD, PASSWD 부분은 사용목적에 맞게 변경해주세요. 특히 MYSQL DB PASSWORD 부분은 꼭! 바꾸세요.

영문 대/소문자와 숫자, 특수문자를 넣어 10자리 이상으로 만들어주시면 됩니다.

 

networks 부분은 컨테이너를 새로 생성하거나 docker-compose를 새로 올릴때 ip 변경이 되지 않도록 고정해둔 부분으로, 필수는 아닙니다.

 

아래 명령으로 컨테이너를 실행합니다.

docker-compose up -d

 

제대로 작동하는지 확인을 하기 위해 로그를 찍어봅니다. 일부러 변경됨을 확인할 수 있도록 다른 IP를 넣었고, API 비활성화를 해 뒀어요.

docker logs ddns-updater

잘못된 로그, API가 비활성화 되어있다고 하네요.
정상적으로 작동된 로그

LuaDNS의 Zone 부분에서 확인해보면 IP가 변경됨을 확인할 수 있습니다. 이제 5분단위(기본값)로 값을 점검해 변경된 경우 반영해줍니다.

만약, 서브도메인이 필요했다면, host 부분의 설정을 수정하시면 되겠습니다.

기타 설정 내용은 개발자 설명을 참고해주세요.

https://github.com/qdm12/ddns-updater

 

GitHub - qdm12/ddns-updater: Container to update DNS records periodically with WebUI for many DNS providers

Container to update DNS records periodically with WebUI for many DNS providers - GitHub - qdm12/ddns-updater: Container to update DNS records periodically with WebUI for many DNS providers

github.com


다음 글은 nginx-proxy-manager를 사용한 와일드카드 인증서 발급과 컨테이너들에 서브도메인을 연결해주는 작업입니다.