Apache+SVN部署
一、需求
很久之前接到过同事的一个需求,需要部署一套使用http访问的SVN,用于Axure的协作作图,拖了很久后,现在终于有时间进行研究部署了。
因为我对SVN实在不熟(第一次用版本控制工具就用上了Git,没经历过SVN的时代),所以便上网找了下看有没有直接可用的镜像(类似GitLab这种的),可是实在找不到,用惯了docker后,实在是不想直接把程序部署在主机上。So,只能自己搞个镜像了。
二、借鉴
经过搜索查找,在GitHub上找到了个9年前的项目,[docker-svnbox](https://github.com/orchidflower/docker-svnbox),虽说项目很老,但是经过分析其代码,可行性很高,所以就它了。
三、创建镜像
1、创建dockerfile文件
新建apachesvn.dockerfile
文件,内容如下:
# 使用官方的Ubuntu作为基础镜像
FROM ubuntu:25.04
# 安装Subversion和Apache
RUN apt update && \
# 安装Subversion、Apache及其支持模块
apt install -y apache2 subversion libapache2-mod-svn && \
# 清理无用包
apt autoclean && apt autoremove && \
# 激活Apache模块
a2enmod dav && \
a2enmod dav_svn && \
a2enmod auth_digest;
# 设置相关环境变量
ENV SERVER_NAME=localhost \
APACHE_RUN_USER=www-data \
APACHE_RUN_GROUP=www-data \
APACHE_PID_FILE=/var/run/apache2/apache2.pid \
APACHE_RUN_DIR=/var/run/apache2 \
APACHE_LOCK_DIR=/var/lock/apache2 \
APACHE_LOG_DIR=/var/log/apache2 \
APACHE_LOG_LEVEL=warn
# 拷贝配置文件
COPY buildconf/apache2-foreground /usr/local/bin/
COPY buildconf/default.conf /etc/apache2/sites-available/000-default.conf
CMD ["apache2-foreground"]
2、配置文件
在dockerfile文件中,可以看到有两个文件是从本地拷进去的,以下是文件内容。
(1)启动文件:buildconf/apache2-foreground
#!/bin/bash
set -e
# Apache gets grumpy about PID files pre-existing
rm -f /var/run/apache2/apache2.pid && service apache2 start && tail -f /var/log/apache2/access.log && service apache2 stop
(2)apache配置文件:buildconf/default.conf
<VirtualHost *:80>
ServerName 127.0.0.1
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
<Location /svnrep>
DAV svn
SVNParentPath /opt/scmroot/svnrep
SVNListParentPath on
AuthType Digest
AuthName "SVN Access"
AuthUserFile /opt/scmroot/svnrep/svndigest
Require valid-user
</Location>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
3、创建镜像
# 创建本地镜像
docker built -f apachesvn.dockerfile -t hzz1989/apachesvn:1.0;
# 将镜像上传镜像库,可忽略。创建不成功或懒得创建镜像的,也可直接用我上传的镜像。
#docker push hzz1989/apachesvn:1.0;
四、创建docker-compose文件
其实完成前面三步,直接启动容器即可使用,但是像我这种懒人,搞个compose文件就意味着启动时少敲几下键盘……当然这个只是主要原因,还有就是核查参数和迁移较为便利。ApacheSVN-compose.yml
文件内容如下:
services:
apachesvn:
image: hzz1989/apachesvn:1.0
container_name: apachesvn
hostname: apachesvn
restart: always
volumes:
# 跟主机共用时区
- /etc/localtime:/etc/localtime
- /data/apachesvn/svnrep:/opt/scmroot/svnrep
ports:
- "19211:80"
networks:
- apachesvn
networks:
apachesvn:
driver: bridge
ipam:
driver: default
config:
- subnet: 192.168.3.0/24
五、启动和使用
1、启动容器
docker compose -f ApacheSVN-compose.yaml up -d;
2、创建SVN用户
docker exec -it apachesvn /bin/bash -c "cd /opt/scmroot/svnrep;htdigest -c svndigest 'SVN Access' axure";
3、创建SVN仓库
docker exec -it apachesvn /bin/bash -c "svnadmin create /opt/scmroot/svnrep/axure";
# 更新目录权限,方便通过apache访问。没想到吧,这里还留有一个坑……
docker exec -it apachesvn /bin/bash -c "chown -R www-data:www-data /opt/scmroot/svnrep/axure";
4、访问SVN服务
http://127.0.0.1:19211/svnrep/axure
打完收工!