
처음 코드 서버를 만들었던 건 아마도 3년쯤 전의 일이다. 맥미니만 있던 탓에 밖에서 개발하는 게 쉽지 않았고, 아이패드로 언제 어디서든 개발을 하고 싶었던 끝에 찾아낸 해결책이었다. 다행히 집에는 Synology NAS가 있었고, Docker를 통해 어렵지 않게 코드 서버를 만들 수 있었다. 문제는 당시의 내가 개발자 해보겠다고 까분지 얼마 안 되었을 때라는 것이었다. 프론트엔드 개발자였던 나는 shell 환경과 Docker 모두 잘 알지 못했고, 나의 코드 서버는 겨우 포트포워딩만 해놓은 수준이었다.
이제는 다르다! 많은 것이 달라졌고 지난 3년 동안 나는 꽤 많이 성장했다. 그래서 그 기념이라고 하기는 뭣하지만, 코드 서버 올리는 방법을 다시 한 번 정리해보고자 한다.
Synology NAS에 코드 서버 올리기
예전에는 이름이 Docker Station이었던 거 같은데, 언젠가부터 Synology의 도커 관련 패키지 이름이 Container Manager로 바뀌었다. 이걸 설치하고 레지스트리에서 linuxserver/code-server 를 다운받아 실행시키면 아래와 같은 화면을 볼 수 있다. 나는 컨테이너 이름으로 code-server로 했고, CPU 우선 순위는 높음, 메모리는 가능한 많이 줬다.

그리고 나서는 포트 설정을 해야한다. 나는 기본적으로 노드 위에서 작업하는 사람이라 3000번이나 3001번 정도 열어두면 큰 문제는 없다.

여기서 말하는 볼륨 설정은 Docker Volume이다. 나는 /docker/code-server 와 .config 를 연결했다.

변수 설정은 DockerFile에서 이제 도커 실행시킬 때 받아다가 쓰기 위해 필요한 것들이다. 나는 늘 아래와 같이 다섯 개의 변수를 추가적으로 할당한다.

| 변수 | 값 |
| TZ | Asia/Seoul |
| PUID | 1000 |
| PGID | 1000 |
| PASSWORD | 코드 서버에 접근할 때 비밀번호 |
| SUDO_PASSWORD | 리눅스 root 비밀번호 |
이렇게 하고서, 내부 포트랑 외부 포트랑 연결될 수 있도록 공유기나 라우터(사실 같은 말이긴 한데)에서 포트포워딩 해주면 끝이다.
이것 저것 설치
예전에는 nodejs랑 npm만 설치해도 좋았는데, 요즘은 설치할 게 많다. pnpm도 설치해야 하고, bun도 설치해야 한다. 코덱스를 멀쩡하게 쓰려면 opencode랑 oh-my-opencode도 설치해야 한다. 나는 아래의 명령어를 복사해서 한 번에 붙여넣고 돌려버리는 편이다.
// CURL 설치
sudo apt-get install -y curl
// nodejs 설치
cd ~
curl -sL https://deb.nodesource.com/setup_24.x -o nodesource_setup.sh
sudo bash nodesource_setup.sh
sudo apt-get install nodejs -y
// npm 설치
sudo apt-get install build-essential
// pnpm 설치
export SHELL=/bin/sh
curl -fsSL https://get.pnpm.io/install.sh | ENV=/dev/null SHELL=/bin/sh sh -
echo 'export PNPM_HOME="/config/.local/share/pnpm"' >> ~/.bashrc
echo 'export PATH="$PNPM_HOME:$PATH"' >> ~/.bashrc
// bun 설치
sudo apt-get install -y unzip
curl -fsSL https://bun.sh/install | bash
echo 'export BUN_INSTALL="$HOME/.bun"' >> ~/.bashrc
echo 'export PATH="$BUN_INSTALL/bin:$PATH"' >> ~/.bashrc
// opencode 설치
curl -fsSL https://opencode.ai/install | bash
echo 'export PATH="/config/.opencode/bin:$PATH"' >> ~/.bashrc
// oh-my-opencode 설치
bun x oh-my-opencode install
source ~/.bashrc글꼴 변경
코드 서버의 기본 글꼴은 시력에 영향을 주는 것이 분명하다. 몇 분만 보고 있어도 시신경이 퇴화하는 것이 느껴진다. 그런 까닭에 커스텀 폰트를 넣어준다. 나는 MapleMono를 주력으로 사용하지만 기분에 따라서는 JetBrainsMono가 쓰고싶어질 때도 있어서 둘 다 넣어준다.
// 폰트 저장 위치
sudo mkdir -p /app/code-server/lib/vscode/out/vs/code/browser/workbench/fonts
// 폰트 옮기기 (synology 쪽으로 넣어서)
sudo cp ~/workspace/JetBrainsMonoNL-Regular.ttf /app/code-server/lib/vscode/out/vs/code/browser/workbench/fonts/
sudo cp ~/workspace/MapleMono-NF-Regular.ttf /app/code-server/lib/vscode/out/vs/code/browser/workbench/fonts/
sudo apt install -y vim
sudo vim /app/code-server/lib/vscode/out/vs/code/browser/workbench/workbench.html<style>
@font-face {
font-family: 'JetBrains Mono NL';
src: url('/static/out/vs/code/browser/workbench/fonts/JetBrainsMonoNL-Regular.ttf') format('truetype');
font-weight: 400;
font-style: normal;
}
@font-face {
font-family: 'Maple Mono NF';
src: url('/static/out/vs/code/browser/workbench/fonts/MapleMono-NF-Regular.ttf') format('truetype');
font-weight: 400;
font-style: normal;
}
</style>{
"editor.fontFamily": "'Maple Mono NF', 'JetBrains Mono NL', monospace",
"editor.fontLigatures": true
}결과물

이제 아이패드를 통해 vscode와 유사한 개발환경을 구축할 수 있게 되었고, opencode와 omo를 통해 언제든 OpenAI의 강력한 모델과 함께 코드를 짤 수 있게 되었다.
더 읽어보기
2026.05.09
TanStack Router 파일 기반 라우팅과 타입 안전하게 React 구조 잡기
React 앱의 라우팅은 처음에는 별일 아닌 것처럼 보인다. /about으로 가면 About 화면을 보여주고, /posts/1로 가면 1번 글을 보여주면 된다. 문제는 앱이 조금만 커져도 URL이 더 이상 주소표시줄의 문자열로만 남아 있지 않다는 데 있다. URL은 권한의 경계가 되고,…
2026.05.05
Changesets 실무 운영 가이드: 내부 의존성, prerelease, 운영 Q&A
이 글은 Changesets로 모노레포 릴리즈를 관리하는 시리즈의 3편이다. 1편에서는 changeset 파일을 작성하는 방법을, 2편에서는 GitHub Actions로 Version Packages PR과 publish를 자동화하는 흐름을 다뤘다. 이번 글에서는 실제 운영 중 자주 헷…
2026.05.05
Changesets와 GitHub Actions로 릴리즈 자동화하기
이 글은 Changesets로 모노레포 릴리즈를 관리하는 시리즈의 2편이다. 1편에서 changeset 파일로 변경 의도를 기록했다면, 이번 글에서는 그 파일을 기준으로 GitHub Actions가 Version Packages PR을 만들고 publish까지 이어지는 흐름을 다룬다.…
2026.05.05
Changesets로 모노레포 버전 관리 시작하기
이 글은 Changesets로 모노레포 릴리즈를 관리하는 시리즈의 1편이다. 여기서는 Changesets를 왜 도입하는지, 어떤 파일을 남기는지, PR 단계에서 semver 판단을 어떻게 기록하는지에 집중한다. 1편: Changesets로 모노레포 버전 관리 시작하기 2편: Change…
2026.06.07
AI 에이전트의 비밀값을 macOS Keychain에 맡기기
AI 에이전트나 스킬을 만들다보면 비밀값을 어떻게 관리하면 좋을지 하는 생각을 자주 하게 된다. API를 호출하려면 API Key가 필요하고, 특정 기능을 자동화하는 과정에서 아이디와 비밀번호가 필요할 수도 있다. 그런데 그 값을 프롬프트에 박아버리면 대화 기록에 남고, 명령어 인자로…
2026.06.01
React Server Components를 위한 컴포넌트 아키텍처
이 포스트는 Vercel의 Next.js 팀 소속 개발자 Aurora Scharff가 자신의 블로그에 올린 Component Architecture for React Server Components 게시글을 번역한 것이다. 번역하는 과정에서 다소 의역이 있을 수 있으며, 일부 번역에는…
2026.05.26
차트는 멈췄는데 윈도우가 움직인다
상황 어느날 서비스를 살펴보시던 팀장님께서 이런 말씀을 slack에 남기셨다. 진호님, 예측 차트에서 zoom을 계속하면 어느 순간 라인 차트가 아니라 단일 스캐터 차트처럼 보이는 데, 이거 수정하면 좋을 거 같아요. 어느정도 zoom을 하면 그 이후로는 zoom이 안 되도록 할 수 없…
2026.05.21
피자가게로 이해하는 디자인 패턴
에이든 피자는 처음부터 복잡한 시스템을 만들 생각이 없었다. 처음에는 메뉴 몇 개만 만들면 됐다. 그런데 손님은 커스텀 주문을 넣기 시작했고, 주방은 상태를 나눠야 했고, 결제와 배달앱과 알림이 하나씩 붙었다. 코드도 가게를 닮는다. 장사가 잘될수록 이상하게 더 쉽게 망가진다. 디자인…
댓글
댓글을 불러오는 중...