前言

Sourcegraph 是一款集代码搜索、智能提示和代码变更管理于一体的企业级开发者工具,虽然针对开源项目有 https://sourcegraph.com 可以使用,但毕竟目前主站还是托管在美国中部的机房,对于国内的网络环境来说体验并不是非常流畅。况且目前如果要添加私有仓库的话,也是需要自己搭建一个实例才可以使用的。所以才有了想要自己在阿里云杭州的机房搭建一个私有实例,来加速日常的工作流。

同步镜像到阿里云

从道理上来说,本来是应该直接 docker pull sourcegraph/server:insiders 然后就能启动镜像了的,可惜啊,在国内机房直接从 Docker Hub 拉取镜像的速度实在是感人。所以只好剑走偏锋,利用 GitHub Action 做了一个简单的同步功能,将 Sourcegraph 实时构建版本的镜像每十分钟从 Docker Hub 同步到阿里云的 Docker Registry(详见 https://github.com/unknwon/docker-sync-to-aliyun/blob/master/.github/workflows/sourcegraph.yml)。在此感谢微软的财大气粗,公开仓库的 GitHub Action 无限制免费 😄

name: Sourcegraph

on:
  schedule:
    - cron: '*/10 * * * *'

jobs:
  server:
    name: 'server:insiders'
    runs-on: ubuntu-latest
    steps:
    - name: Pull image from Docker Hub
      run: docker pull sourcegraph/server:insiders
    - name: Tag image
      run: docker tag sourcegraph/server:insiders registry.cn-hangzhou.aliyuncs.com/sourcegraph/server:insiders
    - name: Login to Aliyun registry
      uses: azure/docker-login@v1
      with:
        login-server: registry.cn-hangzhou.aliyuncs.com
        username: ${{ secrets.USERNAME }}
        password: ${{ secrets.PASSWORD }}  
    - name: Push image to Aliyun
      run: docker push registry.cn-hangzhou.aliyuncs.com/sourcegraph/server:insiders

在同步之前,需要先开通阿里云的容器镜像服务,并且创建一个镜像仓库。为了方便对应,我创建了 sourcegraph 命名空间和 server 镜像仓库,这个貌似是全局唯一的,所以大家应该就可以直接拉取并使用。

安装启动

考虑到 Sourcegraph 是需要直接访问 GitHub 主站(github.com)和 API 端点(api.github.com)的,所以需要先利用境外的机器 ping 一下这两个地址获取比较可靠的 IP 地址。然后将这两个 IP 地址添加到 Docker 镜像的 /etc/hosts 文件中,这里我已经 ping 好了,就直接和命令一起贴出来。

$ docker run -d \
    --add-host github.com:140.82.113.4 \
    --add-host api.github.com:140.82.113.6 \
    --add-host github.global.ssl.fastly.net:151.101.1.194 \
    --publish 7080:7080 \
    --volume ~/.sourcegraph/config:/etc/sourcegraph \
    --volume ~/.sourcegraph/data:/var/opt/sourcegraph \
    --name sourcegraph \
    registry.cn-hangzhou.aliyuncs.com/sourcegraph/server:insiders

这条命令就是会在后台运行 Sourcegraph 的容器,并通过 volume 功能保存关键数据,方便后续升级。

噢,这就装完了。不过呢,还需要一个反向代理服务,我使用的是 Caddy 2,配置如下:

{
    http_port 80
    https_port 443
}

sourcegraph.unknwon.cn {
    reverse_proxy * localhost:7080
}

配置教程这里就不详细展开了,后续可能还会写一个快速上手的教程,不过所有官方文档都展示在 https://docs.sourcegraph.com,大家可以尽情查阅。

版本升级

# 1. 拉取新版本的镜像
$ docker pull registry.cn-hangzhou.aliyuncs.com/sourcegraph/server:insiders
# 2. 停止当前运行的容器
$ docker stop sourcegraph
# 3. 删除已停止的容器
$ docker rm sourcegraph
# 4. 执行上个小节安装启动里的 docker run 命令
$ docker run ...
# 5. 清理过期的镜像版本
$ docker image prune --force

其它

我司招人,需要提供英文简历和进行英语视频面试,开放职位请查看 https://github.com/sourcegraph/careers。如有相中的,可以发送简历和职位信息到邮箱 joe@sourcegraph.com 进行内推后再提交求职申请应用 😊