documentator 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/documentator.rb +12 -8
- data/lib/documentator/bootstrap/{Archi.ditaa → Architecture.ditaa} +0 -0
- data/lib/documentator/bootstrap/{Archi.md → Architecture.md} +0 -0
- data/lib/documentator/templates/elasticsearch.md +239 -0
- data/lib/documentator/templates/mongodb.md +74 -0
- data/lib/documentator/templates/neo4j.md +35 -0
- data/lib/documentator/version.rb +2 -1
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 904490606b2d529b0be6d6eae6dab86bc616135b
|
4
|
+
data.tar.gz: eb839473523c14b243ac521f109dcae44da0a2cf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f37a2c94807676a41a8bba2af9961803ee116389f35cf522b3e7c8ec5934a43df62d111994160926e7e6938be2f44da0b530e82e42d5f70860703f6389711c91
|
7
|
+
data.tar.gz: 9a39379069e0ea1dc7de17bb58b8c31021b94ab37bb84c42b281409e0678dbe982821236c6b821bf93271bdce8025d6824ec777be13dc36eb9c3f511a117e05b
|
data/lib/documentator.rb
CHANGED
@@ -16,15 +16,19 @@ module Documentator
|
|
16
16
|
end
|
17
17
|
|
18
18
|
desc "import a template to doc directory"
|
19
|
-
def import(
|
20
|
-
|
21
|
-
|
22
|
-
|
19
|
+
def import(*templates)
|
20
|
+
templates.each do |template|
|
21
|
+
begin
|
22
|
+
unless File.exists?(doc_path)
|
23
|
+
puts "You should run `bootstrap` before trying to import documentation"
|
24
|
+
exit 1
|
25
|
+
end
|
26
|
+
cp(templates_path.join("#{template}.md"), doc_path)
|
27
|
+
puts "✓ File #{template} copied."
|
28
|
+
rescue Errno::ENOENT
|
29
|
+
puts "x File #{template} not found."
|
30
|
+
end
|
23
31
|
end
|
24
|
-
cp(templates_path.join("#{template}.md"), doc_path)
|
25
|
-
puts "✓ File #{template} copied."
|
26
|
-
rescue Errno::ENOENT
|
27
|
-
puts "x File #{template} not found."
|
28
32
|
end
|
29
33
|
|
30
34
|
desc "List all templates"
|
File without changes
|
File without changes
|
@@ -0,0 +1,239 @@
|
|
1
|
+
# Elasticsearch
|
2
|
+
|
3
|
+
|
4
|
+
[Elasticsearch](http://www.elasticsearch.org/) est un moteur de recherche
|
5
|
+
distribué basé sur Lucene qui offre une API JSON RESTful et une quantité assez
|
6
|
+
impressionnante d'options de recherches. Il est très simple à mettre en place
|
7
|
+
et s'est imposé chez nous comme la solution de référence dès que nous avons une
|
8
|
+
recherche un peu évoluée à mettre en place.
|
9
|
+
|
10
|
+
## Installation
|
11
|
+
|
12
|
+
|
13
|
+
### Pour une installation en local
|
14
|
+
|
15
|
+
Le plus simple pour une installation en local est d'utiliser [Desi](https://github.com/AF83/desi) :
|
16
|
+
|
17
|
+
```shell
|
18
|
+
gem install desi && desi install
|
19
|
+
```
|
20
|
+
|
21
|
+
Par défaut, Desi installera ES dans le répertoire `$HOME/elasticsearch`, mais
|
22
|
+
on peut facilement [changer ce paramètre](https://github.com/AF83/desi#change-settings).
|
23
|
+
|
24
|
+
Une fois ES installé par Desi, on peut très simplement à la fois le lancer et
|
25
|
+
afficher les logs en faisant `desi start --tail`. Pour arrêter le démon, faire
|
26
|
+
`desi stop`, tout simplement. Pour les autres options proposées par Desi,
|
27
|
+
référez-vous à [la page du projet](https://github.com/AF83/desi).
|
28
|
+
|
29
|
+
Par défaut, Elasticsearch tournera sur le port 9200 de _localhost_.
|
30
|
+
|
31
|
+
### Installation sur un serveur
|
32
|
+
|
33
|
+
Le plus simple est de récupérer l'archive deb
|
34
|
+
[directement depuis la page _download_ du projet](http://www.elasticsearch.org/download/).
|
35
|
+
|
36
|
+
L'installation est là aussi très simple. On peut se référer à [la page
|
37
|
+
correspondante sur le site du projet](http://www.elasticsearch.org/guide/reference/setup/installation.html)
|
38
|
+
pour plus de détails.
|
39
|
+
|
40
|
+
### Gotcha
|
41
|
+
|
42
|
+
Bien que des optimisations aient été apportées pour diminuer sa gourmandise en
|
43
|
+
la matière, ES fait une consommation importante de descripteurs de fichiers.
|
44
|
+
Les réglages par défaut du nombre maximum de descripteurs de fichiers autorisés
|
45
|
+
par utilisateur sur un système Linux sont généralement rapidement atteints,
|
46
|
+
avec comme conséquence le message d'erreur `Too many open files`.
|
47
|
+
|
48
|
+
Pour prévenir ce problème, il convient donc d'augmenter cette limite pour
|
49
|
+
l'utilisateur qui lancera le démon Elasticsearch. La documentation du projet
|
50
|
+
recommande de le hausser à 32 000, voir 64 000. Sur un système Linux, il
|
51
|
+
faudra modifier le fichier `/etc/security/limits.conf`. Cela donne par exemple
|
52
|
+
chez moi :
|
53
|
+
|
54
|
+
```
|
55
|
+
drr soft nofile 8192
|
56
|
+
drr hard nofile 65536
|
57
|
+
```
|
58
|
+
|
59
|
+
## Plugins
|
60
|
+
|
61
|
+
Il existe [un grand nombre de plugins](http://www.elasticsearch.org/guide/reference/modules/plugins.html)
|
62
|
+
parmi lesquels quelques-uns peuvent être utiles pour l'administration au
|
63
|
+
quotidien :
|
64
|
+
|
65
|
+
* [elasticsearch-head](https://github.com/mobz/elasticsearch-head)
|
66
|
+
* [elasticsearch-inquisitor](https://github.com/polyfractal/elasticsearch-inquisitor)
|
67
|
+
* [bigdesk](https://github.com/lukas-vlcek/bigdesk)
|
68
|
+
* [paramedic](https://github.com/karmi/elasticsearch-paramedic)
|
69
|
+
|
70
|
+
Pour installer un plugin, il faut aller dans le répertoire où est installé ES
|
71
|
+
et lancer la commande `bin/plugin install github_user/github_repo`. Par
|
72
|
+
exemple, pour installer les plugins mentionnés ci-dessus avec une installation
|
73
|
+
typique faite par Desi, on peut faire :
|
74
|
+
|
75
|
+
```shell
|
76
|
+
$ cd ~/elasticsearch/current
|
77
|
+
$ bin/plugin install mobz/elasticsearch-head
|
78
|
+
$ bin/plugin install polyfractal/elasticsearch-inquisitor
|
79
|
+
$ bin/plugin install lukas-vlcek/bigdesk
|
80
|
+
$ bin/plugin install karmi/elasticsearch-paramedic
|
81
|
+
```
|
82
|
+
|
83
|
+
Ces plugins seront accessibles sur les URLs suivantes :
|
84
|
+
|
85
|
+
* http://localhost:9200/_plugin/head/
|
86
|
+
* http://localhost:9200/_plugin/inquisitor/
|
87
|
+
* http://localhost:9200/_plugin/bigdesk/
|
88
|
+
* http://localhost:9200/_plugin/paramedic/
|
89
|
+
|
90
|
+
|
91
|
+
|
92
|
+
## Bonnes pratiques
|
93
|
+
|
94
|
+
|
95
|
+
### Se méfier des erreurs de mapping
|
96
|
+
|
97
|
+
Les erreurs de
|
98
|
+
[mapping](http://www.elasticsearch.org/guide/reference/mapping/index.html) sont
|
99
|
+
particulièrement pernicieuses et constituent d'expérience la plus grosse source
|
100
|
+
de fragilité. Il s'agit d'ailleurs en premier lieu de problèmes posés par
|
101
|
+
Lucene et non par ES proprement dit.
|
102
|
+
|
103
|
+
Elles se manifestent par l'impossibilité d'indexer un document dont la
|
104
|
+
structure ne correspond pas à celle attendue par l'index où on veut le stocker.
|
105
|
+
Cela peut avoir des conséquences particulièrement gênantes en production car
|
106
|
+
la suppression/recréation de l'index suivie d'une réindexation sera fréquemment
|
107
|
+
la seule solution.
|
108
|
+
|
109
|
+
Pour s'en prémunir, il convient donc en premier lieu :
|
110
|
+
|
111
|
+
1. de ne pas se fier uniquement au [mapping
|
112
|
+
dynamique](http://www.elasticsearch.org/guide/reference/mapping/dynamic-mapping.html)
|
113
|
+
d'Elasticsearch mais d'indiquer explicitement à ES les champs à indexer
|
114
|
+
|
115
|
+
2. d'indexer le moins de champs possibles.
|
116
|
+
|
117
|
+
On n'est en effet pas obligé d'*indexer* un champ pour le stocker dans
|
118
|
+
Elasticsearch. On peut tout à fait le stocker dans la
|
119
|
+
[source](http://www.elasticsearch.org/guide/reference/mapping/source-field.html)
|
120
|
+
du document sans qu'il soit pris en compte dans la requête. Elasticsearch
|
121
|
+
— et plus précisément Lucene — le stockera sans chercher à procéder à quelque
|
122
|
+
analyse que ce soit et pourra le restituer tel qu'il lui a été fourni.
|
123
|
+
|
124
|
+
Le mieux est donc d'utiliser les [dynamic\_templates](http://www.elasticsearch.org/guide/reference/mapping/root-object-type.html) pour passer par défaut tous les champs en `"index": "no"`, pour
|
125
|
+
ensuite indexer explicitement les champs désirés au cas par cas.
|
126
|
+
|
127
|
+
Outre la fiabilité accrue, cela réduira également la taille des indexes
|
128
|
+
Lucene et donc la charge du système.
|
129
|
+
|
130
|
+
|
131
|
+
Au delà de cette première mesure, il faut également bien sûr mentionner deux
|
132
|
+
conseils de bon sens :
|
133
|
+
|
134
|
+
* Tâcher autant que faire se peut de déterminer le plus précisément
|
135
|
+
possible la structure du document et de s'y tenir
|
136
|
+
* Ne pas changer en cours de route la nature d'un champ en conservant son
|
137
|
+
nom à l'identique. On peut changer la cardinalité d'un élement sans
|
138
|
+
changer le mapping, mais son type doit demeurer identique.
|
139
|
+
|
140
|
+
|
141
|
+
### Ne pas nommer à l'identique deux champs de natures différentes stockés dans un même index ES
|
142
|
+
|
143
|
+
On peut stocker dans un même [index](http://www.elasticsearch.org/guide/reference/glossary/#index)
|
144
|
+
Elasticsearch plusieurs [types](http://www.elasticsearch.org/guide/reference/glossary/#type)
|
145
|
+
de documents. Il faut cependant garder à l'esprit que tous les documents d'un
|
146
|
+
index ES, quel que soit leur type, seront stockés dans le même index Lucene.
|
147
|
+
Une des conséquences est qu'on ne peut avoir en parallèle de champs dont le
|
148
|
+
nom soit identique d'un type à l'autre mais dont la nature soit différente.
|
149
|
+
|
150
|
+
|
151
|
+
### Utiliser les multi-fields pour préparer ses recherches
|
152
|
+
|
153
|
+
Les [multi fields](http://www.elasticsearch.org/guide/reference/mapping/multi-field-type.html)
|
154
|
+
permettent de spécifier à ES qu'on veut qu'un même champ soit indexé de
|
155
|
+
plusieurs façons à la fois. On pourra dès lors faire des requêtes dessus en
|
156
|
+
utilisant la syntaxe `nom_du_champ.nom_du_sous_champ`. On peut donc avoir
|
157
|
+
plusieurs sous-champs optimisés chacun pour des cas précis : recherche
|
158
|
+
_full-text_ normale, tri ou facette, auto-complétion, etc.
|
159
|
+
|
160
|
+
|
161
|
+
### Utiliser un champ non "tokenisé" pour effectuer des tris ou des facettes
|
162
|
+
|
163
|
+
Afin d'effectuer une recherche _full-text_ sur un champ de type chaîne de
|
164
|
+
caractères, il est nécessaire de lui appliquer tout un certain nombre
|
165
|
+
d'opérations (typiquement : segmentation en mots, suppression des caractères diacritiques, des
|
166
|
+
accents, lemmatisation, etc.) Cependant, ces opérations empêcheront d'effectuer
|
167
|
+
certaines opérations qui n'ont de sens qu'appliquées sur le contenu exact du
|
168
|
+
champ d'origine, notamment :
|
169
|
+
|
170
|
+
* le tri (cela n'a pas de sens de faire un tri sur un champ texte segmenté en
|
171
|
+
plusieurs mots différents)
|
172
|
+
* les facettes
|
173
|
+
|
174
|
+
Pour ces deux cas, il conviendra donc donc soit de définir le _mapping_ du champ
|
175
|
+
comme `not_analyzed`, soit d'utiliser le _mapping_ `keyword`. Dans le deux cas,
|
176
|
+
il sera indexé tel quel sans segmentation ou modification d'aucune sorte.
|
177
|
+
|
178
|
+
Comme indiqué ci-dessus, on peut bien sûr utiliser un *multi-field* si on veut
|
179
|
+
indexer le même champ de plusieurs façons à la fois.
|
180
|
+
|
181
|
+
### Utiliser l'endpoint `analyze` pour vérifier la façon dont un texte est segmenté
|
182
|
+
|
183
|
+
Pour plus de détails, se référer [à la documentation](http://www.elasticsearch.org/guide/reference/api/admin-indices-analyze.html)
|
184
|
+
|
185
|
+
### Se méfier des limitations de Tire
|
186
|
+
|
187
|
+
[Tire](https://github.com/karmi/tire) est sans conteste la gem Ruby destinée
|
188
|
+
à faciliter l'utilisation d'Elasticsearch la plus évoluée. Son développeur
|
189
|
+
principal, karmi, a d'ailleurs rejoint récemment l'équipe
|
190
|
+
d'[Elasticsearch.com](http://www.elasticsearch.com/), la société qui est
|
191
|
+
derrière le projet. Elle est cependant loin d'être exempte de défauts. Elle
|
192
|
+
rend les choses simples triviales mais les cas de figure plus complexes peuvent
|
193
|
+
devenir rapidement compliqués à mettre en place.
|
194
|
+
|
195
|
+
Ses principales limitations :
|
196
|
+
|
197
|
+
* Son DSL de recherche entraîne assez rapidement des confusions entre sa
|
198
|
+
syntaxe propre et celle — foisonnante — d'Elasticsearch.
|
199
|
+
|
200
|
+
* Il est dans l'ensemble très orienté vers un pattern de type Active Record,
|
201
|
+
avec une classe de persistence couplée dans une relation 1-1 avec un index
|
202
|
+
ES. On peut cependant avoir facilement des besoins qui vont au-delà de ce
|
203
|
+
cas de figure
|
204
|
+
|
205
|
+
* une documentation mine de rien lacunaire quand on commence à vouloir avoir
|
206
|
+
des besoins un peu précis.
|
207
|
+
|
208
|
+
La gem [stretcher](https://github.com/PoseBiz/stretcher) est née récemment en
|
209
|
+
réaction à nombre de ces points. C'est une alternative récente à étudier.
|
210
|
+
|
211
|
+
Sinon, il peut être tout aussi intéressant de se faire soi-même un client
|
212
|
+
Elasticsearch. (Pour de meilleurs performances, ne pas oublier d'utiliser une
|
213
|
+
connexion HTTP persistante.)
|
214
|
+
|
215
|
+
## Outils
|
216
|
+
|
217
|
+
|
218
|
+
### Librairies
|
219
|
+
|
220
|
+
* Ruby: [desi](https://github.com/AF83/desi), [tire](https://github.com/karmi/tire),
|
221
|
+
[stretcher](https://github.com/PoseBiz/stretcher)
|
222
|
+
|
223
|
+
* Javascript : [elastic.js](https://github.com/fullscale/elastic.js)
|
224
|
+
|
225
|
+
|
226
|
+
### Outils en ligne de commande
|
227
|
+
|
228
|
+
* [desi](https://github.com/AF83/desi)
|
229
|
+
* [elasticshell](https://github.com/javanna/elasticshell)
|
230
|
+
|
231
|
+
|
232
|
+
### Plugins Elasticsearch
|
233
|
+
|
234
|
+
* [elasticsearch-head](https://github.com/mobz/elasticsearch-head)
|
235
|
+
* [elasticsearch-inquisitor](https://github.com/polyfractal/elasticsearch-inquisitor)
|
236
|
+
* [bigdesk](https://github.com/lukas-vlcek/bigdesk)
|
237
|
+
* [paramedic](https://github.com/karmi/elasticsearch-paramedic)
|
238
|
+
|
239
|
+
(Voir plus haut pour plus de détails.)
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# MongoDB
|
2
|
+
|
3
|
+
[MongoDB (from "humongous") is a scalable, high-performance, open source NoSQL database.](http://www.mongodb.org/)
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
### Debian
|
8
|
+
|
9
|
+
En tant que root:
|
10
|
+
|
11
|
+
```
|
12
|
+
aptitude install mongodb
|
13
|
+
```
|
14
|
+
|
15
|
+
Pour une version plus récente, on peut également utiliser [le dépôt de
|
16
|
+
10gen](http://docs.mongodb.org/manual/tutorial/install-mongodb-on-debian/).
|
17
|
+
|
18
|
+
### Mac OS X
|
19
|
+
|
20
|
+
```
|
21
|
+
brew install mongodb
|
22
|
+
```
|
23
|
+
|
24
|
+
## Configuration
|
25
|
+
|
26
|
+
Par défaut `mongod` active la journalisation à partir de la v2.0.
|
27
|
+
Cela prend beaucoup d'espace disque et est inutile dans un environnement
|
28
|
+
de développement. Pour la désactiver, ajouter `nojournal = true`
|
29
|
+
dans `/etc/mongod.conf` ou l'option ` --nojournal` en ligne de commande.
|
30
|
+
|
31
|
+
```
|
32
|
+
# Disables write-ahead journaling
|
33
|
+
nojournal = true
|
34
|
+
```
|
35
|
+
|
36
|
+
## Utilisation
|
37
|
+
|
38
|
+
### Shell mongo
|
39
|
+
|
40
|
+
Se connecter à la base `myproject_dev` :
|
41
|
+
|
42
|
+
```
|
43
|
+
mongo --port 27017 --host localhost myproject_dev
|
44
|
+
```
|
45
|
+
|
46
|
+
### Commandes shell
|
47
|
+
|
48
|
+
Quelques exemples sur la collection `foo` :
|
49
|
+
|
50
|
+
|
51
|
+
db.help() Toutes les méthodes de mongodb
|
52
|
+
db.foo.help() Toutes les méthodes de la collection
|
53
|
+
db.foo.find().help() Toutes les méthodes de la méthode find()
|
54
|
+
db.foo.find() Liste des documents de la collection
|
55
|
+
db.foo.save({a: 1}) Enregistre un document dans la collection
|
56
|
+
db.foo.update({a: 1}, { $set:{a: 2} }) Update un document quand a == 1
|
57
|
+
db.foo.find({a: 1}) Liste des documents de la collection quand a == 1
|
58
|
+
|
59
|
+
### Exporter une base
|
60
|
+
|
61
|
+
Exporter ma base de donnée `myproject_dev`.
|
62
|
+
|
63
|
+
```
|
64
|
+
mongodump --db myproject_dev
|
65
|
+
```
|
66
|
+
|
67
|
+
### Restorer une base
|
68
|
+
|
69
|
+
Restorer ma base de donnée `myproject_dev` dans la base `myproject_staging`.
|
70
|
+
|
71
|
+
```
|
72
|
+
mongorestore --db myproject_staging dump/myproject_dev/
|
73
|
+
```
|
74
|
+
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# Neo4j
|
2
|
+
|
3
|
+
[The Market Leader Property Graph Database](http://www.neo4j.org/)
|
4
|
+
|
5
|
+
Une base de données graphe est un système de stockage supportant
|
6
|
+
la persistance des données sous forme de graphe (noeuds, relations) nativement.
|
7
|
+
|
8
|
+
## Installation
|
9
|
+
|
10
|
+
Version recommandé stable en édition 'community': 1.8.2
|
11
|
+
|
12
|
+
* Debian
|
13
|
+
|
14
|
+
``` shell
|
15
|
+
# start root shell
|
16
|
+
sudo -s
|
17
|
+
# Import our signing key
|
18
|
+
wget -O - http://debian.neo4j.org/neotechnology.gpg.key | apt-key add -
|
19
|
+
# Create an Apt sources.list file
|
20
|
+
echo 'deb http://debian.neo4j.org/repo stable/' > /etc/apt/sources.list.d/neo4j.list
|
21
|
+
# Find out about the files in our repository
|
22
|
+
apt-get update
|
23
|
+
# Install Neo4j, community edition
|
24
|
+
apt-get install neo4j
|
25
|
+
# start neo4j server, available at http://localhost:7474 of the target machine
|
26
|
+
neo4j start
|
27
|
+
```
|
28
|
+
|
29
|
+
* OSX
|
30
|
+
via Homebrew
|
31
|
+
``` shell
|
32
|
+
brew update && brew install neo4j
|
33
|
+
neo4j start
|
34
|
+
```
|
35
|
+
|
data/lib/documentator/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: documentator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- chatgris
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-03-
|
11
|
+
date: 2013-03-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: boson
|
@@ -38,15 +38,18 @@ files:
|
|
38
38
|
- README.md
|
39
39
|
- bin/documentator
|
40
40
|
- lib/documentator.rb
|
41
|
-
- lib/documentator/bootstrap/
|
42
|
-
- lib/documentator/bootstrap/
|
41
|
+
- lib/documentator/bootstrap/Architecture.ditaa
|
42
|
+
- lib/documentator/bootstrap/Architecture.md
|
43
43
|
- lib/documentator/bootstrap/Dependencies.md
|
44
44
|
- lib/documentator/bootstrap/Deploy.md
|
45
45
|
- lib/documentator/bootstrap/Environments.md
|
46
46
|
- lib/documentator/bootstrap/Gemfile
|
47
47
|
- lib/documentator/templates/beanstalkd.md
|
48
48
|
- lib/documentator/templates/capistrano.md
|
49
|
+
- lib/documentator/templates/elasticsearch.md
|
49
50
|
- lib/documentator/templates/grunt.md
|
51
|
+
- lib/documentator/templates/mongodb.md
|
52
|
+
- lib/documentator/templates/neo4j.md
|
50
53
|
- lib/documentator/templates/nginx.md
|
51
54
|
- lib/documentator/templates/ruby.md
|
52
55
|
- lib/documentator/version.rb
|