Tstore/README.md

319 lines
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Tstore
Tstore 是一个基于 Laravel 12 的 Typecho 插件/主题商店项目,包含展示前台、网页后台和 API 接口三部分。
## 功能概览
- 前台展示站:首页、插件列表、主题列表、详情页
- 网页后台账号密码登录、分类管理、扩展管理、版本管理、ZIP 发布
- 仓库 API扩展列表、详情、更新检查、下载、分类
- 管理 API包管理、分类管理、版本管理
## 技术栈
- PHP 8.2+
- Laravel 12
- Vite 7
- Tailwind CSS 4
## 主要入口
- 前台首页:`/`
- 后台登录:`/admin/login`
- 仓库 API`/api/v1/repo/*`
- 管理 API`/api/admin/*`
- 健康检查:`/up`
## 本地开发
```bash
composer install
cp .env.example .env
php artisan key:generate
php artisan migrate --force
npm install
npm run dev
php artisan serve
```
也可以直接使用项目内置脚本:
```bash
composer run setup
composer run dev
```
## Docker
仓库已提供通用容器化文件:
- `Dockerfile`
- `.dockerignore`
- `docker/apache/000-default.conf`
- `docker/entrypoint.sh`
- `docker/php/opcache.ini`
- `docker-compose.example.yml`
### 1. 构建镜像
```bash
docker build -t tstore:latest .
```
这个镜像是多阶段构建,包含:
- Composer 依赖安装
- Vite 前端资源构建
- Apache + PHP 8.2 运行时
容器内网站根目录已经指向 `public/`,不需要再额外改 Web 根目录。
### 2. 单容器运行
更适合已经有外部 MySQL 的场景。
```bash
docker run -d \
--name tstore \
-p 8080:80 \
--env-file .env \
-e APP_ENV=production \
-e APP_DEBUG=false \
-e APP_URL=http://localhost:8080 \
-e LOG_CHANNEL=stderr \
-e DB_CONNECTION=mysql \
-e DB_HOST=your-db-host \
-e DB_PORT=3306 \
-e DB_DATABASE=tstore \
-e DB_USERNAME=tstore \
-e DB_PASSWORD=your-password \
-e SESSION_DRIVER=file \
-e CACHE_STORE=file \
-e QUEUE_CONNECTION=sync \
-e RUN_MIGRATIONS=1 \
-e RUN_OPTIMIZE=1 \
tstore:latest
```
如果你希望容器启动时自动创建后台管理员账号,可以再加:
```bash
-e RUN_ADMIN_SEEDER=1
```
说明:
- `RUN_MIGRATIONS=1` 会在容器启动时执行 `php artisan migrate --force`
- `RUN_ADMIN_SEEDER=1` 会执行 `AdminUserSeeder`
- `RUN_OPTIMIZE=1` 会执行 `php artisan optimize`
### 3. 使用 Docker Compose
仓库提供了一个通用示例文件:
```bash
cp docker-compose.example.yml docker-compose.yml
docker compose up -d --build
```
默认暴露端口:
- 应用:`8080`
- MySQL不对宿主机暴露仅供容器内部访问
首次启动前,建议先修改:
- `docker-compose.yml` 中的数据库密码
- `.env` 中的 `APP_URL`
- `.env` 中的 `SESSION_DRIVER`、`CACHE_STORE`、`QUEUE_CONNECTION`
- `.env` 中的 `STORE_ADMIN_TOKEN`
- `.env` 中的 `STORE_PLUGIN_ACCESS_TOKEN`
- `.env` 中的 `ADMIN_EMAIL`
- `.env` 中的 `ADMIN_PASSWORD`
### 4. 容器化运行时建议
- 生产环境优先使用 MySQL不建议继续使用 SQLite
- 如果要持久化上传的 ZIP 包和日志,保留 `storage` 卷挂载
- 不要把真实 `.env` 打进镜像,运行时通过 `--env-file` 或 Compose 注入
- 如果上线到生产,建议把 `APP_URL` 改成正式域名,并在网关层处理 HTTPS
## 生产部署
以下步骤以 `Linux + Nginx + PHP-FPM` 为例。生产环境不要运行 `php artisan serve``npm run dev`
### 1. 准备运行环境
- 安装 PHP 8.2 及常用扩展:`mbstring`、`openssl`、`pdo`、`pdo_mysql` 或 `pdo_sqlite`、`fileinfo`、`zip`
- 安装 Composer 2
- 安装 Node.js 20+ 和 npm
- 准备 Web 服务器,例如 Nginx
- 准备数据库,生产建议使用 MySQL 或 MariaDB不建议继续使用 SQLite
### 2. 拉取代码并安装依赖
```bash
git clone <your-repo-url> /var/www/tstore
cd /var/www/tstore
composer install --no-dev --optimize-autoloader
npm ci
npm run build
```
如果前端资源在 CI 中已经构建好,也可以直接发布 `public/build`,服务器上就不必再执行 `npm ci``npm run build`
### 3. 配置环境变量
先创建生产环境配置文件:
```bash
cp .env.example .env
```
至少确认并修改以下配置:
```dotenv
APP_NAME=Tstore
APP_ENV=production
APP_DEBUG=false
APP_URL=https://your-domain.com
LOG_CHANNEL=stack
LOG_STACK=daily
LOG_LEVEL=info
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=tstore
DB_USERNAME=tstore
DB_PASSWORD=your-password
SESSION_DRIVER=file
CACHE_STORE=file
QUEUE_CONNECTION=sync
STORE_ADMIN_TOKEN=replace-with-a-long-random-token
STORE_PLUGIN_ACCESS_TOKEN=replace-with-a-long-random-token
ADMIN_NAME=Tstore Admin
ADMIN_EMAIL=admin@example.com
ADMIN_PASSWORD=change-this-password
```
说明:
- `STORE_ADMIN_TOKEN` 用于 `/api/admin/*` 管理接口鉴权
- `STORE_PLUGIN_ACCESS_TOKEN` 用于下载接口鉴权
- 网页后台 `/admin/login` 使用 `users` 表中的账号密码登录
- 如果生产环境使用 Redis可以把 `SESSION_DRIVER`、`CACHE_STORE`、`QUEUE_CONNECTION` 改为 Redis 相关配置
### 4. 初始化应用
```bash
php artisan key:generate
php artisan migrate --force
php artisan db:seed --class='Database\Seeders\AdminUserSeeder' --force
php artisan optimize
```
说明:
- 首次部署需要执行 `key:generate`
- 初始化管理员账号时,只建议运行 `AdminUserSeeder`
- 不要在生产环境直接执行 `php artisan db:seed`,因为当前 `DatabaseSeeder` 会同时导入演示数据
### 5. 设置目录权限
确保以下目录对 Web 服务用户可写:
- `storage/`
- `bootstrap/cache/`
如果你把上传的 ZIP 包存放在本机磁盘,还需要关注:
- `storage/app/packages/`
这个目录建议纳入备份策略。
### 6. 配置 Web 根目录
Nginx 或 Apache 的站点根目录必须指向项目的 `public/` 目录,而不是仓库根目录。
例如:
```nginx
server {
listen 80;
server_name your-domain.com;
root /var/www/tstore/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
```
### 7. 部署后验证
部署完成后,至少检查以下内容:
- 访问 `/up`,确认健康检查正常
- 访问 `/admin/login`,确认后台登录页正常打开
- 检查 `public/build/manifest.json` 是否存在
- 调用 `/api/v1/repo/index`,确认公开 API 正常返回
- 登录后台,确认可进入管理首页
### 8. 后续发布更新
应用更新时,建议按下面顺序执行:
```bash
cd /var/www/tstore
git pull
composer install --no-dev --optimize-autoloader
npm ci
npm run build
php artisan migrate --force
php artisan optimize:clear
php artisan optimize
```
### 9. 可选:队列进程
当前项目即使使用 `QUEUE_CONNECTION=sync` 也可以正常工作。如果你后续把下载日志、统计或发布流程改成异步任务,再配置常驻队列进程,例如:
```bash
php artisan queue:work --tries=3 --timeout=90
```
建议用 Supervisor 或 systemd 托管。
## 生产环境建议
- `APP_DEBUG` 必须为 `false`
- 使用 HTTPS并正确设置 `APP_URL`
- 管理 API 令牌和下载令牌使用高强度随机值
- 日志建议使用 `daily`
- 数据库、`storage/app/packages` 和 `.env` 要纳入备份
## 备注
- 生产环境不需要运行 Vite 开发服务器
- 生产环境不建议使用 `php artisan serve`
- 如果前端资源已由 CI 构建,可以只发布编译后的 `public/build`