A place to cache linked articles (think custom and personal wayback machine)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.html 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. <!doctype html><!-- This is a valid HTML5 document. -->
  2. <!-- Screen readers, SEO, extensions and so on. -->
  3. <html lang="fr">
  4. <!-- Has to be within the first 1024 bytes, hence before the <title>
  5. See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
  6. <meta charset="utf-8">
  7. <!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
  8. <!-- The viewport meta is quite crowded and we are responsible for that.
  9. See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
  10. <meta name="viewport" content="width=device-width,initial-scale=1">
  11. <!-- Required to make a valid HTML5 document. -->
  12. <title>Host your own wikipedia backup (archive) — David Larlet</title>
  13. <meta name="description" content="Publication mise en cache pour en conserver une trace.">
  14. <!-- That good ol' feed, subscribe :). -->
  15. <link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
  16. <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
  17. <link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
  18. <link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
  19. <link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
  20. <link rel="manifest" href="/static/david/icons2/site.webmanifest">
  21. <link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
  22. <link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
  23. <meta name="msapplication-TileColor" content="#f0f0ea">
  24. <meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
  25. <meta name="theme-color" content="#f0f0ea">
  26. <!-- Documented, feel free to shoot an email. -->
  27. <link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
  28. <!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
  29. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  30. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  31. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  32. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  33. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  34. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  35. <script>
  36. function toggleTheme(themeName) {
  37. document.documentElement.classList.toggle(
  38. 'forced-dark',
  39. themeName === 'dark'
  40. )
  41. document.documentElement.classList.toggle(
  42. 'forced-light',
  43. themeName === 'light'
  44. )
  45. }
  46. const selectedTheme = localStorage.getItem('theme')
  47. if (selectedTheme !== 'undefined') {
  48. toggleTheme(selectedTheme)
  49. }
  50. </script>
  51. <meta name="robots" content="noindex, nofollow">
  52. <meta content="origin-when-cross-origin" name="referrer">
  53. <!-- Canonical URL for SEO purposes -->
  54. <link rel="canonical" href="https://dataswamp.org/~solene/2019-11-13-wikimedia-dump.html">
  55. <body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick">
  56. <article>
  57. <header>
  58. <h1>Host your own wikipedia backup</h1>
  59. </header>
  60. <nav>
  61. <p class="center">
  62. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  63. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-home"></use>
  64. </svg> Accueil</a> •
  65. <a href="https://dataswamp.org/~solene/2019-11-13-wikimedia-dump.html" title="Lien vers le contenu original">Source originale</a>
  66. </p>
  67. </nav>
  68. <hr>
  69. <h2 id="wikipediaandopenzim">Wikipedia and openzim</h2>
  70. <p>If you ever wanted to host your own wikipedia replica, here is the simplest
  71. way.</p>
  72. <p>As wikipedia is REALLY huge, you don’t really want to host a php wikimedia
  73. software and load the huge database, instead, the project made the <em>openzim</em>
  74. format to compress the huge database that wikipedia became while allowing using
  75. it for fast searches.</p>
  76. <p>Sadly, on OpenBSD, we have no software reading zim files and most software
  77. requires the library openzim to work which requires extra work to get it as a
  78. package on OpenBSD.</p>
  79. <p>Hopefully, there is a python package implementing all you need as pure python
  80. to serve zim files over http and it’s easy to install.</p>
  81. <p>This tutorial should work on all others unix like systems but packages or
  82. binary names may change.</p>
  83. <h2 id="downloadingwikipedia">Downloading wikipedia</h2>
  84. <p>The project Kiwix is responsible for wikipedia files, they create regularly
  85. files from various projects (including stackexchange, gutenberg, wikibooks
  86. etc…) but for this tutorial we want wikipedia:
  87. <a href="https://wiki.kiwix.org/wiki/Content_in_all_languages">https://wiki.kiwix.org/wiki/Content_in_all_languages</a></p>
  88. <p>You will find a lot of files, the language is contained into the filename. Some
  89. filenames will also self explain if they contain everything or categories, and
  90. if they have pictures or not.</p>
  91. <p>The full French file is 31.4 GB worth.</p>
  92. <h2 id="runningtheserver">Running the server</h2>
  93. <p>For the next steps, I recommend setting up a new user dedicated to this.</p>
  94. <p>On OpenBSD, we will require python3 and pip:</p>
  95. <pre><code>$ doas pkg_add py3-pip--
  96. </code></pre>
  97. <p>Then we can use pip to fetch and install dependencies for the zimply software,
  98. the flag <code>--user</code> is rather important as it allows any user to download and
  99. install python libraries in its home folder instead of polluting the whole
  100. system as root.</p>
  101. <pre><code>$ pip3.7 install --user --upgrade zimply
  102. </code></pre>
  103. <p>I wrote a small script to start the server using the zim file as a parameter, I
  104. rarely write python so the script may not be high standard.</p>
  105. <p>File <strong>server.py</strong>:</p>
  106. <pre><code>from zimply import ZIMServer
  107. import sys
  108. import os.path
  109. if len(sys.argv) == 1:
  110. print("usage: " + sys.argv[0] + " file")
  111. exit(1)
  112. if os.path.exists(sys.argv[1]):
  113. ZIMServer(sys.argv[1])
  114. else:
  115. print("Can't find file " + sys.argv[1])
  116. </code></pre>
  117. <p>And then you can start the server using the command:</p>
  118. <pre><code>$ python3.7 server.py /path/to/wikipedia_fr_all_maxi_2019-08.zim
  119. </code></pre>
  120. <p>You will be able to access wikipedia on the url http://localhost:9454/</p>
  121. <p>Note that this is not a “wiki” as you can’t see history and edit/create pages.</p>
  122. <p>This kind of backup is used in place like Cuba or Africa areas where people
  123. don’t have unlimited internet access, the project lead by Kiwix allow more
  124. people to access knowledge.</p>
  125. </article>
  126. <hr>
  127. <footer>
  128. <p>
  129. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  130. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-home"></use>
  131. </svg> Accueil</a> •
  132. <a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
  133. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-rss2"></use>
  134. </svg> RSS</a> •
  135. <a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
  136. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-user-tie"></use>
  137. </svg> Pro</a> •
  138. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
  139. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-mail"></use>
  140. </svg> Email</a> •
  141. <abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
  142. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-hammer2"></use>
  143. </svg> Légal</abbr>
  144. </p>
  145. <template id="theme-selector">
  146. <form>
  147. <fieldset>
  148. <legend><svg class="icon icon-brightness-contrast">
  149. <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-brightness-contrast"></use>
  150. </svg> Thème</legend>
  151. <label>
  152. <input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
  153. </label>
  154. <label>
  155. <input type="radio" value="dark" name="chosen-color-scheme"> Foncé
  156. </label>
  157. <label>
  158. <input type="radio" value="light" name="chosen-color-scheme"> Clair
  159. </label>
  160. </fieldset>
  161. </form>
  162. </template>
  163. </footer>
  164. <script>
  165. function loadThemeForm(templateName) {
  166. const themeSelectorTemplate = document.querySelector(templateName)
  167. const form = themeSelectorTemplate.content.firstElementChild
  168. themeSelectorTemplate.replaceWith(form)
  169. form.addEventListener('change', (e) => {
  170. const chosenColorScheme = e.target.value
  171. localStorage.setItem('theme', chosenColorScheme)
  172. toggleTheme(chosenColorScheme)
  173. })
  174. const selectedTheme = localStorage.getItem('theme')
  175. if (selectedTheme && selectedTheme !== 'undefined') {
  176. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  177. }
  178. }
  179. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  180. window.addEventListener('load', () => {
  181. let hasDarkRules = false
  182. for (const styleSheet of Array.from(document.styleSheets)) {
  183. let mediaRules = []
  184. for (const cssRule of styleSheet.cssRules) {
  185. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  186. continue
  187. }
  188. // WARNING: Safari does not have/supports `conditionText`.
  189. if (cssRule.conditionText) {
  190. if (cssRule.conditionText !== prefersColorSchemeDark) {
  191. continue
  192. }
  193. } else {
  194. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  195. continue
  196. }
  197. }
  198. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  199. }
  200. // WARNING: do not try to insert a Rule to a styleSheet you are
  201. // currently iterating on, otherwise the browser will be stuck
  202. // in a infinite loop…
  203. for (const mediaRule of mediaRules) {
  204. styleSheet.insertRule(mediaRule.cssText)
  205. hasDarkRules = true
  206. }
  207. }
  208. if (hasDarkRules) {
  209. loadThemeForm('#theme-selector')
  210. }
  211. })
  212. </script>
  213. </body>
  214. </html>