Accueil » Java

Déployer une application Play! Framework sur Heroku

19 septembre 2011 4 199 affichages 8 commentaires

Voici un petit guide en Français assez simple, afin de vous expliquer comment déployer une application Play! Framework sur Heroku.

Heroku est un service type PaaS qui permet de déployer une application web dans le cloud. D’abord optimisé pour Ruby on Rails, Heroku s’ouvre à Java depuis septembre 2011. C’est une plateforme largement utilisée par exemple pour créer des applications Facebook. Plus de 20 000 applications Facebook utilisent cette plateforme. Heroku utilise git, et déploie votre code sur Amazon Web Service (AWS).

Play! Framework est un outil de développement d’applications webs. Simple, il reprend les bonnes idées de Ruby On Rails et de différents frameworks pour les proposer au monde Java et Scala. C’est un framework dit « complet » (fullstack en Anglais) car le code est compilé par le framework, les tests unitaires et d’intégration tournent dans le navigateur, et il n’y a pas besoin de serveurs d’applications pour faire tourner votre projet.

Création du compte sur Heroku

Pour commencer, créez un compte sur le site d’Heroku. Au passage, notez la belle utilisation des DIV dans les pages, sur les tableaux Japonais. Vous avez vu comment les DIV se superposent afin de former un paysage japonais ?

Une fois votre compte activé, nous allons pouvoir installer le client en ligne de commande d’heroku. Toutes les explications qui suivent sont pour Mac OS X Lion. Mais je pense que la version Windows ou Linux ne doit pas être bien plus compliquée. Regardez le guide de démarrage rapide sur le site d’Heroku.

Installation du client Heroku

Sur mon Mac, je commence par l’installation d’heroku :

$ sudo gem install heroku
Successfully installed term-ansicolor-1.0.6
Successfully installed mime-types-1.16
Successfully installed rest-client-1.6.7
Successfully installed addressable-2.2.6
Successfully installed launchy-2.0.5
Successfully installed rubyzip-0.9.4
Successfully installed heroku-2.8.0
7 gems installed
Installing ri documentation for term-ansicolor-1.0.6...
Installing ri documentation for mime-types-1.16...
Installing ri documentation for rest-client-1.6.7...
Installing ri documentation for addressable-2.2.6...
Installing ri documentation for launchy-2.0.5...
Installing ri documentation for rubyzip-0.9.4...
Installing ri documentation for heroku-2.8.0...
Installing RDoc documentation for term-ansicolor-1.0.6...
Installing RDoc documentation for mime-types-1.16...
Installing RDoc documentation for rest-client-1.6.7...
Installing RDoc documentation for addressable-2.2.6...
Installing RDoc documentation for launchy-2.0.5...
Installing RDoc documentation for rubyzip-0.9.4...
Installing RDoc documentation for heroku-2.8.0...
$ 

Initialisation de Git

Heroku utilise le gestionnaire de sources Git. Il faut donc que votre projet Play! Framework soit correctement géré avec Git. Si vous n’avez jamais utilisé Git, il sera aussi nécessaire de configurer une clé SSH (voir la doc sur le site de github)

$ cd PATH/TO/MY_PLAY_APP
$ git init
Initialized empty Git repository in .git/
$ git add app conf lib public test
$ git commit -m "new app"
Created initial commit 5df2d09: new app
44 files changed, 8393 insertions(+), 0 deletions(-)

Ajout de votre clé publique RSA sur Heroku

A la première utilisation d’heroku, vous devez d’abord télécharger votre clé publique RSA vers Heroku. Pour cela, rien de plus simple :

$ heroku keys:clear
All keys removed.

$ heroku keys:add
Found the following SSH public keys:
1) github_rsa.pub
2) id_rsa.pub
Which would you like to use with your Heroku account? 2
Uploading ssh public key /Users/dummyUser/.ssh/id_rsa.pub

Vous pouvez alors vérifier que cela fonctionne en vous authentifiant sur la plateforme :

$ heroku login
Enter your Heroku credentials.
Email: [email protected]
Password: 

Création d’une application Java sur Heroku

Pour créer une nouvelle application Java, précisez l’option cedar

$ heroku create -s cedar
Creating blooming-spring-8256... done, stack is bamboo-mri-1.9.2
http://blooming-spring-8256.heroku.com/ | [email protected]:blooming-spring-8256.git
$

La plateforme Heroku détecte qu’il s’agit d’une application Play! Framework. Comme chaque application Play déclare ses dépendances dans un fichier dependencies.yml, l’application peut alors télécharger les ressources externes à partir des repositories Maven. La gestion des dépendances est aussi simple que cela.

Déployer son application vers Heroku

Pour mettre en ligne son application, nous allons simplement commiter puis pusher vers le repository Git sur notre serveur Heroku.

$ git push heroku master
Warning: Permanently added the RSA host key for IP address '50.19.85.156' to the list of known hosts.
Counting objects: 11, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (7/7), 782 bytes, done.
Total 7 (delta 2), reused 0 (delta 0)

-----> Heroku receiving push
-----> Play! app detected
-----> Installing ivysettings.xml..... done
-----> Building Play! application...
       ~        _            _ 
       ~  _ __ | | __ _ _  _| |
       ~ | '_ \| |/ _' | || |_|
       ~ |  __/|_|\____|\__ (_)
       ~ |_|            |__/   
       ~
       ~ play! 1.2.3, http://www.playframework.org
       ~
       1.2.3
       Play! application root found at ./
       Resolving dependencies: .play/play dependencies ./ --forceCopy --silent -Duser.home=/tmp/build_1wxkhc4pwbfwk 2>&1
       ~ Resolving dependencies using /tmp/build_1wxkhc4pwbfwk/conf/dependencies.yml,
       ~
       :: loading settings :: file = /tmp/build_1wxkhc4pwbfwk/.ivy2/ivysettings.xml
       ~ 	com.google.guava->guava r07 (from s3pository)
       ~ 	com.google.code.findbugs->jsr305 1.3.7 (from s3pository)
       ~
       ~ Downloading required dependencies,
       ~
       ~ 	downloading http://s3pository.heroku.com/maven-central/com/google/guava/guava/r07/gu~ a-r07.downloaded http://s3pository.heroku.com/maven-central/com/google/guava/guava/r07/guava-r07.jar                        
       ~ 	downloading http://s3pository.heroku.com/maven-central/com/google/code/findbugs/jsr3~ /1.3.7downloaded http://s3pository.heroku.com/maven-central/com/google/code/findbugs/jsr305/1.3.7/jsr305-1.3.7.jar                        
       ~
       ~ Installing resolved dependencies,
       ~
       ~ 	lib/guava-r07.jar
       ~ 	lib/jsr305-1.3.7.jar
       ~
       ~ Done!
       ~
       Precompiling: .play/play precompile ./ --silent 2>&1
       Listening for transport dt_socket at address: 8000
       06:53:25,160 INFO  ~ Starting /tmp/build_1wxkhc4pwbfwk
       06:53:25,649 INFO  ~ Precompiling ...
       06:53:28,684 INFO  ~ Done.
       
-----> No Procfile found. Will use process: 
       play run --http.port=$PORT $PLAY_OPTS
-----> Discovering process types
       Procfile declares types -> (none)
       Default types for Play! -> web
-----> Compiled slug size is 27.2MB
-----> Launching... done, v6
       http://hollow-meadow-8161.herokuapp.com deployed to Heroku

To [email protected]:hollow-meadow-8161.git
   2fe3421..6e2a0ac  master -> master
$ 

Comment configurer la base de données ?

Heroku offre gratuitement 5MB d’espace sur une base de données PostgreSQL. Pour connaitre les informations de configuration de votre base, tapez heroku config.

$ heroku config
DATABASE_URL        => postgres://dgollvegzp:[email protected]/dgollvegzp
JAVA_OPTS           => -Xmx384m
PATH                => .play:.tools:/usr/local/bin:/usr/bin:/bin
PLAY_OPTS           => --%prod -Dprecompiled=true
SHARED_DATABASE_URL => postgres://dgollvegzp:[email protected]/dgollvegzp

Il suffit donc ici d’utiliser la variable d’environnement SHARED_DATABASE_URL. Editez maintenant le fichier application.conf et recopiez ce qui suit :

# Database configuration
# ~~~~~
# For Heroku
db=${SHARED_DATABASE_URL}
jpa.dialect=org.hibernate.dialect.PostgreSQLDialect
jpa.ddl=update

Une fois cette modification effectuée, n’oubliez pas de commiter votre code sur Git, puis ensuite de lancer un git push heroku master.

Quelques instants plus tard, votre serveur est en ligne et prêt à fonctionner :
http://hollow-meadow-8161.herokuapp.com

Le code source du projet est sur Github :
https://github.com/nicmarti/CatApp

C’est tout.

8 commentaires »

  • SK a dit:

    Cool.
    Faut juste installer ruby pour avoir rubygems (gem). Il n’est pas pré installé sous linux/windows.
    Sinon, en effet c’est l’upload de Play! le plus simplifié de tous les PAAS java existant, parce qu’il reconnait automatiquement qu’il s’agit de Play!, et pas de configuration supllémentaire ou de war à uploader.
    Merci pour le billet.

  • hsablonniere a dit:

    Merci pour ce tuto peut-être peut il être fusionné avec la doc : https://github.com/playframework/play/blob/master/documentation/manual/deployment.textile#Heroku

  • hsablonniere a dit:

    As-tu changer ton application.conf ?

    Mon application crash dès le début…

    Error R11 (Bad bind) -> Process bound to port 8000, should be 43421 (see environment variable PORT)

  • gcusnieux a dit:

    @hsablonniere : Pour moi ça marche du premier coup. Il n’y a rien à modifier dans la conf à part la db. Utilises-tu des modules ?

    Sur le papier l’offre gratuite est intéressante… d’ailleurs c’est la seule 100% compatible ?

  • Nicolas Martignole (author) a dit:

    @gcusnieux non, l’offre payante est aussi compatible. Tu peux ajouter une DB dédiée, plus de puissance CPU ou des outils comme MongoDB. En fait je pense que je vais aller voir à Devoxx la présentation de James Ward d’Heroku sur ce sujet.

  • gcusniex a dit:

    Oui enfin je voulais dire c’est la seule offre « gratuite » 100% compatible… En plus ça à l’air beaucoup plus fluide que GAE.
    Je trouve ça pas mal 384M de mémoire comparé à playapps…
    Sinon pour les Devoxx, j’espère pouvoir y assister également!
    @+

  • opensas a dit:

    here’s another tutorial that you may find useful

    https://github.com/opensas/play-demo/wiki/Step-13—deploy-to-heroku

  • hugo a dit:

    Les derniers commentaires m intéressent. Ou avez vous vu une offre gratuite ? J ai été voir heroku et je trouve au contraire les tarifs assez excessifs, genre la base de données à 200 dollars par mois. Et je comprends pas grand chose aux dynos. Vous avez pris quoi comme offre ?