📝 docs: Add documentation

This commit is contained in:
web@ppanel
2025-12-11 03:29:07 +00:00
parent 50e695a1bb
commit 99e7f6062d
135 changed files with 79115 additions and 8 deletions
+387
View File
@@ -0,0 +1,387 @@
# 贡献者
感谢所有为 PPanel 项目做出贡献的开发者!
## 项目贡献者
PPanel 是一个开源项目,我们欢迎并感谢所有形式的贡献,包括但不限于:
- 💻 代码贡献
- 📝 文档改进
- 🐛 Bug 报告
- 💡 功能建议
- 🌍 翻译工作
- ⭐ Star 和推广
## 核心贡献者
<script setup>
import { ref, onMounted } from 'vue'
const backendContributors = ref([])
const frontendContributors = ref([])
const backendLoading = ref(true)
const frontendLoading = ref(true)
onMounted(async () => {
// 获取后端相关仓库的贡献者
try {
const repos = ['server', 'ppanel', 'ppanel-node', 'subscription-template']
const contributorsMap = new Map()
for (const repo of repos) {
const response = await fetch(`https://api.github.com/repos/perfect-panel/${repo}/contributors`)
if (response.ok) {
const contributors = await response.json()
contributors.forEach(contributor => {
if (!contributorsMap.has(contributor.login)) {
contributorsMap.set(contributor.login, {
login: contributor.login,
avatar_url: contributor.avatar_url,
html_url: contributor.html_url,
contributions: contributor.contributions
})
} else {
const existing = contributorsMap.get(contributor.login)
existing.contributions += contributor.contributions
}
})
}
}
backendContributors.value = Array.from(contributorsMap.values())
.sort((a, b) => b.contributions - a.contributions)
} catch (error) {
console.error('Failed to fetch backend contributors:', error)
} finally {
backendLoading.value = false
}
// 获取前端相关仓库的贡献者
try {
const repos = ['frontend', 'ppanel-web', 'ppanel-docs']
const contributorsMap = new Map()
for (const repo of repos) {
const response = await fetch(`https://api.github.com/repos/perfect-panel/${repo}/contributors`)
if (response.ok) {
const contributors = await response.json()
contributors.forEach(contributor => {
if (!contributorsMap.has(contributor.login)) {
contributorsMap.set(contributor.login, {
login: contributor.login,
avatar_url: contributor.avatar_url,
html_url: contributor.html_url,
contributions: contributor.contributions
})
} else {
const existing = contributorsMap.get(contributor.login)
existing.contributions += contributor.contributions
}
})
}
}
frontendContributors.value = Array.from(contributorsMap.values())
.sort((a, b) => b.contributions - a.contributions)
} catch (error) {
console.error('Failed to fetch frontend contributors:', error)
} finally {
frontendLoading.value = false
}
})
</script>
### 后端仓库贡献者
<div v-if="backendLoading" class="contributors-loading">
<div class="loading-spinner"></div>
<p>正在加载贡献者信息...</p>
</div>
<div v-else-if="backendContributors.length === 0" class="contributors-empty">
<p>暂无贡献者数据</p>
</div>
<div v-else>
<div class="contributors-grid">
<a
v-for="contributor in backendContributors"
:key="contributor.login"
:href="contributor.html_url"
target="_blank"
rel="noopener noreferrer"
class="contributor-card"
>
<img
:src="contributor.avatar_url"
:alt="contributor.login"
class="contributor-avatar"
loading="lazy"
/>
<div class="contributor-info">
<div class="contributor-name" :title="contributor.login">{{ contributor.login }}</div>
<div class="contributor-contributions">
<svg class="contribution-icon" viewBox="0 0 16 16" width="12" height="12" fill="currentColor">
<path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Z"></path>
</svg>
{{ contributor.contributions }} 次贡献
</div>
</div>
</a>
</div>
</div>
### 前端仓库贡献者
<div v-if="frontendLoading" class="contributors-loading">
<div class="loading-spinner"></div>
<p>正在加载贡献者信息...</p>
</div>
<div v-else-if="frontendContributors.length === 0" class="contributors-empty">
<p>暂无贡献者数据</p>
</div>
<div v-else>
<div class="contributors-grid">
<a
v-for="contributor in frontendContributors"
:key="contributor.login"
:href="contributor.html_url"
target="_blank"
rel="noopener noreferrer"
class="contributor-card"
>
<img
:src="contributor.avatar_url"
:alt="contributor.login"
class="contributor-avatar"
loading="lazy"
/>
<div class="contributor-info">
<div class="contributor-name" :title="contributor.login">{{ contributor.login }}</div>
<div class="contributor-contributions">
<svg class="contribution-icon" viewBox="0 0 16 16" width="12" height="12" fill="currentColor">
<path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Z"></path>
</svg>
{{ contributor.contributions }} 次贡献
</div>
</div>
</a>
</div>
</div>
<style scoped>
.contributors-loading {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 3rem;
color: var(--vp-c-text-2);
}
.loading-spinner {
width: 40px;
height: 40px;
border: 3px solid var(--vp-c-divider);
border-top-color: var(--vp-c-brand);
border-radius: 50%;
animation: spin 0.8s linear infinite;
margin-bottom: 1rem;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
.contributors-empty {
text-align: center;
padding: 2rem;
color: var(--vp-c-text-3);
font-style: italic;
}
.contributors-stats {
display: flex;
gap: 1rem;
margin-bottom: 1.5rem;
flex-wrap: wrap;
}
.stat-badge {
display: inline-flex;
align-items: center;
padding: 0.5rem 1rem;
background: var(--vp-c-bg-soft);
border: 1px solid var(--vp-c-divider);
border-radius: 20px;
font-size: 13px;
font-weight: 500;
color: var(--vp-c-text-2);
}
.contributors-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
gap: 1rem;
margin: 1.5rem 0;
}
.contributor-card {
display: flex;
align-items: center;
padding: 1rem;
background: var(--vp-c-bg-soft);
border: 1px solid var(--vp-c-divider);
border-radius: 12px;
text-decoration: none;
color: var(--vp-c-text-1);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
position: relative;
overflow: hidden;
}
.contributor-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 2px;
background: linear-gradient(90deg, var(--vp-c-brand), var(--vp-c-brand-light));
transform: scaleX(0);
transition: transform 0.3s ease;
}
.contributor-card:hover {
border-color: var(--vp-c-brand-light);
transform: translateY(-4px);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
}
.contributor-card:hover::before {
transform: scaleX(1);
}
.contributor-avatar {
width: 56px;
height: 56px;
border-radius: 50%;
margin-right: 1rem;
border: 2px solid var(--vp-c-divider);
transition: all 0.3s ease;
flex-shrink: 0;
}
.contributor-card:hover .contributor-avatar {
border-color: var(--vp-c-brand);
transform: scale(1.05);
}
.contributor-info {
flex: 1;
min-width: 0;
}
.contributor-name {
font-weight: 600;
font-size: 15px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
margin-bottom: 0.25rem;
color: var(--vp-c-text-1);
}
.contributor-contributions {
display: flex;
align-items: center;
gap: 0.25rem;
font-size: 13px;
color: var(--vp-c-text-2);
}
.contribution-icon {
opacity: 0.6;
}
@media (max-width: 768px) {
.contributors-grid {
grid-template-columns: 1fr;
}
.contributors-stats {
flex-direction: column;
}
.stat-badge {
width: 100%;
justify-content: center;
}
}
@media (prefers-color-scheme: dark) {
.contributor-card:hover {
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
}
}
</style>
### 报告问题
如果你发现了 Bug 或有功能建议:
1. 在 [GitHub Issues](https://github.com/perfect-panel/frontend/issues) 中搜索是否已有类似问题
2. 如果没有,创建一个新的 Issue
3. 提供详细的信息:
- 问题描述
- 复现步骤
- 预期行为
- 实际行为
- 环境信息(浏览器、操作系统等)
- 截图或错误日志(如果适用)
### 文档贡献
文档同样重要!你可以:
- 修正错别字和语法错误
- 改进现有文档的清晰度
- 添加缺失的文档
- 翻译文档到其他语言
- 添加使用示例和教程
文档源文件位于 `/docs` 目录中。
### 翻译贡献
我们欢迎将 PPanel 翻译成更多语言:
1. 检查 `/docs` 目录下是否已有目标语言的文件夹
2. 如果没有,创建新的语言文件夹(如 `/docs/ja` 为日语)
3. 复制英文或中文版本作为基础
4. 翻译内容
5.`.vitepress/config.mts` 中添加新语言配置
6. 提交 Pull Request
## 社区
加入我们的社区,与其他开发者交流:
- **GitHub Discussions**: [讨论区](https://github.com/perfect-panel/frontend/discussions)
- **GitHub Issues**: [问题追踪](https://github.com/perfect-panel/frontend/issues)
- **Telegram**: [加入群组](https://t.me/PPanelChat)
## 行为准则
我们致力于为所有人提供一个友好、安全和受欢迎的环境。请阅读并遵守我们的 [行为准则](https://github.com/perfect-panel/frontend/blob/main/CODE_OF_CONDUCT.md)。
## 致谢
特别感谢所有为 PPanel 项目做出贡献的开发者、测试者、文档编写者和社区成员。是你们让 PPanel 变得更好!
## 许可证
通过贡献代码,你同意你的贡献将按照项目的 [GNU License](https://github.com/perfect-panel/frontend/blob/main/LICENSE) 许可证发布。
+507
View File
@@ -0,0 +1,507 @@
# 安装部署
本指南将帮助你使用 Docker 在服务器上部署 PPanel。
## 系统要求
### 最低配置
- **操作系统**: Linux (Ubuntu 20.04+, Debian 10+, CentOS 8+)
- **CPU**: 1 核心
- **内存**: 512MB RAM
- **存储**: 1GB 可用磁盘空间
- **Docker**: 20.10+
- **Docker Compose**: 2.0+ (可选,但推荐使用)
### 推荐配置
- **CPU**: 2+ 核心
- **内存**: 2GB+ RAM
- **存储**: 5GB+ 可用磁盘空间
## 前置条件
### 安装 Docker
如果你还没有安装 Docker,请按照官方安装指南进行安装:
**Ubuntu/Debian:**
```bash
# 更新包索引
sudo apt-get update
# 安装必要的依赖包
sudo apt-get install -y ca-certificates curl gnupg lsb-release
# 添加 Docker 官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 设置仓库
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装 Docker Engine
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
```
**CentOS/RHEL:**
```bash
# 安装 yum-utils
sudo yum install -y yum-utils
# 添加 Docker 仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装 Docker Engine
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 启动 Docker 服务
sudo systemctl start docker
sudo systemctl enable docker
```
### 验证安装
```bash
# 查看 Docker 版本
docker --version
# 查看 Docker Compose 版本
docker compose version
# 测试 Docker 安装
sudo docker run hello-world
```
## 快速开始
### 方式一:使用 Docker Run
#### 步骤 1: 拉取镜像
```bash
# 拉取最新版本
docker pull ppanel/ppanel:latest
# 或拉取指定版本
docker pull ppanel/ppanel:v0.1.2
```
#### 步骤 2: 准备配置
创建配置目录并准备配置文件:
```bash
# 创建配置目录
mkdir -p ppanel-config
# 创建配置文件
cat > ppanel-config/ppanel.yaml <<EOF
# PPanel 配置文件
server:
host: 0.0.0.0
port: 8080
database:
type: sqlite
path: /app/data/ppanel.db
# 根据需要添加更多配置
EOF
```
::: tip 提示
详细的配置选项请参考 [配置指南](/zh/guide/configuration)。
:::
#### 步骤 3: 运行容器
```bash
docker run -d \
--name ppanel \
-p 8080:8080 \
-v $(pwd)/ppanel-config:/app/etc:ro \
-v ppanel-data:/app/data \
--restart unless-stopped \
ppanel/ppanel:latest
```
**参数说明:**
- `-d`: 以守护进程模式运行容器(后台运行)
- `--name ppanel`: 设置容器名称
- `-p 8080:8080`: 将容器的 8080 端口映射到宿主机的 8080 端口
- `-v $(pwd)/ppanel-config:/app/etc:ro`: 挂载配置目录(只读)
- `-v ppanel-data:/app/data`: 创建数据卷用于持久化存储
- `--restart unless-stopped`: 容器自动重启(除非手动停止)
#### 步骤 4: 验证运行状态
```bash
# 查看容器状态
docker ps | grep ppanel
# 查看日志
docker logs -f ppanel
# 测试服务是否可访问
curl http://localhost:8080
```
### 方式二:使用 Docker Compose(推荐)
#### 步骤 1: 创建 docker-compose.yml
```yaml
version: '3.8'
services:
ppanel:
image: ppanel/ppanel:latest
container_name: ppanel
ports:
- "8080:8080"
volumes:
- ./ppanel-config:/app/etc:ro
- ppanel-data:/app/data
restart: unless-stopped
environment:
- TZ=Asia/Shanghai
healthcheck:
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:8080/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
volumes:
ppanel-data:
driver: local
```
#### 步骤 2: 准备配置
```bash
# 创建配置目录
mkdir -p ppanel-config
# 复制或创建配置文件
# 详细配置请参考配置指南
```
#### 步骤 3: 启动服务
```bash
# 以守护进程模式启动
docker compose up -d
# 查看日志
docker compose logs -f
# 查看状态
docker compose ps
```
## 部署后配置
### 访问应用
安装成功后,你可以通过以下地址访问:
- **用户面板**: `http://your-server-ip:8080`
- **管理后台**: `http://your-server-ip:8080/admin`
::: warning 默认凭据
为了安全起见,首次登录后请立即修改默认管理员密码。
:::
### 配置反向代理(可选)
对于生产环境部署,建议使用 Nginx 或 Caddy 作为反向代理以启用 HTTPS。
**Nginx 示例:**
```nginx
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
```
**Caddy 示例:**
```
your-domain.com {
reverse_proxy localhost:8080
}
```
## 容器管理
### 查看日志
```bash
# Docker Run
docker logs -f ppanel
# Docker Compose
docker compose logs -f
```
### 停止容器
```bash
# Docker Run
docker stop ppanel
# Docker Compose
docker compose stop
```
### 重启容器
```bash
# Docker Run
docker restart ppanel
# Docker Compose
docker compose restart
```
### 删除容器
```bash
# Docker Run
docker stop ppanel
docker rm ppanel
# Docker Compose
docker compose down
```
::: warning 数据持久化
删除容器不会删除数据卷。如需同时删除数据卷,请使用:
```bash
docker compose down -v
```
:::
## 升级
### 备份配置
升级前,请先备份配置和数据:
```bash
# 备份配置
tar czf ppanel-config-backup-$(date +%Y%m%d).tar.gz ppanel-config/
# 备份数据卷
docker run --rm \
-v ppanel-data:/data \
-v $(pwd):/backup \
alpine tar czf /backup/ppanel-data-backup-$(date +%Y%m%d).tar.gz /data
```
### 升级步骤
#### 使用 Docker Run
```bash
# 拉取最新镜像
docker pull ppanel/ppanel:latest
# 停止并删除旧容器
docker stop ppanel
docker rm ppanel
# 使用相同配置启动新容器
docker run -d \
--name ppanel \
-p 8080:8080 \
-v $(pwd)/ppanel-config:/app/etc:ro \
-v ppanel-data:/app/data \
--restart unless-stopped \
ppanel/ppanel:latest
```
#### 使用 Docker Compose
```bash
# 拉取最新镜像
docker compose pull
# 使用新镜像重新创建容器
docker compose up -d
```
### 验证升级
```bash
# 检查容器是否正在运行
docker ps | grep ppanel
# 检查日志是否有错误
docker logs ppanel
# 验证应用是否可访问
curl http://localhost:8080
```
## 故障排除
### 容器立即退出
**检查架构兼容性:**
```bash
# 查看主机架构
uname -m
# 查看镜像架构
docker image inspect ppanel/ppanel:latest --format '{{.Architecture}}'
```
**查看日志:**
```bash
docker logs ppanel
```
### 无法访问服务
1. **检查容器是否运行:**
```bash
docker ps | grep ppanel
```
2. **检查端口映射:**
```bash
docker port ppanel
```
3. **检查防火墙规则:**
```bash
# Ubuntu/Debian
sudo ufw status
sudo ufw allow 8080
# CentOS/RHEL
sudo firewall-cmd --list-ports
sudo firewall-cmd --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
```
### 配置未生效
1. **验证挂载路径:**
```bash
docker exec ppanel ls -la /app/etc
```
2. **检查配置语法:**
```bash
docker exec ppanel cat /app/etc/ppanel.yaml
```
3. **重启容器:**
```bash
docker restart ppanel
```
### 性能问题
1. **检查资源使用情况:**
```bash
docker stats ppanel
```
2. **增加容器资源**(如果使用 Docker Desktop:
- 打开 Docker Desktop 设置
- 转到 Resources(资源)
- 增加 CPU 和内存分配
3. **检查磁盘空间:**
```bash
df -h
docker system df
```
## 高级配置
### 使用环境变量
你可以通过环境变量覆盖配置:
```bash
docker run -d \
--name ppanel \
-p 8080:8080 \
-e SERVER_PORT=8080 \
-e DATABASE_TYPE=sqlite \
-v $(pwd)/ppanel-config:/app/etc:ro \
-v ppanel-data:/app/data \
--restart unless-stopped \
ppanel/ppanel:latest
```
### 运行多个实例
要运行多个实例,请使用不同的端口和容器名称:
```bash
# 实例 1
docker run -d \
--name ppanel-1 \
-p 8081:8080 \
-v $(pwd)/ppanel-config-1:/app/etc:ro \
-v ppanel-data-1:/app/data \
ppanel/ppanel:latest
# 实例 2
docker run -d \
--name ppanel-2 \
-p 8082:8080 \
-v $(pwd)/ppanel-config-2:/app/etc:ro \
-v ppanel-data-2:/app/data \
ppanel/ppanel:latest
```
### 自定义网络
创建自定义 Docker 网络以获得更好的隔离:
```bash
# 创建网络
docker network create ppanel-net
# 在自定义网络上运行容器
docker run -d \
--name ppanel \
--network ppanel-net \
-p 8080:8080 \
-v $(pwd)/ppanel-config:/app/etc:ro \
-v ppanel-data:/app/data \
ppanel/ppanel:latest
```
## 下一步
- [配置指南](/zh/guide/configuration) - 了解详细的配置选项
- [管理后台](/zh/admin/dashboard) - 开始管理你的面板
- [API 参考](/zh/api/reference) - 集成 PPanel API
## 需要帮助?
如果遇到任何问题:
1. 查看上面的[故障排除](#故障排除)部分
2. 搜索 [GitHub Issues](https://github.com/perfect-panel/ppanel/issues)
3. 加入我们的社区讨论
4. 创建新 issue 并附上详细的日志和系统信息
+585
View File
@@ -0,0 +1,585 @@
# 二进制部署
本指南介绍如何使用预编译的二进制可执行文件部署 PPanel。此方法适合不想使用 Docker 或需要更多部署控制权的用户。
## 前置条件
- **操作系统**: Linux (Ubuntu 20.04+, Debian 10+, CentOS 8+)
- **架构**: amd64 (x86_64) 或 arm64
- **权限**: Root 或 sudo 访问权限
- **依赖**: 无(二进制文件静态编译)
## 下载二进制文件
### 步骤 1: 检查系统架构
```bash
# 查看系统架构
uname -m
# 输出: x86_64 (amd64) 或 aarch64 (arm64)
```
### 步骤 2: 下载最新版本
访问 [GitHub Releases](https://github.com/perfect-panel/ppanel/releases) 页面或直接下载:
```bash
# 创建安装目录
sudo mkdir -p /opt/ppanel
cd /opt/ppanel
# 下载 Linux amd64 版本
wget https://github.com/perfect-panel/ppanel/releases/latest/download/ppanel-linux-amd64.tar.gz
# 或下载 Linux arm64 版本
# wget https://github.com/perfect-panel/ppanel/releases/latest/download/ppanel-linux-arm64.tar.gz
# 解压
tar -xzf ppanel-linux-amd64.tar.gz
# 验证解压的文件
ls -la
```
预期的文件结构:
```
/opt/ppanel/
├── ppanel-server # 主服务器二进制文件
├── gateway # 网关二进制文件
└── etc/ # 配置目录
└── ppanel.yaml # 配置文件
```
## 配置
### 步骤 1: 准备配置
```bash
# 复制示例配置
sudo cp etc/ppanel.yaml etc/ppanel.yaml.backup
# 编辑配置
sudo nano etc/ppanel.yaml
```
**基础配置示例:**
```yaml
server:
host: 0.0.0.0
port: 8080
mode: release # debug, release, 或 test
database:
type: sqlite
path: /opt/ppanel/data/ppanel.db
# MySQL/PostgreSQL 配置:
# type: mysql
# host: localhost
# port: 3306
# user: ppanel
# password: your_password
# database: ppanel
log:
level: info # debug, info, warn, error
path: /opt/ppanel/logs
gateway:
port: 8080
timeout: 30s
```
### 步骤 2: 创建必要的目录
```bash
# 创建数据和日志目录
sudo mkdir -p /opt/ppanel/data
sudo mkdir -p /opt/ppanel/logs
# 设置适当的权限
sudo chmod 755 /opt/ppanel
sudo chmod 700 /opt/ppanel/data
sudo chmod 755 /opt/ppanel/logs
```
## 运行服务
### 方式一: 直接运行(测试用)
用于快速测试:
```bash
# 使二进制文件可执行
sudo chmod +x /opt/ppanel/ppanel-server
sudo chmod +x /opt/ppanel/gateway
# 直接运行服务器
cd /opt/ppanel
sudo ./ppanel-server
# 在另一个终端运行网关(如果分离)
# sudo ./gateway
```
`Ctrl+C` 停止。
### 方式二: Systemd 服务(推荐)
为生产环境部署创建 systemd 服务:
#### 步骤 1: 创建服务文件
```bash
sudo nano /etc/systemd/system/ppanel.service
```
**服务文件内容:**
```ini
[Unit]
Description=PPanel Server
Documentation=https://github.com/perfect-panel/ppanel
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/ppanel
ExecStart=/opt/ppanel/ppanel-server
Restart=always
RestartSec=10
# 安全设置
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/opt/ppanel/data /opt/ppanel/logs
# 资源限制
LimitNOFILE=65535
LimitNPROC=4096
# 日志
StandardOutput=journal
StandardError=journal
SyslogIdentifier=ppanel
[Install]
WantedBy=multi-user.target
```
#### 步骤 2: 启用并启动服务
```bash
# 重新加载 systemd
sudo systemctl daemon-reload
# 启用服务(开机自启)
sudo systemctl enable ppanel
# 启动服务
sudo systemctl start ppanel
# 检查状态
sudo systemctl status ppanel
```
## 服务管理
### 检查状态
```bash
# 检查服务是否运行
sudo systemctl status ppanel
# 查看详细状态
sudo systemctl show ppanel
```
### 查看日志
```bash
# 查看 systemd 日志
sudo journalctl -u ppanel -f
# 查看最后 100 行
sudo journalctl -u ppanel -n 100
# 查看应用日志
sudo tail -f /opt/ppanel/logs/ppanel.log
```
### 启动/停止/重启
```bash
# 启动服务
sudo systemctl start ppanel
# 停止服务
sudo systemctl stop ppanel
# 重启服务
sudo systemctl restart ppanel
# 重新加载配置(如果支持)
sudo systemctl reload ppanel
```
### 启用/禁用自动启动
```bash
# 启用开机自启
sudo systemctl enable ppanel
# 禁用自动启动
sudo systemctl disable ppanel
# 检查是否已启用
sudo systemctl is-enabled ppanel
```
## 部署后配置
### 验证安装
```bash
# 检查服务是否监听端口
sudo netstat -tlnp | grep 8080
# 或使用 ss
sudo ss -tlnp | grep 8080
# 测试 HTTP 访问
curl http://localhost:8080
# 检查进程
ps aux | grep ppanel
```
### 访问应用
- **用户面板**: `http://your-server-ip:8080`
- **管理后台**: `http://your-server-ip:8080/admin`
### 配置防火墙
```bash
# Ubuntu/Debian (UFW)
sudo ufw allow 8080/tcp
sudo ufw status
# CentOS/RHEL (firewalld)
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports
```
### 设置反向代理
生产环境建议使用 Nginx 或 Caddy 作为反向代理:
**Nginx 配置** (`/etc/nginx/sites-available/ppanel`):
```nginx
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket 支持
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
```
启用配置:
```bash
sudo ln -s /etc/nginx/sites-available/ppanel /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
```
## 升级
### 升级前备份
```bash
# 停止服务
sudo systemctl stop ppanel
# 备份当前版本
sudo cp -r /opt/ppanel /opt/ppanel-backup-$(date +%Y%m%d)
# 备份数据库
sudo cp /opt/ppanel/data/ppanel.db /opt/ppanel/data/ppanel.db.backup-$(date +%Y%m%d)
# 备份配置
sudo cp /opt/ppanel/etc/ppanel.yaml /opt/ppanel/etc/ppanel.yaml.backup-$(date +%Y%m%d)
```
### 下载并安装新版本
```bash
# 下载新版本
cd /tmp
wget https://github.com/perfect-panel/ppanel/releases/latest/download/ppanel-linux-amd64.tar.gz
# 解压到临时位置
mkdir ppanel-new
tar -xzf ppanel-linux-amd64.tar.gz -C ppanel-new
# 备份旧的二进制文件
sudo mv /opt/ppanel/ppanel-server /opt/ppanel/ppanel-server.old
sudo mv /opt/ppanel/gateway /opt/ppanel/gateway.old
# 安装新的二进制文件
sudo cp ppanel-new/ppanel-server /opt/ppanel/
sudo cp ppanel-new/gateway /opt/ppanel/
# 设置权限
sudo chmod +x /opt/ppanel/ppanel-server
sudo chmod +x /opt/ppanel/gateway
# 启动服务
sudo systemctl start ppanel
# 检查状态
sudo systemctl status ppanel
```
### 回滚
如果升级失败:
```bash
# 停止服务
sudo systemctl stop ppanel
# 恢复旧的二进制文件
sudo mv /opt/ppanel/ppanel-server.old /opt/ppanel/ppanel-server
sudo mv /opt/ppanel/gateway.old /opt/ppanel/gateway
# 恢复数据库(如需要)
sudo cp /opt/ppanel/data/ppanel.db.backup-YYYYMMDD /opt/ppanel/data/ppanel.db
# 启动服务
sudo systemctl start ppanel
```
## 故障排除
### 服务启动失败
```bash
# 查看详细日志
sudo journalctl -u ppanel -xe
# 检查配置语法
/opt/ppanel/ppanel-server --check-config
# 验证权限
ls -la /opt/ppanel
sudo chown -R root:root /opt/ppanel
```
### 端口被占用
```bash
# 查找占用端口的进程
sudo lsof -i :8080
sudo netstat -tlnp | grep 8080
# 在配置中更改端口
sudo nano /opt/ppanel/etc/ppanel.yaml
# 更新 server.port 值
# 重启服务
sudo systemctl restart ppanel
```
### 二进制文件无法执行
```bash
# 检查架构兼容性
uname -m
file /opt/ppanel/ppanel-server
# 检查是否可执行
ls -la /opt/ppanel/ppanel-server
sudo chmod +x /opt/ppanel/ppanel-server
# 检查缺失的库(静态编译应该没有)
ldd /opt/ppanel/ppanel-server
```
### 内存使用过高
```bash
# 检查内存使用
ps aux | grep ppanel
top -p $(pgrep ppanel-server)
# 在 systemd 服务中添加内存限制
sudo nano /etc/systemd/system/ppanel.service
# 在 [Service] 下添加:
# MemoryMax=2G
# MemoryHigh=1.5G
sudo systemctl daemon-reload
sudo systemctl restart ppanel
```
### 数据库连接问题
```bash
# 检查数据库文件权限
ls -la /opt/ppanel/data/
# 对于 SQLite,验证配置中的路径
sudo nano /opt/ppanel/etc/ppanel.yaml
# 测试数据库连接
sqlite3 /opt/ppanel/data/ppanel.db "SELECT 1;"
# 检查日志中的数据库错误
sudo journalctl -u ppanel | grep -i database
```
## 卸载
完全移除 PPanel
```bash
# 停止并禁用服务
sudo systemctl stop ppanel
sudo systemctl disable ppanel
# 删除服务文件
sudo rm /etc/systemd/system/ppanel.service
sudo systemctl daemon-reload
# 删除安装目录
sudo rm -rf /opt/ppanel
# 删除防火墙规则(如果添加过)
sudo ufw delete allow 8080/tcp
# 或
sudo firewall-cmd --permanent --remove-port=8080/tcp
sudo firewall-cmd --reload
```
## 高级配置
### 以非 Root 用户运行
为了更好的安全性,使用专用用户运行:
```bash
# 创建专用用户
sudo useradd -r -s /bin/false ppanel
# 更改所有权
sudo chown -R ppanel:ppanel /opt/ppanel
# 更新 systemd 服务
sudo nano /etc/systemd/system/ppanel.service
# 更改: User=ppanel
# 如果绑定到端口 < 1024,授予能力
sudo setcap 'cap_net_bind_service=+ep' /opt/ppanel/ppanel-server
sudo systemctl daemon-reload
sudo systemctl restart ppanel
```
### 多实例部署
运行多个实例:
```bash
# 创建独立目录
sudo mkdir -p /opt/ppanel-1
sudo mkdir -p /opt/ppanel-2
# 复制二进制文件和配置
sudo cp -r /opt/ppanel/* /opt/ppanel-1/
sudo cp -r /opt/ppanel/* /opt/ppanel-2/
# 编辑配置使用不同端口
sudo nano /opt/ppanel-1/etc/ppanel.yaml # port: 8081
sudo nano /opt/ppanel-2/etc/ppanel.yaml # port: 8082
# 创建独立的 systemd 服务
sudo cp /etc/systemd/system/ppanel.service /etc/systemd/system/ppanel-1.service
sudo cp /etc/systemd/system/ppanel.service /etc/systemd/system/ppanel-2.service
# 相应编辑服务文件
sudo systemctl daemon-reload
sudo systemctl enable ppanel-1 ppanel-2
sudo systemctl start ppanel-1 ppanel-2
```
### 自定义环境变量
在 systemd 服务中添加环境变量:
```ini
[Service]
Environment="PPANEL_ENV=production"
Environment="PPANEL_DEBUG=false"
EnvironmentFile=/opt/ppanel/env.conf
```
## 性能调优
### 优化文件限制
```bash
# 编辑限制
sudo nano /etc/security/limits.conf
# 添加:
* soft nofile 65535
* hard nofile 65535
# systemd 服务中已设置:
# LimitNOFILE=65535
```
### 启用数据库优化
对于 SQLite
```bash
# 在 ppanel.yaml 中添加
database:
type: sqlite
path: /opt/ppanel/data/ppanel.db
options:
cache_size: -2000
journal_mode: WAL
synchronous: NORMAL
```
## 下一步
- [配置指南](/zh/guide/configuration) - 详细的配置选项
- [管理后台](/zh/admin/dashboard) - 开始管理你的面板
- [API 参考](/zh/api/reference) - API 集成
## 需要帮助?
- 查看 [GitHub Issues](https://github.com/perfect-panel/ppanel/issues)
- 查看 systemd 日志: `sudo journalctl -u ppanel -f`
- 查看应用日志: `tail -f /opt/ppanel/logs/ppanel.log`
@@ -0,0 +1,443 @@
# Docker Compose 部署
Docker Compose 是生产环境推荐的部署方式。它提供更好的服务管理、更简单的配置和更便捷的升级流程。
## 前置条件
### 安装 Docker
如果你还没有安装 Docker,请按照官方安装指南进行安装:
**Ubuntu/Debian:**
```bash
# 更新包索引
sudo apt-get update
# 安装必要的依赖包
sudo apt-get install -y ca-certificates curl gnupg lsb-release
# 添加 Docker 官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 设置仓库
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装 Docker Engine
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
```
**CentOS/RHEL:**
```bash
# 安装 yum-utils
sudo yum install -y yum-utils
# 添加 Docker 仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装 Docker Engine
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 启动 Docker 服务
sudo systemctl start docker
sudo systemctl enable docker
```
### 验证安装
```bash
# 查看 Docker 版本
docker --version
# 查看 Docker Compose 版本
docker compose version
# 测试 Docker 安装
sudo docker run hello-world
```
## 部署步骤
### 步骤 1: 创建项目目录
```bash
# 创建项目目录
mkdir -p ~/ppanel
cd ~/ppanel
```
### 步骤 2: 创建 docker-compose.yml
创建 `docker-compose.yml` 文件,内容如下:
```yaml
version: '3.8'
services:
ppanel:
image: ppanel/ppanel:latest
container_name: ppanel
ports:
- "8080:8080"
volumes:
- ./ppanel-config:/app/etc:ro
- ppanel-data:/app/data
restart: unless-stopped
environment:
- TZ=Asia/Shanghai
healthcheck:
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:8080/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
volumes:
ppanel-data:
driver: local
```
**配置说明:**
- **image**: 使用的 Docker 镜像(latest 或指定版本如 `v0.1.2`
- **ports**: 将容器的 8080 端口映射到宿主机的 8080 端口
- **volumes**:
- `./ppanel-config:/app/etc:ro` - 配置目录(只读)
- `ppanel-data:/app/data` - 持久化数据存储
- **restart**: 自动重启策略
- **environment**: 设置时区(可改为 `Asia/Shanghai` 等)
- **healthcheck**: 服务健康检查
### 步骤 3: 准备配置
```bash
# 创建配置目录
mkdir -p ppanel-config
# 创建配置文件
cat > ppanel-config/ppanel.yaml <<EOF
# PPanel 配置文件
server:
host: 0.0.0.0
port: 8080
database:
type: sqlite
path: /app/data/ppanel.db
# 根据需要添加更多配置
EOF
```
::: tip 提示
详细的配置选项请参考 [配置指南](/zh/guide/configuration)。
:::
### 步骤 4: 启动服务
```bash
# 拉取最新镜像
docker compose pull
# 以守护进程模式启动
docker compose up -d
# 查看日志
docker compose logs -f
```
### 步骤 5: 验证部署
```bash
# 查看服务状态
docker compose ps
# 测试服务是否可访问
curl http://localhost:8080
# 查看实时日志
docker compose logs -f ppanel
```
## 部署后配置
### 访问应用
安装成功后,你可以通过以下地址访问:
- **用户面板**: `http://your-server-ip:8080`
- **管理后台**: `http://your-server-ip:8080/admin`
::: warning 默认凭据
为了安全起见,首次登录后请立即修改默认管理员密码。
:::
### 配置反向代理(推荐)
对于生产环境部署,建议使用 Nginx 或 Caddy 作为反向代理以启用 HTTPS。
**Nginx 配置:**
```nginx
server {
listen 80;
server_name your-domain.com;
# 重定向到 HTTPS
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name your-domain.com;
ssl_certificate /path/to/your/certificate.crt;
ssl_certificate_key /path/to/your/private.key;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
}
}
```
**Caddy 配置:**
```
your-domain.com {
reverse_proxy localhost:8080
}
```
::: tip 提示
Caddy 会通过 Let's Encrypt 自动处理 SSL 证书。
:::
## 服务管理
### 查看日志
```bash
# 查看所有日志
docker compose logs
# 实时跟踪日志
docker compose logs -f
# 查看特定服务日志
docker compose logs ppanel
```
### 停止服务
```bash
# 停止所有服务
docker compose stop
# 停止特定服务
docker compose stop ppanel
```
### 重启服务
```bash
# 重启所有服务
docker compose restart
# 重启特定服务
docker compose restart ppanel
```
### 停止并删除服务
```bash
# 停止并删除容器
docker compose down
# 停止并删除容器和数据卷
docker compose down -v
```
::: warning 数据持久化
使用 `docker compose down -v` 会删除所有数据卷。只有在想完全清除所有数据时才使用此命令。
:::
## 升级
### 升级前备份
```bash
# 备份配置
tar czf ppanel-config-backup-$(date +%Y%m%d).tar.gz ppanel-config/
# 备份数据卷
docker run --rm \
-v ppanel_ppanel-data:/data \
-v $(pwd):/backup \
alpine tar czf /backup/ppanel-data-backup-$(date +%Y%m%d).tar.gz /data
```
### 升级步骤
```bash
# 拉取最新镜像
docker compose pull
# 使用新镜像重新创建容器
docker compose up -d
# 查看日志验证
docker compose logs -f
```
### 回滚
如果升级后遇到问题:
```bash
# 编辑 docker-compose.yml,将镜像改为之前的版本
# image: ppanel/ppanel:v0.1.1
# 使用之前的版本重启
docker compose up -d
```
## 高级配置
### 自定义端口
要使用不同的端口,编辑 `docker-compose.yml`
```yaml
ports:
- "3000:8080" # 宿主机端口 3000 -> 容器端口 8080
```
### 多实例部署
要运行多个实例,创建独立的目录:
```bash
# 实例 1
mkdir ~/ppanel-1
cd ~/ppanel-1
# 创建 docker-compose.yml,使用端口 8081
# 实例 2
mkdir ~/ppanel-2
cd ~/ppanel-2
# 创建 docker-compose.yml,使用端口 8082
```
### 资源限制
添加资源限制以防止过度消耗:
```yaml
services:
ppanel:
# ... 其他配置 ...
deploy:
resources:
limits:
cpus: '2'
memory: 2G
reservations:
cpus: '0.5'
memory: 512M
```
### 自定义网络
创建自定义网络以获得更好的隔离:
```yaml
version: '3.8'
services:
ppanel:
# ... 其他配置 ...
networks:
- ppanel-net
networks:
ppanel-net:
driver: bridge
```
## 故障排除
### 容器启动失败
```bash
# 查看错误日志
docker compose logs ppanel
# 检查容器状态
docker compose ps
# 验证配置
docker compose config
```
### 端口被占用
```bash
# 检查什么在使用该端口
sudo lsof -i :8080
# 在 docker-compose.yml 中更改端口
# ports:
# - "8081:8080"
```
### 权限问题
```bash
# 修复配置目录权限
sudo chown -R $USER:$USER ppanel-config/
# 确保文件可读
chmod 644 ppanel-config/ppanel.yaml
```
### 无法从外部访问
1. **检查防火墙规则:**
```bash
# Ubuntu/Debian
sudo ufw allow 8080
# CentOS/RHEL
sudo firewall-cmd --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
```
2. **验证服务是否监听:**
```bash
docker compose ps
netstat -tlnp | grep 8080
```
## 下一步
- [配置指南](/zh/guide/configuration) - 详细的配置选项
- [管理后台](/zh/admin/dashboard) - 开始管理你的面板
- [API 参考](/zh/api/reference) - API 集成指南
## 需要帮助?
如果遇到任何问题:
1. 查看上面的[故障排除](#故障排除)部分
2. 查看 [Docker Compose 日志](#查看日志)
3. 搜索 [GitHub Issues](https://github.com/perfect-panel/ppanel/issues)
4. 创建新 issue 并附上详细的系统信息和日志
+348
View File
@@ -0,0 +1,348 @@
# Docker Run 部署
本指南介绍如何使用 `docker run` 命令部署 PPanel。此方法适合快速测试或简单部署。
::: tip 提示
对于生产环境,我们推荐使用 [Docker Compose](/zh/guide/installation/docker-compose)。
:::
## 前置条件
### 安装 Docker
**Ubuntu/Debian:**
```bash
# 更新包索引
sudo apt-get update
# 安装 Docker
sudo apt-get install -y ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
```
**CentOS/RHEL:**
```bash
# 安装 Docker
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
# 启动 Docker
sudo systemctl start docker
sudo systemctl enable docker
```
### 验证安装
```bash
docker --version
sudo docker run hello-world
```
## 快速开始
### 步骤 1: 拉取镜像
```bash
# 拉取最新版本
docker pull ppanel/ppanel:latest
# 或拉取指定版本
docker pull ppanel/ppanel:v0.1.2
```
### 步骤 2: 准备配置
```bash
# 创建配置目录
mkdir -p ~/ppanel-config
# 创建配置文件
cat > ~/ppanel-config/ppanel.yaml <<EOF
server:
host: 0.0.0.0
port: 8080
database:
type: sqlite
path: /app/data/ppanel.db
EOF
```
### 步骤 3: 运行容器
**基础命令:**
```bash
docker run -d \
--name ppanel \
-p 8080:8080 \
-v ~/ppanel-config:/app/etc:ro \
-v ppanel-data:/app/data \
--restart unless-stopped \
ppanel/ppanel:latest
```
**完整参数命令:**
```bash
docker run -d \
--name ppanel \
-p 8080:8080 \
-v ~/ppanel-config:/app/etc:ro \
-v ppanel-data:/app/data \
-e TZ=Asia/Shanghai \
--restart unless-stopped \
--memory="2g" \
--cpus="2" \
ppanel/ppanel:latest
```
**参数说明:**
- `-d`: 以守护进程模式运行(后台运行)
- `--name ppanel`: 设置容器名称
- `-p 8080:8080`: 端口映射(宿主机:容器)
- `-v ~/ppanel-config:/app/etc:ro`: 挂载配置(只读)
- `-v ppanel-data:/app/data`: 创建数据卷
- `-e TZ=Asia/Shanghai`: 设置时区
- `--restart unless-stopped`: 自动重启策略
- `--memory="2g"`: 内存限制
- `--cpus="2"`: CPU 限制
### 步骤 4: 验证运行
```bash
# 查看容器状态
docker ps | grep ppanel
# 查看日志
docker logs -f ppanel
# 测试访问
curl http://localhost:8080
```
## 容器管理
### 查看日志
```bash
# 查看所有日志
docker logs ppanel
# 实时跟踪日志
docker logs -f ppanel
# 查看最后 100 行
docker logs --tail 100 ppanel
# 显示时间戳
docker logs -t ppanel
```
### 停止容器
```bash
docker stop ppanel
```
### 启动容器
```bash
docker start ppanel
```
### 重启容器
```bash
docker restart ppanel
```
### 删除容器
```bash
# 停止并删除
docker stop ppanel
docker rm ppanel
```
::: warning 注意
删除容器不会删除数据卷。要删除数据卷:
```bash
docker volume rm ppanel-data
```
:::
## 升级
### 备份数据
```bash
# 备份配置
tar czf ppanel-config-backup-$(date +%Y%m%d).tar.gz ~/ppanel-config/
# 备份数据卷
docker run --rm \
-v ppanel-data:/data \
-v $(pwd):/backup \
alpine tar czf /backup/ppanel-data-backup-$(date +%Y%m%d).tar.gz /data
```
### 升级流程
```bash
# 拉取最新镜像
docker pull ppanel/ppanel:latest
# 停止旧容器
docker stop ppanel
# 删除旧容器
docker rm ppanel
# 使用相同配置启动新容器
docker run -d \
--name ppanel \
-p 8080:8080 \
-v ~/ppanel-config:/app/etc:ro \
-v ppanel-data:/app/data \
--restart unless-stopped \
ppanel/ppanel:latest
# 验证
docker logs -f ppanel
```
## 高级用法
### 自定义网络
```bash
# 创建网络
docker network create ppanel-net
# 在自定义网络上运行
docker run -d \
--name ppanel \
--network ppanel-net \
-p 8080:8080 \
-v ~/ppanel-config:/app/etc:ro \
-v ppanel-data:/app/data \
ppanel/ppanel:latest
```
### 环境变量
```bash
docker run -d \
--name ppanel \
-p 8080:8080 \
-e SERVER_PORT=8080 \
-e DATABASE_TYPE=sqlite \
-e TZ=Asia/Shanghai \
-v ~/ppanel-config:/app/etc:ro \
-v ppanel-data:/app/data \
ppanel/ppanel:latest
```
### 多实例部署
```bash
# 实例 1 使用端口 8081
docker run -d \
--name ppanel-1 \
-p 8081:8080 \
-v ~/ppanel-config-1:/app/etc:ro \
-v ppanel-data-1:/app/data \
ppanel/ppanel:latest
# 实例 2 使用端口 8082
docker run -d \
--name ppanel-2 \
-p 8082:8080 \
-v ~/ppanel-config-2:/app/etc:ro \
-v ppanel-data-2:/app/data \
ppanel/ppanel:latest
```
### 资源限制
```bash
docker run -d \
--name ppanel \
-p 8080:8080 \
--memory="2g" \
--memory-swap="2g" \
--cpus="2" \
--pids-limit=100 \
-v ~/ppanel-config:/app/etc:ro \
-v ppanel-data:/app/data \
ppanel/ppanel:latest
```
## 故障排除
### 容器立即退出
```bash
# 查看日志
docker logs ppanel
# 检查架构
uname -m
docker image inspect ppanel/ppanel:latest --format '{{.Architecture}}'
```
### 端口被占用
```bash
# 检查什么在使用该端口
sudo lsof -i :8080
# 使用不同端口
docker run -d --name ppanel -p 8081:8080 ...
```
### 配置未加载
```bash
# 验证挂载
docker exec ppanel ls -la /app/etc
# 查看文件内容
docker exec ppanel cat /app/etc/ppanel.yaml
# 检查权限
ls -la ~/ppanel-config/
```
### 进入容器 Shell
```bash
# 进入 bash(如果可用)
docker exec -it ppanel bash
# 进入 sh
docker exec -it ppanel sh
# 运行命令
docker exec ppanel ls -la /app
```
## 下一步
- 尝试 [Docker Compose](/zh/guide/installation/docker-compose) 以获得更简单的管理方式
- 配置[反向代理](/zh/guide/installation/docker-compose#配置反向代理)
- 了解[配置选项](/zh/guide/configuration)
## 需要帮助?
- 查看 [GitHub Issues](https://github.com/perfect-panel/ppanel/issues)
- 查看 Docker 日志: `docker logs ppanel`
- 验证系统要求
+57
View File
@@ -0,0 +1,57 @@
# 安装概览
PPanel 支持多种部署方式,以适应不同的需求和环境。选择最适合你需求的部署方式。
## 部署方式
### Docker 部署(推荐)
最简单、最可靠的部署方式。Docker 确保环境一致性并简化更新流程。
- **[Docker Run](/zh/guide/installation/docker-run)** - 单命令快速部署
- **[Docker Compose](/zh/guide/installation/docker-compose)** - 生产环境推荐,更好的管理方式
### 传统部署
- **[二进制部署](/zh/guide/installation/binary)** - 使用预编译二进制文件和 systemd 服务部署
### 高级部署
- **[Kubernetes](/zh/guide/installation/kubernetes)** - 在 Kubernetes 集群中部署 PPanel 以实现高可用
- **[源码部署](/zh/guide/installation/from-source)** - 从源码构建并运行 PPanel
## 系统要求
### 最低配置
- **操作系统**: Linux (Ubuntu 20.04+, Debian 10+, CentOS 8+)
- **CPU**: 1 核心
- **内存**: 512MB RAM
- **存储**: 1GB 可用磁盘空间
### 推荐配置
- **CPU**: 2+ 核心
- **内存**: 2GB+ RAM
- **存储**: 5GB+ 可用磁盘空间
## 前置条件
所有部署方式都需要:
- 基于 Linux 的操作系统
- 基本的命令行知识
- 网络访问以下载软件包/镜像
具体的前置条件因部署方式而异 - 请查看各个指南了解详情。
## 快速开始
对于大多数用户,我们推荐从 Docker Compose 开始:
1. [安装 Docker 和 Docker Compose](/zh/guide/installation/docker-compose#前置条件)
2. [下载配置文件](/zh/guide/installation/docker-compose#下载配置)
3. [启动服务](/zh/guide/installation/docker-compose#启动服务)
## 需要帮助?
- 查看我们的[故障排除指南](/zh/guide/troubleshooting)
- 访问 [GitHub Issues](https://github.com/perfect-panel/ppanel/issues)
- 加入我们的社区讨论
+93
View File
@@ -0,0 +1,93 @@
# 简介
欢迎使用 PPanel!这是一个纯粹、专业、完美的开源代理面板工具,旨在为用户提供完整的管理解决方案。
## 什么是 PPanel
PPanel 是一个现代化的代理面板系统,采用前后端分离架构,提供完整的用户管理、订阅服务、订单管理、节点管理等功能。无论您是个人用户还是企业用户,PPanel 都能满足您的需求。
## 核心特性
- **🎯 完整管理**: 服务器管理、节点配置、订阅系统、产品管理等
- **💼 商务运营**: 订单管理、优惠券系统、营销活动、公告发布
- **👥 用户支持**: 用户管理、工单系统、文档中心,提供全方位用户服务
- **📊 数据分析**: 12 种类型日志,全面的流量、余额、佣金数据分析
- **🔧 灵活配置**: 支付配置、认证控制、广告管理,灵活的系统选项
- **🚀 现代技术栈**: 基于 React 19 + TypeScript + TailwindCSS + shadcn/ui 构建
## 术语说明
PPanel 的一些术语与其他面板系统存在差异,为确保您能准确理解文档内容并避免误解,建议在阅读前先了解以下术语:
### 用户端
为最终用户提供的界面,用户通过该界面与系统进行交互。您可以根据需求自定义或重构该界面,实现站点的个性化定制。
### 管理端
用于管理员操作的界面,负责管理系统、用户及数据。您可以根据需求对该界面进行定制或重构,以适应您的管理需求。
### 服务端
PPanel 的 API 层,处理与前端的所有数据交互,负责业务逻辑的执行与数据服务的提供。
### 节点端
负责 PPanel 服务端与各节点(落地端)的通信,确保网络节点的连接与服务的稳定性。
### 客户端
用户用来连接系统的应用程序,通常是指用户的设备端软件或应用,负责与系统建立连接并使用相关服务。
## 项目架构
PPanel 采用 Monorepo 架构,便于统一管理和维护:
### 前端应用
- **apps/admin**: 管理后台应用,提供完整的后台管理功能
- **apps/user**: 用户端应用,为最终用户提供服务界面
### 共享包
- **packages/ui**: 共享 UI 组件库,包含所有可复用的 UI 组件
- **packages/typescript-config**: 统一的 TypeScript 配置
### 技术栈
- **框架**: React 19 + TypeScript
- **路由**: TanStack Router
- **状态管理**: Zustand
- **样式**: TailwindCSS 4.0
- **UI 组件**: shadcn/ui
- **构建工具**: Vite + Turbo
- **代码规范**: Biome
- **Git 规范**: Lefthook + Gitmoji
## 主要功能
### 运维管理
- 服务器管理
- 节点管理
- 订阅配置
- 产品管理
### 商务管理
- 订单管理
- 优惠券管理
- 营销管理
- 公告管理
### 用户与支持
- 用户管理
- 工单系统
- 文档管理
### 系统管理
- 系统配置
- 认证控制
- 支付配置
- 广告配置
### 日志与分析
- 完整的操作日志记录
- 流量统计分析
- 财务数据追踪
## 下一步
- [安装部署](/zh/guide/installation/) - 了解如何部署 PPanel
- [配置指南](/zh/guide/configuration) - 配置你的 PPanel 实例
- [管理后台](/zh/admin/dashboard) - 开始使用管理功能
+168
View File
@@ -0,0 +1,168 @@
# 节点端安装
`ppanel-node` 是部署在边缘服务器上的轻量代理守护进程,基于 `xray-core`,负责同步路由、订阅、心跳与密钥。本指南提供最快速的一键安装方式,并补充源码与容器方案。
## 快速开始
```bash
wget -N https://raw.githubusercontent.com/perfect-panel/ppanel-node/master/scripts/install.sh
sudo bash install.sh --api-host https://panel.example.com --server-id 1 --secret-key <SECRET>
```
脚本会自动识别系统/架构、拉取最新版、安装 geo 数据,并配置 `ppnode` CLI 与系统服务。
### 环境要求
- 64 位 LinuxDebian/Ubuntu ≥16、CentOS ≥7、Alpine、Arch 等)
- 拥有 root 权限,且可访问 `github.com`
- 防火墙需放通对外协议端口及访问面板的 443 端口
- 面板后台已生成匹配的 **Server ID****Secret Key**
### 可选参数
- 位置参数 `vX.Y.Z`:安装指定 tag。
- `--api-host https://panel.example.com`
- `--server-id <ID>`(对应运维→服务器 管理页面中的记录)
- `--secret-key <KEY>`
若未传入参数,脚本会在安装过程中交互式询问。
### 服务管理
安装完成后可通过 CLI 管理:
```bash
ppnode status # 查看状态
ppnode start # 启动
ppnode restart # 重启 + 重新加载配置
ppnode log # 查看日志
ppnode update # 升级至最新版本
ppnode update v1.2 # 安装指定版本
ppnode uninstall # 卸载
ppnode generate # 重新生成 /etc/PPanel-node/config.yml
```
## 安装方式
### 方式一:一键脚本(推荐)
执行上方快速开始命令或运行 `sudo bash install.sh` 并按提示填写信息。脚本包含以下步骤:
1. 根据发行版安装依赖(`wget``curl``tar``socat`、cron 等)。
2. 下载 `ppanel-node-linux-<arch>.zip`(支持 amd64/arm64/s390x)。
3. 解压到 `/usr/local/PPanel-node`,安装 `geoip.dat``geosite.dat`,配置系统服务。
4. 安装 `/usr/bin/ppnode` 管理脚本并设置开机自启。
### 方式二:从源码构建
1. 安装 Go 1.21+,并启用 JSON v2 实验特性:
```bash
export GOEXPERIMENT=jsonv2
```
2. 克隆仓库并编译:
```bash
git clone https://github.com/perfect-panel/ppanel-node.git
cd ppanel-node
GOEXPERIMENT=jsonv2 go build -v -o ./ppnode -trimpath -ldflags "-s -w -buildid="
```
3. 复制二进制与 geo 数据:
```bash
sudo install -Dm755 ./ppnode /usr/local/PPanel-node/ppnode
sudo install -Dm644 ./geoip.dat /etc/PPanel-node/geoip.dat
sudo install -Dm644 ./geosite.dat /etc/PPanel-node/geosite.dat
```
4. 创建 systemd 服务:
```bash
sudo tee /etc/systemd/system/PPanel-node.service <<'EOF'
[Unit]
Description=PPanel Node
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/PPanel-node/ppnode server
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now PPanel-node
```
5. 复制仓库中的 `config.yml` 或手动创建(见配置章节),最后重启服务。
### 方式三:容器化部署
仓库自带 `Dockerfile`,可在不方便直接安装的宿主机上运行:
```bash
git clone https://github.com/perfect-panel/ppanel-node.git
cd ppanel-node
docker build -t ppanel-node:latest .
docker run -d --name ppanel-node \
--net host \
-v /etc/PPanel-node:/etc/PPanel-node \
ppanel-node:latest server
```
建议挂载的目录:
- `/etc/PPanel-node/config.yml` —— 保存 API/密钥配置。
- `/etc/PPanel-node/geoip.dat` 与 `/etc/PPanel-node/geosite.dat` —— 持久化 Geo 数据文件。
- `/var/log/ppanel-node`(可选)—— 在宿主机收集日志。
## 配置节点
运行时配置位于 `/etc/PPanel-node/config.yml`,结构如下:
```yaml
Log:
Level: warn # debug | info | warn | error
Output: "" # 为空代表 stdout,也可以写入文件
Access: none # 访问日志路径,none 为关闭
Api:
ApiHost: https://panel.example.com
ServerID: 3
SecretKey: b23d8ee1cfe44d7f
Timeout: 30
```
修改完成后重启服务:
```bash
sudo systemctl restart PPanel-node
# 或
ppnode restart
```
### 与面板的映射关系
1. 在 **运维管理 → 服务器管理** 中创建记录,获取对应的 Server ID 与 Secret Key。
2. 将上述信息填入 `config.yml``ApiHost` 必须是面板的公网可访问地址。
3. 确保节点能够访问面板 443 端口,且面板允许节点 IP 回连。
4. 节点上报后会在面板中显示为在线,通常 30 秒内即可看到心跳。
## 升级与回滚
- `ppnode update` 仅替换二进制,保留配置与 geo 文件。
- `ppnode update vX.Y.Z` 可按版本号回滚。
- 源码部署时,重新构建目标 tag,替换 `/usr/local/PPanel-node/ppnode` 并 `systemctl restart PPanel-node`。
## 故障排查
- `ppnode log` 或 `journalctl -u PPanel-node -f` 查看运行日志。
- 确认 `/etc/PPanel-node/config.yml` 中 `ApiHost`、`SecretKey` 填写正确。
- 保证服务器可访问 GitHub(更新)与面板域名的 443 端口。
- 面板显示离线时检查防火墙是否放行心跳、系统时间是否同步(`chronyc tracking`)。
更多细节可参阅源仓库:[`github.com/perfect-panel/ppanel-node`](https://github.com/perfect-panel/ppanel-node)。
+505
View File
@@ -0,0 +1,505 @@
# 后端分离部署
本指南将帮助您独立部署 PPanel 后端服务,适用于前后端分离部署场景。
## 概述
后端分离部署允许您将 PPanel 后端服务部署在独立的服务器上,提供 API 服务给前端应用。这种部署方式具有以下优势:
- 🚀 独立扩展后端服务性能
- 🔒 更好的安全隔离
- 🌐 支持多前端实例连接同一后端
- 🛠️ 便于后端服务的独立维护和升级
## 系统要求
### 最低配置
- CPU: 1 核心
- 内存: 1 GB
- 存储: 10 GB
- 操作系统: Linux (推荐 Ubuntu 20.04+, Debian 11+, CentOS 8+)
### 推荐配置
- CPU: 2 核心以上
- 内存: 2 GB 以上
- 存储: 20 GB 以上
## 部署方式
### 方式一:Docker 部署(推荐)
#### 1. 安装 Docker
```bash
# Ubuntu/Debian
curl -fsSL https://get.docker.com | sh
# 启动 Docker 服务
sudo systemctl start docker
sudo systemctl enable docker
```
#### 2. 创建配置文件
创建后端配置文件 `config.yaml`
```yaml
# 数据库配置
database:
type: mysql
host: localhost
port: 3306
username: ppanel
password: your_password
database: ppanel
# Redis 配置
redis:
host: localhost
port: 6379
password: ""
db: 0
# 服务配置
server:
host: 0.0.0.0
port: 8080
# CORS 配置(重要:允许前端域名访问)
cors:
allow_origins:
- "https://your-frontend-domain.com"
- "http://localhost:3000" # 开发环境
allow_methods:
- GET
- POST
- PUT
- DELETE
- OPTIONS
allow_headers:
- "*"
# JWT 配置
jwt:
secret: "your-secret-key"
expire: 7200 # 2小时
# API 配置
api:
prefix: "/api"
version: "v1"
```
#### 3. 准备 MySQL 数据库
```bash
# 使用 Docker 运行 MySQL
docker run -d \
--name ppanel-mysql \
-e MYSQL_ROOT_PASSWORD=root_password \
-e MYSQL_DATABASE=ppanel \
-e MYSQL_USER=ppanel \
-e MYSQL_PASSWORD=your_password \
-p 3306:3306 \
-v ppanel-mysql-data:/var/lib/mysql \
mysql:8.0
# 等待 MySQL 启动
sleep 10
```
#### 4. 准备 Redis
```bash
# 使用 Docker 运行 Redis
docker run -d \
--name ppanel-redis \
-p 6379:6379 \
-v ppanel-redis-data:/data \
redis:7-alpine
```
#### 5. 运行后端服务
```bash
# 拉取后端镜像
docker pull ghcr.io/perfect-panel/ppanel:latest
# 运行后端容器
docker run -d \
--name ppanel-backend \
-p 8080:8080 \
-v $(pwd)/config.yaml:/app/config.yaml \
--link ppanel-mysql:mysql \
--link ppanel-redis:redis \
ghcr.io/perfect-panel/ppanel:latest
```
#### 6. 初始化数据库
```bash
# 执行数据库迁移
docker exec ppanel-backend ./ppanel migrate
```
### 方式二:二进制部署
#### 1. 下载后端程序
```bash
# 下载最新版本
wget https://github.com/perfect-panel/ppanel/releases/latest/download/ppanel-linux-amd64.tar.gz
# 解压
tar -xzf ppanel-linux-amd64.tar.gz
cd ppanel
# 赋予执行权限
chmod +x ppanel
```
#### 2. 配置后端服务
创建配置文件 `config.yaml`(内容同上 Docker 部署方式)。
#### 3. 安装并配置 MySQL
```bash
# Ubuntu/Debian
sudo apt update
sudo apt install mysql-server -y
# 创建数据库和用户
sudo mysql <<EOF
CREATE DATABASE ppanel;
CREATE USER 'ppanel'@'localhost' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON ppanel.* TO 'ppanel'@'localhost';
FLUSH PRIVILEGES;
EOF
```
#### 4. 安装并配置 Redis
```bash
# Ubuntu/Debian
sudo apt install redis-server -y
sudo systemctl start redis-server
sudo systemctl enable redis-server
```
#### 5. 初始化数据库
```bash
# 执行数据库迁移
./ppanel migrate
```
#### 6. 创建 systemd 服务
创建服务文件 `/etc/systemd/system/ppanel.service`
```ini
[Unit]
Description=PPanel Backend Service
After=network.target mysql.service redis.service
[Service]
Type=simple
User=ppanel
WorkingDirectory=/opt/ppanel
ExecStart=/opt/ppanel/ppanel server
Restart=on-failure
RestartSec=5s
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
```
启动服务:
```bash
# 创建专用用户
sudo useradd -r -s /bin/false ppanel
# 移动文件到安装目录
sudo mkdir -p /opt/ppanel
sudo mv ppanel config.yaml /opt/ppanel/
sudo chown -R ppanel:ppanel /opt/ppanel
# 启动服务
sudo systemctl daemon-reload
sudo systemctl start ppanel
sudo systemctl enable ppanel
# 查看服务状态
sudo systemctl status ppanel
```
## 配置反向代理
### Nginx 配置
```nginx
server {
listen 80;
server_name api.your-domain.com;
# HTTPS 重定向(推荐配置 SSL 证书)
# return 301 https://$server_name$request_uri;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket 支持
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 超时配置
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}
# HTTPS 配置示例
# server {
# listen 443 ssl http2;
# server_name api.your-domain.com;
#
# ssl_certificate /path/to/cert.pem;
# ssl_certificate_key /path/to/key.pem;
#
# location / {
# proxy_pass http://127.0.0.1:8080;
# # ... 其他配置同上
# }
# }
```
重载 Nginx
```bash
sudo nginx -t
sudo systemctl reload nginx
```
### Caddy 配置
```caddy
api.your-domain.com {
reverse_proxy localhost:8080
}
```
## 验证部署
### 健康检查
```bash
# 检查后端服务是否运行
curl http://localhost:8080/api/health
# 预期输出
# {"status":"ok","version":"1.0.0"}
```
### 测试 API
```bash
# 测试公共 API
curl http://localhost:8080/api/v1/ping
# 预期输出
# {"message":"pong"}
```
## 环境变量配置
除了配置文件,您也可以使用环境变量:
```bash
# 数据库配置
export DB_HOST=localhost
export DB_PORT=3306
export DB_USER=ppanel
export DB_PASSWORD=your_password
export DB_NAME=ppanel
# Redis 配置
export REDIS_HOST=localhost
export REDIS_PORT=6379
export REDIS_PASSWORD=""
# JWT 密钥
export JWT_SECRET=your-secret-key
# 服务端口
export SERVER_PORT=8080
```
Docker 运行时使用环境变量:
```bash
docker run -d \
--name ppanel-backend \
-p 8080:8080 \
-e DB_HOST=mysql \
-e DB_USER=ppanel \
-e DB_PASSWORD=your_password \
-e REDIS_HOST=redis \
--link ppanel-mysql:mysql \
--link ppanel-redis:redis \
ghcr.io/perfect-panel/ppanel:latest
```
## 安全建议
1. **使用强密码**:为数据库和 JWT 密钥设置强密码
2. **配置防火墙**:仅开放必要端口(如 80, 443)
3. **启用 HTTPS**:使用 SSL/TLS 证书加密通信
4. **CORS 配置**:仅允许可信的前端域名访问
5. **定期备份**:定期备份数据库和配置文件
6. **监控日志**:定期检查应用日志和系统日志
## 故障排查
### 服务无法启动
```bash
# 查看服务日志
sudo journalctl -u ppanel -n 50 --no-pager
# Docker 查看日志
docker logs ppanel-backend
```
### 数据库连接失败
```bash
# 测试 MySQL 连接
mysql -h localhost -u ppanel -p -e "SELECT 1;"
# 检查 MySQL 服务状态
sudo systemctl status mysql
```
### Redis 连接失败
```bash
# 测试 Redis 连接
redis-cli ping
# 检查 Redis 服务状态
sudo systemctl status redis-server
```
### CORS 错误
确保在 `config.yaml` 中正确配置了前端域名:
```yaml
cors:
allow_origins:
- "https://your-frontend-domain.com"
```
## 性能优化
### 数据库优化
```sql
-- 创建必要的索引
CREATE INDEX idx_user_email ON users(email);
CREATE INDEX idx_order_status ON orders(status);
CREATE INDEX idx_created_at ON orders(created_at);
```
### Redis 缓存配置
```yaml
redis:
# 启用缓存
cache_enabled: true
# 缓存过期时间(秒)
cache_ttl: 3600
```
### 应用层优化
```yaml
# 启用 Gzip 压缩
server:
gzip: true
# 调整并发连接数
server:
max_connections: 1000
```
## 升级指南
### Docker 升级
```bash
# 拉取最新镜像
docker pull ghcr.io/perfect-panel/ppanel:latest
# 停止旧容器
docker stop ppanel-backend
# 备份数据
docker exec ppanel-mysql mysqldump -u ppanel -p ppanel > backup.sql
# 删除旧容器
docker rm ppanel-backend
# 运行新容器
docker run -d \
--name ppanel-backend \
-p 8080:8080 \
-v $(pwd)/config.yaml:/app/config.yaml \
--link ppanel-mysql:mysql \
--link ppanel-redis:redis \
ghcr.io/perfect-panel/ppanel:latest
# 执行数据库迁移
docker exec ppanel-backend ./ppanel migrate
```
### 二进制升级
```bash
# 停止服务
sudo systemctl stop ppanel
# 备份旧版本
sudo cp /opt/ppanel/ppanel /opt/ppanel/ppanel.backup
# 下载新版本
wget https://github.com/perfect-panel/ppanel/releases/latest/download/ppanel-linux-amd64.tar.gz
tar -xzf ppanel-linux-amd64.tar.gz
# 替换文件
sudo mv ppanel /opt/ppanel/
sudo chown ppanel:ppanel /opt/ppanel/ppanel
# 执行数据库迁移
cd /opt/ppanel
sudo -u ppanel ./ppanel migrate
# 启动服务
sudo systemctl start ppanel
```
## 下一步
- [前端分离部署](./frontend.md) - 部署前端应用
- [节点端安装](../node/installation.md) - 部署节点服务
- [API 文档](/zh/api/reference) - 查看完整 API 文档
+689
View File
@@ -0,0 +1,689 @@
# 前端分离部署
本指南将帮助您独立部署 PPanel 前端应用,连接到已部署的后端服务。
## 概述
前端分离部署允许您将 PPanel 前端应用部署在独立的服务器或 CDN 上,通过 API 与后端服务通信。
PPanel 前端包含两个独立应用:
- **用户端** (`ppanel-user-web`): 面向最终用户的界面
- **管理端** (`ppanel-admin-web`): 面向管理员的后台管理界面
### 优势
- 🚀 利用 CDN 加速静态资源访问
- 🌍 支持多地域分发
- 📦 前端独立部署,不影响后端服务
- 🔄 便于前端快速迭代和更新
- 🎨 使用现代技术栈 (React 19, TypeScript, TailwindCSS 4)
## 前提条件
- 已完成[后端部署](./backend.md)
- 后端 API 地址(如 `https://api.your-domain.com`
- 前端域名:
- 用户端:`https://user.your-domain.com`
- 管理端:`https://admin.your-domain.com`
## 技术栈
- **运行时**: Bun (推荐) / Node.js 20+
- **构建工具**: Vite 6
- **框架**: React 19 + TypeScript
- **路由**: TanStack Router
- **样式**: TailwindCSS 4
- **状态管理**: Zustand
- **国际化**: i18next
- **Monorepo**: Turborepo
## 部署方式
### 方式一:从源码构建(推荐)
#### 1. 环境准备
安装 Bun(推荐):
```bash
# Linux/macOS
curl -fsSL https://bun.sh/install | bash
# Windows (WSL2)
curl -fsSL https://bun.sh/install | bash
# 验证安装
bun --version
```
或使用 Node.js (需要 20+)
```bash
# 检查 Node.js 版本
node --version # 应该是 v20 或更高
```
#### 2. 克隆代码仓库
```bash
git clone https://github.com/perfect-panel/frontend.git
cd frontend
```
#### 3. 安装依赖
```bash
# 使用 Bun(推荐,更快)
bun install
# 或使用 npm
npm install
# 或使用 pnpm
pnpm install
```
#### 4. 配置环境变量
在应用目录下创建环境配置文件。
**管理端配置** (`apps/admin/.env.production`)
```bash
# 后端 API 地址(必需)
VITE_API_BASE_URL=https://api.your-domain.com
# CDN 地址(可选,用于加速静态资源)
VITE_CDN_URL=https://cdn.jsdmirror.com
# 启用教程文档(可选)
VITE_TUTORIAL_DOCUMENT=true
# 开发环境默认登录凭证(生产环境请留空)
VITE_USER_EMAIL=
VITE_USER_PASSWORD=
```
**用户端配置** (`apps/user/.env.production`)
```bash
# 后端 API 地址(必需)
VITE_API_BASE_URL=https://api.your-domain.com
# CDN 地址(可选)
VITE_CDN_URL=https://cdn.jsdmirror.com
# 启用教程文档(可选)
VITE_TUTORIAL_DOCUMENT=true
# 开发环境默认登录凭证(生产环境请留空)
VITE_USER_EMAIL=
VITE_USER_PASSWORD=
```
#### 5. 构建应用
构建所有应用:
```bash
# 使用 Bun
bun run build
# 或使用 npm
npm run build
```
构建特定应用:
```bash
# 进入应用目录
cd apps/admin # 或 apps/user
# 构建
bun run build # 或 npm run build
```
构建完成后,静态文件将输出到:
- 管理端:`apps/admin/dist/`
- 用户端:`apps/user/dist/`
#### 6. 预览构建结果
```bash
# 在应用目录下
bun run serve # 或 npm run serve
# 默认访问地址:
# 管理端:http://localhost:4173
# 用户端:http://localhost:4173
```
### 方式二:使用 Vercel 一键部署
#### 管理端部署
点击下方按钮一键部署到 Vercel:
[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?demo-description=PPanel%20is%20a%20pure%2C%20professional%2C%20and%20perfect%20open-source%20proxy%20panel%20tool&demo-image=https%3A%2F%2Furlscan.io%2Fliveshot%2F%3Fwidth%3D1920%26height%3D1080%26url%3Dhttps%3A%2F%2Fadmin.ppanel.dev&demo-title=PPanel%20Admin%20Web&repository-url=https%3A%2F%2Fgithub.com%2Fperfect-panel%2Ffrontend&root-directory=apps%2Fadmin)
#### 用户端部署
[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?demo-description=PPanel%20is%20a%20pure%2C%20professional%2C%20and%20perfect%20open-source%20proxy%20panel%20tool&demo-image=https%3A%2F%2Furlscan.io%2Fliveshot%2F%3Fwidth%3D1920%26height%3D1080%26url%3Dhttps%3A%2F%2Fuser.ppanel.dev&demo-title=PPanel%20User%20Web&repository-url=https%3A%2F%2Fgithub.com%2Fperfect-panel%2Ffrontend&root-directory=apps%2Fuser)
部署后在 Vercel 控制台配置环境变量:
- `VITE_API_BASE_URL`: 你的后端 API 地址
- `VITE_CDN_URL`: CDN 地址(可选)
### 方式三:使用 Netlify 部署
#### 1. 安装 Netlify CLI
```bash
npm install -g netlify-cli
```
#### 2. 登录 Netlify
```bash
netlify login
```
#### 3. 部署应用
```bash
# 管理端
cd apps/admin
bun run build
netlify deploy --prod --dir=dist
# 用户端
cd apps/user
bun run build
netlify deploy --prod --dir=dist
```
#### 4. 配置环境变量
在 Netlify 控制台的 Site settings → Build & deploy → Environment 中添加:
- `VITE_API_BASE_URL`
- `VITE_CDN_URL`
### 方式四:使用 Cloudflare Pages
#### 1. 连接 GitHub 仓库
登录 Cloudflare Dashboard → Workers & Pages → Create application → Pages → Connect to Git
#### 2. 配置构建设置
**管理端**
- **Framework preset**: None
- **Build command**: `cd .. && bun install && cd apps/admin && bun run build`
- **Build output directory**: `apps/admin/dist`
- **Root directory**: `apps/admin`
**用户端**
- **Framework preset**: None
- **Build command**: `cd .. && bun install && cd apps/user && bun run build`
- **Build output directory**: `apps/user/dist`
- **Root directory**: `apps/user`
#### 3. 配置环境变量
在 Settings → Environment variables 中添加:
- `VITE_API_BASE_URL`
- `VITE_CDN_URL`
## 自建服务器部署
### 使用 Nginx
#### 1. 安装 Nginx
```bash
# Ubuntu/Debian
sudo apt update
sudo apt install nginx -y
# CentOS/RHEL
sudo yum install nginx -y
```
#### 2. 上传构建文件
```bash
# 创建目录
sudo mkdir -p /var/www/ppanel/{admin,user}
# 上传构建文件
sudo cp -r apps/admin/dist/* /var/www/ppanel/admin/
sudo cp -r apps/user/dist/* /var/www/ppanel/user/
# 设置权限
sudo chown -R www-data:www-data /var/www/ppanel
```
#### 3. 配置 Nginx
**管理端配置** (`/etc/nginx/sites-available/ppanel-admin`)
```nginx
server {
listen 80;
server_name admin.your-domain.com;
root /var/www/ppanel/admin;
index index.html;
# Gzip 压缩
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_vary on;
gzip_min_length 1024;
# 静态资源缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# SPA 路由支持
location / {
try_files $uri $uri/ /index.html;
}
# 安全头
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
}
```
**用户端配置** (`/etc/nginx/sites-available/ppanel-user`)
```nginx
server {
listen 80;
server_name user.your-domain.com;
root /var/www/ppanel/user;
index index.html;
# 其他配置同管理端
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
location / {
try_files $uri $uri/ /index.html;
}
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
}
```
#### 4. 启用站点
```bash
# 启用站点
sudo ln -s /etc/nginx/sites-available/ppanel-admin /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/ppanel-user /etc/nginx/sites-enabled/
# 测试配置
sudo nginx -t
# 重载 Nginx
sudo systemctl reload nginx
```
#### 5. 配置 HTTPS(推荐)
使用 Certbot 自动配置 SSL 证书:
```bash
# 安装 Certbot
sudo apt install certbot python3-certbot-nginx -y
# 获取证书
sudo certbot --nginx -d admin.your-domain.com
sudo certbot --nginx -d user.your-domain.com
# 自动续期
sudo certbot renew --dry-run
```
### 使用 Caddy
Caddy 自动处理 HTTPS,配置更简单。
#### 1. 安装 Caddy
```bash
# Ubuntu/Debian
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy
```
#### 2. 配置 Caddyfile
创建 `/etc/caddy/Caddyfile`
```caddy
admin.your-domain.com {
root * /var/www/ppanel/admin
encode gzip
file_server
try_files {path} /index.html
@static {
path *.js *.css *.png *.jpg *.jpeg *.gif *.ico *.svg *.woff *.woff2 *.ttf *.eot
}
header @static Cache-Control "public, max-age=31536000, immutable"
header {
X-Frame-Options "SAMEORIGIN"
X-Content-Type-Options "nosniff"
X-XSS-Protection "1; mode=block"
}
}
user.your-domain.com {
root * /var/www/ppanel/user
encode gzip
file_server
try_files {path} /index.html
@static {
path *.js *.css *.png *.jpg *.jpeg *.gif *.ico *.svg *.woff *.woff2 *.ttf *.eot
}
header @static Cache-Control "public, max-age=31536000, immutable"
header {
X-Frame-Options "SAMEORIGIN"
X-Content-Type-Options "nosniff"
X-XSS-Protection "1; mode=block"
}
}
```
#### 3. 启动 Caddy
```bash
sudo systemctl restart caddy
sudo systemctl enable caddy
```
## 配置 CDN
### Cloudflare 配置
1. 添加域名到 Cloudflare
2. 配置 DNS 记录指向源服务器
3. 启用以下优化选项:
- **Auto Minify**: 启用 JavaScript、CSS、HTML 压缩
- **Brotli**: 启用 Brotli 压缩
- **Rocket Loader**: 启用 JS 异步加载(可选)
- **Caching Level**: 设置为 Standard
4. 配置页面规则:
```
*your-domain.com/*
- Cache Level: Cache Everything
- Edge Cache TTL: 1 month
- Browser Cache TTL: Respect Existing Headers
```
### 阿里云 CDN
1. 创建 CDN 加速域名
2. 配置源站:指向前端服务器
3. 配置缓存规则:
- 静态文件(js, css, 图片):缓存 1 年
- HTML 文件:缓存 5 分钟或不缓存
4. 启用 HTTPS 和 HTTP/2
## 环境变量说明
| 变量名 | 说明 | 必需 | 默认值 | 示例 |
|--------|------|------|--------|------|
| `VITE_API_BASE_URL` | 后端 API 地址 | ✅ | - | `https://api.your-domain.com` |
| `VITE_CDN_URL` | CDN 地址 | ❌ | `https://cdn.jsdmirror.com` | `https://cdn.your-domain.com` |
| `VITE_TUTORIAL_DOCUMENT` | 启用教程文档 | ❌ | `true` | `true` / `false` |
| `VITE_USER_EMAIL` | 默认登录邮箱(仅开发) | ❌ | - | - |
| `VITE_USER_PASSWORD` | 默认登录密码(仅开发) | ❌ | - | - |
## 验证部署
### 检查前端服务
```bash
# 访问前端地址
curl -I https://admin.your-domain.com
curl -I https://user.your-domain.com
# 预期输出
# HTTP/2 200
# content-type: text/html
```
### 检查 API 连接
在浏览器中打开前端地址,打开开发者工具:
1. 查看 Network 标签
2. 检查到 API 的请求是否成功
3. 确认请求地址正确(`https://api.your-domain.com`
4. 查看响应数据是否正常
### 检查构建版本
访问 `/version.lock` 文件查看当前部署的版本:
```bash
curl https://admin.your-domain.com/version.lock
# 输出示例: 1.2.0
```
## 性能优化
### 1. 启用 HTTP/2
在 Nginx 中:
```nginx
listen 443 ssl http2;
```
### 2. 启用 Brotli 压缩
```bash
# 安装 Nginx Brotli 模块
sudo apt install libnginx-mod-http-brotli-filter libnginx-mod-http-brotli-static -y
```
在 Nginx 配置中:
```nginx
brotli on;
brotli_types text/plain text/css application/json application/javascript text/xml application/xml;
brotli_comp_level 6;
```
### 3. 预加载关键资源
构建时 Vite 已自动处理,会在 `index.html` 中添加 `<link rel="modulepreload">`。
### 4. 启用 Service Worker
前端已内置 PWA 支持,构建后自动启用 Service Worker 缓存。
### 5. 使用 CDN 加速
配置 `VITE_CDN_URL` 环境变量,将静态资源加载从 CDN 获取。
## 故障排查
### API 请求失败
**问题**: 前端无法连接到后端 API
**解决方案**:
1. 检查 `VITE_API_BASE_URL` 是否正确配置
2. 检查后端 CORS 配置是否允许前端域名
3. 打开浏览器控制台查看具体错误信息
4. 使用 `curl` 测试后端 API 是否可访问
```bash
curl https://api.your-domain.com/api/health
```
### 页面路由 404
**问题**: 刷新页面或直接访问子路由返回 404
**解决方案**: 确保 Web 服务器配置了 SPA 回退
```nginx
# Nginx
try_files $uri $uri/ /index.html;
# Apache (.htaccess)
RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
```
### 静态资源加载失败
**问题**: JS/CSS 文件 404 或无法加载
**解决方案**:
1. 检查文件权限
2. 检查 Nginx `root` 路径是否正确
3. 清除浏览器缓存
4. 检查 CDN 配置
### 构建失败
**问题**: `bun run build` 或 `npm run build` 失败
**解决方案**:
1. 确保 Node.js 版本 >= 20
2. 删除 `node_modules` 和锁文件,重新安装
```bash
rm -rf node_modules bun.lockb
bun install
```
3. 检查是否有语法错误或类型错误
```bash
bun run check
```
## 更新部署
### 从源码更新
```bash
# 拉取最新代码
git pull origin main
# 重新安装依赖
bun install
# 重新构建
bun run build
# 更新文件
sudo rm -rf /var/www/ppanel/admin
sudo rm -rf /var/www/ppanel/user
sudo cp -r apps/admin/dist /var/www/ppanel/admin
sudo cp -r apps/user/dist /var/www/ppanel/user
# 清除 CDN 缓存(如使用 CDN)
```
### Vercel 更新
Vercel 会自动监听 GitHub 仓库变动并自动部署。也可以手动触发:
```bash
vercel --prod
```
### Netlify 更新
```bash
cd apps/admin # 或 apps/user
bun run build
netlify deploy --prod
```
## 安全建议
1. **启用 HTTPS**: 必须使用 SSL/TLS 证书
2. **配置 CSP**: 内容安全策略
```nginx
add_header Content-Security-Policy "default-src 'self'; connect-src 'self' https://api.your-domain.com; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval';";
```
3. **设置安全头**: 已在 Nginx 配置中包含
4. **禁用目录浏览**: `Options -Indexes` (Apache) 或 `autoindex off;` (Nginx)
5. **限制文件上传大小**:
```nginx
client_max_body_size 10M;
```
## 监控和分析
### 添加网站分析
支持 Google Analytics、Umami、Plausible 等。
配置方式:在 `index.html` 中添加追踪代码,或使用环境变量配置。
### 错误追踪
前端支持集成 Sentry 进行错误追踪(需要在代码中配置)。
## 开发和生产环境
### 本地开发
```bash
# 使用开发服务器
cd apps/admin # 或 apps/user
bun run dev
# 管理端默认运行在 http://localhost:3001
# 用户端默认运行在 http://localhost:3000
```
开发环境会使用 Vite 的代理功能,将 API 请求代理到后端。
### 预览生产构建
```bash
# 构建后预览
bun run build
bun run serve
```
## 下一步
- [后端分离部署](./backend.md) - 如果还未部署后端
- [节点端安装](../node/installation.md) - 部署节点服务
- [功能文档](/zh/admin/dashboard) - 了解功能使用