홈서버에서 연구 크롤러, 사이트 개발 서버, 업무 자동화 스크립트를 동시에 24시간 돌리고 있다. 카페에서 크롬 원격조정으로 접속해 코드를 확인하고, RAM은 절대 터지지 않는다. 실제로 운영 중인 구성법을 그대로 공개한다.
3개 동시 운영 아키텍처 개요
핵심은 세 가지다. 첫째, 각 프로젝트를 tmux 세션으로 완전히 분리하여 서로 영향을 주지 않는다. 둘째, cgroup으로 각 프로세스의 메모리 상한을 지정해 한 세션이 RAM을 독점하는 것을 방지한다. 셋째, Chrome Remote Desktop으로 어디서든 접속해 모든 세션을 시각적으로 관리한다.
| 세션 | 용도 | 주요 프로세스 | RAM 할당 | 우선순위 |
|---|---|---|---|---|
| 🔬 research | 연구 · 크롤링 | Python 스크립트, Jupyter | 최대 4GB | low (nice 10) |
| 💻 devsite | 사이트 개발 | Node.js dev server, 빌드 | 최대 3GB | normal (nice 0) |
| 📋 work | 업무 자동화 | 업무용 봇, API 서버 | 최대 2GB | high (nice -5) |
Chrome Remote Desktop 설치 및 설정
Chrome Remote Desktop은 구글 계정만 있으면 되고, 방화벽·포트 포워딩 설정이 전혀 필요 없다. Tailscale과 달리 그래픽 UI(바탕화면)에 접속할 수 있어 시각적인 작업에 유리하다.
# 1. 데스크톱 환경 설치 (서버에 GUI가 없는 경우)
sudo apt install -y xfce4 xfce4-goodies
# 2. Chrome Remote Desktop 패키지 다운로드
wget https://dl.google.com/linux/direct/chrome-remote-desktop_current_amd64.deb
sudo dpkg -i chrome-remote-desktop_current_amd64.deb
sudo apt install -f -y
# 3. CRD 세션 설정 (XFCE 사용 시)
echo "exec /usr/bin/xfce4-session" > ~/.chrome-remote-desktop-session
# 4. 브라우저에서 설정 완료
# remotedesktop.google.com/access → '원격 액세스 사용' → PIN 설정
# → 출력되는 명령어 실행하면 즉시 활성화
Chrome Remote Desktop: 그래픽 바탕화면 접속, 마우스·키보드 조작 가능, 설정 가장 쉬움. 단, 서버에 GUI 환경 필요.
Tailscale SSH: 터미널만 사용, 가볍고 빠름, GUI 불필요. 코딩·서버 관리 위주라면 이 쪽이 더 효율적.
tmux로 3개 세션 완전 분리
tmux는 터미널 멀티플렉서다. SSH나 원격 접속이 끊겨도 서버에서 세션이 계속 실행된다. 각 프로젝트를 독립 세션으로 분리하면 서로 영향 없이 동시에 운영할 수 있다.
# tmux 설치
sudo apt install -y tmux
# 3개 세션 생성 (이름 지정)
tmux new-session -d -s research # 연구 세션
tmux new-session -d -s devsite # 사이트 개발 세션
tmux new-session -d -s work # 업무 세션
# 세션 전환 방법
tmux attach -t research # 연구 세션으로 전환
tmux attach -t devsite # 개발 세션으로 전환
tmux attach -t work # 업무 세션으로 전환
# 현재 실행 중인 세션 목록 확인
tmux ls
# 세션 안에서 [Ctrl+b] → d : 세션을 종료하지 않고 분리(detach)
# → SSH 연결이 끊겨도 세션은 서버에서 계속 실행됨
# ~/.tmux.conf — 상태바에 세션별 색상 구분
set -g status-style bg=black,fg=white
set -g window-status-current-style bg=red,fg=white,bold
set -g status-left '[#S] ' # 현재 세션 이름 표시
set -g status-interval 5 # 5초마다 상태 갱신
set -g mouse on # 마우스 클릭으로 패널 전환
RAM 과부하 방지 — 메모리 최적화 3가지
RAM이 부족한 상황에서 3개 프로세스를 동시에 운영하려면 메모리 관리가 핵심이다. 아래 세 가지를 조합하면 16GB RAM 노트북에서 안정적으로 운영할 수 있다.
# ① zswap 활성화 — RAM 부족 시 압축 후 스왑 (속도 2~3배 향상)
echo 'zswap.enabled=1' | sudo tee -a /etc/default/grub.d/zswap.cfg
sudo update-grub
# ② 스왑 파일 생성 (SSD 공간 8GB 활용)
sudo fallocate -l 8G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
# 스왑 공격성 조정 (낮을수록 RAM 우선 사용)
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# ③ 메모리 사용량 실시간 모니터링
htop # 프로세스별 RAM/CPU 확인
free -h # 전체 메모리 현황
프로세스 우선순위 조정 — CPU 점유율 제어
연구용 크롤러가 CPU를 100% 사용하면 개발 서버가 느려진다. nice 값으로 프로세스 우선순위를 조정하면 중요한 작업이 CPU를 먼저 할당받는다.
# nice 값: -20(최고 우선순위) ~ 19(최저 우선순위)
# 연구 크롤러 — 낮은 우선순위로 실행 (백그라운드 작업)
nice -n 10 python3 research_crawler.py &
# 업무 봇 — 높은 우선순위 (sudo 필요)
sudo nice -n -5 python3 work_bot.py &
# 이미 실행 중인 프로세스 우선순위 변경
renice -n 10 -p $(pgrep python3) # PID로 변경
# cgroup으로 메모리 상한 설정 (연구 세션에 최대 4GB 허용)
sudo cgcreate -g memory:research
echo $((4 * 1024 * 1024 * 1024)) | sudo tee /sys/fs/cgroup/memory/research/memory.limit_in_bytes
"tmux + nice + zswap — 이 세 가지 조합이면 16GB 노트북에서 3개 프로젝트가 서로 죽이지 않는다."
원클릭 프로젝트 전환 자동화 스크립트
매번 tmux 세션을 수동으로 전환하고 서비스를 시작하는 것은 번거롭다. 아래 스크립트를 만들면 한 명령어로 원하는 환경이 세팅된다.
# ~/scripts/start-all.sh — 서버 재시작 시 모든 세션 자동 복구
#!/bin/bash
echo "🚀 모든 세션 시작 중..."
# 연구 세션
tmux new-session -d -s research -c ~/projects/research
tmux send-keys -t research 'conda activate research && jupyter lab --no-browser &' Enter
# 개발 세션
tmux new-session -d -s devsite -c ~/projects/mysite
tmux send-keys -t devsite 'npm run dev &' Enter
# 업무 세션
tmux new-session -d -s work -c ~/projects/work-bot
tmux send-keys -t work 'nice -n -5 python3 bot.py &' Enter
echo "✅ 세션 시작 완료:"
tmux ls
# 시스템 시작 시 자동 실행 (crontab 방식)
chmod +x ~/scripts/start-all.sh
crontab -e
# 다음 줄 추가:
# @reboot sleep 30 && /home/myuser/scripts/start-all.sh >> /var/log/start-all.log 2>&1
# 상태 확인 스크립트
cat ~/scripts/status.sh
# #!/bin/bash
# echo "=== tmux 세션 ==="
# tmux ls
# echo "=== 메모리 현황 ==="
# free -h
# echo "=== 상위 프로세스 ==="
# ps aux --sort=-%mem | head -10
VS Code Remote SSH로 원격 코딩 환경 구성
Chrome Remote Desktop은 전체 바탕화면 접속이라 무겁다. 코딩만 하는 경우라면 VS Code의 Remote SSH 확장이 훨씬 가볍고 빠르다. Tailscale로 연결한 후 VS Code에서 바로 서버의 파일을 열 수 있다.
// ~/.ssh/config (로컬 머신)
Host homeserver
HostName 100.x.x.x // Tailscale IP
User myuser
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 60
Host homeserver-research
HostName 100.x.x.x
User myuser
RemoteCommand tmux attach -t research // 접속 시 바로 연구 세션으로
RequestTTY yes
VS Code에서 Ctrl+Shift+P → Remote-SSH: Connect to Host → homeserver 선택하면 서버의 파일 시스템이 바로 열린다. 터미널에서 tmux attach -t devsite를 실행하면 개발 서버의 로그를 실시간으로 확인할 수 있다.
오류 발생 시 AI 도구로 즉시 해결
멀티태스킹 환경에서 오류가 발생하면 당황할 필요 없다. 오류의 종류에 따라 맞는 AI 도구를 쓰면 된다. 중요한 건 오류 메시지를 그대로 복사해서 붙여넣는 것이다 — 그게 전부다.
| 오류 유형 | 도구 | 사용법 |
|---|---|---|
| tmux 세션 충돌, 스크립트 오류 | Claude Code CLI | 스크립트 파일 있는 폴더에서 claude 실행 후 오류 붙여넣기 |
| crontab 작동 안 함, 타이밍 문제 | Claude Code CLI | "crontab 이렇게 설정했는데 왜 안 돌아?" 그대로 물어보기 |
| 연구 폴더 파일명·폴더 정리 | Antigravity | antigravity --source ~/research --dry-run으로 미리 확인 |
| 프로세스 메모리 점유, cgroup 오류 | Claude (웹/앱) | dmesg | tail -20 출력을 복사해서 붙여넣기 |
# Claude Code CLI 설치 및 멀티태스킹 오류 해결 예시
# 설치 (Node.js 18+ 필요)
npm install -g @anthropic-ai/claude-code
# 스크립트 폴더에서 실행
cd ~/scripts
claude
# 오류 해결 예시 프롬프트:
# "start-all.sh 실행하면 tmux: can't create session: terminal not found 뜨는데"
# "crontab에서 @reboot로 등록했는데 재부팅해도 세션이 안 생겨"
# "nice -n -5 하면 Permission denied 뜨는데 sudo 없이 방법이 있어?"
# 컨텍스트가 너무 많이 쌓이면:
# /clear — 현재 대화 초기화 (현재 파일 컨텍스트는 유지)
# /compact — 요약 압축 (중요한 내용 보존하며 토큰 절약)
데이터 정리 루틴 — 로그·캐시·tmux 히스토리 자동 관리
3개 프로세스를 24시간 돌리면 로그, 캐시, Python 패키지 캐시, Docker 이미지 등 데이터가 쌓인다. 정기적으로 정리하지 않으면 디스크가 꽉 차서 프로세스가 죽는다. 정리를 자동화하는 것이 진짜 운영이다.
# 멀티태스킹 환경 주간 정리 스크립트
cat > ~/scripts/multitask-cleanup.sh << 'EOF'
#!/bin/bash
echo "=== 멀티태스킹 환경 정리: $(date) ==="
# 1. 시스템 저널 로그 7일 이상 삭제
sudo journalctl --vacuum-time=7d
echo "✅ 시스템 로그 정리"
# 2. apt 패키지 캐시
sudo apt autoremove -y && sudo apt clean
echo "✅ apt 캐시 정리"
# 3. Python 캐시 (연구 세션 관련)
find ~/projects/research -name "__pycache__" -type d -exec rm -rf {} + 2>/dev/null
find ~/projects/research -name "*.pyc" -delete 2>/dev/null
pip cache purge 2>/dev/null
echo "✅ Python 캐시 정리"
# 4. Node.js 캐시 (개발 세션 관련)
npm cache clean --force 2>/dev/null
find ~/projects/mysite -name "node_modules/.cache" -type d -exec rm -rf {} + 2>/dev/null
echo "✅ Node.js 캐시 정리"
# 5. Docker 미사용 리소스 (Docker 사용 시)
if command -v docker &> /dev/null; then
docker system prune -f
echo "✅ Docker 정리"
fi
# 6. Jupyter 체크포인트 정리
find ~ -name ".ipynb_checkpoints" -type d -exec rm -rf {} + 2>/dev/null
echo "✅ Jupyter 체크포인트 정리"
# 결과 요약
echo "=== 정리 완료 ==="
df -h / | awk 'NR==2 {print "디스크 사용률:", $5}'
free -h | awk 'NR==2 {print "RAM 여유:", $7}'
EOF
chmod +x ~/scripts/multitask-cleanup.sh
# 매주 토요일 오전 6시 자동 실행
(crontab -l; echo "0 6 * * 6 /home/$USER/scripts/multitask-cleanup.sh >> /var/log/multitask-cleanup.log 2>&1") | crontab -
# 즉시 디스크 현황 파악 — 뭐가 공간 잡아먹는지 확인
df -h # 파티션별 사용량
du -sh ~/projects/* # 프로젝트별 용량
du -sh ~/.cache # 캐시 폴더 크기
du -sh /var/log # 로그 폴더 크기
# 가장 큰 파일 TOP 10 찾기
find ~ -type f -printf '%s %p\n' 2>/dev/null | sort -rn | head -10 | \
awk '{printf "%.1f MB %s\n", $1/1024/1024, $2}'
# 오래된 tmux 로그 정리 (tmux-logging 플러그인 사용 시)
find ~/.tmux/logs -name "*.log" -mtime +7 -delete 2>/dev/null
Chrome Remote Desktop으로 접속했을 때 한글 입력이 안 되는 경우가 많다. 아래 설정으로 해결된다:
# fcitx5 한글 입력기 설치 (Ubuntu 22.04+)
sudo apt install -y fcitx5 fcitx5-hangul
im-config -n fcitx5
# XFCE 세션에 fcitx5 자동 시작 설정
mkdir -p ~/.config/autostart
cat > ~/.config/autostart/fcitx5.desktop << 'EOF'
[Desktop Entry]
Name=Fcitx5
Exec=fcitx5
Type=Application
EOF
# .chrome-remote-desktop-session에 환경변수 추가
echo 'export GTK_IM_MODULE=fcitx5' >> ~/.chrome-remote-desktop-session
echo 'export QT_IM_MODULE=fcitx5' >> ~/.chrome-remote-desktop-session
echo 'export XMODIFIERS=@im=fcitx5' >> ~/.chrome-remote-desktop-session