avatar

mdo

Hello

  • 首页
  • 知识库
  • 归档
  • 标签
  • 关于
主页 单文件管多项目部署,Git / 服务器全搞
文章

单文件管多项目部署,Git / 服务器全搞

发表于 2025-11-8 更新于 2025-11- 8
作者 mdo
23~30 分钟 阅读

造轮子:单文件管多项目部署,Git / 服务器全搞定

做项目的时候,经常使用 Adminer 来便捷的操作数据库,一个 PHP 文件搞定一切,比 phpMyAdmin 要方便很多。仔细的翻了一下 Adminer 的源码, 发现它的架构设计真的精简,于是把项目部署上线的流程,也通过相同的思路,做了一个简单的单文件代码部署工具。效果如下:

工具特性

  • 🚀 单文件部署 - 类似 Adminer,一个 PHP 文件即可运行
  • 🔐 用户认证 - 简单的用户名密码认证系统
  • 📦 多项目管理 - 支持管理多个项目
  • 🖥️ 服务器管理 - 支持多个 SSH 服务器配置
  • 🔄 Git 部署 - 基于 Git 的代码拉取和部署
  • 📝 部署历史 - 完整的部署记录和日志查看
  • 🔌 插件系统 - 支持 Composer、Artisan 等插件
  • 📊 Web 界面 - 友好的 Web 管理界面

安装与使用

开发模式

cd pfinal-deployer


php -S localhost:8090 deployer.php

访问 http://localhost:8090 默认用户名: admin 默认密码: admin

生产模式(单文件)

php compile.php


php deployer-single.php

编译效果如下

php compile.php
开始编译(优化模式)...
处理: core/Logger.php
处理: lang/zh.php
处理: core/Database.php
处理: core/SecureStorage.php
处理: core/Validator.php
处理: core/CSRF.php
处理: core/SSHExecutor.php
处理: core/GitDeployer.php
处理: core/Auth.php
处理: core/Deployer.php
处理: drivers/SSHDriver.php
处理: plugins/PluginInterface.php
处理: plugins/ComposerPlugin.php
处理: plugins/ArtisanPlugin.php
处理: ui/css.php
处理: ui/js.php
处理视图: login.php
处理视图: dashboard.php
处理视图: projects.php
处理视图: project_edit.php
处理视图: servers.php
处理视图: server_edit.php
处理视图: deployments.php
处理视图: change_password.php
压缩代码(Logger.php 风格)...
压缩前: 191,638 bytes
压缩后: 129,592 bytes
压缩率: 32.4%
压缩前: 191,638 bytes
压缩后: 129,592 bytes

编译完成: deployer-single.php
文件大小: 126.55 KB
写入字节数: 129,592 bytes

编译后的代码如下:

<?php
error_reporting(E_ALL);ini_set('display_errors',1);ini_set('display_startup_errors',1);date_default_timezone_set('Asia/Shanghai');class Logger{private static $logFile=null;private static $logDir=null;public static function init($logDir=null){if($logDir===null){$logDir=__DIR__.'/storage/logs';}if(!is_dir($logDir)){@mkdir($logDir,0755,true);}self::$logDir=$logDir;self::$logFile=$logDir.'/deployer_'.date('Y-m-d').'.log';}public static function log($message,$level='INFO'){if(self::$logFile===null){self::init();}$timestamp=date('Y-m-d H:i:s');$logMessage="[{$timestamp}] [{$level}] {$message}".PHP_EOL;@file_put_contents(self::$logFile,$logMessage,FILE_APPEND);}public static function info($message){self::log($message,'INFO');}public static 

....

使用流程

  1. 添加服务器

    • 登录系统
    • 进入"服务器"页面
    • 添加 SSH 服务器信息:服务器名称、主机地址、端口、用户名、SSH 密钥
    • 测试连接
  2. 添加项目

    • 进入"项目"页面
    • 点击"添加项目"
    • 填写项目信息:名称、Git 仓库地址、分支、部署路径、选择服务器、部署前后脚本
  3. 执行部署

    • 在项目列表或仪表板点击"部署"按钮
    • 系统自动连接服务器、拉取代码、执行脚本、运行插件任务、记录日志
  4. 查看部署历史

    • 在"部署历史"页面查看部署状态、提交信息和详细日志

目录结构

pfinal-deployer/
├── deployer.php              
├── compile.php               
├── deployer-single.php      
├── core/                     
│   ├── Logger.php
│   ├── Database.php
│   ├── Auth.php
│   ├── SSHExecutor.php
│   ├── GitDeployer.php
│   ├── Deployer.php
│   └── Router.php
├── drivers/                  
│   └── SSHDriver.php
├── plugins/                  
│   ├── PluginInterface.php
│   ├── ComposerPlugin.php
│   └── ArtisanPlugin.php
├── lang/                     
│   └── zh.php
├── ui/                       
│   ├── css.php
│   ├── js.php
│   └── views/               
│       ├── login.php
│       ├── dashboard.php
│       ├── projects.php
│       ├── project_edit.php
│       ├── servers.php
│       ├── server_edit.php
│       └── deployments.php
└── storage/                  
    ├── deployer.db          
    └── logs/                

插件开发

实现 PluginInterface 接口即可创建自定义插件:

class MyPlugin implements PluginInterface {
    public function shouldRun($project) {

        return true;
    }

    public function execute($sshExecutor, $project) {

        $command = "cd {$project['deploy_path']} && your-command";
        return $sshExecutor->execute($command);
    }
}

源码: github.com/PFinal-tool…

知识库
部署
许可协议:  CC BY 4.0
分享

相关文章

10月 7, 2026

比尔盖茨的智慧:想多赚钱,就每天循环做这3件事

我们总有一种非常固执的错觉,认为那些站在财富金字塔顶端的人,必然拥有某种超越常人的特异功能。我们在脑海中给比尔盖茨这样的大佬描绘了一幅极其悲壮的奋斗画像。大家总觉得,他之所以能富可敌国,肯定是因为他每天只睡三个小时,同时对着八个电脑屏幕疯狂敲击键盘,每一秒钟都在做出价值几亿美金的生死抉择。 为了模仿

9月 28, 2026

程序员越想创业,越不要急着动手

一个能源方面的前辈找到我,希望通过我把一些人工的工作 AI 自动化。 能源方面我不懂,找 Gemini 聊完发现这个是可以复制的,非常兴奋。我跟老婆说,这个项目做好以后可以做成平台,推广到其他公司,你就等着做总裁夫人吧! 她听完以后跟我说,这个项目还是太定制化,和我之前做的一个项目很像。 那个项目一

9月 25, 2026

忍了一年多,我终于对i18n下手了过去一年,我主要参与国际机票业务的开发工作,因此每天都要和多语言(i18n)打交道

前言 大家好,我是奈德丽。 过去一年,我主要参与国际机票业务的开发工作,因此每天都要和多语言(i18n)打交道。熟悉我的朋友都知道,我这个人比较“惜力”(并不是,实际上只是忍不下去了),对于重复笨拙的工作非常抵触,于是,我开始思考如何优化团队的多语言管理模式。 痛点背景 先说说我们在机票项目中遇到的

下一篇

日报完全自动化的

上一篇

TP8使用注解+中间件实现在用户在后台某些特定操作的日志收集

最近更新

  • 比尔盖茨的智慧:想多赚钱,就每天循环做这3件事
  • iOS 侧载(Sideloading)工具
  • 程序员越想创业,越不要急着动手
  • 注册 Chat Participant
  • 中秋给在外游子的一封信

热门标签

API CodeGeex Coding Cursor DeepSeek Docker Gitkraken Harness Laravel Management

目录

©2026 mdo. 保留部分权利。