How heroku works - herokaijp/devcenter GitHub Wiki
ããã¯Herokuã®ä»çµã¿ã«é¢ããé«åºŠã§ãæè¡çãªèª¬æã§ããHerokuãã©ãããã©ãŒã ã§ã¢ããªãæžããããæ§æãããããããã€ãããããããŠå®è¡ãããããéã«ééããã§ãããå€ãã®æŠå¿µããŸãšããŠããŸãã
callout Getting Startedã®ãã¥ãŒããªã¢ã«ã®äžã«åºãŠãã説æã¯ã ãã®ããã¥ã¡ã³ãã«ããããŠããæŠå¿µãããå ·äœåãããã®ã«ãªã£ãŠããŸãã
ãã®ããã¥ã¡ã³ãã¯ç¶ããŠåŒãã§ãã ããã: è«ççã«è©±ãäŒããããã«ããã©ãããã©ãŒã ã«ã€ããŠã®æŠå¿µãåŸã ã«æããã«ããããã«æžããŠããŸãã
æåŸã®ã»ã¯ã·ã§ã³ã§ã¯ãHerokuã®ãããã€ãŸã§ãšå®è¡äžãšãã圢ã§ãå šãŠã®å®çŸ©ãäžç·ã«ãŸãšããŠããŸãã
Herokuã§ã¯Ruby, Node.js, Java, Python, Clojure, Scalaã§ããããã¢ããªã±ãŒã·ã§ã³ããããã€ãšå®è¡ããããŠç®¡çããããšãã§ããŸãã
ã¢ããªã±ãŒã·ã§ã³ãšã¯ããããã®èšèªã®ãã¡ã®ã©ããã§ãããããœãŒã¹ã³ãŒãã®éãŸãããããããã¬ãŒã ã¯ãŒã¯ããŸãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ãããå®è¡ããããã«å¿ èŠãªäŸåãã¡ã€ã«çŸ€ã«é¢ãããã«ãã·ã¹ãã ã®æç€ºã«ã€ããããã€ãã®äŸåãã¡ã€ã«ã«é¢ããèšè¿°ãããªã£ãŠããŸãã
note çšèª (ä»®): ã¢ããªã±ãŒã·ã§ã³ãšã¯ããœãŒã¹ã³ãŒããšäŸåãã¡ã€ã«ã«é¢ããèšè¿°ããæã£ãŠããŸãã
äŸåãã¡ã€ã«ã®ä»çµã¿ã¯èšèªã«ãã£ãŠå€ãã£ãŠããŸãã: Rubyã§ã¯Gemfile
, Javaã§ã¯pom.xml
, Pythonã§ã¯requirements.txt
... ãšèšã£ãæãã§ãã
äŸåãã¡ã€ã«ãšäžç·ã«ãªã£ãããªãã®ã¢ããªã±ãŒã·ã§ã³ã®ãœãŒã¹ã³ãŒãã¯ãHerokuã®ãã©ãããã©ãŒã ãããªãã®ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããããå®è¡ã§ããããã«ããããã®ãã®ãçæããããã«å¿ èŠååãªæ å ±ãæäŸããªããã°ãªããŸããã
Herokuã§å®è¡ããããã«ãã¢ããªã±ãŒã·ã§ã³ã倧ãã倿Žããå¿ èŠã¯ãããŸãããäžã€ã ãããã©ãããã©ãŒã ã«ããªããã©ãããã©ãŒã ã®ã©ã®éšåãå®è¡ããã®ã«å¿ èŠããéç¥ããäºãå¿ èŠã§ãã
ããäœããã®ç¢ºç«ããããã¬ãŒã ã¯ãŒã¯ã䜿ã£ãŠããå Žåã¯ãHerokuã¯ãããæ€ç¥ããããšãã§ããŸããäŸãã°ãRuby on Railsã®å Žåã¯æ®érails server
ãDjangoã®å Žåã¯python <app>/manage.py runserver
ãNode.jsã®å Žåã¯package.json
ããªã©ã§ãã
note çšèª: Procfiles ã¯ããã»ã¹ã¿ã€ã(å®è¡ããããšæãããã³ãã³ãïŒã®äžèЧã§ãã
ä»ã®ã¢ããªã±ãŒã·ã§ã³ã«é¢ããŠã¯ããªã«ãå®è¡ã«å¿ èŠãªã®ããæç€ºçã«å®£èšããå¿ èŠãããã§ãããããœãŒã¹ã³ãŒããšäžç·ã«ããããããã¹ããã¡ã€ã«ã®äžã§è¡ããŸãããããProcfileã§ããããããã®è¡ã«ããã»ã¹ã¿ã€ã(äœã£ãã¢ããªã±ãŒã·ã§ã³ã«å¯ŸããŠå®è¡ãããã³ãã³ã)ã宣èšããŸããäŸãã°ãProcfileã¯ãã®ãããªèŠãç®ã«ãªããŸã :
web: java -jar lib/foobar.jar $PORT
queuty: java -jar lib/queue-processor.jar
ãã®ãã¡ã€ã«ã¯web
ããã»ã¹ã¿ã€ããšãå®è¡ããããã«å©ãå¿
èŠã®ããã³ãã³ã(ãã®å Žåã¯ãjava -jar lib/foobar.jar $PORT
)ã宣èšããŠããŸãããŸãåæ§ã«queuty
ããã»ã¹ã¿ã€ããšãããã«äžèŽããã³ãã³ãã宣èšããŠããŸãã
å§ãã®ã¢ããªã±ãŒã·ã§ã³ã®å®çŸ©ã«ãã®Procfileã远å ããŠãæ¹ããããšæããŸãã
note çšèª: ã¢ããªã±ãŒã·ã§ã³ãšã¯ããœãŒã¹ã³ãŒããšäŸåãã¡ã€ã«ã«é¢ããèšè¿°ããããŠProcfileããæã£ãŠããŸãã
Herokuã¯äŸåãã¡ã€ã«ãšProcfileã䜿ã£ãŠãããããèšèªã§äœ¿ãããã©ãããã©ãŒã ãå®çŸããŠããŸããå šãŠã®èšèªãéããŠã䌌ããããªæ±ºãŸãããããŒã§ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ãå®è¡ãæ¡åŒµããããšãå¯èœãšããŠããŸããProcfileã¯ããªãã®æ§é çãªåŽé¢ãé²ã«ããŸãã(äžèšã®äŸã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã«ïŒã€ã®ãšã³ããªãŒãã€ã³ãããããŸã)ããããŠãã®æ§é ã¯ãäŸãã°ç¬ç«ããŠåéšåã®æ¡åŒµãè¡ãããšãã§ããŸããHerokuã§å®è¡ããã¢ããªã±ãŒã·ã§ã³åãã«ãè¯ãåãããã®æ§é ã«é¢ããåçã®çŽ æŽãããã¬ã€ããThe Twelve-Factor Appã«ãããŸãã
Gitã¯ãå€ãã®éçºè ããœãŒã¹ã³ãŒãã®ããŒãžã§ã³ä»ãã管çãããããã«äœ¿ã£ãŠããã匷åãªåæ£ããŒãžã§ã³ã³ã³ãããŒã«ã·ã¹ãã ã§ããHerokuã§ã¯ã¢ããªã±ãŒã·ã§ã³ã®ãããã€ã®ããã®äž»ãªææ®µãšããŠGitã䜿ã£ãŠããŸãã
Herokuã§ã¢ããªã±ãŒã·ã§ã³ãäœããšããããªãã®ã¢ããªã±ãŒã·ã§ã³çšã®ããŒã«ã«ã®gitãªããžããªãšäžç·ã«ãæ°ããgitãªã¢ãŒããä»ããŠããŸããããã¯éåžžheroku
ãšããååã«ãªã£ãŠããŸãã
çµæãšããŠããããã€ã®ããã®ã³ãŒãã¯git push
ã«ãšãŠã䌌ãŠãããheroku
ãªã¢ãŒãã«å·®ãæ¿ããã ãã§ã :
$ git push heroku master
note çšèª: ã¢ããªã±ãŒã·ã§ã³ã®ãããã€ãšã¯ãgitã䜿ã£ãŠHerokuãžã¢ããªã±ãŒã·ã§ã³ãéãäºã§è¡ããŸãã
ãããã€ã¯ãã®æãããŒã«ã«ããHerokuãžã¢ããªã±ãŒã·ã§ã³ãç§»ãããã«gitã転éã®ä»çµã¿ãšããŠå©çšããŸãã
Herokuãgitã®ããã·ã¥ãåä¿¡ããæãã¢ããªã±ãŒã·ã§ã³ã®ãã«ããåæåããŸãããã«ãã®ã¡ã«ããºã ã¯äžè¬çã«èšèªã«ãã£ãŠå ·äœçãªãšããã¯ç°ãªããŸãããåããã¿ãŒã³ããªãã£ãŠãããå žåçã«ã¯ç¹å®ã®äŸåãã¡ã€ã«ãååããå¿ èŠãªã¢ã»ãããäœããŸãã(ã¹ã¿ã€ã«ã·ãŒãã®åŠçã®æ§ã«ç°¡åãããããã¯ã³ãŒãã®ã³ã³ãã€ã«ã®æ§ã«è€éãã©ã¡ããã§ã)
callout äžæ©èžã¿èŸŒãã§: Buildpacksã¯Slugã®çµ±ååŠçã®åŸãã«ååšããŸãããªãŒãã³ãœãŒã¹ãªã®ã§ãHerokuãä»ã®èšèªããã¬ãŒã ã¯ãŒã¯ãæ±ããããã«æ¡åŒµããããšãå¯èœã§ããBuildpacksã¯ã¢ããªã±ãŒã·ã§ã³ãšãã®äŸåãã¡ã€ã«é¡ããããŠèšèªã®å®è¡ç³»ãååŸããŠãSlugãçæããŸãã
äŸãã°ããã«ãã·ã¹ãã ãRailsã®ã¢ããªã±ãŒã·ã§ã³ãåä¿¡ããå ŽåãGemfileã®äžã«æå®ãããŠããäŸåãã¡ã€ã«ã®å šãŠãååŸããåæ§ã«ã¢ã»ãããã€ãã©ã€ã³ã«åºã¥ããŠãã¡ã€ã«ãçæããã§ããããJavaã®ã¢ããªã±ãŒã·ã§ã³ãªãã°ãMavenã䜿ã£ãŠãããã€ããªããŒã¹ã®ã©ã€ãã©ãªãã¡ã€ã«ãéãããããã®ã©ã€ãã©ãªãšå ±ã«ãœãŒã¹ã³ãŒããã³ã³ãã€ã«ãããããŠå®è¡çšã®JARãã¡ã€ã«ãçæããŸãã
çæãããã¢ã»ãããã³ã³ãã€ã«ãããã³ãŒãã®ãããªåéããããã«ã段éã®çæç©ãšäŸåãã¡ã€ã«ããŸãåæ§ã«èšèªãšãã¬ãŒã ã¯ãŒã¯ãšäžç·ã«ãªã£ãŠããã¢ããªã±ãŒã·ã§ã³ã®ãœãŒã¹ã³ãŒãã¯ãSlugãšããŠçµã¿ç«ãŠãããŸãã
note çšèª: Slug ã¯ããªãã®ãœãŒã¹ãåéãããäŸåãã¡ã€ã«ãèšèªã®å®è¡ç³»ãçæ/ã³ã³ãã€ã«ããããã«ãã·ã¹ãã ã®åºåã®ãŸãšãŸãã§ãã - å®è¡ãã§ããæºåãã§ããŠããç¶æ ã§ãã
ãããã®Slugã¯ã¢ããªã±ãŒã·ã§ã³ã®å®è¡äžã«èµ·ããäºã®åºæ¬çãªæ§çžã瀺ããŠããŸãããããã¯ã³ã³ãã€ã«ãããçµã¿ç«ãŠãããã¢ããªã±ãŒã·ã§ã³ãå«ã¿ãå®è¡ãããæç€º(Procfileã®ããš)ãšå ±ã«å®è¡ããæºåãåºæ¥ãŠããŸãã
Herokuã¯çšæãããSlug(å®éã¯Release; SlugãšãŸã å®çŸ©ããŠãªãèšå®çšå€æ°ãã¢ããªã³ãšäœµãããã®)ãšå ±ã«ãããããèªã¿èŸŒãŸããŠããDynoã®äžã§ãããªããProcfileã«æå®ããã³ãã³ããå©ãäºã§ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããŸãã
Dynoã§ã®å®è¡ã¯ãããªãã®ã¢ããªã±ãŒã·ã§ã³ã®Slugããã¡ã€ã«ã·ã¹ãã ã«å«ãã§ããã軜éã§å®å šã§ä»®æ³åãããUnixã®ã³ã³ããã ãšèããŠãã ããã
note çšèª: Dynoã¯ç¬ç«ãããä»®æ³åãããUnixã®ã³ã³ããã§ãã¢ããªã±ãŒã·ã§ã³ãå®è¡ãããã®ã«å¿ èŠãªç°å¢ãæäŸããŸãã
éåžžãåããŠã®ã¢ããªã±ãŒã·ã§ã³ããããã€ããå ŽåãHerokuã¯èªåã§ïŒåã®Web Dynoã䜿çšããŸããèšãæãããšãDynoãèµ·åããSlugãèªã¿èŸŒãã§ããããŠProcfileã®äžã®webããã»ã¹ã¿ã€ããšããŠæå®ãããã³ãã³ããå®è¡ããŸãã
ã©ããªãšãã§ããããã€ã®Dynoãå®è¡ããããã³ã³ãããŒã«ããããšãã§ããŸããå ã®Procfileã®äŸãåæã«èãããšãïŒåãWebããã»ã¹ã¿ã€ããïŒåã®Queutyããã»ã¹ã¿ã€ããåèšã§ïŒåã®Dynoã䜿çšããå Žåã¯ä»¥äžã®ããã«ãªããŸã :
$ heroku ps:scale web=3 queuty=2
ã¢ããªã±ãŒã·ã§ã³ã®æ°ããããŒãžã§ã³ããããã€ãããšãã¯ãçŸåšå®è¡ããŠããå šãŠã®Dynoã¯äžæŠçµäºããããããŠæ°ãããã®(æ°ããReleaseãšå ±ã«)ãå ¥ãæ¿ããã«å®è¡ãããŸããçŸåããDynoæ§æã¯ç¶æãããŸãã
note çšèª: ã¢ããªã±ãŒã·ã§ã³ã®Dynoæ§æãšã¯çŸåšå®è¡äžã®Dynoã®åèšã®æ°ã§ãããããªããæ¡åŒµããã®ã«äœµããŠæ§ã ãªããã»ã¹ã¿ã€ãã®éã§åé ãããŸãã
äœãå®è¡ãããŠããããçè§£ããããã«ãäœã®Dynoãã©ã®ããã»ã¹ã¿ã€ããå®è¡ããŠããã®ããç¥ãå¿ èŠããããŸã :
$ heroku ps
== web: 'java lib/foobar.jar $PORT'
web.1: up 2013/02/07 18:59:17 (~ 13m ago)
web.1: up 2013/02/07 18:52:08 (~ 20m ago)
web.2: up 2013/02/07 18:31:14 (~ 41m ago)
== queuty: `java lib/queue-processor.jar`
queuty.1: up 2013/02/07 18:40:48 (~ 32m ago)
queuty.2: up 2013/02/07 18:40:48 (~ 32m ago)
Dynoã¯ããªãã®ã¢ããªã±ãŒã·ã§ã³ãæ¡åŒµããéèŠãªæ¹æ³ã«ãªããŸãããã®äŸã ãšãã¢ããªã±ãŒã·ã§ã³ã¯Webãšãã¥ãŒã®ã¯ãŒã«ãŒçšDynoãç¬ç«ããŠã¹ã±ãŒã«ãããããšãã§ããè¯ãèšèšã«ãªã£ãŠããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®èšå®ã¯ããããã€(ã¹ããŒãžã³ã°ããããã¯ã·ã§ã³ãéçºç°å¢ããã®ä»...)ã«ãã£ãŠç°ãªã£ãŠãããã¹ãŠã®ç©ãæããŸããããã¯ããŒã¿ããŒã¹ãèªèšŒããããã¯ããªãã®ã¢ããªã±ãŒã·ã§ã³ã«é¢ããæèçãªæ å ±ãæäŸããç°å¢å€æ°ã®ãããªãè£ã§æäŸããããªãœãŒã¹ç®¡çãå«ãã§ããŸãã
Herokuã¯ã«ã¹ã¿ãã€ãºå¯èœãªèšå®ãããäžã§ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããããšãã§ããŸããèšå®ã¯ã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒãã®å€ã«ååšããç¬ç«ããŠå€æŽããããšãã§ããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®èšå®ã¯config varsã«ä¿æãããŠããŸããäŸãšããŠãã©ã®ããã«ããªãã®ã¢ããªã±ãŒã·ã§ã³çšã®æå·åããŒãèšå®ããã®ãã瀺ããŸã :
$ heroku config:add ENCRYPTION_KEY= my_secret_launch_codes
Adding config vars and restarting demoapp... done, v14
ENCRYPTION_KEY: my_secret_launch_codes
note çšèª: èšå®å€æ° ã¯ã«ã¹ã¿ãã€ãºå¯èœãªèšå®çšã®ããŒã¿ãå«ãã§ããŸããããã¯ããªãã®ã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒããšã¯ç¬ç«ããŠå€æŽå¯èœã§ããèšå®ã¯ç°å¢å€æ°ãéããŠå®è¡äžã®ã¢ããªã±ãŒã·ã§ã³ã«é©å¿ãããŸãã
å®è¡ç³»ã§ã¯ããã¹ãŠå
šãŠã®èšå®å€æ°ãç°å¢å€æ°ãšããŠæ±ãããŸããã€ãŸãã¯ããããã¯ããã°ã©ã ã§ç°¡åã«æœåºããããšãå¯èœã§ããäžèšã®ãããªèšå®å€æ°ãšãšãã«ãããã€ãããRubyã®ã¢ããªã±ãŒã·ã§ã³ã¯ãENV["ENCRYPTION_KEY"]
ã䜿ã£ãŠããã«ã¢ã¯ã»ã¹ããããšãã§ããŸãã
å šãŠã®ã¢ããªã±ãŒã·ã§ã³å ã®Dynoã¯ãå®è¡ç³»ã§ç¢ºå®ã«åãèšå®å€æ°ã䜿çšããŸãã
ãããŸã§ããã®èšäºã§ã¯ãDynoã«ããã¢ããªã±ãŒã·ã§ã³ãå®è¡ããããã«ãHerokuã¯Dynoãšå ±ã«ææ°ã®Slugãèªã¿èŸŒããšè¿°ã¹ãŸãããããããããã¯æ¹ããå¿ èŠããããŸããå®éã«ã¯ãSlugãšå ±ã«ããªããã¢ããªã±ãŒã·ã§ã³ã«å²ãåœãŠãç°å¢å€æ°ãèªã¿èŸŒãã§ããŸããSlugãšèšå®ã®çµã¿åããã¯ReleaseãšåŒã°ããŸãã
note çšèª (ä»®): Releases ã¯Slugãšèšå®å€æ°ã®ãæžã蟌ã¿å°çšã®å°åž³ã§ã.
ãã¹ãŠã®Releaseã¯èªåçã«æžã蟌ã¿å°çšã®å°åž³ã«æžã蟌ãŸããã¢ããªã±ãŒã·ã§ã³ãšä»ã®Releaseã管çããŠããŸããheroku releases
ã³ãã³ãã䜿ã£ãŠãReleaseã®ãããã€ã®è»è·¡ãèŠãŠã¿ãŸããã :
$ heroku releases
== demoapp Releases
v103 Deploy 582fc95 [email protected] 2013/01/31 12:15:35
v102 Deploy 990d916 [email protected] 2013/01/31 12:01:12
callout ãããã€ã®ã¡ãã»ãŒãžã®æšªã«ããæ°åãäŸãã°
582fc95
ãã¯Herokuã«ãããã€ããŠãããªããžããªã®ã³ãããããã·ã¥ãšäžèŽããŸãã
ããªããã¢ããªã±ãŒã·ã§ã³ã®æ°ããããŒãžã§ã³ããããã€ãããã³ã«æ¯åãæ°ããSlugãäœãããReleaseãçæãããŸãã
Herokuã¯ã¢ããªã±ãŒã·ã§ã³ã®éå»ã®Releaseãå«ãã§ãããããããŒã«ããã¯ãéå»ã®Releaseããããã€ãçŽãäºã¯ãšãŠãç°¡åã§ãã
$ heroku releases:rollback v102
Rolling back demoapp... done, v102
$ heroku releases
== demoapp Releases
v104 Rollback to v102 [email protected] 2013/01/31 14:11:33 (~15s ago)
v103 Deploy 582fc95 [email protected] 2013/01/31 12:15:35
v102 Deploy 990d916 [email protected] 2013/01/31 12:01:12
ã¢ããªã±ãŒã·ã§ã³ãããœãŒã¹ãèšå®ã®ã©ã¡ããéšåçã«å€æŽããããšã¯ãçµæãšããŠæ°ããReleaseãäœããŸãã
Releaseãšã¯ãHerokuãã¢ããªã±ãŒã·ã§ã³ã®ãœãŒã¹(Slugã®äžã«ä¿æãããŠãã)ã®äžã®ã¢ããªã±ãŒã·ã§ã³ã®èšå®(èšå®å€æ°)ãç¬ç«ããŠå€æŽã§ããããã«ããŠããèæ¯ã®ä»çµã¿ã§ããReleaseã¯ãã®ä»çµã¿ãšå ±ã«ååšããŠãŸããã¢ããªã±ãŒã·ã§ã³ã«é¢é£ããèšå®å€æ°ã倿Žãããšãã¯ãã€ã§ããæ°ããReleaseãçæãããŸãã
Herokuãã©ãããã©ãŒã ã®äžéšãDynoãããŒãžã£ãŒã¯Dynoã®å®è¡äžç¶æ ãç¶æããäºãä»äºã§ããäŸãã°ãDynoã¯æäœã§ã1æ¥ã«äžåã¯å転ããDynoãããŒãžã£ãŒã¯ãã€ã§ãå®è¡äžã®ã¢ããªã±ãŒã·ã§ã³ã®åé¡(ã¢ãŠããªãã¡ã¢ãªãªã©)ããŸãã¯Dynoãç©ççã«æ°ããå Žæãžç§»ãå¿ èŠããããããªããŒããŠã§ã¢ã«æœãåé¡ãçºèŠããŸãã
note çšèª: Herokuãã©ãããã©ãŒã ã®DynoãããŒãžã£ãŒ ã¯Herokuã§å®è¡äžã®ãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ãæž¡ã£ãŠäœ¿ãããDynoã管çããããšãä»äºã§ãã
ãã®Dynoã®ãµã€ã¯ã«ã¯éåžžæãšããŠèªåã§ããããŠå¯èŠæ§ãæã£ãŠè¡ããããã°ãåãããŠããŸãã
note çšèª: ïŒåã®Dynoã§çšŒåããŠããã¢ããªã±ãŒã·ã§ã³ã¯éã¢ã¯ãã£ããªç¶æ ããïŒæéçµã€ãšã¹ãªãŒãããŸã. HTTPã®ãã©ãã£ãã¯ãã¹ãªãŒãäžã®ã¢ããªã±ãŒã·ã§ã³ãåä¿¡ããå Žåãæ°ç§ã®é å»¶ãåŒãèµ·ãããªããç«ã¡äžãããŸãã æ¡åŒµãããWeb Dynoã¯ã¹ãªãŒãããŸããã
Herokuãã¢ããªã±ãŒã·ã§ã³ãå®è¡ã管çãããããOSãä»ã®å éšã·ã¹ãã ã®èšå®ã®ç®¡çãããå¿ èŠã¯ãããŸãããOne-off Dynoã¯ããŒã«ã«ã®ã¿ãŒããã«ã«äžããããå ¥åºåãå®è¡ã§ããŸãããããã¯ãŸããå ±æè³æºã®ç¶æ ã倿Žãããããªç®¡ççšã®ã¿ã¹ã¯ãå®è¡ããããã«ã䜿ãããŸããããšãã°ããŒã¿ããŒã¹ã®èšå®ã§ããããããschedulerãéããŠå®æçã«è¡ãããŸãã
note çšèª: One-off Dyno ã¯ããŒã«ã«ã®ã¿ãŒããã«ã«äžããããå ¥åºåãå®è¡ã§ããäžæçãªDynoã§ããææ°ã®Releaseã䜿ã£ãŠè¡ããŸãã
ããã«One-off Dynoãçæããã³ãã³ããéããã£ãšãåçŽãªæ¹æ³ã瀺ããŸã :
$ heroku run bash
Running `bash` attached to terminal... up, run.8963
~ $ ls
ããã¯æ°ããDynoãç«ã¡äžããããªãã®Releaseãèªã¿èŸŒã¿ããããŠbash
ã³ãã³ããå®è¡ããŠããŸããUnixã®ã·ã§ã«ã®æ§ã«äœ¿ããŸã(Dynoã¯å¹ççã«ç¬ç«ãããä»®æ³åUnixã³ã³ãããšããããšãå¿ããªãã§ãã ãã)ãäžåºŠã»ãã·ã§ã³ãåããšããããã¯äžå®æééã¢ã¯ãã£ãã«ãªããšãDynoã¯åé€ãããŸãã
ïŒã€ã®Dynoã®ãã¡ã€ã«ã·ã¹ãã ã«å¯Ÿãã倿Žã¯ãä»ã®DynoãžäŒæ¬ãããããããã€ãéããŠæžã蟌ãŸããããããDynoãåèµ·åããŸããããè¯ããæ¡åŒµæ§ã®ããæ¹æ³ãšããŠãããŒã¿ããŒã¹ããã¥ãŒãªã©ã®å ±æãªãœãŒã¹ã䜿ãäºããããŸãã
note çšèª: ããããã®Dynoã¯èªåã®å¹é£çãã¡ã€ã«ã·ã¹ãã ãæã£ãŠãããææ°ã®Releaseã®ã³ããŒãå«ãŸããŠããŸããäžæçãªç°¡æã¡ã¢ã®ãããªäœ¿ãããããããããã¡ã€ã«ã·ã¹ãã ã«å¯Ÿãã倿Žã¯ä»ã®Dynoã«åæ ãããŸããã
Dynoã®äžã®å¹é£çãªç°å¢ã¯ãäžèšã®ã³ãã³ãã䜿ã£ãŠç¢ºèªããããšãã§ããŸããDynoã®Unixã·ã§ã«ã§heroku run bash
ãå®è¡ããŠOne-off Dynoãäœãããã®ããšã«ãã®Dynoã®äžã«ãã¡ã€ã«ãäœæããã»ãã·ã§ã³ãåã£ãå Žåã倿Žã¯å€±ãããŸããåãã¢ããªã±ãŒã·ã§ã³å
ã§ãã£ãŠããå
šãŠã®Dynoã¯ç¬ç«ããŠããŸãããããŠã»ãã·ã§ã³ãåãããšDynoã¯çµäºããåé€ãããŸããæ°ããDynoã¯ãã€ãSlugããäœãããä»ã®Dynoã®ç¶æ
ããäœãããäºã¯æ±ºããŠãããŸããã
ã¢ããªã±ãŒã·ã§ã³ã¯éåžžãããŒã¿ããŒã¹ããã¥ãŒã€ã³ã°ããã£ãã·ã¥ã·ã¹ãã ãã¹ãã¬ãŒãžãã¡ãŒã«ãµãŒãã¹ãªã©ã®ããã¯ãµãŒãã¹ãæäŸããããã«ãã¢ããªã³ãå©çšããŸããã¢ããªã³ã¯HerokuããµãŒãããŒãã£ãããµãŒãã¹ãšããŠæäŸãããŸããããã«ã¢ããªã³ãéžã¶äºãåºæ¥ã倧ããªããŒã±ãããã¬ã€ã¹ããããŸãã
Herokuã¯ãããã®ã¢ããªã³ã远å ããããªãœãŒã¹ãšããŠæ±ããŸããã¢ããªã³ã®æºåã¯ãã¢ããªã³ã®ããŒã±ãããã¬ã€ã¹ããäžã€éžã³ãã¢ããªã±ãŒã·ã§ã³ã«è¿œå ããäºã§è¡ããŸãã
äŸãã°ãããã¯ã¢ããªã±ãŒã·ã§ã³ã«Redisã®åŸãã§åãã¹ãã¢ã¢ããªã³(RedisToGo)ã®è¿œå æ¹æ³ã§ã :
$ heroku addons:add redistogo:nano
ã¢ããªã³ã®æäŸè
ã¯ãã®ãµãŒãã¹ã«è²¬ä»»ãæã£ãŠããŸãããããŠãã¢ããªã±ãŒã·ã§ã³ãšã®ã€ã³ã¿ãŒãã§ãŒã¹ã¯ãã°ãã°èšå®å€æ°ãéããŠæäŸãããŸããããšãã°ãã®äŸã®å Žåãã¢ããªã³ãæºåããããšãã«ã¢ããªã±ãŒã·ã§ã³ã«REDISTOGO_URL
ãèªåçã«è¿œå ãããŸããããã§URLãéããŠãµãŒãã¹ãšã€ãªãã³ãŒããæžãäºãåºæ¥ãŸããäŸãã°ãã®ããã«ãªããŸã :
uri = URI.parse(ENV["REDISTOGO_URL"])
REDIS = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
note çšèª: ã¢ããªã³ ã¯ãµãŒãããŒãã£ã®ãããéšåã«ç¹åããã䟡å€ãä»å ããŠãããã¯ã©ãŠããµãŒãã¹ã§ããæ©èœãæ¡åŒµããªããããç°¡åã«ã¢ããªã±ãŒã·ã§ã³ã«è¿œå ããäºãåºæ¥ãŸãã
ã¢ããªã³ã¯ã¢ããªã±ãŒã·ã§ã³ãšãå€ãã®å Žåèšå®å€æ°ã䜿ã£ãŠé£æºãããŸãããã®ãããReleaseã®æ¢åºã®å®çŸ©ãæ¹ããå¿ èŠãããããŸããããªãã®ã¢ããªã±ãŒã·ã§ã³ã®Releaseã¯Slugãšèšå®å€æ°ã ãã§ã¯ãããŸãããSlugãšèšå®å€æ°ã®ä»ã«ãåãä»ããããã¢ããªã³ãå«ã¿ãŸãã
note çšèª (ä»®): Releases ã¯Slugãšèšå®å€æ°ããããŠã¢ããªã³ã®æžã蟌ã¿å°çšã®å°åž³ã§ã. Herokuã¯ããªããäœã£ããªãªãŒã¹ã®æžã蟌ã¿å°çšå°åž³ã管çä¿æããŸãã
èšå®å€æ°ã®æ§ã«ãã¢ããªã³ã远å ãåé€ã倿Žããæã¯ããããªãå Žåã§ãæ°ããReleaseãäœãããŸãã
Herokuã¯ãã°ãæç³»åã®ã€ãã³ãã®åºåãšããŠæ±ããŸãããããŠãå šãŠã®DynoãšHerokuãã©ãããã©ãŒã ã®æ§æç©ã®äžã§å®è¡ãããŠãããã¹ã§ã®åŠçããçæããããã°ã®åºåãé ã«ãLogplexã®äžã«äžŠã¹ãŸããããã¯ãã°æäŸã®ããã®é«ããã©ãŒãã³ã¹ã§ãªã¢ã«ã¿ã€ã ãªã·ã¹ãã ã§ãã
ãã©ãããã©ãŒã ã®æ§æç©ãšDynoã®å šãŠã暪æãããã°ã確èªããã®ã¯ç°¡åãªäºã§ã :
$ heroku logs
2013-02-11T15:19:10+00:00 heroku[router]: at=info method=GET path=/articles/custom-domains host=mydemoapp.heroku.com fwd=74.58.173.188 dyno=web.1 queue=0 wait=0ms connect=0ms service=1452ms status=200 bytes=5783
2013-02-11T15:19:10+00:00 app[web.2]: Started GET "/" for 1.169.38.175 at 2013-02-11 15:19:10 +0000
2013-02-11T15:19:10+00:00 app[web.1]: Started GET "/" for 2.161.132.15 at 2013-02-11 15:20:10 +0000
ïŒåã®ã¿ã€ã ã¹ã¿ã³ããä»ããŠãããã°ã®è¡ãããã§ç¢ºèªã§ããŸããå§ãã¯Herokuã®ã«ãŒã¿ãããæåŸã®ïŒè¡ã¯Webããã»ã¹ã¿ã€ããå®è¡ããŠããïŒåã®Dynoããã§ãã
note Terminology: Logplex ã¯èªåçã«ããªãã®ã¢ããªã±ãŒã·ã§ã³ã®å®è¡äžã®ãã¹ãŠã®DynoããŸãåæ§ã«ã«ãŒã¿ã®ãããªæ§æç©ããã®ãã°ã®ãšã³ããªãé ã«ãªãã¹ãã¢ã¯ãã£ããã£ã®äžå åãããæ å ±æºãšããŠæäŸããŠããŸãã
æŽã«ããã äžã€ã®DynoãéžæããŠããã£ã³ãã«ãéãã£æŸãã«ããªããããããªãã€ãã³ãã確èªããããšãã§ããŸãã
$ heroku logs --ps web.1 --tail
2013-02-11T15:19:10+00:00 app[web.2]: Started GET "/" for 1.169.38.175 at 2013-02-11 15:19:10 +0000
Logplexã¯ããã©ãŒãã³ã¹çãªçç±ã«ãããéãããéã®ãããã¡ã®ã¿ä¿æããŸããããããä¿åããããäŸå€æã«Eã¡ãŒã«ã§éç¥ããããããªã€ãã³ããèµ·ããããã«ã¯ãLogging Add-onã䜿ã£ãŠãã ãããLogplexããã®åºåãåä¿¡ããAPIã§ããã°ã®æµåºã«å¯ŸããŠå¹æçã§ãã
ããªãã®Dynoæ§æã«ãããŸãããããã€ãã®Dynoã¯Webããã»ã¹ã¿ã€ãã«é¢é£ã¥ããã³ãã³ããå®è¡ãããããŠããã€ãã¯å¥ã®ããã»ã¹ã¿ã€ãã«é¢é£ã¥ããã³ãã³ããå®è¡ããç¶æ ã«ãªããŸãã
Webããã»ã¹ã¿ã€ããå®è¡ããDynoã¯ä»ã®ãã¹ãŠã®Dynoãšæ¯ã¹ãŠïŒç¹å€§ããéãæããããŸããããã¯ã圌ããHTTPã®ãã©ãã£ãã¯ãåä¿¡ãããšããããšã§ããHerokuã®HTTP routersã¯ã¢ããªã±ãŒã·ã§ã³ã®å®è¡äžã®Web Dynoã®éã§ãå°çããããšããŠãããªã¯ãšã¹ããåé ããŸãã
ãã®ãããã¢ããªã±ãŒã·ã§ã³ã®Webãã©ãã£ãã¯ã«å¯Ÿãã蚱容éãæ¡åŒµããããã«ãWeb Dynoã®æ°ãå¢ããäºã¯æå¹ã«åããŸãã
$ heroku ps:scale web+5
ã©ã³ãã ãªéžæã¢ã«ãŽãªãºã ãDynoéã§ã®HTTPãªã¯ãšã¹ãã®ããŒããã©ã³ã·ã³ã°ã§ã¯äœ¿ãããŠããŸãããããŠãã®ã«ãŒãã£ã³ã°ã¯HTTPãšHTTPSã®ãã©ãã£ãã¯äž¡æ¹ãå¶åŸ¡ããŸããã¿ã€ã ã¢ãŠãã®å¶åŸ¡ãšãè€æ°åææ¥ç¶ããµããŒããããŠããŸãã
ããã§èª¬æããŠããæŠå¿µã¯ãïŒã€ã®é åã«åããäºãã§ããŸããã¢ããªã±ãŒã·ã§ã³ã®éçºãšãããã€ã«é¢ãããã®ããããŠHerokuãšãããã€ãããããšã®ã¢ããªã±ãŒã·ã§ã³ãžã®å®è¡æã®æç€ºã«é¢ãããã®ã§ãã
äžèšã®ïŒã€ã®ãªã¹ãã¯ããã©ãããã©ãŒã ã®äž»ãªæ§æç©ãèŠçŽããïŒã€ã®é åã«åãããã®ã«ãªã£ãŠããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã¯ããªãã®ãœãŒã¹ã³ãŒããããããäŸåãã¡ã€ã«ãžã®èšè¿°ããããŠProcfileããæ§æãããŸãã
- Procfilesã¯ããã»ã¹ã¿ã€ã(å®è¡ããŠãããããã³ãã³ã)ã®äžèЧã§ãã
- ã¢ããªã±ãŒã·ã§ã³ã®ãããã€ã«ãGitã䜿ã£ãŠHerokuã«ã¢ããªã±ãŒã·ã§ã³ãéãããšããããŸãã
- Buildpacksã¯Slugã®åéåŠçã®åŸãã«ååšããŠããŸããBuildPacksã¯ã¢ããªã±ãŒã·ã§ã³ããã®äŸåãã¡ã€ã«ããããŠèšèªã®å®è¡ç³»ãååŸããSlugãçæããŸãã
- Slug ã¯ããªãã®ãœãŒã¹ãåéãããäŸåãã¡ã€ã«ãèšèªã®å®è¡ç³»ãçæ/ã³ã³ãã€ã«ããããã«ãã·ã¹ãã ã®åºåã®ãŸãšãŸãã§ãã - å®è¡ãã§ããæºåãã§ããŠããç¶æ ã§ãã
- èšå®å€æ° ã¯ã«ã¹ã¿ãã€ãºå¯èœãªèšå®çšã®ããŒã¿ãå«ãã§ããŸããããã¯ããªãã®ã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒããšã¯ç¬ç«ããŠå€æŽå¯èœã§ããèšå®ã¯ç°å¢å€æ°ãéããŠå®è¡äžã®ã¢ããªã±ãŒã·ã§ã³ã«é©å¿ãããŸãã
- ã¢ããªã³ã¯ãµãŒãããŒãã£ã®ãããéšåã«ç¹åããã䟡å€ãä»å ããŠãããã¯ã©ãŠããµãŒãã¹ã§ããæ©èœãæ¡åŒµããªããããç°¡åã«ã¢ããªã±ãŒã·ã§ã³ã«è¿œå ããäºãåºæ¥ãŸãã
- Releases ã¯Slugãšèšå®å€æ°ããããŠã¢ããªã³ã®æžã蟌ã¿å°çšã®å°åž³ã§ã. Herokuã¯ããªããäœã£ããªãªãŒã¹ã®æžã蟌ã¿å°çšå°åž³ã管çä¿æããŸãã
- Dynoã¯ç¬ç«ãããä»®æ³åãããUnixã®ã³ã³ããã§ãã¢ããªã±ãŒã·ã§ã³ãå®è¡ãããã®ã«å¿ èŠãªç°å¢ãæäŸããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã®Dynoæ§æãšã¯çŸåšå®è¡äžã®Dynoã®åèšã®æ°ã§ãããããªããæ¡åŒµããã®ã«äœµããŠæ§ã ãªããã»ã¹ã¿ã€ãã®éã§åé ãããŸãã
- DynoãããŒãžã£ãŒ ã¯Herokuã§å®è¡äžã®ãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ãæž¡ã£ãŠäœ¿ãããDynoã管çããããšãä»äºã§ãã
- ïŒåã®Dynoã§çšŒåããŠããã¢ããªã±ãŒã·ã§ã³ã¯éã¢ã¯ãã£ããªç¶æ ããïŒæéçµã€ãšãDynoãããŒãžã£ãŒã«ãã£ãŠã¹ãªãŒãç¶æ ã«ãããŸããè€æ°åã®Web Dynoã«æ¡åŒµãããå Žåã¯ã¹ãªãŒãããŸããã
- One-off Dyno ã¯ããŒã«ã«ã®ã¿ãŒããã«ã«äžããããå ¥åºåãå®è¡ã§ããäžæçãªDynoã§ããææ°ã®Releaseã䜿ã£ãŠè¡ããŸãã
- ããããã®Dynoã¯èªåã®å¹é£çãã¡ã€ã«ã·ã¹ãã ãæã£ãŠãããææ°ã®Releaseã®ã³ããŒãå«ãŸããŠããŸããäžæçãªç°¡æã¡ã¢ã®ãããªäœ¿ãããããããããã¡ã€ã«ã·ã¹ãã ã«å¯Ÿãã倿Žã¯ä»ã®Dynoã«åæ ãããŸããã
- Logplex ã¯èªåçã«ããªãã®ã¢ããªã±ãŒã·ã§ã³ã®å®è¡äžã®ãã¹ãŠã®DynoããŸãåæ§ã«ã«ãŒã¿ã®ãããªæ§æç©ããã®ãã°ã®ãšã³ããªãé ã«ãªãã¹ãã¢ã¯ãã£ããã£ã®äžå åãããæ å ±æºãšããŠæäŸããŠããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã®æ¡åŒµ(ã¹ã±ãŒãªã³ã°)ã«ã¯ãããããã®ããã»ã¹ã¿ã€ãã®Dynoã®æ°ã倿ŽããããšããããŸãã