#!/usr/bin/env bash # firstboot.sh - 由 weknora-firstboot.service 在新实例首次开机时自动执行。 # 任务: 生成随机密钥写入 .env -> 启动容器 -> 输出凭证 -> 自删除。 set -euo pipefail WEKNORA_DIR="${WEKNORA_DIR:-/opt/WeKnora}" ENV_FILE="${WEKNORA_DIR}/.env" CRED_FILE="/root/weknora-credentials.txt" LOG_FILE="/var/log/weknora-firstboot.log" exec >>"${LOG_FILE}" 2>&1 echo "==== firstboot started at $(date -Iseconds) ====" if [[ ! -f "${ENV_FILE}" ]]; then echo "ERROR: ${ENV_FILE} not found" exit 1 fi # 生成 32 字节强随机字符串(用于 AES-256 key, 必须刚好 32 字节) gen32() { LC_ALL=C tr -dc 'A-Za-z0-9' >"${ENV_FILE}" fi } replace DB_PASSWORD "${DB_PWD}" replace REDIS_PASSWORD "${REDIS_PWD}" replace JWT_SECRET "${JWT}" replace SYSTEM_AES_KEY "${SYS_AES}" replace TENANT_AES_KEY "${TENANT_AES}" replace GIN_MODE "release" echo "env updated, starting docker compose..." cd "${WEKNORA_DIR}" /usr/bin/docker compose up -d # 尝试拿公网 IP, 失败就用内网 PUB_IP=$(curl -fsS --max-time 5 https://ifconfig.me 2>/dev/null \ || curl -fsS --max-time 5 https://api.ipify.org 2>/dev/null \ || hostname -I | awk '{print $1}') umask 077 cat >"${CRED_FILE}" <