Set up Google Cloud Platform + MEAN stack in 5mins

I believe in Google products, so it’s thus quite naturally that I use Google Cloud Platform to host my websites, apps, etc. GCP proposes a lot of pre-configured images for all your needs: blog, os, database, crm, or developer tools and infra like:

  • Jenkins
  • GitLab
  • Trac
  • NodeJS
  • MEAN
  • MySQL
  • Ruby
  • Cassandra

Images are delivered with all the tools you need to work efficiently! For example, the MEAN stack came with MongoDB, NodeJS, Express, Git, etc.

Well 🙂

But, a little configuration is needed to make your app listening on your custom port (3000 for example)

Steps

  1. Launch your server SSH console from Google Cloud Platform (Bitnami)
  2. Clone the project under /home/user/apps/
  3. Open up port 3000 in your Google Compute Network Firewall : Your VMs > Edit > Network > Click on default network_google_clud_mean_settingup
  4. Launch your own project on port 3000 (using your favorite grunt/node server command) and test if http://SERVER_IP:3000 works ? If it’s OK, go to step 5
  5. Edit the file opt/bitnami/apache2/conf/bitnami/bitnami.conf and replace the content with the configuration below (it’s only a proxy pass to route your server to the 3000 port)

Virtual Host Configuration

    <IfVersion < 2.3 >
      NameVirtualHost *:80
      NameVirtualHost *:443
    </IfVersion>

    <VirtualHost _default_:80>
    #  DocumentRoot "/opt/bitnami/apache2/htdocs"
    #  <Directory "/opt/bitnami/apache2/htdocs">
    #    Options FollowSymLinks MultiViews
    #    AddLanguage en en
    #    LanguagePriority en
    #    ForceLanguagePriority Prefer Fallback

    #    AllowOverride All
    #    <IfVersion < 2.3 >
    #      Order allow,deny                          
    #      Allow from all
    #    </IfVersion>
    #    <IfVersion >= 2.3 >
    #      Require all granted
    #    </IfVersion>
    #  </Directory>

    # Error Documents
      ErrorDocument 503 /503.html

    # Bitnami applications installed with a prefix URL (default)
    #  Include "/opt/bitnami/apache2/conf/bitnami/bitnami-apps-prefix.conf"

    # Redirect to port 3000 (proxy pass)
      ServerAdmin youremail@gmail.com
      ServerName yourservername.fr
      ProxyPass / http://localhost:3000/
      ProxyPassReverse / http://localhost:3000/
      ProxyPreserveHost On

    </VirtualHost>

    # Default SSL Virtual Host configuration.

    <IfModule !ssl_module>
      LoadModule ssl_module modules/mod_ssl.so
    </IfModule>

    Listen 443
    SSLProtocol all -SSLv2 -SSLv3
    SSLHonorCipherOrder on
    SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !EDH !RC4"
    SSLPassPhraseDialog  builtin
    SSLSessionCache "shmcb:/opt/bitnami/apache2/logs/ssl_scache(512000)"
    SSLSessionCacheTimeout  300

    <VirtualHost _default_:443>
      DocumentRoot "/opt/bitnami/apache2/htdocs"
      SSLEngine on
    SSLCertificateFile "/opt/bitnami/apache2/conf/server.crt"
    SSLCertificateKeyFile "/opt/bitnami/apache2/conf/server.key"

      <Directory "/opt/bitnami/apache2/htdocs">
        Options FollowSymLinks MultiViews
        AddLanguage en en
        LanguagePriority en
        ForceLanguagePriority Prefer Fallback
        AllowOverride All
        <IfVersion < 2.3 >
          Order allow,deny                          
          Allow from all
        </IfVersion>
        <IfVersion >= 2.3 >
          Require all granted
        </IfVersion>
      </Directory>
      # Error Documents
      ErrorDocument 503 /503.html

      # Bitnami applications installed with a prefix URL (default)
      Include "/opt/bitnami/apache2/conf/bitnami/bitnami-apps-prefix.conf"
    </VirtualHost>
    # Bitnami applications that uses virtual host configuration
    Include "/opt/bitnami/apache2/conf/bitnami/bitnami-apps-vhosts.conf"
    # Status
    ExtendedStatus on
    <VirtualHost _default_:80>
    ServerName local-stackdriver-agent.stackdriver.com
    <Location /server-status>
      SetHandler server-status
      Order deny,allow
      Deny from all
      Allow from 127.0.0.1
    </Location>
    </VirtualHost>
  1. Restart apache with this command sudo /opt/bitnami/ctlscript.sh restart apache
  2. Now check your server IP in your favorite browser (chrome probably?), and your project should run there.

Envoyer des mails en javascript avec nodemailer

Pour un projet perso qui tourne sur un stack MEAN (Mongo, Express, Angular et NodeJS), j’ai eu besoin de notifier des utilisateurs en leur envoyant un mail.

J’ai donc trouvé plusieurs librairies qui font le boulot, mais j’ai beaucoup accroché avec nodemailer qui pour moi est la plus propre et simple d’utilisation. Et d’ailleurs, avec plus de 5000 stars et 70 contributeurs sur Github ça va, c’est assez stable 🙂

Installation

Ajout de nodemailer au projet (le —save pour ajouter a dépendance au package.json)

[javascript]npm install nodemailer —save [/javascript]

Autorisation Gmail

Pour Gmail, et surement les autres aussi, il faut configurer son compte en « Bas niveau de sécurité » pour autoriser une application externe  à lire/envoyer des emails.

(pour ceux qui ne souhaitent pas baisser le niveau de sécurité, il existe d’autres alternatives)

Baisser le niveau de sécurité : https://www.google.com/settings/security/lesssecureapps

Envoyer un email

Au début du fichier, au moment des import, on ajoute une dépendance à nodemailer :

[javascript]var nodemailer = require(‘nodemailer’);[/javascript]

On crée ensuite la variable « transporter » qui contient les options de connexion et de transport pour l’envoi des emails (qu’on réutilisera à chaque envoi de mail)

[javascript]var transporter = nodemailer.createTransport(‘smtps://user%40gmail.com:password@smtp.gmail.com’);[/javascript]

Ensuite on construit l’objet JSON « mailOptions » qui contient les différents champs du mail (les symboles unicodes sont supportés!).

[javascript]var mailOptions = {
  from: ‘Joey Bronner" <mon@email.com>’,
to: ‘yourfriend@email.com, yourotherfriend@email.com’,
  subject: ‘Bonjour’,
  text: ‘Hello world’,
  html: ‘<b>Hello world</b>’
};[/javascript]

Quatre paramètres sont obligatoires et d’autres sont facultatifs:

  • from
  • to
  • subject
  • text / html

Dernière étape, l’envoi du mail!

[javascript]transporter.sendMail(mailOptions, function(error, info){
if (error) {
console.log(error);
}
console.log(‘Message sent: ‘ + info.response);
});
[/javascript]

Pleins d’options (pièces jointes, templates etc…) sont disponibles, donc si vous avez besoin d’envoyer des mails en JS, pensez à nodemailer!

Plus d’informations sur le repository Github : https://github.com/nodemailer/nodemailer

Debugger Node.js avec node-inspector (Chrome Dev Tools)

La première solution pour débugger la partie serveur en Node est de créer des traces via des console.log, console.info, console.error etc… mais ce n’est pas le but de cet article puisqu’il existe une autre manière beaucoup plus efficace de debugger ce code là grace au plugin node-inspector (Chrome Dev Tools).

Au cas où, je mets quand même les différentes options pour ceux qui souhaitent débugger dans la console :

  • console.log([data], […]);
  • console.info([data], […]);
  • console.error([data], […]);
  • console.warn([data], […]);
  • console.dir(obj);
  • console.time(label);
  • console.timeEnd(label);
  • console.trace(label);
  • console.assert(expression, [message]);

Utiliser son browser

Le gros avantage de debugger dans le Chrome Dev Tools c’est de faire du pas à pas et de pouvoir examiner les variables, objets etc à la volée! Pour en profiter, il suffit d’installer le package node-inspector (à propos de package).

[javascript]npm install -g node-inspector[/javascript]

Au moment du démarrage du serveur, il faudra simplement rajouter le flag –debug

[javascript]node –debug server.js[/javascript]

Ou pour mettre un break sur le serveur dès son démarrage…

[javascript]node –debug-brk server.js[/javascript]

Le serveur a été démarré en mode debug, dernière étape, il faut maintenant lancer node-inspector qui va démarrer sur un autre port : 8080

[javascript]node-inspector &amp;[/javascript]

nodeinspector_command_line

Votre debugger est prêt à l’URL : http://127.0.0.1:8080/debug?port=5858

node_inspector_debugger_tool

Et voilà! Vous pouvez debugger côté serveur like a boss.