用着 dotenv
开发环境的 docker 只打包系统依赖,例如 libpg-dev,nodejs 这些,项目文件是通过 volumes mount 进去的。Rails 的 auto reload 和 webpacker 的 live reload 都能正常用。
我开发环境用 docker 的目的是为了让开发环境和生产环境等价。曾经试过开发环境用了新版本的 redis 和新命令,上线之后才发现不支持而崩溃。
我把大部分配置都放到了环境变量里,不过还有有一些行为是硬编码不可配置的,例如 rails db 下的命令,开发环境执行的同时会对 test db 也执行一遍,所以我做了折衷,Rails 默认行为不去改它,新增的配置遵循 12factor。只改配置,不区分 staging 和 production 环境。
Heroku 节省了一个运维团队啊,对小公司绝对是省钱,如果没有运维团队那其实是开发在付出时间成本。
单机部署风险太大,不同地方都见过单机部署服务器崩溃,然后备份没工作的事故了。
上面的意思是持久化服务不要放 k8s 里面,因为要做得对很难。
👏👏👏
不发帖都没留意呢。
docker compose 只适合用来搭开发环境,生产环境需要 k8s 之类的编排工具,然后对于需要持久化的服务要有特殊处理,最好用云服务。
用 docker compose。
cached 是主机到容器单向同步,会不会导致每次重启 node_modules 都要重装?而且据文档介绍同步有延迟。
volumn 慢用 http://docker-sync.io/ 解决。
解决了 volumn 慢的问题,开发环境我觉得没啥坑了。生产环境比较折腾,除非用 Heroku。
以前发过的一个技巧在这里汇总一下。
如果使用 docker,可以在 bash 配置里面加一个方法:
sandbox() {
docker run -it -v $(pwd):/app -w /app $1 bash
}
然后可以方便的打开不同版本的 ruby 沙箱环境:
$ sandbox ruby:2.3
临时测试版本差异的时候会用到。
装过 rvm 没清理干净,找找 .bashrc .bash_profile .profile 几个配置文件删掉 rvm 相关的内容。
贴日志
Linode 一直以来只做虚拟主机这层,VPC 都没有,运维全靠自己,已经不满足生产需求了。
DigitalOcean 的基础服务足够,配置比 AWS 简单(AWS 配置的门槛较高),可以作为业余和云服务入门。
不过业余项目我最推荐是 Heroku,运维领先业界 5 年,可以把心思都放在开发上。
生产项目就不提了,因为国内网络环境的问题选择不多。
bundle stdout: rbenv: /home/chuck/.rvm/bin/rvm: command not found
用的是 rbenv 还是 rvm?去掉不必要那个。
日志贴全,隐去敏感信息。
如果是手工发 ajax 请求,要自己处理浏览器返回的内容。所以还是:上代码。
日志显示没有 route 到 destroy action。
日志显示就是没找到路由,你以为的问题可能和实际问题不一样,把代码和意图贴上来。
这个问题我之前也没留意,搜了一下,以前有讨论帖
https://ruby-china.org/topics/15581
还有 StackOverflow 的回答
https://stackoverflow.com/questions/3430280/how-does-object-id-assignment-work https://stackoverflow.com/questions/2818602/in-ruby-why-does-inspect-print-out-some-kind-of-object-id-which-is-different/2818916#2818916
大概意思是 Ruby 计算不同的对象的 obejct_id 时候用了不同的规则,让一些不需要分配内存的值对象 id 和其它 obejct 不冲突,除了 true/false/nil 等固定值外,比较特殊的有 fixnum 和 obejct 的计算规则。
fixnum object_id = 值 * 2 + 1
object object_id = 指针地址 / 2
因为在某些计算机上,指针地址的末位都是 0,所以就把末位为 1 的空间除了几个固定值以外的空间都分配给 fixnum。(写到这里我觉得 object 的 object_id 不除以 2 也可以啊,也许是为了显得紧凑?期待其它人回答)
反过来说,一般对象的 object_id 乘以 2 就是指针地址:
> user.to_s
=> "#<User:0x00000008b8bca0>"
> user.object_id
=> 73162320
> (user.object_id * 2).to_s 16 # 16 进制显示
=> "8b8bca0"
> (user.object_id << 1).to_s 16 # 二进制里面,乘以 2 其实就是左移 1 位。
=> "8b8bca0"
> 0x00000008b8bca0.to_s 2 # 2 进制显示
=> "1000101110001011110010100000"
> user.object_id.to_s 2 # 二进制显示,比上面末尾少一个 0,
=> "100010111000101111001010000"
> (user.object_id << 1).to_s 2 # 二进制比较容易看出为什么末尾为 1 就能区分 fixnum 和 object。
=> "1000101110001011110010100000"
😂我看了这篇博客去官网仓库找,还以为就是 dep,原来还有别的吗?我已经凌乱了。
昨晚开始被 DDOS。
从侧栏删掉链接了。
工具那里我指的是语言。
GitLab 对于他们的文档要怎么写,他们是有决定权的。但是例如“Rails 要怎么部署”,这属于个人观点,没有人有决定权的(除了自己)。
Cargo 的核心团队里有 Yehuda Katz(前 Ruby on Rails 核心团队成员),吸收了 Ruby 社区依赖管理的成功经验,所以依赖管理是同类语言里最好的。反面例子就是 Go 了,最近才由官方推出 Dep 终结混乱。
能高效的解决问题的工具就是好工具,不用太在意用的人多不多,有时用的人少反而是自己的秘密武器。