07/Documentation
Durable agent 문제 해결
표시되지 않거나 Unreachable로 나타나는 durable agent 관련 안내: 초기 확인 사항, 원인 및 해결 방법, doctor 행, 발생하는 사례를 다룹니다
실험적 기능입니다. 와이어, SDK 및 이 페이지는 향후 마이너 릴리스에서 변경되거나 기능이 제거될 수 있습니다. Durable agent에 유지 여부를 결정하는 기준이 명시되어 있습니다.
표시되지 않거나, Unreachable로 표시되거나, 탭에 응답하지 않는 durable agent: 세 가지 명령어로 원인을 찾을 수 있으며, 사유 표와 케이스 목록에 해결 방법이 나와 있습니다. Collie 전반에 대한 내용은 문제 해결에서 다룹니다.
최초 확인 사항
다음 세 명령을 순서대로 실행하십시오:
collie durable list
collie doctor
collie logs| 명령어 | durable agent에 대해 표시되는 내용 |
|---|---|
collie durable list | sources.json의 항목당 한 줄씩, 실행 중인 브리지가 부여한 상태(loaded, not loaded (restart to apply), refused (<status>) 또는 bridge not answering)가 표시됩니다. loaded는 브리지가 해당 항목을 로드했음을 의미합니다. durable agent가 응답한다는 의미는 아닙니다. 브리지가 해당 이름에 대해 HTTP 400으로 응답할 때도 not loaded가 표시됩니다. |
collie doctor | durable agent 자체에 질문합니다. durable agent용 Doctor 행의 행들을 출력하고 실패한 검사와 해결 방법을 명시합니다 |
collie logs | 각 durable agent의 부팅 라인([bridge] program "desk": durable, private socket /run/user/1000/desk/app.sock), 설정이 규칙을 위반했을 때의 사유가 표시됩니다. 잘못된 sources.json는 [bridge] FATAL:를 출력합니다. 읽기 실패는 중단당 한 번 [state] poll failed, marking disconnected: <reason>를 출력합니다. [durable]로 시작하는 줄은 버전 거부, 오래된 lead, 누락된 항목, 삭제된 로그를 나타냅니다 |
휴대폰에는 더 적은 정보가 표시됩니다. durable agent 행에는 Starting 또는 Unreachable이 표시되며 사유는 제공되지 않습니다. 와이어 버전 거부는 고유 문구인 Version mismatch와 durable agent 홈의 경고 상자로 표시됩니다. 거부된 토큰은 연결 표시줄에 고유 문구가 나타납니다. 다른 모든 사유는 collie doctor 및 collie logs에 명시되어 있습니다.
원인 표
Collie가 durable agent에 연결할 수 없어도 Collie의 나머지 구성 요소는 정상적으로 시작되며, durable agent는 한 가지 원인과 함께 연결할 수 없음으로 표시됩니다.
durable agent가 sources.json의 항목인 경우에도 원인에는 환경 변수 이름이 표시됩니다. COLLIE_DURABLE_SOCKET은 항목의 socket로, COLLIE_DURABLE_URL은 url로, COLLIE_DURABLE_TOKEN는 token으로 해석하십시오. 항목에 대한 해결 방법은 sources.json에 있습니다. durable 전용 형식에 대한 해결 방법은 .env에 있고, 그 다음 collie restart에 있습니다.
설정이 규칙을 위반함
Collie는 durable agent에 연결을 시도하지 않고 이를 보고합니다. sources.json 항목에 있는 규칙은 브릿지가 시작될 때도 거부됩니다(sources.json의 오타).
| 이유 | 의미 및 해결 방법 |
|---|---|
COLLIE_DURABLE_SOCKET is not set | durable 전용 형식에 소켓 경로가 없습니다. 소켓 경로를 설정하거나 토큰과 함께 URL을 설정하십시오 |
COLLIE_DURABLE_SOCKET must be an absolute path | /로 시작하는 전체 경로를 지정하십시오 |
COLLIE_DURABLE_SOCKET is longer than 103 bytes | 경로를 줄이십시오. $XDG_RUNTIME_DIR자 미만으로 유지하십시오 |
the private socket transport is not available on Windows; set COLLIE_DURABLE_URL and COLLIE_DURABLE_TOKEN instead | Windows는 소켓 전송을 지원하지 않습니다. URL과 토큰을 사용하십시오 |
COLLIE_DURABLE_SOCKET and COLLIE_DURABLE_URL are both set; set the socket, or the URL with its token, not both | durable 전용 형식에 두 가지 전송 방식이 모두 지정되었습니다. 전송 방식을 하나만 유지하십시오 |
COLLIE_DURABLE_URL is set without COLLIE_DURABLE_TOKEN; the durable agent refuses a caller with no token | durable 전용 형식에 URL만 지정되고 토큰이 지정되지 않았습니다. 토큰을 설정하십시오 |
COLLIE_DURABLE_TOKEN is set without COLLIE_DURABLE_URL; a token is only sent to a URL | durable 전용 형식에 토큰만 지정되고 URL이 지정되지 않았습니다. URL을 설정하거나 토큰을 제거하십시오 |
COLLIE_DURABLE_URL is longer than 2048 bytes | URL을 durable agent의 기본 주소로 단축하십시오 |
COLLIE_DURABLE_URL is not a URL | https://host 형식으로 작성하십시오 |
COLLIE_DURABLE_URL must start with https:// | https:// 이외의 스킴은 거부됩니다. 일반 http://은 아래에 별도의 행이 있습니다 |
COLLIE_DURABLE_URL uses plain http to <host>, so the token would cross the network unencrypted; use https://, or http://127.0.0.1:<port> for wrangler dev | https://을(를) 사용하십시오. 일반 http는 127.0.0.1 또는 포트가 포함된 localhost 전용입니다 |
COLLIE_DURABLE_URL uses plain http on loopback without a port; name the port, for example http://127.0.0.1:8801 | 포트를 추가하십시오 |
COLLIE_DURABLE_URL must not carry a user name or password; the token goes in COLLIE_DURABLE_TOKEN | URL에서 사용자 이름과 비밀번호를 제거하십시오 |
COLLIE_DURABLE_URL must not carry a query or a fragment | URL에서 ? 부분과 # 부분을 제거하십시오 |
COLLIE_DURABLE_URL names the durable agent's base only; leave out /session/v1, the adapter adds it | 경로에서 /session/v1을(를) 제거하십시오 |
COLLIE_DURABLE_TOKEN is <n> bytes; it must be at least 32 bytes, for example 64 hex characters from openssl rand -hex 32 | 더 긴 토큰을 생성하고, durable agent에도 동일한 토큰을 지정하십시오 |
COLLIE_DURABLE_TOKEN must be printable ASCII with no spaces | 토큰에서 공백 및 기타 문자를 제거하십시오 |
COLLIE_DURABLE_TOKEN is longer than 4096 bytes | 헤더가 지나치게 깁니다. 더 짧은 토큰을 사용하십시오 |
durable agent가 응답하지 않거나 잘못 응답함
| 이유 | 의미 및 해결 방법 |
|---|---|
no socket at <path> | 해당 경로에 아직 아무것도 없습니다. durable agent를 시작하거나 경로를 수정하십시오 |
cannot check <path>: <message> | Collie가 해당 경로를 읽을 수 없습니다. 사용자가 읽을 수 있도록 권한을 설정하십시오 |
socket-not-private: <check> | 경로 탐색에 실패했으며, 콜론 뒤의 텍스트가 해당 부분을 나타냅니다. 개인정보 보호 검사 실패에 일반적인 원인이 나와 있습니다 |
connection refused | 수신 대기 중인 대상이 없습니다. 비정상 종료된 durable agent가 소켓 파일을 남겨둘 수 있습니다: 오래된 소켓 파일. https의 경우 해당 URL에서 수신 대기 중인 대상이 없습니다. |
no answer within <n>ms | durable agent가 응답하지 않거나 준비되지 않은 상태입니다. Collie는 소켓에서 1000 ms, https에서 5000 ms 동안 대기합니다. |
tls refused: <message> | URL의 인증서가 거부되었습니다. Collie에는 검사를 건너뛰는 스위치가 없습니다. |
the host name does not resolve | URL의 호스트 이름이 잘못되었거나 네트워크에서 접근할 수 없습니다. |
token-refused: the durable agent answered 401 또는 403 | durable agent가 토큰을 거부했습니다. durable agent가 토큰을 거부했습니다. |
too-large | durable agent가 Collie가 읽을 수 있는 크기보다 큰 응답을 반환했습니다. hello의 경우 16 KiB, 스냅샷의 경우 4 MiB입니다. 응답 크기를 줄이십시오. |
incompatible: the durable agent speaks 2..3, this Collie speaks 1..1 | 버전 범위가 일치하지 않습니다. 이전 버전을 업데이트하십시오. collie doctor에 두 범위가 모두 표시되며 로그에 범위당 한 줄씩 기록됩니다. |
incompatible: not a durable agent | 해당 경로나 URL에서 다른 대상이 응답합니다. 항목이 durable agent를 가리키도록 설정하십시오. |
incompatible: the durable agent asks for a token | 소켓의 durable agent가 토큰을 요구하지만, 소켓은 토큰을 전달하지 않습니다. 이전 버전을 업데이트하거나 토큰을 사용하여 URL로 접근하십시오. |
unreadable hello: <detail> 또는 unreadable snapshot: <detail> | durable agent가 통신 규약에서 허용하지 않는 문서를 보냈습니다. durable agent 자체 로그를 확인하십시오. |
the durable agent answered <status> 또는 the durable agent answered 409 <code> | durable agent가 이 위치의 통신 규약에서 사용하지 않는 상태로 응답했습니다. durable agent 자체 로그를 확인하십시오. |
starting | durable agent가 실행 중이지만 준비되지 않았다고 응답하거나 503을 반환합니다. Collie는 다음 폴링 시 다시 요청합니다. |
durable agent용 Doctor 행
collie doctor은(는) 브리지가 묻는 순서대로 각 durable agent에 브리지와 동일한 질문을 합니다. hello 외에는 아무것도 전송하지 않습니다.
sources.json의 각 항목은 6개 행으로 이루어진 블록 하나를 받으며, 이름이 desk인 durable agent의 경우 durable-socket:desk(으)로 표시됩니다. 블록 앞의 sources 행은 파일을 검사하고, 그 뒤에 durable-lead 행 하나가 이어집니다. durable 전용 Collie는 접미사 없이 동일한 6개 행을 출력하며, mux 행에는 durable, see the durable-* lines이(가) 표시됩니다.
| 행 | 초록색 | 경고 또는 빨간색 |
|---|---|---|
sources | 2 durable agents in <path>, mode 0600 | 파일을 파싱할 수 없는 경우 빨간색으로 표시됩니다. 수정 안내에는 파일이 잘못된 동안 브리지가 시작되지 않는다고 명시됩니다. 항목에 토큰이 포함될 수 있으므로 그룹이나 다른 사용자가 파일을 읽을 수 있는 경우 빨간색으로 표시되며 수정 방법으로 chmod 600이(가) 안내됩니다. |
durable-env | 경로가 포함된 transport: private socket 또는 transport: https with a bearer token | 설정이 사유 표의 규칙을 위반한 경우 빨간색으로 표시됩니다. |
durable-socket | 경로는 사용자의 소켓이며 모드는 0600이고, 모드가 0700인 사용자의 폴더에 위치하며 경로상에 링크가 없습니다. | 빨간색으로 표시되며 행에 실패한 검사 항목이 명시됩니다: 대상 없음, 읽을 수 없음, 소켓이 아님, 심볼릭 링크임, 폴더가 아님, 다른 소유자의 폴더, 잘못된 모드의 폴더, 다른 사용자가 쓸 수 있는 상위 폴더, 다른 소유자의 소켓, 개방된 모드의 소켓. https 뒤의 durable agent에서는 건너뜁니다. |
durable-url | 주소(https 또는 루프백 http) 및 바이트 단위 길이 | URL이 규칙을 위반한 경우 빨간색으로 표시됩니다. 소켓에서는 건너뜁니다. |
durable-token | set, <n> bytes. Collie는 값을 출력하지 않습니다. | 토큰이 규칙을 위반한 경우 빨간색으로 표시됩니다. 소켓에서는 건너뜁니다. |
durable-hello | durable agent가 응답했습니다. 양쪽 범위와 합의된 버전입니다. | 원인과 함께 빨간색으로 표시됩니다. 토큰 거부, 응답 없음, durable agent가 아닌 대상의 응답, 소켓에서 토큰을 요청하는 durable agent, 읽을 수 없는 hello, 일치하지 않는 범위 등입니다. 범위 불일치의 경우 양쪽 범위가 모두 표시됩니다. |
durable-ready | ready, durable agent의 호스트 이름 및 에포크 | durable agent가 아직 준비되지 않았다고 보고할 때 나타나는 경고 |
durable-lead | 질문 카드를 표시할 만큼 리드가 최신 상태입니다. | crew 환경에서 참조 |
실패한 행은 그 뒤의 행들을 중단시킵니다. 해당 행들은 fix the row above first 사유와 함께 건너뜀으로 출력됩니다. Collie는 개인정보 보호 검사에 실패한 소켓이나 규칙을 위반한 토큰을 통해 durable agent에 요청하지 않기 때문입니다. 건너뛴 행은 오류가 아닙니다.
사례 목록
각 사례는 표시되는 내용, 원인 및 해결 방법을 설명합니다.
sources.json의 오타
단일 durable agent뿐만 아니라 Collie 전체가 다운된 상태로 나타납니다. 휴대폰이 연결되지 않습니다. collie logs 결과는 [bridge] FATAL:, 파일 경로, 엔트리 및 필드로 끝납니다.
bridge는 시작 시 sources.json을(를) 읽고 알 수 없는 필드, durable이(가) 아닌 kind, 규칙을 위반한 이름, 중복된 이름, socket 및 url의 동시 사용, 둘 다 없는 경우, token 없는 url, socket이(가) 있는 token을(를) 발견하면 중단됩니다. 파일을 수정한 다음 collie restart을(를) 실행하십시오. collie doctor은(는) sources 행에 동일한 메시지를 표시합니다.
bridge가 엔트리 이름을 지정할 수 없는 경우(객체가 아니거나, 알 수 없는 필드가 있거나, 이름이 규칙을 위반함) 0부터 번호를 매겨 두 번째 항목에 entry 1을(를) 기록합니다. collie durable attach은(는) 1부터 번호를 매겨 동일한 엔트리에 entry 2을(를) 기록합니다. 둘 다 대상 필드를 명시합니다. 이름이 유효해지면 bridge는 entry "desk"과(와) 같이 이름을 기록합니다.
attach 및 detach은(는) 읽을 수 없는 파일의 작성을 거부하므로 오타로 인해 다른 엔트리가 손상되지 않습니다. 종료 코드 1와(과) 함께 중단됩니다.
attach 후 durable agent가 나타나지 않음
휴대폰에 durable agent가 나타나지 않고 collie durable list에 not loaded (restart to apply)이(가) 표시됩니다.
attach 및 detach은(는) sources.json에만 기록합니다. bridge는 시작 시 이를 읽습니다. collie restart을(를) 실행하거나 다음번에 동사에 --restart을(를) 추가하십시오. not loaded 상태가 재시작 후에도 유지되면 collie logs을(를) 확인하십시오. list은(는) bridge의 HTTP 400을 404와 동일한 방식으로 표현합니다.
개인정보 보호 검사 실패
socket-not-private: the socket's folder /tmp/hello has mode 0755, not 0700이(가) 표시되고 닥터 행 durable-socket이(가) 빨간색으로 표시됩니다.
Collie는 전체 경로가 비공개 상태일 때만 소켓에 연결합니다. 주된 원인은 모드가 0755인 폴더, /tmp 또는 다른 공유 폴더에 직접 위치한 소켓, 경로 내의 심볼릭 링크입니다. 심볼릭 링크는 간과하기 쉽습니다. 많은 Linux 호스트에서 /var/run은(는) /run을(를) 가리키므로 /var/run/으(로) 시작하는 경로는 /var/run is a symlink 오류와 함께 실패합니다. 실제 경로를 사용하십시오.
소켓 자체 폴더에서 chmod 700을(를) 실행하거나 소켓을 $XDG_RUNTIME_DIR 아래로 이동하십시오. 관련 규칙은 Durable agent의 보안에 있습니다. SDK로 빌드된 durable agent는 모드가 0700이(가) 아닌 기존 폴더에서 시작하기를 거부하며 자체적으로 해당 내용을 출력합니다.
오래된 소켓 파일
소켓에 connection refused이(가) 표시되지만 파일은 존재합니다.
비정상 종료된 durable agent는 소켓 파일을 남겨두며, 아무것도 해당 소켓을 수신 대기하지 않습니다. durable agent를 다시 시작하십시오. SDK는 수신 대기 전에 비활성 소켓 파일을 제거하며, 소켓이 활성 상태인 경우 another instance is already listening 오류와 함께 중단됩니다. durable agent가 파일을 정리하지 못하는 경우에만 수동으로 파일을 삭제하십시오.
터미널 세션과 이름이 겹치는 경우
bridge가 시작 시 the name is the terminal session's own; pick another 오류로 중단되거나 휴대폰에서 터미널 세션이 누락된 것을 볼 수 있습니다.
durable agent는 Collie가 실행 중인 터미널의 이름을 가져올 수 없습니다. 대부분의 설치 환경에서 이 이름은 default이며, durable 전용 Collie에서는 default이(가) durable agent의 이름입니다. bridge는 시작 시 중단되며 해당 엔트리의 이름을 표시합니다. Herdr 세션이 durable agent의 이름을 가진 경우도 마찬가지입니다. durable agent가 이름을 유지하고, 휴대폰에 해당 세션이 표시되지 않으며, 로그에 한 번 기록됩니다. 둘 중 하나의 이름을 바꾸십시오.
durable-ready 경고가 지속됨
collie doctor을(를) 실행할 때마다 durable-ready 경고가 표시됩니다.
durable agent가 hello 응답을 반환하고 ready: false을(를) 표시합니다. 휴대폰에는 Starting으로 표시됩니다. durable agent는 대화를 배치하고 미해결 질문을 다시 제기한 후에만 준비 완료 상태를 보고합니다. 대기 중인 대상은 durable agent 자체 로그를 확인하십시오.
하위 항목 검사 시 durable agent가 시작 단계에서 중단됨
durable agent가 시작 시 the descendant check needs Bun on Linux to read the peer of a socket; pass callerCheck: "off" to run without it 오류와 함께 중단되는 것을 볼 수 있습니다.
이 검사에는 Linux 환경의 Bun이 필요합니다. macOS에서는 Node로 durable agent를 실행하거나 openCollie에 callerCheck: "off"을(를) 전달하고 검사가 보호하는 대상을(를) 먼저 읽으십시오. 이 오류는 durable agent에서 발생한 것입니다. Collie는 관여하지 않습니다.
재시작 후 질문이 다시 나타남
durable agent가 재시작된 후 질문이 다시 보이거나 이미 답변되었다는 카드가 표시됩니다.
재시작 전 질문에 대한 답변은 too-late 상태가 되고, 카드가 이를 표시한 후 사라집니다. 도구 호출에서 질문 id를 파생하는 durable agent는 동일한 질문을 다시 생성하므로 재시작 시점에 전송된 답변이 반영되고 도구가 한 번 실행됩니다. 매번 새 id를 생성하는 durable agent는 동일한 도구 호출에 대해 새 질문을 생성합니다. 카드가 이를 표시하며, 푸시 가드가 도구 호출을 키로 사용하므로 Collie는 두 번째 푸시를 보내지 않습니다. 이 가드는 대화당 분당 3회, 호스트당 분당 10회, 호스트당 시간당 30회의 푸시도 허용합니다. 한 시간에 31번째가 되는 푸시는 해당 호스트에 대한 하나의 요약 푸시가 되며, 호스트는 그 후 1시간 동안 더 이상 푸시를 보내지 않습니다. 카드는 항상 표시됩니다.
403 호출자 거부됨
휴대폰에 답변이나 메시지가 거부되었다고 표시되고, durable agent의 사유는 403 caller-refused입니다.
durable agent의 하위 프로세스 검사에서 호출자를 거부했습니다. 이 검사는 durable agent 자체, durable agent가 시작한 모든 프로세스, 그리고 이들과 구별할 수 없는 호출자를 거부합니다. durable agent 또는 durable agent가 실행한 도구가 Collie 프로세스를 시작했고 해당 프로세스가 여전히 하위 프로세스로 남아 있는 경우 Collie는 durable agent 쪽에 속하게 됩니다. durable agent 외부에서 Collie를 시작한 다음 다시 시도하십시오.
다시 시도 및 적용되었을 수 있는 답변
"답변이 도착했는지 확실하지 않습니다"라는 메시지와 함께 다시 시도 버튼이 표시되고, 탭한 후에는 "이미 적용되었을 수 있습니다. 채팅을 확인하십시오."가 표시됩니다.
답변이 전송된 후 타임아웃, 연결 끊김 또는 5xx가 발생하면 답변이 도달했을 가능성이 있습니다. 다시 시도는 동일한 요청 id를 전송하므로 durable agent가 replayed로 응답하며 질문을 두 번 해결하지 않습니다. 질문이 이미 닫힌 경우 첫 번째 시도로 인해 닫혔을 수 있으므로 휴대폰에 채팅을 확인하라는 메시지가 표시됩니다. 전송, 중지 및 버튼 탭도 각자의 문구로 동일한 내용을 안내합니다.
durable agent가 토큰을 거부했습니다.
연결 표시줄에 "durable agent가 토큰을 거부했습니다. 이 피어의 COLLIE_DURABLE_TOKEN을 확인하십시오."라고 표시되고, 사유는 token-refused입니다.
durable agent가 토큰에 대해 401 또는 403으로 응답했습니다. 가장 일반적인 원인은 한쪽이 먼저 변경된 교체 작업 때문입니다. 휴대폰의 문구는 sources.json 항목에 대해서도 COLLIE_DURABLE_TOKEN을(를) 표시하므로 항목의 token 항목으로 해석하십시오. Collie를 재시작하기 전에 durable agent에 새 토큰을 제공하십시오. 교체 절차는 토큰에 있습니다. 403은 durable agent 앞단에 있는 액세스 프록시로 인해 발생할 수도 있습니다.
두 번의 읽기를 거쳐 연결할 수 없음으로 전환됨
한 번의 읽기 실패에는 durable agent가 Ready 상태를 유지하다가 Unreachable로 전환되는 현상이 발생합니다.
정상 읽기 후 한 번 실패하면 해당 폴링에서는 이전 레이아웃을 유지합니다. 연속 두 번째 실패 시 durable agent 상태가 전환됩니다. 거부된 토큰도 동일한 규칙을 따릅니다. 개인정보 검사를 통과하지 못한 소켓 경로는 유일한 예외이며 즉시 표시됩니다.
https를 사용하는 경우 다운되었거나 토큰을 거부하는 durable agent에는 최대 10초에 한 번만 요청합니다. 각 시도가 과금되는 요청이기 때문입니다. 소켓을 사용하는 경우 다운된 durable agent의 두 읽기 사이의 최소 간격은 250ms입니다.
crew 환경에서
crew의 멤버에 있는 durable agent가 lead의 휴대폰에 표시되므로 lead는 durable agent가 무엇인지 알아야 합니다.
1.21.0 이전 버전의 lead는 질문 카드 없이 durable agent의 대화를 나열하며, 해당 Terminal 탭은 터미널이 없는 대화를 폴링합니다. 멤버에서는 이를 해결할 수 없습니다. 멤버 자체에서도 이를 알립니다. durable-lead에서 collie doctor 경고가 발생하고, 감지된 각 릴리스마다 로그에 [durable] the lead is 1.20.1; it shows durable panes without the question card and its Terminal tab polls; update the lead 한 줄이 기록됩니다. lead를 업데이트하십시오.
durable-lead | 표시 내용 |
|---|---|
| 건너뜀, crew 없음 | 이 머신은 crew에 속해 있지 않으므로 lead가 없습니다. |
| 건너뜀, lead | 이 머신은 lead이며 자체 창을 표시합니다. |
| 건너뜀, 릴리스 없음 | lead가 릴리스를 명시하지 않았습니다. 개발 빌드이거나, 업데이트가 진행 중이거나, 브리지 시작 후 호출이 없었습니다. |
| 경고 | lead가 1.21.0 미만 릴리스를 실행 중입니다. |
| 초록색 | lead가 1.21.0 이상입니다. |
lead보다 이전 버전인 멤버에는 반대 문제가 발생합니다. 휴대폰에 "이 머신은 이전 Collie를 실행 중이며 여기서 답변을 받을 수 없습니다. 업데이트하거나 durable agent에서 답변하십시오."라고 표시됩니다. 해당 멤버를 업데이트하십시오.