From 8bacb09cc27808b706a343d21d522e5bcb9e6ca5 Mon Sep 17 00:00:00 2001 From: hxuanyu <2252193204@qq.com> Date: Mon, 26 Jan 2026 23:45:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20Docker=20Compose=20?= =?UTF-8?q?=E6=94=AF=E6=8C=81=EF=BC=8C=E5=AE=8C=E5=96=84=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E5=8F=98=E9=87=8F=E7=BB=91=E5=AE=9A=E9=80=BB=E8=BE=91=EF=BC=8C?= =?UTF-8?q?=E5=8D=87=E7=BA=A7=20Go=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/release.yml | 2 +- .github/workflows/verify.yml | 2 +- Dockerfile | 2 +- README.md | 17 ++++++++++++++++- docker-compose.yml | 31 +++++++++++++++++++++++++++++++ internal/config/config.go | 6 ++++++ 6 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 docker-compose.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b45b47a..e3fdd4d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,7 +16,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: '1.23' + go-version: '1.25.5' - name: Build and Package run: | diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml index 20042ef..e9f4cb1 100644 --- a/.github/workflows/verify.yml +++ b/.github/workflows/verify.yml @@ -15,7 +15,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: '1.23' + go-version: '1.25.5' - name: Install dependencies run: go mod download diff --git a/Dockerfile b/Dockerfile index 3586de7..b1641be 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.23-alpine AS builder +FROM golang:1.25.5-alpine AS builder WORKDIR /app COPY go.mod go.sum ./ diff --git a/README.md b/README.md index 8123635..199fb88 100644 --- a/README.md +++ b/README.md @@ -97,11 +97,26 @@ go run . 2. 运行标签脚本:`./scripts/tag.sh v1.0.0` (替换为实际版本号)。 3. 脚本会自动推送标签,触发 GitHub Actions 进行构建并发布 Release。 -### Docker 构建 +### Docker 运行 ```bash docker build -t bing-paper . +docker run -d -p 8080:8080 -v $(pwd)/data:/app/data bing-paper ``` +### Docker Compose (推荐) +使用项目根目录下的 `docker-compose.yml` 快速启动: + +```bash +docker-compose up -d +``` + +你可以通过修改 `docker-compose.yml` 中的 `environment` 部分来覆盖默认配置,例如: +- `BINGPAPER_SERVER_PORT`: 服务端口 +- `BINGPAPER_API_MODE`: API 模式 (`local` 或 `redirect`) +- `BINGPAPER_DB_TYPE`: 数据库类型 (`sqlite`, `mysql`, `postgres`) +- `BINGPAPER_STORAGE_TYPE`: 存储类型 (`local`, `s3`, `webdav`) +- `BINGPAPER_ADMIN_PASSWORD_BCRYPT`: 管理员密码的 Bcrypt 哈希值 + ## 许可证 MIT diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..bca6e72 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,31 @@ +services: + bingpaper: + build: . + container_name: bingpaper + restart: always + ports: + - "8080:8080" + volumes: + - ./data:/app/data + environment: + - BINGPAPER_SERVER_PORT=8080 + - BINGPAPER_LOG_LEVEL=info + - BINGPAPER_API_MODE=local + - BINGPAPER_CRON_ENABLED=true + - BINGPAPER_DB_TYPE=sqlite + - BINGPAPER_DB_DSN=data/bing_paper.db + - BINGPAPER_STORAGE_TYPE=local + - BINGPAPER_STORAGE_LOCAL_ROOT=data/picture + - BINGPAPER_RETENTION_DAYS=30 + # S3 配置 (可选) + # - BINGPAPER_STORAGE_S3_ENDPOINT= + # - BINGPAPER_STORAGE_S3_REGION= + # - BINGPAPER_STORAGE_S3_BUCKET= + # - BINGPAPER_STORAGE_S3_ACCESS_KEY= + # - BINGPAPER_STORAGE_S3_SECRET_KEY= + # - BINGPAPER_STORAGE_S3_PUBLIC_URL_PREFIX= + # WebDAV 配置 (可选) + # - BINGPAPER_STORAGE_WEBDAV_URL= + # - BINGPAPER_STORAGE_WEBDAV_USERNAME= + # - BINGPAPER_STORAGE_WEBDAV_PASSWORD= + # - BINGPAPER_STORAGE_WEBDAV_PUBLIC_URL_PREFIX= diff --git a/internal/config/config.go b/internal/config/config.go index 86ce166..5ce446a 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -3,6 +3,7 @@ package config import ( "fmt" "os" + "strings" "sync" "time" @@ -134,6 +135,11 @@ func Init(configPath string) error { v.SetDefault("web.path", "web") v.SetDefault("admin.password_bcrypt", "$2a$10$fYHPeWHmwObephJvtlyH1O8DIgaLk5TINbi9BOezo2M8cSjmJchka") // 默认密码: admin123 + // 绑定环境变量 + v.SetEnvPrefix("BINGPAPER") + v.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) + v.AutomaticEnv() + if err := v.ReadInConfig(); err != nil { // 如果指定了配置文件但读取失败(且不是找不到文件的错误),或者没指定但也没找到 _, isNotFound := err.(viper.ConfigFileNotFoundError)