import { MidwayConfig } from "@midwayjs/core"; import { existsSync } from "fs"; import { join } from "path"; import { tmpdir } from "os"; import { config as loadEnv } from "dotenv"; // 加载项目根目录的环境变量文件: // 1) .env 基础配置(默认=生产,不覆盖系统环境变量) // 2) .env.{环境} 环境专属覆盖,如 .env.local(MIDWAY_SERVER_ENV=local 时生效) const envDir = join(__dirname, "../../"); loadEnv({ path: join(envDir, ".env") }); const currentEnv = process.env.MIDWAY_SERVER_ENV || process.env.NODE_ENV || "prod"; const envFile = join(envDir, `.env.${currentEnv}`); if (existsSync(envFile)) { loadEnv({ path: envFile, override: true }); } export default { keys: "smart-grid-iot-secret-key", koa: { port: 7001 }, // 日志输出目录(显式指定到项目内 server/logs,避免写入用户主目录导致 EPERM 权限报错) logger: { dir: join(envDir, "logs"), appLogName: "midway-app.log", coreLogName: "midway-core.log", errorLogName: "common-error.log", enableError: true, maxFiles: "30d" }, sequelize: { dataSource: { default: { dialect: "postgres", host: process.env.PG_HOST || "localhost", port: Number(process.env.PG_PORT) || 5432, database: process.env.PG_DATABASE || "xintong", username: process.env.PG_USERNAME || "postgres", password: process.env.PG_PASSWORD || "postgres", timezone: "+08:00", models: [join(__dirname, "../entity")], define: { timestamps: true, underscored: true, createdAt: "created_at", updatedAt: "updated_at" }, pool: { max: 10, min: 0, acquire: 30000, idle: 10000 } } }, sync: false }, redis: { client: { host: process.env.REDIS_HOST || "localhost", port: Number(process.env.REDIS_PORT) || 6379, password: process.env.REDIS_PASSWORD || "", db: 0 } }, jwt: { secret: "smart-grid-iot-admin-jwt-secret-key-2024", expiresIn: "2h", refreshExpiresIn: "7d" }, // multipart/form-data 解析配置(现场照片上传) upload: { mode: "file", fileSize: "10mb", whitelist: [".png", ".jpg", ".jpeg", ".webp", ".gif", ".bmp"], tmpdir: join(tmpdir(), "smart-grid-upload"), cleanTimeout: 5 * 60 * 1000 }, // RustFS 对象存储(S3 兼容协议、path-style 访问) rustfs: { endpoint: process.env.RUSTFS_ENDPOINT || "127.0.0.1", port: Number(process.env.RUSTFS_PORT) || 9000, useSSL: process.env.RUSTFS_USE_SSL === "true", accessKey: process.env.RUSTFS_ACCESS_KEY || "", secretKey: process.env.RUSTFS_SECRET_KEY || "", region: process.env.RUSTFS_REGION || "us-east-1", // 当前生效的桶(生产/测试通过 .env 与 .env.local 切换) bucket: process.env.RUSTFS_BUCKET || process.env.RUSTFS_BUCKET_PROD || "", bucketProd: process.env.RUSTFS_BUCKET_PROD || "", bucketTest: process.env.RUSTFS_BUCKET_TEST || "", // RustFS 仅支持 path-style 访问 forcePathStyle: true, // 预签名 URL 有效期(秒) presignExpires: 3600, // 上传对象 key 前缀 keyPrefix: "customer-visit" }, cors: { origin: "*", allowMethods: "GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS", exposeHeaders: "Content-Type,Authorization,X-Requested-With", credentials: true }, security: { csrf: { enable: false } } } as MidwayConfig;