Go Web Server boilerplate
Sommaire
Installation
- Installer la dernière de Go (Download page)
- Copier le fichier
config.toml.dist
vers config.toml
et renseigner les bonnes valeurs
Liste des commandes
Dévelopement
Commande |
Description |
make serve |
Launch Web server |
make logsRotation |
Launch logs rotation |
make logsExport |
Launch logs CSV export |
make dbInit |
Launch database initilization |
make dbDump |
Launch database dump |
make make-migration |
Create migration |
make migrate |
Make migrations |
make ws |
Launch WebSockets server |
Production
Compiler le fichier binaire <binaire>
avec make build
et renseigner des bonnes valeurs de le fichier de
configuration config.toml
.
Commande |
Description |
./<binaire> serve |
Launch Web server |
./<binaire> logs-rotation |
Launch logs rotation |
./<binaire> logs-export |
Launch logs CSV export |
./<binaire> db --init |
Launch database initilization |
./<binaire> db --dump |
Launch database dump |
./<binaire> make-migration -n <Name in CamelCase> |
Create migration |
./<binaire> migrate |
Make migrations |
./<binaire> websocket |
Launch WebSockets server |
Architecture du projet
\_ assets
\_ js
\_ commands
\_ database
\_ handlers
\_ api
\_ web
\_ lib
\_ logs
\_ migrations
\_ models
\_ repositories
\_ user
\_ routes
\_ user
\_ echo
\_ web
\_ templates
\_ example
\_ layout
\_ websockets
- Le dossier
assets
contient les fichiers multimédia (images, vidéos, etc.), JavaScript ou encore CSS.
- Le dossier
commands
contient toutes les commandes que l'on peut lancer depuis un terminal.
- Le dossier
database
contient tous les fichiers relatifs à l'utilisation de MySQL ainsi que l'initialisation
et le dump de la base. Il contient également l'initalisation de l'ORM.
- Le dossier
handlers
contient tous les handlers du serveur Web. Ils sont divisés par type.
Par exemple, on a un dossier api
pour gérer les API et un dossier web
pour gérer un "site".
- Le dossier
lib
contient des fonctions globales à l'application.
- Le dossier
logs
contient les logs du serveur Web.
- Le dossier
migrations
contient les fichiers de migrations.
- Le dossier
models
contient les modèles (base de données).
- Le dossier
repositories
contient les repositories.
Ces fichiers permettent d'écrire les requêtes s'appliquant à un modèle.
Les fichiers dépendant du type de base de données, ils sont suffixés par le type de base de données,
par exemple, _mysql
.
- Le dossier
routes
contient les fichiers relatifs au routing. Ils sont divisés par type.
Par exemple, on a un dossier api
pour gérer les API et un dossier web
pour gérer un "site".
- Le dossier
templates
contient les templates des différentes page Web.
- Le dossier
websockets
contient les fichiers relatifs au serveur de WebSockets.
Golang web server in production
Creating a Service for Systemd
touch /lib/systemd/system/<service name>.service
Edit file:
[Unit]
Description=<service description>
After=network.target
[Service]
Type=simple
Restart=always
RestartSec=5s
ExecStart=<path to exec with arguments>
[Install]
WantedBy=multi-user.target
Commande |
Description |
service <service name> start |
To launch |
service <service name> enable |
To enable on boot |
service <service name> disable |
To disable on boot |
service <service name> status |
To show status |
service <service name> stop |
To stop |
Deploiement avec Docker
Liens
Commandes
Commande |
Description |
docker image ls |
Lister les images |
docker image remove <image_id> ou docker rmi <image_id> |
Supprimer une image |
docker container ls |
Lister les conteneurs |
docker container stop <container_id> |
Stopper un conteneur |
docker rm <container_id> |
Supprimer un conteneur |
docker build -t <image_name> -f <dockerfile_name> . |
Build de l'image |
docker run -d -p <port_local>:<port_container> <image_name> |
Lancement de l'image |
TODO
- Pouvoir modifier dynamique le port et le nom du binaire dans le dockerfile
Serveur Web
Le serveur peut contenir plusieurs sous-domaines. Leur configuration se fait dans le fichier config.toml
via la partie
[server]
. Le serveur possède 3 sous-domaines par défaut :
apiSubDomain
: sous-domaine relatif aux API
clientSubDomain
: sous-domaine pour lancer, par exemple, une application JavaScript Vue.js
webSubDomain
: sous-domaine pour créer une application côté serveur. Il contient également les routes de debug pour
pprof
ou trace
.
Go met à disposition de puissants outils pour mesurer les performances des programmes :
- pprof (graph, flamegraph, peek)
- trace
- cover
=> Lien vers une vidéo intéressante Mesure et optimisation de la performance en Go
pprof
Lancer :
curl http://localhost:8888/debug/pprof/heap?seconds=10 > <fichier à analyser>
Puis :
go tool pprof -http :7000 <fichier à analyser> # Interface web
go tool pprof --nodefraction=0 -http :7000 <fichier à analyser> # Interface web avec tous les noeuds
go tool pprof <fichier à analyser> # Ligne de commande
trace
Lancer :
go test <package path> -trace=<fichier à analyser>
curl localhost:<port>/debug/pprof/trace?seconds=10 > <fichier à analyser>
Puis :
go tool trace <fichier à analyser>
cover
Lancer :
go test <package path> -covermode=count -coverprofile=./<fichier à analyser>
Puis :
go tool cover -html=<fichier à analyser>
TODO list
- Passer aux modules introduits avec Go 1.11 :
- Mettre en place un système de migration avec GORM
- Utiliser Viper pour gérer la config
- Séparer les logs d'accès des autres logs
- Ajouter une Basic Auth pour pprof
- SQL logs
- Afficher la requête sans retour à la ligne
- Gérer la variable
limit
dans fichier de configuration
- Gérer la rotation des logs
- [] Logger GORM dans un fichier de log GORM logger
- Mettre les logs SQL dans un fichier à part
- Exporter les logs en CSV
- Faire une interface graphique pour afficher et filter les logs
- Gestion des timezones
- Interface pour les datetimes
Astuces et explications
Architecture