feat: 引入多环境配置支持,通过 .env.dev 和 .env.prod 文件管理不同环境配置,并更新 main.go 以加载对应配置。
This commit is contained in:
96
.env
96
.env
@@ -1,93 +1,3 @@
|
|||||||
# ============================================
|
# Environment Selector
|
||||||
# 会计应用环境变量配置
|
# Options: dev, prod
|
||||||
# ============================================
|
APP_ENV=dev
|
||||||
|
|
||||||
# ============================================
|
|
||||||
# 服务器配置
|
|
||||||
# ============================================
|
|
||||||
SERVER_PORT=2612
|
|
||||||
ENVIRONMENT=production
|
|
||||||
|
|
||||||
# ============================================
|
|
||||||
# 数据目录
|
|
||||||
# ============================================
|
|
||||||
DATA_DIR=./data
|
|
||||||
|
|
||||||
# ============================================
|
|
||||||
# MySQL 数据库配置(必填)
|
|
||||||
# ============================================
|
|
||||||
# MySQL 数据库配置
|
|
||||||
DB_HOST=124.221.157.197
|
|
||||||
DB_PORT=3306
|
|
||||||
DB_USER=bookkeeping
|
|
||||||
DB_PASSWORD=bookkeeping
|
|
||||||
DB_NAME=bookkeeping
|
|
||||||
DB_ROOT_PASSWORD=lihuaLIHUA
|
|
||||||
DB_CHARSET=utf8mb4
|
|
||||||
|
|
||||||
# ============================================
|
|
||||||
# Redis 配置(可选,用于汇率缓存)
|
|
||||||
# ============================================
|
|
||||||
REDIS_ADDR=124.221.157.197:6379
|
|
||||||
REDIS_PASSWORD=lihua0101LIHUA
|
|
||||||
REDIS_DB=0
|
|
||||||
|
|
||||||
# ============================================
|
|
||||||
# 汇率 API 配置(可选)
|
|
||||||
# ============================================
|
|
||||||
YUNAPI_URL=https://yunapi.cn/api/huilv
|
|
||||||
YUNAPI_KEY=
|
|
||||||
SYNC_INTERVAL=10m
|
|
||||||
CACHE_EXPIRATION=10m
|
|
||||||
MAX_RETRIES=3
|
|
||||||
|
|
||||||
# ============================================
|
|
||||||
# JWT 配置(必填,生产环境请修改)
|
|
||||||
# ============================================
|
|
||||||
JWT_SECRET=
|
|
||||||
JWT_ACCESS_EXPIRY=15m
|
|
||||||
JWT_REFRESH_EXPIRY=168h
|
|
||||||
|
|
||||||
# ============================================
|
|
||||||
# GitHub OAuth 配置(可选)
|
|
||||||
# ============================================
|
|
||||||
GITHUB_CLIENT_ID=Ov23liWppFX67560JfBf
|
|
||||||
GITHUB_CLIENT_SECRET=7e154e464dccd913a92cf580021f2a5dc51aac93
|
|
||||||
GITHUB_REDIRECT_URL=https://bk.swalktech.top/api/v1/auth/github/callback
|
|
||||||
FRONTEND_URL=https://bk.swalktech.top
|
|
||||||
|
|
||||||
# ============================================
|
|
||||||
# 网络配置
|
|
||||||
# ============================================
|
|
||||||
# HTTP/HTTPS 代理配置(如果服务器无法直接访问 GitHub API,请配置此项)
|
|
||||||
# 格式: http://127.0.0.1:7890
|
|
||||||
HTTPS_PROXY=
|
|
||||||
|
|
||||||
# ============================================
|
|
||||||
# AI 配置(语音记账功能)
|
|
||||||
# ============================================
|
|
||||||
# OpenAI API Key(必填,用于语音转文字和智能解析)
|
|
||||||
OPENAI_API_KEY=sk-dlyjklqnwlcotkwudszeoedjddkdbarohetcmbheytsbklzu
|
|
||||||
|
|
||||||
# OpenAI API 基础URL(可选,默认为官方API,可改为兼容API如 Azure OpenAI)
|
|
||||||
OPENAI_BASE_URL=https://api.siliconflow.cn/v1
|
|
||||||
|
|
||||||
# Whisper 语音识别模型(可选,默认 whisper-1)
|
|
||||||
WHISPER_MODEL=FunAudioLLM/SenseVoiceSmall
|
|
||||||
|
|
||||||
# 聊天模型(可选,默认 gpt-3.5-turbo,可改为 gpt-4 等)
|
|
||||||
CHAT_MODEL=Qwen/Qwen3-8B
|
|
||||||
|
|
||||||
# 识图模型
|
|
||||||
OCR_MODEL=deepseek-ai/DeepSeek-OCR
|
|
||||||
|
|
||||||
# AI 会话超时时间
|
|
||||||
AI_SESSION_TIMEOUT=30m
|
|
||||||
|
|
||||||
# ============================================
|
|
||||||
# 图片上传配置
|
|
||||||
# ============================================
|
|
||||||
IMAGE_UPLOAD_DIR=./uploads/images
|
|
||||||
MAX_IMAGE_SIZE=10485760
|
|
||||||
ALLOWED_IMAGE_TYPES=image/jpeg,image/png,image/heic
|
|
||||||
MAX_IMAGES_PER_TX=9
|
|
||||||
|
|||||||
95
.env.dev
Normal file
95
.env.dev
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
# ============================================
|
||||||
|
# 会计应用环境变量配置 (开发环境)
|
||||||
|
# ============================================
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# 服务器配置
|
||||||
|
# ============================================
|
||||||
|
SERVER_PORT=2612
|
||||||
|
ENVIRONMENT=development
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# 数据目录
|
||||||
|
# ============================================
|
||||||
|
DATA_DIR=./data
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# MySQL 数据库配置(必填)
|
||||||
|
# ============================================
|
||||||
|
# 默认指向本地,如果需要连线上请修改IP
|
||||||
|
DB_HOST=127.0.0.1
|
||||||
|
DB_PORT=3306
|
||||||
|
DB_USER=root
|
||||||
|
DB_PASSWORD=root
|
||||||
|
DB_NAME=bookkeeping
|
||||||
|
# DB_ROOT_PASSWORD=
|
||||||
|
DB_CHARSET=utf8mb4
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# Redis 配置(可选,用于汇率缓存)
|
||||||
|
# ============================================
|
||||||
|
REDIS_ADDR=127.0.0.1:6379
|
||||||
|
REDIS_PASSWORD=
|
||||||
|
REDIS_DB=0
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# 汇率 API 配置(可选)
|
||||||
|
# ============================================
|
||||||
|
YUNAPI_URL=https://yunapi.cn/api/huilv
|
||||||
|
YUNAPI_KEY=
|
||||||
|
SYNC_INTERVAL=10m
|
||||||
|
CACHE_EXPIRATION=10m
|
||||||
|
MAX_RETRIES=3
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# JWT 配置(必填)
|
||||||
|
# ============================================
|
||||||
|
JWT_SECRET=dev_secret_key_123456
|
||||||
|
JWT_ACCESS_EXPIRY=15m
|
||||||
|
JWT_REFRESH_EXPIRY=168h
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# GitHub OAuth 配置(可选)
|
||||||
|
# ============================================
|
||||||
|
GITHUB_CLIENT_ID=Ov23liWppFX67560JfBf
|
||||||
|
GITHUB_CLIENT_SECRET=7e154e464dccd913a92cf580021f2a5dc51aac93
|
||||||
|
# 回调地址修改为本地
|
||||||
|
GITHUB_REDIRECT_URL=http://localhost:2612/api/v1/auth/github/callback
|
||||||
|
# 前端地址修改为本地 Vite 端口
|
||||||
|
FRONTEND_URL=http://localhost:5173
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# 网络配置
|
||||||
|
# ============================================
|
||||||
|
# HTTP/HTTPS 代理配置(如果服务器无法直接访问 GitHub API,请配置此项)
|
||||||
|
# 格式: http://127.0.0.1:7890
|
||||||
|
HTTPS_PROXY=
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# AI 配置(语音记账功能)
|
||||||
|
# ============================================
|
||||||
|
# OpenAI API Key(必填,用于语音转文字和智能解析)
|
||||||
|
OPENAI_API_KEY=sk-dlyjklqnwlcotkwudszeoedjddkdbarohetcmbheytsbklzu
|
||||||
|
|
||||||
|
# OpenAI API 基础URL(可选,默认为官方API,可改为兼容API如 Azure OpenAI)
|
||||||
|
OPENAI_BASE_URL=https://api.siliconflow.cn/v1
|
||||||
|
|
||||||
|
# Whisper 语音识别模型(可选,默认 whisper-1)
|
||||||
|
WHISPER_MODEL=FunAudioLLM/SenseVoiceSmall
|
||||||
|
|
||||||
|
# 聊天模型(可选,默认 gpt-3.5-turbo,可改为 gpt-4 等)
|
||||||
|
CHAT_MODEL=Qwen/Qwen3-8B
|
||||||
|
|
||||||
|
# 识图模型
|
||||||
|
OCR_MODEL=deepseek-ai/DeepSeek-OCR
|
||||||
|
|
||||||
|
# AI 会话超时时间
|
||||||
|
AI_SESSION_TIMEOUT=30m
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# 图片上传配置
|
||||||
|
# ============================================
|
||||||
|
IMAGE_UPLOAD_DIR=./uploads/images
|
||||||
|
MAX_IMAGE_SIZE=10485760
|
||||||
|
ALLOWED_IMAGE_TYPES=image/jpeg,image/png,image/heic
|
||||||
|
MAX_IMAGES_PER_TX=9
|
||||||
93
.env.prod
Normal file
93
.env.prod
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
# ============================================
|
||||||
|
# 会计应用环境变量配置 (生产环境)
|
||||||
|
# ============================================
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# 服务器配置
|
||||||
|
# ============================================
|
||||||
|
SERVER_PORT=2612
|
||||||
|
ENVIRONMENT=production
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# 数据目录
|
||||||
|
# ============================================
|
||||||
|
DATA_DIR=./data
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# MySQL 数据库配置(必填)
|
||||||
|
# ============================================
|
||||||
|
# MySQL 数据库配置
|
||||||
|
DB_HOST=124.221.157.197
|
||||||
|
DB_PORT=3306
|
||||||
|
DB_USER=bookkeeping
|
||||||
|
DB_PASSWORD=bookkeeping
|
||||||
|
DB_NAME=bookkeeping
|
||||||
|
DB_ROOT_PASSWORD=lihuaLIHUA
|
||||||
|
DB_CHARSET=utf8mb4
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# Redis 配置(可选,用于汇率缓存)
|
||||||
|
# ============================================
|
||||||
|
REDIS_ADDR=124.221.157.197:6379
|
||||||
|
REDIS_PASSWORD=lihua0101LIHUA
|
||||||
|
REDIS_DB=0
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# 汇率 API 配置(可选)
|
||||||
|
# ============================================
|
||||||
|
YUNAPI_URL=https://yunapi.cn/api/huilv
|
||||||
|
YUNAPI_KEY=
|
||||||
|
SYNC_INTERVAL=10m
|
||||||
|
CACHE_EXPIRATION=10m
|
||||||
|
MAX_RETRIES=3
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# JWT 配置(必填,生产环境请修改)
|
||||||
|
# ============================================
|
||||||
|
JWT_SECRET=
|
||||||
|
JWT_ACCESS_EXPIRY=15m
|
||||||
|
JWT_REFRESH_EXPIRY=168h
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# GitHub OAuth 配置(可选)
|
||||||
|
# ============================================
|
||||||
|
GITHUB_CLIENT_ID=Ov23liWppFX67560JfBf
|
||||||
|
GITHUB_CLIENT_SECRET=7e154e464dccd913a92cf580021f2a5dc51aac93
|
||||||
|
GITHUB_REDIRECT_URL=https://bk.swalktech.top/api/v1/auth/github/callback
|
||||||
|
FRONTEND_URL=https://bk.swalktech.top
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# 网络配置
|
||||||
|
# ============================================
|
||||||
|
# HTTP/HTTPS 代理配置(如果服务器无法直接访问 GitHub API,请配置此项)
|
||||||
|
# 格式: http://127.0.0.1:7890
|
||||||
|
HTTPS_PROXY=
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# AI 配置(语音记账功能)
|
||||||
|
# ============================================
|
||||||
|
# OpenAI API Key(必填,用于语音转文字和智能解析)
|
||||||
|
OPENAI_API_KEY=sk-dlyjklqnwlcotkwudszeoedjddkdbarohetcmbheytsbklzu
|
||||||
|
|
||||||
|
# OpenAI API 基础URL(可选,默认为官方API,可改为兼容API如 Azure OpenAI)
|
||||||
|
OPENAI_BASE_URL=https://api.siliconflow.cn/v1
|
||||||
|
|
||||||
|
# Whisper 语音识别模型(可选,默认 whisper-1)
|
||||||
|
WHISPER_MODEL=FunAudioLLM/SenseVoiceSmall
|
||||||
|
|
||||||
|
# 聊天模型(可选,默认 gpt-3.5-turbo,可改为 gpt-4 等)
|
||||||
|
CHAT_MODEL=Qwen/Qwen3-8B
|
||||||
|
|
||||||
|
# 识图模型
|
||||||
|
OCR_MODEL=deepseek-ai/DeepSeek-OCR
|
||||||
|
|
||||||
|
# AI 会话超时时间
|
||||||
|
AI_SESSION_TIMEOUT=30m
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# 图片上传配置
|
||||||
|
# ============================================
|
||||||
|
IMAGE_UPLOAD_DIR=./uploads/images
|
||||||
|
MAX_IMAGE_SIZE=10485760
|
||||||
|
ALLOWED_IMAGE_TYPES=image/jpeg,image/png,image/heic
|
||||||
|
MAX_IMAGES_PER_TX=9
|
||||||
@@ -20,19 +20,37 @@ import (
|
|||||||
func main() {
|
func main() {
|
||||||
// Load .env file from project root (try multiple locations)
|
// Load .env file from project root (try multiple locations)
|
||||||
envPaths := []string{
|
envPaths := []string{
|
||||||
".env", // Current directory
|
".env", // Current directory
|
||||||
"../.env", // Parent directory (when running from backend/)
|
"../.env", // Parent directory (when running from backend/)
|
||||||
"../../.env", // Two levels up (when running from backend/cmd/server/)
|
"../../.env", // Two levels up (when running from backend/cmd/server/)
|
||||||
filepath.Join("..", "..", ".env"), // Explicit path
|
filepath.Join("..", "..", ".env"), // Explicit path
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var envDir string
|
||||||
for _, envPath := range envPaths {
|
for _, envPath := range envPaths {
|
||||||
if err := godotenv.Load(envPath); err == nil {
|
if err := godotenv.Load(envPath); err == nil {
|
||||||
log.Printf("Loaded environment from: %s", envPath)
|
log.Printf("Loaded base environment from: %s", envPath)
|
||||||
|
envDir = filepath.Dir(envPath)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Load specific environment file if APP_ENV is set (e.g. .env.dev, .env.prod)
|
||||||
|
// This allows switching environments by just changing APP_ENV in .env
|
||||||
|
if appEnv := os.Getenv("APP_ENV"); appEnv != "" {
|
||||||
|
targetEnvFile := ".env." + appEnv
|
||||||
|
targetEnvPath := targetEnvFile
|
||||||
|
if envDir != "" && envDir != "." {
|
||||||
|
targetEnvPath = filepath.Join(envDir, targetEnvFile)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := godotenv.Overload(targetEnvPath); err == nil {
|
||||||
|
log.Printf("Loaded specific environment config from: %s", targetEnvPath)
|
||||||
|
} else {
|
||||||
|
log.Printf("Note: Specific environment file %s not found or could not be loaded", targetEnvPath)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Load configuration
|
// Load configuration
|
||||||
cfg := config.Load()
|
cfg := config.Load()
|
||||||
|
|
||||||
|
|||||||
20
switch_env.ps1
Normal file
20
switch_env.ps1
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
param (
|
||||||
|
[string]$env = "dev"
|
||||||
|
)
|
||||||
|
|
||||||
|
$source = ".env.$env"
|
||||||
|
$dest = ".env"
|
||||||
|
|
||||||
|
if (Test-Path $source) {
|
||||||
|
Copy-Item -Path $source -Destination $dest -Force
|
||||||
|
Write-Host "Success: Switched to $env environment ($source -> $dest)"
|
||||||
|
|
||||||
|
# Simple check to see if environment content matches
|
||||||
|
$content = Get-Content $dest -TotalCount 10
|
||||||
|
Write-Host "Current Config Preview:"
|
||||||
|
$content | Select-String "ENVIRONMENT"
|
||||||
|
$content | Select-String "DB_HOST"
|
||||||
|
} else {
|
||||||
|
Write-Error "Error: Source file $source does not exist."
|
||||||
|
Write-Host "Usage: ./switch_env.ps1 [dev|prod]"
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user