本地部署长毛象进行测试(二)
最后的挣扎
书接上文,先去 Gemfile
里把 debug_inspector
的版本改成 1.1.0
,这里有个问题是 Gemfile
里没有这个包,Gemfile.lock
里才有. 根据我的了解,Gemfile.lock
这文件不是人手动去改的,而是 bundler 自动给生成的,我想我还是在 Gemfile
里手动指定一下试试吧!
查了一下版本指定的语法:(参考)
gem 'debug_inspector', '= 1.1.0'
# 把这行加到 Gemfile 末尾
然后:
bundle install
感觉这么搞是没有问题的,因为最后出现的信息是:
Installing debug_inspector 1.1.0 (was 1.0.0) with native extensions
看了一下 Gemfile.lock
,里面所有的 debug_inspector
都是 1.1.0
了.
再次:
bundle exec rails db:setup
还是错误,不过没关系,来看一看:
FATAL: role "xxxxxx" does not exist
Couldn't create 'mastodon_development' database. Please check your configuration.
rails aborted!
ActiveRecord::ConnectionNotEstablished: FATAL: role "xxxxxx" does not exist
Caused by:
PG::ConnectionBad: FATAL: role "xxxxxx" does not exist
Tasks: TOP => db:setup => db:create
(See full trace by running task with --trace)
这里的 xxxxxx
是我 Linux 系统的用户名. 等等!这个错误提示我见过!!
在官方文档里有写,如果出现了这个错误那就运行一条命令,创建一个有权限建表的 Postgres 用户:
sudo -u postgres createuser xxxxxx --createdb
不过这条命令也有个错误是:
could not change directory to "/home/xxxxxx/codes/mastodon": 权限不够
这个我大概知道怎么办:
sudo -iu postgres
createuser xxxxxx --createdb
然后错误提示是:
createuser: 错误: 创建新用户失败: ERROR: role "xxxxxx" already exists
纳尼??那是怎么回事?我再试一次?
exit # 先退出 postgres
# 再:
bundle exec rails db:setup
屏幕闪过无数的东西,我觉得这回应该是成功了. 应该是在运行 sudo -u postgres createuser xxxxxx --createdb
的时候已经成功了一部分,另一部分出现了问题,而另一部分并不太重要吧!但是且慢,所有这一大堆数据库操作之后还是出现了问题:
TRANSACTION (0.2ms) ROLLBACK
rails aborted!
Psych::BadAlias: Unknown alias: defaults
/home/xxxxxx/codes/mastodon/app/models/setting.rb:26:in `[]'
/home/xxxxxx/codes/mastodon/app/validators/unreserved_username_validator.rb:21:in `reserved_username?'
/home/xxxxxx/codes/mastodon/app/validators/unreserved_username_validator.rb:9:in `validate'
/home/xxxxxx/codes/mastodon/db/seeds.rb:5:in `<top (required)>'
Caused by:
NoMethodError: undefined method `reserved_usernames' for Setting:Class
Did you mean? reset_sequence_name
/home/xxxxxx/codes/mastodon/app/validators/unreserved_username_validator.rb:21:in `reserved_username?'
/home/xxxxxx/codes/mastodon/app/validators/unreserved_username_validator.rb:9:in `validate'
/home/xxxxxx/codes/mastodon/db/seeds.rb:5:in `<top (required)>'
Tasks: TOP => db:setup => db:seed
(See full trace by running task with --trace)
这个问题就有点棘手了,因为我没在 github 的 issues 里找到,顿时感到大事不妙……打开谷歌搜索:
Unknown alias when loading any yaml file
看这个问题下面的评论就能发觉这个问题挺玄妙,同样的代码有的人就能成功运行,有的人就不行,下面的回答感觉也不是我应该考虑的. 因为源代码不是我写的,是社区里那么多人一起写的,那么多人都没有遇到这个问题的,几乎就可以排除是源代码的问题了,怎么说我也不应该动起去改别人源代码的想法. 那就只可能是我自己这边的问题了,可是我现在啥都没干,有问题也只能是环境相关的问题. 现在在搞的是设置数据库,node 还完全没有用到,那问题只可能是出在 PostgreSQL 或者 Redis 或者 Ruby 上;数据库软件如果出问题肯定早就发现早就给出应对办法了,思来想去还是觉得问题出在 Ruby 上,因为我没有使用虚拟环境,Arch Linux 的 Ruby 包的分拆可能导致了一些问题. 这么看的话,也有可能是写源代码的人没有考虑周全,没有预料到我这种搞法,可能我还是得下手去看看源码,做点修改什么的.
根据这个报错,可以找到几个下手点,比如 db/seeds.rb
、app/validators/unreserved_username_validator.rb
、app/models/setting.rb
,可以去学一下 Ruby 的语法然后把这仨文件读一读,看看是谁调用了它们,这仨文件出错的那一句是干了什么;另外就是那个 Psych::BadAlias: Unknown alias: defaults
的报错,看着也很重要.
我先没去学 Ruby,凭着直觉把上面那仨文件分别打开看了,前俩文件没啥,最后一个文件里有这么两行:
class Setting < RailsSettings::Base
source Rails.root.join('config', 'settings.yml')
这就引出了另一个文件:config/settings.yml
. 于是我又打开这个文件去看,里面果然有 defaults
字样. 根据刚刚那个问题评论区出现的另一个问题的回答,可以把 defaults
改成单数 default
试一试. 于是我就把这个文件中的第 4、74、77、80 行末尾的 s
都给去掉了. 保存后重新执行:
bundle exec rails db:setup
现在的错误就发生了变化:
TRANSACTION (0.2ms) ROLLBACK
rails aborted!
Psych::BadAlias: Unknown alias: default
/home/xxxxxx/codes/mastodon/app/models/setting.rb:26:in `[]'
/home/xxxxxx/codes/mastodon/app/validators/unreserved_username_validator.rb:21:in `reserved_username?'
/home/xxxxxx/codes/mastodon/app/validators/unreserved_username_validator.rb:9:in `validate'
/home/xxxxxx/codes/mastodon/db/seeds.rb:5:in `<top (required)>'
Caused by:
NoMethodError: undefined method `reserved_usernames' for Setting:Class
Did you mean? reset_sequence_name
/home/xxxxxx/codes/mastodon/app/validators/unreserved_username_validator.rb:21:in `reserved_username?'
/home/xxxxxx/codes/mastodon/app/validators/unreserved_username_validator.rb:9:in `validate'
/home/xxxxxx/codes/mastodon/db/seeds.rb:5:in `<top (required)>'
Tasks: TOP => db:setup => db:seed
(See full trace by running task with --trace)
注意到错误的 alias 后面的提示,就从 defaults 变成了 default. 这至少证明我们找对了位置,另外也说明,问题不出在这里,因为不管写啥都是 Unknown alias,那就应该在别的地方想办法声明一下,让执行到这里之前知道有这么个 alias 才行. 这可能就需要真正去学习学习 Ruby 了,这部分涉及数据库的语法甚至还可能是 Rails 包里的语法. 我觉得学起来可能会很费劲,暂时也不是我想要的——毕竟我的初心只是想跑起一个长毛象测试测试的呀!我决定暂且把问题放在这里,回去老老实实按照教程,装个 ruby 和 node 的虚拟环境.
重新出发
先把 ruby 给卸载了……
sudo pacman -Rsn ruby
然后安装 rbenv:
cd somewhere_else
git clone https://aur.archlinux.org/rbenv.git
cd rbenv
makepkg -sir
cd ..
git clone https://aur.archlinux.org/ruby-build.git
cd ruby-build
makepkg -sir
回到长毛象源码文件夹后:
rbenv install
这时它就自动帮我安装 3.0.3 了,这是因为项目文件夹里有那个 .ruby-version
的文件(我试了,改那个文件成 3.0.2 的话就安装 3.0.2). 可能是重新编译的?我也不确定,反正风扇狂转了. 最后安装成功,位置在 /home/xxxxxx/.rbenv/versions/3.0.3
里.
然后我读了 rbenv 的文档后发现我可能没有初始化,PATH 里并没有 ruby
指令,那就直接手动加一下吧:
export PATH="$HOME/.rbenv/shims:$PATH"
然后安装 bundler
:
gem install bundler --no-document
export GEM_HOME="$(ruby -e 'puts Gem.user_dir')"
export PATH="$PATH:$GEM_HOME/bin"
在开始玩长毛象源码之前先恢复之前的面目,然后拉取一下:
git checkout .
git pull
然后 ruby 的依赖和之前没啥区别:
bundle config deployment 'true'
bundle install
因为之前下载好了的一直也没动它,这一步主要就是检查一下,比如那个 debug_inspector
还是回到 1.0.0
.
现在再:
export RAILS_ENV="development"
bundle exec rails db:setup
真是奇了怪了啊!咋还出现这个问题(好消息是 irb 那个问题没有了):
rails aborted!
NameError: uninitialized constant RubyVM::DebugInspector
幸好我已经知道如何解决,直接在 Gemfile
里指定 1.1.0
,再来:
vim Gemfile
bundle config unset deployment
bundle install
bundle exec rails db:setup
卧槽!!!!!!看看这最后的提示信息:
Setting Load (0.3ms) SELECT "settings".* FROM "settings" WHERE (thing_type is NULL and thing_id is NULL) AND "settings"."var" = $1 ORDER BY "settings"."id" ASC LIMIT $2 [["var", "registrations_mode"], ["LIMIT", 1]]
User Create (0.9ms) INSERT INTO "users" ("email", "created_at", "updated_at", "encrypted_password", "admin", "confirmed_at", "account_id") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id" [["email", "admin@localhost:3000"], ["created_at", "2022-01-14 14:29:35.606994"], ["updated_at", "2022-01-14 14:29:35.606994"], ["encrypted_password", "$2a$10$3MhraeWaXtHBqjsIbvsz..vnOZwolrDAQIqFAu.EU0NFY9GdQbY0m"], ["admin", true], ["confirmed_at", "2022-01-14 14:29:35.505627"], ["account_id", 107621290835384376]]
TRANSACTION (3.8ms) COMMIT
我应该是成功了!!!!!echo $?
返回值是 0
!!!!!是 0
耶!!!!!妈的,太不容易了!早知道就早早用 rbenv 不完了吗,也没费多少事啊!
开启各种服务
官方文档给的方法是使用 foreman,其实就是那个 .foreman
的文件,根据里面的一行可以知道所有的服务怎么开都在 Procfile.dev
里:
web: env PORT=3000 RAILS_ENV=development bundle exec puma -C config/puma.rb
sidekiq: env PORT=3000 RAILS_ENV=development bundle exec sidekiq
stream: env PORT=4000 yarn run start
webpack: ./bin/webpack-dev-server --listen-host 0.0.0.0
教程里也给出了分别开启服务的办法. 我还是先按照教程分别开启,这样的话可以了解得细致一些,另外哪一步出现了错误也方便我去解决. 如果没什么问题的话,以后我就可以直接用 foreman 了.
根据教程,前三个服务(web、sidekiq、stream)就是长毛象在生产环境里会用到的,在开发环境中才需要用到第四个(webpack),这个是负责把 js、css 之类的东西编译打包的,因为搞开发嘛,这些东西肯定是难免要修修改改,而且据我所知长毛象用的是 SCSS 这种非原生的东西,有这么一个服务专门干这件事是可以理解的.
开第一个终端开启 web 服务:
export RAILS_ENV="development"
export PATH="$HOME/.rbenv/shims:$PATH"
# 有 bundle
export GEM_HOME="$(ruby -e 'puts Gem.user_dir')"
export PATH="$PATH:$GEM_HOME/bin"
# 有 puma
bundle exec puma -C config/puma.rb
# 开启服务
成功!
开第二个终端开启 sidekiq 服务:
export PATH="$HOME/.rbenv/shims:$PATH"
# 有 bundle
export GEM_HOME="$(ruby -e 'puts Gem.user_dir')"
export PATH="$PATH:$GEM_HOME/bin"
# 有 sidekiq
bundle exec sidekiq
# 开启服务
成功!
开第三个终端开启 streaming 服务:
PORT=4000 yarn run start
有仨警告但好像就是那样……成功!
开第四个终端开启 webpack 服务:
export PATH="$HOME/.rbenv/shims:$PATH"
# 有 ruby
./bin/webpack-dev-server --listen-host 0.0.0.0
然后所有的静态文件就都编译出来了!成功!
打开试一试!
怀着激动的心打开:http://127.0.0.1:3000/admin/dashboard
成功!
怀着激动的心输入用户名 admin@localhost:3000
,密码 mastodonadmin
,成功!!!!
我好激动,人生第一次看到长毛象后台长什么样了!
下一步
接下来就是看一看怎么能搞出两个长毛象服务,比如一个在 http://127.0.0.1:3000,另一个在 http://127.0.0.1:3001,然后我就可以做一些测试,然后我就可以那篇探讨长毛象机制的文章了!!
最后总结一下的话,其实本地开发长毛象没什么难的,就是那个 ruby,不应该直接安 Arch Linux 的,外面套一层 rbenv 就顺利得多!