Update PHP test app - 2026-01-21 13:37:13
This commit is contained in:
23
php-test/Dockerfile
Normal file
23
php-test/Dockerfile
Normal file
@@ -0,0 +1,23 @@
|
||||
FROM php:8.2-apache
|
||||
|
||||
# 安装 PDO MySQL 扩展
|
||||
RUN docker-php-ext-install pdo pdo_mysql
|
||||
|
||||
# 启用 Apache mod_rewrite
|
||||
RUN a2enmod rewrite
|
||||
|
||||
# 复制项目文件到容器
|
||||
COPY . /var/www/html/
|
||||
|
||||
# 设置工作目录
|
||||
WORKDIR /var/www/html
|
||||
|
||||
# 设置文件权限
|
||||
RUN chown -R www-data:www-data /var/www/html \
|
||||
&& chmod -R 755 /var/www/html
|
||||
|
||||
# 暴露80端口
|
||||
EXPOSE 80
|
||||
|
||||
# 启动Apache
|
||||
CMD ["apache2-foreground"]
|
||||
91
php-test/GITOPS.md
Normal file
91
php-test/GITOPS.md
Normal file
@@ -0,0 +1,91 @@
|
||||
# PHP 测试项目 GitOps 部署指南
|
||||
|
||||
## 🎯 GitOps 自动部署架构
|
||||
|
||||
```
|
||||
开发者修改代码
|
||||
↓
|
||||
构建 Docker 镜像
|
||||
↓
|
||||
推送到私有仓库 (registry.u9.net3w.com)
|
||||
↓
|
||||
提交代码到 Git
|
||||
↓
|
||||
推送到 Gitea (git.u9.net3w.com)
|
||||
↓
|
||||
ArgoCD 自动检测变化 (3分钟内)
|
||||
↓
|
||||
自动同步到 k3s 集群
|
||||
↓
|
||||
应用自动更新 (https://php.u9.net3w.com)
|
||||
```
|
||||
|
||||
## 🚀 快速开始
|
||||
|
||||
### 1. 首次部署
|
||||
|
||||
```bash
|
||||
# 进入项目目录
|
||||
cd /home/fei/k3s/php-test
|
||||
|
||||
# 配置 Git 远程仓库(如果还没配置)
|
||||
git remote add origin https://git.u9.net3w.com/fei/k3s-configs.git
|
||||
|
||||
# 执行 GitOps 自动部署
|
||||
./gitops-deploy.sh
|
||||
```
|
||||
|
||||
### 2. 日常开发流程
|
||||
|
||||
```bash
|
||||
# 修改代码
|
||||
vim index.php
|
||||
|
||||
# 一键部署(构建、推送、提交、部署)
|
||||
./gitops-deploy.sh v1.0.1 "Update feature"
|
||||
|
||||
# 等待 3 分钟,ArgoCD 自动部署完成
|
||||
# 访问: https://php.u9.net3w.com
|
||||
```
|
||||
|
||||
## 📋 部署清单
|
||||
|
||||
### 已创建的文件
|
||||
|
||||
- ✅ `argocd-app.yaml` - ArgoCD Application 配置
|
||||
- ✅ `build-and-push.sh` - 构建并推送镜像脚本
|
||||
- ✅ `gitops-deploy.sh` - GitOps 一键部署脚本
|
||||
- ✅ `k8s/ingress.yaml` - Ingress 配置(HTTPS)
|
||||
- ✅ `k8s/php-deployment.yaml` - 已更新镜像地址为私有仓库
|
||||
|
||||
### 配置说明
|
||||
|
||||
**镜像仓库**: `registry.u9.net3w.com/php-test:latest`
|
||||
**Git 仓库**: `https://git.u9.net3w.com/fei/k3s-configs.git`
|
||||
**应用路径**: `php-test/k8s`
|
||||
**访问域名**: `https://php.u9.net3w.com`
|
||||
|
||||
## 🔧 管理命令
|
||||
|
||||
```bash
|
||||
# 查看 ArgoCD 应用状态
|
||||
kubectl get application php-test -n argocd
|
||||
|
||||
# 手动触发同步
|
||||
argocd app sync php-test
|
||||
|
||||
# 查看 Pod 状态
|
||||
kubectl get pods -n php-test
|
||||
|
||||
# 查看应用日志
|
||||
kubectl logs -f deployment/php-app -n php-test
|
||||
|
||||
# 回滚到上一个版本
|
||||
argocd app rollback php-test
|
||||
```
|
||||
|
||||
## 🎉 完成
|
||||
|
||||
现在你的 PHP 测试项目已经配置好 GitOps 自动部署!
|
||||
|
||||
每次修改代码后,只需运行 `./gitops-deploy.sh`,ArgoCD 会自动完成部署。
|
||||
365
php-test/README.md
Normal file
365
php-test/README.md
Normal file
@@ -0,0 +1,365 @@
|
||||
# PHP MySQL 测试项目
|
||||
|
||||
这是一个基于 PHP 8 的简单数据库测试项目,包含表单提交功能和热更新支持。
|
||||
|
||||
## 📋 项目特性
|
||||
|
||||
- ✅ PHP 8 支持
|
||||
- ✅ MySQL 数据库连接(使用 PDO)
|
||||
- ✅ 表单数据提交和验证
|
||||
- ✅ 实时显示最近提交的数据
|
||||
- ✅ 热更新功能(自动刷新页面)
|
||||
- ✅ 响应式设计
|
||||
- ✅ 安全的 SQL 预处理语句
|
||||
- ✅ k3s 集群部署支持
|
||||
- ✅ Docker 容器化
|
||||
- ✅ GitOps 自动部署(ArgoCD)
|
||||
- ✅ HTTPS 支持(Let's Encrypt)
|
||||
- ✅ 私有镜像仓库集成
|
||||
|
||||
## 📁 项目结构
|
||||
|
||||
```
|
||||
php-test/
|
||||
├── config.php # 数据库配置文件
|
||||
├── Database.php # 数据库连接类
|
||||
├── index.php # 主页面(表单和数据展示)
|
||||
├── submit.php # 表单提交处理
|
||||
├── schema.sql # 数据库表结构
|
||||
├── watch.php # 文件监控脚本(可选)
|
||||
├── Dockerfile # Docker 镜像构建文件
|
||||
├── deploy.sh # k3s 手动部署脚本
|
||||
├── undeploy.sh # k3s 清理脚本
|
||||
├── build-and-push.sh # 构建并推送镜像到私有仓库
|
||||
├── gitops-deploy.sh # GitOps 自动部署脚本(推荐)
|
||||
├── argocd-app.yaml # ArgoCD Application 配置
|
||||
├── k8s/ # Kubernetes 配置文件
|
||||
│ ├── mysql-deployment.yaml
|
||||
│ ├── mysql-configmap.yaml
|
||||
│ ├── php-deployment.yaml
|
||||
│ ├── php-configmap.yaml
|
||||
│ └── ingress.yaml # Ingress 配置(HTTPS)
|
||||
└── README.md # 项目说明文档
|
||||
```
|
||||
|
||||
## 🚀 快速开始
|
||||
|
||||
本项目支持三种部署方式:**GitOps 自动部署(推荐)**、**k3s 手动部署**和**本地开发环境**。
|
||||
|
||||
---
|
||||
|
||||
## 🎯 方式一:GitOps 自动部署(推荐)
|
||||
|
||||
### 前置条件
|
||||
|
||||
- ✅ k3s 集群已部署
|
||||
- ✅ ArgoCD 已安装(https://argocd.u9.net3w.com)
|
||||
- ✅ 私有 Docker Registry 已部署(https://registry.u9.net3w.com)
|
||||
- ✅ Gitea 已部署(https://git.u9.net3w.com)
|
||||
- ✅ cert-manager + Let's Encrypt 已配置
|
||||
|
||||
### 步骤 1: 配置 Git 远程仓库
|
||||
|
||||
```bash
|
||||
# 在 Gitea 创建仓库: k3s-configs
|
||||
# 然后添加远程仓库
|
||||
git remote add origin https://git.u9.net3w.com/fei/k3s-configs.git
|
||||
|
||||
# 首次推送
|
||||
git push -u origin master
|
||||
```
|
||||
|
||||
### 步骤 2: 一键 GitOps 部署
|
||||
|
||||
```bash
|
||||
# 执行自动部署脚本(构建镜像 + 推送 + Git 提交 + ArgoCD 配置)
|
||||
./gitops-deploy.sh
|
||||
|
||||
# 或指定镜像标签和提交信息
|
||||
./gitops-deploy.sh v1.0.0 "Initial release"
|
||||
```
|
||||
|
||||
**脚本会自动完成:**
|
||||
1. 构建 Docker 镜像
|
||||
2. 推送到私有仓库 `registry.u9.net3w.com`
|
||||
3. 提交代码到 Git
|
||||
4. 推送到远程仓库
|
||||
5. 创建/更新 ArgoCD Application
|
||||
|
||||
### 步骤 3: 访问应用
|
||||
|
||||
部署完成后(约 3 分钟),通过以下地址访问:
|
||||
|
||||
```
|
||||
https://php.u9.net3w.com
|
||||
```
|
||||
|
||||
### 步骤 4: 日常开发流程
|
||||
|
||||
```bash
|
||||
# 1. 修改代码
|
||||
vim index.php
|
||||
|
||||
# 2. 重新部署(自动构建、推送、提交)
|
||||
./gitops-deploy.sh v1.0.1 "Update UI"
|
||||
|
||||
# 3. ArgoCD 自动检测并部署(3分钟内)
|
||||
```
|
||||
|
||||
### GitOps 管理命令
|
||||
|
||||
```bash
|
||||
# 查看 ArgoCD 应用状态
|
||||
kubectl get application php-test -n argocd
|
||||
|
||||
# 查看应用详情
|
||||
kubectl describe application php-test -n argocd
|
||||
|
||||
# 手动触发同步
|
||||
argocd app sync php-test
|
||||
|
||||
# 查看同步历史
|
||||
argocd app history php-test
|
||||
|
||||
# 回滚到上一个版本
|
||||
argocd app rollback php-test
|
||||
|
||||
# 查看 Pod 状态
|
||||
kubectl get pods -n php-test
|
||||
|
||||
# 查看应用日志
|
||||
kubectl logs -f deployment/php-app -n php-test
|
||||
```
|
||||
|
||||
### ArgoCD 配置说明
|
||||
|
||||
- **自动同步**: 每 3 分钟检测一次 Git 仓库变化
|
||||
- **自动修复**: 手动修改的资源会被自动恢复
|
||||
- **自动清理**: Git 中删除的资源会自动从集群删除
|
||||
- **命名空间**: 自动创建 `php-test` 命名空间
|
||||
|
||||
---
|
||||
|
||||
## 🐳 方式二:k3s 手动部署
|
||||
|
||||
### 1. 环境要求
|
||||
|
||||
- k3s 集群
|
||||
- Docker
|
||||
- kubectl
|
||||
|
||||
### 2. 一键部署
|
||||
|
||||
使用提供的部署脚本,一键部署到 k3s 集群:
|
||||
|
||||
```bash
|
||||
./deploy.sh
|
||||
```
|
||||
|
||||
部署脚本会自动完成以下操作:
|
||||
1. 构建 Docker 镜像
|
||||
2. 导入镜像到 k3s
|
||||
3. 创建命名空间 `php-test`
|
||||
4. 部署 MySQL 数据库(包含持久化存储)
|
||||
5. 部署 PHP 应用(2个副本)
|
||||
6. 创建 NodePort Service(端口 30080)
|
||||
|
||||
### 3. 访问应用
|
||||
|
||||
部署完成后,通过以下地址访问:
|
||||
|
||||
```
|
||||
http://localhost:30080
|
||||
http://<节点IP>:30080
|
||||
```
|
||||
|
||||
### 4. 管理命令
|
||||
|
||||
```bash
|
||||
# 查看部署状态
|
||||
kubectl get all -n php-test
|
||||
|
||||
# 查看 Pod 日志
|
||||
kubectl logs -f deployment/php-app -n php-test
|
||||
|
||||
# 查看 MySQL 日志
|
||||
kubectl logs -f deployment/mysql -n php-test
|
||||
|
||||
# 进入 PHP 容器
|
||||
kubectl exec -it deployment/php-app -n php-test -- bash
|
||||
|
||||
# 清理部署
|
||||
./undeploy.sh
|
||||
```
|
||||
|
||||
### 5. 配置说明
|
||||
|
||||
- **MySQL 配置**: 在 `k8s/mysql-deployment.yaml` 中的 Secret 配置
|
||||
- Root 密码: `rootpassword`
|
||||
- 数据库名: `test_db`
|
||||
- 用户名: `phpuser`
|
||||
- 密码: `phppassword`
|
||||
|
||||
- **PHP 配置**: 在 `k8s/php-configmap.yaml` 中配置数据库连接
|
||||
|
||||
- **持久化存储**: MySQL 数据存储在 PVC 中,重启不会丢失数据
|
||||
|
||||
---
|
||||
|
||||
## 💻 方式二:本地开发环境
|
||||
|
||||
### 1. 环境要求
|
||||
|
||||
- PHP 8.0 或更高版本
|
||||
- MySQL 5.7 或更高版本
|
||||
- Web 服务器(Apache/Nginx)或 PHP 内置服务器
|
||||
|
||||
### 2. 数据库配置
|
||||
|
||||
#### 方法一:使用 SQL 文件创建数据库
|
||||
|
||||
```bash
|
||||
mysql -u root -p < schema.sql
|
||||
```
|
||||
|
||||
#### 方法二:手动创建
|
||||
|
||||
```sql
|
||||
CREATE DATABASE IF NOT EXISTS test_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
USE test_db;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS test_data (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
name VARCHAR(100) NOT NULL,
|
||||
email VARCHAR(100) NOT NULL,
|
||||
message TEXT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
```
|
||||
|
||||
### 3. 修改数据库配置
|
||||
|
||||
编辑 `config.php` 文件,根据你的环境修改数据库连接信息:
|
||||
|
||||
```php
|
||||
define('DB_HOST', 'localhost'); // 数据库主机
|
||||
define('DB_NAME', 'test_db'); // 数据库名称
|
||||
define('DB_USER', 'root'); // 数据库用户名
|
||||
define('DB_PASS', ''); // 数据库密码
|
||||
```
|
||||
|
||||
### 4. 启动项目
|
||||
|
||||
#### 使用 PHP 内置服务器(推荐用于开发)
|
||||
|
||||
```bash
|
||||
cd /home/fei/k3s/php-test
|
||||
php -S localhost:8000
|
||||
```
|
||||
|
||||
然后在浏览器中访问:`http://localhost:8000`
|
||||
|
||||
#### 使用 Apache/Nginx
|
||||
|
||||
将项目目录配置为虚拟主机的根目录,然后通过配置的域名访问。
|
||||
|
||||
## 🔥 热更新功能
|
||||
|
||||
项目内置了两种热更新方式:
|
||||
|
||||
### 方式一:前端自动检测(已集成)
|
||||
|
||||
`index.php` 中已经集成了 JavaScript 热更新脚本,会每 2 秒检测一次文件变化并自动刷新页面。无需额外配置。
|
||||
|
||||
### 方式二:文件监控脚本(可选)
|
||||
|
||||
在另一个终端窗口运行文件监控脚本:
|
||||
|
||||
```bash
|
||||
php watch.php
|
||||
```
|
||||
|
||||
这个脚本会监控项目目录中的 PHP、HTML、CSS、JS 文件变化,并在控制台输出变化信息。
|
||||
|
||||
## 📝 使用说明
|
||||
|
||||
1. 访问 `index.php` 页面
|
||||
2. 填写表单(姓名、邮箱为必填项)
|
||||
3. 点击"提交数据"按钮
|
||||
4. 页面会显示提交结果,并在下方展示最近 5 条提交的数据
|
||||
5. 修改任何 PHP 文件后,页面会自动刷新(热更新)
|
||||
|
||||
## 🔒 安全特性
|
||||
|
||||
- 使用 PDO 预处理语句防止 SQL 注入
|
||||
- 表单数据验证和过滤
|
||||
- HTML 输出转义防止 XSS 攻击
|
||||
- 邮箱格式验证
|
||||
|
||||
## 🛠️ 技术栈
|
||||
|
||||
- **后端**: PHP 8
|
||||
- **数据库**: MySQL
|
||||
- **前端**: HTML5, CSS3, JavaScript (原生)
|
||||
- **数据库访问**: PDO (PHP Data Objects)
|
||||
|
||||
## 📊 数据库表结构
|
||||
|
||||
```sql
|
||||
test_data
|
||||
├── id (INT, PRIMARY KEY, AUTO_INCREMENT)
|
||||
├── name (VARCHAR(100), NOT NULL)
|
||||
├── email (VARCHAR(100), NOT NULL)
|
||||
├── message (TEXT)
|
||||
└── created_at (TIMESTAMP, DEFAULT CURRENT_TIMESTAMP)
|
||||
```
|
||||
|
||||
## 🐛 故障排除
|
||||
|
||||
### k3s 部署相关
|
||||
|
||||
**Pod 无法启动**
|
||||
- 检查镜像是否成功导入: `sudo k3s ctr images ls | grep php-test`
|
||||
- 查看 Pod 事件: `kubectl describe pod <pod-name> -n php-test`
|
||||
- 查看 Pod 日志: `kubectl logs <pod-name> -n php-test`
|
||||
|
||||
**无法访问应用**
|
||||
- 确认 Service 已创建: `kubectl get svc -n php-test`
|
||||
- 检查 NodePort 是否正确: `kubectl get svc php-app -n php-test`
|
||||
- 检查防火墙是否开放 30080 端口
|
||||
|
||||
**MySQL 连接失败**
|
||||
- 检查 MySQL Pod 是否就绪: `kubectl get pods -n php-test`
|
||||
- 查看 MySQL 日志: `kubectl logs deployment/mysql -n php-test`
|
||||
- 确认 ConfigMap 中的数据库配置正确
|
||||
|
||||
**镜像更新后未生效**
|
||||
- 重新构建并导入镜像
|
||||
- 删除旧的 Pod: `kubectl delete pod -l app=php-app -n php-test`
|
||||
- Kubernetes 会自动创建新的 Pod
|
||||
|
||||
### 本地开发环境
|
||||
|
||||
**数据库连接失败**
|
||||
- 检查 `config.php` 中的数据库配置是否正确
|
||||
- 确认 MySQL 服务是否正在运行
|
||||
- 检查数据库用户权限
|
||||
|
||||
**页面显示空白**
|
||||
- 检查 PHP 错误日志
|
||||
- 确认 PHP 版本是否为 8.0 或更高
|
||||
- 检查文件权限
|
||||
|
||||
**热更新不工作**
|
||||
- 确保浏览器支持 JavaScript
|
||||
- 检查浏览器控制台是否有错误
|
||||
- 尝试清除浏览器缓存
|
||||
|
||||
## 📄 许可证
|
||||
|
||||
MIT License
|
||||
|
||||
## 👨💻 开发者
|
||||
|
||||
Created with Claude Code
|
||||
35
php-test/argocd-app.yaml
Normal file
35
php-test/argocd-app.yaml
Normal file
@@ -0,0 +1,35 @@
|
||||
apiVersion: argoproj.io/v1alpha1
|
||||
kind: Application
|
||||
metadata:
|
||||
name: php-test
|
||||
namespace: argocd
|
||||
spec:
|
||||
project: default
|
||||
|
||||
# Git 仓库配置
|
||||
source:
|
||||
repoURL: https://git.u9.net3w.com/fei/k3s-configs.git
|
||||
targetRevision: HEAD
|
||||
path: php-test/k8s
|
||||
|
||||
# 目标集群
|
||||
destination:
|
||||
server: https://kubernetes.default.svc
|
||||
namespace: php-test
|
||||
|
||||
# 自动同步策略
|
||||
syncPolicy:
|
||||
automated:
|
||||
prune: true # 自动删除 Git 中不存在的资源
|
||||
selfHeal: true # 自动修复被手动修改的资源
|
||||
allowEmpty: false
|
||||
syncOptions:
|
||||
- CreateNamespace=true # 自动创建命名空间
|
||||
- PrunePropagationPolicy=foreground
|
||||
- PruneLast=true
|
||||
retry:
|
||||
limit: 5
|
||||
backoff:
|
||||
duration: 5s
|
||||
factor: 2
|
||||
maxDuration: 3m
|
||||
57
php-test/build-and-push.sh
Executable file
57
php-test/build-and-push.sh
Executable file
@@ -0,0 +1,57 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
echo "🔨 开始构建并推送 Docker 镜像到私有仓库..."
|
||||
|
||||
# 颜色定义
|
||||
GREEN='\033[0;32m'
|
||||
BLUE='\033[0;34m'
|
||||
YELLOW='\033[1;33m'
|
||||
RED='\033[0;31m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# 配置
|
||||
REGISTRY="registry.u9.net3w.com"
|
||||
IMAGE_NAME="php-test"
|
||||
TAG="${1:-latest}"
|
||||
FULL_IMAGE="${REGISTRY}/${IMAGE_NAME}:${TAG}"
|
||||
|
||||
# 1. 构建 Docker 镜像
|
||||
echo -e "${BLUE}📦 步骤 1: 构建 Docker 镜像...${NC}"
|
||||
sudo docker build -t ${IMAGE_NAME}:${TAG} .
|
||||
echo -e "${GREEN}✅ 镜像构建完成${NC}\n"
|
||||
|
||||
# 2. 标记镜像
|
||||
echo -e "${BLUE}🏷️ 步骤 2: 标记镜像...${NC}"
|
||||
sudo docker tag ${IMAGE_NAME}:${TAG} ${FULL_IMAGE}
|
||||
echo -e "${GREEN}✅ 镜像标记完成: ${FULL_IMAGE}${NC}\n"
|
||||
|
||||
# 3. 登录私有仓库(如果需要)
|
||||
echo -e "${BLUE}🔐 步骤 3: 登录私有仓库...${NC}"
|
||||
if sudo docker login ${REGISTRY} 2>/dev/null; then
|
||||
echo -e "${GREEN}✅ 登录成功${NC}\n"
|
||||
else
|
||||
echo -e "${YELLOW}⚠️ 登录失败,尝试不使用认证推送...${NC}\n"
|
||||
fi
|
||||
|
||||
# 4. 推送镜像到私有仓库
|
||||
echo -e "${BLUE}📤 步骤 4: 推送镜像到私有仓库...${NC}"
|
||||
sudo docker push ${FULL_IMAGE}
|
||||
echo -e "${GREEN}✅ 镜像推送完成${NC}\n"
|
||||
|
||||
# 5. 显示镜像信息
|
||||
echo -e "${BLUE}📊 镜像信息:${NC}"
|
||||
echo "================================"
|
||||
echo "Registry: ${REGISTRY}"
|
||||
echo "Image: ${IMAGE_NAME}"
|
||||
echo "Tag: ${TAG}"
|
||||
echo "Full Image: ${FULL_IMAGE}"
|
||||
echo ""
|
||||
|
||||
echo -e "${GREEN}🎉 构建和推送完成!${NC}"
|
||||
echo ""
|
||||
echo -e "${YELLOW}下一步:${NC}"
|
||||
echo " 1. 提交代码到 Git: git add . && git commit -m 'Update image' && git push"
|
||||
echo " 2. ArgoCD 会自动检测并部署新版本"
|
||||
echo " 3. 或手动触发同步: kubectl apply -f argocd-app.yaml"
|
||||
68
php-test/deploy.sh
Executable file
68
php-test/deploy.sh
Executable file
@@ -0,0 +1,68 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
echo "🚀 开始部署 PHP 测试项目到 k3s..."
|
||||
|
||||
# 颜色定义
|
||||
GREEN='\033[0;32m'
|
||||
BLUE='\033[0;34m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# 1. 构建 Docker 镜像
|
||||
echo -e "${BLUE}📦 步骤 1: 构建 Docker 镜像...${NC}"
|
||||
docker build -t php-test:latest .
|
||||
echo -e "${GREEN}✅ Docker 镜像构建完成${NC}\n"
|
||||
|
||||
# 2. 导入镜像到 k3s
|
||||
echo -e "${BLUE}📥 步骤 2: 导入镜像到 k3s...${NC}"
|
||||
docker save php-test:latest | sudo k3s ctr images import -
|
||||
echo -e "${GREEN}✅ 镜像导入完成${NC}\n"
|
||||
|
||||
# 3. 应用 ConfigMap
|
||||
echo -e "${BLUE}⚙️ 步骤 3: 应用配置文件...${NC}"
|
||||
kubectl apply -f k8s/mysql-configmap.yaml
|
||||
kubectl apply -f k8s/php-configmap.yaml
|
||||
echo -e "${GREEN}✅ ConfigMap 应用完成${NC}\n"
|
||||
|
||||
# 4. 部署 MySQL
|
||||
echo -e "${BLUE}🗄️ 步骤 4: 部署 MySQL 数据库...${NC}"
|
||||
kubectl apply -f k8s/mysql-deployment.yaml
|
||||
echo -e "${GREEN}✅ MySQL 部署完成${NC}\n"
|
||||
|
||||
# 5. 等待 MySQL 就绪
|
||||
echo -e "${YELLOW}⏳ 等待 MySQL 就绪...${NC}"
|
||||
kubectl wait --for=condition=ready pod -l app=mysql -n php-test --timeout=120s
|
||||
echo -e "${GREEN}✅ MySQL 已就绪${NC}\n"
|
||||
|
||||
# 6. 部署 PHP 应用
|
||||
echo -e "${BLUE}🐘 步骤 5: 部署 PHP 应用...${NC}"
|
||||
kubectl apply -f k8s/php-deployment.yaml
|
||||
echo -e "${GREEN}✅ PHP 应用部署完成${NC}\n"
|
||||
|
||||
# 7. 等待 PHP 应用就绪
|
||||
echo -e "${YELLOW}⏳ 等待 PHP 应用就绪...${NC}"
|
||||
kubectl wait --for=condition=ready pod -l app=php-app -n php-test --timeout=120s
|
||||
echo -e "${GREEN}✅ PHP 应用已就绪${NC}\n"
|
||||
|
||||
# 8. 显示部署信息
|
||||
echo -e "${BLUE}📊 部署信息:${NC}"
|
||||
echo "================================"
|
||||
kubectl get all -n php-test
|
||||
echo ""
|
||||
|
||||
# 9. 获取访问地址
|
||||
NODE_IP=$(kubectl get nodes -o jsonpath='{.items[0].status.addresses[?(@.type=="InternalIP")].address}')
|
||||
NODE_PORT=30080
|
||||
|
||||
echo -e "${GREEN}🎉 部署成功!${NC}"
|
||||
echo ""
|
||||
echo -e "${BLUE}访问地址:${NC}"
|
||||
echo -e " http://${NODE_IP}:${NODE_PORT}"
|
||||
echo -e " http://localhost:${NODE_PORT}"
|
||||
echo ""
|
||||
echo -e "${YELLOW}提示:${NC}"
|
||||
echo " - 查看 Pod 状态: kubectl get pods -n php-test"
|
||||
echo " - 查看日志: kubectl logs -f deployment/php-app -n php-test"
|
||||
echo " - 删除部署: ./undeploy.sh"
|
||||
75
php-test/gitops-deploy.sh
Executable file
75
php-test/gitops-deploy.sh
Executable file
@@ -0,0 +1,75 @@
|
||||
#!/bin/bash
|
||||
|
||||
# GitOps 自动部署脚本
|
||||
# 用于快速部署 PHP 测试项目到 k3s 集群
|
||||
|
||||
set -e
|
||||
|
||||
echo "🚀 GitOps 自动部署流程启动..."
|
||||
|
||||
# 颜色定义
|
||||
GREEN='\033[0;32m'
|
||||
BLUE='\033[0;34m'
|
||||
YELLOW='\033[1;33m'
|
||||
RED='\033[0;31m'
|
||||
NC='\033[0m'
|
||||
|
||||
# 配置
|
||||
REGISTRY="registry.u9.net3w.com"
|
||||
IMAGE_NAME="php-test"
|
||||
TAG="${1:-latest}"
|
||||
|
||||
# 步骤 1: 构建并推送镜像
|
||||
echo -e "${BLUE}📦 步骤 1/4: 构建并推送 Docker 镜像...${NC}"
|
||||
./build-and-push.sh ${TAG}
|
||||
echo ""
|
||||
|
||||
# 步骤 2: 提交到 Git
|
||||
echo -e "${BLUE}📝 步骤 2/4: 提交代码到 Git...${NC}"
|
||||
git add .
|
||||
if git diff --staged --quiet; then
|
||||
echo -e "${YELLOW}⚠️ 没有需要提交的更改${NC}"
|
||||
else
|
||||
COMMIT_MSG="${2:-Update PHP test app - $(date '+%Y-%m-%d %H:%M:%S')}"
|
||||
git commit -m "${COMMIT_MSG}"
|
||||
echo -e "${GREEN}✅ 代码已提交${NC}"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# 步骤 3: 推送到远程仓库
|
||||
echo -e "${BLUE}📤 步骤 3/4: 推送到远程仓库...${NC}"
|
||||
if git push; then
|
||||
echo -e "${GREEN}✅ 代码已推送到远程仓库${NC}"
|
||||
else
|
||||
echo -e "${RED}❌ 推送失败,请检查远程仓库配置${NC}"
|
||||
echo -e "${YELLOW}提示: 使用 'git remote -v' 查看远程仓库配置${NC}"
|
||||
exit 1
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# 步骤 4: 应用 ArgoCD 配置
|
||||
echo -e "${BLUE}🎯 步骤 4/4: 应用 ArgoCD 配置...${NC}"
|
||||
if kubectl apply -f argocd-app.yaml; then
|
||||
echo -e "${GREEN}✅ ArgoCD Application 已创建/更新${NC}"
|
||||
else
|
||||
echo -e "${YELLOW}⚠️ ArgoCD Application 应用失败,可能已存在${NC}"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# 显示部署信息
|
||||
echo -e "${GREEN}🎉 GitOps 部署流程完成!${NC}"
|
||||
echo ""
|
||||
echo -e "${BLUE}📊 部署信息:${NC}"
|
||||
echo "================================"
|
||||
echo "镜像: ${REGISTRY}/${IMAGE_NAME}:${TAG}"
|
||||
echo "Git 仓库: $(git remote get-url origin 2>/dev/null || echo '未配置')"
|
||||
echo "ArgoCD: https://argocd.u9.net3w.com"
|
||||
echo "应用访问: https://php.u9.net3w.com"
|
||||
echo ""
|
||||
echo -e "${YELLOW}⏳ ArgoCD 将在 3 分钟内自动同步部署${NC}"
|
||||
echo ""
|
||||
echo -e "${BLUE}监控命令:${NC}"
|
||||
echo " - 查看 ArgoCD 应用: kubectl get application php-test -n argocd"
|
||||
echo " - 查看 Pod 状态: kubectl get pods -n php-test"
|
||||
echo " - 查看部署日志: kubectl logs -f deployment/php-app -n php-test"
|
||||
echo " - 手动同步: argocd app sync php-test"
|
||||
25
php-test/k8s/ingress.yaml
Normal file
25
php-test/k8s/ingress.yaml
Normal file
@@ -0,0 +1,25 @@
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: php-app
|
||||
namespace: php-test
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: letsencrypt-prod
|
||||
traefik.ingress.kubernetes.io/router.entrypoints: websecure
|
||||
spec:
|
||||
ingressClassName: traefik
|
||||
tls:
|
||||
- hosts:
|
||||
- php.u9.net3w.com
|
||||
secretName: php-app-tls
|
||||
rules:
|
||||
- host: php.u9.net3w.com
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: php-app
|
||||
port:
|
||||
number: 80
|
||||
16
php-test/k8s/mysql-configmap.yaml
Normal file
16
php-test/k8s/mysql-configmap.yaml
Normal file
@@ -0,0 +1,16 @@
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: mysql-init-sql
|
||||
namespace: php-test
|
||||
data:
|
||||
init.sql: |
|
||||
USE test_db;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS test_data (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
name VARCHAR(100) NOT NULL,
|
||||
email VARCHAR(100) NOT NULL,
|
||||
message TEXT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
96
php-test/k8s/mysql-deployment.yaml
Normal file
96
php-test/k8s/mysql-deployment.yaml
Normal file
@@ -0,0 +1,96 @@
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: php-test
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: mysql-secret
|
||||
namespace: php-test
|
||||
type: Opaque
|
||||
stringData:
|
||||
MYSQL_ROOT_PASSWORD: "rootpassword"
|
||||
MYSQL_DATABASE: "test_db"
|
||||
MYSQL_USER: "phpuser"
|
||||
MYSQL_PASSWORD: "phppassword"
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: mysql-pvc
|
||||
namespace: php-test
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 1Gi
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: mysql
|
||||
namespace: php-test
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: mysql
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: mysql
|
||||
spec:
|
||||
containers:
|
||||
- name: mysql
|
||||
image: mysql:8.0
|
||||
ports:
|
||||
- containerPort: 3306
|
||||
name: mysql
|
||||
env:
|
||||
- name: MYSQL_ROOT_PASSWORD
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: mysql-secret
|
||||
key: MYSQL_ROOT_PASSWORD
|
||||
- name: MYSQL_DATABASE
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: mysql-secret
|
||||
key: MYSQL_DATABASE
|
||||
- name: MYSQL_USER
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: mysql-secret
|
||||
key: MYSQL_USER
|
||||
- name: MYSQL_PASSWORD
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: mysql-secret
|
||||
key: MYSQL_PASSWORD
|
||||
volumeMounts:
|
||||
- name: mysql-storage
|
||||
mountPath: /var/lib/mysql
|
||||
- name: init-sql
|
||||
mountPath: /docker-entrypoint-initdb.d
|
||||
volumes:
|
||||
- name: mysql-storage
|
||||
persistentVolumeClaim:
|
||||
claimName: mysql-pvc
|
||||
- name: init-sql
|
||||
configMap:
|
||||
name: mysql-init-sql
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: mysql
|
||||
namespace: php-test
|
||||
spec:
|
||||
selector:
|
||||
app: mysql
|
||||
ports:
|
||||
- port: 3306
|
||||
targetPort: 3306
|
||||
clusterIP: None
|
||||
18
php-test/k8s/php-configmap.yaml
Normal file
18
php-test/k8s/php-configmap.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: php-config
|
||||
namespace: php-test
|
||||
data:
|
||||
config.php: |
|
||||
<?php
|
||||
// 数据库配置
|
||||
define('DB_HOST', 'mysql.php-test.svc.cluster.local');
|
||||
define('DB_NAME', 'test_db');
|
||||
define('DB_USER', 'phpuser');
|
||||
define('DB_PASS', 'phppassword');
|
||||
define('DB_CHARSET', 'utf8mb4');
|
||||
|
||||
// 错误报告设置(开发环境)
|
||||
error_reporting(E_ALL);
|
||||
ini_set('display_errors', 1);
|
||||
58
php-test/k8s/php-deployment.yaml
Normal file
58
php-test/k8s/php-deployment.yaml
Normal file
@@ -0,0 +1,58 @@
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: php-app
|
||||
namespace: php-test
|
||||
spec:
|
||||
replicas: 2
|
||||
selector:
|
||||
matchLabels:
|
||||
app: php-app
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: php-app
|
||||
spec:
|
||||
containers:
|
||||
- name: php-app
|
||||
image: registry.u9.net3w.com/php-test:latest
|
||||
imagePullPolicy: Always
|
||||
ports:
|
||||
- containerPort: 80
|
||||
name: http
|
||||
volumeMounts:
|
||||
- name: php-config
|
||||
mountPath: /var/www/html/config.php
|
||||
subPath: config.php
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /
|
||||
port: 80
|
||||
initialDelaySeconds: 30
|
||||
periodSeconds: 10
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: /
|
||||
port: 80
|
||||
initialDelaySeconds: 5
|
||||
periodSeconds: 5
|
||||
volumes:
|
||||
- name: php-config
|
||||
configMap:
|
||||
name: php-config
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: php-app
|
||||
namespace: php-test
|
||||
spec:
|
||||
type: NodePort
|
||||
selector:
|
||||
app: php-app
|
||||
ports:
|
||||
- port: 80
|
||||
targetPort: 80
|
||||
nodePort: 30080
|
||||
protocol: TCP
|
||||
name: http
|
||||
39
php-test/undeploy.sh
Executable file
39
php-test/undeploy.sh
Executable file
@@ -0,0 +1,39 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
echo "🗑️ 开始清理 PHP 测试项目..."
|
||||
|
||||
# 颜色定义
|
||||
GREEN='\033[0;32m'
|
||||
BLUE='\033[0;34m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# 1. 删除 PHP 应用
|
||||
echo -e "${BLUE}🐘 删除 PHP 应用...${NC}"
|
||||
kubectl delete -f k8s/php-deployment.yaml --ignore-not-found=true
|
||||
echo -e "${GREEN}✅ PHP 应用已删除${NC}\n"
|
||||
|
||||
# 2. 删除 MySQL
|
||||
echo -e "${BLUE}🗄️ 删除 MySQL 数据库...${NC}"
|
||||
kubectl delete -f k8s/mysql-deployment.yaml --ignore-not-found=true
|
||||
echo -e "${GREEN}✅ MySQL 已删除${NC}\n"
|
||||
|
||||
# 3. 删除 ConfigMap
|
||||
echo -e "${BLUE}⚙️ 删除配置文件...${NC}"
|
||||
kubectl delete -f k8s/mysql-configmap.yaml --ignore-not-found=true
|
||||
kubectl delete -f k8s/php-configmap.yaml --ignore-not-found=true
|
||||
echo -e "${GREEN}✅ ConfigMap 已删除${NC}\n"
|
||||
|
||||
# 4. 删除命名空间(可选)
|
||||
echo -e "${YELLOW}是否删除命名空间 php-test? (y/N)${NC}"
|
||||
read -r response
|
||||
if [[ "$response" =~ ^([yY][eE][sS]|[yY])$ ]]; then
|
||||
kubectl delete namespace php-test --ignore-not-found=true
|
||||
echo -e "${GREEN}✅ 命名空间已删除${NC}\n"
|
||||
else
|
||||
echo -e "${BLUE}保留命名空间 php-test${NC}\n"
|
||||
fi
|
||||
|
||||
echo -e "${GREEN}🎉 清理完成!${NC}"
|
||||
60
php-test/watch.php
Executable file
60
php-test/watch.php
Executable file
@@ -0,0 +1,60 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
/**
|
||||
* PHP 文件监控脚本 - 用于开发环境热更新
|
||||
* 监控 PHP 文件变化并自动触发浏览器刷新
|
||||
*/
|
||||
|
||||
echo "🔥 PHP 热更新监控已启动...\n";
|
||||
echo "监控目录: " . __DIR__ . "\n";
|
||||
echo "按 Ctrl+C 停止监控\n\n";
|
||||
|
||||
$watchedFiles = [];
|
||||
$extensions = ['php', 'html', 'css', 'js'];
|
||||
|
||||
function scanDirectory($dir, $extensions) {
|
||||
$files = [];
|
||||
$iterator = new RecursiveIteratorIterator(
|
||||
new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS)
|
||||
);
|
||||
|
||||
foreach ($iterator as $file) {
|
||||
if ($file->isFile()) {
|
||||
$ext = strtolower($file->getExtension());
|
||||
if (in_array($ext, $extensions)) {
|
||||
$files[$file->getPathname()] = $file->getMTime();
|
||||
}
|
||||
}
|
||||
}
|
||||
return $files;
|
||||
}
|
||||
|
||||
// 初始化文件列表
|
||||
$watchedFiles = scanDirectory(__DIR__, $extensions);
|
||||
|
||||
echo "正在监控 " . count($watchedFiles) . " 个文件...\n\n";
|
||||
|
||||
while (true) {
|
||||
sleep(1);
|
||||
|
||||
$currentFiles = scanDirectory(__DIR__, $extensions);
|
||||
|
||||
// 检查文件变化
|
||||
foreach ($currentFiles as $file => $mtime) {
|
||||
if (!isset($watchedFiles[$file])) {
|
||||
echo "[" . date('H:i:s') . "] ✨ 新文件: " . basename($file) . "\n";
|
||||
$watchedFiles[$file] = $mtime;
|
||||
} elseif ($watchedFiles[$file] !== $mtime) {
|
||||
echo "[" . date('H:i:s') . "] 🔄 文件已更新: " . basename($file) . "\n";
|
||||
$watchedFiles[$file] = $mtime;
|
||||
}
|
||||
}
|
||||
|
||||
// 检查删除的文件
|
||||
foreach ($watchedFiles as $file => $mtime) {
|
||||
if (!isset($currentFiles[$file])) {
|
||||
echo "[" . date('H:i:s') . "] 🗑️ 文件已删除: " . basename($file) . "\n";
|
||||
unset($watchedFiles[$file]);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user