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 버전은 기록 차원에서 한 번 확인해 둡니다.
python3 --version패키지 업데이트
컨테이너를 처음 만든 뒤에는 패키지 목록과 설치된 패키지를 먼저 갱신합니다.
sudo apt update
sudo apt upgrade -y컨테이너에 따라 sudo가 아직 없거나 root로 작업 중일 수 있습니다. root로 접속한 초기 상태라면 sudo 없이 실행해도 됩니다.
기본 개발 패키지 설치
개발용 컨테이너에서 자주 쓰는 최소 도구를 설치합니다.
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을 먼저 설정해 둡니다.
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설정 후 현재 세션에 바로 반영하려면 다시 로그인하거나 아래처럼 환경변수를 적용합니다.
export LANG=ko_KR.UTF-8
export LC_ALL=ko_KR.UTF-8locale이 제대로 잡혔는지 확인합니다.
localeLANG=ko_KR.UTF-8이 보이면 기본 설정은 된 것입니다.
SSH 서버 설치
컨테이너에 SSH 서버가 없다면 openssh-server를 설치합니다.
sudo apt install -y openssh-server
sudo systemctl enable --now ssh컨테이너 환경에서 systemctl이 제한되어 있다면 아래처럼 서비스 명령으로 재시작할 수 있습니다.
sudo service ssh restartSSH 서버가 떠 있는지는 다음 명령으로 확인합니다.
sudo service ssh status개인 사용자 생성
root로 계속 작업하지 않도록 개인 사용자 계정을 만듭니다. 아래 예시의 username은 실제 사용할 계정명으로 바꿉니다.
sudo adduser username
sudo usermod -aG sudo username생성한 사용자가 sudo를 사용할 수 있는지 확인합니다.
su - username
sudo whoami정상이라면 root가 출력됩니다.
개인 사용자에 PEM 키 등록
로컬 PC에서 이미 개인 PEM 키를 가지고 있다면, 공개키를 컨테이너의 개인 사용자 계정에 등록합니다.
로컬 PC에서 공개키가 있는지 먼저 확인합니다.
ls ~/.ssh개인키가 ~/.ssh/my_key.pem이라면 공개키는 보통 ~/.ssh/my_key.pem.pub 형태입니다. 공개키가 없다면 아래처럼 만들 수 있습니다.
ssh-keygen -y -f ~/.ssh/my_key.pem > ~/.ssh/my_key.pem.pub이제 공개키를 컨테이너 사용자 계정에 복사합니다.
ssh-copy-id -i ~/.ssh/my_key.pem.pub username@server_ipssh-copy-id를 사용할 수 없는 환경이라면, 컨테이너 안에서 직접 등록해도 됩니다.
mkdir -p ~/.ssh
chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keysauthorized_keys에는 로컬 PC의 .pub 파일 내용을 한 줄로 붙여 넣습니다.
키 로그인이 되는지 확인합니다.
ssh -i ~/.ssh/my_key.pem username@server_ip이 접속이 성공하기 전에는 root 접속 차단이나 비밀번호 로그인 차단을 먼저 적용하지 않는 편이 안전합니다.
SSH root 접속 차단
개인 사용자와 키 로그인이 확인됐다면 root SSH 접속을 막습니다.
SSH 설정 파일을 엽니다.
sudo nano /etc/ssh/sshd_config아래 값을 찾거나 추가합니다.
PermitRootLogin no기존 값이 yes라면 no로 바꾸고, 앞에 #이 붙어 있다면 주석을 해제합니다.
간단히 명령으로 처리하려면 아래처럼 실행할 수도 있습니다.
sudo sed -i 's/^#\?PermitRootLogin .*/PermitRootLogin no/' /etc/ssh/sshd_config설정 파일에 PermitRootLogin 줄이 아예 없다면 아래 명령으로 추가합니다.
grep -q '^PermitRootLogin ' /etc/ssh/sshd_config || echo 'PermitRootLogin no' | sudo tee -a /etc/ssh/sshd_config설정을 확인한 뒤 SSH를 재시작합니다.
sudo sshd -t
sudo service ssh restart재시작 후에는 기존 접속 창을 끊기 전에 새 터미널에서 개인 사용자로 접속이 되는지 확인합니다.
ssh -i ~/.ssh/my_key.pem username@server_ip비밀번호 SSH 로그인 차단
키 기반 로그인이 확실히 동작하면 비밀번호 로그인을 막을 수 있습니다.
sudo nano /etc/ssh/sshd_config아래 값을 찾거나 추가합니다.
PasswordAuthentication no필요하다면 아래 값도 함께 확인합니다.
PubkeyAuthentication yes명령으로 바로 반영하려면 아래처럼 실행합니다.
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를 재시작합니다.
sudo sshd -t
sudo service ssh restart다시 한 번 새 터미널에서 키 로그인이 되는지 확인합니다.
ssh -i ~/.ssh/my_key.pem username@server_ip시간대 설정
한국 시간 기준으로 사용할 컨테이너라면 timezone을 Asia/Seoul로 맞춥니다.
sudo timedatectl set-timezone Asia/Seoul
timedatectlfnm으로 Node.js 설치
Ubuntu 26.04 컨테이너에는 Python 3.14.4가 이미 설치되어 있었기 때문에, 별도 Python 설치는 진행하지 않습니다. Node.js는 fnm으로 설치합니다.
먼저 fnm을 설치합니다.
curl -fsSL https://fnm.vercel.app/install | bash설치 후 현재 쉘에서 바로 쓰려면 shell 설정을 다시 읽거나, 터미널에 다시 접속합니다.
source ~/.bashrcNode.js 24를 설치합니다.
fnm install 24
fnm use 24
fnm default 24버전을 확인합니다.
node -v
npm -v새 SSH 세션에서도 node 명령이 잡히는지 한 번 더 확인합니다.
ssh -i ~/.ssh/my_key.pem username@server_ip
node -v최종 확인
마지막으로 아래 항목만 확인하면 기본 개발 컨테이너로 사용할 준비가 됩니다.
- 개인 사용자로 SSH 접속 가능
- root SSH 접속 불가
- 비밀번호 SSH 로그인 불가
sudo사용 가능LANG=ko_KR.UTF-8locale 설정 완료- timezone이
Asia/Seoul git,curl,build-essential등 기본 개발 도구 설치 완료node,npm실행 가능python3 --version에서 Python 3.14.4 확인
여기까지 해두면 Proxmox 위의 Ubuntu 26.04 컨테이너를 기본 개발용 환경으로 쓰기 위한 출발점은 충분합니다. 이후 프로젝트별로 Docker, 데이터베이스 클라이언트, language server, 배포 도구 같은 것만 추가하면 됩니다.
