Ruby에서는 npm, maven과 같은 역할인, 패키지를 다운로드하기 위한 bundler라는 패키지 매니저가 있습니다. 패키지를 다운로드하기 위해서는 www.rubygems.org에 에 접속 할 수 있어야 합니다. 즉, 인터넷에 연결되어 있어야 합니다. 대부분은 아니겠지만, 일부 환경에서는 인터넷에 연결할 수 없는 상태에서 서버를 구성해야 합니다. ( 제가 일하는 환경 대부분이 그렇습니다. ) 그래서 이번에는 인터넷이 되지 않는 Offline 환경에서 Ruby의 패키지인 Gem을 설치하는 방법을 설명합니다.
* 실제로는 더 많은 Gem을 설치하지만, rails 만 설치하는 것을 예로 들었습니다. *
1. 준비물.
- 인터넷이 되면서, 서버에 접속할 수 있는 PC.
준비물에서 이미 눈치 채셨겠네요. 맞습니다. PC에서 Gem을 다운로드하여서 그 파일을 서버에 설치하는 것입니다. RubyGems 사이트에 가보면 이미 다운로드할 수 있습니다. 가령 Rails를 보면, 우측에 다운로드 링크가 있습니다.
이렇게 Gem을 다운 받으면 끝이라면 행복하겠지만, 현실은 그렇지 않습니다. rails에서도 사용하는 Gem들이 있으니 그런 의존성을 가진 Gem들을 모두 받아야 합니다. 중간에 보니 rails는 14개의 Gem에 의존성을 가집니다. 여기서 끝이냐 하면 14개의 Gem은 또 다른 Gem에 의존성을 가지고... 다운로드 버튼을 가지고 의존성을 가진 Gem을 모두 다운로드하려면, 하루 종일 해도 모자랄지도 모릅니다. 지금은 rails 하나만 설명하지만, 현실에서는 수십 개의 Gem을 사용합니다... 하나씩 다운로드해서 설치한다라는 생각은 하지 않기로 하죠.
2. Local에 Gem 다운 받기.
다시 인터넷이 되는 PC, 편의상 로컬이라고 하고, 설치할 서버를 그냥 서버라고 하겠습니다. 로컬에 폴더를 하나 만들고, 다운로드할 Gem 정보를 가지고 있는 Gemfile을 만들어 줍니다. ( maven의 pom.xml이라고 생각하셔도 무방합니다. )
$ mkdir download_gem && cd $_
$ vi Gemfile
# Gemfile start
source "https://rubygems.org"
gem "rails"
# Gemfile end
다음에는 bundle install --path vendor/cache 명령을 실행합니다. 이 명령은 gem을 설치하고 vendor/cache 폴더에 gemfile을 저장합니다. 설치가 완료되면 설치된 gem file을 확인해 줍니다. 모두 43개의 gemfile이 다운로드된 것을 확인할 수 있습니다.
$ bundle install --path vendor/cache
[DEPRECATED] The `--path` flag is deprecated because it relies on being remembered across bundler invo
cations, which bundler will no longer do in future versions. Instead please use `bundle config set pat
h 'vendor/cache'`, and stop using this flag
Fetching gem metadata from https://rubygems.org/............
Fetching rake 13.0.1
Installing rake 13.0.1
...
Fetching rails 6.0.3
Installing rails 6.0.3
Updating files in vendor/cache
* rake-13.0.1.gem
...
* rails-6.0.3.gem
Bundle complete! 1 Gemfile dependency, 43 gems now installed.
Bundled gems are installed into `./vendor/cache`
$ ls vendor/cache
actioncable-6.0.3.gem globalid-0.4.2.gem rails-dom-testing-2.0.3.gem
actionmailbox-6.0.3.gem i18n-1.8.2.gem rails-html-sanitizer-1.3.0.gem
actionmailer-6.0.3.gem loofah-2.5.0.gem railties-6.0.3.gem
actionpack-6.0.3.gem mail-2.7.1.gem rake-13.0.1.gem
actiontext-6.0.3.gem marcel-0.3.3.gem ruby
actionview-6.0.3.gem method_source-1.0.0.gem sprockets-4.0.0.gem
activejob-6.0.3.gem mimemagic-0.3.5.gem sprockets-rails-3.2.1.gem
activemodel-6.0.3.gem mini_mime-1.0.2.gem thor-1.0.1.gem
activerecord-6.0.3.gem mini_portile2-2.4.0.gem thread_safe-0.3.6.gem
activestorage-6.0.3.gem minitest-5.14.0.gem tzinfo-1.2.7.gem
activesupport-6.0.3.gem nio4r-2.5.2.gem websocket-driver-0.7.1.gem
builder-3.2.4.gem nokogiri-1.10.9.gem websocket-extensions-0.1.4.gem
concurrent-ruby-1.1.6.gem rack-2.2.2.gem zeitwerk-2.3.0.gem
crass-1.0.6.gem rack-test-1.1.0.gem
erubi-1.9.0.gem rails-6.0.3.gem
3. 서버에 Gem 파일 설치하기.
이제 서버로 vendor/cache 아래의 파일을 전부 전송합니다. 이 때 서버에도 프로젝트 폴더 밑에 vendor/cache 위치에 파일이 있어야 합니다. 전송이 완료되면 --local 옵션으로 설치하면 됩니다. local 옵션을 주면 먼저 vendor/cache 위치의 gem 파일을 확인하여 설치합니다.
$ bundle install --local
이제 인터넷이 되지 않는 서버에서 Gem파일을( 의존성을 가지는 것들을 모두 포함해서 ) 설치가 끝났습니다.
4. 다른 방법.
사실 이 방법 말고도 가능한 방법은 더 있습니다. 우선 로컬 피씨에서 서버로 터널링을 해서 인터넷이 연결되도록 하는 방법이 있을 거고요. (이 방법은 잘못하면 보안담당자에게 불려갈수도 있습니다. -_-;;) 또 다른 방법은 도커를 이용하는 방법입니다. 로컬 피씨에서 이미지를 만들고 그 이미지를 서버로 전송하여 구동하는 방법입니다. 서버에 도커가 설치되어 있다면 도커를 이용하는 게 제일 간단하고, CI/CD 환경을 만들기도 좋습니다. 여기서 설명한 방법 외에도 처한 환경에 적절한 방법을 찾아 적용하시면 될 것 같습니다.
끝.