فهرست منبع

feat(deploy): use htpasswd file for basic auth

- Replace env-based basic auth with htpasswd file
- Caddyfile: basicauth * htpasswd
- docker-compose.yml: mount htpasswd file
- .gitignore: add htpasswd
- .env.example: remove basic auth env vars
- API_AUTH.md: update docs for htpasswd file

Usage:
  docker run --rm httpd:alpine htpasswd -nbB admin password > htpasswd
  docker compose up -d
lushdog@outlook.com 1 ماه پیش
والد
کامیت
f91bf287f6
5فایلهای تغییر یافته به همراه47 افزوده شده و 41 حذف شده
  1. 3 4
      .env.example
  2. 3 0
      .gitignore
  3. 36 28
      API_AUTH.md
  4. 4 6
      Caddyfile
  5. 1 3
      docker-compose.yml

+ 3 - 4
.env.example

@@ -8,7 +8,6 @@ SOL_ENDPOINT=https://lb.drpc.live/solana/YOUR_API_KEY
 # Solana 私钥(用于签名交易,敏感信息,不要提交到 Git)
 SOL_SECRET_KEY=your_base58_encoded_secret_key
 
-# Basic Auth 配置(用于 HTTPS 访问保护)
-# 生成密码哈希命令:docker run --rm caddy:2-alpine caddy hash-password --plaintext 'your_password'
-BASIC_AUTH_USER=admin
-BASIC_AUTH_HASH=$2a$14$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+# Basic Auth 配置
+# 生成 htpasswd 文件命令:docker run --rm httpd:alpine htpasswd -nbB admin your_password > htpasswd
+# htpasswd 文件已添加到 .gitignore,不会被提交到 Git

+ 3 - 0
.gitignore

@@ -37,6 +37,9 @@ yarn-error.log*
 # vercel
 .vercel
 
+# htpasswd (basic auth password file)
+htpasswd
+
 # typescript
 *.tsbuildinfo
 next-env.d.ts

+ 36 - 28
API_AUTH.md

@@ -16,29 +16,29 @@
 
 ## 配置 Basic Auth
 
-### 1. 生成密码哈希
+### 1. 生成 htpasswd 文件
 
-Caddy 使用 bcrypt 哈希格式存储密码。使用以下命令生成:
+Caddy 使用 htpasswd 文件存储用户名和密码。使用以下命令生成:
 
 ```bash
-# 使用 Docker 生成密码哈希(推荐)
-docker run --rm caddy:2-alpine caddy hash-password --plaintext 'your_password'
+# 使用 Docker 生成 htpasswd 文件(推荐)
+docker run --rm httpd:alpine htpasswd -nbB admin your_password > htpasswd
 
-# 示例输出:
-# $2a$14$Z3Q7g2n8XQYuH9vJkLmNqOrStUvWxYzAbCdEfGhIjKlMnOpQrStUv
+# 示例输出(内容会写入 htpasswd 文件)
+# admin:$2y$05$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
 ```
 
-### 2. 配置环境变量
+**参数说明:**
 
-在服务器上的 `.env` 文件中添加:
+- `-n`:输出到标准输出而不是文件
+- `-b`:使用批处理模式(密码在命令行提供)
+- `-B`:使用 bcrypt 加密(Caddy 要求)
 
-```bash
-# Basic Auth 配置
-BASIC_AUTH_USER=admin
-BASIC_AUTH_HASH=$2a$14$Z3Q7g2n8XQYuH9vJkLmNqOrStUvWxYzAbCdEfGhIjKlMnOpQrStUv
-```
+### 2. 配置 htpasswd 文件
 
-**注意**:将 `BASIC_AUTH_HASH` 替换为你实际生成的哈希值。
+生成的 `htpasswd` 文件会自动被 Caddy 读取(已通过 docker-compose 挂载到容器中)。
+
+**注意**:`htpasswd` 文件已添加到 `.gitignore`,不会被提交到 Git。
 
 ---
 
@@ -255,7 +255,19 @@ services:
 
 ## 部署步骤
 
-### 1. 配置环境变量
+### 1. 生成 htpasswd 文件
+
+在服务器上执行:
+
+```bash
+# 生成 htpasswd 文件
+docker run --rm httpd:alpine htpasswd -nbB admin your_password > htpasswd
+
+# 查看生成的文件
+cat htpasswd
+```
+
+### 2. 配置环境变量
 
 在服务器上创建 `.env` 文件:
 
@@ -263,20 +275,16 @@ services:
 # Solana 配置
 SOL_ENDPOINT=your_solana_endpoint
 SOL_SECRET_KEY=your_secret_key
-
-# Basic Auth 配置
-BASIC_AUTH_USER=admin
-BASIC_AUTH_HASH=$2a$14$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
 ```
 
-### 2. 启动服务
+### 3. 启动服务
 
 ```bash
 docker compose down
 docker compose up -d
 ```
 
-### 3. 验证 HTTPS
+### 4. 验证 HTTPS
 
 访问 `https://love.hdlife.me`,应该会自动跳转到 HTTPS 并要求 Basic Auth。
 
@@ -285,7 +293,7 @@ docker compose up -d
 ## 安全最佳实践
 
 1. ✅ **使用环境变量**:永远不要在代码中硬编码密码
-2. ✅ **使用 `.gitignore`**:确保包含密码的 `.env` 文件不会被提交
+2. ✅ **使用 `.gitignore`**:确保 `htpasswd` 文件不会被提交
 3. ✅ **使用密钥管理服务**:生产环境推荐使用 AWS Secrets Manager、Azure Key Vault 等
 4. ✅ **定期轮换密码**:定期更换 Basic Auth 密码
 5. ✅ **使用 HTTPS**:Caddy 自动配置 HTTPS,无需额外操作
@@ -315,18 +323,17 @@ curl -u "${BYREAL_API_USERNAME}:${BYREAL_API_PASSWORD}" \
 
 ### Q: 如何获取 Basic Auth 凭证?
 
-A: 联系项目管理员获取用户名和密码。密码哈希存储在服务器的 `.env` 文件中。
+A: 联系项目管理员获取用户名和密码。密码存储在服务器的 `htpasswd` 文件中。
 
 ### Q: 密码忘记了怎么办?
 
-A: 在服务器上重新生成哈希并更新 `.env` 文件:
+A: 在服务器上重新生成 htpasswd 文件:
 
 ```bash
-# 生成新密码哈希
-docker run --rm caddy:2-alpine caddy hash-password --plaintext 'new_password'
+# 生成新密码
+docker run --rm httpd:alpine htpasswd -nbB admin new_password > htpasswd
 
-# 更新 .env 文件中的 BASIC_AUTH_HASH
-# 然后重启服务
+# 重启服务
 docker compose restart caddy
 ```
 
@@ -351,5 +358,6 @@ A: Caddy 会自动管理 Let's Encrypt 证书的续期,无需手动操作。
 ## 相关文件
 
 - `Caddyfile` - Caddy HTTPS + Basic Auth 配置
+- `htpasswd` - Basic Auth 密码文件(不提交到 Git)
 - `docker-compose.yml` - Docker 服务配置
 - `.env` - 环境变量配置(不提交到 Git)

+ 4 - 6
Caddyfile

@@ -1,10 +1,8 @@
 love.hdlife.me {
-	# Basic Auth - 用户名和密码从环境变量读取
-	# 密码必须是 bcrypt 格式,生成命令:
-	# docker run --rm caddy:2-alpine caddy hash-password --plaintext 'your_password'
-	basicauth * {
-		{$BASIC_AUTH_USER} {$BASIC_AUTH_HASH}
-	}
+	# Basic Auth - 使用 htpasswd 文件
+	# 生成命令(在服务器上执行):
+	# docker run --rm httpd:alpine htpasswd -nbB admin your_password > htpasswd
+	basicauth * htpasswd
 
 	# 反向代理到 byreal-table 服务
 	reverse_proxy byreal-table:3000

+ 1 - 3
docker-compose.yml

@@ -27,11 +27,9 @@ services:
       - '443:443'
     volumes:
       - ./Caddyfile:/etc/caddy/Caddyfile:ro
+      - ./htpasswd:/etc/caddy/htpasswd:ro
       - caddy_data:/data
       - caddy_config:/config
-    environment:
-      - BASIC_AUTH_USER=${BASIC_AUTH_USER:-admin}
-      - BASIC_AUTH_HASH=${BASIC_AUTH_HASH}
     networks:
       - byreal-network
     restart: unless-stopped