Présentation
Amber est un framework web écrit en Crystal.
Le but de cette page est d’expliquer comment déployer un site web crée à l’aide d’Amber en quelques étapes :
- création de la base de données
- configuration de la version production de notre application
- compilation d’Amber et de notre application
- déploiement des fichiers de l’application sur le serveur
- migration de la base de données initiale
- création d’un fichier systemd pour lancer notre site
- liaison avec Nginx
postgreSQL
Sur le serveur, configurer postgreSQL pour avoir un utilisateur et une base de données.
Prenez note de l’utilisateur, du mot de passe et de la base de données.
Par exemple :
nom de la base : amber_production
utilisateur : amber_user
mot de passe : mot2passe
Configurer notre application web
Une fois la base de données créée, il s’agit de configurer sur notre machine locale les éléments de connexion à celle-ci.
Il suffit de lancer la commande suivante :
amber encrypt production -e vim
Ça lance vim, sous lequel nous pouvons modifier les éléments de connexion :
database_url: postgres://amber_user:mot2passe@localhost:5432/amber_production
À compléter avec les éléments que vous détenez.
Compiler l’application
Sur la machine locale, on va dans le dossier de notre application (par exemple tuto_amber) et on compile notre application et Amber :
cd tuto_amber
crystal build lib/amber/src/amber/cli.cr -o bin/amber --stats
crystal build src/tuto_amber.cr -o bin/tuto_amber --release --stats
Il ne nous reste plus qu’à configurer notre machine distante et déployer l’application.
Déploiement des fichiers sur le serveur
Créez un dossier pour accueillir notre site web, par exemple /srv/www/monsite.
Placez-y les fichiers/dossiers suivants en respectant l’arbre de fichiers :
- bin/ : contient Amber et notre application
- config/environments/.production.enc : la configuration de notre application
- db/ : contient les fichiers de création/migration de la base de données
- public/ : contient les fichiers images, JS, CSS, etc.
- src/locales/ : contient les éventuelles traduction de notre site web
Déploiement de la base de données
On devrait désormais pouvoir générer le contenu de la base de données.
Pour cela, sur votre machine locale affichez le contenu du fichier suivant : .encryption_key.
Par exemple chez moi j’obtiens : oliBK0J9-HrSK1K8VPTtsMERyj2as1mUZqvPqfKGGeQ.
Ensuite, sur le serveur faites :
AMBER_ENV=production AMBER_ENCRYPTION_KEY="oliBK0J9-HrSK1K8VPTtsMERyj2as1mUZqvPqfKGGeQ" ./bin/amber db migrate
Cela ne devrait prendre que quelques instants.
Configuration du serveur
La machine distante va donc lancer notre application et la fournir sur le web.
Nous allons donc :
- créer un service systemd
- configurer notre serveur web (ici Nginx)
Configuration de systemd
Sur le serveur on installe l’application quelque part, par exemple dans /srv/www/monsite.
Puis on crée un fichier /etc/systemd/system/amberframework.service avec :
[Unit]
Description=Lance le framework web Amber pour le site monsite.tld
After=network.target
[Service]
Type=simple
User=http
WorkingDirectory=/srv/www/monsite
Environment="AMBER_ENV=production"
Environment="PORT=3002"
Environment="AMBER_ENCRYPTION_KEY=oliBK0J9-HrSK1K8VPTtsMERyj2as1mUZqvPqfKGGeQ"
ExecStart=/home/www/monsite/bin/tutamber
Restart=always
[Install]
WantedBy=multi-user.target
On remplace surtout les éléments suivants :
- WorkingDirectory
- PORT=
- AMBER_ENCRYPTION_KEY=
- ExecStart
suivant le dossier où se trouve notre site, notre clé de déchiffrement et le port sur lequel on veut lancer notre application.
Il suffit ensuite de lancer notre service :
sudo systemctl start amberframework.service
Vous pouvez voir le résultat ainsi (faire Ctrl + C pour arrêter le défilement) :
journalctl -xe -f -u amberframework.service
Configurer Nginx
Étant donné que le service fonctionne sur un port spécifique, nous allons le desservir sur un domaine particulier avec Nginx, en utilisant la fonctionnalité de proxy.
Ouvrez le fichier de configuration de votre Nginx, par exemple /etc/nginx/sites-enabled/default et rajouter l’entrée suivante :
server {
listen *:80;
listen [::]:80;
server_name monsite.domaine.tld;
root /srv/www/monsite;
index index.html;
proxy_set_header X-Real-IP $remote_addr;
location / {
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:3002;
}
}
Il suffit ensuite de relancer votre serveur web :
sudo systemctl restart nginx