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

打完收工!

消息盒子

# 暂无消息 #

只显示最新10条未读和已读信息