저번 포스트에서는 도메인 생성 및 Cloudflare 연동을 하였으며 해당 포스트에서는 Caddy 컨테이너를 생성하고 SSL 인증(와일드 카드 포함)까지 확인한다.
진행 순서
진행 순서는 아래와 같이 진행된다.
1. NextCloud 컨테이너 생성 및 구동 확인
(https://was564.tistory.com/10)
2. 도메인 생성 및 Cloudflare 연동
(https://was564.tistory.com/11)
3. 도메인을 이용하여 Caddy 컨테이너 생성 및 SSL 인증 (해당 포스트)
4. 페이지 정상 작동 확인
(https://was564.tistory.com/13)
Caddy 컨테이너 생성 및 SSL 인증
Caddy는 Caddyfile을 통해 간단하게 프록시 기능을 해주며 SSL도 자동으로 발급받아주는 기능을 한다.
개인적으로는 혜자 컨테이너가 아닐 수 없다.
먼저 SSL 인증을 위한 정보가 필요하며 해당 정보는 Cloudflare에서 가져올 수 있다.
Cloudflare에서 자신의 도메인에 접속한 후 개요에서
API 토큰 가져오기 -> 토큰 생성 -> 영역 DNS 편집의 템플릿 사용을 누른다.
그러면 아래와 같은 창이 뜨며 아래와 같이 진행한다.
1. 권한에서 영역 읽기, DNS 편집 추가
2. 영역 리소스에서 계정의 모든 영역, 자신의 메일로 지정
3. 요약 계속 -> 토큰 생성
이와 같이 진행한 토큰은 해당 페이지에서만 볼 수 있기 때문에 따로 기록해놓자.
Cloudflare에 토큰 정보가 있다면 아래와 같이 docker-compose.yml 파일을 작성한 후 한 폴더에 저장한다.
docker-compose.yml
version: '3'
services:
caddy:
image: caddy
container_name: caddy
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- /etc/caddy/Caddyfile:/etc/caddy/Caddyfile
- /etc/caddy/data:/data
network_mode: "host"
command:
# - sh -c 'if ! caddy list-modules | grep -q dns.providers.cloudflare; then caddy add-package github.com/caddy-dns/cloudflare; fi; caddy run --config /etc/caddy/Caddyfile --adapter caddyfile'
environment:
- ACME_AGREE=true
- ACME_CA=https://acme-v02.api.letsencrypt.org/directory
- ACME_EMAIL={자신의 Email 주소}
- CF_API_KEY={영역 DNS 편집 API 토큰}
여기서 CF_API_KEY는 미리 Cloudflare에서 작업 중 기록한 토큰 값을 넣고 Email 주소는 자신의 Email 주소를 입력하면 된다.
유의할 점은 network_mode는 "host"로 두어 내부 컨테이너의 포트가 아닌 로컬 포트와 매핑된다. (ports 항목은 무시된다.)
그리고 command의 명령어는 Cloudflare의 SSL인증(와일드 카드만인지는 확인 필요)을 받기 위해 Cloudflare 모듈을 가져오는 명령어이다.
참고로 필자가 실행시켰을 때는 잘 실행되지 않고 컨테이너가 중단되었기 때문에 컨테이너에 직접 접근하여 명령어를 수행할 예정이다.
중요한 점은 volumes에서 Caddyfile은 Directory가 아닌 텍스트이기 때문에 미리 파일을 추가시켜 놓아야 한다.
따라서 아래 명령어를 수행하여 미리 파일을 만들어놓자.
sudo mkdir /etc/caddy
sudo touch /etc/caddy/Caddyfile
sudo chmod 755 /etc/caddy/Caddyfile
정상적으로 저장이 되었다면 docker-compose.yml 파일을 가지고 있는 폴더 위치에서 아래 명령어를 이용하여 docker compose를 수행한다.
sudo docker compose up -d
그러면 위와 같이 정상적으로 컨테이너가 생성된다.
하지만 컨테이너는 Restarting 상태를 반복한다. 왜냐하면 Caddyfile이 공백이기 때문에 Config를 적용할 수 없기 때문이다.
따라서 /etc/caddy 폴더에 있는 Caddyfile을 아래와 같이 작성하면 된다.
Caddyfile
my_domain {
root * /usr/share/caddy
file_server
}
# 예시
# was564.site {
# root * /usr/share/caddy
# file_server
# }
그 후 아래 명령어를 입력하여 caddy를 재시작한다.
sudo docker restart caddy
# sudo docker logs caddy # caddy 컨테이너 로그 확인
그러면 정상적으로 자신의 도메인으로 들어가면 아래와 같은 창이 뜰 것이다.
이제 Cloudflare를 통해 와일드 카드를 얻기 위해 먼저 cloudflare 모듈 설치를 위해 아래와 같은 과정을 진행한다.
먼저 아래 명령어를 이용하여 caddy 컨테이너의 접근한다.
sudo docker exec -it caddy /bin/ash # alpine 리눅스이기 때문에 ash
접근이 되면 아래 명령어를 수행한다.
if ! caddy list-modules | grep -q dns.providers.cloudflare; then caddy add-package github.com/caddy-dns/cloudflare; fi;
exit # 컨테이너 탈출
수행이 완료되면 다시 /etc/caddy에 있는 Caddyfile을 수정한다.
my_domain {
root * /usr/share/caddy
file_server
}
*.my_domain {
tls {
dns cloudflare {env.CF_API_KEY}
}
@test1 host test.my_domain
handle @test1 {
root * /usr/share/caddy
file_server
}
}
# 예시
# was564.site {
# root * /usr/share/caddy
# file_server
# }
#
# *.was564.site {
# tls {
# dns cloudflare {env.CF_API_KEY}
# }
#
# @test_game host singularity.was564.site
# handle @test_game {
# root * /data/SingularityGame
# file_server
# }
# }
수정을 완료하였다면 아래 명령어를 통해 caddy를 재시작한다.
sudo docker restart caddy
그 후 Cloudflare에서 Caddyfile에서 추가한 test.mydomain을 도메인 추가를 한다.
1. 유형 : A
2. IPv4 주소 : 자신의 ip 주소
3. 프록시 상태 : O (SSL 인증을 한 뒤면 프록시를 진행해도 된다.)
만약 my_domain이 프록시 상태에서 caddy를 처음 실행한다면 SSL 인증(챌린지)에서 실패한다.
따라서 무조건 caddy SSL 인증할 때까지는 프록시 상태를 꺼놓아야 한다.
도메인이 추가되면 수 분 뒤에 적용이 되며 test.my_domain에 접속을 하면 아래와 같은 창이 맞이할 것이다.
해당 창이 떴다면 무사히 와일드 카드 인증까지 완료한 것이다.
여기까지가 Caddy를 통한 SSL 인증이었다.
추가로 SSL 인증을 마치면 Cloudflare를 통해 자신의 IP를 가릴 수 있으므로 웬만하면 my_domain의 프록시 처리해주자.
맞닥뜨린 문제
Caddyfile is not a directory
위에서 설명했듯이 Caddyfile은 텍스트이기 때문에 미리 생성을 해놓아야 한다.
구체적으로는 docker-compose.yml 파일에서 volumes는
기본적으로 Docker에서 폴더로 생성하고 연결하기 때문에 생기는 오류이다.
따라서 아래 명령어를 수행하여 미리 파일을 만들어놓자.
sudo mkdir /etc/caddy
sudo touch /etc/caddy/Caddyfile
sudo chmod 755 /etc/caddy/Caddyfile
my_domain이 웹 페이지가 뜨지 않는 경우
만약 my_domain에 접속해도 웹 페이지가 뜨지 않는 경우는 SSL 인증에 실패한 것이라고 볼 수 있다.
먼저 아래 명령어를 통해 caddy의 문제를 확인하자.
sudo docker logs caddy
위와 같이 authorization failed 가 뜨면 SSL 인증에 실패한 것이다.
이 때는 Cloudflare에서 my_domain이 프록시가 되고 있는지 확인하자.
my_domain이 만약 프록시 되고 있다면 caddy에서는 SSL 인증을 실패한다.
따라서 해당 도메인을 편집을 통해 프록시를 해제한 후 아래 명령어를 실행해 다시 SSL 인증을 한다.
sudo docker restart caddy
sudo docker logs caddy
정상적으로 인증했다면 아래와 같이 "validations succeeded" 로그가 나올 것이다.
해당 SSL 인증 작업이 끝난 뒤에는 my_domain에 다시 프록시 시켜도 된다.
many redirection 이 뜨는 경우
만약 caddy 컨테이너까지 구성하고 my_domain Caddyfile을 제공했을 때
my_domain에 접속했을 때 many redirection이 뜨는 경우에는 Cloudflare SSL/TLS 설정을 의심할 수 있다.
먼저 아래 명령어를 입력하여 caddy에서 SSL 인증이 정상적으로 진행되었는지 확인한다.
sudo docker logs caddy
위 같이 "validations succeeded"가 ["my_domain"] 이 로그에 남아 있는지 확인해야 한다.
(["*. my_domain"]이 확인되면 ["my_domain"]도 SSL 인증이 된 것으로 간주할 수 있음)
확인이 되었다면 Cloudflare SSL/TLS 설정을 의심할 수 있으며
아래 창과 같이 현재 암호화 모드를 전체(엄격) 모드로 바꿔주면 정상적을 작동할 것이다.
다음은 NextCloud를 Caddy를 통해 웹을 배포한다.
https://was564.tistory.com/13
'개인 공부' 카테고리의 다른 글
Ubuntu Server Netplan 설정 (유선 eth0, 무선 wlan0) (0) | 2025.02.02 |
---|---|
NextCloud와 Caddy를 이용한 개인 드라이브 구축 4 (with Docker) (0) | 2025.01.23 |
NextCloud와 Caddy를 이용한 개인 드라이브 구축 2 (with Docker) (0) | 2025.01.23 |
NextCloud와 Caddy를 이용한 개인 드라이브 구축 1 (with Docker) (0) | 2025.01.23 |
운영체제 공부 혼자 요약 (Operating-Sysyem) (0) | 2024.06.26 |