From 4f1da3675bc3454b61bcf0706cd69b6b83591c78 Mon Sep 17 00:00:00 2001 From: eafonyang Date: Mon, 13 Jul 2026 14:16:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93+redis+meilisearch+s?= =?UTF-8?q?3+EQURL=20=E9=85=8D=E7=BD=AE=E5=85=A8=E9=83=A8=E8=B5=B0?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E5=8F=98=E9=87=8F=EF=BC=8C=E4=B8=8D=E5=9C=A8?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=B1=82=E7=A1=AC=E7=BC=96=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 51 +++++++++++++++++++++------------- .env.production.example | 19 ------------- docker-compose.yml | 15 ++-------- internal/config/config.go | 48 ++++++++++++++++---------------- internal/config/database.go | 41 +++------------------------ internal/config/equalize.go | 28 +++---------------- internal/config/meilisearch.go | 28 ++++--------------- internal/config/redis.go | 34 +++-------------------- internal/config/s3.go | 31 ++++----------------- 9 files changed, 80 insertions(+), 215 deletions(-) delete mode 100644 .env.production.example diff --git a/.env.example b/.env.example index 7b09eb8..8095c95 100644 --- a/.env.example +++ b/.env.example @@ -1,35 +1,46 @@ # Server -APP_ENV=development +APP_ENV=production APP_HOST=0.0.0.0 APP_PORT=8080 # Gin mode: debug | release | test -GIN_MODE=debug +GIN_MODE=release -# Database (development reads from env, default host 192.168.9.127) -DATABASE_HOST=192.168.9.127 +# Database +DATABASE_HOST=database-1.chmuueamo72p.eu-central-1.rds.amazonaws.com DATABASE_PORT=3306 DATABASE_NAME=audio DATABASE_USER=root -DATABASE_PASSWORD=root123 +DATABASE_PASSWORD="young9#!UJsD219921031" -# Meilisearch (development defaults apply when APP_ENV=development and vars are unset) -# MEILISEARCH_HOST=http://ec2-18-184-205-87.eu-central-1.compute.amazonaws.com:7700 -# MEILISEARCH_API_KEY=your-api-key -# MEILISEARCH_INDEX=models +# Meilisearch +MEILISEARCH_HOST=http://ip-172-31-13-240.eu-central-1.compute.internal:7700 +MEILISEARCH_API_KEY="young9#!UJsD219921031" +MEILISEARCH_INDEX=models -# Redis (development reads from env, default host 192.168.9.127) -REDIS_HOST=192.168.9.127 +# Redis +REDIS_HOST=172.31.13.240 REDIS_PORT=6379 -REDIS_PASSWORD= +REDIS_PASSWORD=eafon123! REDIS_DATABASE=1 -# Share code TTL (bare number = minutes; suffix: m/h/d), e.g. 30, 30m, 24h, 30d -SHARE_CODE_TTL_MIN=30 -# SHARE_CODE_MAX_PER_MAC=1 +# Equalize API +EQ_API_URL=http://172.31.18.70:8000/equalize +EQ_EXTERNAL_API_URL=https://autoeq.app/equalize -# S3 (local development only; production uses EC2 IAM role) -# AWS_REGION=eu-central-1 -# S3_BUCKET=luxsin-app-bucket -# AWS_ACCESS_KEY_ID=your-access-key-id -# AWS_SECRET_ACCESS_KEY=your-secret-access-key +# Share code TTL (bare number = minutes; suffix: m/h/d), e.g. 30, 30m, 24h, 30d +#一个用户在有效期内至多可以创建多少个分享码 +SHARE_CODE_MAX_PER_MAC=10 +#分享码有效期 +SHARE_CODE_TTL_MIN=30d + + +# S3 (生产环境使用 EC2 IAM role 时,可不设置 AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY) +AWS_REGION=eu-central-1 +S3_BUCKET=luxsin-app-bucket +AWS_ACCESS_KEY_ID=AKIAVMFK45I6P3TNI3VJ +AWS_SECRET_ACCESS_KEY=mFZIrtcZzVvAWrsbLAb2bs8jIpmPncVI3VmP9b3g + +# Persist tasks +ENABLE_PERSIST_TASK=false +ENABLE_IMPEDANCE_PERSIST_TASK=false diff --git a/.env.production.example b/.env.production.example deleted file mode 100644 index b7cf860..0000000 --- a/.env.production.example +++ /dev/null @@ -1,19 +0,0 @@ -APP_ENV=production -APP_HOST=0.0.0.0 -APP_PORT=8080 -GIN_MODE=release - -# Production uses built-in RDS host when DATABASE_HOST is unset. -# Password must be set via environment variable (never commit real password). -# jdbc:mysql://database-1.chmuueamo72p.eu-central-1.rds.amazonaws.com:3306/audio?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai -# young9#!UJsD219921031 -# root - -DATABASE_PASSWORD=your-production-password - -# S3 (uses EC2 IAM role; do not set access keys in production) -AWS_REGION=eu-central-1 -S3_BUCKET=luxsin-app-bucket - -# Share code TTL (bare number = minutes; suffix: m/h/d), e.g. 30, 30m, 24h, 30d -SHARE_CODE_TTL_MIN=30 diff --git a/docker-compose.yml b/docker-compose.yml index b241f3c..ca7839c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,19 +7,8 @@ services: restart: always ports: - "8084:8080" - environment: - - APP_ENV=production - - APP_HOST=0.0.0.0 - - APP_PORT=8080 - - DATABASE_PASSWORD=${DATABASE_PASSWORD} - - REDIS_PASSWORD=${REDIS_PASSWORD:-eafon123!} - - MEILISEARCH_API_KEY=${MEILISEARCH_API_KEY:-young9#!UJsD219921031} - - ENABLE_PERSIST_TASK=false - - ENABLE_IMPEDANCE_PERSIST_TASK=false - - AWS_REGION=eu-central-1 - - S3_BUCKET=luxsin-app-bucket - - SHARE_CODE_MAX_PER_MAC=${SHARE_CODE_MAX_PER_MAC:-1} - - SHARE_CODE_TTL_MIN=${SHARE_CODE_TTL_MIN:-30} + env_file: + - .env healthcheck: test: ["CMD", "wget", "-q", "-O", "/dev/null", "http://localhost:8080/api/v1/health"] interval: 30s diff --git a/internal/config/config.go b/internal/config/config.go index cc96256..648619b 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -8,18 +8,18 @@ import ( ) type Config struct { - Env string - Host string - Port int - Database DatabaseConfig - Meilisearch MeilisearchConfig - Redis RedisConfig - Equalize EqualizeConfig - S3 S3Config + Env string + Host string + Port int + Database DatabaseConfig + Meilisearch MeilisearchConfig + Redis RedisConfig + Equalize EqualizeConfig + S3 S3Config EnablePersistTask bool EnableImpedancePersistTask bool ShareCodeMaxPerMac int - ShareCodeTTL time.Duration + ShareCodeTTL time.Duration } func Load() (*Config, error) { @@ -30,26 +30,26 @@ func Load() (*Config, error) { env := getEnv("APP_ENV", "development") - db, err := loadDatabase(env) + db, err := loadDatabase() if err != nil { return nil, err } - if err := db.validate(env); err != nil { + if err := db.validate(); err != nil { return nil, err } - ms := loadMeilisearch(env) + ms := loadMeilisearch() if err := ms.validate(); err != nil { return nil, err } - rd := loadRedis(env) + rd := loadRedis() if err := rd.validate(); err != nil { return nil, err } - eq := loadEqualize(env) - s3cfg := loadS3(env) + eq := loadEqualize() + s3cfg := loadS3() shareCodeTTL, err := parseShareCodeTTL(getEnv("SHARE_CODE_TTL_MIN", "30")) if err != nil { @@ -57,18 +57,18 @@ func Load() (*Config, error) { } return &Config{ - Env: env, - Host: getEnv("APP_HOST", "0.0.0.0"), - Port: port, - Database: db, - Meilisearch: ms, - Redis: rd, - Equalize: eq, - S3: s3cfg, + Env: env, + Host: getEnv("APP_HOST", "0.0.0.0"), + Port: port, + Database: db, + Meilisearch: ms, + Redis: rd, + Equalize: eq, + S3: s3cfg, EnablePersistTask: getEnv("ENABLE_PERSIST_TASK", "false") == "true", EnableImpedancePersistTask: getEnv("ENABLE_IMPEDANCE_PERSIST_TASK", "false") == "true", ShareCodeMaxPerMac: getEnvInt("SHARE_CODE_MAX_PER_MAC", 1), - ShareCodeTTL: shareCodeTTL, + ShareCodeTTL: shareCodeTTL, }, nil } diff --git a/internal/config/database.go b/internal/config/database.go index eebaa95..7b2f80b 100644 --- a/internal/config/database.go +++ b/internal/config/database.go @@ -2,7 +2,6 @@ package config import ( "fmt" - "os" "strconv" ) @@ -14,50 +13,21 @@ type DatabaseConfig struct { Password string } -func loadDatabase(env string) (DatabaseConfig, error) { - switch env { - case "production": - if os.Getenv("DATABASE_HOST") != "" { - return databaseFromEnv() - } - return DatabaseConfig{ - Host: "database-1.chmuueamo72p.eu-central-1.rds.amazonaws.com", - Port: 3306, - Name: "audio", - User: "root", - Password: os.Getenv("DATABASE_PASSWORD"), - }, nil - default: - port, err := strconv.Atoi(getEnv("DATABASE_PORT", "3306")) - if err != nil { - return DatabaseConfig{}, fmt.Errorf("invalid DATABASE_PORT: %w", err) - } - return DatabaseConfig{ - Host: getEnv("DATABASE_HOST", "192.168.9.127"), - Port: port, - Name: getEnv("DATABASE_NAME", "audio"), - User: getEnv("DATABASE_USER", "root"), - Password: getEnv("DATABASE_PASSWORD", "root123"), - }, nil - } -} - -func databaseFromEnv() (DatabaseConfig, error) { +func loadDatabase() (DatabaseConfig, error) { port, err := strconv.Atoi(getEnv("DATABASE_PORT", "3306")) if err != nil { return DatabaseConfig{}, fmt.Errorf("invalid DATABASE_PORT: %w", err) } - return DatabaseConfig{ - Host: os.Getenv("DATABASE_HOST"), + Host: getEnv("DATABASE_HOST", ""), Port: port, Name: getEnv("DATABASE_NAME", "audio"), User: getEnv("DATABASE_USER", "root"), - Password: os.Getenv("DATABASE_PASSWORD"), + Password: getEnv("DATABASE_PASSWORD", ""), }, nil } -func (d DatabaseConfig) validate(env string) error { +func (d DatabaseConfig) validate() error { if d.Host == "" { return fmt.Errorf("database host is required") } @@ -67,8 +37,5 @@ func (d DatabaseConfig) validate(env string) error { if d.User == "" { return fmt.Errorf("database user is required") } - if env == "production" && d.Password == "" { - return fmt.Errorf("DATABASE_PASSWORD is required in production") - } return nil } diff --git a/internal/config/equalize.go b/internal/config/equalize.go index d5b8922..922ad59 100644 --- a/internal/config/equalize.go +++ b/internal/config/equalize.go @@ -1,33 +1,13 @@ package config -import "os" - -const defaultExternalEQAPIURL = "https://autoeq.app/equalize" - type EqualizeConfig struct { APIURL string // 内网 EQ 接口(正式环境 Eafonyoung 源使用) ExternalAPIURL string // 公网 EQ 接口(正式环境非 Eafonyoung 源使用) } -func loadEqualize(env string) EqualizeConfig { - external := getEnv("EQ_EXTERNAL_API_URL", defaultExternalEQAPIURL) - if os.Getenv("EQ_API_URL") != "" { - return EqualizeConfig{ - APIURL: os.Getenv("EQ_API_URL"), - ExternalAPIURL: external, - } - } - - switch env { - case "production": - return EqualizeConfig{ - APIURL: "http://172.31.18.70:8000/equalize", - ExternalAPIURL: external, - } - default: - return EqualizeConfig{ - APIURL: defaultExternalEQAPIURL, - ExternalAPIURL: external, - } +func loadEqualize() EqualizeConfig { + return EqualizeConfig{ + APIURL: getEnv("EQ_API_URL", ""), + ExternalAPIURL: getEnv("EQ_EXTERNAL_API_URL", "https://autoeq.app/equalize"), } } diff --git a/internal/config/meilisearch.go b/internal/config/meilisearch.go index e495945..0c4b705 100644 --- a/internal/config/meilisearch.go +++ b/internal/config/meilisearch.go @@ -2,7 +2,6 @@ package config import ( "fmt" - "os" ) type MeilisearchConfig struct { @@ -11,28 +10,11 @@ type MeilisearchConfig struct { Index string } -func loadMeilisearch(env string) MeilisearchConfig { - if os.Getenv("MEILISEARCH_HOST") != "" { - return MeilisearchConfig{ - Host: os.Getenv("MEILISEARCH_HOST"), - APIKey: os.Getenv("MEILISEARCH_API_KEY"), - Index: getEnv("MEILISEARCH_INDEX", "models"), - } - } - - switch env { - case "production": - return MeilisearchConfig{ - Host: "http://ip-172-31-22-170.eu-central-1.compute.internal:7700", - APIKey: getEnv("MEILISEARCH_API_KEY", "young9#!UJsD219921031"), - Index: "models", - } - default: - return MeilisearchConfig{ - Host: "http://ec2-18-184-205-87.eu-central-1.compute.amazonaws.com:7700", - APIKey: getEnv("MEILISEARCH_API_KEY", "young9#!UJsD219921031"), - Index: "models", - } +func loadMeilisearch() MeilisearchConfig { + return MeilisearchConfig{ + Host: getEnv("MEILISEARCH_HOST", ""), + APIKey: getEnv("MEILISEARCH_API_KEY", ""), + Index: getEnv("MEILISEARCH_INDEX", "models"), } } diff --git a/internal/config/redis.go b/internal/config/redis.go index 8f969b0..0f4b3ae 100644 --- a/internal/config/redis.go +++ b/internal/config/redis.go @@ -2,7 +2,6 @@ package config import ( "fmt" - "os" "strconv" ) @@ -13,38 +12,13 @@ type RedisConfig struct { Database int } -func loadRedis(env string) RedisConfig { - switch env { - case "production": - if os.Getenv("REDIS_HOST") != "" { - return redisFromEnv("16279") - } - return RedisConfig{ - Host: "172.31.38.162", - Port: 16279, - Password: getEnv("REDIS_PASSWORD", "eafon123!"), - Database: 1, - } - default: - port, _ := strconv.Atoi(getEnv("REDIS_PORT", "6379")) - db, _ := strconv.Atoi(getEnv("REDIS_DATABASE", "1")) - return RedisConfig{ - Host: getEnv("REDIS_HOST", "192.168.9.127"), - Port: port, - Password: getEnv("REDIS_PASSWORD", ""), - Database: db, - } - } -} - -func redisFromEnv(defaultPort string) RedisConfig { - port, _ := strconv.Atoi(getEnv("REDIS_PORT", defaultPort)) +func loadRedis() RedisConfig { + port, _ := strconv.Atoi(getEnv("REDIS_PORT", "6379")) db, _ := strconv.Atoi(getEnv("REDIS_DATABASE", "1")) - return RedisConfig{ - Host: os.Getenv("REDIS_HOST"), + Host: getEnv("REDIS_HOST", ""), Port: port, - Password: os.Getenv("REDIS_PASSWORD"), + Password: getEnv("REDIS_PASSWORD", ""), Database: db, } } diff --git a/internal/config/s3.go b/internal/config/s3.go index f226b33..892c336 100644 --- a/internal/config/s3.go +++ b/internal/config/s3.go @@ -1,7 +1,5 @@ package config -import "os" - type S3Config struct { Bucket string Region string @@ -9,28 +7,11 @@ type S3Config struct { SecretAccessKey string } -func loadS3(env string) S3Config { - if os.Getenv("AWS_ACCESS_KEY_ID") != "" || os.Getenv("AWS_SECRET_ACCESS_KEY") != "" { - return S3Config{ - Bucket: getEnv("S3_BUCKET", "luxsin-app-bucket"), - Region: getEnv("AWS_REGION", "eu-central-1"), - AccessKeyID: os.Getenv("AWS_ACCESS_KEY_ID"), - SecretAccessKey: os.Getenv("AWS_SECRET_ACCESS_KEY"), - } - } - - switch env { - case "production": - return S3Config{ - Bucket: getEnv("S3_BUCKET", "luxsin-app-bucket"), - Region: getEnv("AWS_REGION", "eu-central-1"), - } - default: - return S3Config{ - Bucket: getEnv("S3_BUCKET", "luxsin-app-bucket"), - Region: getEnv("AWS_REGION", "eu-central-1"), - AccessKeyID: "AKIAVMFK45I6P3TNI3VJ", - SecretAccessKey: "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", - } +func loadS3() S3Config { + return S3Config{ + Bucket: getEnv("S3_BUCKET", ""), + Region: getEnv("AWS_REGION", "eu-central-1"), + AccessKeyID: getEnv("AWS_ACCESS_KEY_ID", ""), + SecretAccessKey: getEnv("AWS_SECRET_ACCESS_KEY", ""), } }