docker-entrypoint.sh 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. #!/bin/bash
  2. if [[ "${SKIP_SOLR}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
  3. echo "SKIP_SOLR=y, skipping Solr..."
  4. sleep 365d
  5. exit 0
  6. fi
  7. MEM_TOTAL=$(awk '/MemTotal/ {print $2}' /proc/meminfo)
  8. if [[ "${1}" != "--bootstrap" ]]; then
  9. if [ ${MEM_TOTAL} -lt "2097152" ]; then
  10. echo "System memory less than 2 GB, skipping Solr..."
  11. sleep 365d
  12. exit 0
  13. fi
  14. fi
  15. set -e
  16. # allow easier debugging with `docker run -e VERBOSE=yes`
  17. if [[ "$VERBOSE" = "yes" ]]; then
  18. set -x
  19. fi
  20. # run the optional initdb
  21. . /opt/docker-solr/scripts/run-initdb
  22. function solr_config() {
  23. curl -XPOST http://localhost:8983/solr/dovecot/schema -H 'Content-type:application/json' -d '{
  24. "add-field-type":{
  25. "name":"long",
  26. "class":"solr.TrieLongField"
  27. },
  28. "add-field-type":{
  29. "name":"dovecot_text",
  30. "class":"solr.TextField",
  31. "autoGeneratePhraseQueries":true,
  32. "positionIncrementGap":100,
  33. "indexAnalyser":{
  34. "charFilter":{
  35. "class":"solr.MappingCharFilterFactory",
  36. "mapping":"mapping-FoldToASCII.txt"
  37. },
  38. "charFilter":{
  39. "class":"solr.MappingCharFilterFactory",
  40. "mapping":"mapping-ISOLatin1Accent.txt"
  41. },
  42. "charFilter":{
  43. "class":"solr.HTMLStripCharFilterFactory"
  44. },
  45. "tokenizer":{
  46. "class":"solr.StandardTokenizerFactory"
  47. },
  48. "filter":{
  49. "class":"solr.StopFilterFactory",
  50. "words":"stopwords.txt",
  51. "ignoreCase":true
  52. },
  53. "filter":{
  54. "class":"solr.WordDelimiterGraphFilterFactory",
  55. "generateWordParts":1,
  56. "generateNumberParts":1,
  57. "splitOnCaseChange":1,
  58. "splitOnNumerics":1,
  59. "catenateWords":1,
  60. "catenateNumbers":1,
  61. "catenateAll":1
  62. },
  63. "filter":{
  64. "class":"solr.FlattenGraphFilterFactory"
  65. },
  66. "filter":{
  67. "class":"solr.LowerCaseFilterFactory"
  68. },
  69. "filter":{
  70. "class":"solr.KeywordMarkerFilterFactory",
  71. "protected":"protwords.txt"
  72. },
  73. "filter":{
  74. "class":"solr.PorterStemFilterFactory"
  75. }
  76. },
  77. "queryAnalyzer":{
  78. "tokenizer":{
  79. "class":"solr.StandardTokenizerFactory"
  80. },
  81. "filter":{
  82. "class":"solr.SynonymGraphFilterFactory",
  83. "expand":true,
  84. "ignoreCase":true,
  85. "synonyms":synonyms.txt
  86. },
  87. "filter":{
  88. "class":"solr.FlattenGraphFilterFactory"
  89. },
  90. "filter":{
  91. "class":"solr.StopFilterFactory",
  92. "words":"stopwords.txt",
  93. "ignoreCase":true
  94. },
  95. "filter":{
  96. "class":"solr.WordDelimiterGraphFilterFactory",
  97. "generateWordParts":1,
  98. "generateNumberParts":1,
  99. "splitOnCaseChange":1,
  100. "splitOnNumerics":1,
  101. "catenateWords":1,
  102. "catenateNumbers":1,
  103. "catenateAll":1
  104. },
  105. "filter":{
  106. "class":"solr.LowerCaseFilterFactory"
  107. },
  108. "filter":{
  109. "class":"solr.KeywordMarkerFilterFactory",
  110. "protected":"protwords.txt"
  111. },
  112. "filter":{
  113. "class":"solr.PorterStemFilterFactory"
  114. }
  115. }
  116. },
  117. "add-field":{
  118. "name":"uid",
  119. "type":"long",
  120. "indexed":true,
  121. "stored":true,
  122. "required":true
  123. },
  124. "add-field":{
  125. "name":"box",
  126. "type":"string",
  127. "indexed":true,
  128. "stored":true,
  129. "required":true
  130. },
  131. "add-field":{
  132. "name":"user",
  133. "type":"string",
  134. "indexed":true,
  135. "stored":true,
  136. "required":true
  137. },
  138. "add-field":{
  139. "name":"hdr",
  140. "type":"dovecot_text",
  141. "indexed":true,
  142. "stored":false
  143. },
  144. "add-field":{
  145. "name":"body",
  146. "type":"dovecot_text",
  147. "indexed":true,
  148. "stored":false
  149. },
  150. "add-field":{
  151. "name":"from",
  152. "type":"dovecot_text",
  153. "indexed":true,
  154. "stored":false
  155. },
  156. "add-field":{
  157. "name":"to",
  158. "type":"dovecot_text",
  159. "indexed":true,
  160. "stored":false
  161. },
  162. "add-field":{
  163. "name":"cc",
  164. "type":"dovecot_text",
  165. "indexed":true,
  166. "stored":false
  167. },
  168. "add-field":{
  169. "name":"bcc",
  170. "type":"dovecot_text",
  171. "indexed":true,
  172. "stored":false
  173. },
  174. "add-field":{
  175. "name":"subject",
  176. "type":"dovecot_text",
  177. "indexed":true,
  178. "stored":false
  179. }
  180. }'
  181. curl -XPOST http://localhost:8983/solr/dovecot/schema -H 'Content-type:application/json' -d '{
  182. "replace-field-type":{
  183. "name":"long",
  184. "class":"solr.TrieLongField"
  185. },
  186. "replace-field-type":{
  187. "name":"dovecot_text",
  188. "class":"solr.TextField",
  189. "autoGeneratePhraseQueries":true,
  190. "positionIncrementGap":100,
  191. "indexAnalyser":{
  192. "charFilter":{
  193. "class":"solr.MappingCharFilterFactory",
  194. "mapping":"mapping-FoldToASCII.txt"
  195. },
  196. "charFilter":{
  197. "class":"solr.MappingCharFilterFactory",
  198. "mapping":"mapping-ISOLatin1Accent.txt"
  199. },
  200. "charFilter":{
  201. "class":"solr.HTMLStripCharFilterFactory"
  202. },
  203. "tokenizer":{
  204. "class":"solr.StandardTokenizerFactory"
  205. },
  206. "filter":{
  207. "class":"solr.StopFilterFactory",
  208. "words":"stopwords.txt",
  209. "ignoreCase":true
  210. },
  211. "filter":{
  212. "class":"solr.WordDelimiterGraphFilterFactory",
  213. "generateWordParts":1,
  214. "generateNumberParts":1,
  215. "splitOnCaseChange":1,
  216. "splitOnNumerics":1,
  217. "catenateWords":1,
  218. "catenateNumbers":1,
  219. "catenateAll":1
  220. },
  221. "filter":{
  222. "class":"solr.FlattenGraphFilterFactory"
  223. },
  224. "filter":{
  225. "class":"solr.LowerCaseFilterFactory"
  226. },
  227. "filter":{
  228. "class":"solr.KeywordMarkerFilterFactory",
  229. "protected":"protwords.txt"
  230. },
  231. "filter":{
  232. "class":"solr.PorterStemFilterFactory"
  233. }
  234. },
  235. "queryAnalyzer":{
  236. "tokenizer":{
  237. "class":"solr.StandardTokenizerFactory"
  238. },
  239. "filter":{
  240. "class":"solr.SynonymGraphFilterFactory",
  241. "expand":true,
  242. "ignoreCase":true,
  243. "synonyms":synonyms.txt
  244. },
  245. "filter":{
  246. "class":"solr.FlattenGraphFilterFactory"
  247. },
  248. "filter":{
  249. "class":"solr.StopFilterFactory",
  250. "words":"stopwords.txt",
  251. "ignoreCase":true
  252. },
  253. "filter":{
  254. "class":"solr.WordDelimiterGraphFilterFactory",
  255. "generateWordParts":1,
  256. "generateNumberParts":1,
  257. "splitOnCaseChange":1,
  258. "splitOnNumerics":1,
  259. "catenateWords":1,
  260. "catenateNumbers":1,
  261. "catenateAll":1
  262. },
  263. "filter":{
  264. "class":"solr.LowerCaseFilterFactory"
  265. },
  266. "filter":{
  267. "class":"solr.KeywordMarkerFilterFactory",
  268. "protected":"protwords.txt"
  269. },
  270. "filter":{
  271. "class":"solr.PorterStemFilterFactory"
  272. }
  273. }
  274. },
  275. "replace-field":{
  276. "name":"uid",
  277. "type":"long",
  278. "indexed":true,
  279. "stored":true,
  280. "required":true
  281. },
  282. "replace-field":{
  283. "name":"box",
  284. "type":"string",
  285. "indexed":true,
  286. "stored":true,
  287. "required":true
  288. },
  289. "replace-field":{
  290. "name":"user",
  291. "type":"string",
  292. "indexed":true,
  293. "stored":true,
  294. "required":true
  295. },
  296. "replace-field":{
  297. "name":"hdr",
  298. "type":"dovecot_text",
  299. "indexed":true,
  300. "stored":false
  301. },
  302. "replace-field":{
  303. "name":"body",
  304. "type":"dovecot_text",
  305. "indexed":true,
  306. "stored":false
  307. },
  308. "replace-field":{
  309. "name":"from",
  310. "type":"dovecot_text",
  311. "indexed":true,
  312. "stored":false
  313. },
  314. "replace-field":{
  315. "name":"to",
  316. "type":"dovecot_text",
  317. "indexed":true,
  318. "stored":false
  319. },
  320. "replace-field":{
  321. "name":"cc",
  322. "type":"dovecot_text",
  323. "indexed":true,
  324. "stored":false
  325. },
  326. "replace-field":{
  327. "name":"bcc",
  328. "type":"dovecot_text",
  329. "indexed":true,
  330. "stored":false
  331. },
  332. "replace-field":{
  333. "name":"subject",
  334. "type":"dovecot_text",
  335. "indexed":true,
  336. "stored":false
  337. }
  338. }'
  339. curl -XPOST http://localhost:8983/solr/dovecot/config -H 'Content-type:application/json' -d '{
  340. "update-requesthandler":{
  341. "name":"/select",
  342. "class":"solr.SearchHandler",
  343. "defaults":{
  344. "wt":"xml"
  345. }
  346. }
  347. }'
  348. curl -XPOST http://localhost:8983/solr/dovecot/config/updateHandler -d '{
  349. "set-property": {
  350. "updateHandler.autoSoftCommit.maxDocs":500,
  351. "updateHandler.autoSoftCommit.maxTime":120000,
  352. "updateHandler.autoCommit.maxDocs":200,
  353. "updateHandler.autoCommit.maxTime":1800000,
  354. "updateHandler.autoCommit.openSearcher":false
  355. }
  356. }'
  357. }
  358. # fixing volume permission
  359. [[ -d /opt/solr/server/solr/dovecot/data ]] && chown -R solr:solr /opt/solr/server/solr/dovecot/data
  360. if [[ "${1}" != "--bootstrap" ]]; then
  361. sed -i '/SOLR_HEAP=/c\SOLR_HEAP="'${SOLR_HEAP:-1024}'m"' /opt/solr/bin/solr.in.sh
  362. else
  363. sed -i '/SOLR_HEAP=/c\SOLR_HEAP="256m"' /opt/solr/bin/solr.in.sh
  364. fi
  365. # start a Solr so we can use the Schema API, but only on localhost,
  366. # so that clients don't see Solr until we have configured it.
  367. echo "Starting local Solr instance to setup configuration"
  368. su-exec solr start-local-solr
  369. # keep a sentinel file so we don't try to create the core a second time
  370. # for example when we restart a container.
  371. SENTINEL=/opt/docker-solr/core_created
  372. if [[ -f ${SENTINEL} ]]; then
  373. echo "skipping core creation"
  374. else
  375. echo "Creating core \"dovecot\""
  376. su-exec solr /opt/solr/bin/solr create -c "dovecot"
  377. # See https://github.com/docker-solr/docker-solr/issues/27
  378. echo "Checking core"
  379. while ! wget -O - 'http://localhost:8983/solr/admin/cores?action=STATUS' | grep -q instanceDir; do
  380. echo "Could not find any cores, waiting..."
  381. sleep 5
  382. done
  383. echo "Created core \"dovecot\""
  384. touch ${SENTINEL}
  385. fi
  386. echo "Starting configuration"
  387. while ! wget -O - 'http://localhost:8983/solr/admin/cores?action=STATUS' | grep -q instanceDir; do
  388. echo "Waiting for Solr..."
  389. sleep 5
  390. done
  391. solr_config
  392. echo "Stopping local Solr"
  393. su-exec solr stop-local-solr
  394. if [[ "${1}" == "--bootstrap" ]]; then
  395. exit 0
  396. else
  397. exec su-exec solr solr-foreground
  398. fi