linger · XDG_RUNTIME_DIR · 데몬 검증 · 계층 점검 · API 리전과 이그레스
플랫폼 엔지니어, SRE, 셀프호스팅 Agent 운영자가 2026년에 Linux VPS에 OpenClaw를 올릴 때 전형적인 실패는 명령 한 줄 오타가 아니라 SSH가 끊기면 사용자 systemd가 멈추고, 비대화 경로에서 XDG_RUNTIME_DIR가 비며, Gateway·Channel·Model 로그를 한 줄로 읽으며, 콘솔에서 고른 API 리전과 실제 이그레스 경로가 어긋나는 것입니다. 본문은 운영 전 다섯 가지 숨은 비용, 베어메탈 systemd·컨테이너 내 systemd·Docker 전용 비교표, 여섯 단계 재현 Runbook과 예시 명령, 체크리스트와 인용 가능한 기술 사실 세 가지, 의사결정 매트릭스를 제시합니다. 설치·Gateway는 설치 및 doctor 체크리스트, Compose 상시는 Docker Compose 생산 기준과 함께 읽으십시오. 주문은 주문 페이지를 참고합니다.
Linux VPS에서 OpenClaw는 장기 프로세스, 소켓 디렉터리, 로그, 재시작 의미를 개인 습관에서 감사 가능한 유닛으로 옮기는 작업입니다. 아래 다섯 항목은 함께 나타나며 결론은 하나입니다. Docker 논쟁보다 앞서 linger와 XDG_RUNTIME_DIR을 인수 기준에 적습니다.
세션 결합: linger 없이 대화형 SSH가 끝나면 사용자 systemd 관리자가 멈춰 야간에 유닛이 조용히 종료됩니다. 로그에는 “어제는 됐다”만 남습니다.
런타임 디렉터리 결손: cron, 최소 셸, 잘못된 서비스 타입은 XDG_RUNTIME_DIR를 비워 소켓 실패를 앱과 systemd에 분산시킵니다.
계층 점검 생략: Gateway 미리스닝, Channel 자격 증명, 모델 라우팅, 상류 429를 “OpenClaw 고장” 한 문장으로 합칩니다.
리전 대 이그레스 드리프트: 콘솔·환경 변수는 리전 A인데 VPS 경로는 헤더에 리전 B 힌트를 보여 안정적인 403이 아니라 간헐 인증 실패처럼 보입니다.
경계 혼합: 한 호스트에 Docker와 사용자 유닛이 공존하면 재시작 순서와 헬스 의미가 달라 롤백 시 어떤 층을 멈출지 불명확합니다.
호스트 사용자 유닛과 컨테이너 PID 1을 비교할 때 다음 표는 슬로건이 아니라 리뷰 슬라이드입니다.
재시작 의미, 로그 로테이션, linger 의미, 소켓과 호스트 포트 경계를 누가 가질지부터 결정합니다. 만능 해법은 없고 팀 역량에 맞는 운영 경계만 있습니다.
| 모델 | 전형적 적합 | 주요 이점 | 주요 비용 |
|---|---|---|---|
| 베어메탈 systemd(사용자) | 단일 VPS에서 호스트 방화벽·루프백과 밀접 | 배포판 도구와 정렬, journal과 유닛이 일직선 | linger와 로그인 세션 경계 처리 필수 |
| systemd-in-container | 이미지 내 다중 프로세스 감독 | 전통 Linux 서비스 호스트에 가까움 | 특권·이미지 경계가 날카롭고 호스트·컨테이너 양쪽을 봐야 함 |
| Docker 전용 | Compose나 오케스트레이터가 헬스·재시작을 소유 | 산출물 버전 관리와 롤백 경로가 분명 | 호스트 사용자 linger 의미는 자동 이관되지 않음 |
재현 가능한 인수는 “내 노트북에서 된다”가 아니라 SSH 종료 후에도 유닛이 남고 journal 이유가 읽히며 동일 명령으로 리전 힌트를 두 번 잡을 수 있다는 것입니다.
순서는 무인에서도 사용자 관리자를 살리고, 런타임 DIR을 확인하고, 유닛을 설치한 뒤 계층별로 나누고 마지막에 이그레스 스냅샷을 남깁니다. 각 단계마다 명령 출력을 저장합니다. Gateway 기준은 설치 및 doctor 체크리스트로 돌아갑니다.
서비스 사용자 고정: 실행 계정과 주 그룹을 고정하고 root와 혼용하지 않습니다. 산출물: id와 짧은 loginctl user-status 조각.
linger 활성화: 배포 사용자에 linger를 켜 로그인 없이도 user@가 동작하게 합니다. 산출물: show-user에 linger=yes.
XDG_RUNTIME_DIR 검증: 유닛과 동일 프로필에서 변수를 출력하고 /run/user/<uid> 형태를 기대합니다.
설치·활성화: 사용자 범위에 유닛을 두고 daemon-reload와 enable --now, status로 Active와 주 pid를 확인합니다.
계층 샘플링: 먼저 Gateway 리슨·설정 파싱, 다음 Channel 자격·웹훅 도달, 마지막 모델 상류 쿼터·리전 헤더. 층마다 journal 최근 200행을 남깁니다.
이그레스 일치: 동일 호스트명으로 해석과 TLS 가시 메타데이터를 변경 전후에 저장하고 단일 RTT를 성능 결론으로 올리지 않습니다.
loginctl show-user "${USER}" -p Linger
sudo loginctl enable-linger "${USER}"
systemctl --user show-environment | grep XDG_RUNTIME_DIR || true
echo "${XDG_RUNTIME_DIR}"
systemctl --user daemon-reload
systemctl --user status openclaw-gateway.service --no-pager
journalctl --user -u openclaw-gateway.service -n 200 --no-pager
안내: openclaw-gateway.service는 실제 유닛 이름으로 바꿉니다. 다른 게이트웨이 바이너리여도 ExecStart를 기준으로 삼습니다.
각 항목에 담당자와 재검 주기를 붙입니다. 리전 확인은 조작 벤치가 아니라 재현 가능한 TLS·응답 메타데이터만 수집합니다.
linger 게이트: 변경 티켓에 show-user Linger=yes 텍스트나 캡처를 첨부합니다.
유닛 경계: 사용자 유닛이 바인하는 포트와 컨테이너가 노출하는 포트를 명시하고 방화벽 문서를 동기화합니다.
로그 보존: journal 영속 또는 전달 정책을 문서화해 디버그 로그로 디스크가 고갈해 가짜 정지가 나지 않게 합니다.
계층 Runbook: Gateway·Channel·Model 각 층에 “통과하면 다음” 검사를 최소 세 가지 둡니다.
리전 스냅샷: 릴리스 창 전후로 해석 결과와 헤더 샘플을 저장해 롤백 비교에 씁니다.
loginctl enable-linger는 사용자 systemd 관리자 생존 경계에 작용하며 Docker 선택과 자동 동치가 아닙니다./run/user/<uid>입니다. 비로그인에서 빠지면 소켓이 비가용 경로로 떨어집니다.주의: 한 번 성공한 curl은 CDN 전환 뒤 증명이 되지 않습니다. 고정 호스트명과 반복 명령이 단발 성공보다 강합니다.
linger, 유닛 이름, 포트 매트릭스, 리전 스냅샷이 버전 관리되지 않으면 Linux 상시는 절반입니다. 나머지 절반은 Gateway 점검과 같은 책임 언어를 공유하는 일입니다.
| 팀 상태 | 권장 기본값 | 수락 신호 | 흔한 함정 |
|---|---|---|---|
| 단독 유지·빠른 시도 | Docker Compose 기준 | 헬스·재시작이 compose에서 검토 가능 | mem_limit·로그 로테 생략으로 가짜 정지 |
| 다중 테넌트 동일 기기 | 컨테이너 경계+독립 프로젝트명 | 스택마다 데이터 디렉터리 분리 | 사용자 유닛 혼재로 재시작 경쟁 |
| 호스트 밀착 결합 | 사용자 systemd+linger | SSH 후에도 journal이 연속 | 비대화 경로에서 XDG_RUNTIME_DIR 미검증 |
대화형 bash, linger 없는 nohup, 수제 워치독은 변경 검토·감사에서 한꺼번에 비용이 돌아옵니다. 상류 리전 정책이 바뀔 때도 이그레스 스냅샷 없이 설명이 어렵습니다. 반면 리전 선택 가능하고 네트워크 단계가 읽기 쉬운 전용 클라우드 Mac 용량은 iOS 빌드나 데스크톱 인수인계와 같은 감사 필드로 안정 이그레스와 골든 이미지를 자산화하기 쉽습니다.
흔한 함정: Docker가 모든 systemd 의미를 지운다고 가정하는 일. Compose 밖에서 사용자 유닛이 게이트웨이를 앞에 두면 linger와 런타임 DIR은 여전히 하드 게이트입니다.
개인 스크립트와 비버전 환경보내기는 인수인계·컴플라이언스에서 외부 SLA로 버티기 어렵고, OpenClaw를 상류 리전 정책·TLS 지문·고정 이그레스 설명과 함께 출하할 때 bash 전용 대안은 감사 가능한 변경 티켓을 자주 잃습니다. iOS 인수인계, CI 회귀, 자동화 Agent를 하나의 수락 스토리로 묶고 주문·리전 단계로 자체 이그레스 도박을 줄이려는 팀에게 VpsMesh Mac Mini 클라우드 렌탈이 대개 더 나은 적합입니다. 전용 노드는 ACL과 호스트명 고정을 단순화하고 고빈도 루프에 가까운 협업을 유지하며 팀 사설망 빌드 노드 Runbook과 같은 운영 어휘에 맞출 수 있습니다. 지역 조합은 가격 페이지, 연결 경계는 고객 센터를 기준으로 삼으십시오.
대화 세션이 끝난 뒤 systemd --user가 멈추고 사용자 수준 OpenClaw 유닛도 함께 종료될 수 있습니다. 운영 전 linger를 확인하고 야간 종료를 상류 장애로 오인하지 않도록 고객 센터의 연결·상시 가이드를 대조하십시오.
호스트명과 도구 버전을 고정하고 해석 결과와 동일 엔드포인트의 TLS 가시 정보를 저장합니다. 콘솔 리전 설정과 환경 변수를 맞춥니다. Compose 수준 헬스 의미는 Docker Compose 생산 기준 문서를 보십시오.
재시작, 로그 로테이션, 한도, 헬스 체크가 Compose나 오케스트레이터에 선언되고 호스트 사용자 소켓·linger 의미에 의존하지 않을 때 Docker 전용이 더 단순한 경우가 많습니다. 사용자 유닛과 섞기 전에 세 번째 절의 계층 인수를 끝내십시오.