From 713fc6ec1ec561786a0915a27049abc4df169fa6 Mon Sep 17 00:00:00 2001 From: ShukeBta <272197458+ShukeBta@users.noreply.github.com> Date: Mon, 15 Jun 2026 21:00:52 +0800 Subject: [PATCH] Harden Docker deployment tiers --- README.md | 10 ++++------ README_EN.md | 10 ++++------ cmd/server/main.go | 26 ++++++++++++++++++++++++++ docker-compose.search.yml | 1 - docker-compose.standard.yml | 1 - docker-compose.yml | 4 +--- 6 files changed, 35 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index dd590db..4761845 100644 --- a/README.md +++ b/README.md @@ -153,7 +153,7 @@ environment: ```bash docker compose pull docker compose up -d -docker logs -f mediastation-go +docker compose logs -f mediastation-go ``` 看到 `sqlite data migrated to postgres`,或确认网页里的用户、媒体库、设置都正常后,再处理旧 SQLite 文件。 @@ -278,7 +278,6 @@ services: # Docker Hub 备用: # image: shukbet/mediastationgo:latest - container_name: mediastation-go restart: unless-stopped init: true depends_on: @@ -330,7 +329,6 @@ services: postgres: image: postgres:16-alpine - container_name: mediastation-postgres restart: unless-stopped environment: POSTGRES_DB: mediastation @@ -339,7 +337,7 @@ services: volumes: - ./postgres:/var/lib/postgresql/data healthcheck: - test: ["CMD-SHELL", "pg_isready -U mediastation -d mediastation"] + test: ["CMD-SHELL", "pg_isready -h 127.0.0.1 -U mediastation -d mediastation"] interval: 10s timeout: 5s retries: 10 @@ -390,7 +388,7 @@ docker compose up -d ### 查看日志 ```bash -docker logs -f mediastation-go +docker compose logs -f mediastation-go ``` ### 备份 @@ -429,7 +427,7 @@ docker compose down ```bash docker ps -docker logs --tail=100 mediastation-go +docker compose logs --tail=100 mediastation-go ``` 确认浏览器访问的是: diff --git a/README_EN.md b/README_EN.md index d06f154..b327b09 100644 --- a/README_EN.md +++ b/README_EN.md @@ -153,7 +153,7 @@ Recommended SQLite to PostgreSQL upgrade flow: ```bash docker compose pull docker compose up -d -docker logs -f mediastation-go +docker compose logs -f mediastation-go ``` After you see `sqlite data migrated to postgres`, or after the web UI shows your users, libraries, and settings correctly, you can stop using the old SQLite file as a migration source. @@ -278,7 +278,6 @@ services: # Docker Hub backup: # image: shukbet/mediastationgo:latest - container_name: mediastation-go restart: unless-stopped init: true depends_on: @@ -331,7 +330,6 @@ services: postgres: image: postgres:16-alpine - container_name: mediastation-postgres restart: unless-stopped environment: POSTGRES_DB: mediastation @@ -340,7 +338,7 @@ services: volumes: - ./postgres:/var/lib/postgresql/data healthcheck: - test: ["CMD-SHELL", "pg_isready -U mediastation -d mediastation"] + test: ["CMD-SHELL", "pg_isready -h 127.0.0.1 -U mediastation -d mediastation"] interval: 10s timeout: 5s retries: 10 @@ -391,7 +389,7 @@ docker compose up -d ### Logs ```bash -docker logs -f mediastation-go +docker compose logs -f mediastation-go ``` ### Backup @@ -430,7 +428,7 @@ Check the container: ```bash docker ps -docker logs --tail=100 mediastation-go +docker compose logs --tail=100 mediastation-go ``` Then open: diff --git a/cmd/server/main.go b/cmd/server/main.go index 35412e2..b45a3c1 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -12,6 +12,7 @@ package main import ( "context" + "database/sql" "errors" "fmt" "net" @@ -69,6 +70,9 @@ func main() { if err != nil { logger.Fatal("database open failed", zap.Error(err)) } + if err := waitForDatabase(db, logger); err != nil { + logger.Fatal("database not ready", zap.Error(err)) + } if err := database.AutoMigrate(db); err != nil { logger.Fatal("auto-migrate failed", zap.Error(err)) } @@ -144,6 +148,28 @@ func applyCPUThreadLimit(cfg *config.Config, logger *zap.Logger) { } } +func waitForDatabase(db interface{ DB() (*sql.DB, error) }, logger *zap.Logger) error { + sqlDB, err := db.DB() + if err != nil { + return err + } + var lastErr error + for attempt := 1; attempt <= 30; attempt++ { + ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) + err = sqlDB.PingContext(ctx) + cancel() + if err == nil { + return nil + } + lastErr = err + if logger != nil { + logger.Warn("database not ready; retrying", zap.Int("attempt", attempt), zap.Error(err)) + } + time.Sleep(time.Duration(attempt) * 500 * time.Millisecond) + } + return lastErr +} + func buildRouter(cfg *config.Config, logger *zap.Logger, svc *service.Container) *gin.Engine { if !cfg.App.Debug { gin.SetMode(gin.ReleaseMode) diff --git a/docker-compose.search.yml b/docker-compose.search.yml index 4115b6f..898a19a 100644 --- a/docker-compose.search.yml +++ b/docker-compose.search.yml @@ -22,7 +22,6 @@ services: opensearch: image: opensearchproject/opensearch:2 - container_name: mediastation-opensearch restart: unless-stopped environment: discovery.type: single-node diff --git a/docker-compose.standard.yml b/docker-compose.standard.yml index 40bac01..d95508b 100644 --- a/docker-compose.standard.yml +++ b/docker-compose.standard.yml @@ -17,7 +17,6 @@ services: redis: image: redis:7-alpine - container_name: mediastation-redis restart: unless-stopped command: - redis-server diff --git a/docker-compose.yml b/docker-compose.yml index 9e3cceb..ab4b3a8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -22,7 +22,6 @@ services: # 方式二:Docker Hub 备用(GHCR 拉取慢或不可用时使用) # image: shukbet/mediastationgo:latest - container_name: mediastation-go restart: unless-stopped init: true depends_on: @@ -122,7 +121,6 @@ services: postgres: image: postgres:16-alpine - container_name: mediastation-postgres restart: unless-stopped environment: POSTGRES_DB: mediastation @@ -133,7 +131,7 @@ services: # PostgreSQL 主数据目录。升级/重建容器时必须保留。 - ./postgres:/var/lib/postgresql/data healthcheck: - test: ["CMD-SHELL", "pg_isready -U mediastation -d mediastation"] + test: ["CMD-SHELL", "pg_isready -h 127.0.0.1 -U mediastation -d mediastation"] interval: 10s timeout: 5s retries: 10