diff --git a/create-domain/action.yml b/create-domain/action.yml index a5bc184..637c48b 100644 --- a/create-domain/action.yml +++ b/create-domain/action.yml @@ -116,24 +116,59 @@ runs: TOKEN=$(printf '%s' "$TOKEN_BODY" | jq -r '.token') AUTH="Authorization: Bearer ${TOKEN}" + WS=$([ "$WEBSOCKETS" = "true" ] && echo true || echo false) + # --------------------------------------------------------------- - # 2. 도메인 중복 체크 (2번째 실행 대응) + # 2. 기존 프록시 호스트 확인 (멱등성: 2번째 실행 대응) # --------------------------------------------------------------- HOST_ID=$(api GET "/nginx/proxy-hosts" \ | jq -r --arg d "$DOMAIN" \ 'map(select(.domain_names | index($d))) | .[0].id // empty') - if [ -n "$HOST_ID" ]; then - echo "이미 존재하는 도메인입니다: ${DOMAIN} (host id=${HOST_ID})" - echo "host-id=${HOST_ID}" >> "$GITHUB_OUTPUT" - echo "created=false" >> "$GITHUB_OUTPUT" - exit 0 + CREATED=false + + # --------------------------------------------------------------- + # 3. HTTP 전용 프록시 호스트 먼저 생성 (SSL 없이) + # 도메인이 80포트로 응답해야 Let's Encrypt HTTP-01 검증이 통과합니다. + # --------------------------------------------------------------- + if [ -z "$HOST_ID" ]; then + echo "HTTP 프록시 호스트 생성 중: ${DOMAIN} -> ${FORWARD_SCHEME}://${FORWARD_HOST}:${FORWARD_PORT}" + HTTP_PAYLOAD=$(jq -nc \ + --arg d "$DOMAIN" \ + --arg fh "$FORWARD_HOST" \ + --arg fp "$FORWARD_PORT" \ + --arg fs "$FORWARD_SCHEME" \ + --argjson ws "$WS" \ + '{domain_names:[$d], + forward_host:$fh, + forward_port:($fp|tonumber), + forward_scheme:$fs, + certificate_id:0, + ssl_forced:false, + http2_support:false, + hsts_enabled:false, + hsts_subdomains:false, + caching_enabled:false, + allow_websocket_upgrade:$ws, + block_exploits:true, + access_list_id:0, + advanced_config:"", + locations:[], + meta:{}}') + HOST_ID=$(api POST "/nginx/proxy-hosts" "$HTTP_PAYLOAD" | jq -r '.id') + if [ -z "$HOST_ID" ] || [ "$HOST_ID" = "null" ]; then + echo "프록시 호스트 생성 실패: ${DOMAIN}" + exit 1 + fi + CREATED=true + else + echo "기존 프록시 호스트 사용: ${DOMAIN} (host id=${HOST_ID})" fi # --------------------------------------------------------------- - # 3. Let's Encrypt 인증서 발급 — 인증서도 멱등 처리 + # 4. Let's Encrypt 인증서 발급 (HTTP 호스트가 떠 있는 상태에서 검증) + # 같은 도메인 인증서가 이미 있으면 재사용합니다. # --------------------------------------------------------------- - # 같은 도메인의 기존 인증서가 있으면 재사용합니다. CERT_ID=$(api GET "/nginx/certificates" \ | jq -r --arg d "$DOMAIN" \ 'map(select(.provider=="letsencrypt" and (.domain_names | index($d)))) | .[0].id // empty') @@ -158,13 +193,10 @@ runs: fi # --------------------------------------------------------------- - # 4. 프록시 호스트 생성 (SSL 강제 + HTTP/2 고정 적용) + # 5. 프록시 호스트에 SSL 적용 (PUT 업데이트: SSL 강제 + HTTP/2) # --------------------------------------------------------------- - echo "프록시 호스트 생성 중: ${DOMAIN} -> ${FORWARD_SCHEME}://${FORWARD_HOST}:${FORWARD_PORT}" - - WS=$([ "$WEBSOCKETS" = "true" ] && echo true || echo false) - - PAYLOAD=$(jq -nc \ + echo "프록시 호스트에 SSL 적용 중: ${DOMAIN} (cert id=${CERT_ID})" + SSL_PAYLOAD=$(jq -nc \ --arg d "$DOMAIN" \ --arg fh "$FORWARD_HOST" \ --arg fp "$FORWARD_PORT" \ @@ -187,14 +219,8 @@ runs: advanced_config:"", locations:[], meta:{}}') + api PUT "/nginx/proxy-hosts/${HOST_ID}" "$SSL_PAYLOAD" > /dev/null - HOST_ID=$(api POST "/nginx/proxy-hosts" "$PAYLOAD" | jq -r '.id') - - if [ -z "$HOST_ID" ] || [ "$HOST_ID" = "null" ]; then - echo "프록시 호스트 생성 실패: ${DOMAIN}" - exit 1 - fi - - echo "도메인 생성 완료: ${DOMAIN} (host id=${HOST_ID})" + echo "도메인 생성/SSL 적용 완료: ${DOMAIN} (host id=${HOST_ID})" echo "host-id=${HOST_ID}" >> "$GITHUB_OUTPUT" - echo "created=true" >> "$GITHUB_OUTPUT" + echo "created=${CREATED}" >> "$GITHUB_OUTPUT"