5 min read

Caddy-reverse proxy-진작 알았으면시리즈2

Caddy-reverse proxy-진작 알았으면시리즈2
Caddy- revserse proxy
💡
reverse proxy????

내 도커는 caddy를 만나기 전과 후로 나눌수 있을 정도이다.
이게 없으면 nginx를 써서 rever proxy 설정을 하고, 인증도 해줘야 되는 설정이 엄청 복잡하다.

proxy를 쓰는 이유는? cache를 쓰는 이유와 같다.google이, naver가 우리에게 직접적으로 정보를 주는 것 같지만 그 사이에는 수많은 proxy server를 지난다. 그러면 역방향 proxy라고 하는 것은 ....forward proxy의 반대이다.

caddy는 서버에 오는 신호를 설치해서 컨테이너로 서비스를 전달해 주는 역할을 한다. 사용자는 caddy까지 호출하면 caddy는 해당 컨테이너 서비스 포트를 열어준다.
그래서! 같은 포트를 몇개를 쓰든 상관이 없는 것이다.

그래서 나같은 경우도 ghost를 4개 정도를 한 서버에서 쓸 수 있는 것이다.

그전에는 traefik을 썻는데 자잘한 오류가 제법 많았다. 유일한 장점은 관리페이지가 깔끔하다는 것이다.

caddy 장점

  1. traefik보다 더 단순하다.
    - 더 복잡할 것 같지만 lable만 봐도 간단하다.
  2. 단순해서 그런지 오류가 잘 안난다. traefik때는 자주 방화벽 이슈 때문에 재기동을 해줬는데 caddy 오류가 나더라도 바로 복구 된다.

사실 caddy만의 장점은 이게 다 고 reverse proxy를 쓰면 전/ 후 차이가 다르다

Caddy web server
  1. 안쓰면 포트를 일일히 열어줘야 한다. http, https 만 열어주면 안열어줘도 됨.caddy가 열어줌. 모든 내부포트를 docker에서 낚아채서 열린거였음.
[외부 요청 :80/:443]
        ↓
🔥 iptables PREROUTING (여기서 Docker가 낚아챔)
        ↓
DNAT → 172.18.0.2 (컨테이너)
        ↓
컨테이너(Caddy)
        ↓
응답

2.그냥 lable만 해주면 cname으로 여러가지 서비스를 할 수 있다.
-예를 들어 phpmyadmin은 db.facil.co.kr, filebrowser는 fb.facil.co.kr 이런 식으로

  1. 인증서 관리를 할 필요가 없다. 인터넷에 떠 돌아 다니는 인증서 관리 설정은 caddy로 모두 종결된다고 볼 수 있다.

💡
사용방법
  1. dns 등록 - 서버의 공인 IP를 caddy 서버를 해줘야 한다.
  2. 도커 스웜의 경우에는 꼭 매니저에서 해줘야 한다.
  3. 방화벽에서 꼭 80, 443을 열어줘야 한다. 81, 8443 같은 포트로 변형은 안된다.
  4. 도커 볼륨은 바인드볼륨으로 하면 관리가 편하다
    mkdir -p /docker/caddy/data
    mkdir -p /docker/caddy/config
  5. 네트워크는 꼭 만들고 써라. 아니면 alias로 생겨 이상해진다.
    docker network create --driver=overlay --attachable proxy
  6. 그다음 아래내용 배포
    docker stack deploy -c /yaml/caddy.yml HA --detach=false

오류는 chatgpt보다 claude가 원인 파악을 잘한다.

version: "3.8"
services:
  caddy:
    image: lucaslorentz/caddy-docker-proxy:ci-alpine
    ports:
      - "80:80"
      - "443:443"
        #      - "2019:2019"  # Admin API 포트,caddy open # 외부포트 개방필요없음version: "3.8"
services:
  caddy:
    image: lucaslorentz/caddy-docker-proxy:ci-alpine
    ports:
      - "80:80"
      - "443:443"
        #      - "2019:2019"  # Admin API 포트,caddy open # 외부포트 개방필요없음
    volumes:
      - /docker/caddy/data:/data
      - /docker/caddy/config:/config
      - /var/run/docker.sock:/var/run/docker.sock:ro
    networks:
      - proxy
    environment:
      - TZ=Asia/Seoul
      - CADDY_INGRESS_NETWORKS=proxy
    deploy:
      replicas: 1
      placement:
        constraints:
          - node.role == manager
      restart_policy:
        condition: on-failure
    labels:
      caddy.admin: "0.0.0.0:2019"  # 외부에서 Admin API 접근 허용

  caddy-ui:        # 어떤 cname이 있는지 확인 가능하다
    image: qmcgaw/caddy-ui:latest
    environment:
      - CADDY_API_ENDPOINT=http://caddy:2019
      - TZ=Asia/Seoul
    networks:
      - proxy
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
      placement:
        constraints:
          - node.role == manager    # 추가!
    labels:    #레이블만 해줘도 cname이 생성된다.
      caddy: "caddy.argok.co.kr"
      caddy.reverse_proxy: "{{upstreams 8000}}"

  whoami:            #테스트용
    image: traefik/whoami
    networks:
      - proxy
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
    labels:
      caddy: "whoami.argok.co.kr"
      caddy.reverse_proxy: "{{upstreams 80}}"

networks:
  proxy:
    external: true

caddy, cddy 설정UI, 확인용 whoami

network는 external 안쓰면 이름이 이상해 진다. 꼭 만들어서 써라.
docker network create --아래 링크 참조---

lucaslorentz/caddy-docker-proxy:ci-alpine 이미지를 써야
lables 만으로 cnam이 가능해서 편하다. => 서비스 밑에 label만 추가하면 끝!

아니면 Caddyfile에 서비스명 맞춰서 수정하고 caddy를 재기동 해야 한다....서비스를 추가 할 때 마다

도커 스웜 명령어
매니저 노드에서 일단 확인 docker node ls 워커에서 조인할 꺼 알려줌 docker swarm join-token worker 나는 미리 zero-tier로 vpn으로 다 묶어놓음. 그러면 스웜포트 별도 개방 안해도 됨. 그리고 zertier를 대역대로 방화벽도 개방해 놓음 (이건 별도 설명 필요함~) 그래서 이렇게 나옴. 요걸 복사해서 1. 도커 설치 2. 워커노드에 그대로 복사 그러면