로컬서버를 세울 때

기본값과 설치 함정

조직 명의의 기계를 세우는 실전에서 넘어진 자리를 모았습니다. 왜 조직 명의의 기계인지와 판단 축, 세 갈래, 점검표는 로컬서버, 조직 명의의 기계에, 설치 다섯 단계와 교육과정은 로컬서버 설치, 다섯 단계와 교육과정에 있습니다. 이 글은 그 두 글에 없는 것만 적습니다. 사례는 품앗이가 함께 일한 교육원·의료복지사협·자활 기관·로컬푸드 협동조합 현장에서 나왔고, 조직 이름과 기계 이름, 주소는 지웠습니다.

요지

자체 서버를 세웠으면 그것이 기본값이고, 빌린 것을 끊는 일까지 해야 세운 목적이 닫힙니다. 끊을 때는 각 서비스가 맡던 역할을 갈라서 보고, 그 역할을 먼저 옮깁니다. 설치는 실제로 끝까지 돌려 봐야 알고, 완료는 원격으로 들어가졌을 때입니다. 그리고 기계를 조직에 넘기기 전에 그 기계에 얹힌 우리 짐부터 셉니다.

1. 세웠으면 그것이 기본값이다

자체 서버를 세운 뒤 임대 서버를 다시 정본으로 올리자고 했다가 거둬들인 일과 「세웠으면 빌린 걸 끊어라」는 원칙은 로컬서버, 조직 명의의 기계 3절에 있습니다. 여기에는 그 뒤에 배운 두 가지를 보탭니다.

자립의 실물은 그 기계 안에서 쥔 관리자 권한입니다. 한 의료복지사협의 업무 AI 방들을 조합 NAS의 컨테이너로 옮겼는데, 옮긴 것만으로는 자립이 되지 않았습니다. NAS의 컨테이너 관리 기능은 NAS 관리자만 쓸 수 있어서, 방이 자기 컨테이너를 바꿀 수 없었기 때문입니다. 실제로 자립이 생긴 자리는 셋이었습니다.

  1. 방이 자기 컨테이너 안에서 관리자 권한을 쥐고 필요한 도구를 스스로 깝니다.
  2. 무엇을 깔았는지 적은 설치 목록을 방의 주인이 소유합니다. 컨테이너가 다시 뜰 때 그 목록에서 빠진 것만 설치됩니다.
  3. 기동할 때마다 상태를 적는 기록을 방이 스스로 봅니다.

기계를 넘기는 날에는 그 AI의 지시문에 남은 「나는 못 한다」 문장도 같은 자리에서 고칩니다. 그 문장이 남아 있으면 셋방이 자가로 바뀌었을 뿐 의존은 그대로입니다. 그 기계가 아직 우리 접속 대장에 남아 있는지로 셋방인지 판별하는 질문은 챔피언 7절에 있습니다.

임대 서버를 철거할 때 놓치기 쉬운 칸이 있습니다. 한 교육원의 임대 클라우드 서버를 지울 때 겪은 일입니다.

  • 쓴 만큼 내는 클라우드에는 「해지 신청」 버튼이 없고, 자원을 지우는 것이 곧 해지입니다.
  • 서버 삭제 화면의 「함께 삭제할 자원」 목록을 펼쳐 봅니다. 저장장치와 네트워크 장치는 자동으로 체크돼 있었지만 공인 IP는 체크가 비어 있었습니다. 그대로 누르면 서버만 사라지고 IP 요금이 매달 나갑니다.
  • 「마지막 되돌리기는 도메인 설정을 옛 서버로 돌리는 것」을 안전망으로 두고 있었다면, 그 안전망이 내려앉을 자리가 바로 그 서버입니다. 서버를 지우는 순간 되돌리기도 끝나니, 그 사실을 먼저 알리고 결정을 받습니다.
  • 지우기 전에 도메인 설정과 터널 설정에 그 주소가 남아 있는지, 자동 작업이 그 주소를 물고 있는지 양쪽 기계에서 찾아봅니다. 문서에서 찾히는 것은 무해하지만, 서비스 설정이나 스크립트에서 찾히면 치명적입니다.

2. 표준 작업 흐름을 갈라 본다

「자체 서버가 생기면 GitHub와 클라우드 데이터베이스 서비스는 필요 없다」는 판단을 품앗이는 서비스마다 갈라서 다시 봤습니다. 판단 축은 「돈이 나가는가」와 「열쇠를 누가 쥐는가」 둘입니다. 둘을 섞어 「싸니까 자체로」만 보면, 우리가 그 조직의 영구 관리자가 됩니다.

서비스지금 맡은 역할판단
git버전 관리 그 자체대체할 대상이 아니다
GitHub빌드 시작 신호, 바깥 사람과의 협업 창구, 오프사이트 백업빌드 신호만 대체된다. 끊지 말고 역할을 바꿔 남긴다
클라우드 데이터베이스 서비스실측해 보니 「인터넷에서 읽히는 데이터베이스」로만 쓰이고 있었다자체 데이터베이스와 그 앞에 붙이는 읽기용 API 도구로 그대로 대신할 수 있다
Cloudflare도메인 설정, 인증서, 공격 방어, 터널무료이고 대체할 수 없다. 끊을 목록에 올리지 않는다

GitHub까지 끊으면 그 조직의 오프사이트 백업이 0이 됩니다. 클라우드 데이터베이스 서비스도 알게 모르게 백업과 가입 확인 메일을 대신하고 있었으니, 끊기 전에 그 역할부터 옮깁니다. 반대로 자체 서버로 가면 Cloudflare 의존은 오히려 늘어납니다. 정적 호스팅 대신 터널로 바깥에 서비스를 내기 때문입니다. 끊는 순서와 열쇠 이전이 서버 이전보다 앞이라는 원칙은 로컬서버, 조직 명의의 기계 3절과 6절에 있습니다.

3. 터널을 쓰면 서버를 옮기기 쉽다

이 방식의 서버가 공유기 포트를 열지 않고도 바깥에 서비스를 낼 수 있는 이유는 로컬서버 설치 3절에 있습니다. 같은 구조 덕분에 서버를 옮기기도 쉽습니다.

  • Cloudflare 터널은 설정 파일과 자격증명 파일 두 개만 새 기계로 옮기면 그대로 따라옵니다. 터널 식별자가 곧 경로라서 도메인 설정도, 관리 화면도 건드릴 것이 없습니다.
  • 옛 기계의 터널을 멈추고 새 기계에서 켜면 끝나고, 끊기는 시간은 몇 초입니다. 되돌릴 때도 같은 방식이니, 옮긴 뒤에도 옛 기계는 한동안 지우지 말고 멈춰만 둡니다.
  • 같은 터널에 기계 여러 대를 붙이면 Cloudflare가 나눠 보내고 한쪽이 죽으면 다른 쪽으로 넘겨, 도메인 설정을 바꾸지 않고도 지리적 이중화가 됩니다. 단, 상태를 자기 기계에 쓰는 서비스는 두 대에서 동시에 돌리지 않습니다. 메신저 봇 두 대가 같은 계정의 새 메시지를 동시에 가져가면 메시지를 서로 뺏습니다.

4. 윈도 업무 PC 안에 리눅스 서버를 세울 때

직원이 쓰는 윈도를 지울 수 없으면 그 안의 WSL2에 우분투를 띄워 서버로 씁니다. 무인 부팅을 시스템 계정 작업으로 걸었다가 실제로는 아무것도 켜지 않고 있었던 일은 로컬서버, 조직 명의의 기계 5절에 있고, 여기에는 그 밖에 겪은 것을 적습니다.

  • WSL은 붙잡고 있는 세션이 없으면 리눅스를 내립니다. 그 안에서 서비스 관리자가 정상으로 떠 있어도 소용없고, 약 1분 뒤 꺼집니다. 끝나지 않는 프로그램 하나로 세션을 늘 붙잡아 둬야 합니다. 사설망 관리 화면에는 그 기계가 접속 중으로 보이는데 원격 접속이 되지 않는, 올라왔다 곧 내려가는 모양이 이 증상입니다.
  • WSL이 살아나도 그 안의 사용자 서비스는 따로 살려야 합니다. 한 교육원 서버에서 사용자 단위 서비스로 띄운 앱 두 개가 원격 접속을 끊을 때마다 같이 죽었고, 재부팅 뒤에는 누가 접속하기 전까지 아예 뜨지 않았습니다. 사용자 서비스를 담는 관리자 자체가 세션이 있을 때만 살아 있었기 때문입니다. 사용자 서비스로 앱을 지을 거면 「자동 시작 켜기」와 「세션 없이도 상주 허용」을 한 쌍으로 겁니다. 하나만 하면 조회로는 멀쩡한데 부팅에는 안 뜨는 서비스가 됩니다.
  • 원격 통로를 WSL 안에만 두지 않습니다. 품앗이 자체 서버를 WSL로 옮기던 날 하루에 세 번 잠겼는데, 사설망 프로그램이 WSL 안에만 있어서 WSL이 죽을 때마다 되살릴 길이 사라졌기 때문입니다. 윈도 쪽에도 SSH와 사설망 노드를 따로 두자, 잠겨도 윈도로 들어가 WSL을 되살릴 수 있게 됐습니다.
  • 앱 스토어가 막힌 윈도에서는 WSL 설치 명령이 실패하니, 공식 릴리스의 설치 파일을 받아 직접 설치합니다.
  • 윈도 11은 WSL이 호스트와 같은 네트워크 주소를 쓰는 「미러 네트워크」 모드를 지원해 포트 넘기기가 필요 없습니다. 이때 윈도가 SSH 기본 포트를 이미 쓰고 있으니 WSL 안의 SSH는 다른 포트로 엽니다.
  • 원격으로 윈도에 스크립트 파일 실행을 시켰는데 받지 않으면, 스크립트를 표준입력으로 흘려 보내면 따옴표 문제 없이 들어갑니다.

5. 무인 설치 USB는 가상머신에서 끝까지 돌려 보고 보낸다

정적 검증을 통과한 USB도 실제로 돌리면 문제가 나옵니다. 한 협력 기관에 보낼 무인 설치 USB를 실물 그대로 읽기 전용으로 가상머신에 물려 설치를 끝까지 돌렸더니, 글자 검사로는 못 잡은 문제가 네 건 나왔습니다.

  • 설치할 디스크를 「SSD 가운데 가장 큰 것」으로 지정해 두었더니, SSD가 없는 기계에서는 설치가 멈췄습니다. 사전 점검 스크립트가 디스크 종류를 찍지 않아 그 전제를 확인할 길이 없었습니다.
  • 무선 연결을 돕는 서비스가 유선 기계에서도 돌면서 부팅을 매번 100초씩 늦췄습니다.
  • 사설망 가입 키가 설치된 시스템의 설치 기록에 평문으로 남았습니다. 기록에서 지우는 단계를 넣었고, 설치 뒤 키를 폐기하는 것은 사람 몫으로 적었습니다.
  • 설치가 끝나고 재부팅할 때 USB가 꽂혀 있고 부팅 순서가 USB 우선이면, 다시 설치기로 들어가 방금 깐 디스크를 또 밉니다. 설치 끝을 재부팅이 아니라 전원 끄기로 바꾸고 「꺼지면 USB를 뽑고 켜라」를 안내문에 적었습니다.

가상머신은 설치 끝의 재부팅에서 멈추게 합니다. 그래야 첫 부팅에서 일회용 가입 키가 소진되지 않고, 사설망에 가짜 기계가 생기지 않습니다. 결과는 가상 디스크를 열어 파일로 판정합니다.

무선뿐인 현장에는 네트워크가 필요한 설치기를 보내지 않습니다. 한 자활 기관 현장에는 유선 랜이 없었는데, 기존 템플릿을 그대로 구워 보냈다가 설치가 두 번 실패했습니다. 설치기 안에는 무선을 켜는 도구가 없어서, 설치 중에 패키지를 받으려다 무너진 것입니다. 우리 템플릿 주석에 「설치 중에 패키지를 받으므로 유선이 꽂혀 있어야 한다」고 이미 적혀 있었습니다. 무선 현장은 추가 패키지 목록을 비워 설치 이미지 안의 것만으로 설치를 끝내고, 나머지는 설치 뒤에 원격으로 깝니다. 폰의 USB 테더링은 유선 랜처럼 잡히니 대안이 됩니다. 유선 랜 포트와 랜선이 있는지는 USB를 굽기 전에 묻습니다.

검증은 「있나」가 아니라 「제대로 된 꼴인가」를 봅니다. 한 노트북에 무인 설치를 하려다 실패했는데, 부팅 메뉴 설정에서 세미콜론이 명령 구분자로 읽혀 설정 파일 위치를 알려 주는 부분이 잘려 나갔기 때문이었습니다. 빌드 뒤 검사는 「자동 설치 문구가 있나」만 봤기 때문에 통과했습니다. 지금은 세미콜론이 아예 필요 없는 위치에 설정을 두고, 빌드 스크립트가 형태가 틀린 줄을 발견하면 빌드를 멈춥니다. 같은 날 윈도의 업데이트 대기 상태가 재부팅을 가로채 한 시간을 기다렸는데, 어차피 밀 디스크라면 기다릴 이유가 없었습니다.

디스크 이름은 읽는 쪽마다 표기가 다릅니다. 한 로컬푸드 협동조합 서버 설치에서 윈도로 읽은 짧은 디스크 일련번호를 설치 조건에 넣었는데, 설치기가 보는 값은 긴 형태라서 맞는 디스크를 찾지 못하고 설치가 멈췄습니다. 디스크가 한 장뿐인 기계라면 「가장 큰 디스크」 조건이 더 안전합니다. 두 장 이상일 때만 일련번호를 쓰고, 그때는 설치기 쪽 리눅스에서 실제 문자열을 먼저 확인합니다.

완료는 사설망에 떠서 원격으로 들어갔을 때입니다. 「설치 끝」, 「USB를 구웠다」, 「가상머신에서 설치 완료」는 모두 중간 단계입니다. 한 노트북은 가상머신에서 설치 완료까지만 보고 보냈다가, 첫 부팅에서 무선이 올라오지 않았고 클라우드 초기화 도구가 시간 제한 없이 네트워크를 기다리는 바람에 로그인 화면조차 뜨지 않았습니다. 검증은 첫 부팅에서 네트워크를 잡고 로그인 화면이 뜨는 데까지 돌립니다. 네트워크 경로는 무선에 유선이나 테더링을 더하고, 사설망 가입은 붙을 때까지 재시도하게 둡니다. 설치된 시스템의 클라우드 초기화 도구는 끕니다. 이 칸은 로컬서버 설치 1절의 ⑤와 같은 축입니다.

6. 셸 없는 NAS와 관리자 권한 없는 PC

SSH를 켤 수 없는 NAS도 컨테이너로 본격 운용할 수 있습니다. 한 의료복지사협의 조합 NAS는 우리 계정으로 SSH를 켤 수 없었습니다. 그래도 NAS의 컨테이너 프로젝트 기능과 파일 관리 기능만으로 데이터베이스를 올리고, 자료를 복원하고, 사설망에 붙이고, 백업까지 걸었고, 그동안 셸은 한 번도 쓰지 않았습니다.

  • 한 기능이 「권한 없음」을 내도 그 계정이 관리자가 아니라는 뜻은 아닙니다. 그 NAS는 일부 기능을 기본 관리자 계정에만 열었고, 우리 계정은 관리자 그룹에 들어 있었습니다. 다른 기능으로 같은 목적을 이룰 수 있는지 봅니다.
  • NAS는 없는 폴더를 컨테이너에 연결해 주지 않으니, 폴더를 먼저 만듭니다.
  • 장치나 특수 권한을 추가하는 설정을 넣어 프로젝트를 만들면 프로젝트가 망가져, 고치기는커녕 지우기조차 안 될 수 있습니다. 그때는 새 폴더와 새 이름으로 다시 만드는 것이 유일한 출구입니다.
  • 셸 없이 명령을 돌리려면 한 번 돌고 끝나는 컨테이너에 스크립트 파일을 물려 실행하고, 결과는 파일로 받아 내려받습니다.
  • 그 NAS에는 가상 네트워크 장치가 없었지만, 사설망 프로그램을 사용자 공간 방식으로 띄우자 안쪽으로 들어오는 접속까지 됐습니다. 공유기 포트를 하나도 열지 않고 사설망에 서비스를 냈습니다.

관리자 권한이 없는 리눅스 계정에도 데스크톱 앱을 깔 수 있습니다. 활동가나 실무자 PC는 관리자 권한이 없는 계정인 경우가 많습니다. 한 메모 앱의 단일 실행 파일판을 그대로 실행하면 우분투 24.04에서는 필요한 구성 요소가 없어 실패하지만, 파일을 풀어서 실행하면 그 구성 요소 없이 됩니다. 이때는 샌드박스를 끄는 옵션을 붙여야 뜹니다. 남의 작업 PC에 도구를 권하는 지시문에는 「관리자 권한이 없으면」 갈래를 먼저 적습니다.

새로 깐 우분투에서 한글 입력기가 깔려 있는데 한글이 안 쳐지면 입력 소스 목록부터 봅니다. 입력기 패키지도, 입력기 프로그램도, 환경 변수도, 한글 엔진도, 글꼴도 전부 정상이었는데 입력 소스 목록이 비어 있었습니다. 진단 1번은 패키지 확인이 아니라 입력 소스 설정입니다.

7. 기계를 넘기기 전에 우리 짐부터 센다

한 협력 기관 서버를 두고 「자립 쪽 정답은 이 기계를 기관 사설망으로 옮기는 것」이라고 권했는데, 그 서버에는 품앗이 백업 135GB가 얹혀 있었고 양방향으로 오가는 백업이 돌고 있었습니다. 품앗이가 직접 깐 배선이었는데 잊고 있었습니다. 기관 담당자는 그 보고를 읽고 바로 새 사설망을 만들었습니다.

떼라고 권하기 전에 네 가지를 봅니다.

  1. 그 기계의 주소와 이름을 우리 저장소 전체에서 찾습니다. 그 서버의 주소는 우리 저장소 37곳에 박혀 있었습니다.
  2. 그 기계의 디스크와, 그 안에 있는 우리 자료의 용량을 셉니다.
  3. 그 기계가 어느 주소에서 접속을 받고 있는지 봅니다.
  4. 그 기계로 들어오는 예약 작업과 서비스가 있는지, 양방향인지 봅니다.

자립은 네트워크만 끊는 일이 아닙니다. 우리 짐을 어디로 옮길지가 같이 나와야 권고가 완성되고, 옮길 곳이 없으면 그 사실까지 말해야 상대가 비용을 알고 고릅니다. 전제가 틀렸으면 상대가 이미 움직였더라도 바로 정정합니다. 같은 보고에서 설정 한 줄로 닫힐 구멍을 큰 공사 두 갈래로만 내밀어 상대가 공사를 고른 일은 판단의 경계에 있습니다.

일곱 줄로 줄이면

  1. 자립의 실물은 그 안의 관리자 권한, 주인이 쥔 설치 목록, 스스로 보는 상태 기록이다.
  2. 임대 서버를 지울 때는 공인 IP 체크와 되돌리기가 함께 사라진다는 사실을 먼저 본다.
  3. 빌린 서비스는 맡던 역할을 갈라 보고, 그 역할을 옮긴 뒤에 끊는다.
  4. WSL 서버는 세션 붙잡기, 사용자 서비스 상주 허용, 윈도 쪽 통로를 같이 건다.
  5. 무인 설치 USB는 가상머신에서 끝까지 돌리고, 결과 디스크를 열어 판정한다.
  6. 완료는 첫 부팅에서 네트워크를 잡고 원격으로 들어가졌을 때다.
  7. 기계를 넘기라고 권하기 전에 그 기계에 얹힌 우리 짐을 센다.

도구 메모

  • WSL 미러 네트워크: 윈도 사용자 폴더의 .wslconfig 에 [wsl2] 아래 networkingMode=mirrored.
  • 사용자 서비스 상주 허용: sudo loginctl enable-linger <사용자> 뒤 loginctl show-user <사용자> -p Linger 가 Linger=yes 인지 본다.
  • 무인 설치 가상머신 시험: QEMU에 USB 실물을 readonly=on 으로 물리고 -no-reboot 를 붙인다.

관련 노드


작성: 품앗이 · 2026-10-22 · 교육원·의료복지사협·자활 기관·로컬푸드 협동조합 현장의 서버 구축 기록 기준