This commit is contained in:
awei
2025-03-08 17:21:51 +08:00
parent 9b10835b61
commit 4e51db4edd
13 changed files with 597 additions and 66 deletions

23
file-server/Dockerfile Normal file
View File

@@ -0,0 +1,23 @@
# 构建阶段
FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/golang:1.24 AS builder
WORKDIR /app
COPY . .
# 添加静态编译和优化参数
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build \
-ldflags="-w -s -extldflags '-static'" \
-o file-server
RUN ls -alh .
# 使用最小基础镜像
FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/alpine:latest
WORKDIR /app
# 复制二进制文件并设置权限
COPY --from=builder --chmod=0755 /app/file-server .
EXPOSE 8080
CMD ["./file-server"]

View File

@@ -0,0 +1,12 @@
version: '3.8'
services:
file-server:
build:
context: .
dockerfile: Dockerfile
ports:
- "3004:8080"
volumes:
- /data/bbsfiles:/files
restart: unless-stopped

3
file-server/go.mod Normal file
View File

@@ -0,0 +1,3 @@
module fileserver
go 1.23.4

62
file-server/main.go Normal file
View File

@@ -0,0 +1,62 @@
package main
import (
"fmt"
"log"
"net/http"
"os"
"path/filepath"
"strings"
)
func main() {
// 硬编码目录配置
dirs := map[string]string{
"/bbs": "/files/active/www/active", // 修改右侧路径
"/active": "/files/bbs/www/bbs", // 添加新条目
}
port := 8080 // 固定端口
mux := http.NewServeMux()
// 注册所有目录路由
for prefix, path := range dirs {
absPath, err := filepath.Abs(path)
if err != nil {
log.Fatalf("目录[%s]解析失败: %v", path, err)
}
if err := os.MkdirAll(absPath, 0755); err != nil {
log.Fatalf("创建目录[%s]失败: %v", absPath, err)
}
fileServer := secureFileServer(http.Dir(absPath))
mux.Handle(prefix+"/", http.StripPrefix(prefix, fileServer))
log.Printf("已挂载目录: %s => %s", prefix, absPath)
}
// 启动服务器
serverAddr := fmt.Sprintf(":%d", port)
log.Printf("文件服务器启动在 http://localhost%s", serverAddr)
if err := http.ListenAndServe(serverAddr, mux); err != nil {
log.Fatalf("服务器启动失败: %v", err)
}
}
// 安全检查中间件
func secureFileServer(root http.FileSystem) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if strings.Contains(r.URL.Path, "..") {
http.Error(w, "无效的路径", http.StatusBadRequest)
return
}
w.Header().Set("X-Content-Type-Options", "nosniff")
w.Header().Set("X-Frame-Options", "DENY")
w.Header().Set("X-XSS-Protection", "1; mode=block")
http.FileServer(root).ServeHTTP(w, r)
})
}