구독 업데이트를 다섯 개 검증 지점으로 나누기
OpenClash 구독 업데이트는 라우터에 파일 하나를 다운로드하는 것으로 끝나지 않습니다. 공식 업데이트 구현은 구독 항목을 읽고, 요청하고, 설정을 테스트하고, YAML을 검증하고, 예상되는 프록시 데이터를 확인한 후 대상 설정을 만들거나 씁니다. 앞 단계 성공은 코어 로드 성공을 보장하지 않습니다.
| 단계 | 성공이 증명하는 것 | 실패 시 확인 |
|---|---|---|
| URL 요청 | 라우터가 HTTP 응답을 받음 | DNS, TLS, 상태 코드, 리디렉션 |
| 내용 인식 | 응답이 설정처럼 보임 | 로그인 HTML, 오류 텍스트, 빈 본문 |
| YAML/코어 검증 | 문법과 필수 구조를 파싱할 수 있음 | 오류 줄, 들여쓰기, 비호환 필드 |
| 파일 쓰기 | 처리 결과가 저장소에 도달 | 여유 공간, 권한, 파일 시스템 |
| 선택과 로드 | 실행 코어가 새 프로필을 적용 | 활성 경로, 시작 로그, 포트 충돌 |
로그를 위에서부터 읽고 처음 실패한 지점을 찾으세요. 뒤의 메시지는 연쇄 결과인 경우가 많습니다. DNS, 변환 서비스, 템플릿, 코어를 동시에 바꾸면 어느 의존성이 수리되었는지 알 수 없습니다.
수동 갱신 전 정상 설정과 구독 비밀 보호
라우터 네트워크 변경은 문제 해결에 필요한 연결도 끊을 수 있습니다. 갱신 전에 현재 로드되는 YAML, OpenClash UCI 설정, 관련 사용자 정의 파일을 백업하고 활성 설정 이름을 기록하세요. 백업은 라우터와 독립된 신뢰할 수 있는 장소에 두되 공개 저장소나 그룹 채팅에 올리지 마세요.
- 시간: 시계가 크게 틀리면 HTTPS 인증서 검증이 실패합니다. NTP 동기화를 확인합니다.
- 저장 공간: 설정, 규칙 제공자, 임시 파일에 쓰기 공간이 필요합니다. 다운로드 성공은 후속 쓰기 성공이 아닙니다.
- WAN과 DNS: 교체할 프로필에 의존하지 않고 라우터 자체가 구독 호스트를 해석하고 HTTPS로 도달하는지 봅니다.
- URL 보호: 구독 링크에는 토큰이 있습니다. 스크린샷과 로그에서 쿼리를 숨기고 공개 '파서'에 넣지 않습니다.
유일하게 작동하는 프로필을 삭제하지 마세요. 플러그인과 코어가 여전히 작동함을 증명하고 공식 문서를 읽을 네트워크 경로를 남깁니다.
관찰 가능한 수동 업데이트 한 번 실행
예정된 업데이트를 잠시 멈추고 구독 하나만 테스트합니다. 구독 설정에서 활성화, 설정 이름, 주소, User-Agent, 변환 여부를 기록합니다. '성공률'을 높인다며 여러 변환 URL이나 사용자 정의 템플릿을 동시에 바꾸지 마세요. 각각 다른 경로와 응답 형식을 추가합니다.
- 현재 로그를 지우거나 시작 지점을 표시하고 Update를 누를 시각을 기록합니다.
- 구독 하나에 업데이트를 한 번 시작하고 백엔드가 끝날 때까지 페이지를 반복 새로고침하거나 버튼을 연타하지 않습니다.
- 표시한 지점에서 다운로드, 설정 테스트, 형식 검증, 프록시 필드 부재, 파일 생성 또는 쓰기 메시지를 찾습니다.
- 성공을 보고하면 대상 파일 시간과 크기를 비교하고 OpenClash 활성 설정 경로가 그 파일인지 확인합니다.
- 코어를 재로드하고 파싱 오류가 있다면 첫 번째를 기록한 뒤 하나의 실제 연결을 테스트합니다.
공식 스크립트에는 다운로드된 설정 테스트, YAML 형식 검증, 프록시 필드가 없는 결과 등의 별도 분기가 있습니다. 브라우저 요청이 끝나거나 스피너가 사라졌다고 모든 백엔드 검사가 통과한 것은 아닙니다.
첫 로그 메시지를 실패 계층에 매핑
| 메시지 | 실패 단계 | 다음 확인 |
|---|---|---|
| DNS / connect / TLS | 유효한 본문을 받기 전 | 라우터 DNS, 시계, WAN, 대상 호스트 |
| HTTP 응답 후 형식 검증 실패 | HTML, 빈 텍스트, 비호환 YAML 가능성 | 응답 유형, 만료, User-Agent |
| Has No Proxy Field | 예상된 프록시 구조가 없음 | OpenClash/Mihomo 호환 프로필인지 |
| Write file failed | 처리 데이터를 쓸 수 없음 | 공간, 파일 시스템, 권한, 파일명 |
| 구 노드가 남아 있음 | 새 파일이 선택되지 않았거나 코어가 재로드되지 않음 | 활성 설정 경로와 코어 시작 로그 |
구독 변환을 사용하면 외부 의존성이 하나 늘어납니다. 원본 구독은 정상이어도 변환 서비스, 템플릿 가져오기, 매개변수 호환성이 실패할 수 있습니다. 원본 설정을 보존한 후 제공자가 직접 제공하는 Mihomo/Clash YAML이 있다면 그것으로 변환 계층을 비교합니다.
로그를 공개하기 전에 URL을 점검하세요. 공식 스크립트의 디버그 정보에 구독 주소나 처리 매개변수가 포함될 수 있으므로 전체를 수정 없이 공개 issue에 붙여 넣지 마세요.
수동 업데이트 복구 후 일정 재활성화
수리 완료 조건은 구독 하나가 다운로드와 검증을 통과하고, 새 파일이 안전하게 쓰여지고, 활성 경로가 그 파일을 선택하고, 코어가 오류 없이 재로드되고, 관찰 가능한 노드나 규칙 변경이 나타나는 것입니다. UI 토스트 하나만으로는 부족합니다.
공식 issue #5239는 업데이트 버튼이 백엔드 실패를 명확히 보여주지 않을 수 있는 특정 사례를 보고합니다. 즉시 UI보다 백엔드 로그를 확인할 근거는 되지만 모든 실패가 같은 UI 결함이라고 증명하지는 않습니다. 현재 버전과 라우터 로그로 비교해야 합니다.
- 다음 예정 작업을 관찰할 때까지 검증된 구 프로필과 수리된 새 프로필을 모두 보존합니다.
- 수동 업데이트를 한 번 더 반복하여 일회성 DNS 캐시나 변환기 응답을 배제합니다.
- 라우터 재부팅 또는 WAN 재연결 시간과 겹치지 않는 합리적인 자동 갱신 간격을 설정합니다.
- 다음 예정 실행 후 로그 시각, 파일 시각, 활성 경로, 코어 상태를 비교합니다.
같은 단계에서 안정적으로 재현되면 OpenClash 버전, OpenWrt 빌드와 아키텍처, 재현 시간, 비밀을 제거한 최소 로그, 변환 사용 여부를 공식 프로젝트에 제공하세요. '업데이트 버튼이 안 됨'보다 첫 실패 지점이 더 검증 가능한 정보입니다.
공식 자료와 버전 범위
- github.com/vernesong/OpenClash
- github.com/vernesong/OpenClash/blob/master/luci-app-openclash/root/usr/share/openclash/openclash.sh
- github.com/vernesong/OpenClash/blob/master/luci-app-openclash/luasrc/view/openclash/update_config.htm
- github.com/vernesong/OpenClash/issues/5239
버전 번호, 파일 이름, 화면 문구는 업데이트로 바뀔 수 있습니다. 작업 전에 연결된 공식 문서를 확인하세요.