stock.exdev.co.kr로 접속 url 변경
This commit is contained in:
@@ -5,7 +5,7 @@ set -euo pipefail
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
WORK_TREE="${WORK_TREE:-$ROOT}"
|
||||
export WORK_TREE
|
||||
export DESKTOP_UPDATE_BASE_URL="${DESKTOP_UPDATE_BASE_URL:-https://exdev.co.kr/desktop/updates}"
|
||||
export DESKTOP_UPDATE_BASE_URL="${DESKTOP_UPDATE_BASE_URL:-https://stock.exdev.co.kr/desktop/updates}"
|
||||
|
||||
CONF="$WORK_TREE/desktop/src-tauri/tauri.conf.json"
|
||||
CARGO="$WORK_TREE/desktop/src-tauri/Cargo.toml"
|
||||
|
||||
@@ -4,7 +4,7 @@ set -euo pipefail
|
||||
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
export WORK_TREE="${WORK_TREE:-$ROOT}"
|
||||
export DESKTOP_UPDATE_BASE_URL="${DESKTOP_UPDATE_BASE_URL:-https://exdev.co.kr/desktop/updates}"
|
||||
export DESKTOP_UPDATE_BASE_URL="${DESKTOP_UPDATE_BASE_URL:-https://stock.exdev.co.kr/desktop/updates}"
|
||||
export DESKTOP_BUMP_IGNORE_BUILD_INFO=1
|
||||
|
||||
"$ROOT/scripts/bump-desktop-version-from-release.sh"
|
||||
|
||||
@@ -10,7 +10,7 @@ UPDATES_DIR="${WORK_TREE}/frontend/public/desktop/updates"
|
||||
BUILD_INFO="${WORK_TREE}/dist-desktop/build-info.json"
|
||||
RELEASE_DIR="${GC_DESKTOP_APP_RELEASE_DIR:-$WORK_TREE/data/desktop-releases}"
|
||||
|
||||
PUBLISHED_LATEST_URL="${DESKTOP_PUBLISHED_LATEST_URL:-${DESKTOP_UPDATE_BASE_URL:-https://exdev.co.kr/desktop/updates}/latest.json}"
|
||||
PUBLISHED_LATEST_URL="${DESKTOP_PUBLISHED_LATEST_URL:-${DESKTOP_UPDATE_BASE_URL:-https://stock.exdev.co.kr/desktop/updates}/latest.json}"
|
||||
REMOTE_PUB_VER=""
|
||||
if REMOTE_JSON="$(curl -sf --connect-timeout 5 --max-time 12 "$PUBLISHED_LATEST_URL" 2>/dev/null)"; then
|
||||
REMOTE_PUB_VER="$(printf '%s' "$REMOTE_JSON" | node -e "
|
||||
|
||||
@@ -15,4 +15,4 @@ APK_REMOTE_SUBDIR=data/mobile-releases
|
||||
APK_REMOTE_NAME=goldenchart-android.apk
|
||||
|
||||
# 업로드 후 API 확인 URL
|
||||
PUBLIC_URL=http://exdev.co.kr
|
||||
PUBLIC_URL=https://stock.exdev.co.kr
|
||||
|
||||
@@ -4,4 +4,4 @@
|
||||
# REMOTE_PROJECT_DIR=/Users/aidev/apps/goldenChart
|
||||
# REMOTE_HOST=exdev.co.kr
|
||||
# REMOTE_USER=aidev
|
||||
# PUBLIC_URL=https://exdev.co.kr
|
||||
# PUBLIC_URL=https://stock.exdev.co.kr
|
||||
|
||||
+9
-1
@@ -85,7 +85,7 @@ UPDATES_DIR="$WORK_TREE/frontend/public/desktop/updates"
|
||||
if [[ -f "$ENSURE" && -d "$UPDATES_DIR" ]]; then
|
||||
DESKTOP_VER="$(node -p "require('$WORK_TREE/desktop/src-tauri/tauri.conf.json').version" 2>/dev/null || echo '0.1.0')"
|
||||
if ! node "$ENSURE" --dir "$UPDATES_DIR" --version "$DESKTOP_VER" \
|
||||
--base-url "${DESKTOP_UPDATE_BASE_URL:-https://exdev.co.kr/desktop/updates}" 2>/dev/null; then
|
||||
--base-url "${DESKTOP_UPDATE_BASE_URL:-https://stock.exdev.co.kr/desktop/updates}" 2>/dev/null; then
|
||||
warn "latest.json platforms 비어 있음 — Desktop Jenkins 파이프라인 publish 필요"
|
||||
fi
|
||||
LATEST="$UPDATES_DIR/latest.json"
|
||||
@@ -169,6 +169,14 @@ case "$SERVICE_NAME" in
|
||||
;;
|
||||
esac
|
||||
|
||||
VERIFY_UPDATER="$WORK_TREE/scripts/verify-desktop-updater-endpoint.sh"
|
||||
if [[ -x "$VERIFY_UPDATER" ]]; then
|
||||
info "[Phase 4b] Desktop updater latest.json (HTTPS)"
|
||||
if ! WORK_TREE="$WORK_TREE" "$VERIFY_UPDATER"; then
|
||||
warn "Desktop 자동 업데이트 엔드포인트 이상 — 배포는 완료됐으나 Caddy HTTPS 또는 Jenkins desktop publish 점검 필요"
|
||||
fi
|
||||
fi
|
||||
|
||||
log "======================================================"
|
||||
log " 배포 완료: $(date '+%Y-%m-%d %H:%M:%S')"
|
||||
log " 커밋: $(git --git-dir="$GIT_DIR" log --oneline -1 2>/dev/null || echo N/A)"
|
||||
|
||||
@@ -16,7 +16,7 @@ function arg(name, fallback) {
|
||||
|
||||
const dir = path.resolve(arg('--dir', 'frontend/public/desktop/updates'));
|
||||
const version = arg('--version', '0.1.0');
|
||||
const rawBaseUrl = arg('--base-url', 'https://exdev.co.kr/desktop/updates');
|
||||
const rawBaseUrl = arg('--base-url', 'https://stock.exdev.co.kr/desktop/updates');
|
||||
const baseUrl = rawBaseUrl.replace(/\/$/, '').replace(/^http:\/\//i, 'https://');
|
||||
const notes = arg('--notes', `GoldenChart Desktop ${version}`);
|
||||
const latestPath = path.join(dir, 'latest.json');
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
# exdev.co.kr — GoldenChart + Chatbot HTTPS 공존 (Caddy v2 예시)
|
||||
#
|
||||
# 원칙:
|
||||
# - 443 포트는 Caddy만 사용 (gc-frontend·chatbot은 443 바인딩 금지)
|
||||
# - GoldenChart: 호스트/ Docker gc-frontend :80
|
||||
# - Chatbot: 별도 컨테이너 내부 포트 (아래 CHATBOT_UPSTREAM 수정)
|
||||
#
|
||||
# 설치 위치 (ex-chatbot 프로젝트): docker/nginx/Caddyfile 또는 Caddyfile
|
||||
# 적용 후: docker compose restart caddy (프로젝트명에 맞게 조정)
|
||||
#
|
||||
# 검증:
|
||||
# curl -sS -o /dev/null -w "GC HTTPS %{size_download}\n" https://exdev.co.kr/
|
||||
# curl -sS -o /dev/null -w "CB HTTPS %{size_download}\n" https://exdev.co.kr/chatbot/
|
||||
# ./scripts/verify-desktop-updater-endpoint.sh
|
||||
{
|
||||
# HTTP/2·HTTP/3 — 본문 버퍼링 이슈 완화
|
||||
servers {
|
||||
protocols h1 h2 h3
|
||||
}
|
||||
}
|
||||
|
||||
(exdev_tls) {
|
||||
# Let's Encrypt — ex-chatbot obtain-cert-exdev.sh 로 발급한 인증서 경로에 맞게 수정
|
||||
tls /etc/caddy/certs/fullchain.pem /etc/caddy/certs/privkey.pem
|
||||
}
|
||||
|
||||
# ── Chatbot upstream (실제 포트·호스트명은 환경에 맞게) ─────────────────────
|
||||
# Docker: chatbot 컨테이너명:내부포트 / 호스트: host.docker.internal:PORT
|
||||
(chatbot_upstream) {
|
||||
reverse_proxy host.docker.internal:8081 {
|
||||
flush_interval -1
|
||||
transport http {
|
||||
versions 1.1 2
|
||||
}
|
||||
header_up Host {host}
|
||||
header_up X-Forwarded-Proto https
|
||||
header_up X-Forwarded-Prefix /chatbot
|
||||
}
|
||||
}
|
||||
|
||||
# ── GoldenChart (gc-frontend nginx :80) ─────────────────────────────────────
|
||||
(goldenchart_upstream) {
|
||||
reverse_proxy host.docker.internal:80 {
|
||||
flush_interval -1
|
||||
transport http {
|
||||
versions 1.1 2
|
||||
}
|
||||
header_up Host {host}
|
||||
header_up X-Real-IP {remote_host}
|
||||
header_up X-Forwarded-For {remote_host}
|
||||
header_up X-Forwarded-Proto https
|
||||
}
|
||||
}
|
||||
|
||||
exdev.co.kr {
|
||||
import exdev_tls
|
||||
|
||||
# 1) Chatbot — /chatbot/* (경로 유지; 앱이 /chatbot base path 를 기대할 때)
|
||||
@chatbot path /chatbot /chatbot/*
|
||||
handle @chatbot {
|
||||
import chatbot_upstream
|
||||
}
|
||||
|
||||
# 2) GoldenChart — 나머지 전부 (SPA, /api 는 nginx→backend, /desktop/updates 등)
|
||||
handle {
|
||||
import goldenchart_upstream
|
||||
}
|
||||
}
|
||||
|
||||
# ── 대안: 서브도메인 분리 (경로 충돌이 없어 운영이 단순함) ─────────────────────
|
||||
# chat.exdev.co.kr {
|
||||
# import exdev_tls
|
||||
# import chatbot_upstream
|
||||
# }
|
||||
# chart.exdev.co.kr {
|
||||
# import exdev_tls
|
||||
# import goldenchart_upstream
|
||||
# }
|
||||
# }
|
||||
@@ -0,0 +1,6 @@
|
||||
# GoldenChart + Chatbot 서브도메인 (ex-chatbot Caddy에 통합됨)
|
||||
# 실제 운영 Caddyfile: exAIChatbot2.0/docker/caddy/Caddyfile.exdev
|
||||
#
|
||||
# stock.exdev.co.kr → gc-frontend :80
|
||||
# chatbot.exdev.co.kr → rag-api + Admin
|
||||
# exdev.co.kr → /chatbot/* 리다이렉트 + 나머지 stock 리다이렉트
|
||||
@@ -6,7 +6,7 @@
|
||||
* node scripts/generate-desktop-latest-json.mjs \
|
||||
* --version 0.1.0 \
|
||||
* --dir dist-desktop/updates \
|
||||
* --base-url https://exdev.co.kr/desktop/updates \
|
||||
* --base-url https://stock.exdev.co.kr/desktop/updates \
|
||||
* --notes "Release notes"
|
||||
*/
|
||||
import fs from 'node:fs';
|
||||
@@ -19,7 +19,7 @@ function arg(name, fallback) {
|
||||
|
||||
const version = arg('--version', '0.1.0');
|
||||
const dir = path.resolve(arg('--dir', 'dist-desktop/updates'));
|
||||
const rawBaseUrl = arg('--base-url', 'https://exdev.co.kr/desktop/updates');
|
||||
const rawBaseUrl = arg('--base-url', 'https://stock.exdev.co.kr/desktop/updates');
|
||||
const baseUrl = rawBaseUrl.replace(/\/$/, '').replace(/^http:\/\//i, 'https://');
|
||||
const notes = arg('--notes', `GoldenChart Desktop ${version}`);
|
||||
|
||||
|
||||
@@ -58,7 +58,7 @@ fi
|
||||
|
||||
export WORK_TREE
|
||||
export BUILD_NUMBER="${BUILD_NUMBER:-}"
|
||||
export DESKTOP_UPDATE_BASE_URL="${DESKTOP_UPDATE_BASE_URL:-https://exdev.co.kr/desktop/updates}"
|
||||
export DESKTOP_UPDATE_BASE_URL="${DESKTOP_UPDATE_BASE_URL:-https://stock.exdev.co.kr/desktop/updates}"
|
||||
|
||||
GIT_VER="$(node -p "require('$WORK_TREE/desktop/src-tauri/tauri.conf.json').version" 2>/dev/null || echo '?')"
|
||||
log "Desktop git tauri.conf: v${GIT_VER}"
|
||||
@@ -71,7 +71,7 @@ log "Built version: v${BUILT_VER}"
|
||||
|
||||
WORK_TREE="$WORK_TREE" \
|
||||
ARTIFACT_DIR="$WORK_TREE/dist-desktop" \
|
||||
DESKTOP_UPDATE_BASE_URL="${DESKTOP_UPDATE_BASE_URL:-https://exdev.co.kr/desktop/updates}" \
|
||||
DESKTOP_UPDATE_BASE_URL="${DESKTOP_UPDATE_BASE_URL:-https://stock.exdev.co.kr/desktop/updates}" \
|
||||
TAURI_SIGNER_KEY="${TAURI_SIGNER_KEY:-$HOME/.tauri/goldenchart.key}" \
|
||||
DESKTOP_RELEASE_NOTES="${DESKTOP_RELEASE_NOTES:-Build ${BUILD_NUMBER:-local} v${BUILT_VER}}" \
|
||||
"$WORK_TREE/scripts/publish-desktop-update.sh"
|
||||
|
||||
@@ -27,9 +27,9 @@ conf.bundle.createUpdaterArtifacts = enable;
|
||||
conf.plugins = conf.plugins || {};
|
||||
conf.plugins.updater = conf.plugins.updater || {};
|
||||
conf.plugins.updater.endpoints = (conf.plugins.updater.endpoints || [])
|
||||
.map((u) => String(u).replace(/^http:\\/\\/exdev\\.co\\.kr\\//, 'https://exdev.co.kr/'));
|
||||
.map((u) => String(u).replace(/^http:\\/\\/exdev\\.co\\.kr\\//, 'https://stock.exdev.co.kr/'));
|
||||
if (!conf.plugins.updater.endpoints.length) {
|
||||
conf.plugins.updater.endpoints = ['https://exdev.co.kr/desktop/updates/latest.json'];
|
||||
conf.plugins.updater.endpoints = ['https://stock.exdev.co.kr/desktop/updates/latest.json'];
|
||||
}
|
||||
if (!conf.plugins.updater.pubkey) {
|
||||
conf.plugins.updater.pubkey = 'REPLACE_WITH_TAURI_SIGNER_PUBKEY';
|
||||
|
||||
@@ -8,7 +8,7 @@ ARTIFACT_DIR="${ARTIFACT_DIR:-$WORK_TREE/dist-desktop}"
|
||||
UPDATES_SRC="${UPDATES_SRC:-$ARTIFACT_DIR/updates}"
|
||||
UPDATES_DIR="${UPDATES_DIR:-$WORK_TREE/frontend/public/desktop/updates}"
|
||||
WEB_STATIC_DIR="${WEB_STATIC_DIR:-$UPDATES_DIR}"
|
||||
BASE_URL="${DESKTOP_UPDATE_BASE_URL:-https://exdev.co.kr/desktop/updates}"
|
||||
BASE_URL="${DESKTOP_UPDATE_BASE_URL:-https://stock.exdev.co.kr/desktop/updates}"
|
||||
BASE_URL="${BASE_URL/http:\/\//https:\/\/}"
|
||||
DESKTOP_RELEASE_DIR="${GC_DESKTOP_APP_RELEASE_DIR:-$WORK_TREE/data/desktop-releases}"
|
||||
KEY_PATH="${TAURI_SIGNER_KEY:-$HOME/.tauri/goldenchart.key}"
|
||||
|
||||
@@ -5,7 +5,7 @@ set -euo pipefail
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
export PATH="/opt/homebrew/bin:/usr/local/bin:${PATH:-/usr/bin:/bin}"
|
||||
UPDATES_DIR="${UPDATES_DIR:-${WORK_TREE:-$ROOT}/frontend/public/desktop/updates}"
|
||||
BASE_URL="${DESKTOP_UPDATE_BASE_URL:-https://exdev.co.kr/desktop/updates}"
|
||||
BASE_URL="${DESKTOP_UPDATE_BASE_URL:-https://stock.exdev.co.kr/desktop/updates}"
|
||||
BASE_URL="${BASE_URL/http:\/\//https:\/\/}"
|
||||
|
||||
if [[ ! -d "$UPDATES_DIR" ]]; then
|
||||
|
||||
@@ -54,7 +54,7 @@ export PATH="/opt/homebrew/opt/llvm/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/us
|
||||
export WORK_TREE="${WORK_TREE}"
|
||||
export GIT_DIR="${GIT_DIR}"
|
||||
export BUILD_NUMBER="\${BUILD_NUMBER}"
|
||||
export DESKTOP_UPDATE_BASE_URL="${DESKTOP_UPDATE_BASE_URL:-https://exdev.co.kr/desktop/updates}"
|
||||
export DESKTOP_UPDATE_BASE_URL="${DESKTOP_UPDATE_BASE_URL:-https://stock.exdev.co.kr/desktop/updates}"
|
||||
export TAURI_SIGNER_KEY="\${TAURI_SIGNER_KEY:-\$HOME/.tauri/goldenchart.key}"
|
||||
export DESKTOP_DEPLOY_WEB=0
|
||||
"${WORK_TREE}/scripts/jenkins-desktop-pipeline.sh"
|
||||
|
||||
@@ -62,6 +62,6 @@ export GC_MOBILE_JENKINS_TOKEN="${DESKTOP_TOKEN:-}"
|
||||
log "API 확인"
|
||||
sleep 4
|
||||
curl -fsSL http://127.0.0.1:8080/api/mobile-app/info 2>/dev/null | python3 -m json.tool 2>/dev/null || \
|
||||
curl -fsSL http://exdev.co.kr/api/mobile-app/info | python3 -m json.tool 2>/dev/null || true
|
||||
curl -fsSL https://stock.exdev.co.kr/api/mobile-app/info | python3 -m json.tool 2>/dev/null || true
|
||||
|
||||
log "완료 (Android APK · iPad는 향후 TestFlight)"
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
set -euo pipefail
|
||||
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
BASE_URL="${DESKTOP_UPDATE_BASE_URL:-https://exdev.co.kr/desktop/updates}"
|
||||
BASE_URL="${DESKTOP_UPDATE_BASE_URL:-https://stock.exdev.co.kr/desktop/updates}"
|
||||
FAIL=0
|
||||
|
||||
ok() { echo "[OK] $*"; }
|
||||
@@ -43,8 +43,12 @@ fi
|
||||
if curl -sf "${BASE_URL}/latest.json" >/dev/null 2>&1; then
|
||||
REMOTE="$(curl -sf "${BASE_URL}/latest.json" 2>/dev/null || true)"
|
||||
if [[ -z "$REMOTE" || "${#REMOTE}" -lt 8 ]]; then
|
||||
echo "[FAIL] remote latest.json empty (0-byte)"
|
||||
exit 1
|
||||
HTTP_BASE="$(printf '%s' "$BASE_URL" | sed 's|^https://|http://|')"
|
||||
HTTP_REMOTE="$(curl -sf "${HTTP_BASE}/latest.json" 2>/dev/null || true)"
|
||||
if [[ -n "$HTTP_REMOTE" && "${#HTTP_REMOTE}" -ge 8 ]]; then
|
||||
fail "remote HTTPS latest.json empty — HTTP는 정상 (${#HTTP_REMOTE}B). Caddy→gc-frontend:80 역프록시 점검"
|
||||
fi
|
||||
fail "remote latest.json empty (0-byte)"
|
||||
fi
|
||||
node -e "JSON.parse(process.argv[1])" "$REMOTE" && ok "remote latest.json ${BASE_URL}/latest.json"
|
||||
else
|
||||
|
||||
@@ -26,7 +26,7 @@ REMOTE_USER="${REMOTE_USER:-aidev}"
|
||||
REMOTE_PORT="${REMOTE_PORT:-22}"
|
||||
APK_REMOTE_SUBDIR="${APK_REMOTE_SUBDIR:-data/mobile-releases}"
|
||||
APK_REMOTE_NAME="${APK_REMOTE_NAME:-goldenchart-android.apk}"
|
||||
PUBLIC_URL="${PUBLIC_URL:-http://exdev.co.kr}"
|
||||
PUBLIC_URL="${PUBLIC_URL:-https://stock.exdev.co.kr}"
|
||||
|
||||
LOCAL_APK="${LOCAL_APK:-$ROOT/data/mobile-releases/$APK_REMOTE_NAME}"
|
||||
DO_BUILD=false
|
||||
@@ -169,7 +169,7 @@ build_apk_locally() {
|
||||
"$ROOT/scripts/ensure-android-google-services.sh"
|
||||
|
||||
if [[ ! -f "$ROOT/app/.env" ]] || ! grep -q 'VITE_API_BASE_URL=http' "$ROOT/app/.env" 2>/dev/null; then
|
||||
echo -e "${YELLOW}⚠ app/.env 에 VITE_API_BASE_URL=http://exdev.co.kr/api 확인 (HTTPS 아님)${NC}"
|
||||
echo -e "${YELLOW}⚠ app/.env 에 VITE_API_BASE_URL=https://stock.exdev.co.kr/api 확인 (HTTPS 아님)${NC}"
|
||||
fi
|
||||
|
||||
echo -e "${CYAN}[빌드] npm run cap:sync${NC}"
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
set -euo pipefail
|
||||
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
BASE_URL="${DESKTOP_UPDATE_BASE_URL:-https://exdev.co.kr/desktop/updates}"
|
||||
BASE_URL="${DESKTOP_UPDATE_BASE_URL:-https://stock.exdev.co.kr/desktop/updates}"
|
||||
LATEST_URL="${DESKTOP_PUBLISHED_LATEST_URL:-${BASE_URL}/latest.json}"
|
||||
UPDATES_DIR="${UPDATES_DIR:-$ROOT/frontend/public/desktop/updates}"
|
||||
RELEASE_DIR="${GC_DESKTOP_APP_RELEASE_DIR:-$ROOT/data/desktop-releases}"
|
||||
@@ -19,6 +19,11 @@ REMOTE_PLATFORMS="0"
|
||||
if REMOTE_JSON="$(curl -sf --connect-timeout 5 --max-time 12 "$LATEST_URL" 2>/dev/null)"; then
|
||||
if [[ -z "$REMOTE_JSON" || "${#REMOTE_JSON}" -lt 8 ]]; then
|
||||
log "remote latest.json → EMPTY (0-byte — updater JSON parse 실패 원인)"
|
||||
HTTP_URL="$(printf '%s' "$LATEST_URL" | sed 's|^https://|http://|')"
|
||||
HTTP_JSON="$(curl -sf --connect-timeout 5 --max-time 12 "$HTTP_URL" 2>/dev/null || true)"
|
||||
if [[ -n "$HTTP_JSON" && "${#HTTP_JSON}" -ge 8 ]]; then
|
||||
log "remote HTTP latest → OK (${#HTTP_JSON}B) — HTTPS(Caddy) 역프록시가 빈 200을 반환 중일 가능성"
|
||||
fi
|
||||
else
|
||||
read -r REMOTE_VER REMOTE_PLATFORMS <<< "$(printf '%s' "$REMOTE_JSON" | node -e "
|
||||
let d=''; process.stdin.on('data',c=>d+=c);
|
||||
|
||||
Executable
+66
@@ -0,0 +1,66 @@
|
||||
#!/usr/bin/env bash
|
||||
# Desktop updater latest.json — HTTPS·HTTP 무결성 (Caddy 역프록시 빈 응답 감지)
|
||||
set -euo pipefail
|
||||
|
||||
BASE_URL="${DESKTOP_UPDATE_BASE_URL:-https://stock.exdev.co.kr/desktop/updates}"
|
||||
BASE_URL="${BASE_URL%/}"
|
||||
HTTPS_URL="${DESKTOP_PUBLISHED_LATEST_URL:-${BASE_URL}/latest.json}"
|
||||
HTTP_URL="$(printf '%s' "$HTTPS_URL" | sed 's|^https://|http://|')"
|
||||
|
||||
log() { echo "[verify-updater-endpoint] $*"; }
|
||||
warn() { log "WARN: $*"; }
|
||||
fail() { log "FAIL: $*"; exit 1; }
|
||||
|
||||
fetch_body() {
|
||||
local url="$1"
|
||||
curl -sf --connect-timeout 8 --max-time 15 "$url" 2>/dev/null || true
|
||||
}
|
||||
|
||||
parse_manifest() {
|
||||
local body="$1"
|
||||
printf '%s' "$body" | node -e "
|
||||
let d=''; process.stdin.on('data',c=>d+=c);
|
||||
process.stdin.on('end',()=>{
|
||||
try {
|
||||
const j=JSON.parse(d);
|
||||
const n=Object.keys(j.platforms||{}).length;
|
||||
console.log((j.version||'')+' '+n);
|
||||
} catch { console.log('PARSE_ERR 0'); }
|
||||
});
|
||||
" 2>/dev/null || echo "PARSE_ERR 0"
|
||||
}
|
||||
|
||||
log "HTTPS → $HTTPS_URL"
|
||||
log "HTTP → $HTTP_URL"
|
||||
|
||||
HTTPS_BODY="$(fetch_body "$HTTPS_URL")"
|
||||
HTTP_BODY="$(fetch_body "$HTTP_URL")"
|
||||
HTTPS_SIZE="${#HTTPS_BODY}"
|
||||
HTTP_SIZE="${#HTTP_BODY}"
|
||||
|
||||
log "HTTPS size=${HTTPS_SIZE}B HTTP size=${HTTP_SIZE}B"
|
||||
|
||||
if [[ "$HTTPS_SIZE" -lt 8 && "$HTTP_SIZE" -ge 8 ]]; then
|
||||
read -r HTTP_VER HTTP_PLAT <<< "$(parse_manifest "$HTTP_BODY")"
|
||||
fail "HTTPS latest.json 이 비어 있습니다 (${HTTPS_SIZE}B). HTTP는 v${HTTP_VER} (${HTTP_SIZE}B, platforms=${HTTP_PLAT}) — Caddy(443) → gc-frontend:80 역프록시를 점검하세요."
|
||||
fi
|
||||
|
||||
if [[ "$HTTPS_SIZE" -lt 8 && "$HTTP_SIZE" -lt 8 ]]; then
|
||||
fail "latest.json 이 HTTPS·HTTP 모두 비어 있습니다 — Desktop Jenkins publish 후 scripts/publish-desktop-update.sh 실행 필요"
|
||||
fi
|
||||
|
||||
BODY="$HTTPS_BODY"
|
||||
[[ "$HTTPS_SIZE" -lt 8 ]] && BODY="$HTTP_BODY"
|
||||
|
||||
read -r VER PLAT <<< "$(parse_manifest "$BODY")"
|
||||
if [[ "$VER" == "PARSE_ERR" || -z "$VER" ]]; then
|
||||
fail "latest.json JSON 파싱 실패 (HTTPS ${HTTPS_SIZE}B / HTTP ${HTTP_SIZE}B)"
|
||||
fi
|
||||
|
||||
if [[ "${PLAT:-0}" -eq 0 ]]; then
|
||||
warn "latest.json v${VER} — platforms 비어 있음 (서명된 updater bundle 없음). 자동 업데이트는 실패할 수 있습니다."
|
||||
exit 2
|
||||
fi
|
||||
|
||||
log "OK v${VER} platforms=${PLAT} (HTTPS ${HTTPS_SIZE}B)"
|
||||
exit 0
|
||||
Reference in New Issue
Block a user