A Sweet caramel。

tailscale에 code-server를 바인딩할 때 서비스 자동 시작 문제 해결하기 본문

개발/왜 안될까?

tailscale에 code-server를 바인딩할 때 서비스 자동 시작 문제 해결하기

라멜님 2025. 9. 20. 17:30

어제 서버 컴퓨터에 code-server를 설치했다.

 

code-server를 외부 기기에서 접속할 일은 없어서 ~/.config/code-server/config.yamlbind-addr 필드를 tailscale 아이피로 연결했다.

 

내 서버 컴퓨터는 ACPI가 망가진 것인지 부팅이 완료되고 3일 정도가 지나면 재부팅을 거절하는 문제가 있어 code-server 설정이 끝나고 재부팅을 해줬는데... 재부팅 이후로 code-server에 접속할 수 없게 되었다.

 

"code-server 서비스는 재부팅 이후에 자동으로 시작되지 않는 것인가?"라고 생각하며 상태를 보았는데 활성화에 실패했다고 한다.

활성화에 실패한 code-server...

 

혹시나 싶어 sudo systemctl restart code-server@$USER를 입력해 봤는데 활성화가 잘된다. 사실 나는 이쯤 되어서 tailscale 문제라는 것을 직감할 수 있었다. 이전에도 비슷한 문제를 겪었기 때문 (...)

 

 

로그도 구경해봤다. 예상대로다.

tailscale이 활성화 되기 전에 주소에 바인딩을 시도하다가 터졌다.

 

 

 

해결을 위해 내가 처음으로 시도해 본 방법은 서비스를 tailscaled가 활성화된 이후에 켜지게 하는 방법이었다.

tailscaled가 먼저 켜지도록 수정해주었다.

성공했는가? 당연히 실패했다. 성공했으면 스크린샷이 아니라 코드로 올려놨을 것이다. tailscale 데몬이 활성화되었다는 것이 로그인에 성공하고 아이피를 받아왔다는 뜻이 되는 것은 아니다. 그래서 실패했다.

 

 

 

두 번째로 시도해 본 방법은 tailscale0 인터페이스가 생성될 때까지 기다렸다가 켜지게 하는 방법이다.

tailscale0 인터페이스가 보일 때까지 1초마다 확인

이거 잘 아는 사람이 본다면 이 코드는 항상 성공 상태를 반환한다는 것을 알고 있을 것이다... 결과는 당연히 실패했다. (tailscale0 인터페이스는 항상 존재하더라...) 그리고 이것 또한 로그인에 성공하고 아이피를 받아왔다는 뜻이 되는 것은 아니다.

 

 

 

마지막으로 시도해 본 방법은 그냥 tailscale이 아이피를 띄울 때까지 기다리는 방법이다.

$ sudo systemctl edit code-server@$USER

 

명령어를 입력하고 나면 에디터가 나올텐데 올바른 위치에 아래 컨픽을 넣는다.

[Unit]
After=tailscaled.service
Requires=tailscaled.service

[Service]
ExecStartPre=/bin/bash -c 'while ! tailscale ip -4 > /dev/null 2>&1; do sleep 1; done'
ExecStart=
ExecStart=/bin/sh -c "/usr/bin/code-server --bind-addr $$(tailscale ip -4):8443"

 

간단하게 설명해서 tailscale이 아이피를 가져올 때까지 1초마다 확인하고 tailscale의 아이피의 8443 포트로 code-server를 실행하는 것이다.

 

이 설정을 사용한다면 ~/.config/code-server/config.yamlbind-addr 필드를 지우는 것이 좋을 것 같다.

 

ExecStart가 있는 이유는 기존에 있던 ExecStart 설정을 초기화하기 위해서 존재한다. 이게 없으면 기존 설정에 append 되는 방식이다.