# Laravel知识库系统 - OpenEuler部署指南

## 概述

本指南详细说明如何在OpenEuler服务器上部署Laravel知识库系统。系统采用Docker容器化技术，支持完整的生产环境运行。

## 系统要求

### 硬件要求

- **CPU**: 2核心或以上 (推荐4核心)
- **内存**: 4GB或以上 (推荐8GB)
- **存储**: 20GB可用空间 (推荐50GB)
- **网络**: 稳定的网络连接

### 软件要求

- **操作系统**: OpenEuler 20.03 LTS或更高版本
- **架构**: x86_64 (amd64)
- **Docker**: 20.10或更高版本
- **Docker Compose**: 2.0或更高版本

## 部署架构

```
┌─────────────────────────────────────────────────────────────┐
│                    OpenEuler服务器                          │
├─────────────────────────────────────────────────────────────┤
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │
│  │   Swoole    │  │   Laravel   │  │    Queue    │         │
│  │  (Web服务)   │  │   (应用)     │  │   (队列)     │         │
│  └─────────────┘  └─────────────┘  └─────────────┘         │
├─────────────────────────────────────────────────────────────┤
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │
│  │    MySQL    │  │    Redis    │  │ Meilisearch │         │
│  │   (数据库)   │  │   (缓存)     │  │   (搜索)     │         │
│  └─────────────┘  └─────────────┘  └─────────────┘         │
├─────────────────────────────────────────────────────────────┤
│                    持久化存储                                │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │
│  │  数据库数据  │  │   应用文件   │  │    日志     │         │
│  └─────────────┘  └─────────────┘  └─────────────┘         │
└─────────────────────────────────────────────────────────────┘
```

## 部署步骤

### 1. 环境准备

#### 1.1 系统更新

```bash
# 更新系统包
sudo dnf update -y

# 安装必要工具
sudo dnf install -y curl wget git unzip
```

#### 1.2 创建部署用户

```bash
# 创建部署用户
sudo useradd -m -s /bin/bash deploy
sudo usermod -aG wheel deploy

# 切换到部署用户
sudo su - deploy
```

### 2. Docker安装

#### 2.1 自动安装 (推荐)

使用提供的部署脚本自动安装Docker：

```bash
# 下载部署脚本
wget https://your-server.com/deploy-to-openeuler.sh
chmod +x deploy-to-openeuler.sh

# 运行部署脚本 (会自动安装Docker)
sudo ./deploy-to-openeuler.sh /path/to/docker-images
```

#### 2.2 手动安装

```bash
# 添加Docker仓库
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装Docker
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 启动Docker服务
sudo systemctl start docker
sudo systemctl enable docker

# 将用户添加到docker组
sudo usermod -aG docker $USER

# 重新登录以使组权限生效
exit
sudo su - deploy

# 验证安装
docker --version
docker compose version
```

### 3. 镜像准备

#### 3.1 镜像导出 (在开发环境)

在有网络连接的开发环境中导出镜像：

```bash
# 使用导出脚本
./docker/export-images.sh -c -v

# 或手动导出
docker save -o knowledge-base-app.tar knowledge-base-app:latest
docker save -o mysql.tar mysql:8.0
docker save -o redis.tar redis:7-alpine
docker save -o meilisearch.tar getmeili/meilisearch:v1.5

# 压缩镜像文件
gzip *.tar
```

#### 3.2 镜像传输

将镜像文件传输到OpenEuler服务器：

```bash
# 使用scp传输
scp docker-images/*.tar.gz deploy@openeuler-server:/tmp/

# 或使用rsync
rsync -avz docker-images/ deploy@openeuler-server:/tmp/docker-images/
```

#### 3.3 镜像导入

在OpenEuler服务器上导入镜像：

```bash
# 使用导入脚本
./docker/import-and-verify.sh -f --test-run /tmp/docker-images

# 或手动导入
cd /tmp/docker-images
for file in *.tar.gz; do
    gunzip -c "$file" | docker load
done

# 验证导入的镜像
docker images
```

### 4. 应用部署

#### 4.1 创建部署目录

```bash
# 创建部署目录
sudo mkdir -p /opt/knowledge-base
sudo chown deploy:deploy /opt/knowledge-base
cd /opt/knowledge-base
```

#### 4.2 准备配置文件

创建docker-compose.yml文件：

```bash
# 复制配置文件模板
cp /path/to/source/docker-compose.yml .
cp /path/to/source/.env.production .env

# 或下载配置文件
wget https://your-server.com/docker-compose.yml
wget https://your-server.com/.env.production -O .env
```

#### 4.3 配置环境变量

编辑.env文件：

```bash
nano .env
```

重要配置项：

```env
# 应用配置
APP_NAME="知识库系统"
APP_ENV=production
APP_KEY=base64:your-generated-key-here
APP_DEBUG=false
APP_URL=http://your-server-ip

# 数据库配置
DB_PASSWORD=your-secure-password

# 搜索配置
MEILISEARCH_KEY=your-master-key-here
```

#### 4.4 创建存储目录

```bash
# 创建持久化存储目录
mkdir -p storage/{mysql,redis,meilisearch,app,logs}
mkdir -p storage/logs/{app,queue}

# 设置权限
sudo chown -R 1000:1000 storage/
chmod -R 755 storage/
```

### 5. 启动服务

#### 5.1 启动所有服务

```bash
# 启动服务
docker compose up -d

# 查看服务状态
docker compose ps

# 查看日志
docker compose logs -f
```

#### 5.2 初始化应用

```bash
# 运行数据库迁移
docker compose exec app php artisan migrate --force

# 创建存储链接
docker compose exec app php artisan storage:link

# 清除缓存
docker compose exec app php artisan cache:clear
docker compose exec app php artisan config:cache
docker compose exec app php artisan route:cache
docker compose exec app php artisan view:cache
```

### 6. 验证部署

#### 6.1 健康检查

```bash
# 检查所有容器状态
docker compose ps

# 检查健康状态
docker compose exec app curl -f http://localhost/health

# 检查数据库连接
docker compose exec app php artisan tinker --execute="DB::connection()->getPdo();"
```

#### 6.2 功能测试

1. **Web访问测试**
   ```bash
   curl -I http://your-server-ip
   ```

2. **数据库测试**
   ```bash
   docker compose exec mysql mysql -u root -p -e "SHOW DATABASES;"
   ```

3. **搜索服务测试**
   ```bash
   curl http://your-server-ip:7700/health
   ```

4. **队列测试**
   ```bash
   docker compose exec app php artisan queue:work --once
   ```

## 运维管理

### 日常操作

#### 查看日志

```bash
# 查看所有服务日志
docker compose logs -f

# 查看特定服务日志
docker compose logs -f app
docker compose logs -f mysql
docker compose logs -f redis
docker compose logs -f meilisearch
docker compose logs -f queue

# 查看Laravel日志
docker compose exec app tail -f storage/logs/laravel.log
```

#### 重启服务

```bash
# 重启所有服务
docker compose restart

# 重启特定服务
docker compose restart app
docker compose restart mysql
```

#### 停止和启动

```bash
# 停止所有服务
docker compose down

# 启动所有服务
docker compose up -d

# 停止并删除所有容器和网络
docker compose down --volumes --remove-orphans
```

### 备份和恢复

#### 数据备份

```bash
# 创建备份脚本
cat > backup.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="/opt/backups/knowledge-base"
DATE=$(date +%Y%m%d_%H%M%S)

mkdir -p "$BACKUP_DIR"

# 备份数据库
docker compose exec -T mysql mysqldump -u root -p$DB_PASSWORD knowledge_base > "$BACKUP_DIR/database_$DATE.sql"

# 备份应用文件
tar -czf "$BACKUP_DIR/storage_$DATE.tar.gz" storage/

# 备份配置文件
cp .env "$BACKUP_DIR/env_$DATE"
cp docker-compose.yml "$BACKUP_DIR/docker-compose_$DATE.yml"

echo "备份完成: $BACKUP_DIR"
EOF

chmod +x backup.sh
```

#### 数据恢复

```bash
# 恢复数据库
docker compose exec -T mysql mysql -u root -p$DB_PASSWORD knowledge_base < /path/to/database_backup.sql

# 恢复应用文件
tar -xzf /path/to/storage_backup.tar.gz
```

### 更新和升级

#### 应用更新

```bash
# 拉取新镜像
docker compose pull

# 重新启动服务
docker compose up -d

# 运行迁移
docker compose exec app php artisan migrate --force

# 清除缓存
docker compose exec app php artisan cache:clear
docker compose exec app php artisan config:cache
```

#### 系统更新

```bash
# 更新系统包
sudo dnf update -y

# 更新Docker
sudo dnf update docker-ce docker-ce-cli containerd.io

# 重启Docker服务
sudo systemctl restart docker
```

### 监控和告警

#### 系统监控

```bash
# 查看系统资源使用
htop
df -h
free -h

# 查看Docker资源使用
docker stats

# 查看容器资源使用
docker compose exec app ps aux
```

#### 日志监控

```bash
# 监控错误日志
tail -f storage/logs/laravel.log | grep ERROR

# 监控访问日志
docker compose logs -f app | grep "GET\|POST"
```

## 故障排除

### 常见问题

#### 1. 容器启动失败

**症状**: 容器无法启动或立即退出

**解决方案**:
```bash
# 查看容器日志
docker compose logs container_name

# 检查配置文件
docker compose config

# 检查端口占用
netstat -tlnp | grep :8000
```

#### 2. 数据库连接失败

**症状**: 应用无法连接到数据库

**解决方案**:
```bash
# 检查数据库容器状态
docker compose ps mysql

# 测试数据库连接
docker compose exec mysql mysql -u root -p

# 检查网络连接
docker compose exec app ping mysql
```

#### 3. 权限问题

**症状**: 文件写入失败或权限错误

**解决方案**:
```bash
# 修复存储目录权限
sudo chown -R 1000:1000 storage/
chmod -R 775 storage/

# 检查SELinux状态
getenforce
sudo setsebool -P container_manage_cgroup on
```

#### 4. 内存不足

**症状**: 容器被OOM Killer终止

**解决方案**:
```bash
# 检查内存使用
free -h
docker stats

# 调整容器内存限制
# 编辑docker-compose.yml中的deploy.resources.limits.memory
```

#### 5. 磁盘空间不足

**症状**: 容器无法写入文件

**解决方案**:
```bash
# 检查磁盘使用
df -h

# 清理Docker资源
docker system prune -a

# 清理日志文件
sudo journalctl --vacuum-time=7d
```

### 性能优化

#### 1. 数据库优化

```bash
# 调整MySQL配置
# 编辑docker/mysql/my.cnf
[mysqld]
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
max_connections = 200
```

#### 2. Redis优化

```bash
# 调整Redis配置
# 编辑docker/redis/redis.conf
maxmemory 512mb
maxmemory-policy allkeys-lru
```

#### 3. PHP优化

```bash
# 调整PHP配置
# 编辑docker/php/php.ini
memory_limit = 512M
max_execution_time = 300
upload_max_filesize = 100M
```

#### 4. Swoole优化

```bash
# 调整Swoole配置
# 编辑.env文件
OCTANE_WORKERS=4
OCTANE_TASK_WORKERS=2
OCTANE_MAX_REQUESTS=500
```

## 安全配置

### 防火墙设置

```bash
# 配置防火墙
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --reload

# 限制数据库端口访问
sudo firewall-cmd --permanent --remove-port=3306/tcp
sudo firewall-cmd --permanent --remove-port=6379/tcp
sudo firewall-cmd --permanent --remove-port=7700/tcp
sudo firewall-cmd --reload
```

### SSL/TLS配置

```bash
# 安装Certbot
sudo dnf install -y certbot

# 获取SSL证书
sudo certbot certonly --standalone -d your-domain.com

# 配置Nginx SSL
# 编辑docker/nginx/default.conf添加SSL配置
```

### 访问控制

```bash
# 配置IP白名单
# 在docker-compose.yml中添加网络限制

# 配置用户认证
# 在应用中启用认证中间件
```

## 联系支持

如果遇到问题，请：

1. 查看日志文件获取详细错误信息
2. 检查系统资源使用情况
3. 参考故障排除章节
4. 联系技术支持团队

---

**注意**: 本指南基于OpenEuler 20.03 LTS编写，其他版本可能需要适当调整。在生产环境部署前，请务必在测试环境中验证所有步骤。