Ruby on Rails
Wdrażanie aplikacji Rails na Heroku
Szukaj…
Wdrażanie aplikacji
Upewnij się, że znajdujesz się w katalogu zawierającym aplikację Rails, a następnie utwórz aplikację na Heroku.
$ heroku create example
Creating ⬢ example... done
https://example.herokuapp.com/ | https://git.heroku.com/example.git
Pierwszy adres URL wyjścia, http://example.herokuapp.com , to lokalizacja, w której aplikacja jest dostępna. Drugi adres URL, [email protected]: example.git, to adres URL zdalnego repozytorium git.
Tego polecenia należy używać tylko w zainicjowanym repozytorium git. Polecenie heroku create automatycznie dodaje zdalny git o nazwie „heroku” wskazujący na ten adres URL.
Argument nazwy aplikacji („przykład”) jest opcjonalny. Jeśli nie zostanie podana nazwa aplikacji, zostanie wygenerowana losowa nazwa. Ponieważ nazwy aplikacji Heroku znajdują się w globalnej przestrzeni nazw, można oczekiwać, że nazwy pospolite, takie jak „blog” lub „wiki”, zostaną już zajęte. Często łatwiej jest zacząć od domyślnej nazwy i później zmienić nazwę aplikacji.
Następnie wdróż kod:
$ git push heroku master
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Ruby app detected
remote: -----> Compiling Ruby/Rails
remote: -----> Using Ruby version: ruby-2.3.1
remote: -----> Installing dependencies using bundler 1.11.2
remote: Running: bundle install --without development:test --path vendor/bundle --binstubs vendor/bundle/bin -j4 --deployment
remote: Warning: the running version of Bundler is older than the version that created the lockfile. We suggest you upgrade to the latest version of Bundler by running `gem install bundler`.
remote: Fetching gem metadata from https://rubygems.org/..........
remote: Fetching version metadata from https://rubygems.org/...
remote: Fetching dependency metadata from https://rubygems.org/..
remote: Installing concurrent-ruby 1.0.2
remote: Installing i18n 0.7.0
remote: Installing rake 11.2.2
remote: Installing minitest 5.9.0
remote: Installing thread_safe 0.3.5
remote: Installing builder 3.2.2
remote: Installing mini_portile2 2.1.0
remote: Installing erubis 2.7.0
remote: Installing pkg-config 1.1.7
remote: Installing rack 2.0.1
remote: Installing nio4r 1.2.1 with native extensions
remote: Installing websocket-extensions 0.1.2
remote: Installing mime-types-data 3.2016.0521
remote: Installing arel 7.0.0
remote: Installing coffee-script-source 1.10.0
remote: Installing execjs 2.7.0
remote: Installing method_source 0.8.2
remote: Installing thor 0.19.1
remote: Installing multi_json 1.12.1
remote: Installing puma 3.4.0 with native extensions
remote: Installing pg 0.18.4 with native extensions
remote: Using bundler 1.11.2
remote: Installing sass 3.4.22
remote: Installing tilt 2.0.5
remote: Installing turbolinks-source 5.0.0
remote: Installing tzinfo 1.2.2
remote: Installing nokogiri 1.6.8 with native extensions
remote: Installing rack-test 0.6.3
remote: Installing sprockets 3.6.3
remote: Installing websocket-driver 0.6.4 with native extensions
remote: Installing mime-types 3.1
remote: Installing coffee-script 2.4.1
remote: Installing uglifier 3.0.0
remote: Installing turbolinks 5.0.0
remote: Installing activesupport 5.0.0
remote: Installing mail 2.6.4
remote: Installing globalid 0.3.6
remote: Installing activemodel 5.0.0
remote: Installing jbuilder 2.5.0
remote: Installing activejob 5.0.0
remote: Installing activerecord 5.0.0
remote: Installing loofah 2.0.3
remote: Installing rails-dom-testing 2.0.1
remote: Installing rails-html-sanitizer 1.0.3
remote: Installing actionview 5.0.0
remote: Installing actionpack 5.0.0
remote: Installing actionmailer 5.0.0
remote: Installing railties 5.0.0
remote: Installing actioncable 5.0.0
remote: Installing sprockets-rails 3.1.1
remote: Installing coffee-rails 4.2.1
remote: Installing jquery-rails 4.1.1
remote: Installing rails 5.0.0
remote: Installing sass-rails 5.0.5
remote: Bundle complete! 15 Gemfile dependencies, 54 gems now installed.
remote: Gems in the groups development and test were not installed.
remote: Bundled gems are installed into ./vendor/bundle.
remote: Bundle completed (31.86s)
remote: Cleaning up the bundler cache.
remote: Warning: the running version of Bundler is older than the version that created the lockfile. We suggest you upgrade to the latest version of Bundler by running `gem install bundler`.
remote: -----> Preparing app for Rails asset pipeline
remote: Running: rake assets:precompile
remote: I, [2016-07-08T17:08:57.046245 #1222] INFO -- : Writing /tmp/build_49ba6c877f5502cd4029406e981f90b4/public/assets/application-1bf5315c71171ad5f9cbef00193d56b7e45263ddc64caf676ce988cfbb6570bd.js
remote: I, [2016-07-08T17:08:57.046951 #1222] INFO -- : Writing /tmp/build_49ba6c877f5502cd4029406e981f90b4/public/assets/application-1bf5315c71171ad5f9cbef00193d56b7e45263ddc64caf676ce988cfbb6570bd.js.gz
remote: I, [2016-07-08T17:08:57.060208 #1222] INFO -- : Writing /tmp/build_49ba6c877f5502cd4029406e981f90b4/public/assets/application-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css
remote: I, [2016-07-08T17:08:57.060656 #1222] INFO -- : Writing /tmp/build_49ba6c877f5502cd4029406e981f90b4/public/assets/application-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css.gz
remote: Asset precompilation completed (4.06s)
remote: Cleaning assets
remote: Running: rake assets:clean
remote:
remote: ###### WARNING:
remote: No Procfile detected, using the default web server.
remote: We recommend explicitly declaring how to boot your server process via a Procfile.
remote: https://devcenter.heroku.com/articles/ruby-default-web-server
remote:
remote: -----> Discovering process types
remote: Procfile declares types -> (none)
remote: Default types for buildpack -> console, rake, web, worker
remote:
remote: -----> Compressing...
remote: Done: 29.2M
remote: -----> Launching...
remote: Released v5
remote: https://example.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/example.git
* [new branch] master -> master
Jeśli używasz bazy danych w aplikacji, musisz ręcznie migrować bazę danych, uruchamiając:
$ heroku run rake db:migrate
Wszelkie polecenia po heroku run
będą wykonywane na hamowni Heroku. Możesz uzyskać interaktywną sesję powłoki, uruchamiając:
$ heroku run bash
Upewnij się, że masz jedną dynamikę z uruchomionym typem procesu sieciowego:
$ heroku ps:scale web=1
Polecenie heroku ps wyświetla działające dynos aplikacji:
$ heroku ps
=== web (Standard-1X): bin/rails server -p $PORT -e $RAILS_ENV (1)
web.1: starting 2016/07/08 12:09:06 -0500 (~ 2s ago)
Możesz teraz odwiedzić aplikację w naszej przeglądarce przy heroku open
.
$ heroku open
Heroku daje domyślny adres URL w domenie herokuapp.com
. Gdy będziesz gotowy na zwiększenie skali produkcji, możesz dodać własną domenę niestandardową.
Zarządzanie środowiskami produkcyjnymi i przejściowymi dla Heroku
Każda aplikacja Heroku działa w co najmniej dwóch środowiskach: na Heroku (nazywamy to produkcją) i na lokalnej maszynie (programowanie). Jeśli w aplikacji pracuje więcej niż jedna osoba, masz wiele środowisk programistycznych - zwykle jedno na komputer. Zwykle każdy programista będzie miał także środowisko testowe do uruchamiania testów. Niestety, podejście to ulega załamaniu, ponieważ środowiska stają się mniej podobne. Na przykład Windows i Mac zapewniają inne środowiska niż stos Linux na Heroku, więc nie zawsze możesz być pewien, że kod działający w twoim lokalnym środowisku programistycznym będzie działał w ten sam sposób, gdy wdrożysz go w środowisku produkcyjnym.
Rozwiązaniem jest stworzenie środowiska pomostowego, które jest możliwie najbardziej zbliżone do produkcji. Można to osiągnąć, tworząc drugą aplikację Heroku, która hostuje twoją aplikację testową. Podczas przemieszczania możesz sprawdzić swój kod w ustawieniu produkcyjnym, zanim wpłynie on na faktycznych użytkowników.
Zaczynając od zera
Załóżmy, że masz aplikację działającą na komputerze lokalnym i jesteś gotowy, aby przekazać ją do Heroku. Będziemy musieli stworzyć zarówno zdalne środowiska, inscenizację, jak i produkcję. Aby nabrać nawyku pchania się na scenę, zaczniemy od tego:
$ heroku create --remote staging
Creating strong-river-216.... done
http://strong-river-216.heroku.com/ | https://git.heroku.com/strong-river-216.git
Git remote staging added
Domyślnie interfejs heroku CLI tworzy projekty za pomocą pilota goku heroku. Podajemy tutaj inną nazwę z flagą --remote, więc wypychanie kodu do Heroku i uruchamianie poleceń w aplikacji wygląda trochę inaczej niż normalny git push heroku master:
$ git push staging master
...
$ heroku ps --remote staging
=== web: `bundle exec puma -C config/puma.rb``
web.1: up for 21s
Gdy aplikacja pomostowa będzie już działać poprawnie, możesz utworzyć aplikację produkcyjną:
$ heroku create --remote production
Creating fierce-ice-327.... done
http://fierce-ice-327.heroku.com/ | https://git.heroku.com/fierce-ice-327.git
Git remote production added
$ git push production master
...
$ heroku ps --remote production
=== web: `bundle exec puma -C config/puma.rb
web.1: up for 16s
Dzięki temu masz tę samą bazę kodów uruchomioną jako dwie osobne aplikacje Heroku - jedna inscenizacja i jedna produkcja, skonfigurowane identycznie. Pamiętaj tylko, że musisz określić, którą aplikację będziesz obsługiwać w codziennej pracy. Możesz użyć flagi „--remote” lub użyć konfiguracji git, aby określić domyślną aplikację.