Skip to content

Proxmox host에서 Ubuntu 26.04 컨테이너를 새로 만들고, 개발용으로 쓰기 전까지의 기본 설정을 정리해 둡니다.

이 글의 목표는 거창한 서버 구성이 아니라, 컨테이너 생성 직후 바로 개발 작업에 들어갈 수 있는 최소 환경을 만드는 것입니다. Ubuntu 26.04 컨테이너에는 Python 3.14.4가 기본으로 들어와 있었기 때문에, Python 설치는 건너뛰고 fnm으로 Node.js를 설치하는 정도까지만 진행합니다.

추가로 SSH 접속 시 root 로그인을 막고, 개인 사용자 계정에 PEM 키를 등록해서 키 기반 접속으로 전환합니다.

전제

이 글은 아래 상황을 기준으로 작성했습니다.

  • Proxmox host 위에 Ubuntu 26.04 컨테이너를 생성한 상태
  • 컨테이너 콘솔 또는 root SSH로 최초 접속 가능한 상태
  • 개발용 개인 계정을 새로 만들 예정
  • Python 3.14.4는 이미 설치되어 있는 상태
  • Node.js는 fnm으로 설치할 예정

먼저 Python 버전은 기록 차원에서 한 번 확인해 둡니다.

bash
python3 --version

패키지 업데이트

컨테이너를 처음 만든 뒤에는 패키지 목록과 설치된 패키지를 먼저 갱신합니다.

bash
sudo apt update
sudo apt upgrade -y

컨테이너에 따라 sudo가 아직 없거나 root로 작업 중일 수 있습니다. root로 접속한 초기 상태라면 sudo 없이 실행해도 됩니다.

기본 개발 패키지 설치

개발용 컨테이너에서 자주 쓰는 최소 도구를 설치합니다.

bash
sudo apt install -y build-essential curl wget git net-tools iputils-ping htop unzip ca-certificates

각 패키지의 용도는 대략 이렇습니다.

  • build-essential: 네이티브 모듈이나 기본 빌드 도구가 필요한 경우 사용
  • curl, wget: 설치 스크립트나 파일 다운로드에 사용
  • git: 소스 코드 clone과 버전 관리에 사용
  • net-tools, iputils-ping: 네트워크 확인에 사용
  • htop: 프로세스 확인에 사용
  • unzip: 압축 해제에 사용
  • ca-certificates: HTTPS 인증서 검증에 사용

한글 locale 설정

Ubuntu 컨테이너를 최소 이미지로 만들면 한글 파일명이나 한글 출력이 깨져 보일 수 있습니다. 개발 환경에서 한글 파일을 다룰 일이 있다면 한국어 언어팩과 UTF-8 locale을 먼저 설정해 둡니다.

bash
sudo apt install -y language-pack-ko locales
sudo locale-gen ko_KR.UTF-8
sudo update-locale LANG=ko_KR.UTF-8 LC_ALL=ko_KR.UTF-8

설정 후 현재 세션에 바로 반영하려면 다시 로그인하거나 아래처럼 환경변수를 적용합니다.

bash
export LANG=ko_KR.UTF-8
export LC_ALL=ko_KR.UTF-8

locale이 제대로 잡혔는지 확인합니다.

bash
locale

LANG=ko_KR.UTF-8이 보이면 기본 설정은 된 것입니다.

SSH 서버 설치

컨테이너에 SSH 서버가 없다면 openssh-server를 설치합니다.

bash
sudo apt install -y openssh-server
sudo systemctl enable --now ssh

컨테이너 환경에서 systemctl이 제한되어 있다면 아래처럼 서비스 명령으로 재시작할 수 있습니다.

bash
sudo service ssh restart

SSH 서버가 떠 있는지는 다음 명령으로 확인합니다.

bash
sudo service ssh status

개인 사용자 생성

root로 계속 작업하지 않도록 개인 사용자 계정을 만듭니다. 아래 예시의 username은 실제 사용할 계정명으로 바꿉니다.

bash
sudo adduser username
sudo usermod -aG sudo username

생성한 사용자가 sudo를 사용할 수 있는지 확인합니다.

bash
su - username
sudo whoami

정상이라면 root가 출력됩니다.

개인 사용자에 PEM 키 등록

로컬 PC에서 이미 개인 PEM 키를 가지고 있다면, 공개키를 컨테이너의 개인 사용자 계정에 등록합니다.

로컬 PC에서 공개키가 있는지 먼저 확인합니다.

bash
ls ~/.ssh

개인키가 ~/.ssh/my_key.pem이라면 공개키는 보통 ~/.ssh/my_key.pem.pub 형태입니다. 공개키가 없다면 아래처럼 만들 수 있습니다.

bash
ssh-keygen -y -f ~/.ssh/my_key.pem > ~/.ssh/my_key.pem.pub

이제 공개키를 컨테이너 사용자 계정에 복사합니다.

bash
ssh-copy-id -i ~/.ssh/my_key.pem.pub username@server_ip

ssh-copy-id를 사용할 수 없는 환경이라면, 컨테이너 안에서 직접 등록해도 됩니다.

bash
mkdir -p ~/.ssh
chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

authorized_keys에는 로컬 PC의 .pub 파일 내용을 한 줄로 붙여 넣습니다.

키 로그인이 되는지 확인합니다.

bash
ssh -i ~/.ssh/my_key.pem username@server_ip

이 접속이 성공하기 전에는 root 접속 차단이나 비밀번호 로그인 차단을 먼저 적용하지 않는 편이 안전합니다.

SSH root 접속 차단

개인 사용자와 키 로그인이 확인됐다면 root SSH 접속을 막습니다.

SSH 설정 파일을 엽니다.

bash
sudo nano /etc/ssh/sshd_config

아래 값을 찾거나 추가합니다.

text
PermitRootLogin no

기존 값이 yes라면 no로 바꾸고, 앞에 #이 붙어 있다면 주석을 해제합니다.

간단히 명령으로 처리하려면 아래처럼 실행할 수도 있습니다.

bash
sudo sed -i 's/^#\?PermitRootLogin .*/PermitRootLogin no/' /etc/ssh/sshd_config

설정 파일에 PermitRootLogin 줄이 아예 없다면 아래 명령으로 추가합니다.

bash
grep -q '^PermitRootLogin ' /etc/ssh/sshd_config || echo 'PermitRootLogin no' | sudo tee -a /etc/ssh/sshd_config

설정을 확인한 뒤 SSH를 재시작합니다.

bash
sudo sshd -t
sudo service ssh restart

재시작 후에는 기존 접속 창을 끊기 전에 새 터미널에서 개인 사용자로 접속이 되는지 확인합니다.

bash
ssh -i ~/.ssh/my_key.pem username@server_ip

비밀번호 SSH 로그인 차단

키 기반 로그인이 확실히 동작하면 비밀번호 로그인을 막을 수 있습니다.

bash
sudo nano /etc/ssh/sshd_config

아래 값을 찾거나 추가합니다.

text
PasswordAuthentication no

필요하다면 아래 값도 함께 확인합니다.

text
PubkeyAuthentication yes

명령으로 바로 반영하려면 아래처럼 실행합니다.

bash
sudo sed -i 's/^#\?PasswordAuthentication .*/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo sed -i 's/^#\?PubkeyAuthentication .*/PubkeyAuthentication yes/' /etc/ssh/sshd_config
grep -q '^PasswordAuthentication ' /etc/ssh/sshd_config || echo 'PasswordAuthentication no' | sudo tee -a /etc/ssh/sshd_config
grep -q '^PubkeyAuthentication ' /etc/ssh/sshd_config || echo 'PubkeyAuthentication yes' | sudo tee -a /etc/ssh/sshd_config

설정을 검사하고 SSH를 재시작합니다.

bash
sudo sshd -t
sudo service ssh restart

다시 한 번 새 터미널에서 키 로그인이 되는지 확인합니다.

bash
ssh -i ~/.ssh/my_key.pem username@server_ip

시간대 설정

한국 시간 기준으로 사용할 컨테이너라면 timezone을 Asia/Seoul로 맞춥니다.

bash
sudo timedatectl set-timezone Asia/Seoul
timedatectl

fnm으로 Node.js 설치

Ubuntu 26.04 컨테이너에는 Python 3.14.4가 이미 설치되어 있었기 때문에, 별도 Python 설치는 진행하지 않습니다. Node.js는 fnm으로 설치합니다.

먼저 fnm을 설치합니다.

bash
curl -fsSL https://fnm.vercel.app/install | bash

설치 후 현재 쉘에서 바로 쓰려면 shell 설정을 다시 읽거나, 터미널에 다시 접속합니다.

bash
source ~/.bashrc

Node.js 24를 설치합니다.

bash
fnm install 24
fnm use 24
fnm default 24

버전을 확인합니다.

bash
node -v
npm -v

새 SSH 세션에서도 node 명령이 잡히는지 한 번 더 확인합니다.

bash
ssh -i ~/.ssh/my_key.pem username@server_ip
node -v

최종 확인

마지막으로 아래 항목만 확인하면 기본 개발 컨테이너로 사용할 준비가 됩니다.

  • 개인 사용자로 SSH 접속 가능
  • root SSH 접속 불가
  • 비밀번호 SSH 로그인 불가
  • sudo 사용 가능
  • LANG=ko_KR.UTF-8 locale 설정 완료
  • timezone이 Asia/Seoul
  • git, curl, build-essential 등 기본 개발 도구 설치 완료
  • node, npm 실행 가능
  • python3 --version에서 Python 3.14.4 확인

여기까지 해두면 Proxmox 위의 Ubuntu 26.04 컨테이너를 기본 개발용 환경으로 쓰기 위한 출발점은 충분합니다. 이후 프로젝트별로 Docker, 데이터베이스 클라이언트, language server, 배포 도구 같은 것만 추가하면 됩니다.

Last updated: