diff --git a/php-test/Dockerfile b/php-test/Dockerfile new file mode 100644 index 0000000..efdeabc --- /dev/null +++ b/php-test/Dockerfile @@ -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"] diff --git a/php-test/GITOPS.md b/php-test/GITOPS.md new file mode 100644 index 0000000..77af64b --- /dev/null +++ b/php-test/GITOPS.md @@ -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 会自动完成部署。 diff --git a/php-test/README.md b/php-test/README.md new file mode 100644 index 0000000..a483d05 --- /dev/null +++ b/php-test/README.md @@ -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 -n php-test` +- 查看 Pod 日志: `kubectl logs -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 diff --git a/php-test/argocd-app.yaml b/php-test/argocd-app.yaml new file mode 100644 index 0000000..5979a60 --- /dev/null +++ b/php-test/argocd-app.yaml @@ -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 diff --git a/php-test/build-and-push.sh b/php-test/build-and-push.sh new file mode 100755 index 0000000..2429917 --- /dev/null +++ b/php-test/build-and-push.sh @@ -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" diff --git a/php-test/deploy.sh b/php-test/deploy.sh new file mode 100755 index 0000000..720dc92 --- /dev/null +++ b/php-test/deploy.sh @@ -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" diff --git a/php-test/gitops-deploy.sh b/php-test/gitops-deploy.sh new file mode 100755 index 0000000..567f7e5 --- /dev/null +++ b/php-test/gitops-deploy.sh @@ -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" diff --git a/php-test/k8s/ingress.yaml b/php-test/k8s/ingress.yaml new file mode 100644 index 0000000..a6728bf --- /dev/null +++ b/php-test/k8s/ingress.yaml @@ -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 diff --git a/php-test/k8s/mysql-configmap.yaml b/php-test/k8s/mysql-configmap.yaml new file mode 100644 index 0000000..9a992da --- /dev/null +++ b/php-test/k8s/mysql-configmap.yaml @@ -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; diff --git a/php-test/k8s/mysql-deployment.yaml b/php-test/k8s/mysql-deployment.yaml new file mode 100644 index 0000000..05d820a --- /dev/null +++ b/php-test/k8s/mysql-deployment.yaml @@ -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 diff --git a/php-test/k8s/php-configmap.yaml b/php-test/k8s/php-configmap.yaml new file mode 100644 index 0000000..f91c678 --- /dev/null +++ b/php-test/k8s/php-configmap.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: php-config + namespace: php-test +data: + config.php: | + 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]); + } + } +}