From adb2cea74783f33178f2d6e53807e807849a60ef Mon Sep 17 00:00:00 2001 From: witersen <1801168257@qq.com> Date: Wed, 17 Aug 2022 12:37:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 362 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 190 insertions(+), 172 deletions(-) diff --git a/README.md b/README.md index 87e8bd1..410df42 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@ # SVNAdmin - 开源SVN管理系统 -- 该系统为使用PHP开发的基于web的Subversion(SVN)服务器端管理工具,支持docker部署 +- 基于web的Subversion(SVN)服务器端管理工具,支持docker部署 - 支持功能:SVN仓库管理、SVN用户管理、SVN分组管理、目录授权、目录浏览、Hooks管理、在线dump备份、在线备份恢复、SVN用户禁用、服务器状态管理、日志管理、消息通知、更新检测... - 演示地址:http://svnadmin.witersen.com (默认的用户名与密码都为 admin) - 项目地址: - GitHub地址:https://github.com/witersen/SvnAdminV2.0 - Gitee地址:https://gitee.com/witersen/SvnAdminV2.0 - 发行包: - - GitHub:https://github.com/witersen/SvnAdminV2.0/releases/download/v2.3.2/v2.3.2.zip - - Gitee:https://gitee.com/witersen/SvnAdminV2.0/attach_files/1126164/download/v2.3.2.zip + - GitHub:https://github.com/witersen/SvnAdminV2.0/releases/download/v2.3.3/v2.3.3.zip + - Gitee:https://gitee.com/witersen/SvnAdminV2.0/releases/download/v2.3.3/v2.3.3.zip - 兼容性 - 本程序提供 docker 镜像,基于 centos7.9.2009 构建 @@ -16,8 +16,7 @@ - PHP版本:5.5 <= PHP < 8.0 - 数据库:SQLite、MySQL - Subversion:1.8+ -- 有问题或建议可留言或加群: QQ群 633108141 -- 感觉有用请留下个 ⭐ 吧 +- 问题协助或功能建议加Q群:633108141 ## 一、手动安装 @@ -29,16 +28,14 @@ # 解压缩和网络获取工具 yum install -y zip unzip wget vim -# 由于CentOS7默认源中提供的PHP版本为5.4,因此我们使用remi源安装更高的php版本 -yum install -y epel-release -wget http://rpms.remirepo.net/enterprise/remi-release-7.rpm -rpm -Uvh remi-release-7.rpm - -# 编辑 /etc/yum.repos.d/remi.repo 文件,将想安装的PHP版本下方的enable由0改为1 -vim /etc/yum.repos.d/remi.repo +# 由于CentOS7默认源中提供的PHP版本为5.4,而我们需要 5.5+,因此使用remi源 +# 可将 remi-php55 切换为想安装的版本 +yum install -y epel-release yum-utils +rpm -Uvh https://mirrors.aliyun.com/remi/enterprise/remi-release-7.rpm +yum-config-manager --enable remi-php55 # 安装php及相关扩展 -yum install -y php php-common php-cli php-fpm php-json php-mysqlnd php-process php-json php-gd php-bcmath +yum install -y php php-common php-cli php-fpm php-json php-mysqlnd php-mysql php-pdo php-process php-json php-gd php-bcmath ``` - 安装web服务器 @@ -57,10 +54,10 @@ systemctl enable httpd cd /var/www/html/ # 代码包从发行版获取 -wget https://gitee.com/witersen/SvnAdminV2.0/attach_files/1126164/download/v2.3.2.zip +wget https://gitee.com/witersen/SvnAdminV2.0/releases/download/v2.3.3/v2.3.3.zip # 解压 -unzip v2.3.2.zip +unzip v2.3.3.zip ``` - 安装Subversion(如果你安装过Subversion,本步骤可以略过) @@ -136,21 +133,11 @@ php install.php php svnadmin.php console ``` - ### 2、在安装宝塔面板的操作系统安装示例 -- 创建站点 -- 将PHP的命令行版本更换为要求的php版本 -- 关闭站点的 open_basedir 防跨站攻击选项 -- 将站点的PHP版本更换为要求的PHP版本 -- 在软件商店对应版本的php中删除禁用的函数 - - pcntl_signal - - pcntl_fork - - pcntl_wait - - shell_exec - - passthru -- 安装和启动 - - 同上 +- 安装方式跟手动部署类似,只是宝塔系统了很多可视化操作很方便 + +- 参考视频:[SVNAdmin V2.2.1 系统部署与使用演示视频【针对宝塔面板】]( https://www.bilibili.com/video/BV1XR4y1H7p3?share_source=copy_web&vd_source=f4620db503611c42618f1afd9c8afecd) ### 3、在ubutntu18安装示例 @@ -159,7 +146,7 @@ php install.php ### 4、在Rocky安装示例 -- 无注意事项 同 1.1 +- 无注意事项 ## 二、docker安装 @@ -167,7 +154,7 @@ php install.php - ``` #拉取镜像 - docker pull witersencom/svnadmin:2.3.2 + docker pull witersencom/svnadmin:2.3.3 ``` - 仅运行查看效果(不挂载数据) @@ -178,7 +165,7 @@ php install.php -p 80:80 \ -p 3690:3690 \ --privileged \ - witersencom/svnadmin:2.3.2 + witersencom/svnadmin:2.3.3 ``` - 用于生产环境(挂载数据到容器中,容器销毁数据不会丢失) @@ -190,7 +177,7 @@ php install.php docker run -d \ --name svnadmintemp \ --privileged=true \ - witersencom/svnadmin:2.3.2 \ + witersencom/svnadmin:2.3.3 \ /usr/sbin/init #复制的数据目录为 /home/svnadmin/ @@ -201,7 +188,12 @@ php install.php dockeer stop svnadmintemp && docker rm svnadmintemp #启动正式容器 - docker run -d -p 80:80 -p 3690:3690 -v /home/svnadmin/:/home/svnadmin/ --privileged witersencom/svnadmin:2.3.2 + docker run -d \ + -p 80:80 \ + -p 3690:3690 \ + -v /home/svnadmin/:/home/svnadmin/ \ + --privileged \ + witersencom/svnadmin:2.3.3 ``` - 老用户(2.3.1+) @@ -213,70 +205,201 @@ php install.php -p 3690:3690 \ -v /home/svnadmin/:/home/svnadmin/ \ --privileged \ - svnadmin:2.3.2 + svnadmin:2.3.3 ``` ## 三、手动升级 -(程序升级的过程就是替换代码而已,只不过代码包的配置文件中可能包含了用户关于数据库连接等的配置参数,不影响仓库数据,因为所处目录不同) +### 3.1、docker用户 -所以如果之前在配置文件 $path/config/database.php 中手动切换了MySQL数据库,升级后还需要重配置数据库信息 +- docker版本只需要停止原来的镜像然后拉取新镜像即可 +- 注意将数据存在宿主机 -### 3.1、docker用户 +### 3.2、非docker用户 -``` -#数据保留在宿主机,停止并删除原来的容器,直接拉取新镜像启动即可 -#假设旧版本为 old 新版本为 new +- 程序升级本质就是用新代码替换旧代码,然后用户的数据存储目录无需改变,流程如下: + - 停止后台 php server/svnadmind.php stop + - 下载新版本代码,替换旧版本代码 + - 执行适配程序 php server/install.php + - 执行脚本并选择使用第2个选项,选择不覆盖原来的 autzh 、passwd、svnadmin.db 等文件 + - 重新启动后台 +- 如果用户之前自己修改了配置文件,则需要升级后重新修改配置文件 + +## 四、FAQ + +### 1、如何将已有的SVN仓库使用此系统管理 ? + +- (1)安装本系统 +- (2)执行 php server/install.php 使用内置的功能重新配置你的Subversion +- (3)将已有的一个或多个SVN仓库移动到 /home/svnadmin/rep/ 目录下 +- (4)刷新管理系统的仓库管理页面即可识别SVN仓库 +- (5)注意此方式并不会识别SVN仓库原有的用户以及权限配置,因为我们使用了统一的配置文件来进行用户和权限管理,因此迁移仓库后还需要在管理系统重新添加用户、用户组、配置权限! + +### 2、如何将数据库切换为MySQL ? -docker stop old && docker rm old +- 创建数据库 + +- 将系统提供的 mysql 数据库文件导入到你的MySQL数据库 + +- 修改 config/database.php 将sqlite部分注释并配置你的MySQL即可 +- 注意:若php版本过低而MySQL版本>=8.0,则会提示:The server requested authentication method unknown to the client,只需要升级php版本或者修改MySQL数据库的配置信息即可 + +### 3、为什么只支持管理Subversion1.8+ ? + +- 预计在 2.5.x 版本向下适配,支持管理 Subversion 1.5+ + +### 4、为什么目前只支持Linux操作系统 ? -docker run -d -p 80:80 -p 3690:3690 -v /home/svnadmin/:/home/svnadmin/ --privileged new +- 正在使用新方案对Windows操作系统进行支持测试 +- 预计在 2.4.x 版本支持 Windows 部署 + +### 5、仓库初始化结构模板 ? + +- 我们可以在创建仓库的时候选择创建指定内容结构的仓库,如包含 "trunk" "branches" "tags" 文件夹的结构,这一结构是可选的并且可调整的,我们可以手动调整 /home/svnadmin/templete/initStruct/01/ 下的目录结构 + +### 6、常用钩子推荐 ? + +- 我们可以在目录 /home/svnadmin/hooks/ 下增加自己常用的钩子 + - /home/svnadmin/hooks/ 下建立文件夹 xx,名称任意 + - 在 xx 下新建文件 hookDescription 写入对此钩子的描述文本内容 + - 在 xx 下新建文件 hookName 写入钩子类型,如post-commit等 + - 在 xx 下新建文件 ,以钩子类型命名,如 post-commit ,然后写入具体钩子内容 +- 感谢 【北方糙汉子-】提供的钩子脚本 + +### 7、关于Subversion 权限配置中的魔力符号 + +- Subversion从1.5开始支持用户使用一些魔力符号如 $authenticated 、$anonymous +- 预计在 2.3.4 版本支持 Subversion 的全部权限配置特性 + +### 8、关于与LDAP对接 + +- 预计在 2.4 版本重新规划系统权限分配,并支持 LDAP 等认证方式 + +### 9、如何找回密码 + +- 使用默认的SQLite数据库 ``` +#使用sqlite数据库 -### 3.2、非docker用户 +yum install -y sqlite-devel -具体操作步骤如下: +cd /home/svnadmin +sqlite3 svnadmin.db + +.header on + +.mode column + +select * from admin_users; ``` -#假设你的代码部署在 /var/www/html/ 目录下 -cd /var/www/html/ + +- 使用MySQL数据库 + - 使用可视化工具登录到数据库查看 admin_users 数据表信息即可 + +### 10、关于大文件下载中断问题 + +- 当下载1G以及以上的大文件会出现下载被中断的问题,是因为文件下载为了安全没有使用http文件直链,而是通过php校验后读取文件流下载,所以会存在一个php-fpm最大执行时间的问题,因此你可以通过 设置 php-fpm.conf 配置文件的 request_terminate_timeout 为0 来取消超时限制 + +### 11、容器重启后无法正常访问web服务(svn不受影响) + ``` -- 停止守护进程 +【原因】 +重启容器后,容器内的 httpd 由于一些原因没有成功重启 +1、构建的 docker 镜像是以 CentOS7.9.2009 为基础进行的 +由于 CentOS7.9.2009 基础镜像的权限问题:https://github.com/docker-library/docs/tree/master/centos#dockerfile-for-systemd-base-image +导致如果启动容器时不增加 --privileged 参数 和不以 /usr/sbin/init 作为首先执行的指令,将会导致容器内一些程序无法正常启动 +2、另外不排除重启后再次启动 httpd 时由于上次的 httpd.pid 文件依然造成的识别未 httpd 运行中的误判 +【解决方案】 +如果重启容器后 web 管理系统无法访问 +只需要进入容器并执行下面的命令重新启动 httpd 服务即可 +/usr/sbin/httpd +或者 +/usr/sbin/httpd -DFOREGROUND & +后面会考虑更换更方便的解决方案 ``` -#如果已经加入系统管理 通过 systemctl 关闭 -systemctl stop svnadmind -#如果手动安装 通过手动关闭 -php server/svnadmind.php stop +### 12、如果配置了多个仓库模板,如何在创建仓库时指定使用某个仓库模板? + +``` +例如: +在 /home/svnadmin/templete/initStruct/01 下面配置第一个仓库结构模板 +在 /home/svnadmin/templete/initStruct/02 下面配置第二个仓库结构模板 +如果在web中创建时,如何选用默认的 /home/svnadmin/templete/initStruct/02 下面的仓库结构模板? +【解决方案】 +由于时间问题,开发时并没有对此功能做更多的详细开发,因此只预留了配置文件层面的修改途径,后续会将仓库模板功能加入到web配置,无需手动命令行管理 +可以通过修改 config/svn.php 中的 templete_init_struct_01 值来修改 ``` -- 备份 + +### 13、docker版本要修改容器内 svn 的 3690 默认端口 ``` -cd /var/www/html/ -#请自行打包备份当前代码(代码包意义不大,包含一些程序运行配置参数,与svn仓库影响不大,还是建议备份) +【解释】 +既然使用 docker 版本,则无需考虑容器内应用的端口,因为可通过容器启动时候做端口映射 +docker版本因为处于容器中权限问题禁用了一些按钮的操作权限,如修改svn服务的端口和绑定主机等信息 +假如启动容器时,映射关系为 3691:3690 表示宿主机3691映射到容器的3690,因此在容器中修改3690为3692,会导致宿主机的3691无法提供服务 +后面会改进 docker 版本,尽量令使用体验跟原生机器一致 +【修改端口方案】 +法1 +直接在容器启动时即指定宿主机的映射端口,如 3692:3690 这样在容器中的管理系统查看还是3690,但是宿主机通过 3692 提供svn服务 +法2(通过提供的dockefile自己重构docker镜像) +修改所有文件中的3690端口为想要的端口如3692 +之后通过 docker build . -t svnadmin:xxx-edit 即可得到标签为 svnadmin:xxx-edit 的自定义构建镜像 +这样的做法好处为管理系统查看到的端口为3692,启动docker时候映射端口的写法也可为 3692:3692 ``` -- 部署新版本代码 + +### 14、如何创建其它的管理员账户 ? + ``` -cd /var/www/html/ -wget https://gitee.com/witersen/SvnAdminV2.0/attach_files/1126164/download/v2.3.2.zip -unzip v2.3.2.zip +由于目前的管理系统版本没有考虑到多用户权限管理的问题 ,此问题将在后续版本加入多用户权限管理解决 +如果需要多个不同的管理员账号可以通过向管理员表 admin_users 手动插入数据 +使用sqlite:数据库文件位置 /home/svnadmin/svnadmind.db,如果不熟悉sqlite的命令行插入,可以下载该文件到本地,使用 navicat 系列数据库管理软件打开修改,之后覆盖到服务器 +使用mysql:进入命令行手动修改 ``` -- 升级Subversion版本(1.8+)(>=1.8则无需升级) + +### 15、配置了自定义仓库模板但是创建仓库时没有生效 + ``` -#执行脚本并选择使用第1个选项 -php server/install.php +注意配置自定义仓库模板的位置 +通常的位置在 /home/svnadmin/templete/initStruct/01 下面 +而不是在项目代码相关的位置 ``` -- 执行适配程序 + +### 16、数据长度超过8192 请向上调整参数:SOCKET_READ_LENGTH + ``` -#执行脚本并选择使用第2个选项,选择不覆盖原来的 autzh 、passwd、svnadmin.db 等文件 -php server/install.php +【出现问题原因】 +svn的用户量和权限配置数量增加,超过了默认值 +【解决方案】 +修改 config/daemon.php 文件中的 SOCKET_READ_LENGTH 和 SOCKET_WRITE_LENGTH +设置到133693415 字节也就是大约小于128M貌似都是可以的,再大没有测试过 +修改后别忘记要重启守护进程,重启守护进程的方式根据安装方式的不同而不同(不重启会出问题) +【适用版本】 +2.1.0+ ``` -- 启动后台程序 + +### 17、登录时二维码总是提示输入错误 + ``` -启动方式见步骤一 +【出现问题原因】 +首次登录数据信息默认使用sqlite数据库 +由于部署问题或其它问题造成数据库文件 /home/svnadmin/svnadmin.db 没有权限 +【解决方案】 +为sqlite数据库文件和文件所在目录授权777 +chmod 777 /home/svnadmin/svnadmin.db +chmod 777 -R /home/svnadmin +如果是容器部署,需要在容器中执行此操作而不是在宿主机执行 ``` -## 四、功能介绍 + +### 18、本程序的工作模式 + +- 通过使 svnadmind.php 成为守护进程并监听指定端口来工作 +- php-fpm与php-cli程序的使用TCP套接字通信 + + ![](./00.static/03.daemon/work.png) + +## 五、功能介绍 - 登录界面可分角色登录,配合后端实现的登录验证码更安全(验证码可后台手动关闭开启) @@ -393,108 +516,3 @@ php server/install.php - SVN用户可自己修改密码 无需联系管理人员了 ![](./00.static/01.demo/29.jpg) - -## 五、待办事项 - -- [ ] 支持常见文件在线浏览 -- [ ] 支持文件和文件夹在线下载 -- [x] 支持重设仓库UUID -- [ ] 删除仓库需要输入管理人员密码 -- [x] 支持修改应用根目录 -- [ ] 支持authz、passwd文件的在线识别导入和导出 -- [x] docker部署 -- [ ] 邮件发送和仓库备份等使用异步任务 -- [ ] 支持在线仓库版本过滤、仓库版本互传 -- [ ] 在仓库列表以突出颜色标记不被支持管理的仓库,如低版本的仓库 -- [ ] 支持webhook -- [ ] 支持配置OSS进行备份 -- [ ] 支持修改封面背景图片 -- [ ] 仓库目录树视图中,文件或目录被授权过会有红点提示 -- [ ] 增加多种备份方式的支持:如 svnadmin hotcopy -- [ ] 安装svnadmin的机器之间可进行远程同步 -- [ ] 支持使用svnauthz-validate检查authz配置信息的正确性作为高级功能 -- [ ] 支持使用三种认证选项(Apache+mod_dav_svn、svnserve(用户文件和SASL)、svnserve+SSH) -- [ ] 开发微信小程序端开发(针对提交提醒) - -## 六、FAQ - -### 1、如何将已有的SVN仓库使用此系统管理 ? - -- (1)安装本系统 -- (2)执行 php server/install.php 使用内置的功能重新配置你的Subversion -- (3)将已有的一个或多个SVN仓库移动到 /home/svnadmin/rep/ 目录下 -- (4)刷新管理系统的仓库管理页面即可识别SVN仓库 -- (5)注意此方式并不会识别SVN仓库原有的用户以及权限配置,因为我们使用了统一的配置文件来进行用户和权限管理,因此迁移仓库后还需要在管理系统重新添加用户、用户组、配置权限! - -### 2、如何将数据库切换为MySQL ? - -- 创建数据库 - -- 将系统提供的 mysql 数据库文件导入到你的MySQL数据库 - -- 修改 config/database.php 将sqlite部分注释并配置你的MySQL即可 -- 注意:若php版本过低而MySQL版本>=8.0,则会提示:The server requested authentication method unknown to the client,只需要升级php版本或者修改MySQL数据库的配置信息即可 - -### 3、为什么只支持管理Subversion1.8+ ? - -- 预计在 2.5.x 版本向下适配,支持管理 Subversion 1.5+ - -### 4、为什么目前只支持Linux操作系统 ? - -- 正在使用新方案对Windows操作系统进行支持测试 -- 预计在 2.4.x 版本支持 Windows 部署 - -### 5、仓库初始化结构模板 ? - -- 我们可以在创建仓库的时候选择创建指定内容结构的仓库,如包含 "trunk" "branches" "tags" 文件夹的结构,这一结构是可选的并且可调整的,我们可以手动调整 /home/svnadmin/templete/initStruct/01/ 下的目录结构 - -### 6、常用钩子推荐 ? - -- 我们可以在目录 /home/svnadmin/hooks/ 下增加自己常用的钩子 - - /home/svnadmin/hooks/ 下建立文件夹 xx,名称任意 - - 在 xx 下新建文件 hookDescription 写入对此钩子的描述文本内容 - - 在 xx 下新建文件 hookName 写入钩子类型,如post-commit等 - - 在 xx 下新建文件 ,以钩子类型命名,如 post-commit ,然后写入具体钩子内容 -- 感谢 【北方糙汉子-】提供的钩子脚本 - -### 7、关于Subversion 权限配置中的魔力符号 - -- Subversion从1.5开始支持用户使用一些魔力符号如 $authenticated 、$anonymous -- 预计在 2.3.3 版本支持 Subversion 的全部权限配置特性 - -### 8、关于与LDAP对接 - -- 预计在 2.4 版本重新规划系统权限分配,并支持 LDAP 等认证方式 - -### 9、如何找回密码 - -- 使用默认的SQLite数据库 -``` -#使用sqlite数据库 - -yum install -y sqlite-devel - -cd /home/svnadmin - -sqlite3 svnadmin.db - -.header on - -.mode column - -select * from admin_users; -``` - -- 使用MySQL数据库 - - 使用可视化工具登录到数据库查看 admin_users 数据表信息即可 - -### 10、关于大文件下载中断问题 - -- 当下载1G以及以上的大文件会出现下载被中断的问题,是因为文件下载为了安全没有使用http文件直链,而是通过php校验后读取文件流下载,所以会存在一个php-fpm最大执行时间的问题,因此你可以通过 设置 php-fpm.conf 配置文件的 request_terminate_timeout 为0 来取消超时限制 - -### 11、本软件的工作模式 - -- 通过使 svnadmind.php 成为守护进程并监听指定端口来工作 -- php-fpm与php-cli程序的使用TCP套接字通信 - - ![](./00.static/03.daemon/work.png) \ No newline at end of file