vaultwarden的升级和部署修改为1.37版本

This commit is contained in:
2026-07-29 16:41:58 +08:00
parent 99e9ec1434
commit 1bfd657f99
6 changed files with 901 additions and 59 deletions
+84 -3
View File
@@ -24,11 +24,72 @@ source "$BASE_DIR/setup.sh"
# Vaultwarden 专用函数
# =============================================================
GITHUB_REPO="dani-garcia/vaultwarden"
# 生成随机密码
generate_password() {
openssl rand -base64 32 | tr -d '/+=' | head -c 32
}
# 查询 GitHub 上的最新 release 版本号(不含前缀 v),失败返回非零
resolve_latest_version() {
local ver
ver=$(curl -sf --max-time 20 \
"https://api.github.com/repos/${GITHUB_REPO}/releases/latest" \
| grep -o '"tag_name"[[:space:]]*:[[:space:]]*"[^"]*"' \
| head -1 | sed 's/.*"\([^"]*\)"$/\1/' | sed 's/^v//') || true
[ -n "$ver" ] || return 1
echo "$ver"
}
# 把镜像固定到具体版本号。
# 必须同时更新 .env 和已导出的环境变量:init_env 里 `set -a; source .env` 已把旧值
# 导出到本进程,而 docker compose 对环境变量的优先级高于 .env 文件,只改文件不生效。
pin_image_version() {
local ref="$1"
if grep -q '^VAULTWARDEN_IMAGE=' .env; then
sed -i "s|^VAULTWARDEN_IMAGE=.*|VAULTWARDEN_IMAGE=${ref}|" .env
else
printf '\nVAULTWARDEN_IMAGE=%s\n' "$ref" >> .env
fi
export VAULTWARDEN_IMAGE="$ref"
}
# 确定本次部署使用的镜像版本。
# 不使用 latest 标签的原因:它只在 docker compose pull 时才重新解析,容器不重建就会
# 一直跑旧版本,且从配置上看不出实际运行的是哪一版。
setup_image_version() {
local current="${VAULTWARDEN_IMAGE:-}"
# 已固定到具体版本 → 尊重现有配置,升级交给 upgrade.sh
if [ -n "$current" ] && [[ "$current" != *":latest" ]]; then
log " 镜像: ${current}"
return 0
fi
# 已有实例却仍在用 latest:此时固定版本等同于一次升级,
# 而升级必须走 upgrade.sh(带冷备份、完整性校验、自动回滚),这里不擅自处理。
if docker compose ps -a -q vaultwarden 2>/dev/null | grep -q .; then
warn "检测到已存在的实例,且 .env 仍在使用 latest 标签"
warn "latest 不会自动更新,也看不出实际运行版本,建议固定到具体版本号:"
warn " bash upgrade.sh # 安全升级到最新版,并自动写回版本号"
warn "本次部署不改动镜像配置"
return 0
fi
log "正在查询 Vaultwarden 最新版本..."
local ver
if ! ver="$(resolve_latest_version)"; then
warn "无法从 GitHub 获取最新版本号(网络问题?),本次回退使用 latest 标签"
warn "部署完成后建议手动固定: VAULTWARDEN_IMAGE=vaultwarden/server:<版本号>"
[ -n "$current" ] || pin_image_version "vaultwarden/server:latest"
return 0
fi
pin_image_version "vaultwarden/server:${ver}"
log " 镜像: vaultwarden/server:${ver}(当前最新 release,已写入 .env"
}
init_env() {
step "初始化 Vaultwarden 配置"
@@ -83,6 +144,8 @@ init_env() {
log " 域名: ${VAULTWARDEN_DOMAIN}"
log " 邮箱: ${CERTBOT_EMAIL}"
log " 注册: ${SIGNUPS_ALLOWED:-true}"
setup_image_version
}
create_dirs() {
@@ -95,21 +158,39 @@ create_dirs() {
log "备份目录: $backup_dir"
}
# 确认容器真的跑在配置指定的镜像上,避免「配置改了但容器没重建」这类静默失败
verify_running_version() {
local cid actual expect="${VAULTWARDEN_IMAGE:-}"
cid=$(docker compose ps -a -q vaultwarden 2>/dev/null | head -1)
[ -n "$cid" ] || return 0
actual=$(docker inspect "$cid" --format '{{.Config.Image}}' 2>/dev/null || true)
if [ -n "$expect" ] && [ "$actual" != "$expect" ]; then
warn "容器实际镜像 (${actual}) 与配置 (${expect}) 不一致"
warn "请检查: docker compose up -d --force-recreate"
return 0
fi
log " 运行镜像: ${actual}"
}
start_services() {
step "启动 Vaultwarden 服务"
log "正在拉取镜像..."
docker compose pull
# --force-recreate:容器处于 stopped 状态时,up -d 只会把原容器重新 start,
# 不会因镜像或环境变量变更而重建,导致「配置改了但没生效」。
log "正在启动容器..."
docker compose up -d
docker compose up -d --force-recreate
local port="${VAULTWARDEN_PORT:-8080}"
log "等待 Vaultwarden 就绪..."
local max_wait=30
for i in $(seq 1 "$max_wait"); do
for _ in $(seq 1 "$max_wait"); do
if curl -sf "http://127.0.0.1:${port}/alive" &> /dev/null; then
log "Vaultwarden 启动成功!"
verify_running_version
return
fi
sleep 2
@@ -144,7 +225,7 @@ show_info() {
if [[ "${SIGNUPS_ALLOWED:-true}" == "true" ]]; then
echo -e "${GREEN}${NC} ${YELLOW}⚠ 注册功能已开启,注册完账号后建议关闭:${NC}"
echo -e "${GREEN}${NC} ${YELLOW} 修改 .env 中 SIGNUPS_ALLOWED=false${NC}"
echo -e "${GREEN}${NC} ${YELLOW} 然后 docker compose restart${NC}"
echo -e "${GREEN}${NC} ${YELLOW} 然后 docker compose up -d(不是 restart${NC}"
fi
echo -e "${GREEN}${NC}"
echo -e "${GREEN}╚══════════════════════════════════════════════════════════╝${NC}"