以下为采用docker镜像
假定当前服务器ip地址为(以上3个软件都在同一个服务器)
192.168.0.1
注:在使用docker镜像时,强烈建议固定容器的镜像版本号,不要用 lastest。
这样可以保证在任何环境下都能正确运行,因为不同版本的镜像可能配置不一样。此处本人也入坑良久。
本地目录结构(包含 mysql gerrit nginx 3个软件的配置目录):
├── docker-compose.yml
├── gerrit
│ └── review_site
├── mysql
│ └── db
└── nginx
├── logs
└── nginx.conf
首先配置 Gerrit 与 Mysql,Nginx稍后再配置:
version: "3"
services:
db:
image: "mysql:5.7"
ports:
- "3306:3306"
restart: always
volumes:
- /data/mysql/db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=XXXX
gerrit:
depends_on:
- db
image: "openfrontier/gerrit:2.15.3"
ports:
- "29418:29418"
- "8080:8080"
volumes:
- /data/gerrit/review_site:/var/gerrit/review_site
environment:
- AUTH_TYPE=HTTP
- WEBURL=http://192.168.0.1:8080
- DATABASE_TYPE=mysql
- DATABASE_HOSTNAME=db
- DATABASE_PORT=3306
- DATABASE_DATABASE=gerrit
- DATABASE_USERNAME=gerrit
- DATABASE_PASSWORD=gerrit
此处必须要优先启动 Mysql 数据库,因为需要创建 gerrit 数据库以及操作 gerrit 数据库的账号
$ docker-compose up db
数据库容器启动后先以root账号进入容器:
$ docker-compose up db
容器名称可以通过 docker-compose ps 查看
以root账号进入mysql控制台
root@d73a4491dba4:/# mysql -u root -p
创建 gerrit 数据库并设置字符集 utf-8
mysql> CREATE database 数据库名 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
创建 gerrit 账号及密码(名称自己定义,主要为gerrit数据库访问用)并设置访问gerrit数据库权限
此处,为方便测试,我设置数据库,账号,密码都为 gerrit
mysql> grant all privileges on gerrit.* to gerrit@'%' identified by 'gerrit';
立即刷新权限
mysql> flush privileges;
新版本的 mysql , timestamp默认值的问题需要手动配置一下,本地测试如果不设置,gerrit创建表的时候总是报错
Exception in thread "main" com.google.gwtorm.server.OrmException: Cannot apply SQL
CREATE TABLE account_group_members_audit (
added_by INT DEFAULT 0 NOT NULL,
removed_by INT,
removed_on TIMESTAMP NULL DEFAULT NULL,
account_id INT DEFAULT 0 NOT NULL,
group_id INT DEFAULT 0 NOT NULL,
added_on TIMESTAMP NOT NULL
,PRIMARY KEY(account_id,group_id,added_on)
)
at com.google.gwtorm.jdbc.JdbcExecutor.execute(JdbcExecutor.java:44)
at com.google.gwtorm.jdbc.JdbcSchema.createRelations(JdbcSchema.java:134)
at com.google.gwtorm.jdbc.JdbcSchema.updateSchema(JdbcSchema.java:104)
at com.google.gerrit.server.schema.SchemaCreator.create(SchemaCreator.java:81)
at com.google.gerrit.server.schema.SchemaUpdater.update(SchemaUpdater.java:108)
at com.google.gerrit.pgm.init.BaseInit$SiteRun.upgradeSchema(BaseInit.java:386)
at com.google.gerrit.pgm.init.BaseInit.run(BaseInit.java:143)
at com.google.gerrit.pgm.util.AbstractProgram.main(AbstractProgram.java:61)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.google.gerrit.launcher.GerritLauncher.invokeProgram(GerritLauncher.java:204)
at com.google.gerrit.launcher.GerritLauncher.mainImpl(GerritLauncher.java:108)
at com.google.gerrit.launcher.GerritLauncher.main(GerritLauncher.java:63)
at Main.main(Main.java:24)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Invalid default value for 'added_on'
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
at com.mysql.jdbc.Util.getInstance(Util.java:408)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:943)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2497)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2455)
at com.mysql.jdbc.StatementImpl.executeInternal(StatementImpl.java:839)
at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:739)
at com.google.gwtorm.jdbc.JdbcExecutor.execute(JdbcExecutor.java:42)
... 15 more
此时可通过如下方式解决:使用 MySQL root 用户登录,设置 set global explicit_defaults_for_timestamp=1;,像下面这样:
mysql> set global explicit_defaults_for_timestamp=1;
数据库配置完成,退出
mysql> exit
$ docker-compose up gerrit
若出现以下字样,则表示gerrit启动成功
[main] INFO org.eclipse.jetty.server.Server : Started @22467ms
[main] INFO com.google.gerrit.pgm.Daemon : Gerrit Code Review 2.15.3 ready
增加环境变量:HTTPD_LISTENURL=proxy-http://*:8080/
修改环境变量:WEBURL=http://192.168.0.1:8080 为 WEBURL=http://192.168.0.1
即去掉端口号
如下:
version: "3"
services:
db:
...
gerrit:
...
environment:
- AUTH_TYPE=HTTP
- HTTPD_LISTENURL=proxy-http://*:8080/
- WEBURL=http://192.168.0.1
...
该文件是 Nginx 服务器的配置文件,可以从 nginx 容器中获取默认的配置文件,然后修改:
以下是从 Nginx 官方docker镜像网站上的方法
$ docker run --name tmp-nginx-container -d nginx:1.15.2-alpine
$ docker cp tmp-nginx-container:/etc/nginx/nginx.conf /host/path/nginx.conf
$ docker rm -f tmp-nginx-container
/host/path/nginx.conf 这个文件就是一个默认的配置文件,我们可以直接拿来修改:
在 http 段中添加 server (add start ----- add end 之间的内容):
...
http {
#add start
server {
listen *:80;
server_name gerrit;
location / {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/passwd;
proxy_pass http://gerrit:8080/;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
}
}
#add end
...
}
...
解释几个重要的地方:
- server_name gerrit;
- proxy_pass http://gerrit:8080/;
server_name 一般来说都是指定ip地址或者域名,但此处由于我们采用的是docker容器,并且是多个容器共同运行,容器之间互联则直接采用 docker-compose.yml 中的services 名即可,所以此处用了 gerrit
这点尤其重要,本人之前一直用ip地址,gerrit一直无法正常访问,掉坑2天。
- auth_basic_user_file /etc/nginx/passwd;
配置 HTTP 登陆时的认证文件,该文件保存用户账号密码,由 htpasswd 命令创建。
nginx.conf 文件配置好后,就放入本地 /data/nginx/nginx.conf,参考本文最开始的目录结构说明
$ htpasswd -c /data/gerrit/review_site/etc/passwd 姓名
回车后输入密码(htpasswd命令的具体用法可以自行百度)。
在 docker-compose.yml 中增加 Nginx 容器配置代码:
nginx:
depends_on:
- gerrit
image: "nginx:1.15.2-alpine"
ports:
- "80:80"
volumes:
- /data/nginx/nginx.conf:/etc/nginx/nginx.conf
- /data/gerrit/review_site/etc/passwd:/etc/nginx/passwd
此处的 passwd 文件由htpasswd创建并保存在本地,并且用 volumes 挂载到 Nginx 容器内
然后可以启动 Nginx 容器了:
$ docker-compose up nginx
或者停止之前的 Gerrit/Mysql 容器,然后再整个启动:
$ docker-compose down
$ docker-compose up
启动过程没有错误则搭建成功。
客户端(另外的机器)访问 http://192.168.0.1
首先由 Nginx 服务器获取并弹出输入用户名密码窗口,输入账号密码(上面由 htpasswd 命令创建)后,就会被Nginx转发到 http://192.168.0.1:8080
version: "3"
services:
db:
image: "mysql:5.7"
ports:
- "3306:3306"
restart: always
volumes:
- /data/mysql/db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=XXX
gerrit:
depends_on:
- db
image: "openfrontier/gerrit:2.15.3"
ports:
- "29418:29418"
- "8080:8080"
volumes:
- /data/gerrit/review_site:/var/gerrit/review_site
environment:
- AUTH_TYPE=HTTP
- HTTPD_LISTENURL=proxy-http://*:8080/
- WEBURL=http://192.168.0.1
- DATABASE_TYPE=mysql
- DATABASE_HOSTNAME=db
- DATABASE_PORT=3306
- DATABASE_DATABASE=gerrit
- DATABASE_USERNAME=gerrit
- DATABASE_PASSWORD=gerrit
nginx:
depends_on:
- gerrit
image: "nginx:1.15.2-alpine"
ports:
- "80:80"
volumes:
- /data/nginx/nginx.conf:/etc/nginx/nginx.conf
- /data/gerrit/review_site/etc/passwd:/etc/nginx/passwd
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
#add start
server {
listen *:80;
server_name gerrit;
location / {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/passwd;
proxy_pass http://gerrit:8080/;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
}
}
#add end
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
上面涉及到账号,密码,IP地址,文件路径的,请根据自己实际情况修改。