使用 Docker 来安装 Redmine 并结合 gitolite 使用

上一篇介绍了 Docker 之后,仅仅过了3个月时间,Docker又增加了很多变化:
比如 Docker Machine, Docker Compose

最近项目里要把 Redmine 从盛大云到阿里云,正好可以发挥 Docker 的强项。这里分析一下需要实现的功能:

  • Redmine 服务
  • Postgres 数据库服务
  • gitolite Git repo 服务
  • 迁移老数据到新的服务里
  • Redmine 服务自启动

Install gitolite

虽然 gitolite 也有docker 提供,但是 redmine 需要访问 git 下面的 repo 文件,所以会有权限问题。
Docker 现在对 权限映射 这方面的支持还不是很好。所以我决定把 gitolite 安装在宿主机器内部。
所以 gitolite 按照官网的安装步骤安装。旧的 repo 数据只要复制覆盖 /home/git/repositories 就可以了。

Docker for Redmine

Docker hub 里搜了一下可用的 Redmine 之后,
发现 sameersbn/redmine 版本官方版本 多了很多星,
连下载量也比官方多了一倍不止。比较了下内容之后发现官方版无法支持外发邮件,所以只有选择 sameersbn 版了。

如果是完全新安装不需要迁移数据的话,可以直接使用提供的样例 docker-compose.yml 文件了。
所以 Redmine 这部分还是比较简单,使用了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
redmine:
image: quay.io/sameersbn/redmine:latest
links:
- postgresql:postgresql
environment:
- USERMAP_UID=1001
- USERMAP_GID=1001
- TZ=Asia/Beijing
- REDMINE_PORT=3000
- SMTP_ENABLED=true
- SMTP_DOMAIN=example.com
- SMTP_HOST=smtp.exmail.qq.com
- SMTP_PORT=25
- SMTP_USER=user@example.com
- SMTP_PASS=exampass
- SMTP_AUTHENTICATION=:login
- IMAP_ENABLED=false
- IMAP_USER=mailer@example.com
- IMAP_PASS=password
- IMAP_HOST=imap.gmail.com
- IMAP_PORT=993
- IMAP_SSL=true
- IMAP_INTERVAL=30
ports:
- "80:80"
volumes:
- /data/redmine:/home/redmine/data
- /home/git/repositories:/home/redmine/repositories
restart: always
  • 其中老服务器中用户上传的文件需要迁移到 /data/redmine/files 文件夹中就可以了。
  • USERMAP_UID=1001 USERMAP_GID=1001 1001 是 git 用户的 uid, gid。
    这样 docker 内的 redmine 的 uid,gid 就与git的一致,解决了权限问题。
  • restart: always 让这个 container 自启动

Docker for Postgres

上面的样例中数据库使用的是被定制化过的 Postgres ,但是我觉得官方的版本完全够用了。
迁移的策略是这样的,

  1. 先用 docker 启动一个最基本的 postgres image: docker-compose up -f /data/pg.yml

    postgresql:
      image: postgres
      environment:
        - POSTGRES_USER=redmine
        - POSTGRES_PASSWORD=secret
        - PGDATA=/data
      volumes:
        - /data/pg:/data
    
  2. 开启一个 postgres client 导入数据库旧数据,默认数据库名字是redmine

    $ docker run --link data_postgresql_1:db -v /data:/data -it postgres bash
    $ psql -h $DB_PORT_5432_TCP_ADDR -U redmine redmine < /data/pg_old_data.sql
    
  3. 链接 Redmine docker 到 postgresql docker 就可以完工了。

完整的 docker-compose.yml 文件

docker-compose.ymlview raw
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
postgresql:
image: postgres
environment:
- POSTGRES_USER=redmine
- POSTGRES_PASSWORD=redmine
- PGDATA=/data
volumes:
- /data/pg:/data
restart: always

redmine:
image: quay.io/sameersbn/redmine:latest
links:
- postgresql:postgresql
environment:
#- REDMINE_VERSION=3.0.1
- USERMAP_UID=1001
- USERMAP_GID=1001
- TZ=Asia/Beijing
- REDMINE_PORT=3000
- SMTP_ENABLED=true
- SMTP_DOMAIN=example.com
- SMTP_HOST=smtp.exmail.qq.com
- SMTP_PORT=25
- SMTP_USER=redmine@example.com
- SMTP_PASS=redminepass
#- SMTP_STARTTLS=true
- SMTP_AUTHENTICATION=:login
- IMAP_ENABLED=false
- IMAP_USER=mailer@example.com
- IMAP_PASS=password
- IMAP_HOST=imap.gmail.com
- IMAP_PORT=993
- IMAP_SSL=true
- IMAP_INTERVAL=30
- UNICORN_TIMEOUT=300
- NGINX_MAX_UPLOAD_SIZE=100m
ports:
- "80:80"
volumes:
- /data/redmine:/home/redmine/data
- /home/git/repositories:/home/redmine/repositories
restart: always