标签: docker

  • 增加 Swap 解决 Sentry 频繁死机的问题

    增加 Swap 解决 Sentry 频繁死机的问题

    我厂 Code.fun 近期进步不小,产品力顺应民意,需求导向,收获了不错的效果。欢迎有大量页面需求的朋友联系试用。

    但是随之而来产生一个问题:Sentry 不定时死机。通过腾讯云的日志分析,死机前多半会有大量的 IO 读操作,除此之外也没找到别的信息。Sentry 跑在 docker compose 里,很多组件我都不熟悉,docker 里面调试的技能我也不会,除了 docker compose logs 看日志以外,我也没有更好的办法。所以问题一直没有定位到。

    于是,最近几周就变成要查问题 -> sentry 挂了 -> 重启 -> 又要查问题 -> sentry 又挂了 -> 又重启……这样的状态。中间我试着降低 Kafka 的定时清理频率,也没有收到效果。

    后来有一天我挂着 ServerCat 看服务器状态,突然发现 Sentry 的内存好高,在 95%~98% 之间摇摆。我想起来默认的 ubuntu 好像没有配置虚拟内存,那么如果内存满了,会不会就死了呢?虽然想不到和磁盘 IO 有什么关系,不过我决定试一试。

    还好我之前搞 Sentry 磁盘优化比较成功,现在 80G 的硬盘占用基本稳定在 40G~50G 之间,有 30G 左右的富余,可以用作 swap。

    首先,使用 sudo swapon --show 查看已经挂在的 swap,果然为空。

    接着,创建一个 5G 的 swap 文件(我记得我用的不是这个命令,但是现在只能搜到这个,我周末再试一下):

    sudo fallocate -l 5G /swapfile

    改变它的权限为 600,仅供系统使用:

    sudo chmod 600 /swapfile

    将其配置为 swap:

    sudo mkswap /swapfile

    启动为 swap

    sudo swapon /swapfile

    再次使用 sudo swapon --show 即可查看使用情况:

    NAME       TYPE SIZE USED PRIO
    /swapfile1 file   5G 2.1G   -2

    配置 swap 之后几次查看,内存用量逐步降低到 80% 附近,swap 可以用满。但是死机的情况彻底消失,基本可以断定是内存的问题。之前买服务器的时候,可着最低系统要求,4C8G,看来生产环境用起来的确不太够。群里有同学还说可以偷偷改最低要求的配置,在更小的服务器上安装,那就真的只能是自己开发试着玩了。

    准备周日上午趁着人最少的时候再把 swap 调大到 8G,应该足够未来一段时间的使用。不知道将来人更多的时候会不会更挤,看来有必要把大家的取样率都下降到 2%。说不定将来都用 Sentry SaaS 会更经济呢,欢迎有经验的同学来分享。

    希望上面的内容对大家有帮助。如果你遇到其它使用 Sentry 的问题,不妨发出来,我们一起讨论,共同学习。

  • 升级 Sentry 自主部署实例

    升级 Sentry 自主部署实例

    Sentry 使用日历版本(CalVer)生成版本号,即按照特定时间来发布版本,比如今年是 2022 年,在刚刚过去的 10 月份,他们就发布了 22.10 版本。按照这种方式,很快 22.11 也会发布。

    每个版本都会有一些问题修复、新功能添加。而且,作为一个错误管理平台,里面存储数据,很多都跟我们的代码有关,所以我们也很关注它的安全问题。所以,我建议大家及时升级到新版本。

    按照 Sentry 的设计,升级其实很简单:

    1. 下载最新版本:https://github.com/getsentry/self-hosted/releases/
    2. 解压缩到目标文件夹
    3. 执行 ./install.sh 即可

    不过考虑到 清理 Sentry 磁盘占用 时需要安装 pg_repack 插件,这个过程实际要复杂一些。否则,可能会安装失败,到时候,恢复也很麻烦。

    升级 Sentry self-hosted 实例

    停用 pg_repack

    • 进入 sentry 配置目录,对于我来说,就是 ~/sentry
    • 登录 Postgresql 容器:sudo docker compose exec postgres bash
    • 之前我们已经装过 vim,所以不用再装。否则话,需要先安装一个文本编辑器:apt update && apt install vim
    • 修改配置:
      • su postgres
      • cd $PGDATA
      • vim postgresql.conf
      • shared_preload_libraries = 'pg_repack' <– 找到并注释这一句
      • 保存并退出 wq
    • 进入 postgresql shell:psql postgres
      • psql postgres
      • 执行 SQL:DROP EXTENSION pg_repack;

    更新配置文件

    • 下载新版本之后,解压缩到新目录 sentry_new
    • 备份之前的配置文件,对于我而言,需要备份三个文件:
      • ~/entry/docker-compose.yml 里面关于 Kafka 的配置
      • ~/sentry/sentry/config.yml 里的邮箱配置
      • ~/sentry/sentry/sentry.conf.py 最后面的其它配置
    • sentry_new 复制到原本的 sentry
    • 将备份的配置复制回去

    安装新版本

    接下来安装新版本:sudo ./install.sh

    安装脚本会自动停止服务,然后拉新的镜像,然后部署新的容器。这个过程会持续一段时间,与网络状态、机器性能都有关,需要提前做好准备。

    这个过程如果断开连接,会出错失败。所以建议用 screentmux 等工具保持进程运行。

    安装成功后,正常启动服务即可:sudo docker compose up -d,然后就可以使用新版本的 Sentry 了。

    清理老的镜像和容器

    一般来说,这个过程不是很必要,至少不用每次升级都做。为了避免未来的使用问题,可以先留一阵子,我建议最多清理一年前的残留镜像和容器。

    (过程方法待补充)

    常见更新失败及解决

    container for service "postgres" is unhealthy

    这就是我前面说到的原因:因为事前在 Postgresql 容器里启动过 pg_repack 插件,升级之后的容器里并没有这个插件,但因为继承了以前的存储卷(Volume),所以启动容器时还是会查找这个插件,因为容器里没有,就挂了。

    解决方案是:

    1. 回滚到之前的版本,其实就是把比老版本配置文件拷回来
    2. 因为我们并没有清理镜像和容器,所以此时老版本是可以正常启动的
    3. 不用完全启动,启动 postgresql 即可:sudo docker compose start postgres
    4. 然后登入 postgres 容器,执行前面的操作,清理 pg_repack 插件
    5. 退出并关闭 postgres 容器
    6. 重复上面的新版本安装过程

    总结

    作为一名土前端,我对 docker 不太熟悉,对 Kafka、Postgresql 也知之甚少。使用 Sentry 之后,迫不得已必须学习很多新知识,我觉得很有意思。如今我已经尽量使用 Docker Desktop 去使用和管理一些软件,我觉得很方便。接下来好好学习,争取把 Docker 生态的工具也为我所用。

    如果你有任何问题、建议,欢迎留言讨论。

  • Ubuntu 22.04 部署 Sentry 笔记

    Ubuntu 22.04 部署 Sentry 笔记

    Sentry 可能是目前最流行的缺陷管理软件,它可以帮我收集线上产品的问题,帮我们发现各种缺陷。除了 SaaS 服务以外,它还提供独立部署版本,相信大多数用户跟我一样,都觉得独立部署比较安全,这里就分享下前阵子帮我厂搭建 Sentry 的经验。

    0. 准备

    Sentry 号称需要 4核 8G 以及 20G 硬盘,但 20G 其实完全不够,我厂产品接入一半,一周就产生 20+G 的数据量。建议至少准备 100G。

    1. 安装 Docker + Compose 插件

    Sentry 私有部署版使用 docker compose 作为部署方案,所以我们要先安装 Docker 和 Compose 插件。建议先阅读上面的文档,然后可以配合下面的步骤操作。

    卸载旧版本

    sudo apt-get remove docker docker-engine docker.io containerd runc

    配置 Docker 预编译包仓库

    推荐用这种方式来安装,方便日后升级。

    $ sudo apt-get update
    
    $ sudo apt-get install \
        ca-certificates \
        curl \
        gnupg \
        lsb-release
    
    $ sudo mkdir -p /etc/apt/keyrings
    
    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    
    $ echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
      $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

    安装 Docker 和 Compose 插件

     $ sudo apt-get update
     $ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

    测试 Docker

    此时,正常来说,Docker 和 Compose 插件均安装完毕,我们可以跑个 hello-world 测试一下:

    $ sudo service docker start # 启动 docker engine 服务
    $ sudo docker run hello-world

    安装 Sentry

    下载

    https://github.com/getsentry/self-hosted/releases/latest

    下载完成后,解压到安装目录。以后所有操作都在这个目录完成,建议修改下目录名,并且放在公共目录里,方便大家管理。

    我用的目录名是 ~/sentry

    安装

    执行 sudo ./install.sh。如果你的当前用户不是 root,那么 sudo 就非常重要,否则可能会报告各种奇奇怪怪的错误。

    注意:以后的 sudo 也都是必须的。

    安装过程会比较久,要拉很多个镜像并生成容器。这个过程建议保持网络畅通,或者使用 screentmux 等工具保活,否则不小心断联就可能会前功尽弃。

    启动

    安装完成之后,执行 sudo docker compose up -d 启动服务即可。

    配置 Nginx 反向代理 9000 端口

    这段不详细解释了,有人提问的话再补充。总之:

    1. Nginx 反向代理 9000 端口
    2. 使用 Certbot 启动 https
    3. 或者申请个免费证书然后启动 https

    配置邮箱

    修改 ~/sentry/sentry/config.yml,完成邮箱配置。我们用的是腾讯企业邮箱,配置不复杂,就按照 SMTP 教程即可。需要注意的是,mail.from 要跟用户名一致,否则会发不出去。

    修改配置之后,都要重启整个 compose 集群才能生效。

    配置项目

    进入 Sentry,完成首次登录配置。

    然后创建项目,选好项目类型,就能看到配置教程,非常方便。


    总结

    Sentry 开源搞得很好,文档健全,基本能解决大部分问题。

    可惜版本比较多,互联网上有很多内容已经过期,大家阅读时要稍加分辨。

    有其它部署和使用的问题,可以留言交流。

  • 教程:搭建 SonarQube 服务并测试自己的项目

    教程:搭建 SonarQube 服务并测试自己的项目

    之前分享过 SonarQube 的使用体验,今天写篇教程介绍下如何部署自己的服务器实例,及测试自己的项目。

    官方文档写得很详细,推荐大家阅读学习:Install the Server。这篇博文我主要分享实操的经验教训。

    0. 安装 Docker

    2021年即将过去,建议大家,部署各种服务能用 Docker 最好都用 Docker。省时省力,集中精力写业务代码。

    Windows、macOS 用户推荐使用 Docker hub,Linux 用户可以命令行安装 Docker Engine——你都用 Linux 了,应该不需要我详细解释,参考 官方文档 即可。

    1. 部署 SonarQube

    1.1 保存配置文件

    有了 docker 之后,部署就很简单。先找个地方,将下面的内容保存成配置文件 sonarqube.yml

    version: "3"
    
    services:
      sonarqube:
        image: sonarqube:community
        depends_on:
          - db
        environment:
          SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
          SONAR_JDBC_USERNAME: sonar
          SONAR_JDBC_PASSWORD: sonar
        volumes:
          - sonarqube_data:/opt/sonarqube/data
          - sonarqube_extensions:/opt/sonarqube/extensions
          - sonarqube_logs:/opt/sonarqube/logs
        ports:
          - "9000:9000"
      db:
        image: postgres:12
        environment:
          POSTGRES_USER: sonar
          POSTGRES_PASSWORD: sonar
        volumes:
          - postgresql:/var/lib/postgresql
          - postgresql_data:/var/lib/postgresql/data
    
    volumes:
      sonarqube_data:
      sonarqube_extensions:
      sonarqube_logs:
      postgresql:
      postgresql_data:

    注意第5行,“sonarqube:community”,是镜像的注册名称,默认是最新版本。如果你想使用长期支持(LTS)版,可以将其改成 sonarqube:lts-community。一般来说,LTS 版本新功能会落后于最新版本,但是会更稳定,安全系数也更高。目前这个时间点,如果你想部署中文版本,必须选择 LTS,也就是 8.9.x 版本,因为中文翻译插件最高只支持 9.1,在最新版 9.2 下会报错。

    1.2 拉取镜像:

    docker-compose -f sonarqube.yml pull

    1.3 启动容器:

    docker-compose -f sonarqube.yml up

    第一次启动建议只用 up,方便看日志,判断状态。我的经验,不管是 Windows + WSL,还是云上小水管,都会报告:max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] 错误。这是虚拟机内存配置不够导致的,所以调高。

    Linux

    1. 永久修改配置:编辑 /etc/sysctl,增加 vm.max_map_count = 262144
    2. 修改当前环境:执行 sysctl -w vm.max_map_count=262144
    3. 重启 docker 服务:systemctl restart docker

    WSL

    先进入 docker 环境:

    wsl -d docker-desktop

    然后

    sysctl -w vm.max_map_count=262144

    1.4 启动为服务

    第一次启动会自动创建 Volumes(相当于磁盘),安装软件、部署各种功能、执行初始化操作等,会比较久。最后停下来时,如果 DB 服务和 SonarQube 服务都成功启动,就算完成。

    默认服务端口是 9000,启动浏览器访问 localhost:9000,此时应该可以看到下图所示的登录界面。

    默认用户名密码是 admin/admin,登录后会被要求修改。如果要对公网提供服务,建议尽量改得复杂一些。

    如果刚才启动 SonarQube 的时候只用了 up,建议先停掉,改为 up -d 再次启动为后台服务。

    2.0 配置 nginx 反向代理

    Docker 启动的服务只能内部访问,所以我们通常需要把它开放到外面,这里还是用 nginx 做反向代理:

    server {
        server_name sonarqube.meathill.com;
        root /var/www/sonarqube;
    
        location / {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host $http_host;
            proxy_pass http://127.0.0.1:9000;
    
        }
    }

    3.0 安装中文包

    SonarQube 所有语言包都是以插件形式存在的,所以要汉化 SonarQube 只需要安装中文插件即可。

    登录 SonarQube 后,进入 Administration > Marketplace,搜索 Chinese,安装简体中文包即可。安装之后需要重启,请耐心等待界面变化,按照提示一步一步走。

    SonarQube 会根据浏览器语言配置自动选择语言,没有留出显式选项。

    4.0 分析 FastTest

    全部配置完成之后,可以开始第一次分析了。

    首先我们新增项目(Add Project),选择手动(Manually)即可。当然,如果你是团队内部使用,也可以配置为以 GitHub、GitLab 为代码仓库。

    输入 token 名称,创建一个 token,将 token 复制下来。

    接下来你可以选择使用打包好的二进制文件,那就点击“继续”(Continue)然后按照提示下载二进制文件,再输入命令执行即可。我比较喜欢用 Docker,所以推荐用下面的命令,会自动拉取镜像并且执行:

    docker run \
        --rm \
        -e SONAR_HOST_URL="http://${SONARQUBE_URL}" \
        -e SONAR_LOGIN="${myAuthenticationToken}" \
        -v "/path/to/repo:/usr/src" \
        sonarsource/sonar-scanner-cli

    上面的参数中:

    • SONAR_HOST_URL 即部署后提供服务的地址
    • SONAR_LOGIN 即上一步中复制的 token
    • /path/to/repo 需要是绝对路径,如果是 Windows 系统,正常使用 \ 即可,比如 C:\works\fasttest,不需要转义
    • 如果你的 SonarQube 跑在 docker 里,又使用 docker 启动分析,那么需要增加 --network=host 参数,不然两个 container 之间无法互相访问

    最终得到的分析结果大约是这样:

    报告内容我这次就不详细解析了,回头慢慢分享。

    总结

    好,SonarQube 的部署和分析过程就分享完了,建议大家都学习使用一下,能学到很多安全性、可维护性的知识,能很好的提升团队的代码质量。如果绑定到 GitHub、GitLab 等代码仓库,还可以自动分析 PR、MR,成为工作流程的一部分。

    感兴趣又不想自己动手(或没条件)的同学可以联系我,我可以在我的服务器上给你开通账号试用。

    注意:不要上传公司的业务代码!

    注意:不要上传公司的业务代码!

    注意:不要上传公司的业务代码!