chore(dev): simplify local Docker startup
Some checks failed
ci / release-gate (push) Has been cancelled

This commit is contained in:
2026-08-04 17:46:01 +08:00
parent 3385649a8d
commit 1aa1ed4829
5 changed files with 94 additions and 33 deletions

19
.env.example Normal file
View File

@@ -0,0 +1,19 @@
# Copy this file to .env before starting local infrastructure or .NET runtimes.
# These credentials match compose.yaml defaults and are for local development only.
TIKU_POSTGRES_DB=tiku
TIKU_POSTGRES_USER=tiku
TIKU_POSTGRES_PASSWORD=tiku_dev
TIKU_POSTGRES_PORT=5432
TIKU_REDIS_PORT=6379
ASPNETCORE_ENVIRONMENT=Development
DOTNET_ENVIRONMENT=Development
ConnectionStrings__Database="Host=127.0.0.1;Port=5432;Database=tiku;Username=tiku;Password=tiku_dev"
ConnectionStrings__Redis="127.0.0.1:6379,abortConnect=false"
Tenancy__Resolution__PlatformHosts__0=localhost
Tenancy__Resolution__PlatformHosts__1=127.0.0.1
# To access the platform API from another device on the LAN, uncomment this
# setting and replace the address with this development machine's current LAN IP.
# Tenancy__Resolution__PlatformHosts__2=192.168.1.100

4
.gitignore vendored
View File

@@ -374,3 +374,7 @@ FodyWeavers.xsd
*.db-wal
.idea/
# Local runtime configuration. Keep the documented template tracked.
.env
!.env.example

View File

@@ -35,20 +35,29 @@ Tiku.IntegrationTests API、授权、EF 模型、迁移和真实 PostgreSQL 测
需要 .NET 10 SDK、Node.js 24+ 和 Docker Desktop。本地 PostgreSQL、Redis 与 S3 兼容对象存储统一由根目录的 `compose.yaml` 提供:
```bash
docker compose up -d --wait
cp .env.example .env
set -a
source .env
set +a
export ConnectionStrings__Database='Host=127.0.0.1;Port=5432;Database=tiku;Username=tiku;Password=tiku_dev'
export ConnectionStrings__Redis='127.0.0.1:6379,abortConnect=false'
docker compose up -d --wait
dotnet restore TIKU-BACKEND.slnx
dotnet build TIKU-BACKEND.slnx --no-restore
ASPNETCORE_ENVIRONMENT=Development dotnet run --project Tiku.DbMigrator
ASPNETCORE_ENVIRONMENT=Development dotnet run --project Tiku.Api --launch-profile http
# 另开终端并设置相同连接串后启动 Worker
DOTNET_ENVIRONMENT=Development dotnet run --project Tiku.Worker
dotnet run --project Tiku.DbMigrator
dotnet run --project Tiku.Api --launch-profile http
```
`docker compose ps` 应显示 PostgreSQL、Redis 与 MinIO 均为 `healthy`。Development 未配置阿里云 OSS 时,`local_dev` Provider 会把对象实际保存到 MinIO而不是返回占位结果。默认账号和密码只用于本机开发不能用于共享或生产环境。完整配置、停止和排障步骤见[本地开发快速上手](docs/quickstart.md)。
另开终端启动 Worker 时必须再次导入 `.env`
```bash
set -a
source .env
set +a
dotnet run --project Tiku.Worker
```
必须先从 `.env.example` 创建本地 `.env`,并在每个运行 .NET 的新终端中导入;否则 DbMigrator、API 和 Worker 可能连接到错误的 PostgreSQL/Redis。`.env` 不进入 Git。`docker compose ps` 应显示 PostgreSQL、Redis 与 MinIO 均为 `healthy`。Development 未配置阿里云 OSS 时,`local_dev` Provider 会把对象实际保存到 MinIO而不是返回占位结果。默认账号和密码只用于本机开发不能用于共享或生产环境。完整配置、内网访问、停止和排障步骤见[本地开发快速上手](docs/quickstart.md)。
默认 Development seed 会在尚无平台角色绑定时创建平台管理员 `admin@tiku.local` 和演示数据;随机临时密码只在首次创建时输出。日常步骤见[本地开发快速上手](docs/quickstart.md),不含演示数据的完整 SaaS 验收见[空数据库到租户建站验收](docs/tenant-provisioning.md)。

View File

@@ -5,7 +5,7 @@
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": false,
"applicationUrl": "http://localhost:5090",
"applicationUrl": "http://0.0.0.0:5090",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.SpaProxy"
@@ -15,7 +15,7 @@
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": false,
"applicationUrl": "https://localhost:7093;http://localhost:5090",
"applicationUrl": "https://localhost:7093;http://0.0.0.0:5090",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.SpaProxy"

View File

@@ -25,7 +25,23 @@ npm --prefix Tiku.PlatformAdmin.Web install
## 启动 PostgreSQL、Redis 与对象存储
在仓库根目录启动依赖并等待健康检查通过
首次启动时,先在仓库根目录复制环境变量模板
```bash
cp .env.example .env
```
`.env` 已被 Git 忽略。默认值与 `compose.yaml` 一致,可直接用于本机开发;如果修改数据库账号、密码或端口,必须同时修改 Compose 变量和 `ConnectionStrings__Database`/`ConnectionStrings__Redis`。不要把真实密码、Token 或生产连接串写入 `.env.example`
Docker Compose 会自动读取根目录 `.env`。在启动 .NET 运行时的每个终端中,还必须先导入同一个文件:
```bash
set -a
source .env
set +a
```
如果跳过这一步DbMigrator、API 和 Worker 就无法获得 Docker PostgreSQL/Redis 的连接配置。导入后再启动依赖并等待健康检查通过:
```bash
docker compose up -d --wait
@@ -44,27 +60,29 @@ MinIO API: 127.0.0.1:9000Access Key tikuSecret Key tiku_minio_dev
MinIO 控制台: http://127.0.0.1:9001
```
为 DbMigrator、API 和 Worker 设置相同的连接串:
```bash
export ConnectionStrings__Database='Host=127.0.0.1;Port=5432;Database=tiku;Username=tiku;Password=tiku_dev'
export ConnectionStrings__Redis='127.0.0.1:6379,abortConnect=false'
```
Development 配置会把 `local_dev` 对象存储指向该 MinIO没有完整阿里云 OSS 凭据时也会自动回退到 `local_dev`。文件内容保存在 MinIO 数据卷PostgreSQL 只保存业务元数据和对象引用。
这些默认凭据仅用于本机开发不能用于共享或生产环境。需要自定义数据库、MinIO 凭据或宿主机端口时,应在首次创建数据卷前设置 Compose 变量,并同步修改应用连接串或 `Storage:S3Compatible` 配置:
这些默认凭据仅用于本机开发不能用于共享或生产环境。需要自定义数据库、MinIO 凭据或宿主机端口时,应在首次创建数据卷前编辑本地 `.env`,并同步修改应用连接串或 `Storage:S3Compatible` 配置:
```bash
export TIKU_POSTGRES_DB='<数据库名>'
export TIKU_POSTGRES_USER='<数据库用户>'
export TIKU_POSTGRES_PASSWORD='<本地密码>'
export TIKU_POSTGRES_PORT='<宿主机端口>'
export TIKU_REDIS_PORT='<宿主机端口>'
export TIKU_MINIO_ROOT_USER='<Access Key>'
export TIKU_MINIO_ROOT_PASSWORD='<Secret Key>'
export TIKU_MINIO_API_PORT='<宿主机 API 端口>'
export TIKU_MINIO_CONSOLE_PORT='<宿主机控制台端口>'
# .env
TIKU_POSTGRES_DB='<数据库>'
TIKU_POSTGRES_USER='<数据库用户>'
TIKU_POSTGRES_PASSWORD='<本地密码>'
TIKU_POSTGRES_PORT='<宿主机端口>'
TIKU_REDIS_PORT='<宿主机端口>'
TIKU_MINIO_ROOT_USER='<Access Key>'
TIKU_MINIO_ROOT_PASSWORD='<Secret Key>'
TIKU_MINIO_API_PORT='<宿主机 API 端口>'
TIKU_MINIO_CONSOLE_PORT='<宿主机控制台端口>'
```
保存后重新导入并启动:
```bash
set -a
source .env
set +a
docker compose up -d --wait
```
@@ -77,7 +95,7 @@ PostgreSQL 初始化变量不会修改已有数据卷中的账号或数据库。
API 不执行 Migration。数据库结构、内置权限/菜单目录和 `starter` 套餐统一由 `Tiku.DbMigrator` 初始化:
```bash
ASPNETCORE_ENVIRONMENT=Development dotnet run --project Tiku.DbMigrator
dotnet run --project Tiku.DbMigrator
```
默认 Development seed 会在尚无平台角色绑定时创建 `admin@tiku.local`、演示租户和演示运营数据;随机临时密码只在首次创建时输出,首次登录必须改密。
@@ -102,7 +120,7 @@ dotnet run --project Tiku.DbMigrator -- \
启动 API
```bash
ASPNETCORE_ENVIRONMENT=Development dotnet run --project Tiku.Api --launch-profile http
dotnet run --project Tiku.Api --launch-profile http
```
`Tiku.Api.csproj` 的 SPA Proxy 会在 Development 启动 `Tiku.PlatformAdmin.Web` 的 Vite 服务。默认入口:
@@ -114,13 +132,24 @@ ASPNETCORE_ENVIRONMENT=Development dotnet run --project Tiku.Api --launch-profil
- Liveness<http://localhost:5090/api/system/health>
- Readiness<http://localhost:5090/api/system/health/ready>
开发启动配置监听 `0.0.0.0:5090`。如需让同一内网的其他设备访问平台 API先查询本机内网 IP然后在本地 `.env` 中加入该 Host
```bash
ipconfig getifaddr en0 # macOS 示例
# 将实际地址写入 .env数组索引 0/1 仍保留 localhost 和 127.0.0.1
Tenancy__Resolution__PlatformHosts__2=192.168.1.100
```
修改 `.env` 后必须重启 API。访问地址为 `http://<内网 IP>:5090`;如果请求已经到达 API 但返回 `Tenant was not found`,通常是内网 IP 未加入 `PlatformHosts`。其他设备仍无法连接时,再检查 macOS 防火墙和 Wi-Fi 客户端隔离。内网 IP 由 DHCP 变更后也要同步更新 `.env`
后台循环不在 API 内运行。需要处理域名、订阅、任务队列、授权缓存失效或商业账务时,另开终端启动 Worker
```bash
DOTNET_ENVIRONMENT=Development dotnet run --project Tiku.Worker
dotnet run --project Tiku.Worker
```
API 与 Worker 必须使用前面设置的同一 PostgreSQL、Redis 和对象存储。Worker 是通用 Host环境名使用 `DOTNET_ENVIRONMENT`;每个新终端都需要重新设置连接串,或通过本机未跟踪的安全配置注入。
API 与 Worker 必须使用前面设置的同一 PostgreSQL、Redis 和对象存储。Worker 是通用 Host环境名使用 `.env` 中的 `DOTNET_ENVIRONMENT`;每个新终端都需要重新执行 `set -a; source .env; set +a`,或使用 direnv 等本机工具自动导入。
## 验证修改
@@ -142,7 +171,7 @@ PostgreSQL 特有的 Migration、事务、约束和租户隔离行为必须由
### API 报数据库不可用
先运行 `docker compose ps`,确认 PostgreSQL 为 `healthy`,再核对 `ConnectionStrings__Database``DATABASE_URL`。如果 `5432` 端口已被本机 PostgreSQL 占用,应停止该服务或通过 `TIKU_POSTGRES_PORT` 改用其他宿主机端口;非 Development 环境没有本地默认连接串。
先运行 `docker compose ps`,确认 PostgreSQL 为 `healthy`,再 `env | grep -E 'ConnectionStrings__Database|DATABASE_URL'` 确认当前终端已经导入 `.env`。如果 `5432` 端口已被本机 PostgreSQL 占用,应停止该服务或通过 `TIKU_POSTGRES_PORT` 改用其他宿主机端口,并同步修改数据库连接串;非 Development 环境没有本地默认连接串。
### 找不到平台管理员临时密码