Files

55 lines
1.9 KiB
Bash

#!/usr/bin/env bash
set -Eeuo pipefail
# shellcheck source=lib.sh
source "$(dirname -- "${BASH_SOURCE[0]}")/lib.sh"
env_file="${1:-/etc/lehuo/lehuo.env}"
require_command docker
require_command curl
require_command openssl
require_env_file "$env_file"
docker version >/dev/null
docker compose version >/dev/null
required_keys=(IMAGE_TAG PUBLIC_HOST FILES_HOST TLS_CERT_PATH TLS_KEY_PATH BACKUP_DIR DATABASE_URL REDIS_URL FIELD_ENCRYPTION_KEY ADMIN_WEB_ORIGIN)
for key in "${required_keys[@]}"; do
value="$(env_value "$env_file" "$key")"
[[ -n "$value" && "$value" != replace-* ]] || {
printf '环境变量缺失或仍为占位值:%s\n' "$key" >&2
exit 1
}
done
image_tag="$(env_value "$env_file" IMAGE_TAG)"
[[ "$image_tag" != 'latest' ]] || { echo '禁止使用 latest 镜像标签。' >&2; exit 1; }
public_host="$(env_value "$env_file" PUBLIC_HOST)"
files_host="$(env_value "$env_file" FILES_HOST)"
[[ "$public_host" != "$files_host" ]] || { echo 'PUBLIC_HOST 与 FILES_HOST 必须不同。' >&2; exit 1; }
cert_path="$(env_value "$env_file" TLS_CERT_PATH)"
key_path="$(env_value "$env_file" TLS_KEY_PATH)"
[[ -r "$cert_path" && -r "$key_path" ]] || { echo 'TLS 证书或私钥不存在/不可读。' >&2; exit 1; }
openssl x509 -in "$cert_path" -noout -checkend 604800 >/dev/null || {
echo 'TLS 证书将在 7 天内过期或无效。' >&2
exit 1
}
openssl x509 -in "$cert_path" -noout -checkhost "$public_host" >/dev/null || {
printf 'TLS 证书不包含管理端域名:%s\n' "$public_host" >&2
exit 1
}
openssl x509 -in "$cert_path" -noout -checkhost "$files_host" >/dev/null || {
printf 'TLS 证书不包含文件域名:%s\n' "$files_host" >&2
exit 1
}
openssl pkey -in "$key_path" -noout -check >/dev/null
compose "$env_file" config --quiet
available_kb="$(df -Pk "$(repo_root)" | awk 'NR==2 {print $4}')"
((available_kb >= 10 * 1024 * 1024)) || { echo '可用磁盘不足 10 GiB。' >&2; exit 1; }
echo 'Ubuntu 生产部署预检通过。'