<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Ruby China</title>
    <link>https://ruby-china.org/</link>
    <description>Ruby China社区最新发帖。</description>
    <language>en-us</language>
    <item>
      <title>开发了一个自动化运维平台，现在内测中，免费，有命令行自动化需求的欢迎试用</title>
      <description>&lt;p&gt;可以一站式帮你用自然语言开发命令行自动化脚本
地址 &lt;a href="https://qingxun.online" rel="nofollow" target="_blank"&gt;https://qingxun.online&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;试用可以找我加信用点&lt;/p&gt;</description>
      <author>zhb85</author>
      <pubDate>Thu, 16 Apr 2026 20:56:43 +0800</pubDate>
      <link>https://ruby-china.org/topics/44554</link>
      <guid>https://ruby-china.org/topics/44554</guid>
    </item>
    <item>
      <title>用 railway 这个服务器部署 ruby on rails, 发现很不错，但是有点贵，大家看看可以参考</title>
      <description>&lt;p&gt;我最近帮客户做网站，我把网站放到了 railway.com 上面，用 railway 的服务器和数据库，用 Google 存储，存储图片，&lt;/p&gt;

&lt;p&gt;里面有 330 个产品信息。分别是 330 个产品图片、中英产品介绍。&lt;/p&gt;

&lt;p&gt;但是用了 13 天，railway 的 5 美金就花完了，又充值了 5 美金...&lt;/p&gt;

&lt;p&gt;感觉对这客户有点贵，官网展示网站，服务器费用一个月得超过 10 美金...&lt;/p&gt;</description>
      <author>shibin</author>
      <pubDate>Thu, 16 Apr 2026 19:31:53 +0800</pubDate>
      <link>https://ruby-china.org/topics/44553</link>
      <guid>https://ruby-china.org/topics/44553</guid>
    </item>
    <item>
      <title>procodile, 一款类似 foreman 的工具，但可运行在前台或后台，也支持定时任务</title>
      <description>&lt;h2 id="宣布发布 procodile 2.0.0-rc1"&gt;宣布发布 &lt;code&gt;procodile&lt;/code&gt; 2.0.0-rc1&lt;/h2&gt;
&lt;p&gt;我很高兴地宣布 &lt;code&gt;procodile&lt;/code&gt; 2.0.0-rc1 正式发布。自上一个版本以来，这是一次重大更新，累计包含了 130 多个 commit。&lt;/p&gt;

&lt;p&gt;这次更新之所以非常重要，主要有以下几个原因：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;这是第一个完整实现原始 Ruby 版本功能的 &lt;a href="https://github.com/adamcooke/procodile" rel="nofollow" target="_blank" title=""&gt;procodile&lt;/a&gt; 发布版本。&lt;/li&gt;
&lt;li&gt;它还修复了原始 Ruby 版本中存在的许多 bug 和边界情况问题。(感谢 Crystal 程序语言，让暴露和修复这些问题，相对于 Ruby 简单得多）&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;与此同时，2.0 版本在原始 Ruby 版本的基础上也有了显著增强，并引入了一些此前 Ruby 版本并不具备的新功能：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;支持通过 &lt;strong&gt;&lt;code&gt;.env&lt;/code&gt; 文件&lt;/strong&gt;加载环境变量，这项功能基于 &lt;a href="/jwoertink" class="user-mention" title="@jwoertink"&gt;&lt;i&gt;@&lt;/i&gt;jwoertink&lt;/a&gt; 开发的 &lt;a href="https://github.com/luckyframework/lucky_env" rel="nofollow" target="_blank" title=""&gt;lucky_env&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;支持&lt;strong&gt;定时任务&lt;/strong&gt;。这是一次重要更新，使你可以在同一个地方同时管理长期运行的进程和定时任务。得益于 &lt;a href="/kostya" class="user-mention" title="@kostya"&gt;&lt;i&gt;@&lt;/i&gt;kostya&lt;/a&gt; 开发的 &lt;a href="https://github.com/kostya/cron_parser" rel="nofollow" target="_blank" title=""&gt;cron_parser&lt;/a&gt;，它不仅支持标准的五段式 crontab 表达式，还支持精确到秒级的 cron 调度。&lt;/li&gt;
&lt;li&gt;引入了 &lt;strong&gt;Runtime Issues&lt;/strong&gt;。当命令执行结束后如果检测到问题，你会立即在命令行中收到反馈。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;请参阅 &lt;a href="https://github.com/crystal-china/procodile/wiki" rel="nofollow" target="_blank" title=""&gt;Wiki&lt;/a&gt;，其中提供了结构清晰且内容详尽的文档说明。&lt;/p&gt;</description>
      <author>zw963</author>
      <pubDate>Wed, 15 Apr 2026 15:33:12 +0800</pubDate>
      <link>https://ruby-china.org/topics/44552</link>
      <guid>https://ruby-china.org/topics/44552</guid>
    </item>
    <item>
      <title>南京全职，预招聘，Ruby on Rails 全栈开发工程师一名（discourse 插件方向）</title>
      <description>&lt;p&gt;招 Rails 全栈开发&lt;/p&gt;

&lt;p&gt;岗位职责&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;开发 Discourse 插件（Ruby on Rails + Ember.js）&lt;/li&gt;
&lt;li&gt;维护现有插件代码，排查线上问题&lt;/li&gt;
&lt;li&gt;只招一人，学习能力强的可作为技术总监（涨工资 + 期权）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;任职要求&lt;/p&gt;

&lt;p&gt;必须&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2 年以上 Rails 开发经验，熟悉 ActiveRecord、Sidekiq（若 Rails 经验少，学习能力很强亦可）&lt;/li&gt;
&lt;li&gt;有前端框架经验（Vue/React/Ember 最好）&lt;/li&gt;
&lt;li&gt;能阅读英文技术文档&lt;/li&gt;
&lt;li&gt;熟练使用 AI 工具（Claude/Cursor 等）辅助开发&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;加分&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;有 Discourse 或其他论坛系统开发经验&lt;/li&gt;
&lt;li&gt;PostgreSQL 性能优化经验&lt;/li&gt;
&lt;li&gt;开源项目贡献&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;薪资福利&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;月薪 18-20K，13 薪&lt;/li&gt;
&lt;li&gt;五险一金&lt;/li&gt;
&lt;li&gt;工作时间 9:00-11:30，13:30-17:30，不加班（以后趋势都让 AI 干活）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;备注&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;南京地区几年没有 Ruby 岗位帖子，所以提前发布，预计 5 月开始招&lt;/li&gt;
&lt;li&gt;后期面试有 10-20 道 AI 出的选择题，判断能力范围（毕竟我也不懂代码，不会手写算法题）&lt;/li&gt;
&lt;li&gt;介意勿扰&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;联系方式
请发送简历至：724969715@qq.com
标题格式：【Rails 开发】姓名 - 工作年限&lt;/p&gt;</description>
      <author>chengr25</author>
      <pubDate>Tue, 14 Apr 2026 16:34:42 +0800</pubDate>
      <link>https://ruby-china.org/topics/44551</link>
      <guid>https://ruby-china.org/topics/44551</guid>
    </item>
    <item>
      <title>用 kamal 部署 rails 至阿里云主机总结</title>
      <description>&lt;h2 id="需求背景"&gt;需求背景&lt;/h2&gt;
&lt;p&gt;rails 开发速度很快，体验很好，但是如果无法部署到服务器上，最后也就是自己在本机玩玩，开发的网页服务不能给别人使用。
我在 deepseek 的帮助下经过一周的摸索终于实现了部署，特记录供自己后期查阅，也供其他人借鉴。真的感谢好时代，有 deepseek 不然想也不敢去想我一个个人业余开发者，身边没一个同语言开发指导老师怎么敢去想自行摸索完成部署功能。&lt;/p&gt;
&lt;h3 id="让deepseek总结kamal一次完整部署的生命周期"&gt;让 deepseek 总结 kamal 一次完整部署的生命周期&lt;/h3&gt;
&lt;p&gt;下面是 Kamal 从初始化到部署完成的完整工作流程，每一步都对应具体的操作：&lt;/p&gt;
&lt;h3 id="阶段 0：准备工作（只需一次）"&gt;阶段 0：准备工作（只需一次）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;初始化配置&lt;/strong&gt;：运行&amp;nbsp;&lt;code&gt;kamal init&lt;/code&gt;，生成&amp;nbsp;&lt;code&gt;config/deploy.yml&lt;/code&gt;&amp;nbsp;配置文件&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;配置服务器列表&lt;/strong&gt;：在&amp;nbsp;&lt;code&gt;deploy.yml&lt;/code&gt;&amp;nbsp;中指定服务器的 IP 地址或域名&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;配置容器注册表&lt;/strong&gt;：设置注册表的用户名和密码（通过环境变量加密存储）&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;设置 SSH 密钥&lt;/strong&gt;：确保本地可以免密登录服务器&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;编写 Dockerfile&lt;/strong&gt;：Rails 7+ 会自动生成，确保镜像构建正确&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="阶段 1：初始部署（kamal setup）"&gt;阶段 1：初始部署（&lt;code&gt;kamal setup&lt;/code&gt;）&lt;/h3&gt;
&lt;p&gt;这个命令会完成服务器的&lt;strong&gt;首次配置&lt;/strong&gt;：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;SSH 连接并安装 Docker&lt;/strong&gt;：连接到配置文件中的服务器，如果 Docker 未安装，自动通过&amp;nbsp;&lt;code&gt;apt-get&lt;/code&gt;&amp;nbsp;安装&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;登录容器注册表&lt;/strong&gt;：在本地和远程服务器上都登录，以便推送和拉取镜像&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;构建 Docker 镜像&lt;/strong&gt;：使用项目根目录的 Dockerfile 构建镜像&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;推送镜像到注册表&lt;/strong&gt;：将构建好的镜像推送到配置的容器注册表&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;在服务器上拉取镜像&lt;/strong&gt;：通过 SSH 命令让服务器从注册表拉取镜像&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;启动 Kamal Proxy&lt;/strong&gt;：确保代理服务正在运行，并监听 80/443 端口&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;启动应用容器&lt;/strong&gt;：基于拉取的镜像启动新的 Docker 容器&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;健康检查&lt;/strong&gt;：验证应用是否响应&amp;nbsp;&lt;code&gt;GET /up&lt;/code&gt;&amp;nbsp;请求（必须返回 200 OK）&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;清理旧资源&lt;/strong&gt;：删除未使用的镜像和停止的容器，防止磁盘占满&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="阶段 2：后续部署（kamal deploy）"&gt;阶段 2：后续部署（&lt;code&gt;kamal deploy&lt;/code&gt;）&lt;/h3&gt;
&lt;p&gt;这是日常更新应用的命令，&lt;strong&gt;只执行部署流程，不重复安装 Docker&lt;/strong&gt;：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;构建新镜像&lt;/strong&gt;：基于最新的代码构建新版本镜像&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;推送到注册表&lt;/strong&gt;：新镜像被推送到注册表，标签通常是 Git commit hash&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;SSH 连接服务器并拉取新镜像&lt;/strong&gt;：服务器从注册表拉取新版本镜像&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;启动新容器（旧容器仍在运行）&lt;/strong&gt;：在旧容器旁边启动新容器，确保服务不中断&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;健康检查&lt;/strong&gt;：等待新容器通过健康检查（&lt;code&gt;GET /up&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Kamal Proxy 切换流量&lt;/strong&gt;：代理原子性地将流量从旧容器切换到新容器&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;停止旧容器&lt;/strong&gt;：新容器稳定运行后，停止并删除旧容器&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;清理资源&lt;/strong&gt;：删除旧镜像和未使用的容器，释放磁盘空间&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="我理解kamal的功能（没怎么接触过docker）"&gt;我理解 kamal 的功能（没怎么接触过 docker）&lt;/h3&gt;
&lt;p&gt;我理解 kamal 大致功能是先将本机的开发环境和项目通过 docker 打包成镜像，push 到镜像仓库，然后登陆服务器先下载 docker，然后从镜像仓库 pull 这个镜像再还原运行。
之前尝试过在本机和服务机均安装网络代理工具，这一步实现了，但是直接参考 rails guide 部署还是会存在问题，没搞明白。只能尝试将所有可能会用到科学上网的源替换成国内的源。&lt;/p&gt;
&lt;h2 id="部署记录"&gt;部署记录&lt;/h2&gt;&lt;h3 id="step1：准备hello world项目"&gt;step1：准备 hello world 项目&lt;/h3&gt;
&lt;p&gt;新建 rails 项目&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ruby -v
rails -v
rails new rails106
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/flchenhp/2101356e-4fc7-4d84-83c6-3c1c2f067627.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;用编辑器（我用的是 trae）打开项目，做初始化保存&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#iterm
git add .
git commit -m "initial commit"
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将 gem 源改成 rubychina 的源&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# gemfile
-source "https://rubygems.org"
+source "https://gems.ruby-china.com"
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加 hello world 页面&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#iterm
rails g controller welcome index
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# app/views/welcome/index.html.erb
+&amp;lt;h1&amp;gt;hello world&amp;lt;/h1&amp;gt;
-&amp;lt;h1&amp;gt;Welcome#index&amp;lt;/h1&amp;gt;
-&amp;lt;p&amp;gt;Find me in app/views/welcome/index.html.erb&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# config/routes.rb
  root "welcome#index"
  get "welcome/index"
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动项目，查看 hello word 页面&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# iterm
bin/dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/flchenhp/0dc47b93-1671-483c-868c-e4d1ad9baacc.png!large" title="" alt=""&gt;
将代码加入 git 保存&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# iterm
git add .
git commit -m "add hello world page"
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="step2:选择云主机"&gt;step2:选择云主机&lt;/h3&gt;
&lt;p&gt;阿里云主机可以直接添加 docker，免去安装 docker 的麻烦。直接用 root 账号和设定的自定义密码，这个会用于远程服务器。
&lt;img src="https://l.ruby-china.com/photo/flchenhp/aae8e837-a9bf-4496-a43e-6fefb08ed3a7.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;远程主机验证 docker 安装成功：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 云主机命令行
docker --version
docker run hello-world
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/flchenhp/8e5a47a9-ec2e-47f4-96d2-3a046b19b798.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="step3:申请阿里云容器镜像服务（ACR）"&gt;step3:申请阿里云容器镜像服务（ACR）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;进入控制台&lt;/strong&gt;：登录后搜索“&lt;strong&gt;容器镜像服务&lt;/strong&gt;”&lt;a href="https://www.e-com-net.com/article/1683693229553299456.htm" rel="nofollow" target="_blank" title=""&gt;&lt;/a&gt;，或直接访问&amp;nbsp;&lt;a href="https://cr.console.aliyun.com/" rel="nofollow" target="_blank" title=""&gt;容器镜像服务控制台&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;按提示创建个人版实例&lt;strong&gt;（下面的信息都很重要，部署的配置文件要用）&lt;/strong&gt;
&lt;img src="https://l.ruby-china.com/photo/flchenhp/3889a199-e266-45ce-a281-878eb3537139.png!large" title="" alt=""&gt;
&lt;/li&gt;
&lt;li&gt;按提升建立命名空间
&lt;img src="https://l.ruby-china.com/photo/flchenhp/236e9c62-b255-4d3b-a6af-f3676517a301.png!large" title="" alt=""&gt;
&lt;/li&gt;
&lt;li&gt;按提示设置密码，获取登录命令
&lt;img src="https://l.ruby-china.com/photo/flchenhp/49a00360-015c-4c96-9667-0375a6c79043.png!large" title="" alt=""&gt;
&lt;/li&gt;
&lt;li&gt;获取个人加速器地址
&lt;img src="https://l.ruby-china.com/photo/flchenhp/3eab9292-3ec3-4822-a38c-3233105c35ee.png!large" title="" alt=""&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step4:在本机下载docker"&gt;step4:在本机下载 docker&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;访问&amp;nbsp;&lt;a href="https://docs.docker.com/desktop/install/mac-install/" rel="nofollow" target="_blank" title=""&gt;Docker Desktop for Mac 下载页面&lt;/a&gt;选择适宜自己电脑版本下载安装&lt;/li&gt;
&lt;li&gt;点击 Mac 顶部菜单栏的 Docker 图标，选择 Settings。在左侧菜单选择 Docker Engine，将阿里云和一些其他的加速器地址填上
&lt;code&gt;
{
"builder": {
"gc": {
  "defaultKeepStorage": "20GB",
  "enabled": true
}
},
"experimental": false,
"registry-mirrors": [
"https://5ex1e6il.mirror.aliyuncs.com",
"https://docker.1panel.live",
"https://hub.rat.dev",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.xuanyuan.me",
"https://docker.1ms.run"
]
}
&lt;/code&gt;
&lt;img src="https://l.ruby-china.com/photo/flchenhp/143e0e53-27b7-4d20-9a75-99b21880a364.png!large" title="" alt=""&gt;
&lt;/li&gt;
&lt;li&gt;打开“终端”应用，运行&lt;code&gt;docker --version&lt;/code&gt; 和&lt;code&gt;docker run hello-world&lt;/code&gt; 进行验证 docker 是否正确安装&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step5:进行部署配置"&gt;step5:进行部署配置&lt;/h3&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#rails106/config/deploy.yml
-image: rails106
+image: myrailsapp/rails106 # myrailsapp是阿里云的镜像仓库命名空间

-    - 192.168.0.1
+    - 47.x x.xx.236 # 这是阿里云的IP地址

-  server: localhost:5555
+  # 这里填阿里云的镜像仓库的公网地址
+  server: crpi-xxxxxxxxxxx.cn-zhangjiakou.personal.cr.aliyuncs.com 

-  # username: your-user
+  # 这里填阿里云的账号
+  username: chenxxxxxx21

-  # password:
+   # 这里填阿里云的镜像的固定秘密
+  password: cxxxxxx9
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;代码类似
&lt;img src="https://l.ruby-china.com/photo/flchenhp/c3815648-e03b-41ce-a17e-a0b4c7dfe760.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# rails106/Dockerfile
-# syntax=docker/dockerfile:1
+# #syntax=docker/dockerfile:1 # 第一行这里要再加个注释符号注释，不然会报错，不知道为什么

-FROM docker.io/library/ruby:$RUBY_VERSION-slim AS base
+# FROM docker.io/library/ruby:$RUBY_VERSION-slim AS base
+# 要换成ruby的国内的源，不然会卡住
+FROM docker.m.daocloud.io/library/ruby:$RUBY_VERSION-slim AS base

WORKDIR /rails
+# 设定 apt 源为阿里云镜像，不然会卡住
+RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list.d/debian.sources &amp;amp;&amp;amp; \
+    sed -i 's/security.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list.d/debian.sources
# Install base packages
RUN apt-get update -qq &amp;amp;&amp;amp; \
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;代码类似
&lt;img src="https://l.ruby-china.com/photo/flchenhp/597ab9ec-9d1c-45db-a845-e7e0b95d4d35.png!large" title="" alt=""&gt;
加入 git 仓库&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# iterm
git add .
git commit -m "add deploy set"
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="step6:打部署命令开始部署"&gt;step6:打部署命令开始部署&lt;/h3&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# iterm
bin/kamal setup
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;部署成功：
&lt;img src="https://l.ruby-china.com/photo/flchenhp/fac0b187-0b66-4db4-832d-5ec150a2f4b8.png!large" title="" alt=""&gt;
浏览器输入 ip 测试
&lt;img src="https://l.ruby-china.com/photo/flchenhp/9800797d-1852-4de5-aff6-7eae3416962d.png!large" title="" alt=""&gt;
大功告成！！！&lt;/p&gt;</description>
      <author>flchenhp</author>
      <pubDate>Mon, 13 Apr 2026 01:25:32 +0800</pubDate>
      <link>https://ruby-china.org/topics/44550</link>
      <guid>https://ruby-china.org/topics/44550</guid>
    </item>
    <item>
      <title>gems.ruby-china.com 缺少 bigdecimal 4.1.1 版本</title>
      <description>&lt;p&gt;在使用 source "&lt;a href="https://gems.ruby-china.com" rel="nofollow" target="_blank"&gt;https://gems.ruby-china.com&lt;/a&gt;" 作为 Bundler 源时，发现 bigdecimal (4.1.1) 无法获取。&lt;/p&gt;

&lt;p&gt;具体情况如下：&lt;/p&gt;

&lt;p&gt;在升级 Rails 从 8.1.1 到 8.1.2 过程中，依赖解析需要使用 bigdecimal (4.1.1)
该版本在 &lt;a href="https://rubygems.org" rel="nofollow" target="_blank"&gt;https://rubygems.org&lt;/a&gt; 上是存在的，并且可以正常安装
但在 gems.ruby-china.com 镜像源中无法获取，导致 bundle install 失败，进而影响部署&lt;/p&gt;

&lt;p&gt;报错类似：&lt;/p&gt;

&lt;p&gt;Your bundle is locked to bigdecimal (4.1.1) ... but that version can no longer be found in that source.&lt;/p&gt;

&lt;p&gt;请问是否可以帮忙同步或刷新该版本的索引？&lt;/p&gt;

&lt;p&gt;感谢支持！&lt;/p&gt;</description>
      <author>shin</author>
      <pubDate>Sun, 05 Apr 2026 19:43:08 +0800</pubDate>
      <link>https://ruby-china.org/topics/44539</link>
      <guid>https://ruby-china.org/topics/44539</guid>
    </item>
    <item>
      <title>坐班宁波，集中办公，提供食宿，聘 Java 开发工程师</title>
      <description>&lt;h2 id="项目介绍：我们是一家注册在马来西亚的公司，主要开发CEX（0-1），目前团队正处于0-1组建阶段。"&gt;项目介绍：我们是一家注册在马来西亚的公司，主要开发 CEX（0-1），目前团队正处于 0-1 组建阶段。&lt;/h2&gt;&lt;h2 id="工作方式：集中办公，坐班宁波"&gt;工作方式：集中办公，坐班宁波&lt;/h2&gt;&lt;h2 id="工作时间：单双休、九九六"&gt;工作时间：单双休、九九六&lt;/h2&gt;&lt;h2 id="薪资发放形式：RMB，每月10号发放"&gt;薪资发放形式：RMB，每月 10 号发放&lt;/h2&gt;&lt;h2 id="其他福利：提供食宿"&gt;其他福利：提供食宿&lt;/h2&gt;&lt;h2 id="岗位职责："&gt;岗位职责：&lt;/h2&gt;
&lt;p&gt;1、参与海外版各系统、高并发分布式平台的架构设计、技术选型、模块编码与重构优化，保障系统的高性能、高可用与可扩展性
2、攻克高并发、高可用、数据一致性、分布式事务等技术难题；持续进行系统性能调优，包括 JVM、数据库、缓存、中间件等
3、推动建立和优化持续集成/持续交付流程，参与技术方案评审，对项目的技术质量和按时交付负责
4、完成海外版清结算、积分、用户中心、理财、预测市场等系统开发
5、完善现有后台管理系统和 IM 功能&lt;/p&gt;
&lt;h2 id="岗位要求："&gt;岗位要求：&lt;/h2&gt;
&lt;p&gt;1、有 top15 交易所工作经验
2、有社交、web3 支付/传统支付开发经验
3、对 web3 金融有一定的理解，熟悉 defi、gamefi、合约、跟单中至少一项
4、能独立从技术层面产出 web3 行业潮流 app 调研报告，并给出初步的技术方案和建议
5、对直播、音播、语音房打赏有一定的认知
了解闪兑、dex 等基本功能&lt;/p&gt;
&lt;h2 id="加分项："&gt;加分项：&lt;/h2&gt;
&lt;p&gt;1、不排斥后续出海
2、能 base 宁波&lt;/p&gt;
&lt;h2 id="投递邮箱：camellia@we-boss.com"&gt;投递邮箱：camellia@we-boss.com&lt;/h2&gt;</description>
      <author>Camellia</author>
      <pubDate>Thu, 02 Apr 2026 16:01:41 +0800</pubDate>
      <link>https://ruby-china.org/topics/44538</link>
      <guid>https://ruby-china.org/topics/44538</guid>
    </item>
    <item>
      <title>Base 深圳、自动驾驶 AI 应用公司 ruby 后端工程师 20-30K/月</title>
      <description>&lt;h3 id="任职要求：全日制统招计算机科学/相关专业本科及以上学历，5年以上Ruby on Rails全栈加AI应用开发经验（联系微信：13822214255）"&gt;任职要求：全日制统招计算机科学/相关专业本科及以上学历，5 年以上 Ruby on Rails 全栈加 AI 应用开发经验（联系微信：13822214255）&lt;/h3&gt;
&lt;p&gt;2、丰富的单元测试经验，注重 TDD（测试驱动开发）\熟练运用 Rails 7 框架； &lt;/p&gt;

&lt;p&gt;3、具备 BDD 经验，推动团队采用测试驱动的开发方法；熟练掌握数据库设计和优化；&lt;/p&gt;

&lt;p&gt;4、熟悉 SaaS 产品架构设计，有丰富的分布式系统设计、高并发、高可用性经验；&lt;/p&gt;

&lt;p&gt;5、熟悉 Ruby on Rails 框架，了解其原理和机制，有丰富的 Rails 项目实战经验；&lt;/p&gt;

&lt;p&gt;6、熟悉 AI 大模型应用技术，如 TensorFlow、PyTorch 等，有实际项目应用经验；&lt;/p&gt;

&lt;p&gt;7、熟悉 PostgreSQL、Redis、MongoDB 等数据库，了解数据库优化技巧；&lt;/p&gt;

&lt;p&gt;8、熟悉 Linux 操作系统，熟悉常用命令和脚本编程；&lt;/p&gt;

&lt;p&gt;9、具备良好的团队协作和沟通能力，能承担一定的技术领导责任；&lt;/p&gt;

&lt;p&gt;10、有成功带领团队开发大型项目的经验，有带团队解决复杂技术问题的经验。&lt;/p&gt;
&lt;h2 id="岗位职责："&gt;岗位职责：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;负责 SaaS 产品的整体架构设计、技术选型与技术创新/优化&lt;/li&gt;
&lt;li&gt;带领团队进行系统开发、优化及维护，确保系统稳定、高效、可扩展；&lt;/li&gt;
&lt;li&gt;负责制定并推行技术规范和开发流程，提升团队开发效率和代码质量；&lt;/li&gt;
&lt;li&gt;负责技术难题的攻关，解决系统性能瓶颈，提高系统资源利用率；&lt;/li&gt;
&lt;li&gt;参与公司战略规划，推动新技术的研究与实践，提升产品竞争力；&lt;/li&gt;
&lt;li&gt;领导团队进行 AI 大模型业务场景应用的研发，探索业务场景的创新应用，提供技术方案和实施指导。
我们提供：&lt;/li&gt;
&lt;li&gt;具有竞争力的薪资待遇，股权激励；&lt;/li&gt;
&lt;li&gt;宽广的个人发展空间和职业晋升机会；&lt;/li&gt;
&lt;li&gt;舒适的工作环境和良好的团队氛围；&lt;/li&gt;
&lt;li&gt;完善的福利待遇，如五险一金、带薪年假、员工体检等。&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>jeffaima</author>
      <pubDate>Thu, 02 Apr 2026 13:41:16 +0800</pubDate>
      <link>https://ruby-china.org/topics/44537</link>
      <guid>https://ruby-china.org/topics/44537</guid>
    </item>
    <item>
      <title>Ruby 全栈工程师（上海）</title>
      <description>&lt;p&gt;关于我们：
About us:&lt;/p&gt;

&lt;p&gt;At DiningCity, we build software that users across China and the world use to make reservations. Whether through our apps or partner programs, we strive to create products that have a big impact.
鼎食聚的服务是面向中国以及全球提供高端餐饮预订服务，我们的使命是提供更好的用餐体验。不管是通过我们的 APP、网站还是合作伙伴，我们都在努力地创造对用户具有重大影响和有价值的产品。&lt;/p&gt;

&lt;p&gt;We are looking for an engineer to be part of our journey and help us tackle ambitious challenges.
我们是一个国际化的团队，在不同的国家、地区、城市有办公室，期待您的加入和我们一起迎接挑战创造未来。&lt;/p&gt;

&lt;p&gt;Responsibilities
职责
Work with our development team to build new features for our platform.
和我们一起来开发和维护平台;
Learn new frameworks to improve our back-end’s code base and performance.
不断学习新的东西，优化代码;
Apply your academic knowledge to real user facing problems that will have a visible impact on DiningCity’s products.
将您丰富的学识和经验用于解决用户真正面临的问题，使产品更加完善;
Work with Product to ensure the technical feasibility of feature requirements
与产品一起工作研究用户体验和尝试新的技术;&lt;/p&gt;

&lt;p&gt;Who you are
要求&lt;/p&gt;

&lt;p&gt;Minimum 5 years’experience in Ruby on Rails ;
至少 5 年 Ruby on Rails 全栈开发经验，熟悉 Linux 系统，SQL;
knows about front-end development skills.
对前端有深入的了解;
You are a detail oriented, self-motivated, strong learner who is eager to broaden his portfolio or real-world applications / projects;
希望您是一个注重与人合作，关注细节、自我激励、学习能力强、渴望拓宽眼界和项目经验的人;
Passionate about Ruby and Rails, with a strong desire to pursue technical depth and stay updated with the latest industry trends;
对 Ruby 和 Rails 充满热情，有强烈的意愿追求技术深度并紧跟行业最新趋势;
A team player who thrives in a collaborative environment and is committed to the long-term success and maintenance of the product;
具备团队合作精神，能在协作环境中茁壮成长，并致力于产品的长期成功和维护;
You are a bachelor degree in computer science, electrical engineering or similar majors school;
计算机、电子信息技术或相关专业学校;
Can show a GitHub repository with corresponding projects(plus);
在 github 上有项目（加分项）;
 spoken and written english(plus)
良好的英语书写或口语能力者优先；&lt;/p&gt;

&lt;p&gt;薪酬范围：20K-23K/月&lt;/p&gt;

&lt;p&gt;公司背景：外资企业，企业氛围 nice&lt;/p&gt;

&lt;p&gt;福利：年假、病假、弹性工作时间、交通便利、英语环境、Team Building、No 加班等&lt;/p&gt;

&lt;p&gt;办公地点：上海市徐汇区广元路 (靠近 One ITC) 工作时间：9:00 AM – 18:00PM（午休时间：12:00AM – 13:30PM）&lt;/p&gt;

&lt;p&gt;HR Email: vane@diningcity.asia Tel: +86 21 3107 6109 交通：地铁 1、9、11 号线徐家汇站 15 号口出 &lt;/p&gt;

&lt;p&gt;China Team is looking forward to working with you!&lt;/p&gt;</description>
      <author>DiningCity</author>
      <pubDate>Wed, 01 Apr 2026 10:55:43 +0800</pubDate>
      <link>https://ruby-china.org/topics/44536</link>
      <guid>https://ruby-china.org/topics/44536</guid>
    </item>
    <item>
      <title>cloudfare vercel 部署后得到的链接国内用不了，求推荐域名服务～</title>
      <description>&lt;p&gt;///&lt;/p&gt;</description>
      <author>zzz6519003</author>
      <pubDate>Tue, 31 Mar 2026 15:37:42 +0800</pubDate>
      <link>https://ruby-china.org/topics/44534</link>
      <guid>https://ruby-china.org/topics/44534</guid>
    </item>
    <item>
      <title>远程 - 海外游戏公司招聘 2 个职位 - 渗透测试 - 安全运营</title>
      <description>&lt;p&gt;感谢平台。代友转发。&lt;/p&gt;

&lt;p&gt;入职公司为世界排名靠前的在线游戏公司。总部在日本。远程办公，发 U。自行负担社保。&lt;/p&gt;

&lt;p&gt;安全团队有一定规模，氛围和睦友爱。同事都不错。来自于亚洲各国。&lt;/p&gt;

&lt;p&gt;工作稳定，没犯大错不裁人，很多同事都入职多年。&lt;/p&gt;

&lt;p&gt;招聘 2 个职位，渗透测试与安全运营
欢迎联系 TG &lt;a href="/wadewang666" class="user-mention" title="@wadewang666"&gt;&lt;i&gt;@&lt;/i&gt;wadewang666&lt;/a&gt;&lt;br&gt;
aartrikkers7@gmail.com &lt;/p&gt;
&lt;h2 id="职位1. 安全运营工程师"&gt;职位 1. 安全运营工程师&lt;/h2&gt;&lt;h2 id="岗位职责："&gt;岗位职责：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;安全监控与日志分析
负责 Splunk 等 SIEM 平台的日常运营和优化，设计并实现安全日志收集、存储、分析策略；
监控各类安全日志，识别异常行为，分析安全事件，提升检测能力；
创建并维护 SIEM 规则、仪表盘、告警策略，提高威胁检测效率。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;应急响应与事件处置
负责安全事件的应急响应，包括安全威胁分析、溯源、处置及修复；
组织并执行安全演练，提高组织的安全应急响应能力；
编写安全事件分析报告，提供改进建议并推动安全加固措施落地。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;云安全防护
负责云环境的安全策略实施和优化，确保云基础设施的安全性；
监控和评估云安全风险，制定相应的缓解方案，并与云服务商协调解决安全问题；&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;安全工具及自动化
研究并部署安全自动化工具，提升安全运营效率，如 SOAR 等
开发和优化安全检测及响应自动化脚本，提高威胁处置的及时性和准确性；
参与威胁情报收集与分析，增强攻击预警能力。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="任职要求："&gt;任职要求：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;熟悉 Splunk 等 SIEM 平台的部署、管理、规则编写及告警优化，有 Splunk ES（Enterprise Security）经验者优先；&lt;/li&gt;
&lt;li&gt;具备安全事件分析与应急响应能力，熟悉 APT 攻击分析、恶意代码分析、网络入侵溯源等技术；&lt;/li&gt;
&lt;li&gt;熟悉主流云计算平台的安全架构、日志分析和防护机制&lt;/li&gt;
&lt;li&gt;熟悉常见安全框架和标准，如 MITRE ATT&amp;amp;CK、CIS、NIST、ISO 27001&lt;/li&gt;
&lt;li&gt;具备一定的编程能力（Python、java、Bash 等），能够开发安全自动化工具；&lt;/li&gt;
&lt;li&gt;良好的团队协作能力，能够与其他安全团队、IT 团队、开发团队紧密配合，提升企业整体安全水平。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="渗透测试工程师"&gt;渗透测试工程师&lt;/h2&gt;&lt;h2 id="岗位职责"&gt;岗位职责&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;负责对公司业务系统、网络设备、云平台及移动应用进行渗透测试与安全评估，发现潜在安全漏洞并输出报告。&lt;/li&gt;
&lt;li&gt;模拟真实攻击场景，对目标系统进行渗透、提权、横向移动等测试，验证安全防护有效性。&lt;/li&gt;
&lt;li&gt;对扫描和测试发现的漏洞进行验证、分析与复现，并提供修复建议。&lt;/li&gt;
&lt;li&gt;参与应急响应，协助分析和溯源安全事件。&lt;/li&gt;
&lt;li&gt;跟踪最新安全漏洞、攻击技术与安全工具，并进行内部技术分享。&lt;/li&gt;
&lt;li&gt;协助开发团队与运维团队进行安全加固与安全意识培训。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="任职资格"&gt;任职资格&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;熟悉常见操作系统（Linux/Windows）的安全机制与弱点。&lt;/li&gt;
&lt;li&gt;精通 OWASP Top 10、常见 Web 漏洞（SQL 注入、XSS、CSRF、文件上传、SSRF、RCE 等）及防护方法。&lt;/li&gt;
&lt;li&gt;熟悉网络协议（TCP/IP、HTTP/HTTPS、DNS 等）及其安全隐患。&lt;/li&gt;
&lt;li&gt;熟练使用常见渗透测试工具（如 Burp Suite、Metasploit、Nmap、Nessus、Kali Linux 工具集等）。&lt;/li&gt;
&lt;li&gt;能够编写简单的脚本或工具（Python、Bash、PowerShell、Go 等）用于漏洞验证与利用。&lt;/li&gt;
&lt;li&gt;具备较强的分析能力、学习能力与团队协作精神。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="加分项"&gt;加分项&lt;/h2&gt;
&lt;p&gt;• 具备红队、APT、社工、钓鱼等高级攻防经验。
• 具有 SDL 经验
• 熟悉云安全的攻击面与防护策略。
• 具备一定的逆向分析、漏洞挖掘或二进制安全能力。&lt;/p&gt;</description>
      <author>sg552sg552</author>
      <pubDate>Wed, 25 Mar 2026 11:05:34 +0800</pubDate>
      <link>https://ruby-china.org/topics/44530</link>
      <guid>https://ruby-china.org/topics/44530</guid>
    </item>
    <item>
      <title>Ruby 全栈工程师</title>
      <description>&lt;p&gt;工作职责：
负责业务系统的全栈研发与迭代（需求评审、方案设计、开发、测试、上线、排障）
负责业务系统的全栈研发与迭代（需求评审、方案设计、开发、测试、上线、排障）
前端配合完成页面与交互开发，推动组件化与工程质量提升（熟悉 React 更佳）
协助团队使用 AI Agent 类工具，沉淀可复制的研发流程与最佳实践（Prompt/工具调用/评测/发布/回滚）
协助公司部署整套类 openclaw 工具体系（智能体编排、工具注册、权限与审计、日志与可观测、评测与版本管理等）
基于现有 ERP，开发公司的 Agent 和 Skill：将 ERP/内部系统能力封装为可调用工具，支持查询、填报、审批、对账等业务动作，保证可控、可测、可追责&lt;/p&gt;

&lt;p&gt;任职要求：
5 年以上 Web/企业应用开发经验，有复杂需求的稳定交付与问题闭环能力
扎实的软件工程基础：抽象建模、代码结构、测试意识、线上排障与稳定性意识
•熟悉后端开发与 API 设计，能对接企业系统并处理权限、审计、失败重试、幂等等真实场景
对 AI Agent / Tool Use / Workflow 编排 / RAG / 评测 等有理解与兴趣，愿意深入并推动落地
技术栈方面：Ruby 经验优先；如主语言为 Node/Python，需能快速上手 Ruby/Rails 并参与核心服务迭代&lt;/p&gt;</description>
      <author>elele</author>
      <pubDate>Mon, 23 Mar 2026 22:59:10 +0800</pubDate>
      <link>https://ruby-china.org/topics/44529</link>
      <guid>https://ruby-china.org/topics/44529</guid>
    </item>
    <item>
      <title>Ruby 小白，做了个女性友好的诗歌 web app</title>
      <description>&lt;p&gt;📱：&lt;a href="https://pomes.petercat.life/" rel="nofollow" target="_blank"&gt;https://pomes.petercat.life/&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="起初的想法"&gt;起初的想法&lt;/h3&gt;
&lt;p&gt;去年冬天的时候就想着设计一款女性友好的诗歌 app&lt;/p&gt;
&lt;h3 id="落地实现"&gt;落地实现&lt;/h3&gt;
&lt;p&gt;2026 年开春了，借着当下 AI 编程的浪潮&lt;/p&gt;

&lt;p&gt;选择用 Ruby 技术展现出这么个诗歌网站&lt;/p&gt;

&lt;p&gt;这么个诗歌的小屋，用到的不过是那一点点技术
几行 Ruby 代码，一个 SQLite3，再加上让文字呼吸顺畅的 CSS 间距。&lt;/p&gt;

&lt;p&gt;在古法编程的时代来看一个小白要做出一个 app 并部署上线，要学习比较长时间的
如今来看这么个 app 并没有什么傲人的地方，门槛也比较低&lt;/p&gt;

&lt;p&gt;但是有的时候也常常想，如果更多女性来学这一点点技，多一些这样的港湾也蛮好&lt;/p&gt;
&lt;h3 id="ps：想问问群里的一些深耕Ruby领域多年的“老员工”"&gt;ps：想问问群里的一些深耕 Ruby 领域多年的“老员工”&lt;/h3&gt;
&lt;p&gt;Ruby 在国内的就业市场相比几年前下滑？&lt;/p&gt;

&lt;p&gt;几年前就听说 Ruby 在国内用人招人不好招 😂&lt;/p&gt;

&lt;p&gt;不过呢，学习 Ruby 倒不是说一味的奔着找工作去的&lt;/p&gt;

&lt;p&gt;目前以兴趣在驱动着学习，能够把自己的一些想法借助 AI coding 落地（以兴趣为主）&lt;/p&gt;</description>
      <author>AixCoder</author>
      <pubDate>Mon, 23 Mar 2026 14:45:29 +0800</pubDate>
      <link>https://ruby-china.org/topics/44528</link>
      <guid>https://ruby-china.org/topics/44528</guid>
    </item>
    <item>
      <title>最近学 rust，vibe 了一个序列化器，想念宏魔法</title>
      <description>&lt;p&gt;整出这样的代码&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use crate::ast::Json;
use crate::parser::parse;
use std::collections::HashMap;

pub trait ToJson { fn to_json_value(&amp;amp;self) -&amp;gt; Json; }
pub trait FromJson: Sized { fn from_json_value(v: Json) -&amp;gt; Result&amp;lt;Self, String&amp;gt;; }

pub trait Serialize { fn serialize(&amp;amp;self) -&amp;gt; String; }
pub trait Deserialize: Sized { fn deserialize(s: &amp;amp;str) -&amp;gt; Result&amp;lt;Self, String&amp;gt;; }

impl&amp;lt;T: ToJson&amp;gt; Serialize for T { fn serialize(&amp;amp;self) -&amp;gt; String { self.to_json_value().to_string() } }
impl&amp;lt;T: FromJson&amp;gt; Deserialize for T { fn deserialize(s: &amp;amp;str) -&amp;gt; Result&amp;lt;Self, String&amp;gt; { let j = parse(s)?; FromJson::from_json_value(j) } }

// Primitive impls
impl ToJson for String { fn to_json_value(&amp;amp;self) -&amp;gt; Json { Json::String(self.clone()) } }
impl ToJson for &amp;amp;str { fn to_json_value(&amp;amp;self) -&amp;gt; Json { Json::String(self.to_string()) } }
impl ToJson for bool { fn to_json_value(&amp;amp;self) -&amp;gt; Json { Json::Bool(*self) } }
impl ToJson for f64 { fn to_json_value(&amp;amp;self) -&amp;gt; Json { Json::Number(*self) } }
impl ToJson for i64 { fn to_json_value(&amp;amp;self) -&amp;gt; Json { Json::Number(*self as f64) } }
impl ToJson for u64 { fn to_json_value(&amp;amp;self) -&amp;gt; Json { Json::Number(*self as f64) } }

impl FromJson for String { fn from_json_value(v: Json) -&amp;gt; Result&amp;lt;Self, String&amp;gt; { if let Json::String(s) = v { Ok(s) } else { Err("expected string".into()) } } }
impl FromJson for bool { fn from_json_value(v: Json) -&amp;gt; Result&amp;lt;Self, String&amp;gt; { if let Json::Bool(b) = v { Ok(b) } else { Err("expected bool".into()) } } }
impl FromJson for f64 { fn from_json_value(v: Json) -&amp;gt; Result&amp;lt;Self, String&amp;gt; { if let Json::Number(n) = v { Ok(n) } else { Err("expected number".into()) } } }
impl FromJson for i64 { fn from_json_value(v: Json) -&amp;gt; Result&amp;lt;Self, String&amp;gt; { if let Json::Number(n) = v { Ok(n as i64) } else { Err("expected number".into()) } } }
impl FromJson for u64 { fn from_json_value(v: Json) -&amp;gt; Result&amp;lt;Self, String&amp;gt; { if let Json::Number(n) = v { Ok(n as u64) } else { Err("expected number".into()) } } }

// Option
impl&amp;lt;T: ToJson&amp;gt; ToJson for Option&amp;lt;T&amp;gt; { fn to_json_value(&amp;amp;self) -&amp;gt; Json { match self { Some(v) =&amp;gt; v.to_json_value(), None =&amp;gt; Json::Null } } }
impl&amp;lt;T: FromJson&amp;gt; FromJson for Option&amp;lt;T&amp;gt; { fn from_json_value(v: Json) -&amp;gt; Result&amp;lt;Self, String&amp;gt; { match v { Json::Null =&amp;gt; Ok(None), other =&amp;gt; Ok(Some(FromJson::from_json_value(other)?)) } } }

// Vec
impl&amp;lt;T: ToJson&amp;gt; ToJson for Vec&amp;lt;T&amp;gt; { fn to_json_value(&amp;amp;self) -&amp;gt; Json { Json::Array(self.iter().map(|v| v.to_json_value()).collect()) } }
impl&amp;lt;T: FromJson&amp;gt; FromJson for Vec&amp;lt;T&amp;gt; { fn from_json_value(v: Json) -&amp;gt; Result&amp;lt;Self, String&amp;gt; { if let Json::Array(arr) = v { arr.into_iter().map(|el| FromJson::from_json_value(el)).collect() } else { Err("expected array".into()) } } }

// HashMap&amp;lt;String, T&amp;gt;
impl&amp;lt;T: ToJson&amp;gt; ToJson for HashMap&amp;lt;String, T&amp;gt; { fn to_json_value(&amp;amp;self) -&amp;gt; Json { let mut m = HashMap::new(); for (k, v) in self.iter() { m.insert(k.clone(), v.to_json_value()); } Json::Object(m) } }
impl&amp;lt;T: FromJson&amp;gt; FromJson for HashMap&amp;lt;String, T&amp;gt; { fn from_json_value(v: Json) -&amp;gt; Result&amp;lt;Self, String&amp;gt; { if let Json::Object(map) = v { let mut out = HashMap::new(); for (k, v) in map { out.insert(k, FromJson::from_json_value(v)?); } Ok(out) } else { Err("expected object".into()) } } }

&lt;/code&gt;&lt;/pre&gt;</description>
      <author>zzz6519003</author>
      <pubDate>Thu, 19 Mar 2026 21:08:18 +0800</pubDate>
      <link>https://ruby-china.org/topics/44525</link>
      <guid>https://ruby-china.org/topics/44525</guid>
    </item>
    <item>
      <title>有没有山东省的 ruby on rails 爱好者？请加我，一起做事</title>
      <description>&lt;p&gt;有没有山东省的 ruby on rails 爱好者？请加我，一起做事，微信：shibincare&lt;/p&gt;</description>
      <author>shibin</author>
      <pubDate>Thu, 19 Mar 2026 17:56:16 +0800</pubDate>
      <link>https://ruby-china.org/topics/44524</link>
      <guid>https://ruby-china.org/topics/44524</guid>
    </item>
    <item>
      <title>没买海外 vps 时如何解决 kamal deploy 的 EOF 问题</title>
      <description>&lt;p&gt;最近在部署 &lt;code&gt;3qruok.com&lt;/code&gt; 的时候被墙又戏耍了，在国内环境下使用 Docker，网络问题始终是绕不开的痛点。即便你本地开启了系统的 TUN 模式或全局代理，在使用 Kamal 进行部署时，依然可能遇到下面这种让人冒火的“玄学”报错：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DEBUG [1ecc2695] ERROR: failed to build: failed to solve: failed to fetch anonymous token: 
Get "[https://auth.docker.io/token?scope=repository%3Alibrary%2Fruby%3Apull&amp;amp;service=registry.docker.io](https://auth.docker.io/token?scope=repository%3Alibrary%2Fruby%3Apull&amp;amp;service=registry.docker.io)": EOF
...
docker stdout: #0 building with "kamal-local-docker-container" instance using docker-container driver
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;明明机器已经开启了 TUN 模式，为什么 Docker 构建时还是拿不到 Token 导致 EOF？&lt;/p&gt;
&lt;h2 id="核心矛盾：消失的网络继承"&gt;核心矛盾：消失的网络继承&lt;/h2&gt;
&lt;p&gt;问题的根源在于 Kamal 默认的构建机制。Kamal 在打包时会创建一个名为 &lt;code&gt;kamal-local-docker-container&lt;/code&gt; 的构建器，它使用的是 &lt;strong&gt;&lt;code&gt;docker-container&lt;/code&gt; 驱动&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="什么是 docker-container 驱动？"&gt;什么是 docker-container 驱动？&lt;/h3&gt;
&lt;p&gt;它的本质是在你的 Docker 中启动一个独立的 &lt;strong&gt;BuildKit 容器&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;它的使命&lt;/strong&gt;：实现跨平台构建（Multi-platform builds）。它内部集成了一个独立的 &lt;strong&gt;QEMU 模拟器&lt;/strong&gt;，这使得它能完全脱离宿主机硬件架构的影响。无论你的 Mac 是 Intel 还是 M 系列芯片，它都能为你“直出”目标环境（如 x86）的镜像。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;它的副作用&lt;/strong&gt;：由于它运行在一个高度隔离的容器内，它拥有&lt;strong&gt;完全独立的网络命名空间&lt;/strong&gt;。它不会自动继承宿主机的 TUN 代理或环境变量，甚至会忽略你在 Docker Desktop 界面设置的镜像源（Registry Mirrors）。这导致它在尝试拉取基础镜像（如 &lt;code&gt;ruby:slim&lt;/code&gt;）时，依然在直接撞墙。&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;
&lt;h2 id="解决方案：回归宿主机驱动"&gt;解决方案：回归宿主机驱动&lt;/h2&gt;
&lt;p&gt;要解决这个问题，最简单的办法是让构建任务交还给宿主机的 Docker Daemon 来处理，从而直接利用宿主机已经配置好的网络环境。&lt;/p&gt;
&lt;h3 id="操作步骤"&gt;操作步骤&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;修改 &lt;code&gt;deploy.yml&lt;/code&gt;&lt;/strong&gt;
在配置文件中明确指定 &lt;code&gt;builder&lt;/code&gt; 的驱动为 &lt;code&gt;docker&lt;/code&gt;：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;builder:
  driver: docker
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;提交配置（关键点）&lt;/strong&gt;
Kamal 部署时会检查 Git 状态。如果 &lt;code&gt;deploy.yml&lt;/code&gt; 的修改没有被 &lt;code&gt;git add&lt;/code&gt;，Kamal 可能会读取旧的配置导致修改不生效：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git add config/deploy.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;清理旧的构建器&lt;/strong&gt;
删掉那个由于网络原因卡死的旧构建实例，强制 Kamal 重新初始化：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker buildx rm kamal-local-docker-container
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;重新运行部署&lt;/strong&gt;
执行 &lt;code&gt;kamal deploy&lt;/code&gt;，此时构建进程将直接调用本地 Docker 环境。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;hr&gt;
&lt;h2 id="深度解析：为什么 driver: docker 依然能打出 x86 镜像？"&gt;深度解析：为什么 &lt;code&gt;driver: docker&lt;/code&gt; 依然能打出 x86 镜像？&lt;/h2&gt;
&lt;p&gt;你可能会担心：如果不用 &lt;code&gt;docker-container&lt;/code&gt; 驱动，我在 ARM 架构的 Mac 上还能打出生产环境需要的 x86 镜像吗？&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;答案是肯定的。&lt;/strong&gt; 这是因为 &lt;strong&gt;Docker Desktop for Mac&lt;/strong&gt; 已经在其底层的 Linux 虚拟机里注册了 QEMU。当你切换到 &lt;code&gt;driver: docker&lt;/code&gt; 时：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;架构模拟&lt;/strong&gt;：依然由 Docker 虚拟层底层的 QEMU 负责，跨平台打包能力依然存在。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;网络控制&lt;/strong&gt;：构建进程此时运行在宿主机 Docker 的“亲生”环境下，它能完美识别并使用你本地调教好的代理或镜像站。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="总结"&gt;总结&lt;/h2&gt;
&lt;p&gt;在 Kamal 部署流程中，如果你遭遇了 Docker 认证阶段的 EOF 错误，通常是因为默认的构建容器陷入了“网络孤岛”。&lt;/p&gt;

&lt;p&gt;将 &lt;code&gt;builder&lt;/code&gt; 的驱动修改为 &lt;code&gt;docker&lt;/code&gt; 是目前国内开发者最务实的解决方案。它通过牺牲一点点构建隔离性，换取了对宿主机网络环境的完美继承，让部署过程不再卡在第一步。&lt;/p&gt;</description>
      <author>jicheng1014</author>
      <pubDate>Wed, 18 Mar 2026 11:40:51 +0800</pubDate>
      <link>https://ruby-china.org/topics/44521</link>
      <guid>https://ruby-china.org/topics/44521</guid>
    </item>
    <item>
      <title>暂时隐藏暂时隐藏</title>
      <description>&lt;p&gt;国内教c#和java的教材写的真烂&lt;/p&gt;</description>
      <author>crella95</author>
      <pubDate>Mon, 16 Mar 2026 07:39:38 +0800</pubDate>
      <link>https://ruby-china.org/topics/44518</link>
      <guid>https://ruby-china.org/topics/44518</guid>
    </item>
    <item>
      <title>官网宣传语变成“省 Token” “方便 Agent 编写”</title>
      <description>&lt;p&gt;如图 😆
&lt;img src="https://l.ruby-china.com/photo/tistest/012edf78-3c8c-47ba-8bca-622c54023329.jpg!large" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>tistest</author>
      <pubDate>Thu, 12 Mar 2026 10:14:25 +0800</pubDate>
      <link>https://ruby-china.org/topics/44516</link>
      <guid>https://ruby-china.org/topics/44516</guid>
    </item>
    <item>
      <title>发现 Rails 在 AI 时代好像挺适合做实验性质的项目的</title>
      <description>&lt;p&gt;最近组里在做一些数据生产端 AI 的探索，结果一个很直接的感受是：Rails 好像特别适合开发企业内部的 AI 实验项目，用起来贼爽。&lt;/p&gt;

&lt;p&gt;目前体感比较明显的点有两个：&lt;/p&gt;

&lt;p&gt;1 自带完善的测试框架，fixtures、test db 这些都很顺手，挺适合 vibe coding 的时候自己快速迭代&lt;/p&gt;

&lt;p&gt;因为这种项目本身就是实验性质，主打的就是一个又糙又快，老板恨不得 1 天之内就能试出结论，所以 Vibe Coding 基本是必不可少的。&lt;/p&gt;

&lt;p&gt;但问题在于，很多别的语言或框架，光是想让 AI 具备一套像样的自我验证能力，前面就得先折腾一轮。Rails 在这点上基本算是开箱即用，优势还是挺大的。&lt;/p&gt;

&lt;p&gt;2 Solid Queue 本地就能提供消息队列能力，碰到大模型 API 限流这类问题，处理起来也比较简单&lt;/p&gt;

&lt;p&gt;本地开箱即用、而且基本不需要额外依赖的消息队列，这一点其实也特别适合大模型相关场景。很多实验项目一开始并不想把基础设施铺得太重，能先在本机或者开发机上把流程跑通就已经很舒服了。&lt;/p&gt;</description>
      <author>willx</author>
      <pubDate>Wed, 11 Mar 2026 21:35:57 +0800</pubDate>
      <link>https://ruby-china.org/topics/44515</link>
      <guid>https://ruby-china.org/topics/44515</guid>
    </item>
    <item>
      <title>[深圳外企内推]</title>
      <description>&lt;ul&gt;
&lt;li&gt;主招测试开发，后端/全栈开发（产品，设计也在招，也能内推）&lt;/li&gt;
&lt;li&gt;技术栈为 Next.js, Nest.js，有别的 Node.js, Go, Java 经验也都可以。&lt;/li&gt;
&lt;li&gt;薪资 30-50k/月，社保+公积金。&lt;/li&gt;
&lt;li&gt;工作时间 9 点半到 6 点半。&lt;/li&gt;
&lt;li&gt;工作地点在深圳南山万象天地。深圳 Office 团队氛围非常 Nice，不卷。&lt;/li&gt;
&lt;li&gt;公司大力拥抱 AI，Cursor/Codex/Claude 免费用。英语面试（也有机会会碰上中文面，这个看运气）。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;适合想认真做事、提升技术的同学。感兴趣可以发简历到 aGFpeGlhbmcueWFuQHNob3BiYWNrLmNvbQ==&lt;/p&gt;</description>
      <author>haixiang6123</author>
      <pubDate>Wed, 11 Mar 2026 12:45:46 +0800</pubDate>
      <link>https://ruby-china.org/topics/44513</link>
      <guid>https://ruby-china.org/topics/44513</guid>
    </item>
  </channel>
</rss>
