Gitea 是一个类似 GitHub 的 git 仓库托管服务。由于是 Go 写的,整个程序基本上就是一个 binary,没有过多的依赖。架设过程大概可以分为四步:

  1. 安装并配置 PostgresSQL

  2. 安装并配置 Gitea

  3. 配置 HTTP 反向代理

  4. 设置 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 里的设置一致就好。