fix(build): add -tags embed to ensure frontend is embedded

- Add -tags=embed flag to GoReleaser builds
- Add -tags embed flag to Dockerfile builds
- Fix Dockerfile COPY order to prevent frontend dist being overwritten
- Update README build instructions with embed tag explanation
This commit is contained in:
shaw
2025-12-20 19:13:26 +08:00
parent b2273ec695
commit e6add93ae3
4 changed files with 24 additions and 21 deletions

View File

@@ -11,6 +11,8 @@ builds:
dir: backend dir: backend
main: ./cmd/server main: ./cmd/server
binary: sub2api binary: sub2api
flags:
- -tags=embed
env: env:
- CGO_ENABLED=0 - CGO_ENABLED=0
goos: goos:

View File

@@ -40,14 +40,15 @@ WORKDIR /app/backend
COPY backend/go.mod backend/go.sum ./ COPY backend/go.mod backend/go.sum ./
RUN go mod download RUN go mod download
# Copy frontend dist from previous stage # Copy backend source first
COPY --from=frontend-builder /app/frontend/../backend/internal/web/dist ./internal/web/dist
# Copy backend source
COPY backend/ ./ COPY backend/ ./
# Build the binary (BuildType=release for CI builds) # Copy frontend dist from previous stage (must be after backend copy to avoid being overwritten)
COPY --from=frontend-builder /app/backend/internal/web/dist ./internal/web/dist
# Build the binary (BuildType=release for CI builds, embed frontend)
RUN CGO_ENABLED=0 GOOS=linux go build \ RUN CGO_ENABLED=0 GOOS=linux go build \
-tags embed \
-ldflags="-s -w -X main.Commit=${COMMIT} -X main.Date=${DATE:-$(date -u +%Y-%m-%dT%H:%M:%SZ)} -X main.BuildType=release" \ -ldflags="-s -w -X main.Commit=${COMMIT} -X main.Date=${DATE:-$(date -u +%Y-%m-%dT%H:%M:%SZ)} -X main.BuildType=release" \
-o /app/sub2api \ -o /app/sub2api \
./cmd/server ./cmd/server

View File

@@ -220,21 +220,21 @@ cd sub2api
cd frontend cd frontend
npm install npm install
npm run build npm run build
# Output will be in ../backend/internal/web/dist/
# 3. Copy frontend build to backend (for embedding) # 3. Build backend with embedded frontend
cp -r dist ../backend/internal/web/
# 4. Build backend (requires frontend dist to be present)
cd ../backend cd ../backend
go build -o sub2api ./cmd/server go build -tags embed -o sub2api ./cmd/server
# 5. Create configuration file # 4. Create configuration file
cp ../deploy/config.example.yaml ./config.yaml cp ../deploy/config.example.yaml ./config.yaml
# 6. Edit configuration # 5. Edit configuration
nano config.yaml nano config.yaml
``` ```
> **Note:** The `-tags embed` flag embeds the frontend into the binary. Without this flag, the binary will not serve the frontend UI.
**Key configuration in `config.yaml`:** **Key configuration in `config.yaml`:**
```yaml ```yaml
@@ -265,7 +265,7 @@ default:
``` ```
```bash ```bash
# 7. Run the application # 6. Run the application
./sub2api ./sub2api
``` ```

View File

@@ -220,21 +220,21 @@ cd sub2api
cd frontend cd frontend
npm install npm install
npm run build npm run build
# 构建产物输出到 ../backend/internal/web/dist/
# 3. 复制前端构建产物到后端(用于嵌入 # 3. 编译后端(嵌入前端
cp -r dist ../backend/internal/web/
# 4. 编译后端(需要前端 dist 目录存在)
cd ../backend cd ../backend
go build -o sub2api ./cmd/server go build -tags embed -o sub2api ./cmd/server
# 5. 创建配置文件 # 4. 创建配置文件
cp ../deploy/config.example.yaml ./config.yaml cp ../deploy/config.example.yaml ./config.yaml
# 6. 编辑配置 # 5. 编辑配置
nano config.yaml nano config.yaml
``` ```
> **注意:** `-tags embed` 参数会将前端嵌入到二进制文件中。不使用此参数编译的程序将不包含前端界面。
**`config.yaml` 关键配置:** **`config.yaml` 关键配置:**
```yaml ```yaml
@@ -265,7 +265,7 @@ default:
``` ```
```bash ```bash
# 7. 运行应用 # 6. 运行应用
./sub2api ./sub2api
``` ```