Déployer un blog indépendant en utilisant Gatsby JS et Ghost via AWS Amplify, Surge.sh ou Argo Tunnel ...
Tags: serverless, gatsby, ghost, node
Published: 2020-03-21 16:41:21

![](https://telegra.ph/file/decc43339f198a3c6af85.png)

**Gatsby** est un générateur de site statique) basé sur React. Il s'agit d'un projet Open Source né en en mai 2015. Debut 2018 Kyle Mathews crée Gatbsy Inc pour soutenir le développement du projet. Les données peuvent provenir de nombreuse et diverses sources : fichiers Markdown, CMS Headless, API WordPress, fichiers Google docs, etc. grâce à de nombreux plugins ...

De son côté, **Ghost** est un moteur de blog libre et open source écrit en JavaScript et distribué sous licence MIT. Ghost est conçu pour simplifier le processus de publication en ligne par des blogueurs. L'idée de Ghost a été écrite pour la première fois début novembre 2012 dans un billet de blog par le fondateur John O'Nolan, ancien responsable de l'équipe interface utilisateur de WordPress, à la suite de sa frustration face à la complexité d'utilisation de WordPress en tant que moteur de blog plutôt qu'en tant que système de gestion de contenu ...

![](https://telegra.ph/file/e66e07ef753bc0dd3f899.png)

Dans cet article, on va utiliser un starter permettant d'utiliser Gatsby comme frontend pour l'API de Ghost. Pour cela lancement d'une instance Ubuntu 18.04 LTS dans Hetzner Cloud :

![](https://telegra.ph/file/bc43978d884f3bb691f4a.jpg)

Puis installation de Gatsby JS localement sur l'instance (utilisation préférable de la version LTS de Node JS pour cela) :

```bash
npm install -g gatsby-cli
```

![](https://telegra.ph/file/c01cbeaa965704b6912ba.png)

Puis déploiement du Starter :

```bash
gatsby new ghost-gatsby https://github.com/TryGhost/gatsby-starter-ghost.git
```

<https://github.com/TryGhost/gatsby-starter-ghost>

![](https://telegra.ph/file/b98221d296dfe9baa7b1a.png)

et test local :

![](https://telegra.ph/file/c280eb65b433b7547ae29.png)

qui répond localement sur le port TCP 8000 :

![](https://telegra.ph/file/689e5bbe3486ab4328e29.jpg)

ainsi que la partie GraphQL :

![](https://telegra.ph/file/15d2d69589742f4afda30.jpg)

Je peux lancer une construction pour générer du contenu statique :

![](https://telegra.ph/file/19a237827292c65dd6a91.png)

![](https://telegra.ph/file/1dbd3d5e5e835b796a129.jpg)

Je peux vérifier de suite via Serve si j'obtiens le même rendu que précédemment :

![](https://telegra.ph/file/7eb2dde0027ddaf628f7f.png)

![](https://telegra.ph/file/f9f96dceed1e844bb97e7.jpg)

Je procède par la suite à une installation locale de Ghost :

```bash
npm i ghost-cli@latest -g
```

![](https://telegra.ph/file/0d2d54865faa5c1e13f15.png)

Ghost émet localement sur le port TCP 2368 et procède à une rapide configuration (attention au fait que ce mode d'installation utilise par défaut SQLite et pour un mode production il est préférable d'utiliser une base de données comme MySQL) :

![](https://telegra.ph/file/310cf2cdc33f3cc555679.jpg)

![](https://telegra.ph/file/fa0e97432d92c3e8de70f.jpg)

En vue de l'intégration dans AWS Amplify, je crée une intégration personnalisée dans la console d'administration de Ghost qui me génère une clé d'accès à l'API :

![](https://telegra.ph/file/d02baaca3338c32cb44a6.jpg)

Dans l'autre répertoire contenant Gatsby, j'utilise cette clé pour configurer le fichier .ghost.json :

```json
{
  "development": {
    "apiUrl": "http://localhost:2368",
    "contentApiKey": "db72b0686a3c61ec76acc09dc2"
},
  "production": {
    "apiUrl": "http://localhost:2368",
    "contentApiKey": "db72b0686a3c61ec76acc09dc2"
},
```

J'utilise le binaire Caddy2 pour exposer publiquement mon starter :

![](https://telegra.ph/file/aa286f479b58d7017acde.jpg)

via PM2 :

![](https://telegra.ph/file/58b77677a2e208c2f1f9c.png)

![](https://telegra.ph/file/033a0eeac72071c8149bf.png)

Via Let's Encrypt j'obtiens un certificat au lancement de Caddy2 et un endpoint via ce domaine Wildcard en HTTPS :

![](https://telegra.ph/file/0b88764b241317b150333.jpg)

Je reprend cet URL que j'injecte dans la partie production du fichier JSON .ghost.json au sein du répertoire de Gatsby 

```json
{
  "development": {
    "apiUrl": "http://localhost:2368",
    "contentApiKey": "db72b0686a3c61ec76acc09dc2"
},
  "production": {
    "apiUrl": "https://ghost.95-217-135-224.sslip.io",
    "contentApiKey": "db72b0686a3c61ec76acc09dc2"
},
```

puis je reconstruis et expose localement ce dernier :

![](https://telegra.ph/file/b5eb6024fce06e816a9e2.png)

![](https://telegra.ph/file/b0fcb197fb149ceb1371d.png)

![](https://telegra.ph/file/c0dec1043c9198c23b964.jpg)

Je peux alors lancer AWS Amplify en commencant d'abord par son installation en ligne de commande :

![](https://telegra.ph/file/782aae9be2f0fa8bfcc0f.jpg)

![](https://telegra.ph/file/23bdb3f602a700ea3ae2f.png)

suivi de l'initialisation :

![](https://telegra.ph/file/2ecd671c88ac155ec1629.png)

![](https://telegra.ph/file/09b7556abcbaee82d067a.jpg)

Je configure le mode d'hébergement qui se fera via un bucket S3 en accès public (on peut y rajouter le CDN avec AWS CloudFront) :

![](https://telegra.ph/file/2b727921be6ed250e1953.png)

suivi de la publication :

![](https://telegra.ph/file/42ed904481e329d7325fa.png)

![](https://telegra.ph/file/a30fa8289f420def60307.jpg)

qui me retourne l'URL d'accès :

![](https://telegra.ph/file/5719963c58c567c9a6a95.jpg)

![](https://telegra.ph/file/017ccaf4df7232aa2bd07.jpg)

![](https://telegra.ph/file/96df97d4878bb1fa90589.jpg)

accessible en HTTP :

![](https://telegra.ph/file/4a37afc6ceb14405bfd80.jpg)

Je peux procéder rapidement à la destruction de toute la stack générée par AWS Amplify :

![](https://telegra.ph/file/4183680b7bd162e7ab4b9.png)

Je peux également utiliser Surge.sh

<https://surge.sh/>

![](https://telegra.ph/file/3730677dce8a30169eae5.jpg)

![](https://telegra.ph/file/a7a957f2dff12ed9a58d3.png)

qui me retourne l'URL en HTTPS et via un sous domaine prédéfini :

![](https://telegra.ph/file/12f22dbed2fe5290d8167.jpg)

Idem, je peux procéder à la suppression du domaine facilement :

![](https://telegra.ph/file/ac243f37c56b65a75132b.png)

Pour terminer, j'utilise le sempiternal Cloudflare Argo qui permet d'initier un tunnel depuis mon instance dans Hetzner Cloud :

![](https://telegra.ph/file/36396705a99ae98618281.jpg)

![](https://telegra.ph/file/691a0d66111c20eef83ab.jpg)

J'utilise PM2 pour lancer un tunnel avec Cloudflare Argo :

```bash
cloudflared tunnel --url http://localhost:9000
```

![](https://telegra.ph/file/88b46b5b727cb5db41dfc.jpg)

![](https://telegra.ph/file/d95c781c1454197b83499.jpg)

Via l'URL fourni par Cloudflare, j'accède en HTTPS à mon frontend :

![](https://telegra.ph/file/5c635a35a06193a0875cc.jpg)

![](https://telegra.ph/file/9ea04fe2ce35ce89f8730.jpg)

et j'utilise l'extension Google Lighthouse dans mon navigateur pour tester ces endpoints :

![](https://telegra.ph/file/a84fdc6eee411cd0f104c.jpg)

![](https://telegra.ph/file/09c6b02b0d9781815519c.jpg)

![](https://telegra.ph/file/a117cbc62ab633c3b5eb7.jpg)

en mode responsive :

![](https://telegra.ph/file/08e68ae81a4ce487c99dc.jpg)

![](https://telegra.ph/file/587e4c6010a9a69f2df21.jpg)

À suivre ! ...

![](https://telegra.ph/file/aa0d5c8f7de1a4cf9bd15.png)