이 글은 2022년에 작성한 설치 기록을 2026년 7월 기준으로 다시 정리한 글입니다.
Ubuntu와 Docker Compose, Nginx Proxy Manager를 이용해
Vaultwarden을 설치하고 HTTPS로 연결하는 방법을 다룹니다.
마지막에는 선택 사항으로 자동 업데이트 설정도 추가했습니다.
비밀번호 관리 프로그램으로 Enpass를 사용해 오다 추석 연휴를 이용해 Vaultwarden을 설치했습니다.
과거 1~2만 원대에 구입한 Enpass 평생 라이선스만으로도 기능은 충분했습니다.
그러나 회사 보안 정책상 Enpass 볼트를 저장하던 외부 클라우드 서비스가 차단되면서 회사에서는 사실상 사용할 수 없게 되었습니다.
Enpass의 가격 정책이 과거보다 크게 오른 점도 이전을 고민하게 된 이유였습니다.
Vaultwarden은 직접 서버를 운영해야 하지만, 공식 Bitwarden 클라이언트를 사용하면서 개인 서버에 데이터를 보관할 수 있고 TOTP 인증 코드 기능도 활용할 수 있습니다.
기존에 OTP 앱으로 Authy를 사용했지만, 보안 사고 이후에는 비밀번호 관리자와 별도의 인증 수단을 함께 관리하는 방향을 다시 고민하게 됐습니다.
저는 별도의 NAS를 운영하지 않고, 남는 Oracle Cloud 인스턴스에 Vaultwarden을 설치했습니다.
셀프호스팅은 데이터를 직접 관리할 수 있다는 장점이 있지만 서버 장애, 백업, 보안 업데이트도 직접 책임져야 합니다. 따라서 단순히 설치하는 것보다 데이터 저장 위치와 업데이트 방법을 함께 알아두는 것이 중요합니다.
Bitwarden과 Vaultwarden의 차이

Bitwarden은 Bitwarden Inc.에서 공식적으로 개발하는 오픈소스 비밀번호 관리 서비스입니다.
공식 클라우드를 이용할 수도 있고 서버를 직접 구축할 수도 있습니다.
Chrome, Edge, Firefox 확장 프로그램과 데스크톱·모바일 앱도 공식적으로 제공합니다.
Vaultwarden은 과거 bitwarden_rs라는 이름으로 개발되던 비공식 오픈소스 서버입니다.
공식 Bitwarden 서버를 단순히 수정한 포크라기보다, 공식 Bitwarden 클라이언트와 호환되는 서버 API를 Rust로 다시 구현한 프로젝트에 가깝습니다. 공식 서버보다 상대적으로 가볍고 Docker를 이용해 간단하게 설치할 수 있어 개인이나 가족 단위의 셀프호스팅 환경에서 많이 사용됩니다.
Vaultwarden을 사용하더라도 브라우저 확장 프로그램과 데스크톱·모바일 앱은 공식 Bitwarden 클라이언트를 사용합니다.
다만 Vaultwarden은 비공식 호환 서버이므로 Bitwarden 클라이언트가 크게 변경되면 Vaultwarden도 함께 업데이트해야 합니다.
실제로 2026년 7월에는 Bitwarden 브라우저 확장 프로그램이 2026.7.0으로 업데이트된 뒤, Vaultwarden 1.36.0에서는 로그인에 성공해도 금고 항목이 보이지 않는 문제가 발생했습니다.
웹 금고와 기존 데스크톱 앱에서는 데이터가 정상적으로 보였지만 Chrome과 Edge 확장 프로그램에서는 금고가 비어 있었습니다. Vaultwarden을 1.37.0으로 업데이트하자 항목이 다시 정상적으로 표시됐습니다.
데이터가 삭제된 문제는 아니었지만 Bitwarden 클라이언트만 업데이트되고 Vaultwarden 서버가 오래된 상태로 남으면 호환성 문제가 발생할 수 있다는 점을 확인했습니다.
설치 구성
이 글에서는 다음 구성을 사용합니다.
설치 후 디렉터리는 다음과 같은 형태가 됩니다.
~/dockers
├── nginxproxymanager
│ ├── data
│ ├── letsencrypt
│ ├── .env
│ └── docker-compose.yml
└── vaultwarden
├── vw-data
├── backups
├── .env
└── docker-compose.ymlVaultwarden의 실제 데이터는 다음 폴더에 저장됩니다.
~/dockers/vaultwarden/vw-dataDocker 컨테이너는 다시 만들 수 있지만 vw-data에는 계정과 금고 데이터, 첨부 파일, 암호화 키와 서버 설정이 들어 있으므로 삭제하면 안 됩니다.
Ubuntu 초기 설정
패키지를 업데이트하고 서버 시간대를 한국으로 설정합니다.
메모리가 적은 소형 인스턴스라면 2GB 스왑 파일도 함께 만들 수 있습니다.
이미 스왑이 설정돼 있다면 스왑 생성 부분은 건너뛰어도 됩니다.
# 패키지 업데이트
sudo apt update
sudo apt -y upgrade
# 서버 시간대를 한국으로 설정
sudo timedatectl set-timezone Asia/Seoul
# 기존 스왑 확인
swapon --show
# 2GB 스왑 파일 생성
# 이미 스왑이 있다면 아래 네 줄은 실행하지 않아도 됩니다.
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# 재부팅 후에도 스왑 유지
# 기존 설정이 있을 때 중복으로 추가하지 않습니다.
grep -q '^/swapfile ' /etc/fstab || \
echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab
# 최종 확인
timedatectl
free -h
swapon --showDocker와 Docker Compose 설치
Docker와 Docker Compose를 설치하고 부팅할 때 자동으로 실행되도록 설정합니다.
# Docker와 Docker Compose 설치
sudo apt install -y docker.io docker-compose-v2
# docker-compose-v2 패키지를 찾을 수 없을 때는 아래 명령을 사용합니다.
# sudo apt install -y docker.io docker-compose-plugin
# Docker 실행 및 자동 시작
sudo systemctl enable --now docker
# 설치 확인
docker --version
docker compose version과거 문서에서 많이 보이는 docker-compose 대신 현재는 공백이 들어간 docker compose 명령을 사용합니다.
일반 사용자 계정에서도 sudo 없이 Docker를 사용하고 싶다면 다음 명령을 실행한 뒤 로그아웃하고 다시 로그인합니다.
sudo usermod -aG docker "$USER"공용 Docker 네트워크 생성
Nginx Proxy Manager와 Vaultwarden을 서로 다른 Compose 파일로 관리하면서도 내부 네트워크로 연결하기 위해 공용 Docker 네트워크를 만듭니다.
docker network inspect proxy-network >/dev/null 2>&1 || \
docker network create proxy-network이 네트워크를 사용하면 Vaultwarden의 포트를 외부에 직접 공개하지 않고 Nginx Proxy Manager에서 컨테이너 이름으로 연결할 수 있습니다.
Nginx Proxy Manager 설치
Vaultwarden 웹 금고는 브라우저의 Web Crypto API를 사용하기 때문에 HTTPS 환경이 필요합니다. Vaultwarden도 HTTPS와 리버스 프록시 사용을 권장합니다.
여기서는 웹 화면에서 프록시 호스트와 SSL 인증서를 관리할 수 있는 Nginx Proxy Manager를 사용합니다. Nginx Proxy Manager 역시 공식적으로 Docker Compose 설치 예시를 제공합니다.
설치 폴더와 비밀번호 만들기
# 설치 폴더 생성
mkdir -p ~/dockers/nginxproxymanager/{data,letsencrypt}
cd ~/dockers/nginxproxymanager
# 데이터베이스용 무작위 비밀번호 두 개 생성
openssl rand -base64 32
openssl rand -base64 32출력된 두 비밀번호를 각각 복사해 안전한 곳에 보관합니다.
환경변수 파일 생성
아래 명령 전체를 복사해 붙여넣되 비밀번호 부분은 방금 생성한 값으로 교체합니다.
cat > .env <<'EOF'
DB_MYSQL_ROOT_PASSWORD=첫_번째_비밀번호로_교체
DB_MYSQL_PASSWORD=두_번째_비밀번호로_교체
EOF
# 다른 사용자가 파일을 읽지 못하도록 권한 제한
chmod 600 .envEOF 사이에 입력된 내용이 .env 파일로 저장되므로 별도의 편집기를 사용할 필요가 없습니다.
Docker Compose 파일 생성 및 실행
cat > docker-compose.yml <<'EOF'
services:
app:
image: jc21/nginx-proxy-manager:latest
container_name: nginx-proxy-manager
restart: unless-stopped
ports:
- "80:80"
- "81:81"
- "443:443"
environment:
DB_MYSQL_HOST: db
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: npm
DB_MYSQL_PASSWORD: ${DB_MYSQL_PASSWORD}
DB_MYSQL_NAME: npm
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
depends_on:
- db
networks:
- proxy-network
db:
image: jc21/mariadb-aria:latest
container_name: nginx-proxy-manager-db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${DB_MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: npm
MYSQL_USER: npm
MYSQL_PASSWORD: ${DB_MYSQL_PASSWORD}
MARIADB_AUTO_UPGRADE: "1"
volumes:
- ./data/mysql:/var/lib/mysql
networks:
- proxy-network
networks:
proxy-network:
external: true
EOF
# Compose 문법 확인
docker compose config
# 이미지 다운로드 및 실행
docker compose pull
docker compose up -d
# 실행 상태 확인
docker compose psdocker compose config에서 오류가 없다면 Nginx Proxy Manager가 실행됩니다.
관리 페이지는 다음 주소로 접속합니다.
http://서버-i최초 로그인 정보는 설치 시점의 Nginx Proxy Manager 공식 문서를 확인하고,
로그인한 뒤 관리자 이메일과 비밀번호를 즉시 변경합니다.
81번 포트는 관리자 페이지용입니다.
가능하면 인터넷 전체에 공개하지 말고 Ubuntu 방화벽이나 Oracle Cloud 보안 목록에서 본인이 사용하는 IP만 접근하도록 제한하는 편이 안전합니다.
Vaultwarden 설치
설치 폴더와 관리자 토큰 만들기
# 설치 폴더와 백업 폴더 생성
mkdir -p ~/dockers/vaultwarden/{vw-data,backups}
cd ~/dockers/vaultwarden
# 관리자 페이지에 사용할 무작위 토큰 생성
openssl rand -base64 48출력된 관리자 토큰은 반드시 별도로 보관합니다.
관리자 페이지는 설치 후 다음 주소로 접속할 수 있습니다.
https://vault.example.com/admin환경변수 파일 생성
아래의 도메인과 관리자 토큰을 실제 값으로 바꿉니다.
처음 계정을 생성해야 하므로 회원가입은 우선 허용합니다.
cat > .env <<'EOF'
DOMAIN=https://vault.example.com
SIGNUPS_ALLOWED=true
ADMIN_TOKEN=방금_생성한_관리자_토큰으로_교체
EOF
chmod 600 .envDocker Compose 파일 생성 및 실행
cat > docker-compose.yml <<'EOF'
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
env_file:
- .env
environment:
DOMAIN: ${DOMAIN}
SIGNUPS_ALLOWED: ${SIGNUPS_ALLOWED}
ADMIN_TOKEN: ${ADMIN_TOKEN}
volumes:
- ./vw-data:/data
networks:
- proxy-network
networks:
proxy-network:
external: true
EOF
# Compose 문법 확인
docker compose config
# 이미지 다운로드 및 실행
docker compose pull
docker compose up -d
# 실행 상태 확인
docker compose ps
# Vaultwarden 서버와 Web Vault 버전 확인
docker exec vaultwarden /vaultwarden --versionVaultwarden은 컨테이너 이미지와 호스트의 데이터 폴더를 연결해 데이터를 영구 저장하는 방식을 권장합니다. 위 구성에서는 호스트의 vw-data 폴더가 컨테이너의 /data에 연결됩니다.
버전 확인 결과에는 다음 두 항목이 표시됩니다.
Vaultwarden 1.x.x
Web-Vault 2026.x.xVaultwarden은 서버 본체 버전이고 Web-Vault는 서버에 포함된 웹 인터페이스 버전입니다. 두 숫자가 다른 것은 정상입니다.
Nginx Proxy Manager 연결
Nginx Proxy Manager 관리자 페이지에 접속합니다.
http://서버 ip:81

Details
다음과 같이 입력합니다.
Domain Names: vault.example.com
Scheme: http
Forward Hostname / IP: vaultwarden
Forward Port: 80다음 항목을 활성화합니다.
Block Common Exploits
Websockets SupportSSL
SSL Certificate에서 Request a new SSL Certificate를 선택합니다.
다음 항목을 활성화합니다.
Force SSL
HTTP/2 Support
HSTS EnabledLet’s Encrypt 이용약관에 동의한 뒤 저장합니다.
정상적으로 설정되면 다음 주소로 Vaultwarden에 접속할 수 있습니다.
httpas과거 설치 예시에서는 실시간 알림을 위해 3012 포트를 별도로 연결하기도 했지만
현재 구성에서는 별도의 3012 포트 매핑이 필요하지 않습니다.
첫 계정 생성 후 회원가입 차단
Vaultwarden 웹 페이지에서 사용할 계정을 먼저 생성합니다.
계정 생성이 끝났다면 아래 명령을 실행해 회원가입을 차단합니다.
cd ~/dockers/vaultwarden
# SIGNUPS_ALLOWED=true를 false로 변경
sed -i 's/^SIGNUPS_ALLOWED=true$/SIGNUPS_ALLOWED=false/' .env
# 변경된 설정 확인
grep SIGNUPS_ALLOWED .env
# 컨테이너에 설정 적용
docker compose up -d결과가 다음과 같이 표시되면 정상입니다.
SIGNUPS_ALLOWED=falseVaultwarden 관리자 페이지에서 설정을 저장한 적이 있다면 vw-data/config.json의 값이 .env보다 우선 적용될 수 있습니다.
실행 시 다음과 같은 메시지가 표시되더라도 오류는 아닙니다.
The following environment variables are being overridden by the config.json file관리자 페이지에서 저장한 설정이 환경변수보다 우선 적용되고 있다는 안내입니다.
Bitwarden 클라이언트 연결
브라우저 확장 프로그램이나 데스크톱 앱에서 바로 로그인하면 공식 Bitwarden 서버로 연결됩니다.
로그인 화면에서 서버 설정 또는 Self-hosted 항목을 열고 서버 주소를 입력 한뒤,
Vaultwarden에서 만든 계정으로 로그인합니다.
브라우저 확장 프로그램과 앱은 공식 Bitwarden 클라이언트를 사용하지만 데이터는 직접 구축한 Vaultwarden 서버와 동기화됩니다.
Vaultwarden 데이터 백업
Vaultwarden 데이터는 다음 폴더에 저장됩니다.
~/dockers/vaultwarden/vw-data일반적으로 다음 파일과 폴더가 포함됩니다.
db.sqlite3
config.json
attachments
sends
rsa_key.pem
rsa_key.pub.pem데이터베이스뿐 아니라 첨부 파일과 암호화 키, 설정을 함께 복구하려면 vw-data 폴더 전체를 백업해야 합니다.
아래 명령은 Vaultwarden을 잠시 멈추고 데이터 전체를 압축한 뒤 다시 시작합니다.
cd ~/dockers/vaultwarden
# 백업 폴더 생성
mkdir -p backups
# 데이터베이스가 변경되지 않도록 잠시 중지
docker compose stop vaultwarden
# 현재 날짜와 시간을 붙여 전체 데이터 압축
tar -czpf \
"backups/vw-data-$(date +%Y%m%d-%H%M%S).tar.gz" \
vw-data
# Vaultwarden 다시 실행
docker compose start vaultwarden
# 생성된 백업 확인
ls -lh backups서버 내부에만 백업하면 인스턴스나 디스크에 문제가 생겼을 때 백업도 함께 사라질 수 있습니다. 중요한 백업 파일은 로컬 컴퓨터나 별도 저장장치에도 복사하는 것이 좋습니다.
Vaultwarden 수동 업데이트
Compose 파일에 latest를 적었다고 실행 중인 Vaultwarden이 자동으로 업데이트되는 것은 아닙니다.
최신 이미지를 내려받고 새 이미지로 컨테이너를 재생성해야 합니다.
업데이트 전 백업부터 진행합니다.
cd ~/dockers/vaultwarden
# 업데이트 전 데이터 백업
mkdir -p backups
docker compose stop vaultwarden
tar -czpf \
"backups/vw-data-$(date +%Y%m%d-%H%M%S).tar.gz" \
vw-data
docker compose start vaultwarden
# 최신 이미지 다운로드 및 적용
docker compose pull
docker compose up -d
# 업데이트된 버전과 실행 상태 확인
docker exec vaultwarden /vaultwarden --version
docker compose ps컨테이너는 새 이미지로 교체될 수 있지만 다음 볼륨 연결은 유지됩니다.
volumes:
- ./vw-data:/data따라서 호스트의 vw-data 폴더를 직접 삭제하지 않는 한 업데이트 과정에서 금고 데이터가 초기화되지 않습니다.
과거 글에서 사용했던 다음 방식은 더 이상 권장하지 않습니다.
docker stop vaultwarden
docker rm vaultwarden
docker run ...볼륨과 환경변수, 네트워크 등을 모두 정확히 다시 지정하면 사용할 수 있지만 설정을 빠뜨릴 위험이 있습니다.
현재는 실행 설정을 docker-compose.yml에 기록하고 다음 두 명령으로 업데이트하는 편이 간단하고 안전합니다.
docker compose pull
docker compose up -dNginx Proxy Manager 수동 업데이트
Nginx Proxy Manager도 같은 방식으로 업데이트합니다. 공식 업데이트 안내 역시 docker compose pull과 docker compose up -d를 사용합니다.
업데이트 전에 Nginx Proxy Manager의 data와 letsencrypt 폴더를 백업합니다.
cd ~/dockers/nginxproxymanager
# 백업 폴더 생성
mkdir -p backups
# 컨테이너 잠시 중지
docker compose down
# 설정과 인증서, 데이터베이스 전체 백업
tar -czpf \
"backups/nginxproxymanager-$(date +%Y%m%d-%H%M%S).tar.gz" \
data letsencrypt .env docker-compose.yml
# 최신 이미지 적용
docker compose pull
docker compose up -d
# 실행 상태 확인
docker compose psdata 폴더에는 Nginx Proxy Manager 설정과 데이터베이스가 포함되고, letsencrypt에는 발급된 인증서가 저장됩니다.
선택 사항: 주간 자동 업데이트
자동 업데이트는 필수 설정이 아닙니다.
새 버전을 직접 확인한 뒤 업데이트하고 싶다면 이 부분은 건너뛰면 됩니다.
과거에는 Watchtower를 이용해 Docker 컨테이너를 자동으로 업데이트하는 방법이 널리 사용됐습니다.
하지만 Watchtower 공식 저장소는 2025년 12월 17일 읽기 전용으로 전환됐습니다.
제 서버에서는 Docker Engine이 업데이트된 뒤 Watchtower가 다음 오류를 반복하며 더 이상 동작하지 않았습니다.
client version 1.25 is too old
Minimum supported API version is 1.44Watchtower 컨테이너는 실행 목록에 있었지만 실제로는 Vaultwarden을 업데이트하지 못했습니다.
그 결과 Vaultwarden 서버가 약 두 달간 구버전에 머물렀고 Bitwarden 확장 프로그램과 호환성 문제가 생겼습니다.
현재는 별도 자동 업데이트 컨테이너 대신 Ubuntu의 systemd timer를 사용해 매주 한 번 다음 작업을 수행하도록 구성합니다.
Vaultwarden 데이터 백업
Vaultwarden 업데이트
Nginx Proxy Manager 업데이트
최근 Vaultwarden 백업 8개 유지
사용하지 않는 Docker 이미지 정리설치 경로 확인
아래 자동 업데이트 설정은 Ubuntu 사용자 이름이 ubuntu이고 설치 경로가 다음과 같다고 가정합니다.
/home/ubuntu/dockers/vaultwarden
/home/ubuntu/dockers/nginxproxymanager다른 사용자나 경로를 사용했다면 스크립트 상단의 경로를 실제 환경에 맞게 변경해야 합니다.
자동 업데이트 스크립트 생성
아래 명령 전체를 복사해 실행합니다.
sudo tee /usr/local/sbin/update-vaultwarden-stack.sh >/dev/null <<'EOF'
#!/usr/bin/env bash
set -Eeuo pipefail
VAULTWARDEN_DIR="/home/ubuntu/dockers/vaultwarden"
NPM_DIR="/home/ubuntu/dockers/nginxproxymanager"
BACKUP_DIR="$VAULTWARDEN_DIR/backups"
LOCK_FILE="/run/lock/vaultwarden-stack-update.lock"
VAULTWARDEN_STOPPED=0
log() {
echo "[$(date --iso-8601=seconds)] $*"
}
# 백업 중 오류가 나더라도 Vaultwarden이 정지 상태로 남지 않게 합니다.
restart_vaultwarden() {
if [[ "$VAULTWARDEN_STOPPED" -eq 1 ]]; then
cd "$VAULTWARDEN_DIR"
docker compose start vaultwarden || true
fi
}
trap restart_vaultwarden EXIT
# 중복 실행 방지
exec 9>"$LOCK_FILE"
flock -n 9 || exit 0
mkdir -p "$BACKUP_DIR"
cd "$VAULTWARDEN_DIR"
log "Vaultwarden을 중지하고 데이터를 백업합니다."
docker compose stop vaultwarden
VAULTWARDEN_STOPPED=1
tar -czpf \
"$BACKUP_DIR/vw-data-$(date +%Y%m%d-%H%M%S).tar.gz" \
vw-data
log "백업 후 Vaultwarden을 다시 실행합니다."
docker compose start vaultwarden
VAULTWARDEN_STOPPED=0
log "최근 백업 8개만 유지합니다."
find "$BACKUP_DIR" \
-maxdepth 1 \
-type f \
-name 'vw-data-*.tar.gz' \
-printf '%T@ %p\n' |
sort -rn |
tail -n +9 |
cut -d' ' -f2- |
xargs -r rm -f
log "Vaultwarden을 업데이트합니다."
cd "$VAULTWARDEN_DIR"
docker compose pull
docker compose up -d
log "Nginx Proxy Manager를 업데이트합니다."
cd "$NPM_DIR"
docker compose pull
docker compose up -d
log "컨테이너가 시작될 때까지 기다립니다."
sleep 15
log "Vaultwarden 상태"
cd "$VAULTWARDEN_DIR"
docker compose ps
log "Nginx Proxy Manager 상태"
cd "$NPM_DIR"
docker compose ps
# 주요 컨테이너가 실행 중인지 확인
docker ps --format '{{.Names}}' | grep -qx 'vaultwarden'
docker ps --format '{{.Names}}' | grep -qx 'nginx-proxy-manager'
docker ps --format '{{.Names}}' | grep -qx 'nginx-proxy-manager-db'
log "사용하지 않는 이전 이미지를 정리합니다."
docker image prune -f
log "자동 백업 및 업데이트를 완료했습니다."
EOF
sudo chmod 750 /usr/local/sbin/update-vaultwarden-stack.shsystemd 서비스와 타이머 등록
매주 일요일 오전 4시에 실행하도록 서비스와 타이머를 한 번에 생성합니다.
sudo tee /etc/systemd/system/vaultwarden-stack-update.service >/dev/null <<'EOF'
[Unit]
Description=Back up and update Vaultwarden and Nginx Proxy Manager
Requires=docker.service
After=docker.service network-online.target
Wants=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/update-vaultwarden-stack.sh
TimeoutStartSec=45min
EOF
sudo tee /etc/systemd/system/vaultwarden-stack-update.timer >/dev/null <<'EOF'
[Unit]
Description=Weekly Vaultwarden stack backup and update
[Timer]
OnCalendar=Sun *-*-* 04:00:00 Asia/Seoul
Persistent=true
RandomizedDelaySec=10m
Unit=vaultwarden-stack-update.service
[Install]
WantedBy=timers.target
EOF
# 설정 적용 및 자동 실행 활성화
sudo systemctl daemon-reload
sudo systemctl enable --now vaultwarden-stack-update.timer
# 다음 실행 일정 확인
systemctl list-timers --all | grep vaultwardenRandomizedDelaySec=10m을 사용했으므로 매주 일요일 오전 4시부터 4시 10분 사이에 실행됩니다.
예약 시간에 서버가 꺼져 있었다면 Persistent=true 설정에 따라 다음 부팅 후 놓친 작업을 실행합니다.
자동 업데이트 시험
예약일까지 기다리지 않고 한 번 직접 실행해 봅니다.
# 자동 백업과 업데이트 즉시 실행
sudo systemctl start vaultwarden-stack-update.service
# 실행 결과와 로그 확인
systemctl status vaultwarden-stack-update.service --no-pager
sudo journalctl \
-u vaultwarden-stack-update.service \
-n 100 \
--no-pager
# 생성된 Vaultwarden 백업 확인
ls -lh ~/dockers/vaultwarden/backupsType=oneshot 서비스는 작업을 마치면 inactive (dead)로 표시될 수 있습니다.
이는 오류가 아니며 다음과 같이 성공 여부가 표시되면 정상입니다.
status=0/SUCCESS자동 업데이트가 부담스럽다면 이 설정을 적용하지 않고 앞에서 설명한 수동 업데이트 명령만 주기적으로 실행해도 됩니다.
문제가 생겼을 때 확인할 명령
Vaultwarden 실행 상태:
cd ~/dockers/vaultwarden
docker compose psVaultwarden 버전:
docker exec vaultwarden /vaultwarden --versionVaultwarden 최근 로그:
docker logs --tail 100 vaultwardenNginx Proxy Manager 실행 상태:
cd ~/dockers/nginxproxymanager
docker compose psNginx Proxy Manager 최근 로그:
docker logs --tail 100 nginx-proxy-managerVaultwarden과 Nginx Proxy Manager가 공용 네트워크에 연결됐는지 확인:
docker network inspect proxy-networkVaultwarden 백업 확인:
ls -lh ~/dockers/vaultwarden/backups자동 업데이트 일정 확인:
systemctl list-timers --all | grep vaultwarden자동 업데이트 로그 확인:
sudo journalctl \
-u vaultwarden-stack-update.service \
-n 100 \
--no-pager사용 후기
처음 설치했을 때는 리버스 프록시 설정이 생소해 시행착오가 많았습니다.
Docker도 서버 엔지니어 지인이나 회사에서 자주 듣기만 했던 단어라 어렵게 느껴졌지만, 실제 설치 과정은 폴더를 만들고 Compose 파일을 작성한 뒤 몇 개의 명령을 실행하는 것으로 끝났습니다.
몇 년 동안 운영해 보니 설치보다 중요한 것은 다음 세 가지였습니다.
데이터 볼륨
백업
업데이트
컨테이너는 다시 만들 수 있지만 vw-data가 사라지면 금고 데이터를 복구하기 어렵습니다.
또한 Compose 파일에 latest를 사용한다고 서버가 저절로 업데이트되는 것도 아닙니다. 최신 이미지를 내려받고 컨테이너를 재생성해야 실제 버전이 변경됩니다.
Bitwarden 클라이언트는 브라우저나 앱스토어를 통해 자동으로 업데이트되는데 Vaultwarden 서버만 오래된 상태로 남으면 호환성 문제가 생길 수 있습니다.
자동 업데이트가 부담스럽다면 다음 명령을 정기적으로 실행하는 것만으로도 충분합니다.
cd ~/dockers/vaultwarden
docker compose pull
docker compose up -d
docker exec vaultwarden /vaultwarden --version다만 업데이트 전에는 반드시 vw-data를 백업하는 것이 좋습니다.
장점
다양한 서비스의 데이터 가져오기 지원
여러 비밀번호 관리 서비스에서 내보낸 데이터를 Bitwarden 형식으로 가져올 수 있습니다.
공식 Bitwarden 클라이언트 사용
Chrome, Edge, Firefox 브라우저 확장 프로그램과 Windows, macOS, Linux, iOS, Android용 공식 Bitwarden 앱을 사용할 수 있습니다.
URL 매칭 방식
기본 도메인, 호스트, 정확한 URL, 정규식 등 다양한 URL 매칭 규칙을 지정할 수 있습니다.
직접 관리하는 저장소
데이터를 외부 비밀번호 관리 서비스가 아니라 자신이 운영하는 서버에 저장할 수 있습니다.
비교적 가벼운 서버 구성
공식 Bitwarden 셀프호스팅 서버보다 상대적으로 가볍고 Docker 기반으로 설치할 수 있습니다.
단점
서버를 직접 관리해야 함
서버 장애와 데이터 백업, 보안 업데이트, 도메인과 SSL 인증서, 리버스 프록시를 직접 관리해야 합니다.
공식 서버와의 호환성 차이
Vaultwarden은 비공식 호환 서버이므로 Bitwarden 클라이언트 업데이트 직후 일시적인 호환성 문제가 발생할 수 있습니다.
자동완성 사용성 차이
Enpass는 입력 영역을 클릭했을 때 계정을 선택하는 과정이 자연스럽게 표시되는 반면 Bitwarden은 자동완성 설정이나 인라인 자동완성 메뉴를 별도로 조정해야 할 수 있습니다.
여러 계정을 사용하는 사이트에서는 Enpass의 계정 선택 방식이 더 편하게 느껴졌습니다.
첨부 파일 사용성
신분증 이미지 등의 파일을 첨부할 수 있지만 파일 종류와 클라이언트에 따라 Enpass처럼 내부에서 바로 확인하기보다 다운로드가 필요한 경우가 있습니다.
기본 항목 유형
Enpass의 금융, 여행, 라이선스 등 세분화된 템플릿과 비교하면 기본으로 제공하는 항목 유형이 단순하게 느껴질 수 있습니다.
직접 로고를 지정하기 어려움
Enpass와 달리 항목별로 원하는 로고나 심볼 이미지를 직접 등록하는 기능은 제한적입니다.
마무리
사용 환경에서 Enpass의 동기화 서비스가 차단되지 않고 필요한 기능을 합리적인 비용으로 이용할 수 있다면 완성도와 편의성 측면에서는 Enpass가 더 잘 맞을 수 있습니다.
Vaultwarden은 무료라서 무조건 편한 서비스가 아니라 비용 대신 서버 운영과 관리 부담을 직접 감수하는 방식에 가깝습니다.
다만 데이터를 직접 관리하고 여러 환경에서 공식 Bitwarden 클라이언트를 사용하고 싶다면 충분히 매력적인 대안입니다.









