`/admin/upgrade`를 방문할 때 `sub!` 메서드가 정의되지 않았습니다

app.yml에서 플러그인이 설치되는 방법은 다음과 같습니다.

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-chat-integration.git

첫 번째 명령으로 mkdir plugins가 추가로 포함되어 있었기 때문에 (빈) plugins 폴더가 존재했습니다. 지난 몇 년간 남아 있던 잔여물을 제거했습니다…

위 app.yml에 따라 설치된 패키지의 폴더 안에는 모두 .git 폴더가 있습니다.

원격 URL 목록으로 돌아와서… discourse 사용자로 실행하면:

discourse@ocean-app:/var/www/discourse/plugins$ for d in *; do echo "$d: $(git -C $d config --get remote.origin.url)"; done
chat:
discourse-chat-integration: https://github.com/discourse/discourse-chat-integration.git
discourse-details:
discourse-lazy-videos:
discourse-local-dates:
discourse-narrative-bot:
discourse-presence:
discourse-solved: https://github.com/discourse/discourse-solved.git
docker_manager: https://github.com/discourse/docker_manager.git
poll:
styleguide:

root 사용자로 실행하면:

root@ocean-app:/var/www/discourse/plugins# for d in *; do echo "$d: $(git -C $d config --get remote.origin.url)"; done
chat: https://github.com/discourse/discourse.git
discourse-chat-integration:
discourse-details: https://github.com/discourse/discourse.git
discourse-lazy-videos: https://github.com/discourse/discourse.git
discourse-local-dates: https://github.com/discourse/discourse.git
discourse-narrative-bot: https://github.com/discourse/discourse.git
discourse-presence: https://github.com/discourse/discourse.git
discourse-solved:
docker_manager: https://github.com/discourse/docker_manager.git
poll: https://github.com/discourse/discourse.git
styleguide: https://github.com/discourse/discourse.git

제 추측: 권한 설정이 완전히 엉망인 것 같습니다. 이것이 컨테이너 내부에서 올바른 모습인가요?

root@ocean-app:/var/www/discourse# ls -la
total 508
drwxr-xr-x 1 root      root        4096 Aug 10 15:38 .
drwxr-xr-x 1 root      root        4096 Jul 11 00:33 ..
drwxr-xr-x 1 root      root        4096 Jul 11 00:34 app
drwxr-xr-x 1 root      root        4096 Aug 10 14:36 bin
-rw-r--r-- 1 root      root         316 Aug 10 14:36 Brewfile
drwxr-xr-x 1 root      root        4096 Jul 11 00:34 .bundle
drwxr-xr-x 1 root      root        4096 Aug 10 14:47 config
-rw-r--r-- 1 root      root         304 Aug 10 14:36 config.ru
-rw-r--r-- 1 root      root        1303 Aug 10 14:36 CONTRIBUTING.md
-rw-r--r-- 1 root      root        2347 Aug 10 14:36 COPYRIGHT.md
lrwxrwxrwx 1 root      root          10 Aug 10 14:36 d -> bin/docker
drwxr-xr-x 1 root      root        4096 Aug 10 14:36 db
drwxr-xr-x 1 root      root        4096 Aug 10 14:36 .devcontainer
-rw-r--r-- 1 root      root        1315 Aug 10 14:36 discourse.sublime-project
drwxr-xr-x 1 root      root        4096 Aug 10 14:36 docs
drwxr-xr-x 1 root      root        4096 Aug 10 14:36 documentation
-rw-r--r-- 1 root      root         305 Aug 10 14:36 .editorconfig
-rw-r--r-- 1 root      root         334 Aug 10 14:36 .eslintignore
-rw-r--r-- 1 root      root        1061 Aug 10 14:36 .eslintrc
-rw-r--r-- 1 root      root        7146 Aug 10 14:36 Gemfile
-rw-r--r-- 1 root      root       15678 Aug 10 14:36 Gemfile.lock
drwxr-xr-x 1 root      root        4096 Aug 10 14:36 .git
-rw-r--r-- 1 root      root         852 Aug 10 14:36 .gitattributes
-rw-r--r-- 1 root      root        2205 Aug 10 14:36 .git-blame-ignore-revs
-rw-r--r-- 1 root      root         272 Aug 10 15:38 .gitconfig
drwxr-xr-x 1 root      root        4096 Aug 10 14:36 .github
-rw-r--r-- 1 root      root        1282 Aug 10 14:36 .gitignore
drwxr-xr-x 1 root      root        4096 Aug 10 14:36 images
-rw-r--r-- 1 root      root         279 Aug 10 14:36 jsconfig.base.json
-rw-r--r-- 1 root      root         432 Aug 10 14:36 .jsdoc
-rw-r--r-- 1 root      root        1937 Aug 10 14:36 lefthook.yml
drwxr-xr-x 1 root      root       12288 Aug 10 14:36 lib
-rw-r--r-- 1 root      root        1470 Aug 10 14:36 .licensed.yml
-rw-r--r-- 1 root      root         375 Aug 10 14:36 .licensee.json
-rw-r--r-- 1 root      root       18092 Aug 10 14:36 LICENSE.txt
drwxr-xr-x 1 root      root        4096 Aug 10 14:36 log
drwxr-xr-x 1 root      root       20480 Aug 10 14:37 node_modules
-rw-r--r-- 1 root      root          21 Aug 10 14:36 .npmrc
-rw-r--r-- 1 root      root        3114 Aug 10 14:36 package.json
drwxr-xr-x 1 discourse discourse   4096 Aug 16 08:44 plugins
-rw-r--r-- 1 root      root         728 Aug 10 14:36 .prettierignore
-rw-r--r-- 1 root      root         283 Aug 10 14:36 .prettierrc
drwxr-xr-x 1 root      root        4096 Aug 14 00:42 public
-rwxr-xr-x 1 root      root         305 Aug 10 14:36 Rakefile
-rw-r--r-- 1 root      root        6753 Aug 10 14:36 README.md
-rw-r--r-- 1 root      root          25 Aug 10 14:36 .rspec
-rw-r--r-- 1 root      root         246 Aug 10 14:36 .rspec_parallel
-rw-r--r-- 1 root      root         290 Aug 10 14:36 .rubocop.yml
-rw-r--r-- 1 root      root          10 Aug 10 14:36 .ruby-gemset.sample
-rw-r--r-- 1 root      root           6 Aug 10 14:36 .ruby-version.sample
drwxr-xr-x 1 root      root        4096 Aug 10 14:36 script
drwxr-xr-x 1 root      root        4096 Aug 10 14:36 spec
-rw-r--r-- 1 root      root          66 Aug 10 14:36 .streerc
-rw-r--r-- 1 root      root        1054 Aug 10 14:36 .template-lintrc.js
drwxr-xr-x 1 root      root        4096 Aug 10 14:36 test
drwxr-xrwx 1 discourse discourse   4096 Aug 10 15:16 tmp
-rw-r--r-- 1 root      root        2575 Aug 10 14:36 translator.yml
drwxr-xr-x 1 root      root        4096 Jul 11 00:34 vendor
drwxr-xr-x 1 root      root        4096 Aug 10 14:36 .vscode-sample
-rw-r--r-- 1 root      root      204458 Aug 10 14:36 yarn.lock

기대되는 소유권/권한 설정은 어떻게 되어야 하나요?