更改本地dev常见端口

This commit is contained in:
yml2213
2026-07-25 16:31:42 +08:00
parent dabf147019
commit 3461c02560
7 changed files with 66 additions and 33 deletions
+4 -4
View File
@@ -18,9 +18,9 @@
脚本会自动启动 MySQL、Redis、MinIO,首次初始化数据库结构,并同时启动后端和前端。 脚本会自动启动 MySQL、Redis、MinIO,首次初始化数据库结构,并同时启动后端和前端。
前端地址:`http://localhost:5173` 前端地址:`http://localhost:5189`
后台地址默认:`http://localhost:5173/admin/login`。可通过 `VITE_ADMIN_BASE_PATH` 调整后台页面入口。 后台地址默认:`http://localhost:5189/admin/login`。可通过 `VITE_ADMIN_BASE_PATH` 调整后台页面入口。
如需拆分调试,可手动执行: 如需拆分调试,可手动执行:
@@ -31,7 +31,7 @@ cd backend
cp .env.example .env cp .env.example .env
go run github.com/pressly/goose/v3/cmd/goose@v3.27.1 \ go run github.com/pressly/goose/v3/cmd/goose@v3.27.1 \
-dir migrations \ -dir migrations \
mysql 'hfb:secret@tcp(127.0.0.1:3306)/hfb_sys?charset=utf8mb4&parseTime=True&loc=Local&multiStatements=true' \ mysql 'hfb:secret@tcp(127.0.0.1:13306)/hfb_sys?charset=utf8mb4&parseTime=True&loc=Local&multiStatements=true' \
up up
go run ./cmd/api go run ./cmd/api
@@ -63,7 +63,7 @@ npm run dev
- 归还流程已支持租客提交归还、号主确认归还,完成后账号重新上架。 - 归还流程已支持租客提交归还、号主确认归还,完成后账号重新上架。
- 后端已接入开发态订单超时扫描任务,会按系统配置处理交接超时、确认收号超时、逾期未归还和确认归还超时。 - 后端已接入开发态订单超时扫描任务,会按系统配置处理交接超时、确认收号超时、逾期未归还和确认归还超时。
- 文件上传已接入 MinIO,发布账号资产截图和申诉证据可上传 JPG、PNG、WebP 或 PDF。 - 文件上传已接入 MinIO,发布账号资产截图和申诉证据可上传 JPG、PNG、WebP 或 PDF。
- 如果本机有代理工具占用 `127.0.0.1:9000`MinIO 开发地址使用 `http://localhost:9000` - MinIO 开发地址默认使用 `http://localhost:19090`,控制台默认使用 `http://localhost:19091`
- 钱包账务当前为开发态模拟流水,可通过 `GET /api/wallet/balance``GET /api/wallet/ledger` 查看。 - 钱包账务当前为开发态模拟流水,可通过 `GET /api/wallet/balance``GET /api/wallet/ledger` 查看。
- 后台资金流水已接入,支持按用户、订单和业务类型查询。 - 后台资金流水已接入,支持按用户、订单和业务类型查询。
- 站内信已支持订单关键节点自动写入,可通过 `GET /api/notifications` 查看。 - 站内信已支持订单关键节点自动写入,可通过 `GET /api/notifications` 查看。
+4 -4
View File
@@ -1,14 +1,14 @@
APP_ENV=development APP_ENV=development
APP_ADDR=:8080 APP_ADDR=:18088
# MySQL 容器初始化变量,同时供后端 DSN 使用。 # MySQL 容器初始化变量,同时供后端 DSN 使用。
MYSQL_ROOT_PASSWORD=rootsecret MYSQL_ROOT_PASSWORD=rootsecret
MYSQL_DATABASE=hfb_sys MYSQL_DATABASE=hfb_sys
MYSQL_USER=hfb MYSQL_USER=hfb
MYSQL_PASSWORD=secret MYSQL_PASSWORD=secret
MYSQL_DSN=hfb:secret@tcp(127.0.0.1:3306)/hfb_sys?charset=utf8mb4&parseTime=True&loc=Local MYSQL_DSN=hfb:secret@tcp(127.0.0.1:13306)/hfb_sys?charset=utf8mb4&parseTime=True&loc=Local
REDIS_ADDR=127.0.0.1:6379 REDIS_ADDR=127.0.0.1:16379
REDIS_PASSWORD= REDIS_PASSWORD=
REDIS_DB=0 REDIS_DB=0
@@ -35,7 +35,7 @@ LOG_ENABLE_FILE=true
# MinIO 容器初始化变量,同时供后端对象存储使用。 # MinIO 容器初始化变量,同时供后端对象存储使用。
MINIO_ROOT_USER=minioadmin MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=minioadmin MINIO_ROOT_PASSWORD=minioadmin
STORAGE_ENDPOINT=http://localhost:9000 STORAGE_ENDPOINT=http://localhost:19090
STORAGE_BUCKET=hfb-sys STORAGE_BUCKET=hfb-sys
STORAGE_ACCESS_KEY_ID=minioadmin STORAGE_ACCESS_KEY_ID=minioadmin
STORAGE_SECRET_ACCESS_KEY=minioadmin STORAGE_SECRET_ACCESS_KEY=minioadmin
+4 -4
View File
@@ -69,9 +69,9 @@ type RateLimitConfig struct {
func Load() Config { func Load() Config {
return Config{ return Config{
AppEnv: getEnv("APP_ENV", "development"), AppEnv: getEnv("APP_ENV", "development"),
AppAddr: getEnv("APP_ADDR", ":8080"), AppAddr: getEnv("APP_ADDR", ":18088"),
MySQLDSN: getEnv("MYSQL_DSN", "hfb:secret@tcp(127.0.0.1:3306)/hfb_sys?charset=utf8mb4&parseTime=True&loc=Local"), MySQLDSN: getEnv("MYSQL_DSN", "hfb:secret@tcp(127.0.0.1:13306)/hfb_sys?charset=utf8mb4&parseTime=True&loc=Local"),
RedisAddr: getEnv("REDIS_ADDR", "127.0.0.1:6379"), RedisAddr: getEnv("REDIS_ADDR", "127.0.0.1:16379"),
RedisPassword: getEnv("REDIS_PASSWORD", ""), RedisPassword: getEnv("REDIS_PASSWORD", ""),
RedisDB: getEnvInt("REDIS_DB", 0), RedisDB: getEnvInt("REDIS_DB", 0),
JWTSecret: getEnv("JWT_SECRET", "change-me"), JWTSecret: getEnv("JWT_SECRET", "change-me"),
@@ -87,7 +87,7 @@ func Load() Config {
BootstrapAdminPassword: getEnv("ADMIN_BOOTSTRAP_PASSWORD", ""), BootstrapAdminPassword: getEnv("ADMIN_BOOTSTRAP_PASSWORD", ""),
BootstrapAdminNickname: getEnv("ADMIN_BOOTSTRAP_NICKNAME", "超级管理员"), BootstrapAdminNickname: getEnv("ADMIN_BOOTSTRAP_NICKNAME", "超级管理员"),
Storage: StorageConfig{ Storage: StorageConfig{
Endpoint: getEnv("STORAGE_ENDPOINT", "http://localhost:9000"), Endpoint: getEnv("STORAGE_ENDPOINT", "http://localhost:19090"),
Bucket: getEnv("STORAGE_BUCKET", "hfb-sys"), Bucket: getEnv("STORAGE_BUCKET", "hfb-sys"),
AccessKeyID: getEnv("STORAGE_ACCESS_KEY_ID", "minioadmin"), AccessKeyID: getEnv("STORAGE_ACCESS_KEY_ID", "minioadmin"),
SecretAccessKey: getEnv("STORAGE_SECRET_ACCESS_KEY", "minioadmin"), SecretAccessKey: getEnv("STORAGE_SECRET_ACCESS_KEY", "minioadmin"),
+4 -4
View File
@@ -10,7 +10,7 @@ services:
MYSQL_PASSWORD: secret MYSQL_PASSWORD: secret
TZ: Asia/Shanghai TZ: Asia/Shanghai
ports: ports:
- "3306:3306" - "${DEV_MYSQL_PORT:-13306}:3306"
volumes: volumes:
- mysql_data:/var/lib/mysql - mysql_data:/var/lib/mysql
healthcheck: healthcheck:
@@ -24,7 +24,7 @@ services:
container_name: hfb-redis container_name: hfb-redis
restart: unless-stopped restart: unless-stopped
ports: ports:
- "6379:6379" - "${DEV_REDIS_PORT:-16379}:6379"
volumes: volumes:
- redis_data:/data - redis_data:/data
healthcheck: healthcheck:
@@ -43,8 +43,8 @@ services:
MINIO_ROOT_PASSWORD: minioadmin MINIO_ROOT_PASSWORD: minioadmin
TZ: Asia/Shanghai TZ: Asia/Shanghai
ports: ports:
- "9000:9000" - "${DEV_MINIO_API_PORT:-19090}:9000"
- "9001:9001" - "${DEV_MINIO_CONSOLE_PORT:-19091}:9001"
volumes: volumes:
- minio_data:/data - minio_data:/data
healthcheck: healthcheck:
+4 -4
View File
@@ -1,6 +1,6 @@
你这样配置,直接运行 `cloudflared tunnel run` 是**不能**成功把 `5173` 转发出去的。 你这样配置,直接运行 `cloudflared tunnel run` 是**不能**成功把 `5189` 转发出去的。
虽然你用第一条命令把域名 `221329.cc.cd` 绑定到了你的隧道上,但第二条命令在执行时,**`--url` 参数会被直接忽略掉**。 虽然你用第一条命令把域名 `221329.cc.cd` 绑定到了你的隧道上,但第二条命令在执行时,**`--url` 参数会被直接忽略掉**。
@@ -11,7 +11,7 @@
`cloudflared` 的设计逻辑是: `cloudflared` 的设计逻辑是:
当你使用 **命名隧道(Named Tunnel,即你创建的 `mac-mini-tunnel`** 时,它**强制要求**使用本地的 `config.yml` 配置文件来管理转发规则(Ingress Rules),或者通过 Cloudflare 网页后台(Zero Trust Dashboard)来配置。 当你使用 **命名隧道(Named Tunnel,即你创建的 `mac-mini-tunnel`** 时,它**强制要求**使用本地的 `config.yml` 配置文件来管理转发规则(Ingress Rules),或者通过 Cloudflare 网页后台(Zero Trust Dashboard)来配置。
你在命令行里强行拼凑的 `--url http://localhost:5173` 只有在运行临时隧道(Quick Tunnels,不指定隧道名的那种)时才会生效。 你在命令行里强行拼凑的 `--url http://localhost:5189` 只有在运行临时隧道(Quick Tunnels,不指定隧道名的那种)时才会生效。
--- ---
@@ -28,7 +28,7 @@ credentials-file: /Users/你的用户名/.cloudflared/你的隧道ID.json
ingress: ingress:
- hostname: 221329.cc.cd - hostname: 221329.cc.cd
service: http://localhost:5173 service: http://localhost:5189
- service: http_status:404 - service: http_status:404
``` ```
@@ -44,4 +44,4 @@ cloudflared tunnel run mac-mini-tunnel
cloudflared tunnel route dns mac-mini-tunnel 221329.cc.cd cloudflared tunnel route dns mac-mini-tunnel 221329.cc.cd
cloudflared tunnel run --url http://localhost:5173 mac-mini-tunnel cloudflared tunnel run --url http://localhost:5189 mac-mini-tunnel
+7 -2
View File
@@ -51,6 +51,10 @@ function stripVantRemoteIconFont() {
} }
} }
const frontendPort = Number(process.env.DEV_FRONTEND_PORT || process.env.PORT || 5189)
const backendPort = Number(process.env.DEV_BACKEND_PORT || 18088)
const apiProxyTarget = process.env.VITE_API_PROXY_TARGET || `http://127.0.0.1:${backendPort}`
export default defineConfig({ export default defineConfig({
// 禁止 vite 清屏,避免把后端启动日志(GIN 路由、迁移等)从终端滚动缓冲里抹掉 // 禁止 vite 清屏,避免把后端启动日志(GIN 路由、迁移等)从终端滚动缓冲里抹掉
clearScreen: false, clearScreen: false,
@@ -74,9 +78,10 @@ export default defineConfig({
}, },
}, },
server: { server: {
port: 5173, port: frontendPort,
strictPort: true,
proxy: { proxy: {
'/api': 'http://127.0.0.1:8080', '/api': apiProxyTarget,
}, },
allowedHosts: [ allowedHosts: [
'221329.cc.cd', '221329.cc.cd',
+39 -11
View File
@@ -12,8 +12,12 @@ FRONTEND_NODE_MODULES="${FRONTEND_DIR}/node_modules"
FRONTEND_NODE_MODULES_LOCK="${FRONTEND_NODE_MODULES}/.package-lock.json" FRONTEND_NODE_MODULES_LOCK="${FRONTEND_NODE_MODULES}/.package-lock.json"
MIGRATIONS_DIR="${ROOT_DIR}/backend/migrations" MIGRATIONS_DIR="${ROOT_DIR}/backend/migrations"
MYSQL_DATABASE="${DEV_MYSQL_DATABASE:-hfb_sys}" MYSQL_DATABASE="${DEV_MYSQL_DATABASE:-hfb_sys}"
BACKEND_PORT="${DEV_BACKEND_PORT:-8080}" BACKEND_PORT="${DEV_BACKEND_PORT:-18088}"
FRONTEND_PORT="${DEV_FRONTEND_PORT:-5173}" FRONTEND_PORT="${DEV_FRONTEND_PORT:-5189}"
MYSQL_PORT="${DEV_MYSQL_PORT:-13306}"
REDIS_PORT="${DEV_REDIS_PORT:-16379}"
MINIO_API_PORT="${DEV_MINIO_API_PORT:-19090}"
MINIO_CONSOLE_PORT="${DEV_MINIO_CONSOLE_PORT:-19091}"
BACKEND_HEALTH_URL="${DEV_BACKEND_HEALTH_URL:-http://127.0.0.1:${BACKEND_PORT}/health}" BACKEND_HEALTH_URL="${DEV_BACKEND_HEALTH_URL:-http://127.0.0.1:${BACKEND_PORT}/health}"
FRONTEND_HEALTH_URL="${DEV_FRONTEND_HEALTH_URL:-http://127.0.0.1:${FRONTEND_PORT}/}" FRONTEND_HEALTH_URL="${DEV_FRONTEND_HEALTH_URL:-http://127.0.0.1:${FRONTEND_PORT}/}"
HTTP_READY_TIMEOUT="${DEV_HTTP_READY_TIMEOUT:-120}" HTTP_READY_TIMEOUT="${DEV_HTTP_READY_TIMEOUT:-120}"
@@ -71,13 +75,21 @@ show_help() {
DEV_RESET_DB=1 等同于 --reset-db DEV_RESET_DB=1 等同于 --reset-db
DEV_MYSQL_DATABASE=hfb_sys DEV_MYSQL_DATABASE=hfb_sys
开发数据库名 开发数据库名
DEV_BACKEND_PORT=8080 DEV_BACKEND_PORT=18088
后端启动端口 后端启动端口
DEV_FRONTEND_PORT=5173 DEV_FRONTEND_PORT=5189
前端启动端口 前端启动端口
DEV_BACKEND_HEALTH_URL=http://127.0.0.1:8080/health DEV_MYSQL_PORT=13306
MySQL 宿主机映射端口
DEV_REDIS_PORT=16379
Redis 宿主机映射端口
DEV_MINIO_API_PORT=19090
MinIO API 宿主机映射端口
DEV_MINIO_CONSOLE_PORT=19091
MinIO 控制台宿主机映射端口
DEV_BACKEND_HEALTH_URL=http://127.0.0.1:18088/health
后端健康检查地址 后端健康检查地址
DEV_FRONTEND_HEALTH_URL=http://127.0.0.1:5173/ DEV_FRONTEND_HEALTH_URL=http://127.0.0.1:5189/
前端健康检查地址 前端健康检查地址
DEV_HTTP_READY_TIMEOUT=120 DEV_HTTP_READY_TIMEOUT=120
HTTP 服务就绪等待秒数 HTTP 服务就绪等待秒数
@@ -422,7 +434,7 @@ goose_dsn() {
} }
dev_goose_dsn() { dev_goose_dsn() {
goose_dsn "hfb:secret@tcp(127.0.0.1:3306)/${MYSQL_DATABASE}?charset=utf8mb4&parseTime=True&loc=Local" goose_dsn "hfb:secret@tcp(127.0.0.1:${MYSQL_PORT})/${MYSQL_DATABASE}?charset=utf8mb4&parseTime=True&loc=Local"
} }
goose_cmd() { goose_cmd() {
@@ -458,10 +470,14 @@ start_backend() {
cp "${BACKEND_ENV_EXAMPLE}" "${BACKEND_ENV}" cp "${BACKEND_ENV_EXAMPLE}" "${BACKEND_ENV}"
fi fi
log "启动后端:http://localhost:8080" log "启动后端:http://localhost:${BACKEND_PORT}"
( (
cd "${ROOT_DIR}/backend" cd "${ROOT_DIR}/backend"
load_env_file "${BACKEND_ENV}" load_env_file "${BACKEND_ENV}"
export APP_ADDR=":${BACKEND_PORT}"
export MYSQL_DSN="hfb:secret@tcp(127.0.0.1:${MYSQL_PORT})/${MYSQL_DATABASE}?charset=utf8mb4&parseTime=True&loc=Local"
export REDIS_ADDR="127.0.0.1:${REDIS_PORT}"
export STORAGE_ENDPOINT="http://localhost:${MINIO_API_PORT}"
go run ./cmd/api go run ./cmd/api
) & ) &
BACKEND_PID="$!" BACKEND_PID="$!"
@@ -513,9 +529,12 @@ ensure_frontend_dependencies() {
start_frontend() { start_frontend() {
ensure_frontend_dependencies ensure_frontend_dependencies
log "启动前端:http://localhost:5173" log "启动前端:http://localhost:${FRONTEND_PORT}"
( (
cd "${FRONTEND_DIR}" cd "${FRONTEND_DIR}"
export DEV_FRONTEND_PORT="${FRONTEND_PORT}"
export DEV_BACKEND_PORT="${BACKEND_PORT}"
export VITE_API_PROXY_TARGET="${VITE_API_PROXY_TARGET:-http://127.0.0.1:${BACKEND_PORT}}"
npm run dev npm run dev
) & ) &
FRONTEND_PID="$!" FRONTEND_PID="$!"
@@ -558,7 +577,16 @@ main() {
exit 1 exit 1
fi fi
ensure_port_free "${MYSQL_PORT}" "MySQL" hfb-mysql
ensure_port_free "${REDIS_PORT}" "Redis" hfb-redis
ensure_port_free "${MINIO_API_PORT}" "MinIO API" hfb-minio
ensure_port_free "${MINIO_CONSOLE_PORT}" "MinIO 控制台" hfb-minio
log "启动开发依赖:MySQL、Redis、MinIO" log "启动开发依赖:MySQL、Redis、MinIO"
export DEV_MYSQL_PORT="${MYSQL_PORT}"
export DEV_REDIS_PORT="${REDIS_PORT}"
export DEV_MINIO_API_PORT="${MINIO_API_PORT}"
export DEV_MINIO_CONSOLE_PORT="${MINIO_CONSOLE_PORT}"
docker compose -f "${COMPOSE_FILE}" up -d docker compose -f "${COMPOSE_FILE}" up -d
wait_container_healthy hfb-mysql "MySQL" wait_container_healthy hfb-mysql "MySQL"
@@ -588,8 +616,8 @@ main() {
log_success "开发环境已启动" log_success "开发环境已启动"
if [[ "${NO_FRONTEND}" == "0" ]]; then if [[ "${NO_FRONTEND}" == "0" ]]; then
local admin_base_path="${VITE_ADMIN_BASE_PATH:-/admin}" local admin_base_path="${VITE_ADMIN_BASE_PATH:-/admin}"
log "前台:http://localhost:5173" log "前台:http://localhost:${FRONTEND_PORT}"
log "后台:http://localhost:5173${admin_base_path%/}/login" log "后台:http://localhost:${FRONTEND_PORT}${admin_base_path%/}/login"
fi fi
log "按 Ctrl+C 停止前后端;Docker 依赖会保留运行" log "按 Ctrl+C 停止前后端;Docker 依赖会保留运行"