documentator 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|