Gitea 是一个类似 GitHub 的 git 仓库托管服务。由于是 Go 写的,整个程序基本上就是一个 binary,没有过多的依赖。架设过程大概可以分为四步:
-
安装并配置 PostgresSQL
-
安装并配置 Gitea
-
配置 HTTP 反向代理
-
设置 TLS 证书与 HTTPS 安全
PostgresSQL 与 Gitea
跟着 wiki 上的步骤走就好。我的计划是 SQL HTTP 所有这些都运行在同一台机器上,所以连接可以直接用 UNIX socket,postgres 用户我也懒得设密码了。做完 initial configuration 以后就可以跳到 Gitea 的 wiki 条目从那里继续了。一切按照上面说的做就好。
HTTP 反向代理
由于这台机器以后可能还会安装其他 web 服务,最好是对外只开一个端口,不同的服务使用不同的 URL 区分,而不是每个服务都有不同的端口。我的计划是对外开放 9006 端口,跑 HTTPS 协议,对内用 HTTP 协议连接不同的服务。
安装上古神器 Apache,
# pacman -S apache
修改 /etc/httpd/conf/httpd.conf
里的端口设置,
Listen 9006
打开 HTTP 代理和 TLS 的模块,
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule ssl_module modules/mod_ssl.so LoadModule http2_module modules/mod_http2.so LoadModule proxy_http2_module modules/mod_proxy_http2.so
开启 HTTP 2 支持,
Protocols h2 http/1.1
默认的配置里会有一行注释掉的 include httpd-ssl.conf
,不需要开启,我们会在另一个文件里手写 TLS 配置。在 httpd.conf
的最后加上
# Actual services Include conf/extra/httpd-brighid.conf
然后编辑 /etc/httpd/conf/extra/httpd-brighid.conf
,
<VirtualHost *:9006>
SSLEngine on
SSLCertificateFile "/etc/ssl/private/http/cert-brighid.pem"
SSLCertificateKeyFile "/etc/ssl/private/http/cert-brighid-key.pem"
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
SSLHonorCipherOrder on
<Proxy *>
Order allow,deny
Allow from all
</Proxy>
AllowEncodedSlashes NoDecode
# Note: no trailing slash after either /git or port
ProxyPass /git http://localhost:3000 nocanon
ProxyPassReverse /git http://localhost:3000
</VirtualHost>
最后的几行就是反向代理的设置,前面的那一大堆是一些基本的 HTTPS 安全设置,这些是不够的,下一节会加更多。这是重启 httpd 和 gitea 服务,会报错,原因是
-
还没有安装 TLS 证书,下一节会继续。
-
Gitea 默认服务跑在根路径下,但是我们的服务是跑在
/git
下,这里需要修改 Gitea 的配置文件/etc/gitea/app.ini
。首先让 Gitea 只接受本地的请求,
HTTP_ADDR = localhost
ROOT_URL = https://xeno.darksair.org:9006/git
注意这个域名对 Gitea 本身并不重要,Gitea 只需要知道后面的路径就可以正确地服务,但是前面的域名会出现在 git remote 的 URL 里,所以方便起见还是要设置正确。最后禁用 DSA 的 SSH 密钥,
; Define allowed algorithms and their minimum key length (use -1 to disable a type)
[ssh.minimum_key_sizes]
ED25519 = 256
ECDSA = 256
RSA = 2048
DSA = -1
证书及安全
用 Niranira 生成一份新的证书,放到 /etc/ssl/private/http
里,文件名与 Apache 里的设置一致就好。