Compare commits

...

No commits in common. 'main' and 'gh-pages' have entirely different histories.

  1. 31
      .gitignore
  2. 3
      .gitmodules
  3. 651
      Backups/index.html
  4. 19
      LICENSE
  5. 194
      Makefile
  6. 930
      Ports/index.html
  7. 214
      README.md
  8. 823
      Running/index.html
  9. 628
      Secrets/index.html
  10. 633
      Service_apachephp/index.html
  11. 740
      Service_gitea/index.html
  12. 847
      Service_mediawiki/index.html
  13. 642
      Service_mysql/index.html
  14. 1123
      Service_nginx/index.html
  15. 539
      Service_phpmyadmin/index.html
  16. 532
      Service_pythonfiles/index.html
  17. 991
      Volumes/index.html
  18. 4
      assets/fonts/font-awesome.css
  19. 13
      assets/fonts/material-icons.css
  20. 0
      assets/fonts/specimen/FontAwesome.ttf
  21. 0
      assets/fonts/specimen/FontAwesome.woff
  22. 0
      assets/fonts/specimen/FontAwesome.woff2
  23. BIN
      assets/fonts/specimen/MaterialIcons-Regular.ttf
  24. BIN
      assets/fonts/specimen/MaterialIcons-Regular.woff
  25. BIN
      assets/fonts/specimen/MaterialIcons-Regular.woff2
  26. BIN
      assets/images/favicon.png
  27. 20
      assets/images/icons/bitbucket.1b09e088.svg
  28. 18
      assets/images/icons/github.f0b8504a.svg
  29. 38
      assets/images/icons/gitlab.6dd19c00.svg
  30. 1
      assets/javascripts/application.e72fd936.js
  31. 1
      assets/javascripts/lunr/lunr.da.js
  32. 1
      assets/javascripts/lunr/lunr.de.js
  33. 1
      assets/javascripts/lunr/lunr.du.js
  34. 1
      assets/javascripts/lunr/lunr.es.js
  35. 1
      assets/javascripts/lunr/lunr.fi.js
  36. 1
      assets/javascripts/lunr/lunr.fr.js
  37. 1
      assets/javascripts/lunr/lunr.hu.js
  38. 1
      assets/javascripts/lunr/lunr.it.js
  39. 1
      assets/javascripts/lunr/lunr.jp.js
  40. 1
      assets/javascripts/lunr/lunr.multi.js
  41. 1
      assets/javascripts/lunr/lunr.no.js
  42. 1
      assets/javascripts/lunr/lunr.pt.js
  43. 1
      assets/javascripts/lunr/lunr.ro.js
  44. 1
      assets/javascripts/lunr/lunr.ru.js
  45. 1
      assets/javascripts/lunr/lunr.stemmer.support.js
  46. 1
      assets/javascripts/lunr/lunr.sv.js
  47. 1
      assets/javascripts/lunr/lunr.tr.js
  48. 1
      assets/javascripts/lunr/tinyseg.js
  49. 1
      assets/javascripts/modernizr.1aa3b519.js
  50. 1176
      assets/stylesheets/application-palette.22915126.css
  51. 2552
      assets/stylesheets/application.451f80e5.css
  52. 17
      common.mk
  53. 0
      css/custom.css
  54. 34
      d-gitea/README.md
  55. 106
      d-gitea/custom/conf/app.ini.j2
  56. 1
      d-gitea/custom/public/hello.html
  57. 3
      d-gitea/custom/templates/custom/extra_links.tmpl
  58. 3
      d-gitea/custom/templates/home.tmpl
  59. 63
      d-mediawiki/Dockerfile
  60. 97
      d-mediawiki/README.md
  61. 30
      d-mediawiki/Skins.md
  62. 11
      d-mediawiki/charlesreid1-config/Readme.md
  63. 1
      d-mediawiki/charlesreid1-config/apache/.gitignore
  64. 65
      d-mediawiki/charlesreid1-config/apache/charlesreid1.wiki.conf.j2
  65. 2
      d-mediawiki/charlesreid1-config/mediawiki/.gitignore
  66. 243
      d-mediawiki/charlesreid1-config/mediawiki/LocalSettings.php.j2
  67. 18
      d-mediawiki/charlesreid1-config/mediawiki/README.md
  68. 43
      d-mediawiki/charlesreid1-config/mediawiki/apply_templates.py
  69. 329
      d-mediawiki/charlesreid1-config/mediawiki/sample_LocalSettings.php
  70. 452
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/Bootstrap2.php.j2
  71. 339
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/COPYING
  72. 67
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/IE50Fixes.css
  73. 88
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/IE55Fixes.css
  74. 125
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/IE60Fixes.css
  75. 96
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/IE70Fixes.css
  76. 18
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/_footer.html
  77. 7
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-3.3.4.js
  78. 90
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-alert.js
  79. 96
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-button.js
  80. 169
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-carousel.js
  81. 157
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-collapse.js
  82. 6981
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-cyborg.css
  83. 100
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-dropdown.js
  84. 399
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-image-gallery.js
  85. 1
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-image-gallery.min.js
  86. 218
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-modal.js
  87. 98
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-popover.js
  88. 1109
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-responsive-cyborg.css
  89. 151
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-scrollspy.js
  90. 135
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-tab.js
  91. 275
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-tooltip.js
  92. 61
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-transition.js
  93. 285
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-typeahead.js
  94. 5
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap.css
  95. 2027
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap.js
  96. 6
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap.min.js
  97. BIN
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bullet.gif
  98. 490
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/buttons.css
  99. 24
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/cleannavbar.php
  100. 124
      d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/cmr-bootstrap-cyborg-wiki.css
  101. Some files were not shown because too many files have changed in this diff Show More

31
.gitignore vendored

@ -1,31 +0,0 @@ @@ -1,31 +0,0 @@
*.log
*.pyc
environment
attic
# gitea
d-gitea/data/
d-gitea/custom/
# mediawiki
charlesreid1.wiki.conf
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/Bootstrap2.php
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/navbar.php
d-mediawiki/mediawiki/
# nginx
d-nginx-charlesreid1/conf.d/http.DOMAIN.conf
d-nginx-charlesreid1/conf.d/https.DOMAIN.conf
# scripts dir
scripts/git_*_www.py
scripts/certbot/renew_charlesreid1_certs.sh
*.timer
*.service
# misc
site
root.password
docker-compose.yml
*.zip

3
.gitmodules vendored

@ -1,3 +0,0 @@ @@ -1,3 +0,0 @@
[submodule "mkdocs-material"]
path = mkdocs-material
url = https://github.com/charlesreid1/mkdocs-material

651
Backups/index.html

@ -0,0 +1,651 @@ @@ -0,0 +1,651 @@
<!DOCTYPE html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<link rel="canonical" href="https://pages.charlesreid1.com/pod-charlesreid1/Backups/">
<meta name="lang:clipboard.copy" content="Copy to clipboard">
<meta name="lang:clipboard.copied" content="Copied to clipboard">
<meta name="lang:search.language" content="en">
<meta name="lang:search.pipeline.stopwords" content="True">
<meta name="lang:search.pipeline.trimmer" content="True">
<meta name="lang:search.result.none" content="No matching documents">
<meta name="lang:search.result.one" content="1 matching document">
<meta name="lang:search.result.other" content="# matching documents">
<meta name="lang:search.tokenizer" content="[\s\-]+">
<link rel="shortcut icon" href="..">
<meta name="generator" content="mkdocs-1.0.4, mkdocs-material-3.0.3">
<title>Backups - pod-charlesreid1</title>
<link rel="stylesheet" href="../assets/stylesheets/application.451f80e5.css">
<link rel="stylesheet" href="../assets/stylesheets/application-palette.22915126.css">
<meta name="theme-color" content="#2196f3">
<script src="../assets/javascripts/modernizr.1aa3b519.js"></script>
<link href="https://fonts.gstatic.com" rel="preconnect" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
<style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
<link rel="stylesheet" href="../assets/fonts/material-icons.css">
<link rel="stylesheet" href="../css/custom.css">
</head>
<body dir="ltr" data-md-color-primary="blue" data-md-color-accent="blue">
<svg class="md-svg">
<defs>
</defs>
</svg>
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" data-md-component="overlay" for="__drawer"></label>
<a href="../#backups" tabindex="1" class="md-skip">
Skip to content
</a>
<header class="md-header" data-md-component="header">
<nav class="md-header-nav md-grid">
<div class="md-flex">
<div class="md-flex__cell md-flex__cell--shrink">
<a href="https://pages.charlesreid1.com/pod-charlesreid1" title="pod-charlesreid1" class="md-header-nav__button md-logo">
<i class="md-icon">dns</i>
</a>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--menu md-header-nav__button" for="__drawer"></label>
</div>
<div class="md-flex__cell md-flex__cell--stretch">
<div class="md-flex__ellipsis md-header-nav__title" data-md-component="title">
<span class="md-header-nav__topic">
pod-charlesreid1
</span>
<span class="md-header-nav__topic">
Backups
</span>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--search md-header-nav__button" for="__search"></label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query" data-md-state="active">
<label class="md-icon md-search__icon" for="__search"></label>
<button type="reset" class="md-icon md-search__icon" data-md-component="reset" tabindex="-1">
&#xE5CD;
</button>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="result">
<div class="md-search-result__meta">
Type to start searching
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<div class="md-header-nav__source">
<a href="https://git.charlesreid1.com/docker/pod-charlesreid1" title="Go to repository" class="md-source" data-md-source="">
<div class="md-source__repository">
pod-charlesreid1
</div>
</a>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container">
<main class="md-main">
<div class="md-main__inner md-grid" data-md-component="container">
<div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" data-md-level="0">
<label class="md-nav__title md-nav__title--site" for="__drawer">
<a href="https://pages.charlesreid1.com/pod-charlesreid1" title="pod-charlesreid1" class="md-nav__button md-logo">
<i class="md-icon">dns</i>
</a>
pod-charlesreid1
</label>
<div class="md-nav__source">
<a href="https://git.charlesreid1.com/docker/pod-charlesreid1" title="Go to repository" class="md-source" data-md-source="">
<div class="md-source__repository">
pod-charlesreid1
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href=".." title="Index" class="md-nav__link">
Index
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
<label class="md-nav__link" for="nav-2">
Services
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-2">
Services
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../Service_mediawiki/" title="Pod Service: MediaWiki" class="md-nav__link">
Pod Service: MediaWiki
</a>
</li>
<li class="md-nav__item">
<a href="../Service_apachephp/" title="Pod Service: Apache/PHP" class="md-nav__link">
Pod Service: Apache/PHP
</a>
</li>
<li class="md-nav__item">
<a href="../Service_mysql/" title="Pod Service: MySQL" class="md-nav__link">
Pod Service: MySQL
</a>
</li>
<li class="md-nav__item">
<a href="../Service_phpmyadmin/" title="Pod Service: phpMyAdmin" class="md-nav__link">
Pod Service: phpMyAdmin
</a>
</li>
<li class="md-nav__item">
<a href="../Service_nginx/" title="Pod Service: nginx" class="md-nav__link">
Pod Service: nginx
</a>
</li>
<li class="md-nav__item">
<a href="../Service_pythonfiles/" title="Pod Service: Python File Server" class="md-nav__link">
Pod Service: Python File Server
</a>
</li>
<li class="md-nav__item">
<a href="../Service_gitea/" title="Pod Service: Gitea" class="md-nav__link">
Pod Service: Gitea
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../Running/" title="Running the Pod" class="md-nav__link">
Running the Pod
</a>
</li>
<li class="md-nav__item">
<a href="../Volumes/" title="Volumes" class="md-nav__link">
Volumes
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
Backups
</label>
<a href="./" title="Backups" class="md-nav__link md-nav__link--active">
Backups
</a>
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#krash-seed" title="Krash Seed" class="md-nav__link">
Krash Seed
</a>
</li>
<li class="md-nav__item">
<a href="#mysql-backuprestore-scripts" title="MySQL Backup/Restore Scripts" class="md-nav__link">
MySQL Backup/Restore Scripts
</a>
</li>
<li class="md-nav__item">
<a href="#mediawiki-backuprestore-scripts" title="MediaWiki Backup/Restore Scripts" class="md-nav__link">
MediaWiki Backup/Restore Scripts
</a>
</li>
<li class="md-nav__item">
<a href="#gitea-backuprestore-scripts" title="Gitea Backup/Restore Scripts" class="md-nav__link">
Gitea Backup/Restore Scripts
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../Ports/" title="Domains and Ports" class="md-nav__link">
Domains and Ports
</a>
</li>
<li class="md-nav__item">
<a href="../Secrets/" title="Secrets" class="md-nav__link">
Secrets
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#krash-seed" title="Krash Seed" class="md-nav__link">
Krash Seed
</a>
</li>
<li class="md-nav__item">
<a href="#mysql-backuprestore-scripts" title="MySQL Backup/Restore Scripts" class="md-nav__link">
MySQL Backup/Restore Scripts
</a>
</li>
<li class="md-nav__item">
<a href="#mediawiki-backuprestore-scripts" title="MediaWiki Backup/Restore Scripts" class="md-nav__link">
MediaWiki Backup/Restore Scripts
</a>
</li>
<li class="md-nav__item">
<a href="#gitea-backuprestore-scripts" title="Gitea Backup/Restore Scripts" class="md-nav__link">
Gitea Backup/Restore Scripts
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content">
<article class="md-content__inner md-typeset">
<h1 id="backups">Backups<a class="headerlink" href="#backups" title="Permanent link">&para;</a></h1>
<h2 id="krash-seed">Krash Seed<a class="headerlink" href="#krash-seed" title="Permanent link">&para;</a></h2>
<p>By competely containerizing charlesreid1.com,
all of the static files for running programs
come from docker container images,
and all configuration files
come from git repositories under version control at
<a href="https://git.charlesreid1.com/docker">git.charlesreid1.com/docker</a>.</p>
<p>That just leaves the core data for each service,
which is what the backup and restore scripts handle.
This service data consists of the following:</p>
<ul>
<li>MediaWiki MySQL database dump (.sql)</li>
<li>MediaWiki images directory (.tar.gz)</li>
<li>Gitea repository dump (.zip)</li>
<li>Gitea avatar images (.zip)</li>
</ul>
<p>These four files form a "krash seed" for charlesreid1.com.</p>
<h2 id="mysql-backuprestore-scripts">MySQL Backup/Restore Scripts<a class="headerlink" href="#mysql-backuprestore-scripts" title="Permanent link">&para;</a></h2>
<p>To create a MySQL backup, use the <code>utils-mysql/dump_database.sh</code> script.</p>
<div class="codehilite"><pre><span></span>dump_database.sh script:
Dump a database to an .sql file
from the stormy_mysql container.
./dump_database.sh &lt;sql-dump-file&gt;
Example:
./dump_database.sh /path/to/wikidb_dump.sql
</pre></div>
<h2 id="mediawiki-backuprestore-scripts">MediaWiki Backup/Restore Scripts<a class="headerlink" href="#mediawiki-backuprestore-scripts" title="Permanent link">&para;</a></h2>
<div class="codehilite"><pre><span></span>backup_wikifiles.sh script:
Create a tar file containing wiki files
from the stormy_mw container
./backup_wikifiles.sh &lt;tar-file&gt;
Example:
./backup_wikifiles.sh /path/to/wikifiles.tar.gz
</pre></div>
<h2 id="gitea-backuprestore-scripts">Gitea Backup/Restore Scripts<a class="headerlink" href="#gitea-backuprestore-scripts" title="Permanent link">&para;</a></h2>
<h1 id="utilities">Utilities<a class="headerlink" href="#utilities" title="Permanent link">&para;</a></h1>
<p>Utilities are kept in the <code>utils-*</code> folders.</p>
<h2 id="mysql-utilities">MySQL Utilities<a class="headerlink" href="#mysql-utilities" title="Permanent link">&para;</a></h2>
<h2 id="mediawiki-utilities">MediaWiki Utilities<a class="headerlink" href="#mediawiki-utilities" title="Permanent link">&para;</a></h2>
<h2 id="mysql-utilities_1">MySQL Utilities<a class="headerlink" href="#mysql-utilities_1" title="Permanent link">&para;</a></h2>
</article>
</div>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-nav">
<nav class="md-footer-nav__inner md-grid">
<a href="../Volumes/" title="Volumes" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
</div>
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Previous
</span>
Volumes
</span>
</div>
</a>
<a href="../Ports/" title="Domains and Ports" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Next
</span>
Domains and Ports
</span>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
</div>
</a>
</nav>
</div>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-footer-copyright">
<div class="md-footer-copyright__highlight">
Copyright &copy; 2018 <a href="https://charlesreid1.com">Charles Reid</a>, released under the <a href="https://opensource.org/licenses/MIT">MIT license</a>
</div>
powered by
<a href="https://www.mkdocs.org">MkDocs</a>
and
<a href="https://squidfunk.github.io/mkdocs-material/">
Material for MkDocs</a>
</div>
</div>
</div>
</footer>
</div>
<script src="../assets/javascripts/application.e72fd936.js"></script>
<script>app.initialize({version:"1.0.4",url:{base:".."}})</script>
<script src="../search/main.js"></script>
</body>
</html>

19
LICENSE

@ -1,19 +0,0 @@ @@ -1,19 +0,0 @@
Copyright (c) 2018-2021 Charles Reid
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

194
Makefile

@ -1,194 +0,0 @@ @@ -1,194 +0,0 @@
include common.mk
all:
@echo "no default make rule defined"
help:
@echo ""
@echo ""
@echo "pod-charlesreid Makefile:"
@echo ""
@echo ""
@echo "This Makefile contains rules for setting up pod-charlesreid1"
@echo ""
@echo "make help: Get help"
@echo ""
@echo "--------------------------------------------------"
@echo " Templates:"
@echo ""
@echo "make templates: Render each .j2 template file in this and all subdirectories"
@echo " (uses environment variables to populate Jinja variables)"
@echo ""
@echo "make list-templates: List each .j2 template file that will be rendered by a 'make template' command"
@echo ""
@echo "make clean-templates: Remove each rendered .j2 template"
@echo ""
@echo "--------------------------------------------------"
@echo " Backups:"
@echo ""
@echo "make backups: Create backups of every service (wiki database, wiki files) in ~/backups"
@echo ""
@echo "make clean-backups: Remove files from ~/backups directory older than 30 days"
@echo ""
@echo "--------------------------------------------------"
@echo " MediaWiki:"
@echo ""
@echo "make mw-build-extensions Build the MediaWiki extensions directory"
@echo ""
@echo "make mw-fix-extensions Copy the built extensions directory into the MW container"
@echo ""
@echo "make mw-fix-localsettings Copy the LocalSettings.php file into the MW container"
@echo ""
@echo "make mw-fix-skins Copy the skins directory into the MW container"
@echo ""
@echo "--------------------------------------------------"
@echo " /www Directory:"
@echo ""
@echo "make clone-www: Create the /www directory structure for charlesreid1.com"
@echo ""
@echo "make pull-www: Update the contents of the /www directory structure for charlesreid1.com"
@echo ""
@echo "--------------------------------------------------"
@echo " Startup Services:"
@echo ""
@echo "make install: Install and start systemd service to run pod-charlesreid1."
@echo " Also install and start systemd service for pod-charlesreid1 backup services"
@echo " for each service (mediawiki/mysql) part of pod-charlesreid1."
@echo ""
@echo "make uninstall: Remove all systemd startup services and timers part of pod-charlesreid1"
@echo ""
# Templates
templates:
@find * -name "*.service.j2" | xargs -I '{}' chmod 644 {}
@find * -name "*.timer.j2" | xargs -I '{}' chmod 644 {}
/home/charles/.pyenv/shims/python3 $(POD_CHARLESREID1_DIR)/scripts/apply_templates.py
list-templates:
@find * -name "*.j2"
clean-templates:
# sudo is required because bind-mounted gitea files end up owned by root. stupid docker.
sudo -E /home/charles/.pyenv/shims/python3 $(POD_CHARLESREID1_DIR)/scripts/clean_templates.py
# Backups
backups:
$(POD_CHARLESREID1_DIR)/scripts/backups/wikidb_dump.sh
$(POD_CHARLESREID1_DIR)/scripts/backups/wikifiles_dump.sh
clean-backups:
$(POD_CHARLESREID1_DIR)/scripts/clean_templates.sh
# MediaWiki
mw-build-extensions:
$(POD_CHARLESREID1_DIR)/scripts/mw/build_extensions_dir.sh
mw-fix-extensions: mw-build-extensions
$(POD_CHARLESREID1_DIR)/scripts/mw/build_extensions_dir.sh
mw-fix-localsettings:
$(POD_CHARLESREID1_DIR)/scripts/mw/fix_LocalSettings.sh
mw-fix-skins:
$(POD_CHARLESREID1_DIR)/scripts/mw/fix_skins.sh
# /www Dir
clone-www:
/home/charles/.pyenv/shims/python3 $(POD_CHARLESREID1_DIR)/scripts/git_clone_www.py
pull-www:
/home/charles/.pyenv/shims/python3 $(POD_CHARLESREID1_DIR)/scripts/git_pull_www.py
install:
ifeq ($(shell which systemctl),)
$(error Please run this make command on a system with systemctl installed)
endif
@/home/charles/.pyenv/shims/python3 -c 'import botocore' || (echo "Please install the botocore library using python3 or pip3 binary"; exit 1)
@/home/charles/.pyenv/shims/python3 -c 'import boto3' || (echo "Please install the boto3 library using python3 or pip3 binary"; exit 1)
sudo cp $(POD_CHARLESREID1_DIR)/scripts/pod-charlesreid1.service /etc/systemd/system/pod-charlesreid1.service
sudo cp $(POD_CHARLESREID1_DIR)/scripts/backups/pod-charlesreid1-backups-aws.{service,timer} /etc/systemd/system/.
sudo cp $(POD_CHARLESREID1_DIR)/scripts/backups/pod-charlesreid1-backups-cleanolderthan.{service,timer} /etc/systemd/system/.
sudo cp $(POD_CHARLESREID1_DIR)/scripts/backups/pod-charlesreid1-backups-gitea.{service,timer} /etc/systemd/system/.
sudo cp $(POD_CHARLESREID1_DIR)/scripts/backups/pod-charlesreid1-backups-wikidb.{service,timer} /etc/systemd/system/.
sudo cp $(POD_CHARLESREID1_DIR)/scripts/backups/pod-charlesreid1-backups-wikifiles.{service,timer} /etc/systemd/system/.
sudo cp $(POD_CHARLESREID1_DIR)/scripts/backups/canary/pod-charlesreid1-canary.{service,timer} /etc/systemd/system/.
sudo cp $(POD_CHARLESREID1_DIR)/scripts/certbot/pod-charlesreid1-certbot.{service,timer} /etc/systemd/system/.
sudo cp $(POD_CHARLESREID1_DIR)/scripts/backups/10-pod-charlesreid1-rsyslog.conf /etc/rsyslog.d/.
sudo chmod 664 /etc/systemd/system/pod-charlesreid1*
sudo systemctl daemon-reload
sudo systemctl restart rsyslog
sudo systemctl enable pod-charlesreid1
sudo systemctl enable pod-charlesreid1-backups-wikidb.timer
sudo systemctl enable pod-charlesreid1-backups-wikifiles.timer
sudo systemctl enable pod-charlesreid1-backups-gitea.timer
sudo systemctl enable pod-charlesreid1-backups-aws.timer
sudo systemctl enable pod-charlesreid1-backups-cleanolderthan.timer
sudo systemctl enable pod-charlesreid1-canary.timer
sudo systemctl enable pod-charlesreid1-certbot.timer
sudo systemctl start pod-charlesreid1-backups-wikidb.timer
sudo systemctl start pod-charlesreid1-backups-wikifiles.timer
sudo systemctl start pod-charlesreid1-backups-gitea.timer
sudo systemctl start pod-charlesreid1-backups-aws.timer
sudo systemctl start pod-charlesreid1-backups-cleanolderthan.timer
sudo systemctl start pod-charlesreid1-canary.timer
sudo systemctl start pod-charlesreid1-certbot.timer
sudo chown syslog:syslog /var/log/pod-charlesreid1-backups-aws.service.log
sudo chown syslog:syslog /var/log/pod-charlesreid1-backups-cleanolderthan.service.log
sudo chown syslog:syslog /var/log/pod-charlesreid1-backups-gitea.service.log
sudo chown syslog:syslog /var/log/pod-charlesreid1-backups-wikidb.service.log
sudo chown syslog:syslog /var/log/pod-charlesreid1-backups-wikifiles.service.log
sudo chown syslog:syslog /var/log/pod-charlesreid1-canary.service.log
uninstall:
ifeq ($(shell which systemctl),)
$(error Please run this make command on a system with systemctl installed)
endif
-sudo systemctl disable pod-charlesreid1
-sudo systemctl disable pod-charlesreid1-backups-aws.timer
-sudo systemctl disable pod-charlesreid1-backups-cleanolderthan.timer
-sudo systemctl disable pod-charlesreid1-backups-gitea.timer
-sudo systemctl disable pod-charlesreid1-backups-wikidb.timer
-sudo systemctl disable pod-charlesreid1-backups-wikifiles.timer
-sudo systemctl disable pod-charlesreid1-canary.timer
-sudo systemctl disable pod-charlesreid1-certbot.timer
# Leave the pod running!
# -sudo systemctl stop pod-charlesreid1
-sudo systemctl stop pod-charlesreid1-backups-aws.timer
-sudo systemctl stop pod-charlesreid1-backups-cleanolderthan.timer
-sudo systemctl stop pod-charlesreid1-backups-gitea.timer
-sudo systemctl stop pod-charlesreid1-backups-wikidb.timer
-sudo systemctl stop pod-charlesreid1-backups-wikifiles.timer
-sudo systemctl stop pod-charlesreid1-canary.timer
-sudo systemctl stop pod-charlesreid1-certbot.timer
-sudo rm -f /etc/systemd/system/pod-charlesreid1.service
-sudo rm -f /etc/systemd/system/pod-charlesreid1-backups-aws.{service,timer}
-sudo rm -f /etc/systemd/system/pod-charlesreid1-backups-cleanolderthan.{service,timer}
-sudo rm -f /etc/systemd/system/pod-charlesreid1-backups-gitea.{service,timer}
-sudo rm -f /etc/systemd/system/pod-charlesreid1-backups-wikidb.{service,timer}
-sudo rm -f /etc/systemd/system/pod-charlesreid1-backups-wikifiles.{service,timer}
-sudo rm -f /etc/systemd/system/pod-charlesreid1-canary.{service,timer}
-sudo rm -f /etc/systemd/system/pod-charlesreid1-certbot.{service,timer}
sudo systemctl daemon-reload
-sudo rm -f /etc/rsyslog.d/10-pod-charlesreid1-rsyslog.conf
-sudo systemctl restart rsyslog
.PHONY: help

930
Ports/index.html

@ -0,0 +1,930 @@ @@ -0,0 +1,930 @@
<!DOCTYPE html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<link rel="canonical" href="https://pages.charlesreid1.com/pod-charlesreid1/Ports/">
<meta name="lang:clipboard.copy" content="Copy to clipboard">
<meta name="lang:clipboard.copied" content="Copied to clipboard">
<meta name="lang:search.language" content="en">
<meta name="lang:search.pipeline.stopwords" content="True">
<meta name="lang:search.pipeline.trimmer" content="True">
<meta name="lang:search.result.none" content="No matching documents">
<meta name="lang:search.result.one" content="1 matching document">
<meta name="lang:search.result.other" content="# matching documents">
<meta name="lang:search.tokenizer" content="[\s\-]+">
<link rel="shortcut icon" href="..">
<meta name="generator" content="mkdocs-1.0.4, mkdocs-material-3.0.3">
<title>Domains and Ports - pod-charlesreid1</title>
<link rel="stylesheet" href="../assets/stylesheets/application.451f80e5.css">
<link rel="stylesheet" href="../assets/stylesheets/application-palette.22915126.css">
<meta name="theme-color" content="#2196f3">
<script src="../assets/javascripts/modernizr.1aa3b519.js"></script>
<link href="https://fonts.gstatic.com" rel="preconnect" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
<style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
<link rel="stylesheet" href="../assets/fonts/material-icons.css">
<link rel="stylesheet" href="../css/custom.css">
</head>
<body dir="ltr" data-md-color-primary="blue" data-md-color-accent="blue">
<svg class="md-svg">
<defs>
</defs>
</svg>
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" data-md-component="overlay" for="__drawer"></label>
<a href="../#domains-and-ports" tabindex="1" class="md-skip">
Skip to content
</a>
<header class="md-header" data-md-component="header">
<nav class="md-header-nav md-grid">
<div class="md-flex">
<div class="md-flex__cell md-flex__cell--shrink">
<a href="https://pages.charlesreid1.com/pod-charlesreid1" title="pod-charlesreid1" class="md-header-nav__button md-logo">
<i class="md-icon">dns</i>
</a>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--menu md-header-nav__button" for="__drawer"></label>
</div>
<div class="md-flex__cell md-flex__cell--stretch">
<div class="md-flex__ellipsis md-header-nav__title" data-md-component="title">
<span class="md-header-nav__topic">
pod-charlesreid1
</span>
<span class="md-header-nav__topic">
Domains and Ports
</span>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--search md-header-nav__button" for="__search"></label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query" data-md-state="active">
<label class="md-icon md-search__icon" for="__search"></label>
<button type="reset" class="md-icon md-search__icon" data-md-component="reset" tabindex="-1">
&#xE5CD;
</button>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="result">
<div class="md-search-result__meta">
Type to start searching
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<div class="md-header-nav__source">
<a href="https://git.charlesreid1.com/docker/pod-charlesreid1" title="Go to repository" class="md-source" data-md-source="">
<div class="md-source__repository">
pod-charlesreid1
</div>
</a>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container">
<main class="md-main">
<div class="md-main__inner md-grid" data-md-component="container">
<div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" data-md-level="0">
<label class="md-nav__title md-nav__title--site" for="__drawer">
<a href="https://pages.charlesreid1.com/pod-charlesreid1" title="pod-charlesreid1" class="md-nav__button md-logo">
<i class="md-icon">dns</i>
</a>
pod-charlesreid1
</label>
<div class="md-nav__source">
<a href="https://git.charlesreid1.com/docker/pod-charlesreid1" title="Go to repository" class="md-source" data-md-source="">
<div class="md-source__repository">
pod-charlesreid1
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href=".." title="Index" class="md-nav__link">
Index
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
<label class="md-nav__link" for="nav-2">
Services
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-2">
Services
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../Service_mediawiki/" title="Pod Service: MediaWiki" class="md-nav__link">
Pod Service: MediaWiki
</a>
</li>
<li class="md-nav__item">
<a href="../Service_apachephp/" title="Pod Service: Apache/PHP" class="md-nav__link">
Pod Service: Apache/PHP
</a>
</li>
<li class="md-nav__item">
<a href="../Service_mysql/" title="Pod Service: MySQL" class="md-nav__link">
Pod Service: MySQL
</a>
</li>
<li class="md-nav__item">
<a href="../Service_phpmyadmin/" title="Pod Service: phpMyAdmin" class="md-nav__link">
Pod Service: phpMyAdmin
</a>
</li>
<li class="md-nav__item">
<a href="../Service_nginx/" title="Pod Service: nginx" class="md-nav__link">
Pod Service: nginx
</a>
</li>
<li class="md-nav__item">
<a href="../Service_pythonfiles/" title="Pod Service: Python File Server" class="md-nav__link">
Pod Service: Python File Server
</a>
</li>
<li class="md-nav__item">
<a href="../Service_gitea/" title="Pod Service: Gitea" class="md-nav__link">
Pod Service: Gitea
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../Running/" title="Running the Pod" class="md-nav__link">
Running the Pod
</a>
</li>
<li class="md-nav__item">
<a href="../Volumes/" title="Volumes" class="md-nav__link">
Volumes
</a>
</li>
<li class="md-nav__item">
<a href="../Backups/" title="Backups" class="md-nav__link">
Backups
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
Domains and Ports
</label>
<a href="./" title="Domains and Ports" class="md-nav__link md-nav__link--active">
Domains and Ports
</a>
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#domains" title="Domains" class="md-nav__link">
Domains
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#nginx-domain-handling" title="nginx domain handling" class="md-nav__link">
nginx domain handling
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#ports" title="Ports" class="md-nav__link">
Ports
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#overview" title="overview" class="md-nav__link">
overview
</a>
</li>
<li class="md-nav__item">
<a href="#nginx-ports" title="nginx ports" class="md-nav__link">
nginx ports
</a>
</li>
<li class="md-nav__item">
<a href="#mediawikiapache-ports" title="mediawiki/apache ports" class="md-nav__link">
mediawiki/apache ports
</a>
</li>
<li class="md-nav__item">
<a href="#phpmyadmin-ports" title="phpmyadmin ports" class="md-nav__link">
phpmyadmin ports
</a>
</li>
<li class="md-nav__item">
<a href="#mysql-ports" title="mysql ports" class="md-nav__link">
mysql ports
</a>
</li>
<li class="md-nav__item">
<a href="#gitea-ports" title="gitea ports" class="md-nav__link">
gitea ports
</a>
</li>
<li class="md-nav__item">
<a href="#python-file-server-ports" title="python file server ports" class="md-nav__link">
python file server ports
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../Secrets/" title="Secrets" class="md-nav__link">
Secrets
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#domains" title="Domains" class="md-nav__link">
Domains
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#nginx-domain-handling" title="nginx domain handling" class="md-nav__link">
nginx domain handling
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#ports" title="Ports" class="md-nav__link">
Ports
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#overview" title="overview" class="md-nav__link">
overview
</a>
</li>
<li class="md-nav__item">
<a href="#nginx-ports" title="nginx ports" class="md-nav__link">
nginx ports
</a>
</li>
<li class="md-nav__item">
<a href="#mediawikiapache-ports" title="mediawiki/apache ports" class="md-nav__link">
mediawiki/apache ports
</a>
</li>
<li class="md-nav__item">
<a href="#phpmyadmin-ports" title="phpmyadmin ports" class="md-nav__link">
phpmyadmin ports
</a>
</li>
<li class="md-nav__item">
<a href="#mysql-ports" title="mysql ports" class="md-nav__link">
mysql ports
</a>
</li>
<li class="md-nav__item">
<a href="#gitea-ports" title="gitea ports" class="md-nav__link">
gitea ports
</a>
</li>
<li class="md-nav__item">
<a href="#python-file-server-ports" title="python file server ports" class="md-nav__link">
python file server ports
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content">
<article class="md-content__inner md-typeset">
<h1 id="domains-and-ports">Domains and Ports<a class="headerlink" href="#domains-and-ports" title="Permanent link">&para;</a></h1>
<h2 id="domains">Domains<a class="headerlink" href="#domains" title="Permanent link">&para;</a></h2>
<p>There are three domains pointing to this server:</p>
<div class="codehilite"><pre><span></span>charlesreid1.com
charlesreid1.red
charlesreid1.blue
</pre></div>
<p>These are pointing to the server's IP address
using an A NAME DNS record.</p>
<p>There are also various subdomains set up
(www, git, files), all pointing to the
same location.</p>
<h3 id="nginx-domain-handling">nginx domain handling<a class="headerlink" href="#nginx-domain-handling" title="Permanent link">&para;</a></h3>
<p>Nginx handles all of the domains by specifying
a different <code>domain_name</code> in each <code>server{}</code> block
of the nginx config files.</p>
<p>For example:</p>
<div class="codehilite"><pre><span></span>server {
listen 80;
listen [::]:80;
server_name charlesreid1.com;
...
}
server {
listen 80;
listen [::]:80;
server_name charlesreid1.blue;
...
}
server {
listen 80;
listen [::]:80;
server_name charlesreid1.red;
...
}
</pre></div>
<p>See the <code>conf.d</code> dir of
<a href="https://git.charlesreid1.com/docker/d-nginx-charlesreid1">d-nginx-charlesreid1</a>.</p>
<p>We will cover this in the nginx ports section,
but all http urls are redirected to https urls.</p>
<h2 id="ports">Ports<a class="headerlink" href="#ports" title="Permanent link">&para;</a></h2>
<h3 id="overview">overview<a class="headerlink" href="#overview" title="Permanent link">&para;</a></h3>
<p>The apache-mediawiki combination is running an apache service listening on port 8989.
This can be adjusted, but should be adjusted in the Dockerfile, <code>ports.conf</code>, and <code>wiki.conf</code>.</p>
<p>The apache service listens on all interfaces (hence <code>*:8989</code> in the apache conf file),
but there is no port mapping specified in <code>docker-compose.yml</code> so it does not listen
on any public interfaces.</p>
<p>Thus, the wiki is not publicly accessible via port 8989, but the wiki is available via port 8989
to any container linked to, or connected to the same network as, the mediawiki apache container.</p>
<p>Meanwhile, the nginx container has a public interface listening on port 80
and another listening on port 443. nginx listens for requests going to
the wiki, detected via the url resource prefix being <code>/w/</code> or <code>/wiki/</code>,
and acts as a reverse proxy, forwarding the requests to Apache.</p>
<p>The user transparently sees everything happening via port 80 or (preferrably) 443,
but on the backend nginx is passing along the URL request and returning the result.</p>
<p>Subdomains are served via reverse proxy on port 7777+. </p>
<p>The webhook server is a flask server listening on port 50000.</p>
<h3 id="nginx-ports">nginx ports<a class="headerlink" href="#nginx-ports" title="Permanent link">&para;</a></h3>
<p>Also see <a href="../Service_nginx/">nginx service</a>.</p>
<p>Nginx has two main public-facing ports:
port 80 (HTTP) and port 443 (HTTPS).</p>
<p>All requests to <code>http://</code> urls go to port 80,
and all requests to <code>https://</code> urls go to port 443.</p>
<p>The server will automatically redirect all
requests to port 80 to port 443, turning all
http requests into https requests.</p>
<p>Nginx also exposes port 3000 and forwards it
along to <code>git.charlesreid1.com</code>. This is for
legacy reasons.</p>
<p>To work with MediaWiki, nginx must implement
rewrite rules: nginx listens for requests going
to wiki URLs (prefixed with <code>/w/</code> or <code>/wiki</code>)
and proxies those to the correct container.</p>
<h3 id="mediawikiapache-ports">mediawiki/apache ports<a class="headerlink" href="#mediawikiapache-ports" title="Permanent link">&para;</a></h3>
<p>Also see <a href="../Service_mediawiki/">mediawiki service</a>
and <a href="../Service_apachephp/">apache/php service</a>.</p>
<p>The MediaWiki server runs on a PHP and Apache stack.
Inside the MediaWiki container, Apache listens on
port 8989. This port only connects to the nginx container,
so nginx is the only service that can connect to MediaWiki,
and only over port 8989.</p>
<p>This nginx-apache connection is not encrypted
because it happens on the same machine. </p>
<p>When the user connects to the wiki, for example at the url</p>
<div class="codehilite"><pre><span></span>https://charlesreid1.com/wiki/Nmap
</pre></div>
<p>the user's connection is with the nginx server.
The session is an https session happening over port 443
and signed by nginx's certificates.</p>
<p>If the user goes to </p>
<div class="codehilite"><pre><span></span>http://charlesreid1.com/wiki/Nmap
</pre></div>
<p>on port 80, this is rewritten to</p>
<div class="codehilite"><pre><span></span>https://charlesreid1.com/wiki/Nmap
</pre></div>
<p>on port 443. In nginx, this is done with a 301:</p>
<div class="codehilite"><pre><span></span>server {
listen 80;
listen [::]:80;
server_name charlesreid1.com;
location / {
return 301 https://charlesreid1.com$request_uri;
}
}
</pre></div>
<p>Note that nginx plays the role of a central dispatcher
in the charlesreid1 pod - all containers connect to
nginx and only nginx, while nginx exposes each container
to the outside world via requests for various subdomains
being redirected to different ports.</p>
<h3 id="phpmyadmin-ports">phpmyadmin ports<a class="headerlink" href="#phpmyadmin-ports" title="Permanent link">&para;</a></h3>
<p>Also see <a href="../Service_phpmyadmin/">phpmyadmin service</a>.</p>
<p>phpMyAdmin provides a web interface for MySQL databases.</p>
<p>This follows a similar pattern to the MediaWiki Apache container:</p>
<ul>
<li>
<p>The phpMyAdmin container is connected to the MySQL container
via the docker network created by the <code>docker-compose</code> command
(no container links needed)</p>
</li>
<li>
<p>The phpMyAdmin container runs an HTTP web interface available inside
the container on port 80. This service is exposed on port 80 on the
internal docker network only.</p>
</li>
<li>
<p>Since phpMyAdmin only listens on the Docker pod network for incoming
requests, all requests to phpMyAdmin must come through nginx via
reverse proxy. These are forwarded to port 80 of the phpMyAdmin container
on the back end.</p>
</li>
<li>
<p>We keep phpMyAdmin disabled on a regular basis, as it is not
heavily used and provides access to sensitive data and operations.</p>
</li>
</ul>
<p>To control access to phpMyAdmin,
configure the <a href="../Service_nginx/">nginx service</a>
to whitelist certain IPs to access
phpMyAdmin (or shut off all access).</p>
<h3 id="mysql-ports">mysql ports<a class="headerlink" href="#mysql-ports" title="Permanent link">&para;</a></h3>
<p>Also see <a href="../Service_mysql/">mysql service</a>.</p>
<p>The MySQL container listens on port 3306 by default.
The container is only bound to the MediaWiki container,
so MediaWiki is the only service that can access MySQL.</p>
<h3 id="gitea-ports">gitea ports<a class="headerlink" href="#gitea-ports" title="Permanent link">&para;</a></h3>
<p>Also see <a href="../Service_gitea/">gitea service</a>.</p>
<p>Requests for the subdomain <code>git.charlesreid1.com</code>
are redirected to port 3000 on the docker internal
container network, where gitea is listening.</p>
<p>Like the MediaWiki and phpMyAdmin containers, this follows
the same reverse proxy pattern:</p>
<ul>
<li>The nginx service handles front-end requests and
reverse proxies those rquests to gitea over the
internal docker container network.</li>
<li>Gitea listens to port 3000 and is bound to the
local docker network only.</li>
<li>Gitea does not implement HTTP on the back end;
nginx handles HTTPS with client on the front end.</li>
</ul>
<h3 id="python-file-server-ports">python file server ports<a class="headerlink" href="#python-file-server-ports" title="Permanent link">&para;</a></h3>
<p>Also see <a href="../Service_pythonfiles/">python files service</a>.</p>
<p>We have a simple, lightweight Python HTTP server on port 8081
on the Docker network. This container runs the following Python
command to start the server:</p>
<div class="codehilite"><pre><span></span>python -m http.server -b &lt;bind-address&gt; 8081
</pre></div>
<p>This works because Python provides a built-in HTTP server
that, if no index.html file is present, will provide a
directory listing. This is as simple as it gets,
as far as file servers go.</p>
<p>This follows the same reverse proxy pattern:</p>
<ul>
<li>
<p>Python HTTP server listens for incoming requests
on port 8081 on the Docker network only. Client
requests are reverse proxied by <a href="https://git.charlesreid1.com/docker/d-nginx-charlesreid1">d-nginx-charlesreid1</a>
on the front end.</p>
</li>
<li>
<p>The server does not handle HTTPS, this is also
handled by the nginx container on the frontend.</p>
</li>
<li>
<p>The bind address and port of the Python HTTP server
are set in the command line. The <code>&lt;bind-address&gt;</code>
should be set to the name of the docker container image
(<code>stormy_files</code>).</p>
</li>
</ul>
<p>The command</p>
<div class="codehilite"><pre><span></span>python -m http.server -b stormy_files 8081
</pre></div>
<p>listens on port 8081 inside the python file server
container <code>stormy_files</code> (the container itself).</p>
<p>The nginx server reverse-proxies requests for
<a href="https://files.charlesreid1.com">https://files.charlesreid1.com</a>
and forwards them to the container.</p>
<p>Note: this container can be expanded to a container
that serves multiple directories on multiple ports
by using twisted. See the
<a href="https://git.charlesreid1.com/docker/d-python-helium">d-python-helium</a>
repository for an example.</p>
</article>
</div>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-nav">
<nav class="md-footer-nav__inner md-grid">
<a href="../Backups/" title="Backups" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
</div>
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Previous
</span>
Backups
</span>
</div>
</a>
<a href="../Secrets/" title="Secrets" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Next
</span>
Secrets
</span>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
</div>
</a>
</nav>
</div>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-footer-copyright">
<div class="md-footer-copyright__highlight">
Copyright &copy; 2018 <a href="https://charlesreid1.com">Charles Reid</a>, released under the <a href="https://opensource.org/licenses/MIT">MIT license</a>
</div>
powered by
<a href="https://www.mkdocs.org">MkDocs</a>
and
<a href="https://squidfunk.github.io/mkdocs-material/">
Material for MkDocs</a>
</div>
</div>
</div>
</footer>
</div>
<script src="../assets/javascripts/application.e72fd936.js"></script>
<script>app.initialize({version:"1.0.4",url:{base:".."}})</script>
<script src="../search/main.js"></script>
</body>
</html>

214
README.md

@ -1,214 +0,0 @@ @@ -1,214 +0,0 @@
# pod-charlesreid1
This repo contains a docker compose file
for running the charlesreid1.com site.
## Services
The services available through pod-charlesreid1 are:
* mediawiki
* apache + php
* mysql
* phpmyadmin
* nginx (Let's Encrypt used offline for SSL certificates)
* python
* gitea
## Links
See the documentation site here: <https://pages.charlesreid1.com/pod-charlesreid1>
Or visit [`docs/index.md`](/docs/index.md)
Source code on git.charlesreid1.com: <https://git.charlesreid1.com/docker/pod-charlesreid1>
Source code on github.com: <https://github.com/charlesreid1-docker/pod-charlesreid1>
## Quick Start
From your project directory, start up the pod:
```
$ docker-compose up
```
If you want to rebuild the images before starting them
(i.e., if you changed the Dockerfile and want to rebuild the
Docker image), use the `--build` flag:
```
$ docker-compose up --build
```
If you only want to rebuild the images without starting the
Docker pod, use the build verb:
```
$ docker-compose build
```
And finally, if you want to rebuild every container from scratch,
rather than using cached data (note that this may take a while),
add the `--no-cache` flag:
```
$ docker-compose build --no-cache
```
**IMPORTANT:** If you are not setting up the charlesreid1 pod using
ansible, you must also modify the contents of the following subdirectories
to render the templates in each submodule into usable configuration files.
* `d-mediawiki/charlesreid1-config/` - contains MediaWiki extensions and configuration
files for MediaWiki. See <https://github.com/charlesreid1-docker/charlesreid1-wiki-config>
for details.
* Build mediawiki extensions dir by running
`d-mediawiki/charlesreid1-config/build_extensions_dir.sh`
* Render mediawiki config template (`LocalSettings.php`) by running
`d-mediawiki/charlesreid1-config/mediawiki/apply_templates.py`
* Render apache config template (`charlesreid1.wiki.conf`) by running
`d-mediawiki/charlesreid1-config/apache/apply_templates.py`
* `d-nginx-charlesreid1/conf.d` - contains templates for nginx config files, but are not
rendered until the render templates script is run.
* Render nginx configuration file templates (`d-nginx-charlesreid1/conf.d/`)
by running `d-nginx-charlesreid1/apply_templates.py`
(note that this _should_ render templates into `d-nginx-charlesreid1/conf.d/`
but may actually render templates into `d-nginx-charlesreid1/conf.d_examples`,
in which case you need to copy the configuration files in the `conf.d_examples`
directory into the `conf.d` directory)
## Running
See **[Running.md](docs/Running.md)** for info about running this docker pod:
* Running the Docker Pod from Comand Line
* Running the Docker Pod as a Startup Service
* Workflow for Charlesreid1 Docker Pod Updates
* Restoring the Docker Pod from Backups
## Volumes
See **[Volumes.md](docs/Volumes.md)** for info about data and volumes
used by this docker pod:
* Persistent Data Volumes
* nginx
* nginx + lets encrypt ssl certificates
* nginx static content
* nginx bind-mounted files
* mysql
* mediawiki
* mediawiki data volume
* mediawiki bind-mounted files
* gitea
* gitea data volume
* gitea bind-mounted files
* python file server (pyfiles)
* pyfiles directory
## Backups
There are a number of directories containing utility scripts - these are mostly
dedicated to creating backups of any non-version-controlled data inside the container.
See **[Backups.md](docs/Backups.md)** for coverage of backup and utility scripts.
`utils-backups` - backup utilities (for cron jobs)
`utils-mw` - mediawiki backup utilities
`utils-mysql` mysql backup utilities
## Domains and Ports
See **[Domains and Ports.md](docs/Ports.md)** for info about top-level domain names
and ports used by this docker pod.
The domains ports document covers:
* Domains
* nginx domain handling
* Ports
* nginx ports
* mediawiki/apache ports
* phpmyadmin ports
* mysql ports
* gitea ports
* python file server ports
### Additional Port Info
The apache-mediawiki combination is running an apache service listening on port 8989.
This can be adjusted, but should be adjusted in the Dockerfile, `ports.conf`, and `wiki.conf`.
The apache service listens on all interfaces (hence `*:8989` in the apache conf file),
but there is no port mapping specified in `docker-compose.yml` so it does not listen
on any public interfaces.
Thus, the wiki is not publicly accessible via port 8989, but the wiki is available via port 8989
to any container linked to, or connected to the same network as, the mediawiki apache container.
Meanwhile, the nginx container has a public interface listening on port 80
and another listening on port 443. nginx listens for requests going to
the wiki, detected via the url resource prefix being `/w/` or `/wiki/`,
and acts as a reverse proxy, forwarding the requests to Apache.
The user transparently sees everything happening via port 80 or (preferrably) 443,
but on the backend nginx is passing along the URL request and returning the result.
Subdomains are served via reverse proxy on port 7777+.
The webhook server is a flask server listening on port 5000.
## Secrets
See **[Secrets.md](Secrets.md)** for more info about getting secrets like
passwords and sensitive files into various containers in the pod.
The important bit: we use `root.password` to store the password, and pass it
into containers as an environment variable. Only this top-level pod-charlesreid1
repo should use the file `root.password`.
Details covered on the secrets page:
* mysql database root password
* mediawiki mysql database root password
* gitea secret key and session id
* nginx ssl certificates
## Container-Specific Configuration Details
Each container has a different way of getting
configuration files into the container.
In the following documents we cover
the specifics of each container.
* [mediawiki](Service_mediawiki.md)
* [apache + php](Service_apachephp.md)
* [mysql](Service_mysql.md)
* [phpmyadmin](Service_phpmyadmin.md)
* [nginx + ssl](Service_nginx.md)
* [python](Service_pythonfiles.md)
* [gitea](Service_gitea.md)
## Links
docker compose documentation:
* [getting started](https://docs.docker.com/compose/gettingstarted/#step-4-build-and-run-your-app-with-compose)
* [set environment variables in containers](https://docs.docker.com/compose/environment-variables/#set-environment-variables-in-containers)

823
Running/index.html

@ -0,0 +1,823 @@ @@ -0,0 +1,823 @@
<!DOCTYPE html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<link rel="canonical" href="https://pages.charlesreid1.com/pod-charlesreid1/Running/">
<meta name="lang:clipboard.copy" content="Copy to clipboard">
<meta name="lang:clipboard.copied" content="Copied to clipboard">
<meta name="lang:search.language" content="en">
<meta name="lang:search.pipeline.stopwords" content="True">
<meta name="lang:search.pipeline.trimmer" content="True">
<meta name="lang:search.result.none" content="No matching documents">
<meta name="lang:search.result.one" content="1 matching document">
<meta name="lang:search.result.other" content="# matching documents">
<meta name="lang:search.tokenizer" content="[\s\-]+">
<link rel="shortcut icon" href="..">
<meta name="generator" content="mkdocs-1.0.4, mkdocs-material-3.0.3">
<title>Running the Pod - pod-charlesreid1</title>
<link rel="stylesheet" href="../assets/stylesheets/application.451f80e5.css">
<link rel="stylesheet" href="../assets/stylesheets/application-palette.22915126.css">
<meta name="theme-color" content="#2196f3">
<script src="../assets/javascripts/modernizr.1aa3b519.js"></script>
<link href="https://fonts.gstatic.com" rel="preconnect" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
<style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
<link rel="stylesheet" href="../assets/fonts/material-icons.css">
<link rel="stylesheet" href="../css/custom.css">
</head>
<body dir="ltr" data-md-color-primary="blue" data-md-color-accent="blue">
<svg class="md-svg">
<defs>
</defs>
</svg>
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" data-md-component="overlay" for="__drawer"></label>
<a href="../#running-the-charlesreid1-docker-pod" tabindex="1" class="md-skip">
Skip to content
</a>
<header class="md-header" data-md-component="header">
<nav class="md-header-nav md-grid">
<div class="md-flex">
<div class="md-flex__cell md-flex__cell--shrink">
<a href="https://pages.charlesreid1.com/pod-charlesreid1" title="pod-charlesreid1" class="md-header-nav__button md-logo">
<i class="md-icon">dns</i>
</a>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--menu md-header-nav__button" for="__drawer"></label>
</div>
<div class="md-flex__cell md-flex__cell--stretch">
<div class="md-flex__ellipsis md-header-nav__title" data-md-component="title">
<span class="md-header-nav__topic">
pod-charlesreid1
</span>
<span class="md-header-nav__topic">
Running the Pod
</span>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--search md-header-nav__button" for="__search"></label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query" data-md-state="active">
<label class="md-icon md-search__icon" for="__search"></label>
<button type="reset" class="md-icon md-search__icon" data-md-component="reset" tabindex="-1">
&#xE5CD;
</button>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="result">
<div class="md-search-result__meta">
Type to start searching
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<div class="md-header-nav__source">
<a href="https://git.charlesreid1.com/docker/pod-charlesreid1" title="Go to repository" class="md-source" data-md-source="">
<div class="md-source__repository">
pod-charlesreid1
</div>
</a>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container">
<main class="md-main">
<div class="md-main__inner md-grid" data-md-component="container">
<div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" data-md-level="0">
<label class="md-nav__title md-nav__title--site" for="__drawer">
<a href="https://pages.charlesreid1.com/pod-charlesreid1" title="pod-charlesreid1" class="md-nav__button md-logo">
<i class="md-icon">dns</i>
</a>
pod-charlesreid1
</label>
<div class="md-nav__source">
<a href="https://git.charlesreid1.com/docker/pod-charlesreid1" title="Go to repository" class="md-source" data-md-source="">
<div class="md-source__repository">
pod-charlesreid1
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href=".." title="Index" class="md-nav__link">
Index
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
<label class="md-nav__link" for="nav-2">
Services
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-2">
Services
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../Service_mediawiki/" title="Pod Service: MediaWiki" class="md-nav__link">
Pod Service: MediaWiki
</a>
</li>
<li class="md-nav__item">
<a href="../Service_apachephp/" title="Pod Service: Apache/PHP" class="md-nav__link">
Pod Service: Apache/PHP
</a>
</li>
<li class="md-nav__item">
<a href="../Service_mysql/" title="Pod Service: MySQL" class="md-nav__link">
Pod Service: MySQL
</a>
</li>
<li class="md-nav__item">
<a href="../Service_phpmyadmin/" title="Pod Service: phpMyAdmin" class="md-nav__link">
Pod Service: phpMyAdmin
</a>
</li>
<li class="md-nav__item">
<a href="../Service_nginx/" title="Pod Service: nginx" class="md-nav__link">
Pod Service: nginx
</a>
</li>
<li class="md-nav__item">
<a href="../Service_pythonfiles/" title="Pod Service: Python File Server" class="md-nav__link">
Pod Service: Python File Server
</a>
</li>
<li class="md-nav__item">
<a href="../Service_gitea/" title="Pod Service: Gitea" class="md-nav__link">
Pod Service: Gitea
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
Running the Pod
</label>
<a href="./" title="Running the Pod" class="md-nav__link md-nav__link--active">
Running the Pod
</a>
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#the-docker-compose-file" title="The Docker Compose File" class="md-nav__link">
The Docker Compose File
</a>
</li>
<li class="md-nav__item">
<a href="#running-charlesreid1-docker-pod-from-command-line" title="Running Charlesreid1 Docker Pod from Command Line" class="md-nav__link">
Running Charlesreid1 Docker Pod from Command Line
</a>
</li>
<li class="md-nav__item">
<a href="#running-charlesreid1-docker-pod-as-startup-service" title="Running Charlesreid1 Docker Pod as Startup Service" class="md-nav__link">
Running Charlesreid1 Docker Pod as Startup Service
</a>
</li>
<li class="md-nav__item">
<a href="#workflow-for-charlesreid1-docker-pod-updates" title="Workflow for Charlesreid1 Docker Pod Updates" class="md-nav__link">
Workflow for Charlesreid1 Docker Pod Updates
</a>
</li>
<li class="md-nav__item">
<a href="#restoring-docker-pod-from-backups" title="Restoring Docker Pod from Backups" class="md-nav__link">
Restoring Docker Pod from Backups
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mysql-restore" title="mysql restore" class="md-nav__link">
mysql restore
</a>
</li>
<li class="md-nav__item">
<a href="#mediawiki-restore" title="mediawiki restore" class="md-nav__link">
mediawiki restore
</a>
</li>
<li class="md-nav__item">
<a href="#gitea-restore" title="gitea restore" class="md-nav__link">
gitea restore
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../Volumes/" title="Volumes" class="md-nav__link">
Volumes
</a>
</li>
<li class="md-nav__item">
<a href="../Backups/" title="Backups" class="md-nav__link">
Backups
</a>
</li>
<li class="md-nav__item">
<a href="../Ports/" title="Domains and Ports" class="md-nav__link">
Domains and Ports
</a>
</li>
<li class="md-nav__item">
<a href="../Secrets/" title="Secrets" class="md-nav__link">
Secrets
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#the-docker-compose-file" title="The Docker Compose File" class="md-nav__link">
The Docker Compose File
</a>
</li>
<li class="md-nav__item">
<a href="#running-charlesreid1-docker-pod-from-command-line" title="Running Charlesreid1 Docker Pod from Command Line" class="md-nav__link">
Running Charlesreid1 Docker Pod from Command Line
</a>
</li>
<li class="md-nav__item">
<a href="#running-charlesreid1-docker-pod-as-startup-service" title="Running Charlesreid1 Docker Pod as Startup Service" class="md-nav__link">
Running Charlesreid1 Docker Pod as Startup Service
</a>
</li>
<li class="md-nav__item">
<a href="#workflow-for-charlesreid1-docker-pod-updates" title="Workflow for Charlesreid1 Docker Pod Updates" class="md-nav__link">
Workflow for Charlesreid1 Docker Pod Updates
</a>
</li>
<li class="md-nav__item">
<a href="#restoring-docker-pod-from-backups" title="Restoring Docker Pod from Backups" class="md-nav__link">
Restoring Docker Pod from Backups
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mysql-restore" title="mysql restore" class="md-nav__link">
mysql restore
</a>
</li>
<li class="md-nav__item">
<a href="#mediawiki-restore" title="mediawiki restore" class="md-nav__link">
mediawiki restore
</a>
</li>
<li class="md-nav__item">
<a href="#gitea-restore" title="gitea restore" class="md-nav__link">
gitea restore
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content">
<article class="md-content__inner md-typeset">
<h1 id="running-the-charlesreid1-docker-pod">Running the Charlesreid1 Docker Pod<a class="headerlink" href="#running-the-charlesreid1-docker-pod" title="Permanent link">&para;</a></h1>
<p>This docker pod runs the main charlesreid1.com site.
To run the pod, use the <code>docker-compose</code> command.</p>
<h2 id="the-docker-compose-file">The Docker Compose File<a class="headerlink" href="#the-docker-compose-file" title="Permanent link">&para;</a></h2>
<p>The <code>docker-compose.yml</code> file contains all the directives needed
to run a docker pod of containers that make Charlesreid1.com work.</p>
<p>Why use docker-compose instead of docker?
docker-compose is the preferred way to run multiple containers.</p>
<p><strong>Huh? Where's docker-compose.yml??</strong></p>
<p>Instead of a <code>docker-compose.yml</code> file,
you'll see a <code>docker-compose.fixme.yml</code> file.
You need to fix this YML file by hard-coding your
MYSQL password in the file.</p>
<p>(There is also a Jinja template, <code>docker-compose.yml.j2</code>,
usable with <a href="https://git.charlesreid1.com/charlesreid1/charlesreid1-ansible">charlesreid1-ansible</a>.)</p>
<p>See the steps below for using the "fixme" file.</p>
<p><a name="RunningCLI"></a></p>
<h2 id="running-charlesreid1-docker-pod-from-command-line">Running Charlesreid1 Docker Pod from Command Line<a class="headerlink" href="#running-charlesreid1-docker-pod-from-command-line" title="Permanent link">&para;</a></h2>
<p>We start by covering how to run the docker pod from the command line.</p>
<p>First, set the MySQL password using a sed one-liner:</p>
<div class="codehilite"><pre><span></span>$ sed &quot;s/REPLACEME/YoFooThisIsYourNewPassword/&quot; docker-compose.fixme.yml &gt; docker-compose.yml
</pre></div>
<p>Now you can run the container pod with</p>
<div class="codehilite"><pre><span></span>docker-compose up # interactive
docker-compose up -d # detached
</pre></div>
<p>or, if you want to rebuild all the containers before running up,</p>
<div class="codehilite"><pre><span></span>docker-compose up --build
</pre></div>
<p>If you just want to rebuild the containers,</p>
<div class="codehilite"><pre><span></span>docker-compose build
</pre></div>
<p>and this will rebuild the containers from scratch:</p>
<div class="codehilite"><pre><span></span>docker-compose build --no-cache
</pre></div>
<p><strong><em>WARNING:</em></strong> for large, complicated container images,
this command can take a very long time.
Use with care.)</p>
<p>You can restart all containers in a pod using the restart command:</p>
<div class="codehilite"><pre><span></span>docker-compose restart
</pre></div>
<p><strong><em>WARNING:</em></strong> this will <strong><em>NOT</em></strong> pick up changes to
Dockerfiles or to files that are mounted into the container.
This simply restarts the container using the same image
(in memory) that was previously running, <strong><em>without</em></strong>
getting an up-to-date container image.</p>
<p><a name="RunningService"></a></p>
<h2 id="running-charlesreid1-docker-pod-as-startup-service">Running Charlesreid1 Docker Pod as Startup Service<a class="headerlink" href="#running-charlesreid1-docker-pod-as-startup-service" title="Permanent link">&para;</a></h2>
<p>If you want to run the pod as a startup service,
see the <code>scripts/</code> folder for a startup service
that can be used with systemd. This is also included
below:</p>
<p><strong><code>pod-charlesreid1.service:</code></strong></p>
<div class="codehilite"><pre><span></span>[Unit]
Description=charlesreid1 docker pod
Requires=docker.service
After=docker.service
[Service]
Restart=always
ExecStart=/usr/local/bin/docker-compose -f /home/charles/codes/docker/pod-charlesreid1/docker-compose.yml up
ExecStop=/usr/local/bin/docker-compose -f /home/charles/codes/docker/pod-charlesreid1/docker-compose.yml stop
[Install]
WantedBy=default.target
</pre></div>
<p>Now install the service to <code>/etc/systemd/system/pod-charlesreid1.servce</code>,
and activate it:</p>
<div class="codehilite"><pre><span></span>sudo systemctl enable pod-charlesreid1.service
</pre></div>
<p>Now you can start/stop the service with:</p>
<div class="codehilite"><pre><span></span>sudo systemctl (start|stop) pod-charlesreid1.service
</pre></div>
<p>NOTE: if you need to debug the containers,
or update any config files copied into the container,
be sure and stop the service before doing a
<code>docker-compose stop</code> or a <code>docker-compose up --build</code>,
otherwise the pod will continually respawn.</p>
<p><a name="Workflow"></a></p>
<h2 id="workflow-for-charlesreid1-docker-pod-updates">Workflow for Charlesreid1 Docker Pod Updates<a class="headerlink" href="#workflow-for-charlesreid1-docker-pod-updates" title="Permanent link">&para;</a></h2>
<p>This section covers a workflow if you're updating the docker pod.</p>
<p>As noted above, a simple <code>docker-compose restart</code> won't pick up
changes in Dockerfiles or files mounted into the image, so
you often need to stop the containers and restart them after
rebuilding the container images.</p>
<p>However, if you update your files (particularly if you add a lot of new
apt packages), it can take a long time to build the containers.
This can result in a lot of downtime if you take the containers down
before rebuilding them.</p>
<p>To minimize downtime, use the following workflow:</p>
<ul>
<li>Run <code>docker-compose build</code> to rebuild the images, leaving the pod running (they are not affected)</li>
<li>Run <code>docker-compose down</code> to bring the pod down</li>
<li>Run <code>docker-compose up</code> to bring the pod up</li>
</ul>
<p>It may take a few seconds to bring the pod down,
and that will be your total amount of downtime.</p>
<p><a name="Backups"></a></p>
<h2 id="restoring-docker-pod-from-backups">Restoring Docker Pod from Backups<a class="headerlink" href="#restoring-docker-pod-from-backups" title="Permanent link">&para;</a></h2>
<p>Also see <strong><a href="../Backups/">Backups.md</a></strong>.</p>
<p>Now that the pod is running, you probably need to seed it with data.</p>
<p>You will need two mediawiki restore files and two gitea restore files,
everything else comes from git.charlesreid1.com or github.com
(this will create a bootstrapping problem if you have no git.charlesreid1.com):</p>
<ul>
<li>MediaWiki database backup</li>
<li>MediaWiki files (images) backup</li>
<li>Gitea dump zip file</li>
<li>Gitea avatars zip file</li>
</ul>
<p>Now you can restore the database as follows:</p>
<ul>
<li>MySQL database restore scripts for MediaWiki are in <code>utils-mysql/</code> dir</li>
<li>MediaWiki image directory restore scripts are in <code>utils-mw/</code> dir</li>
<li>Gitea database and avatars come from backups using scripts in <code>utils-gitea/</code> dir</li>
</ul>
<h3 id="mysql-restore">mysql restore<a class="headerlink" href="#mysql-restore" title="Permanent link">&para;</a></h3>
<p>To restore a database from a dump:</p>
<div class="codehilite"><pre><span></span>cd utils-mysql/
./restore_database.sh /path/to/dump/wikidb.sql
</pre></div>
<p>The MySQL container must be running for this to work.
(You may need to adjust the MySQL container name in the script.)</p>
<h3 id="mediawiki-restore">mediawiki restore<a class="headerlink" href="#mediawiki-restore" title="Permanent link">&para;</a></h3>
<p>To restore the MediaWiki images directory:</p>
<div class="codehilite"><pre><span></span>cd utils-mw/
./restore_wikifiles.sh /path/to/wikifiles.tar.gz
</pre></div>
<h3 id="gitea-restore">gitea restore<a class="headerlink" href="#gitea-restore" title="Permanent link">&para;</a></h3>
<p>The gitea container can be restored from a backup as follows:</p>
<div class="codehilite"><pre><span></span>cd utils-gitea/
./restore_gitea.sh /path/to/gitea-dump.zip /path/to/gitea-avatars.zip
</pre></div>
</article>
</div>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-nav">
<nav class="md-footer-nav__inner md-grid">
<a href="../Service_gitea/" title="Pod Service: Gitea" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
</div>
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Previous
</span>
Pod Service: Gitea
</span>
</div>
</a>
<a href="../Volumes/" title="Volumes" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Next
</span>
Volumes
</span>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
</div>
</a>
</nav>
</div>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-footer-copyright">
<div class="md-footer-copyright__highlight">
Copyright &copy; 2018 <a href="https://charlesreid1.com">Charles Reid</a>, released under the <a href="https://opensource.org/licenses/MIT">MIT license</a>
</div>
powered by
<a href="https://www.mkdocs.org">MkDocs</a>
and
<a href="https://squidfunk.github.io/mkdocs-material/">
Material for MkDocs</a>
</div>
</div>
</div>
</footer>
</div>
<script src="../assets/javascripts/application.e72fd936.js"></script>
<script>app.initialize({version:"1.0.4",url:{base:".."}})</script>
<script src="../search/main.js"></script>
</body>
</html>

628
Secrets/index.html

@ -0,0 +1,628 @@ @@ -0,0 +1,628 @@
<!DOCTYPE html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<link rel="canonical" href="https://pages.charlesreid1.com/pod-charlesreid1/Secrets/">
<meta name="lang:clipboard.copy" content="Copy to clipboard">
<meta name="lang:clipboard.copied" content="Copied to clipboard">
<meta name="lang:search.language" content="en">
<meta name="lang:search.pipeline.stopwords" content="True">
<meta name="lang:search.pipeline.trimmer" content="True">
<meta name="lang:search.result.none" content="No matching documents">
<meta name="lang:search.result.one" content="1 matching document">
<meta name="lang:search.result.other" content="# matching documents">
<meta name="lang:search.tokenizer" content="[\s\-]+">
<link rel="shortcut icon" href="..">
<meta name="generator" content="mkdocs-1.0.4, mkdocs-material-3.0.3">
<title>Secrets - pod-charlesreid1</title>
<link rel="stylesheet" href="../assets/stylesheets/application.451f80e5.css">
<link rel="stylesheet" href="../assets/stylesheets/application-palette.22915126.css">
<meta name="theme-color" content="#2196f3">
<script src="../assets/javascripts/modernizr.1aa3b519.js"></script>
<link href="https://fonts.gstatic.com" rel="preconnect" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
<style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
<link rel="stylesheet" href="../assets/fonts/material-icons.css">
<link rel="stylesheet" href="../css/custom.css">
</head>
<body dir="ltr" data-md-color-primary="blue" data-md-color-accent="blue">
<svg class="md-svg">
<defs>
</defs>
</svg>
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" data-md-component="overlay" for="__drawer"></label>
<a href="../#secrets" tabindex="1" class="md-skip">
Skip to content
</a>
<header class="md-header" data-md-component="header">
<nav class="md-header-nav md-grid">
<div class="md-flex">
<div class="md-flex__cell md-flex__cell--shrink">
<a href="https://pages.charlesreid1.com/pod-charlesreid1" title="pod-charlesreid1" class="md-header-nav__button md-logo">
<i class="md-icon">dns</i>
</a>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--menu md-header-nav__button" for="__drawer"></label>
</div>
<div class="md-flex__cell md-flex__cell--stretch">
<div class="md-flex__ellipsis md-header-nav__title" data-md-component="title">
<span class="md-header-nav__topic">
pod-charlesreid1
</span>
<span class="md-header-nav__topic">
Secrets
</span>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--search md-header-nav__button" for="__search"></label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query" data-md-state="active">
<label class="md-icon md-search__icon" for="__search"></label>
<button type="reset" class="md-icon md-search__icon" data-md-component="reset" tabindex="-1">
&#xE5CD;
</button>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="result">
<div class="md-search-result__meta">
Type to start searching
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<div class="md-header-nav__source">
<a href="https://git.charlesreid1.com/docker/pod-charlesreid1" title="Go to repository" class="md-source" data-md-source="">
<div class="md-source__repository">
pod-charlesreid1
</div>
</a>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container">
<main class="md-main">
<div class="md-main__inner md-grid" data-md-component="container">
<div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" data-md-level="0">
<label class="md-nav__title md-nav__title--site" for="__drawer">
<a href="https://pages.charlesreid1.com/pod-charlesreid1" title="pod-charlesreid1" class="md-nav__button md-logo">
<i class="md-icon">dns</i>
</a>
pod-charlesreid1
</label>
<div class="md-nav__source">
<a href="https://git.charlesreid1.com/docker/pod-charlesreid1" title="Go to repository" class="md-source" data-md-source="">
<div class="md-source__repository">
pod-charlesreid1
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href=".." title="Index" class="md-nav__link">
Index
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
<label class="md-nav__link" for="nav-2">
Services
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-2">
Services
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../Service_mediawiki/" title="Pod Service: MediaWiki" class="md-nav__link">
Pod Service: MediaWiki
</a>
</li>
<li class="md-nav__item">
<a href="../Service_apachephp/" title="Pod Service: Apache/PHP" class="md-nav__link">
Pod Service: Apache/PHP
</a>
</li>
<li class="md-nav__item">
<a href="../Service_mysql/" title="Pod Service: MySQL" class="md-nav__link">
Pod Service: MySQL
</a>
</li>
<li class="md-nav__item">
<a href="../Service_phpmyadmin/" title="Pod Service: phpMyAdmin" class="md-nav__link">
Pod Service: phpMyAdmin
</a>
</li>
<li class="md-nav__item">
<a href="../Service_nginx/" title="Pod Service: nginx" class="md-nav__link">
Pod Service: nginx
</a>
</li>
<li class="md-nav__item">
<a href="../Service_pythonfiles/" title="Pod Service: Python File Server" class="md-nav__link">
Pod Service: Python File Server
</a>
</li>
<li class="md-nav__item">
<a href="../Service_gitea/" title="Pod Service: Gitea" class="md-nav__link">
Pod Service: Gitea
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../Running/" title="Running the Pod" class="md-nav__link">
Running the Pod
</a>
</li>
<li class="md-nav__item">
<a href="../Volumes/" title="Volumes" class="md-nav__link">
Volumes
</a>
</li>
<li class="md-nav__item">
<a href="../Backups/" title="Backups" class="md-nav__link">
Backups
</a>
</li>
<li class="md-nav__item">
<a href="../Ports/" title="Domains and Ports" class="md-nav__link">
Domains and Ports
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
Secrets
</label>
<a href="./" title="Secrets" class="md-nav__link md-nav__link--active">
Secrets
</a>
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#mysql-password" title="MySQL Password" class="md-nav__link">
MySQL Password
</a>
</li>
<li class="md-nav__item">
<a href="#nginx-ssl-certificates" title="Nginx SSL Certificates" class="md-nav__link">
Nginx SSL Certificates
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#mysql-password" title="MySQL Password" class="md-nav__link">
MySQL Password
</a>
</li>
<li class="md-nav__item">
<a href="#nginx-ssl-certificates" title="Nginx SSL Certificates" class="md-nav__link">
Nginx SSL Certificates
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content">
<article class="md-content__inner md-typeset">
<h1 id="secrets">Secrets<a class="headerlink" href="#secrets" title="Permanent link">&para;</a></h1>
<h2 id="mysql-password">MySQL Password<a class="headerlink" href="#mysql-password" title="Permanent link">&para;</a></h2>
<p>The MySQL password has to get into the MySQL
and MediaWiki containers. To do this, we
hard-code the MySQL password as an environment
variable in <code>docker-compose.yml</code>.</p>
<p>The file <code>docker-compose.fixme.yml</code> contains
the placeholder <code>REPLACEME</code> where the MySQL
password goes. </p>
<p>To create a <code>docker-compose.yml</code>
from <code>docker-compose.fixme.yml</code>:</p>
<div class="codehilite"><pre><span></span>$ sed &quot;s/REPLACEME/YoFooThisIsYourNewPassword/&quot; docker-compose.fixme.yml &gt; docker-compose.yml
</pre></div>
<p>Great if you hard-code the password, but -
wasn't that the whole thing
we were trying to avoid?</p>
<p>Put the password into a file istead,
then grab the password from that file
and do a find/replace on the docker
compose file:</p>
<div class="codehilite"><pre><span></span>$ cat root.password
mysecretpassword
$ sed &quot;s/REPLACEME/`cat root.password`/&quot; docker-compose.fixme.yml &gt; docker-compose.yml
</pre></div>
<p>The <code>docker-compose.yml</code> file and <code>root.password</code> files are both ignored
by version control.</p>
<h2 id="nginx-ssl-certificates">Nginx SSL Certificates<a class="headerlink" href="#nginx-ssl-certificates" title="Permanent link">&para;</a></h2>
<p>The other secrets we need to get into the container are
the SSL certificates for the nginx container.</p>
<p>To generate the SSL certificates using Let's Encrypt,
use the script in the <a href="https://git.charlesreid1.com/charlesreid1/certbot">certbot</a>
directory. These will be stored on the host machine
at <code>/etc/letsencrypt/live/example.com/*</code>.</p>
<p>To mount the certificates in the directory,
we bind-mount the entire <code>/etc/letsencrypt/</code> directory
into the container with the following line
in the docker-compose file:</p>
<div class="codehilite"><pre><span></span>services:
...
stormy_nginx:
...
volumes:
- &quot;/etc/letsencrypt:/etc/letsencrypt&quot;
...
</pre></div>
<p>Meanwhile, in the nginx configuration file
that's mounted into the container, we have
the following in the SSL server blocks
(see <a href="https://git.charlesreid1.com/docker/d-nginx-charlesreid1">docker/d-nginx-charlesreid1</a>):</p>
<div class="codehilite"><pre><span></span>server {
# https://charlesreid1.com
listen 443;
listen [::]:443;
server_name charlesreid1.com;
ssl on;
ssl_certificate /etc/letsencrypt/live/charlesreid1.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/charlesreid1.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
...
}
</pre></div>
</article>
</div>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-nav">
<nav class="md-footer-nav__inner md-grid">
<a href="../Ports/" title="Domains and Ports" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
</div>
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Previous
</span>
Domains and Ports
</span>
</div>
</a>
</nav>
</div>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-footer-copyright">
<div class="md-footer-copyright__highlight">
Copyright &copy; 2018 <a href="https://charlesreid1.com">Charles Reid</a>, released under the <a href="https://opensource.org/licenses/MIT">MIT license</a>
</div>
powered by
<a href="https://www.mkdocs.org">MkDocs</a>
and
<a href="https://squidfunk.github.io/mkdocs-material/">
Material for MkDocs</a>
</div>
</div>
</div>
</footer>
</div>
<script src="../assets/javascripts/application.e72fd936.js"></script>
<script>app.initialize({version:"1.0.4",url:{base:".."}})</script>
<script src="../search/main.js"></script>
</body>
</html>

633
Service_apachephp/index.html

@ -0,0 +1,633 @@ @@ -0,0 +1,633 @@
<!DOCTYPE html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<link rel="canonical" href="https://pages.charlesreid1.com/pod-charlesreid1/Service_apachephp/">
<meta name="lang:clipboard.copy" content="Copy to clipboard">
<meta name="lang:clipboard.copied" content="Copied to clipboard">
<meta name="lang:search.language" content="en">
<meta name="lang:search.pipeline.stopwords" content="True">
<meta name="lang:search.pipeline.trimmer" content="True">
<meta name="lang:search.result.none" content="No matching documents">
<meta name="lang:search.result.one" content="1 matching document">
<meta name="lang:search.result.other" content="# matching documents">
<meta name="lang:search.tokenizer" content="[\s\-]+">
<link rel="shortcut icon" href="..">
<meta name="generator" content="mkdocs-1.0.4, mkdocs-material-3.0.3">
<title>Pod Service: Apache/PHP - pod-charlesreid1</title>
<link rel="stylesheet" href="../assets/stylesheets/application.451f80e5.css">
<link rel="stylesheet" href="../assets/stylesheets/application-palette.22915126.css">
<meta name="theme-color" content="#2196f3">
<script src="../assets/javascripts/modernizr.1aa3b519.js"></script>
<link href="https://fonts.gstatic.com" rel="preconnect" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
<style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
<link rel="stylesheet" href="../assets/fonts/material-icons.css">
<link rel="stylesheet" href="../css/custom.css">
</head>
<body dir="ltr" data-md-color-primary="blue" data-md-color-accent="blue">
<svg class="md-svg">
<defs>
</defs>
</svg>
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" data-md-component="overlay" for="__drawer"></label>
<a href="../#apache-php" tabindex="1" class="md-skip">
Skip to content
</a>
<header class="md-header" data-md-component="header">
<nav class="md-header-nav md-grid">
<div class="md-flex">
<div class="md-flex__cell md-flex__cell--shrink">
<a href="https://pages.charlesreid1.com/pod-charlesreid1" title="pod-charlesreid1" class="md-header-nav__button md-logo">
<i class="md-icon">dns</i>
</a>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--menu md-header-nav__button" for="__drawer"></label>
</div>
<div class="md-flex__cell md-flex__cell--stretch">
<div class="md-flex__ellipsis md-header-nav__title" data-md-component="title">
<span class="md-header-nav__topic">
pod-charlesreid1
</span>
<span class="md-header-nav__topic">
Pod Service: Apache/PHP
</span>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--search md-header-nav__button" for="__search"></label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query" data-md-state="active">
<label class="md-icon md-search__icon" for="__search"></label>
<button type="reset" class="md-icon md-search__icon" data-md-component="reset" tabindex="-1">
&#xE5CD;
</button>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="result">
<div class="md-search-result__meta">
Type to start searching
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<div class="md-header-nav__source">
<a href="https://git.charlesreid1.com/docker/pod-charlesreid1" title="Go to repository" class="md-source" data-md-source="">
<div class="md-source__repository">
pod-charlesreid1
</div>
</a>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container">
<main class="md-main">
<div class="md-main__inner md-grid" data-md-component="container">
<div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" data-md-level="0">
<label class="md-nav__title md-nav__title--site" for="__drawer">
<a href="https://pages.charlesreid1.com/pod-charlesreid1" title="pod-charlesreid1" class="md-nav__button md-logo">
<i class="md-icon">dns</i>
</a>
pod-charlesreid1
</label>
<div class="md-nav__source">
<a href="https://git.charlesreid1.com/docker/pod-charlesreid1" title="Go to repository" class="md-source" data-md-source="">
<div class="md-source__repository">
pod-charlesreid1
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href=".." title="Index" class="md-nav__link">
Index
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2" checked>
<label class="md-nav__link" for="nav-2">
Services
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-2">
Services
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../Service_mediawiki/" title="Pod Service: MediaWiki" class="md-nav__link">
Pod Service: MediaWiki
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
Pod Service: Apache/PHP
</label>
<a href="./" title="Pod Service: Apache/PHP" class="md-nav__link md-nav__link--active">
Pod Service: Apache/PHP
</a>
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#configuration-files-and-folders" title="Configuration Files and Folders" class="md-nav__link">
Configuration Files and Folders
</a>
</li>
<li class="md-nav__item">
<a href="#where-does-stuff-live" title="Where Does Stuff Live?" class="md-nav__link">
Where Does Stuff Live?
</a>
</li>
<li class="md-nav__item">
<a href="#getting-stuff-into-the-container" title="Getting Stuff Into The Container" class="md-nav__link">
Getting Stuff Into The Container
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../Service_mysql/" title="Pod Service: MySQL" class="md-nav__link">
Pod Service: MySQL
</a>
</li>
<li class="md-nav__item">
<a href="../Service_phpmyadmin/" title="Pod Service: phpMyAdmin" class="md-nav__link">
Pod Service: phpMyAdmin
</a>
</li>
<li class="md-nav__item">
<a href="../Service_nginx/" title="Pod Service: nginx" class="md-nav__link">
Pod Service: nginx
</a>
</li>
<li class="md-nav__item">
<a href="../Service_pythonfiles/" title="Pod Service: Python File Server" class="md-nav__link">
Pod Service: Python File Server
</a>
</li>
<li class="md-nav__item">
<a href="../Service_gitea/" title="Pod Service: Gitea" class="md-nav__link">
Pod Service: Gitea
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../Running/" title="Running the Pod" class="md-nav__link">
Running the Pod
</a>
</li>
<li class="md-nav__item">
<a href="../Volumes/" title="Volumes" class="md-nav__link">
Volumes
</a>
</li>
<li class="md-nav__item">
<a href="../Backups/" title="Backups" class="md-nav__link">
Backups
</a>
</li>
<li class="md-nav__item">
<a href="../Ports/" title="Domains and Ports" class="md-nav__link">
Domains and Ports
</a>
</li>
<li class="md-nav__item">
<a href="../Secrets/" title="Secrets" class="md-nav__link">
Secrets
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#configuration-files-and-folders" title="Configuration Files and Folders" class="md-nav__link">
Configuration Files and Folders
</a>
</li>
<li class="md-nav__item">
<a href="#where-does-stuff-live" title="Where Does Stuff Live?" class="md-nav__link">
Where Does Stuff Live?
</a>
</li>
<li class="md-nav__item">
<a href="#getting-stuff-into-the-container" title="Getting Stuff Into The Container" class="md-nav__link">
Getting Stuff Into The Container
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content">
<article class="md-content__inner md-typeset">
<h1 id="apache-php">Apache + PHP<a class="headerlink" href="#apache-php" title="Permanent link">&para;</a></h1>
<p>This describes the container-specific
details of the Apache part of the
Apache-MediaWiki container.</p>
<p>Also see <a href="/Service_mediawiki.md">MediaWiki</a>.</p>
<h2 id="configuration-files-and-folders">Configuration Files and Folders<a class="headerlink" href="#configuration-files-and-folders" title="Permanent link">&para;</a></h2>
<p>We have two Apache configuration files
to set up Apache:</p>
<ul>
<li><code>ports.conf</code> sets the port Apache listens on</li>
<li><code>wiki.conf</code> sets the <code>&lt;VirtualHost&gt;</code> block for the wiki</li>
</ul>
<h2 id="where-does-stuff-live">Where Does Stuff Live?<a class="headerlink" href="#where-does-stuff-live" title="Permanent link">&para;</a></h2>
<p>The <code>ports.conf</code> and <code>wiki.conf</code> configuration files
live in the <code>d-mediawiki</code> submodule
(see <a href="https://git.charlesreid1.com/docker/d-mediawiki">docker/d-mediawiki</a>
on git.charlesreid1.com),
in the <code>charlesreid1-config</code>
sub-submodule (see <a href="https://git.charlesreid1.com/wiki/charlesreid1-config">wiki/charlesreid1-config</a>
on git.charlesreid1.com),
in the <code>apache/</code> directory.</p>
<p>See <a href="https://git.charlesreid1.com/wiki/charlesreid1-config">wiki/charlesreid1-config</a>
on git.charlesreid1.com.</p>
<h2 id="getting-stuff-into-the-container">Getting Stuff Into The Container<a class="headerlink" href="#getting-stuff-into-the-container" title="Permanent link">&para;</a></h2>
<p>Unlike MediaWiki, Apache has a sane way
of separating the static program files
from the instance-specific configuration
files.</p>
<p>We bind-mount the directory containing
Apache <code>*.conf</code> files
into the container at
<code>/etc/nginx/conf.d</code>
via the following line
in the <a href="https://git.charlesreid1.com/docker/pod-charlesreid1/src/branch/master/docker-compose.fixme.yml">pod-charlesreid1
docker-compose file</a>:</p>
<div class="codehilite"><pre><span></span>services:
...
stormy_nginx:
...
volumes:
- &quot;./d-nginx-charlesreid1/conf.d:/etc/nginx/conf.d:ro&quot;
</pre></div>
<p>That's it!</p>
</article>
</div>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-nav">
<nav class="md-footer-nav__inner md-grid">
<a href="../Service_mediawiki/" title="Pod Service: MediaWiki" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
</div>
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Previous
</span>
Pod Service: MediaWiki
</span>
</div>
</a>
<a href="../Service_mysql/" title="Pod Service: MySQL" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Next
</span>
Pod Service: MySQL
</span>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
</div>
</a>
</nav>
</div>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-footer-copyright">
<div class="md-footer-copyright__highlight">
Copyright &copy; 2018 <a href="https://charlesreid1.com">Charles Reid</a>, released under the <a href="https://opensource.org/licenses/MIT">MIT license</a>
</div>
powered by
<a href="https://www.mkdocs.org">MkDocs</a>
and
<a href="https://squidfunk.github.io/mkdocs-material/">
Material for MkDocs</a>
</div>
</div>
</div>
</footer>
</div>
<script src="../assets/javascripts/application.e72fd936.js"></script>
<script>app.initialize({version:"1.0.4",url:{base:".."}})</script>
<script src="../search/main.js"></script>
</body>
</html>

740
Service_gitea/index.html

@ -0,0 +1,740 @@ @@ -0,0 +1,740 @@
<!DOCTYPE html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<link rel="canonical" href="https://pages.charlesreid1.com/pod-charlesreid1/Service_gitea/">
<meta name="lang:clipboard.copy" content="Copy to clipboard">
<meta name="lang:clipboard.copied" content="Copied to clipboard">
<meta name="lang:search.language" content="en">
<meta name="lang:search.pipeline.stopwords" content="True">
<meta name="lang:search.pipeline.trimmer" content="True">
<meta name="lang:search.result.none" content="No matching documents">
<meta name="lang:search.result.one" content="1 matching document">
<meta name="lang:search.result.other" content="# matching documents">
<meta name="lang:search.tokenizer" content="[\s\-]+">
<link rel="shortcut icon" href="..">
<meta name="generator" content="mkdocs-1.0.4, mkdocs-material-3.0.3">
<title>Pod Service: Gitea - pod-charlesreid1</title>
<link rel="stylesheet" href="../assets/stylesheets/application.451f80e5.css">
<link rel="stylesheet" href="../assets/stylesheets/application-palette.22915126.css">
<meta name="theme-color" content="#2196f3">
<script src="../assets/javascripts/modernizr.1aa3b519.js"></script>
<link href="https://fonts.gstatic.com" rel="preconnect" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
<style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
<link rel="stylesheet" href="../assets/fonts/material-icons.css">
<link rel="stylesheet" href="../css/custom.css">
</head>
<body dir="ltr" data-md-color-primary="blue" data-md-color-accent="blue">
<svg class="md-svg">
<defs>
</defs>
</svg>
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" data-md-component="overlay" for="__drawer"></label>
<a href="../#gitea" tabindex="1" class="md-skip">
Skip to content
</a>
<header class="md-header" data-md-component="header">
<nav class="md-header-nav md-grid">
<div class="md-flex">
<div class="md-flex__cell md-flex__cell--shrink">
<a href="https://pages.charlesreid1.com/pod-charlesreid1" title="pod-charlesreid1" class="md-header-nav__button md-logo">
<i class="md-icon">dns</i>
</a>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--menu md-header-nav__button" for="__drawer"></label>
</div>
<div class="md-flex__cell md-flex__cell--stretch">
<div class="md-flex__ellipsis md-header-nav__title" data-md-component="title">
<span class="md-header-nav__topic">
pod-charlesreid1
</span>
<span class="md-header-nav__topic">
Pod Service: Gitea
</span>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--search md-header-nav__button" for="__search"></label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query" data-md-state="active">
<label class="md-icon md-search__icon" for="__search"></label>
<button type="reset" class="md-icon md-search__icon" data-md-component="reset" tabindex="-1">
&#xE5CD;
</button>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="result">
<div class="md-search-result__meta">
Type to start searching
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<div class="md-header-nav__source">
<a href="https://git.charlesreid1.com/docker/pod-charlesreid1" title="Go to repository" class="md-source" data-md-source="">
<div class="md-source__repository">
pod-charlesreid1
</div>
</a>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container">
<main class="md-main">
<div class="md-main__inner md-grid" data-md-component="container">
<div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" data-md-level="0">
<label class="md-nav__title md-nav__title--site" for="__drawer">
<a href="https://pages.charlesreid1.com/pod-charlesreid1" title="pod-charlesreid1" class="md-nav__button md-logo">
<i class="md-icon">dns</i>
</a>
pod-charlesreid1
</label>
<div class="md-nav__source">
<a href="https://git.charlesreid1.com/docker/pod-charlesreid1" title="Go to repository" class="md-source" data-md-source="">
<div class="md-source__repository">
pod-charlesreid1
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href=".." title="Index" class="md-nav__link">
Index
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2" checked>
<label class="md-nav__link" for="nav-2">
Services
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-2">
Services
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../Service_mediawiki/" title="Pod Service: MediaWiki" class="md-nav__link">
Pod Service: MediaWiki
</a>
</li>
<li class="md-nav__item">
<a href="../Service_apachephp/" title="Pod Service: Apache/PHP" class="md-nav__link">
Pod Service: Apache/PHP
</a>
</li>
<li class="md-nav__item">
<a href="../Service_mysql/" title="Pod Service: MySQL" class="md-nav__link">
Pod Service: MySQL
</a>
</li>
<li class="md-nav__item">
<a href="../Service_phpmyadmin/" title="Pod Service: phpMyAdmin" class="md-nav__link">
Pod Service: phpMyAdmin
</a>
</li>
<li class="md-nav__item">
<a href="../Service_nginx/" title="Pod Service: nginx" class="md-nav__link">
Pod Service: nginx
</a>
</li>
<li class="md-nav__item">
<a href="../Service_pythonfiles/" title="Pod Service: Python File Server" class="md-nav__link">
Pod Service: Python File Server
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
Pod Service: Gitea
</label>
<a href="./" title="Pod Service: Gitea" class="md-nav__link md-nav__link--active">
Pod Service: Gitea
</a>
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#configuring-docker-container" title="Configuring Docker Container" class="md-nav__link">
Configuring Docker Container
</a>
</li>
<li class="md-nav__item">
<a href="#gitea-volumes" title="Gitea Volumes" class="md-nav__link">
Gitea Volumes
</a>
</li>
<li class="md-nav__item">
<a href="#gitea-ports" title="Gitea Ports" class="md-nav__link">
Gitea Ports
</a>
</li>
<li class="md-nav__item">
<a href="#gitea-configuration-files" title="Gitea Configuration Files" class="md-nav__link">
Gitea Configuration Files
</a>
</li>
<li class="md-nav__item">
<a href="#backups" title="Backups" class="md-nav__link">
Backups
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#backing-up-gitea" title="Backing Up Gitea" class="md-nav__link">
Backing Up Gitea
</a>
</li>
<li class="md-nav__item">
<a href="#restoring-gitea" title="Restoring Gitea" class="md-nav__link">
Restoring Gitea
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../Running/" title="Running the Pod" class="md-nav__link">
Running the Pod
</a>
</li>
<li class="md-nav__item">
<a href="../Volumes/" title="Volumes" class="md-nav__link">
Volumes
</a>
</li>
<li class="md-nav__item">
<a href="../Backups/" title="Backups" class="md-nav__link">
Backups
</a>
</li>
<li class="md-nav__item">
<a href="../Ports/" title="Domains and Ports" class="md-nav__link">
Domains and Ports
</a>
</li>
<li class="md-nav__item">
<a href="../Secrets/" title="Secrets" class="md-nav__link">
Secrets
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#configuring-docker-container" title="Configuring Docker Container" class="md-nav__link">
Configuring Docker Container
</a>
</li>
<li class="md-nav__item">
<a href="#gitea-volumes" title="Gitea Volumes" class="md-nav__link">
Gitea Volumes
</a>
</li>
<li class="md-nav__item">
<a href="#gitea-ports" title="Gitea Ports" class="md-nav__link">
Gitea Ports
</a>
</li>
<li class="md-nav__item">
<a href="#gitea-configuration-files" title="Gitea Configuration Files" class="md-nav__link">
Gitea Configuration Files
</a>
</li>
<li class="md-nav__item">
<a href="#backups" title="Backups" class="md-nav__link">
Backups
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#backing-up-gitea" title="Backing Up Gitea" class="md-nav__link">
Backing Up Gitea
</a>
</li>
<li class="md-nav__item">
<a href="#restoring-gitea" title="Restoring Gitea" class="md-nav__link">
Restoring Gitea
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content">
<article class="md-content__inner md-typeset">
<h1 id="gitea">Gitea<a class="headerlink" href="#gitea" title="Permanent link">&para;</a></h1>
<p>Gitea is a self-hosted Github clone. It is written in Go, and
provides a web interface and an API to interact with an instance
of a git server.</p>
<p>Gitea manages its own database, so to get data in and out of
Gitea, use its dump and load functionality (more below).</p>
<p>This page describes how the Gitea container is configured.</p>
<h2 id="configuring-docker-container">Configuring Docker Container<a class="headerlink" href="#configuring-docker-container" title="Permanent link">&para;</a></h2>
<p>To run gitea, we use a stock Gitea container image. We set
several options in the docker configuration:</p>
<ul>
<li>
<p><code>USER_UID</code> and <code>USER_GID</code> are set to <code>1000</code> (this avoids some
problems with files that would otherwise be owned by root)</p>
</li>
<li>
<p>Set <code>restart: always</code> to restart the container when there
is a failure</p>
</li>
</ul>
<div class="codehilite"><pre><span></span> stormy_gitea:
image: gitea/gitea:latest
environment:
- USER_UID=1000
- USER_GID=1000
restart: always
</pre></div>
<h2 id="gitea-volumes">Gitea Volumes<a class="headerlink" href="#gitea-volumes" title="Permanent link">&para;</a></h2>
<p>The Gitea container stores all of its data in <code>/data/</code> inside
the container.</p>
<p>When the container is launched, the <code>custom/</code> directory in
the <a href="https://git.charlesreid1.com/docker/d-gitea">docker/d-gitea</a>
repository is mounted to <code>/data/gitea/</code>, which is the directory
that contains the files that are used to control the way that
Gitea pages look. These contain HTML templates used to render
different views in Gitea and templates in <code>custom/</code> will override
the default Gitea page templates.</p>
<p>A docker volume named <code>stormy_gitea_data</code> is also created and
mounted at <code>/data/</code>. This is a persistent volume that will
survive even if the container is shut down.</p>
<div class="codehilite"><pre><span></span> volumes:
- &quot;stormy_gitea_data:/data&quot;
- &quot;./d-gitea/custom/conf/app.ini:/data/gitea/conf/app.ini&quot;
- &quot;./d-gitea/custom/public:/data/gitea/public&quot;
- &quot;./d-gitea/custom/templates:/data/gitea/templates&quot;
</pre></div>
<h2 id="gitea-ports">Gitea Ports<a class="headerlink" href="#gitea-ports" title="Permanent link">&para;</a></h2>
<p>Gitea provides both SSH and HTTPS interfaces, as it has its own
built-in web server and SSH server, as well as git server.</p>
<p>The server that is hosting the Gitea container and this Docker
pod already has an SSH server listening on port 22, so Gitea
listens for SSH connections <em>externally</em> on port 222.</p>
<div class="codehilite"><pre><span></span> ports:
- &quot;222:22&quot;
</pre></div>
<p>Note that this <em>bypasses</em> our d-nginx-charlesreid1 nginx container
entirely and allows clients to connect to Gitea directly.</p>
<p>The Gitea server listens for HTTP/HTTPS connections on port
3000, but that is by default only listening on the internal
Docker network, which is exactly how we want it. We want all
HTTP and HTTPS traffic to be handled by the front-end d-nginx-charlesreid1
container, and it will reverse-proxy HTTP/HTTPS requests to
the Gitea container.</p>
<h2 id="gitea-configuration-files">Gitea Configuration Files<a class="headerlink" href="#gitea-configuration-files" title="Permanent link">&para;</a></h2>
<p><code>app.ini</code> is the name of the configuration file used by Gitea.
An <a href="https://git.charlesreid1.com/docker/d-gitea/src/branch/master/app.ini.sample">example <code>app.ini</code> configuration file</a>
is contained in the <a href="https://git.charlesreid1.com/docker/d-gitea">docker/d-gitea</a>
repository, as well as a script to
<a href="https://git.charlesreid1.com/docker/d-gitea/src/branch/master/make_app_ini.sh">make a configuration file</a>.</p>
<div class="codehilite"><pre><span></span> volumes:
- &quot;stormy_gitea_data:/data&quot;
- &quot;./d-gitea/custom/conf/app.ini:/data/gitea/conf/app.ini&quot;
</pre></div>
<h2 id="backups">Backups<a class="headerlink" href="#backups" title="Permanent link">&para;</a></h2>
<h3 id="backing-up-gitea">Backing Up Gitea<a class="headerlink" href="#backing-up-gitea" title="Permanent link">&para;</a></h3>
<h3 id="restoring-gitea">Restoring Gitea<a class="headerlink" href="#restoring-gitea" title="Permanent link">&para;</a></h3>
</article>
</div>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-nav">
<nav class="md-footer-nav__inner md-grid">
<a href="../Service_pythonfiles/" title="Pod Service: Python File Server" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
</div>
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Previous
</span>
Pod Service: Python File Server
</span>
</div>
</a>
<a href="../Running/" title="Running the Pod" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Next
</span>
Running the Pod
</span>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
</div>
</a>
</nav>
</div>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-footer-copyright">
<div class="md-footer-copyright__highlight">
Copyright &copy; 2018 <a href="https://charlesreid1.com">Charles Reid</a>, released under the <a href="https://opensource.org/licenses/MIT">MIT license</a>
</div>
powered by
<a href="https://www.mkdocs.org">MkDocs</a>
and
<a href="https://squidfunk.github.io/mkdocs-material/">
Material for MkDocs</a>
</div>
</div>
</div>
</footer>
</div>
<script src="../assets/javascripts/application.e72fd936.js"></script>
<script>app.initialize({version:"1.0.4",url:{base:".."}})</script>
<script src="../search/main.js"></script>
</body>
</html>

847
Service_mediawiki/index.html

@ -0,0 +1,847 @@ @@ -0,0 +1,847 @@
<!DOCTYPE html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<link rel="canonical" href="https://pages.charlesreid1.com/pod-charlesreid1/Service_mediawiki/">
<meta name="lang:clipboard.copy" content="Copy to clipboard">
<meta name="lang:clipboard.copied" content="Copied to clipboard">
<meta name="lang:search.language" content="en">
<meta name="lang:search.pipeline.stopwords" content="True">
<meta name="lang:search.pipeline.trimmer" content="True">
<meta name="lang:search.result.none" content="No matching documents">
<meta name="lang:search.result.one" content="1 matching document">
<meta name="lang:search.result.other" content="# matching documents">
<meta name="lang:search.tokenizer" content="[\s\-]+">
<link rel="shortcut icon" href="..">
<meta name="generator" content="mkdocs-1.0.4, mkdocs-material-3.0.3">
<title>Pod Service: MediaWiki - pod-charlesreid1</title>
<link rel="stylesheet" href="../assets/stylesheets/application.451f80e5.css">
<link rel="stylesheet" href="../assets/stylesheets/application-palette.22915126.css">
<meta name="theme-color" content="#2196f3">
<script src="../assets/javascripts/modernizr.1aa3b519.js"></script>
<link href="https://fonts.gstatic.com" rel="preconnect" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
<style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
<link rel="stylesheet" href="../assets/fonts/material-icons.css">
<link rel="stylesheet" href="../css/custom.css">
</head>
<body dir="ltr" data-md-color-primary="blue" data-md-color-accent="blue">
<svg class="md-svg">
<defs>
</defs>
</svg>
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" data-md-component="overlay" for="__drawer"></label>
<a href="../#mediawiki-configuration-details" tabindex="1" class="md-skip">
Skip to content
</a>
<header class="md-header" data-md-component="header">
<nav class="md-header-nav md-grid">
<div class="md-flex">
<div class="md-flex__cell md-flex__cell--shrink">
<a href="https://pages.charlesreid1.com/pod-charlesreid1" title="pod-charlesreid1" class="md-header-nav__button md-logo">
<i class="md-icon">dns</i>
</a>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--menu md-header-nav__button" for="__drawer"></label>
</div>
<div class="md-flex__cell md-flex__cell--stretch">
<div class="md-flex__ellipsis md-header-nav__title" data-md-component="title">
<span class="md-header-nav__topic">
pod-charlesreid1
</span>
<span class="md-header-nav__topic">
Pod Service: MediaWiki
</span>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--search md-header-nav__button" for="__search"></label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query" data-md-state="active">
<label class="md-icon md-search__icon" for="__search"></label>
<button type="reset" class="md-icon md-search__icon" data-md-component="reset" tabindex="-1">
&#xE5CD;
</button>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="result">
<div class="md-search-result__meta">
Type to start searching
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<div class="md-header-nav__source">
<a href="https://git.charlesreid1.com/docker/pod-charlesreid1" title="Go to repository" class="md-source" data-md-source="">
<div class="md-source__repository">
pod-charlesreid1
</div>
</a>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container">
<main class="md-main">
<div class="md-main__inner md-grid" data-md-component="container">
<div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" data-md-level="0">
<label class="md-nav__title md-nav__title--site" for="__drawer">
<a href="https://pages.charlesreid1.com/pod-charlesreid1" title="pod-charlesreid1" class="md-nav__button md-logo">
<i class="md-icon">dns</i>
</a>
pod-charlesreid1
</label>
<div class="md-nav__source">
<a href="https://git.charlesreid1.com/docker/pod-charlesreid1" title="Go to repository" class="md-source" data-md-source="">
<div class="md-source__repository">
pod-charlesreid1
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href=".." title="Index" class="md-nav__link">
Index
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2" checked>
<label class="md-nav__link" for="nav-2">
Services
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-2">
Services
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--active">
<input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
Pod Service: MediaWiki
</label>
<a href="./" title="Pod Service: MediaWiki" class="md-nav__link md-nav__link--active">
Pod Service: MediaWiki
</a>
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#the-container" title="The Container" class="md-nav__link">
The Container
</a>
</li>
<li class="md-nav__item">
<a href="#configuration-files-and-folders" title="Configuration Files and Folders" class="md-nav__link">
Configuration Files and Folders
</a>
</li>
<li class="md-nav__item">
<a href="#where-does-stuff-live" title="Where Does Stuff Live?" class="md-nav__link">
Where Does Stuff Live?
</a>
</li>
<li class="md-nav__item">
<a href="#getting-stuff-into-the-container" title="Getting Stuff Into The Container" class="md-nav__link">
Getting Stuff Into The Container
</a>
</li>
<li class="md-nav__item">
<a href="#enabling-mediawiki-math" title="Enabling MediaWiki Math" class="md-nav__link">
Enabling MediaWiki Math
</a>
</li>
<li class="md-nav__item">
<a href="#updating-skin-or-localsettingsphp" title="Updating Skin or LocalSettings.php" class="md-nav__link">
Updating Skin or LocalSettings.php
</a>
</li>
<li class="md-nav__item">
<a href="#a-way-out-a-path-forward-a-glimmer-of-hope" title="A Way Out? A Path Forward? A Glimmer of Hope?" class="md-nav__link">
A Way Out? A Path Forward? A Glimmer of Hope?
</a>
</li>
<li class="md-nav__item">
<a href="#utilities" title="Utilities" class="md-nav__link">
Utilities
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../Service_apachephp/" title="Pod Service: Apache/PHP" class="md-nav__link">
Pod Service: Apache/PHP
</a>
</li>
<li class="md-nav__item">
<a href="../Service_mysql/" title="Pod Service: MySQL" class="md-nav__link">
Pod Service: MySQL
</a>
</li>
<li class="md-nav__item">
<a href="../Service_phpmyadmin/" title="Pod Service: phpMyAdmin" class="md-nav__link">
Pod Service: phpMyAdmin
</a>
</li>
<li class="md-nav__item">
<a href="../Service_nginx/" title="Pod Service: nginx" class="md-nav__link">
Pod Service: nginx
</a>
</li>
<li class="md-nav__item">
<a href="../Service_pythonfiles/" title="Pod Service: Python File Server" class="md-nav__link">
Pod Service: Python File Server
</a>
</li>
<li class="md-nav__item">
<a href="../Service_gitea/" title="Pod Service: Gitea" class="md-nav__link">
Pod Service: Gitea
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../Running/" title="Running the Pod" class="md-nav__link">
Running the Pod
</a>
</li>
<li class="md-nav__item">
<a href="../Volumes/" title="Volumes" class="md-nav__link">
Volumes
</a>
</li>
<li class="md-nav__item">
<a href="../Backups/" title="Backups" class="md-nav__link">
Backups
</a>
</li>
<li class="md-nav__item">
<a href="../Ports/" title="Domains and Ports" class="md-nav__link">
Domains and Ports
</a>
</li>
<li class="md-nav__item">
<a href="../Secrets/" title="Secrets" class="md-nav__link">
Secrets
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#the-container" title="The Container" class="md-nav__link">
The Container
</a>
</li>
<li class="md-nav__item">
<a href="#configuration-files-and-folders" title="Configuration Files and Folders" class="md-nav__link">
Configuration Files and Folders
</a>
</li>
<li class="md-nav__item">
<a href="#where-does-stuff-live" title="Where Does Stuff Live?" class="md-nav__link">
Where Does Stuff Live?
</a>
</li>
<li class="md-nav__item">
<a href="#getting-stuff-into-the-container" title="Getting Stuff Into The Container" class="md-nav__link">
Getting Stuff Into The Container
</a>
</li>
<li class="md-nav__item">
<a href="#enabling-mediawiki-math" title="Enabling MediaWiki Math" class="md-nav__link">
Enabling MediaWiki Math
</a>
</li>
<li class="md-nav__item">
<a href="#updating-skin-or-localsettingsphp" title="Updating Skin or LocalSettings.php" class="md-nav__link">
Updating Skin or LocalSettings.php
</a>
</li>
<li class="md-nav__item">
<a href="#a-way-out-a-path-forward-a-glimmer-of-hope" title="A Way Out? A Path Forward? A Glimmer of Hope?" class="md-nav__link">
A Way Out? A Path Forward? A Glimmer of Hope?
</a>
</li>
<li class="md-nav__item">
<a href="#utilities" title="Utilities" class="md-nav__link">
Utilities
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content">
<article class="md-content__inner md-typeset">
<h1 id="mediawiki-configuration-details">MediaWiki Configuration Details<a class="headerlink" href="#mediawiki-configuration-details" title="Permanent link">&para;</a></h1>
<p>This describes the container-specific
details of the MediaWiki part of the
Apache-MediaWiki container.</p>
<p>Also see <a href="/Service_apachephp.md">Apache + PHP</a>.</p>
<h2 id="the-container">The Container<a class="headerlink" href="#the-container" title="Permanent link">&para;</a></h2>
<p>This is based on a MediaWiki container image
that runs MediaWiki, PHP, and Apache all in one
container.</p>
<p>The Apache server is reverse-proxied by nginx
in the final pod configuration.</p>
<h2 id="configuration-files-and-folders">Configuration Files and Folders<a class="headerlink" href="#configuration-files-and-folders" title="Permanent link">&para;</a></h2>
<p>To set up the MediaWiki container,
we have to copy in the following files:</p>
<ul>
<li>One configuration file <code>LocalSettings.php</code></li>
<li>Two directories:<ul>
<li><code>extensions/</code></li>
<li><code>skins/</code></li>
</ul>
</li>
</ul>
<p>Both <code>LocalSettings.php</code> and <code>skins/</code> are
under version control.</p>
<p>The <code>extensions/</code> directory is assembled
from git repositories directly,
and so is not under version control.</p>
<h2 id="where-does-stuff-live">Where Does Stuff Live?<a class="headerlink" href="#where-does-stuff-live" title="Permanent link">&para;</a></h2>
<p>The <code>LocalSettings.php</code> file and <code>skins/</code> folder
live in the <code>d-mediawiki</code> submodule
(see <a href="https://git.charlesreid1.com/docker/d-mediawiki">docker/d-mediawiki</a>
on git.charlesreid1.com),
in the <code>charlesreid1-config</code>
sub-submodule (see <a href="https://git.charlesreid1.com/wiki/charlesreid1-config">wiki/charlesreid1-config</a>
on git.charlesreid1.com),
in the <code>mediawiki/</code> directory.</p>
<p>That's also where the <code>extensions/</code>
directory goes. There is also
a script in the <a href="https://git.charlesreid1.com/wiki/charlesreid1-config">wiki/charlesreid1-config</a>
repo called <a href="https://git.charlesreid1.com/wiki/charlesreid1-config/src/branch/master/mediawiki/build_extensions_dir.sh"><code>build_extensions_dir.sh</code></a>
that clone copies of each MediaWiki extension.</p>
<p>Inside the MediaWiki container,
the live HTML directory is at
<code>/var/www/html/</code>. That is where
<code>LocalSettings.php</code>, <code>skins/</code>, and <code>extensions/</code>
live in the container.</p>
<p>The <code>/var/www/html/</code> directory is
marked as a <code>VOLUME</code> in the Dockerfile
and is the mount point for a
docker data volume, <code>stormy_mediawiki_data</code>.</p>
<p>See <a href="https://git.charlesreid1.com/wiki/charlesreid1-config">wiki/charlesreid1-config</a>
on git.charlesreid1.com.</p>
<h2 id="getting-stuff-into-the-container">Getting Stuff Into The Container<a class="headerlink" href="#getting-stuff-into-the-container" title="Permanent link">&para;</a></h2>
<p>The configuration files mentioned above
(LocalSettings, skins, and extensions)
must be copied into the container at build time.</p>
<p>This is done in the MediaWiki Dockerfile -
see <a href="https://git.charlesreid1.com/docker/d-mediawiki">d-mediawiki</a>.</p>
<p>Why don't we bind-mount them into the container?
We will have problems mounting files to a directory
that is itself a mount point. Since <code>/var/www/html/</code>
is a mount point for the MediaWiki container's data volume,
to keep the wiki's files persistent,
we can't also bind-mount files at
<code>/var/www/html/.</code></p>
<p>Additionally, we have to change the permissions of
<code>LocalSettings.pp</code> to 600 and change the ownership
of all files in <code>/var/www/html/</code> to <code>www-data:www-data</code>,
the Apache web server user, so that it can
serve up the wiki.</p>
<p><code>LocalSettings.php</code> is copied into the container
at <code>/var/www/html/LocalSettings.php</code>.</p>
<p><code>skins/</code> is copied into the container at
<code>/var/www/html/skins/</code> (we use our own
customized theme, in the Bootstrap2 directory).</p>
<p><code>extensions/</code> is copied into the container
at <code>/var/www/html/extensions/</code>
(make sure you run <code>build_extensions_dir.sh</code> first!).</p>
<p><a href="https://git.charlesreid1.com/wiki/charlesreid1-config/src/branch/master/mediawiki/build_extensions_dir.sh"><code>build_extensions_dir.sh</code></a></p>
<h2 id="enabling-mediawiki-math">Enabling MediaWiki Math<a class="headerlink" href="#enabling-mediawiki-math" title="Permanent link">&para;</a></h2>
<p>Note that we have one last task to complete,
and that is enabling the math extensions so that
we can add formulas to our wiki.</p>
<p>To do this, we have to add the following aptitude
packages to an <code>apt-get install</code> command in the
Dockerfile:</p>
<div class="codehilite"><pre><span></span>RUN apt-get update &amp;&amp; \
apt-get install -y build-essential \
dvipng \
ocaml \
ghostscript \
imagemagick \
texlive-latex-base \
texlive-latex-extra \
texlive-fonts-recommended \
texlive-lang-greek \
texlive-latex-recommended
</pre></div>
<p>(Note: ocaml is a language required to make
<code>texvc</code>, covered below.)</p>
<p>Next, we need to shim a make command
into the container's entrypoint command,
before we run the Apache web server.</p>
<p>To enable equations and math, we need to make
a utility called <code>texvc</code> by running <code>make</code> in the
Math extension directory. </p>
<p>We modify the <code>CMD</code> directive in the Dockerfile,
which normally runs <code>apache2-foreground</code>
in the stock MediaWiki container.</p>
<p>Change the original <code>CMD</code> from this:</p>
<div class="codehilite"><pre><span></span>CMD apache2-foreground
</pre></div>
<p>to this:</p>
<div class="codehilite"><pre><span></span>CMD cd /var/www/html/extensions/Math/math &amp;&amp; make &amp;&amp; apache2-foreground
</pre></div>
<h2 id="updating-skin-or-localsettingsphp">Updating Skin or LocalSettings.php<a class="headerlink" href="#updating-skin-or-localsettingsphp" title="Permanent link">&para;</a></h2>
<p>Note that if you update the MediaWiki skin
or the <code>LocalSettings.php</code> file,
you will need to rebuild the container
and restart it.</p>
<p>(It's a pain in the ass, but hard to avoid.)</p>
<p>Alternatively, you can use <code>docker cp</code> to
copy a new <code>LocalSettings.php</code> or
skins directory into the running
MediaWiki container. These changes
will be reflected immediately in the
wiki interface.</p>
<p>(Be careful with this method!!!)</p>
<p>Best of all possible worlds:
your <code>LocalSettings.php</code>
and <code>skins/</code> directory
is under version control,
as in <a href="https://git.charlesreid1.com/wiki/charlesreid1-config">wiki/charlesreid1-config</a>
on git.charlesreid1.com,
and can be updated with a
git push or git pull.</p>
<p>(This is not currently how
it is structured, as the
skin and <code>LocalSettings.php</code>
files are not under version
control in the container.
This would be difficult for
the same reason that it is
difficult to bind-mount
a file directly into
<code>/var/www/html</code> - because
it is also difficult
to have a particular
file under version control
when there are a
large number of other files
in that directory.)</p>
<h2 id="a-way-out-a-path-forward-a-glimmer-of-hope">A Way Out? A Path Forward? A Glimmer of Hope?<a class="headerlink" href="#a-way-out-a-path-forward-a-glimmer-of-hope" title="Permanent link">&para;</a></h2>
<p>How might we fix this nested, nightarish mess?</p>
<p>A couple of things have to happen:</p>
<ul>
<li>
<p>Docker needs to provide better control over user ownership
and file permissions for bind-mounted directories.
There are some really ugly, hacky shims that are
required because the user permissions of everything
are buggered from the start.</p>
</li>
<li>
<p>MediaWiki needs to put user configuration files
into a configuration folder. For example,
<code>nginx</code> looks in a folder <code>/etc/nginx/</code> for
any and all configuration files. This allows
bind-mounting a configuration directory
to <code>/etc/nginx/</code> without complication.
Unfortunately, MediaWiki mixes site-specific user files
with generic, common-across-all-MediaWikis
php files, making it difficult to version-control
site-specific user files.</p>
</li>
</ul>
<h2 id="utilities">Utilities<a class="headerlink" href="#utilities" title="Permanent link">&para;</a></h2>
<p>There are utilities for MediaWiki in <code>utils-mw</code>:</p>
<ul>
<li><a href="https://git.charlesreid1.com/docker/pod-charlesreid1/src/branch/master/utils-mw/backup_wikifiles.sh"><code>backup_wikifiles.sh</code></a> - back up wiki image files to a tarball from the <code>story_mw</code> container</li>
<li><a href="https://git.charlesreid1.com/docker/pod-charlesreid1/src/branch/master/utils-mw/restore_wikifiles.sh"><code>restore_wikifiles.sh</code></a> - restore backed up image files from a tarball into the <code>story_mw</code> container</li>
<li><a href="https://git.charlesreid1.com/docker/pod-charlesreid1/src/branch/master/utils-mw/update_wikidb.sh"><code>update_wikidb.sh</code></a> - one-time script to update the wiki database after a version bump</li>
</ul>
</article>
</div>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-nav">
<nav class="md-footer-nav__inner md-grid">
<a href=".." title="Index" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
</div>
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Previous
</span>
Index
</span>
</div>
</a>
<a href="../Service_apachephp/" title="Pod Service: Apache/PHP" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Next
</span>
Pod Service: Apache/PHP
</span>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
</div>
</a>
</nav>
</div>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-footer-copyright">
<div class="md-footer-copyright__highlight">
Copyright &copy; 2018 <a href="https://charlesreid1.com">Charles Reid</a>, released under the <a href="https://opensource.org/licenses/MIT">MIT license</a>
</div>
powered by
<a href="https://www.mkdocs.org">MkDocs</a>
and
<a href="https://squidfunk.github.io/mkdocs-material/">
Material for MkDocs</a>
</div>
</div>
</div>
</footer>
</div>
<script src="../assets/javascripts/application.e72fd936.js"></script>
<script>app.initialize({version:"1.0.4",url:{base:".."}})</script>
<script src="../search/main.js"></script>
</body>
</html>

642
Service_mysql/index.html

@ -0,0 +1,642 @@ @@ -0,0 +1,642 @@
<!DOCTYPE html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<link rel="canonical" href="https://pages.charlesreid1.com/pod-charlesreid1/Service_mysql/">
<meta name="lang:clipboard.copy" content="Copy to clipboard">
<meta name="lang:clipboard.copied" content="Copied to clipboard">
<meta name="lang:search.language" content="en">
<meta name="lang:search.pipeline.stopwords" content="True">
<meta name="lang:search.pipeline.trimmer" content="True">
<meta name="lang:search.result.none" content="No matching documents">
<meta name="lang:search.result.one" content="1 matching document">
<meta name="lang:search.result.other" content="# matching documents">
<meta name="lang:search.tokenizer" content="[\s\-]+">
<link rel="shortcut icon" href="..">
<meta name="generator" content="mkdocs-1.0.4, mkdocs-material-3.0.3">
<title>Pod Service: MySQL - pod-charlesreid1</title>
<link rel="stylesheet" href="../assets/stylesheets/application.451f80e5.css">
<link rel="stylesheet" href="../assets/stylesheets/application-palette.22915126.css">
<meta name="theme-color" content="#2196f3">
<script src="../assets/javascripts/modernizr.1aa3b519.js"></script>
<link href="https://fonts.gstatic.com" rel="preconnect" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
<style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
<link rel="stylesheet" href="../assets/fonts/material-icons.css">
<link rel="stylesheet" href="../css/custom.css">
</head>
<body dir="ltr" data-md-color-primary="blue" data-md-color-accent="blue">
<svg class="md-svg">
<defs>
</defs>
</svg>
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" data-md-component="overlay" for="__drawer"></label>
<a href="../#mysql-configuration-details" tabindex="1" class="md-skip">
Skip to content
</a>
<header class="md-header" data-md-component="header">
<nav class="md-header-nav md-grid">
<div class="md-flex">
<div class="md-flex__cell md-flex__cell--shrink">
<a href="https://pages.charlesreid1.com/pod-charlesreid1" title="pod-charlesreid1" class="md-header-nav__button md-logo">
<i class="md-icon">dns</i>
</a>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--menu md-header-nav__button" for="__drawer"></label>
</div>
<div class="md-flex__cell md-flex__cell--stretch">
<div class="md-flex__ellipsis md-header-nav__title" data-md-component="title">
<span class="md-header-nav__topic">
pod-charlesreid1
</span>
<span class="md-header-nav__topic">
Pod Service: MySQL
</span>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--search md-header-nav__button" for="__search"></label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query" data-md-state="active">
<label class="md-icon md-search__icon" for="__search"></label>
<button type="reset" class="md-icon md-search__icon" data-md-component="reset" tabindex="-1">
&#xE5CD;
</button>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="result">
<div class="md-search-result__meta">
Type to start searching
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<div class="md-header-nav__source">
<a href="https://git.charlesreid1.com/docker/pod-charlesreid1" title="Go to repository" class="md-source" data-md-source="">
<div class="md-source__repository">
pod-charlesreid1
</div>
</a>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container">
<main class="md-main">
<div class="md-main__inner md-grid" data-md-component="container">
<div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" data-md-level="0">
<label class="md-nav__title md-nav__title--site" for="__drawer">
<a href="https://pages.charlesreid1.com/pod-charlesreid1" title="pod-charlesreid1" class="md-nav__button md-logo">
<i class="md-icon">dns</i>
</a>
pod-charlesreid1
</label>
<div class="md-nav__source">
<a href="https://git.charlesreid1.com/docker/pod-charlesreid1" title="Go to repository" class="md-source" data-md-source="">
<div class="md-source__repository">
pod-charlesreid1
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href=".." title="Index" class="md-nav__link">
Index
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2" checked>
<label class="md-nav__link" for="nav-2">
Services
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-2">
Services
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../Service_mediawiki/" title="Pod Service: MediaWiki" class="md-nav__link">
Pod Service: MediaWiki
</a>
</li>
<li class="md-nav__item">
<a href="../Service_apachephp/" title="Pod Service: Apache/PHP" class="md-nav__link">
Pod Service: Apache/PHP
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
Pod Service: MySQL
</label>
<a href="./" title="Pod Service: MySQL" class="md-nav__link md-nav__link--active">
Pod Service: MySQL
</a>
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#the-container" title="The Container" class="md-nav__link">
The Container
</a>
</li>
<li class="md-nav__item">
<a href="#configuration-files-and-folders" title="Configuration Files and Folders" class="md-nav__link">
Configuration Files and Folders
</a>
</li>
<li class="md-nav__item">
<a href="#getting-stuff-into-the-container-how-to-seed-mysql" title="Getting Stuff Into The Container (How To Seed MySQL?)" class="md-nav__link">
Getting Stuff Into The Container (How To Seed MySQL?)
</a>
</li>
<li class="md-nav__item">
<a href="#utilities" title="Utilities" class="md-nav__link">
Utilities
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../Service_phpmyadmin/" title="Pod Service: phpMyAdmin" class="md-nav__link">
Pod Service: phpMyAdmin
</a>
</li>
<li class="md-nav__item">
<a href="../Service_nginx/" title="Pod Service: nginx" class="md-nav__link">
Pod Service: nginx
</a>
</li>
<li class="md-nav__item">
<a href="../Service_pythonfiles/" title="Pod Service: Python File Server" class="md-nav__link">
Pod Service: Python File Server
</a>
</li>
<li class="md-nav__item">
<a href="../Service_gitea/" title="Pod Service: Gitea" class="md-nav__link">
Pod Service: Gitea
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../Running/" title="Running the Pod" class="md-nav__link">
Running the Pod
</a>
</li>
<li class="md-nav__item">
<a href="../Volumes/" title="Volumes" class="md-nav__link">
Volumes
</a>
</li>
<li class="md-nav__item">
<a href="../Backups/" title="Backups" class="md-nav__link">
Backups
</a>
</li>
<li class="md-nav__item">
<a href="../Ports/" title="Domains and Ports" class="md-nav__link">
Domains and Ports
</a>
</li>
<li class="md-nav__item">
<a href="../Secrets/" title="Secrets" class="md-nav__link">
Secrets
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#the-container" title="The Container" class="md-nav__link">
The Container
</a>
</li>
<li class="md-nav__item">
<a href="#configuration-files-and-folders" title="Configuration Files and Folders" class="md-nav__link">
Configuration Files and Folders
</a>
</li>
<li class="md-nav__item">
<a href="#getting-stuff-into-the-container-how-to-seed-mysql" title="Getting Stuff Into The Container (How To Seed MySQL?)" class="md-nav__link">
Getting Stuff Into The Container (How To Seed MySQL?)
</a>
</li>
<li class="md-nav__item">
<a href="#utilities" title="Utilities" class="md-nav__link">
Utilities
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content">
<article class="md-content__inner md-typeset">
<h1 id="mysql-configuration-details">MySQL Configuration Details<a class="headerlink" href="#mysql-configuration-details" title="Permanent link">&para;</a></h1>
<p>This is the most important part of the MediaWiki
portion of the charlesreid1 pod. MediaWiki stores
all of the content of the MediaWiki server,
so the MediaWiki and MySQL containers must
communicate with one another.</p>
<h2 id="the-container">The Container<a class="headerlink" href="#the-container" title="Permanent link">&para;</a></h2>
<p>The MySQL container is straightforward,
nothing fancy.</p>
<h2 id="configuration-files-and-folders">Configuration Files and Folders<a class="headerlink" href="#configuration-files-and-folders" title="Permanent link">&para;</a></h2>
<p>We don't have an extensive MySQL configuration.
The container demostrates how to mount a configuration
file into the container, but this is optional.</p>
<p>See <a href="https://git.charlesreid1.com/docker/d-mysql/src/branch/master/run_super_mysql.sh#L17">this line</a>
of the run script in the <a href="https://git.charlesreid1.com/docker/d-mysql">docker/d-mysql</a>
repository.</p>
<h2 id="getting-stuff-into-the-container-how-to-seed-mysql">Getting Stuff Into The Container (How To Seed MySQL?)<a class="headerlink" href="#getting-stuff-into-the-container-how-to-seed-mysql" title="Permanent link">&para;</a></h2>
<p>This section refers to scripts contained in
the <a href="https://git.charlesreid1.com/docker/pod-charlesreid1/src/branch/master/utils-mw"><code>utils-mysql/</code></a>
directory.</p>
<p>The MySQL data must come from a seed
(what we call a krash seed). This seed
consists of a prior backup of the MediaWiki
MySQL database, from which the database
can be restored.</p>
<p>There are both backup and restore scripts
in the repo under <a href="https://git.charlesreid1.com/docker/pod-charlesreid1/src/branch/master/utils-mysql"><code>utils-mysql/</code></a>.</p>
<p>The <a href="https://git.charlesreid1.com/docker/pod-charlesreid1/src/branch/master/utils-mysql/dump_database.sh"><code>dump_database.sh</code></a>
script will run the <code>mysqldump</code> tool to back up
all the databases in the container into a file
in <code>.sql</code> format.</p>
<p>These <code>.sql</code> files can be used to restore a
MySQL database using the <a href="https://git.charlesreid1.com/docker/pod-charlesreid1/src/branch/master/utils-mysql/restore_database.sh"><code>restore_database.sh</code></a>
script.</p>
<h2 id="utilities">Utilities<a class="headerlink" href="#utilities" title="Permanent link">&para;</a></h2>
<p>There are utilities for MySQL in <code>utils-mysql</code>:</p>
<ul>
<li><a href="https://git.charlesreid1.com/docker/pod-charlesreid1/src/branch/master/utils-mysql/dump_database.sh"><code>dump_databases.sh</code></a> - create an <code>.sql</code> dump file from a database</li>
<li><a href="https://git.charlesreid1.com/docker/pod-charlesreid1/src/branch/master/utils-mysql/restore_database.sh"><code>restore_database.sh</code></a> - restore a database from an <code>.sql</code> dump file</li>
</ul>
</article>
</div>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-nav">
<nav class="md-footer-nav__inner md-grid">
<a href="../Service_apachephp/" title="Pod Service: Apache/PHP" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
</div>
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Previous
</span>
Pod Service: Apache/PHP
</span>
</div>
</a>
<a href="../Service_phpmyadmin/" title="Pod Service: phpMyAdmin" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Next
</span>
Pod Service: phpMyAdmin
</span>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
</div>
</a>
</nav>
</div>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-footer-copyright">
<div class="md-footer-copyright__highlight">
Copyright &copy; 2018 <a href="https://charlesreid1.com">Charles Reid</a>, released under the <a href="https://opensource.org/licenses/MIT">MIT license</a>
</div>
powered by
<a href="https://www.mkdocs.org">MkDocs</a>
and
<a href="https://squidfunk.github.io/mkdocs-material/">
Material for MkDocs</a>
</div>
</div>
</div>
</footer>
</div>
<script src="../assets/javascripts/application.e72fd936.js"></script>
<script>app.initialize({version:"1.0.4",url:{base:".."}})</script>
<script src="../search/main.js"></script>
</body>
</html>

1123
Service_nginx/index.html

File diff suppressed because it is too large Load Diff

539
Service_phpmyadmin/index.html

@ -0,0 +1,539 @@ @@ -0,0 +1,539 @@
<!DOCTYPE html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<link rel="canonical" href="https://pages.charlesreid1.com/pod-charlesreid1/Service_phpmyadmin/">
<meta name="lang:clipboard.copy" content="Copy to clipboard">
<meta name="lang:clipboard.copied" content="Copied to clipboard">
<meta name="lang:search.language" content="en">
<meta name="lang:search.pipeline.stopwords" content="True">
<meta name="lang:search.pipeline.trimmer" content="True">
<meta name="lang:search.result.none" content="No matching documents">
<meta name="lang:search.result.one" content="1 matching document">
<meta name="lang:search.result.other" content="# matching documents">
<meta name="lang:search.tokenizer" content="[\s\-]+">
<link rel="shortcut icon" href="..">
<meta name="generator" content="mkdocs-1.0.4, mkdocs-material-3.0.3">
<title>Pod Service: phpMyAdmin - pod-charlesreid1</title>
<link rel="stylesheet" href="../assets/stylesheets/application.451f80e5.css">
<link rel="stylesheet" href="../assets/stylesheets/application-palette.22915126.css">
<meta name="theme-color" content="#2196f3">
<script src="../assets/javascripts/modernizr.1aa3b519.js"></script>
<link href="https://fonts.gstatic.com" rel="preconnect" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
<style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
<link rel="stylesheet" href="../assets/fonts/material-icons.css">
<link rel="stylesheet" href="../css/custom.css">
</head>
<body dir="ltr" data-md-color-primary="blue" data-md-color-accent="blue">
<svg class="md-svg">
<defs>
</defs>
</svg>
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" data-md-component="overlay" for="__drawer"></label>
<a href="../#phpmyadmin" tabindex="1" class="md-skip">
Skip to content
</a>
<header class="md-header" data-md-component="header">
<nav class="md-header-nav md-grid">
<div class="md-flex">
<div class="md-flex__cell md-flex__cell--shrink">
<a href="https://pages.charlesreid1.com/pod-charlesreid1" title="pod-charlesreid1" class="md-header-nav__button md-logo">
<i class="md-icon">dns</i>
</a>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--menu md-header-nav__button" for="__drawer"></label>
</div>
<div class="md-flex__cell md-flex__cell--stretch">
<div class="md-flex__ellipsis md-header-nav__title" data-md-component="title">
<span class="md-header-nav__topic">
pod-charlesreid1
</span>
<span class="md-header-nav__topic">
Pod Service: phpMyAdmin
</span>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--search md-header-nav__button" for="__search"></label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query" data-md-state="active">
<label class="md-icon md-search__icon" for="__search"></label>
<button type="reset" class="md-icon md-search__icon" data-md-component="reset" tabindex="-1">
&#xE5CD;
</button>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="result">
<div class="md-search-result__meta">
Type to start searching
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<div class="md-header-nav__source">
<a href="https://git.charlesreid1.com/docker/pod-charlesreid1" title="Go to repository" class="md-source" data-md-source="">
<div class="md-source__repository">
pod-charlesreid1
</div>
</a>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container">
<main class="md-main">
<div class="md-main__inner md-grid" data-md-component="container">
<div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" data-md-level="0">
<label class="md-nav__title md-nav__title--site" for="__drawer">
<a href="https://pages.charlesreid1.com/pod-charlesreid1" title="pod-charlesreid1" class="md-nav__button md-logo">
<i class="md-icon">dns</i>
</a>
pod-charlesreid1
</label>
<div class="md-nav__source">
<a href="https://git.charlesreid1.com/docker/pod-charlesreid1" title="Go to repository" class="md-source" data-md-source="">
<div class="md-source__repository">
pod-charlesreid1
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href=".." title="Index" class="md-nav__link">
Index
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2" checked>
<label class="md-nav__link" for="nav-2">
Services
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-2">
Services
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../Service_mediawiki/" title="Pod Service: MediaWiki" class="md-nav__link">
Pod Service: MediaWiki
</a>
</li>
<li class="md-nav__item">
<a href="../Service_apachephp/" title="Pod Service: Apache/PHP" class="md-nav__link">
Pod Service: Apache/PHP
</a>
</li>
<li class="md-nav__item">
<a href="../Service_mysql/" title="Pod Service: MySQL" class="md-nav__link">
Pod Service: MySQL
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<a href="./" title="Pod Service: phpMyAdmin" class="md-nav__link md-nav__link--active">
Pod Service: phpMyAdmin
</a>
</li>
<li class="md-nav__item">
<a href="../Service_nginx/" title="Pod Service: nginx" class="md-nav__link">
Pod Service: nginx
</a>
</li>
<li class="md-nav__item">
<a href="../Service_pythonfiles/" title="Pod Service: Python File Server" class="md-nav__link">
Pod Service: Python File Server
</a>
</li>
<li class="md-nav__item">
<a href="../Service_gitea/" title="Pod Service: Gitea" class="md-nav__link">
Pod Service: Gitea
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../Running/" title="Running the Pod" class="md-nav__link">
Running the Pod
</a>
</li>
<li class="md-nav__item">
<a href="../Volumes/" title="Volumes" class="md-nav__link">
Volumes
</a>
</li>
<li class="md-nav__item">
<a href="../Backups/" title="Backups" class="md-nav__link">
Backups
</a>
</li>
<li class="md-nav__item">
<a href="../Ports/" title="Domains and Ports" class="md-nav__link">
Domains and Ports
</a>
</li>
<li class="md-nav__item">
<a href="../Secrets/" title="Secrets" class="md-nav__link">
Secrets
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary">
</nav>
</div>
</div>
</div>
<div class="md-content">
<article class="md-content__inner md-typeset">
<h1 id="phpmyadmin">phpMyAdmin<a class="headerlink" href="#phpmyadmin" title="Permanent link">&para;</a></h1>
<p>This page describes the container-specific details
of the phpMyAdmin container.</p>
<p>phpMyAdmin provides a web interface for interacting with MySQL
databases and can be connected to the MySQL container to ensure
the backup/restore process proceeds smoothly.</p>
<p>This is run as a stock phpMyAdmin container - run script
is <a href="https://git.charlesreid1.com/docker/d-phpmyadmin/src/branch/master/run_stock_phpmyadmin.sh">here</a>
in the <a href="https://git.charlesreid1.com/docker/d-phpmyadmin">docker/d-phpmyadmin</a>
repository on git.charlesreid1.com.</p>
<p>The phpMyAdmin service is a web interface that is available
on port 80. The container should only be bound to the
Docker container network (default behavior). Then any
container on the network can reach the container's
phpMyAdmin service on port 80.</p>
<p>This allows the phpMyAdmin service to be made available at
a URL like <code>/phpMyAdmin</code> and have all requests reverse-proxied
by the nginx container and passed to port 80 on the back end.</p>
<p>The phpMyAdmin service can also be disabled/enabled by
commenting it out of the nginx configuration files containing
HTTPS rules for the charlesreid1.com domains.</p>
<p>See the configuration section of the <a href="../Service_nginx/">Nginx</a>
container page for more information about the nginx configuration
files.</p>
</article>
</div>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-nav">
<nav class="md-footer-nav__inner md-grid">
<a href="../Service_mysql/" title="Pod Service: MySQL" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
</div>
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Previous
</span>
Pod Service: MySQL
</span>
</div>
</a>
<a href="../Service_nginx/" title="Pod Service: nginx" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Next
</span>
Pod Service: nginx
</span>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
</div>
</a>
</nav>
</div>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-footer-copyright">
<div class="md-footer-copyright__highlight">
Copyright &copy; 2018 <a href="https://charlesreid1.com">Charles Reid</a>, released under the <a href="https://opensource.org/licenses/MIT">MIT license</a>
</div>
powered by
<a href="https://www.mkdocs.org">MkDocs</a>
and
<a href="https://squidfunk.github.io/mkdocs-material/">
Material for MkDocs</a>
</div>
</div>
</div>
</footer>
</div>
<script src="../assets/javascripts/application.e72fd936.js"></script>
<script>app.initialize({version:"1.0.4",url:{base:".."}})</script>
<script src="../search/main.js"></script>
</body>
</html>

532
Service_pythonfiles/index.html

@ -0,0 +1,532 @@ @@ -0,0 +1,532 @@
<!DOCTYPE html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<link rel="canonical" href="https://pages.charlesreid1.com/pod-charlesreid1/Service_pythonfiles/">
<meta name="lang:clipboard.copy" content="Copy to clipboard">
<meta name="lang:clipboard.copied" content="Copied to clipboard">
<meta name="lang:search.language" content="en">
<meta name="lang:search.pipeline.stopwords" content="True">
<meta name="lang:search.pipeline.trimmer" content="True">
<meta name="lang:search.result.none" content="No matching documents">
<meta name="lang:search.result.one" content="1 matching document">
<meta name="lang:search.result.other" content="# matching documents">
<meta name="lang:search.tokenizer" content="[\s\-]+">
<link rel="shortcut icon" href="..">
<meta name="generator" content="mkdocs-1.0.4, mkdocs-material-3.0.3">
<title>Pod Service: Python File Server - pod-charlesreid1</title>
<link rel="stylesheet" href="../assets/stylesheets/application.451f80e5.css">
<link rel="stylesheet" href="../assets/stylesheets/application-palette.22915126.css">
<meta name="theme-color" content="#2196f3">
<script src="../assets/javascripts/modernizr.1aa3b519.js"></script>
<link href="https://fonts.gstatic.com" rel="preconnect" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
<style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
<link rel="stylesheet" href="../assets/fonts/material-icons.css">
<link rel="stylesheet" href="../css/custom.css">
</head>
<body dir="ltr" data-md-color-primary="blue" data-md-color-accent="blue">
<svg class="md-svg">
<defs>
</defs>
</svg>
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" data-md-component="overlay" for="__drawer"></label>
<a href="../#python-file-server" tabindex="1" class="md-skip">
Skip to content
</a>
<header class="md-header" data-md-component="header">
<nav class="md-header-nav md-grid">
<div class="md-flex">
<div class="md-flex__cell md-flex__cell--shrink">
<a href="https://pages.charlesreid1.com/pod-charlesreid1" title="pod-charlesreid1" class="md-header-nav__button md-logo">
<i class="md-icon">dns</i>
</a>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--menu md-header-nav__button" for="__drawer"></label>
</div>
<div class="md-flex__cell md-flex__cell--stretch">
<div class="md-flex__ellipsis md-header-nav__title" data-md-component="title">
<span class="md-header-nav__topic">
pod-charlesreid1
</span>
<span class="md-header-nav__topic">
Pod Service: Python File Server
</span>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--search md-header-nav__button" for="__search"></label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query" data-md-state="active">
<label class="md-icon md-search__icon" for="__search"></label>
<button type="reset" class="md-icon md-search__icon" data-md-component="reset" tabindex="-1">
&#xE5CD;
</button>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="result">
<div class="md-search-result__meta">
Type to start searching
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<div class="md-header-nav__source">
<a href="https://git.charlesreid1.com/docker/pod-charlesreid1" title="Go to repository" class="md-source" data-md-source="">
<div class="md-source__repository">
pod-charlesreid1
</div>
</a>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container">
<main class="md-main">
<div class="md-main__inner md-grid" data-md-component="container">
<div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" data-md-level="0">
<label class="md-nav__title md-nav__title--site" for="__drawer">
<a href="https://pages.charlesreid1.com/pod-charlesreid1" title="pod-charlesreid1" class="md-nav__button md-logo">
<i class="md-icon">dns</i>
</a>
pod-charlesreid1
</label>
<div class="md-nav__source">
<a href="https://git.charlesreid1.com/docker/pod-charlesreid1" title="Go to repository" class="md-source" data-md-source="">
<div class="md-source__repository">
pod-charlesreid1
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href=".." title="Index" class="md-nav__link">
Index
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2" checked>
<label class="md-nav__link" for="nav-2">
Services
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-2">
Services
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../Service_mediawiki/" title="Pod Service: MediaWiki" class="md-nav__link">
Pod Service: MediaWiki
</a>
</li>
<li class="md-nav__item">
<a href="../Service_apachephp/" title="Pod Service: Apache/PHP" class="md-nav__link">
Pod Service: Apache/PHP
</a>
</li>
<li class="md-nav__item">
<a href="../Service_mysql/" title="Pod Service: MySQL" class="md-nav__link">
Pod Service: MySQL
</a>
</li>
<li class="md-nav__item">
<a href="../Service_phpmyadmin/" title="Pod Service: phpMyAdmin" class="md-nav__link">
Pod Service: phpMyAdmin
</a>
</li>
<li class="md-nav__item">
<a href="../Service_nginx/" title="Pod Service: nginx" class="md-nav__link">
Pod Service: nginx
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<a href="./" title="Pod Service: Python File Server" class="md-nav__link md-nav__link--active">
Pod Service: Python File Server
</a>
</li>
<li class="md-nav__item">
<a href="../Service_gitea/" title="Pod Service: Gitea" class="md-nav__link">
Pod Service: Gitea
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../Running/" title="Running the Pod" class="md-nav__link">
Running the Pod
</a>
</li>
<li class="md-nav__item">
<a href="../Volumes/" title="Volumes" class="md-nav__link">
Volumes
</a>
</li>
<li class="md-nav__item">
<a href="../Backups/" title="Backups" class="md-nav__link">
Backups
</a>
</li>
<li class="md-nav__item">
<a href="../Ports/" title="Domains and Ports" class="md-nav__link">
Domains and Ports
</a>
</li>
<li class="md-nav__item">
<a href="../Secrets/" title="Secrets" class="md-nav__link">
Secrets
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary">
</nav>
</div>
</div>
</div>
<div class="md-content">
<article class="md-content__inner md-typeset">
<h1 id="python-file-server">Python File Server<a class="headerlink" href="#python-file-server" title="Permanent link">&para;</a></h1>
<p>This page describes how pod-charlesreid1 provides a lightweight
HTTP file server that is reverse-proxied by nginx to provide
a dead-simple file hosting service at <code>files.charlesreid1.com</code>.</p>
<p>We use an alpine container with Python 3 for a minimal image
size. Python comes with a simple HTTP server built-in that
will do the job for us, available through the <code>http.server</code>
module (or <code>SimpleHTTPServer</code> in Python 2):</p>
<div class="codehilite"><pre><span></span>python3 -m http.server 8081
</pre></div>
<p>We expose this to port 8081 locally, making the service available
on the Docker network and therefore available to be reverse-proxied
by the nginx container.</p>
<p>Files to be served up are located in <code>/www/files/</code> on the host,
which is bind-mounted to <code>/files</code> in the container.</p>
</article>
</div>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-nav">
<nav class="md-footer-nav__inner md-grid">
<a href="../Service_nginx/" title="Pod Service: nginx" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
</div>
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Previous
</span>
Pod Service: nginx
</span>
</div>
</a>
<a href="../Service_gitea/" title="Pod Service: Gitea" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Next
</span>
Pod Service: Gitea
</span>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
</div>
</a>
</nav>
</div>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-footer-copyright">
<div class="md-footer-copyright__highlight">
Copyright &copy; 2018 <a href="https://charlesreid1.com">Charles Reid</a>, released under the <a href="https://opensource.org/licenses/MIT">MIT license</a>
</div>
powered by
<a href="https://www.mkdocs.org">MkDocs</a>
and
<a href="https://squidfunk.github.io/mkdocs-material/">
Material for MkDocs</a>
</div>
</div>
</div>
</footer>
</div>
<script src="../assets/javascripts/application.e72fd936.js"></script>
<script>app.initialize({version:"1.0.4",url:{base:".."}})</script>
<script src="../search/main.js"></script>
</body>
</html>

991
Volumes/index.html

@ -0,0 +1,991 @@ @@ -0,0 +1,991 @@
<!DOCTYPE html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<link rel="canonical" href="https://pages.charlesreid1.com/pod-charlesreid1/Volumes/">
<meta name="lang:clipboard.copy" content="Copy to clipboard">
<meta name="lang:clipboard.copied" content="Copied to clipboard">
<meta name="lang:search.language" content="en">
<meta name="lang:search.pipeline.stopwords" content="True">
<meta name="lang:search.pipeline.trimmer" content="True">
<meta name="lang:search.result.none" content="No matching documents">
<meta name="lang:search.result.one" content="1 matching document">
<meta name="lang:search.result.other" content="# matching documents">
<meta name="lang:search.tokenizer" content="[\s\-]+">
<link rel="shortcut icon" href="..">
<meta name="generator" content="mkdocs-1.0.4, mkdocs-material-3.0.3">
<title>Volumes - pod-charlesreid1</title>
<link rel="stylesheet" href="../assets/stylesheets/application.451f80e5.css">
<link rel="stylesheet" href="../assets/stylesheets/application-palette.22915126.css">
<meta name="theme-color" content="#2196f3">
<script src="../assets/javascripts/modernizr.1aa3b519.js"></script>
<link href="https://fonts.gstatic.com" rel="preconnect" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
<style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
<link rel="stylesheet" href="../assets/fonts/material-icons.css">
<link rel="stylesheet" href="../css/custom.css">
</head>
<body dir="ltr" data-md-color-primary="blue" data-md-color-accent="blue">
<svg class="md-svg">
<defs>
</defs>
</svg>
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" data-md-component="overlay" for="__drawer"></label>
<a href="../#volumes" tabindex="1" class="md-skip">
Skip to content
</a>
<header class="md-header" data-md-component="header">
<nav class="md-header-nav md-grid">
<div class="md-flex">
<div class="md-flex__cell md-flex__cell--shrink">
<a href="https://pages.charlesreid1.com/pod-charlesreid1" title="pod-charlesreid1" class="md-header-nav__button md-logo">
<i class="md-icon">dns</i>
</a>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--menu md-header-nav__button" for="__drawer"></label>
</div>
<div class="md-flex__cell md-flex__cell--stretch">
<div class="md-flex__ellipsis md-header-nav__title" data-md-component="title">
<span class="md-header-nav__topic">
pod-charlesreid1
</span>
<span class="md-header-nav__topic">
Volumes
</span>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--search md-header-nav__button" for="__search"></label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query" data-md-state="active">
<label class="md-icon md-search__icon" for="__search"></label>
<button type="reset" class="md-icon md-search__icon" data-md-component="reset" tabindex="-1">
&#xE5CD;
</button>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="result">
<div class="md-search-result__meta">
Type to start searching
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<div class="md-header-nav__source">
<a href="https://git.charlesreid1.com/docker/pod-charlesreid1" title="Go to repository" class="md-source" data-md-source="">
<div class="md-source__repository">
pod-charlesreid1
</div>
</a>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container">
<main class="md-main">
<div class="md-main__inner md-grid" data-md-component="container">
<div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" data-md-level="0">
<label class="md-nav__title md-nav__title--site" for="__drawer">
<a href="https://pages.charlesreid1.com/pod-charlesreid1" title="pod-charlesreid1" class="md-nav__button md-logo">
<i class="md-icon">dns</i>
</a>
pod-charlesreid1
</label>
<div class="md-nav__source">
<a href="https://git.charlesreid1.com/docker/pod-charlesreid1" title="Go to repository" class="md-source" data-md-source="">
<div class="md-source__repository">
pod-charlesreid1
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href=".." title="Index" class="md-nav__link">
Index
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
<label class="md-nav__link" for="nav-2">
Services
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-2">
Services
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../Service_mediawiki/" title="Pod Service: MediaWiki" class="md-nav__link">
Pod Service: MediaWiki
</a>
</li>
<li class="md-nav__item">
<a href="../Service_apachephp/" title="Pod Service: Apache/PHP" class="md-nav__link">
Pod Service: Apache/PHP
</a>
</li>
<li class="md-nav__item">
<a href="../Service_mysql/" title="Pod Service: MySQL" class="md-nav__link">
Pod Service: MySQL
</a>
</li>
<li class="md-nav__item">
<a href="../Service_phpmyadmin/" title="Pod Service: phpMyAdmin" class="md-nav__link">
Pod Service: phpMyAdmin
</a>
</li>
<li class="md-nav__item">
<a href="../Service_nginx/" title="Pod Service: nginx" class="md-nav__link">
Pod Service: nginx
</a>
</li>
<li class="md-nav__item">
<a href="../Service_pythonfiles/" title="Pod Service: Python File Server" class="md-nav__link">
Pod Service: Python File Server
</a>
</li>
<li class="md-nav__item">
<a href="../Service_gitea/" title="Pod Service: Gitea" class="md-nav__link">
Pod Service: Gitea
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../Running/" title="Running the Pod" class="md-nav__link">
Running the Pod
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
Volumes
</label>
<a href="./" title="Volumes" class="md-nav__link md-nav__link--active">
Volumes
</a>
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#persistent-data-volumes" title="Persistent Data Volumes" class="md-nav__link">
Persistent Data Volumes
</a>
</li>
<li class="md-nav__item">
<a href="#nginx" title="nginx" class="md-nav__link">
nginx
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#nginx-lets-encrypt-ssl-certificates" title="nginx + lets encrypt ssl certificates" class="md-nav__link">
nginx + lets encrypt ssl certificates
</a>
</li>
<li class="md-nav__item">
<a href="#nginx-static-content" title="nginx static content" class="md-nav__link">
nginx static content
</a>
</li>
<li class="md-nav__item">
<a href="#nginx-bind-mounted-files" title="nginx bind-mounted files" class="md-nav__link">
nginx bind-mounted files
</a>
</li>
<li class="md-nav__item">
<a href="#other-nginx-bind-mounted-files" title="other nginx bind-mounted files" class="md-nav__link">
other nginx bind-mounted files
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#mysql" title="mysql" class="md-nav__link">
mysql
</a>
</li>
<li class="md-nav__item">
<a href="#mediawiki" title="mediawiki" class="md-nav__link">
mediawiki
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mediawiki-data-volume" title="mediawiki data volume" class="md-nav__link">
mediawiki data volume
</a>
</li>
<li class="md-nav__item">
<a href="#mediawiki-bind-mounted-files" title="mediawiki bind-mounted files" class="md-nav__link">
mediawiki bind-mounted files
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#gitea" title="gitea" class="md-nav__link">
gitea
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#gitea-data-volume" title="gitea data volume" class="md-nav__link">
gitea data volume
</a>
</li>
<li class="md-nav__item">
<a href="#gitea-bind-mounted-files" title="gitea bind-mounted files" class="md-nav__link">
gitea bind-mounted files
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#python-file-server" title="python file server" class="md-nav__link">
python file server
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#pyfiles-directory" title="pyfiles directory" class="md-nav__link">
pyfiles directory
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../Backups/" title="Backups" class="md-nav__link">
Backups
</a>
</li>
<li class="md-nav__item">
<a href="../Ports/" title="Domains and Ports" class="md-nav__link">
Domains and Ports
</a>
</li>
<li class="md-nav__item">
<a href="../Secrets/" title="Secrets" class="md-nav__link">
Secrets
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#persistent-data-volumes" title="Persistent Data Volumes" class="md-nav__link">
Persistent Data Volumes
</a>
</li>
<li class="md-nav__item">
<a href="#nginx" title="nginx" class="md-nav__link">
nginx
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#nginx-lets-encrypt-ssl-certificates" title="nginx + lets encrypt ssl certificates" class="md-nav__link">
nginx + lets encrypt ssl certificates
</a>
</li>
<li class="md-nav__item">
<a href="#nginx-static-content" title="nginx static content" class="md-nav__link">
nginx static content
</a>
</li>
<li class="md-nav__item">
<a href="#nginx-bind-mounted-files" title="nginx bind-mounted files" class="md-nav__link">
nginx bind-mounted files
</a>
</li>
<li class="md-nav__item">
<a href="#other-nginx-bind-mounted-files" title="other nginx bind-mounted files" class="md-nav__link">
other nginx bind-mounted files
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#mysql" title="mysql" class="md-nav__link">
mysql
</a>
</li>
<li class="md-nav__item">
<a href="#mediawiki" title="mediawiki" class="md-nav__link">
mediawiki
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mediawiki-data-volume" title="mediawiki data volume" class="md-nav__link">
mediawiki data volume
</a>
</li>
<li class="md-nav__item">
<a href="#mediawiki-bind-mounted-files" title="mediawiki bind-mounted files" class="md-nav__link">
mediawiki bind-mounted files
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#gitea" title="gitea" class="md-nav__link">
gitea
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#gitea-data-volume" title="gitea data volume" class="md-nav__link">
gitea data volume
</a>
</li>
<li class="md-nav__item">
<a href="#gitea-bind-mounted-files" title="gitea bind-mounted files" class="md-nav__link">
gitea bind-mounted files
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#python-file-server" title="python file server" class="md-nav__link">
python file server
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#pyfiles-directory" title="pyfiles directory" class="md-nav__link">
pyfiles directory
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content">
<article class="md-content__inner md-typeset">
<h1 id="volumes">Volumes<a class="headerlink" href="#volumes" title="Permanent link">&para;</a></h1>
<h2 id="persistent-data-volumes">Persistent Data Volumes<a class="headerlink" href="#persistent-data-volumes" title="Permanent link">&para;</a></h2>
<p>docker-compose volumes are mostly persistent, but they can
be deleted relatively easily.</p>
<p>When you're using docker-compose, volumes are persistent
through both <code>docker-compose stop</code> and <code>docker-compose down</code> commands.</p>
<p>The <code>docker-compose down</code> command will destroy everything including networks
and mounted files, while <code>docker-compose stop</code> will just stop the containers.</p>
<p><strong><em>DANGER - DANGER - DANGER</em></strong></p>
<p>If you want to remove the volumes, use <code>docker-compose down -v</code>.</p>
<div class="codehilite"><pre><span></span>docker-compose down -v # DANGER!!!
</pre></div>
<p>To force removal of the volumes:</p>
<div class="codehilite"><pre><span></span>docker-compose down -v -f # DANGER!!!
</pre></div>
<p>To see the current list of docker volumes:</p>
<div class="codehilite"><pre><span></span>docker volume ls
</pre></div>
<p>You can also interact with the volumes individually
this way. Run <code>docker volume</code> for help.</p>
<hr />
<h2 id="nginx">nginx<a class="headerlink" href="#nginx" title="Permanent link">&para;</a></h2>
<p>The nginx service does not have any data volumes,
but has several static files that are bind-mounted.
Most importantly, nginx handles the SSL certificates
for all subdomains.</p>
<hr />
<h3 id="nginx-lets-encrypt-ssl-certificates">nginx + lets encrypt ssl certificates<a class="headerlink" href="#nginx-lets-encrypt-ssl-certificates" title="Permanent link">&para;</a></h3>
<p>Rather than fuss with getting the letsencrypt
docker image working, we made SSL certs by hand.</p>
<p>See <a href="https://git.charlesreid1.com/charlesreid1/certbot">git.charlesreid1.com/charlesreid1/certbot</a></p>
<p>Certbot will put the SSL certificates into
<code>/etc/letsencrypt/live/example.com</code>.</p>
<p>We bind-mount the entire <code>/etc/letsencrypt</code> directory
into the same location in the nginx container
(see this volumes line in <code>docker-compose.yml</code>):</p>
<div class="codehilite"><pre><span></span> - &quot;/etc/letsencrypt:/etc/letsencrypt&quot;
</pre></div>
<p>To renew certificates (every few months), just run the certbot script in the certbot repo.</p>
<h3 id="nginx-static-content">nginx static content<a class="headerlink" href="#nginx-static-content" title="Permanent link">&para;</a></h3>
<p>The main site hosted by nginx (charlesreid1.com) is served up
from a directory of static content under version control.</p>
<p>This static content is bind-mounted and lives on the host
(no data volume is used for nginx).</p>
<p>On the host, static site contents are stored at <code>/www/</code>
with a directory structure and corresponding permissions
as follows:</p>
<div class="codehilite"><pre><span></span>/www/ # &lt;-- owned by regular user
charlesreid1.blue/ # &lt;-- owned by regular user
charlesreid1.blue-src/ # &lt;-- owned by regular user
&lt;pelican files&gt;
htdocs/ # &lt;-- owned by www-data
&lt;web site static contents&gt;
charlesreid1.red/ # &lt;-- owned by regular user
charlesreid1.red-src/ # &lt;-- owned by regular user
&lt;pelican files&gt;
htdocs/ # &lt;-- owned by www-data
&lt;web site static contents&gt;
charlesreid1.com/
charlesreid1.com-src/
&lt;pelican files&gt;
htdocs/
&lt;web site static contents&gt;
...
</pre></div>
<p>Each domain has its own directory, in which there is a source directory
(git repository containing pelican files) and an htdocs directory
(git repository containing live hosted static content).</p>
<p>These are mounted in the container at the same location.
See the volumes section of the nginx container:</p>
<div class="codehilite"><pre><span></span> - &quot;/www/charlesreid1.blue/htdocs:/www/charlesreid1.blue/htdocs:ro&quot;
- &quot;/www/charlesreid1.red/htdocs:/www/charlesreid1.red/htdocs:ro&quot;
- &quot;/www/charlesreid1.com/htdocs:/www/charlesreid1.com/htdocs:ro&quot;
</pre></div>
<p>The source and htdocs directories are separate branches of the same repo.
Each website has (TODO: will have) its own repository.</p>
<p>The <code>master</code> branch contains the source code for that repository,
mainly pelican files plus html/css/js.</p>
<p>The <code>pages</code> branch contains the static content to be hosted
by the nginx web server.</p>
<p>Ownership makes dealing with this stuff a pain in the ass.
The <code>htdocs</code> dir must be owned/updated by <code>www-data</code>,
so you need to update the git repo contents as that user:</p>
<div class="codehilite"><pre><span></span>sudo -H -u www-data git pull origin pages
</pre></div>
<h3 id="nginx-bind-mounted-files">nginx bind-mounted files<a class="headerlink" href="#nginx-bind-mounted-files" title="Permanent link">&para;</a></h3>
<p>We bind-mount a directory <code>conf.d</code> containing
nginx configuration files into the container
at <code>/etc/nginx/conf.d</code>, which is where nginx
automatically looks for and loads configuration
files.</p>
<p>The custom nginx configuration files are split up
by protocol and subdomain, and can be found
in the <a href="https://git.charlesreid1.com/docker/d-nginx-charlesreid1">d-nginx-charlesreid1</a>
repository. From the <code>docker-compose.yml</code> file
nginx volumes directive:</p>
<div class="codehilite"><pre><span></span> - &quot;./d-nginx-charlesreid1/conf.d:/etc/nginx/conf.d:ro&quot;
</pre></div>
<h3 id="other-nginx-bind-mounted-files">other nginx bind-mounted files<a class="headerlink" href="#other-nginx-bind-mounted-files" title="Permanent link">&para;</a></h3>
<p>The last remaining nginx file that is bind-mounted into the container
is <code>/etc/localtime</code>, which ensures our webserver's timestamps match
the host's. In the nginx volumes directive:</p>
<div class="codehilite"><pre><span></span> - &quot;/etc/localtime:/etc/localtime:ro&quot;
</pre></div>
<hr />
<h2 id="mysql">mysql<a class="headerlink" href="#mysql" title="Permanent link">&para;</a></h2>
<p>The MySQL database container is used by MediaWiki
and stores its data on disk in a data volume.
Inside the conatiner all MySQL data lives at</p>
<div class="codehilite"><pre><span></span>/var/lib/mysql
</pre></div>
<p>This is mapped to a data volume, <code>stormy_mysql_data</code>.</p>
<p>There is no custom configuration of the MySQL database
at this time, but to add a custom config file,
mount it in the container via bind-mounting
by adding this to the volumes section of
<code>docker-compose.yml</code>:</p>
<div class="codehilite"><pre><span></span> - &quot;./d-mysql/krash.mysql.cnf:/etc/mysql/conf.d/krash.mysql.cnf&quot;
</pre></div>
<hr />
<h2 id="mediawiki">mediawiki<a class="headerlink" href="#mediawiki" title="Permanent link">&para;</a></h2>
<h3 id="mediawiki-data-volume">mediawiki data volume<a class="headerlink" href="#mediawiki-data-volume" title="Permanent link">&para;</a></h3>
<p>The MediaWiki container hosts all wiki files
from <code>/var/www/html</code> (in the MediaWiki container).</p>
<p>When the container is built from the Dockerfile,
most of the customized MediaWiki files are copied
into the data volume. These include:</p>
<ul>
<li><code>LocalSettings.php</code> - MediaWiki config file</li>
<li><code>skins/</code> directory</li>
<li><code>extensions/</code> directory</li>
</ul>
<p>MediaWiki files are kept under version control in the
<a href="https://git.charlesreid1.com/docker/d-mediawiki">d-mediawiki</a>
repo.</p>
<p>The MediaWiki container uses a data volume called
<code>stormy_mw_data</code>, which is mounted at <code>/var/www/html</code>
inside the container.</p>
<p>The docker-compose file takes care of creating the data volume.</p>
<h3 id="mediawiki-bind-mounted-files">mediawiki bind-mounted files<a class="headerlink" href="#mediawiki-bind-mounted-files" title="Permanent link">&para;</a></h3>
<p>(TODO: ambiguous how skins dir is mounted;
copying skins into container in Dockerfile,
and bind-mounting bootstrap2 at runtime.)</p>
<p>MediaWiki skins are kept under version control
in the <a href="https://git.charlesreid1.com/docker/d-mediawiki">d-mediawiki</a>
repo.</p>
<p>The Bootstrap2 MediaWiki skin is bind-mounted into the container
at <code>/var/www/html/skins/Bootstrap2/</code>.</p>
<p>If you make changes to the skin or MediaWiki config files,
update the MediaWiki docker image as follows:</p>
<div class="codehilite"><pre><span></span>docker-compose build
docker-compose down
docker-compose up
</pre></div>
<hr />
<h2 id="gitea">gitea<a class="headerlink" href="#gitea" title="Permanent link">&para;</a></h2>
<h3 id="gitea-data-volume">gitea data volume<a class="headerlink" href="#gitea-data-volume" title="Permanent link">&para;</a></h3>
<h3 id="gitea-bind-mounted-files">gitea bind-mounted files<a class="headerlink" href="#gitea-bind-mounted-files" title="Permanent link">&para;</a></h3>
<hr />
<h2 id="python-file-server">python file server<a class="headerlink" href="#python-file-server" title="Permanent link">&para;</a></h2>
<h3 id="pyfiles-directory">pyfiles directory<a class="headerlink" href="#pyfiles-directory" title="Permanent link">&para;</a></h3>
</article>
</div>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-nav">
<nav class="md-footer-nav__inner md-grid">
<a href="../Running/" title="Running the Pod" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
</div>
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Previous
</span>
Running the Pod
</span>
</div>
</a>
<a href="../Backups/" title="Backups" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Next
</span>
Backups
</span>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
</div>
</a>
</nav>
</div>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-footer-copyright">
<div class="md-footer-copyright__highlight">
Copyright &copy; 2018 <a href="https://charlesreid1.com">Charles Reid</a>, released under the <a href="https://opensource.org/licenses/MIT">MIT license</a>
</div>
powered by
<a href="https://www.mkdocs.org">MkDocs</a>
and
<a href="https://squidfunk.github.io/mkdocs-material/">
Material for MkDocs</a>
</div>
</div>
</div>
</footer>
</div>
<script src="../assets/javascripts/application.e72fd936.js"></script>
<script>app.initialize({version:"1.0.4",url:{base:".."}})</script>
<script src="../search/main.js"></script>
</body>
</html>

4
assets/fonts/font-awesome.css vendored

File diff suppressed because one or more lines are too long

13
assets/fonts/material-icons.css

@ -0,0 +1,13 @@ @@ -0,0 +1,13 @@
/*!
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE
* DISTRIBUTED UNDER THE LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
* SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING PERMISSIONS AND
* LIMITATIONS UNDER THE LICENSE.
*/@font-face{font-family:"Material Icons";font-style:normal;font-weight:400;src:local("Material Icons"),local("MaterialIcons-Regular"),url("specimen/MaterialIcons-Regular.woff2") format("woff2"),url("specimen/MaterialIcons-Regular.woff") format("woff"),url("specimen/MaterialIcons-Regular.ttf") format("truetype")}

0
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/fonts/fontawesome-webfont.ttf → assets/fonts/specimen/FontAwesome.ttf

0
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/fonts/fontawesome-webfont.woff → assets/fonts/specimen/FontAwesome.woff

0
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/fonts/fontawesome-webfont.woff2 → assets/fonts/specimen/FontAwesome.woff2

BIN
assets/fonts/specimen/MaterialIcons-Regular.ttf

Binary file not shown.

BIN
assets/fonts/specimen/MaterialIcons-Regular.woff

Binary file not shown.

BIN
assets/fonts/specimen/MaterialIcons-Regular.woff2

Binary file not shown.

BIN
assets/images/favicon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 521 B

20
assets/images/icons/bitbucket.1b09e088.svg

@ -0,0 +1,20 @@ @@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" width="352" height="448"
viewBox="0 0 352 448" id="__bitbucket">
<path fill="currentColor" d="M203.75 214.75q2 15.75-12.625 25.25t-27.875
1.5q-9.75-4.25-13.375-14.5t-0.125-20.5 13-14.5q9-4.5 18.125-3t16 8.875
6.875 16.875zM231.5 209.5q-3.5-26.75-28.25-41t-49.25-3.25q-15.75
7-25.125 22.125t-8.625 32.375q1 22.75 19.375 38.75t41.375 14q22.75-2
38-21t12.5-42zM291.25
74q-5-6.75-14-11.125t-14.5-5.5-17.75-3.125q-72.75-11.75-141.5 0.5-10.75
1.75-16.5 3t-13.75 5.5-12.5 10.75q7.5 7 19 11.375t18.375 5.5 21.875
2.875q57 7.25 112 0.25 15.75-2 22.375-3t18.125-5.375 18.75-11.625zM305.5
332.75q-2 6.5-3.875 19.125t-3.5 21-7.125 17.5-14.5 14.125q-21.5
12-47.375 17.875t-50.5 5.5-50.375-4.625q-11.5-2-20.375-4.5t-19.125-6.75-18.25-10.875-13-15.375q-6.25-24-14.25-73l1.5-4
4.5-2.25q55.75 37 126.625 37t126.875-37q5.25 1.5 6 5.75t-1.25 11.25-2
9.25zM350.75 92.5q-6.5 41.75-27.75 163.75-1.25 7.5-6.75 14t-10.875
10-13.625 7.75q-63 31.5-152.5
22-62-6.75-98.5-34.75-3.75-3-6.375-6.625t-4.25-8.75-2.25-8.5-1.5-9.875-1.375-8.75q-2.25-12.5-6.625-37.5t-7-40.375-5.875-36.875-5.5-39.5q0.75-6.5
4.375-12.125t7.875-9.375 11.25-7.5 11.5-5.625 12-4.625q31.25-11.5
78.25-16 94.75-9.25 169 12.5 38.75 11.5 53.75 30.5 4 5 4.125
12.75t-1.375 13.5z" />
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

18
assets/images/icons/github.f0b8504a.svg

@ -0,0 +1,18 @@ @@ -0,0 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" width="416" height="448"
viewBox="0 0 416 448" id="__github">
<path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19-18.125
8.5-18.125-8.5-10.75-19-3.125-20.5 3.125-20.5 10.75-19 18.125-8.5
18.125 8.5 10.75 19 3.125 20.5zM320 304q0 10-3.125 20.5t-10.75
19-18.125 8.5-18.125-8.5-10.75-19-3.125-20.5 3.125-20.5 10.75-19
18.125-8.5 18.125 8.5 10.75 19 3.125 20.5zM360
304q0-30-17.25-51t-46.75-21q-10.25 0-48.75 5.25-17.75 2.75-39.25
2.75t-39.25-2.75q-38-5.25-48.75-5.25-29.5 0-46.75 21t-17.25 51q0 22 8
38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0
37.25-1.75t35-7.375 30.5-15 20.25-25.75 8-38.375zM416 260q0 51.75-15.25
82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5-41.75
1.125q-19.5 0-35.5-0.75t-36.875-3.125-38.125-7.5-34.25-12.875-30.25-20.25-21.5-28.75q-15.5-30.75-15.5-82.75
0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25
30.875q36.75-8.75 77.25-8.75 37 0 70 8 26.25-20.5
46.75-30.25t47.25-9.75q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34
99.5z" />
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

38
assets/images/icons/gitlab.6dd19c00.svg

@ -0,0 +1,38 @@ @@ -0,0 +1,38 @@
<svg xmlns="http://www.w3.org/2000/svg" width="500" height="500"
viewBox="0 0 500 500" id="__gitlab">
<g transform="translate(156.197863, 1.160267)">
<path fill="currentColor"
d="M93.667,473.347L93.667,473.347l90.684-279.097H2.983L93.667,
473.347L93.667,473.347z" />
</g>
<g transform="translate(28.531199, 1.160800)" opacity="0.7">
<path fill="currentColor"
d="M221.333,473.345L130.649,194.25H3.557L221.333,473.345L221.333,
473.345z" />
</g>
<g transform="translate(0.088533, 0.255867)" opacity="0.5">
<path fill="currentColor"
d="M32,195.155L32,195.155L4.441,279.97c-2.513,7.735,0.24,16.21,6.821,
20.99l238.514,173.29 L32,195.155L32,195.155z" />
</g>
<g transform="translate(29.421866, 280.255593)">
<path fill="currentColor"
d="M2.667-84.844h127.092L75.14-252.942c-2.811-8.649-15.047-8.649-17.856,
0L2.667-84.844 L2.667-84.844z" />
</g>
<g transform="translate(247.197860, 1.160800)" opacity="0.7">
<path fill="currentColor"
d="M2.667,473.345L93.351,194.25h127.092L2.667,473.345L2.667,
473.345z" />
</g>
<g transform="translate(246.307061, 0.255867)" opacity="0.5">
<path fill="currentColor"
d="M221.334,195.155L221.334,195.155l27.559,84.815c2.514,7.735-0.24,
16.21-6.821,20.99 L3.557,474.25L221.334,195.155L221.334,195.155z" />
</g>
<g transform="translate(336.973725, 280.255593)">
<path fill="currentColor"
d="M130.667-84.844H3.575l54.618-168.098c2.811-8.649,15.047-8.649,
17.856,0L130.667-84.844 L130.667-84.844z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

1
assets/javascripts/application.e72fd936.js

File diff suppressed because one or more lines are too long

1
assets/javascripts/lunr/lunr.da.js

@ -0,0 +1 @@ @@ -0,0 +1 @@
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,i,n;e.da=function(){this.pipeline.reset(),this.pipeline.add(e.da.trimmer,e.da.stopWordFilter,e.da.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.da.stemmer))},e.da.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.da.trimmer=e.trimmerSupport.generateTrimmer(e.da.wordCharacters),e.Pipeline.registerFunction(e.da.trimmer,"trimmer-da"),e.da.stemmer=(r=e.stemmerSupport.Among,i=e.stemmerSupport.SnowballProgram,n=new function(){var e,n,t,s=[new r("hed",-1,1),new r("ethed",0,1),new r("ered",-1,1),new r("e",-1,1),new r("erede",3,1),new r("ende",3,1),new r("erende",5,1),new r("ene",3,1),new r("erne",3,1),new r("ere",3,1),new r("en",-1,1),new r("heden",10,1),new r("eren",10,1),new r("er",-1,1),new r("heder",13,1),new r("erer",13,1),new r("s",-1,2),new r("heds",16,1),new r("es",16,1),new r("endes",18,1),new r("erendes",19,1),new r("enes",18,1),new r("ernes",18,1),new r("eres",18,1),new r("ens",16,1),new r("hedens",24,1),new r("erens",24,1),new r("ers",16,1),new r("ets",16,1),new r("erets",28,1),new r("et",-1,1),new r("eret",30,1)],o=[new r("gd",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1)],a=[new r("ig",-1,1),new r("lig",0,1),new r("elig",1,1),new r("els",-1,1),new r("løst",-1,2)],d=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],u=[239,254,42,3,0,0,0,0,0,0,0,0,0,0,0,0,16],c=new i;function l(){var e,r=c.limit-c.cursor;c.cursor>=n&&(e=c.limit_backward,c.limit_backward=n,c.ket=c.cursor,c.find_among_b(o,4)?(c.bra=c.cursor,c.limit_backward=e,c.cursor=c.limit-r,c.cursor>c.limit_backward&&(c.cursor--,c.bra=c.cursor,c.slice_del())):c.limit_backward=e)}this.setCurrent=function(e){c.setCurrent(e)},this.getCurrent=function(){return c.getCurrent()},this.stem=function(){var r,i=c.cursor;return function(){var r,i=c.cursor+3;if(n=c.limit,0<=i&&i<=c.limit){for(e=i;;){if(r=c.cursor,c.in_grouping(d,97,248)){c.cursor=r;break}if(c.cursor=r,r>=c.limit)return;c.cursor++}for(;!c.out_grouping(d,97,248);){if(c.cursor>=c.limit)return;c.cursor++}(n=c.cursor)<e&&(n=e)}}(),c.limit_backward=i,c.cursor=c.limit,function(){var e,r;if(c.cursor>=n&&(r=c.limit_backward,c.limit_backward=n,c.ket=c.cursor,e=c.find_among_b(s,32),c.limit_backward=r,e))switch(c.bra=c.cursor,e){case 1:c.slice_del();break;case 2:c.in_grouping_b(u,97,229)&&c.slice_del()}}(),c.cursor=c.limit,l(),c.cursor=c.limit,function(){var e,r,i,t=c.limit-c.cursor;if(c.ket=c.cursor,c.eq_s_b(2,"st")&&(c.bra=c.cursor,c.eq_s_b(2,"ig")&&c.slice_del()),c.cursor=c.limit-t,c.cursor>=n&&(r=c.limit_backward,c.limit_backward=n,c.ket=c.cursor,e=c.find_among_b(a,5),c.limit_backward=r,e))switch(c.bra=c.cursor,e){case 1:c.slice_del(),i=c.limit-c.cursor,l(),c.cursor=c.limit-i;break;case 2:c.slice_from("løs")}}(),c.cursor=c.limit,c.cursor>=n&&(r=c.limit_backward,c.limit_backward=n,c.ket=c.cursor,c.out_grouping_b(d,97,248)?(c.bra=c.cursor,t=c.slice_to(t),c.limit_backward=r,c.eq_v_b(t)&&c.slice_del()):c.limit_backward=r),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}),e.Pipeline.registerFunction(e.da.stemmer,"stemmer-da"),e.da.stopWordFilter=e.generateStopWordFilter("ad af alle alt anden at blev blive bliver da de dem den denne der deres det dette dig din disse dog du efter eller en end er et for fra ham han hans har havde have hende hendes her hos hun hvad hvis hvor i ikke ind jeg jer jo kunne man mange med meget men mig min mine mit mod ned noget nogle nu når og også om op os over på selv sig sin sine sit skal skulle som sådan thi til ud under var vi vil ville vor være været".split(" ")),e.Pipeline.registerFunction(e.da.stopWordFilter,"stopWordFilter-da")}});

1
assets/javascripts/lunr/lunr.de.js

File diff suppressed because one or more lines are too long

1
assets/javascripts/lunr/lunr.du.js

File diff suppressed because one or more lines are too long

1
assets/javascripts/lunr/lunr.es.js

File diff suppressed because one or more lines are too long

1
assets/javascripts/lunr/lunr.fi.js

File diff suppressed because one or more lines are too long

1
assets/javascripts/lunr/lunr.fr.js

File diff suppressed because one or more lines are too long

1
assets/javascripts/lunr/lunr.hu.js

File diff suppressed because one or more lines are too long

1
assets/javascripts/lunr/lunr.it.js

File diff suppressed because one or more lines are too long

1
assets/javascripts/lunr/lunr.jp.js

@ -0,0 +1 @@ @@ -0,0 +1 @@
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.jp=function(){this.pipeline.reset(),this.pipeline.add(e.jp.stopWordFilter,e.jp.stemmer),r?this.tokenizer=e.jp.tokenizer:(e.tokenizer&&(e.tokenizer=e.jp.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.jp.tokenizer))};var t=new e.TinySegmenter;e.jp.tokenizer=function(n){if(!arguments.length||null==n||null==n)return[];if(Array.isArray(n))return n.map(function(t){return r?new e.Token(t.toLowerCase()):t.toLowerCase()});for(var i=n.toString().toLowerCase().replace(/^\s+/,""),o=i.length-1;o>=0;o--)if(/\S/.test(i.charAt(o))){i=i.substring(0,o+1);break}return t.segment(i).filter(function(e){return!!e}).map(function(t){return r?new e.Token(t):t})},e.jp.stemmer=function(e){return e},e.Pipeline.registerFunction(e.jp.stemmer,"stemmer-jp"),e.jp.wordCharacters="一二三四五六七八九十百千万億兆一-龠々〆ヵヶぁ-んァ-ヴーア-ン゙a-zA-Za-zA-Z0-90-9",e.jp.stopWordFilter=function(t){if(-1===e.jp.stopWordFilter.stopWords.indexOf(r?t.toString():t))return t},e.jp.stopWordFilter=e.generateStopWordFilter("これ それ あれ この その あの ここ そこ あそこ こちら どこ だれ なに なん 何 私 貴方 貴方方 我々 私達 あの人 あのかた 彼女 彼 です あります おります います は が の に を で え から まで より も どの と し それで しかし".split(" ")),e.Pipeline.registerFunction(e.jp.stopWordFilter,"stopWordFilter-jp")}});

1
assets/javascripts/lunr/lunr.multi.js

@ -0,0 +1 @@ @@ -0,0 +1 @@
!function(e,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(e.lunr)}(this,function(){return function(e){e.multiLanguage=function(){for(var i=Array.prototype.slice.call(arguments),t=i.join("-"),r="",n=[],s=[],p=0;p<i.length;++p)"en"==i[p]?(r+="\\w",n.unshift(e.stopWordFilter),n.push(e.stemmer),s.push(e.stemmer)):(r+=e[i[p]].wordCharacters,n.unshift(e[i[p]].stopWordFilter),n.push(e[i[p]].stemmer),s.push(e[i[p]].stemmer));var o=e.trimmerSupport.generateTrimmer(r);return e.Pipeline.registerFunction(o,"lunr-multi-trimmer-"+t),n.unshift(o),function(){this.pipeline.reset(),this.pipeline.add.apply(this.pipeline,n),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add.apply(this.searchPipeline,s))}}}});

1
assets/javascripts/lunr/lunr.no.js

@ -0,0 +1 @@ @@ -0,0 +1 @@
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,n,i;e.no=function(){this.pipeline.reset(),this.pipeline.add(e.no.trimmer,e.no.stopWordFilter,e.no.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.no.stemmer))},e.no.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.no.trimmer=e.trimmerSupport.generateTrimmer(e.no.wordCharacters),e.Pipeline.registerFunction(e.no.trimmer,"trimmer-no"),e.no.stemmer=(r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){var e,i,t=[new r("a",-1,1),new r("e",-1,1),new r("ede",1,1),new r("ande",1,1),new r("ende",1,1),new r("ane",1,1),new r("ene",1,1),new r("hetene",6,1),new r("erte",1,3),new r("en",-1,1),new r("heten",9,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",12,1),new r("s",-1,2),new r("as",14,1),new r("es",14,1),new r("edes",16,1),new r("endes",16,1),new r("enes",16,1),new r("hetenes",19,1),new r("ens",14,1),new r("hetens",21,1),new r("ers",14,1),new r("ets",14,1),new r("et",-1,1),new r("het",25,1),new r("ert",-1,3),new r("ast",-1,1)],o=[new r("dt",-1,-1),new r("vt",-1,-1)],s=[new r("leg",-1,1),new r("eleg",0,1),new r("ig",-1,1),new r("eig",2,1),new r("lig",2,1),new r("elig",4,1),new r("els",-1,1),new r("lov",-1,1),new r("elov",7,1),new r("slov",7,1),new r("hetslov",9,1)],a=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],m=[119,125,149,1],l=new n;this.setCurrent=function(e){l.setCurrent(e)},this.getCurrent=function(){return l.getCurrent()},this.stem=function(){var r,n,u,d,c=l.cursor;return function(){var r,n=l.cursor+3;if(i=l.limit,0<=n||n<=l.limit){for(e=n;;){if(r=l.cursor,l.in_grouping(a,97,248)){l.cursor=r;break}if(r>=l.limit)return;l.cursor=r+1}for(;!l.out_grouping(a,97,248);){if(l.cursor>=l.limit)return;l.cursor++}(i=l.cursor)<e&&(i=e)}}(),l.limit_backward=c,l.cursor=l.limit,function(){var e,r,n;if(l.cursor>=i&&(r=l.limit_backward,l.limit_backward=i,l.ket=l.cursor,e=l.find_among_b(t,29),l.limit_backward=r,e))switch(l.bra=l.cursor,e){case 1:l.slice_del();break;case 2:n=l.limit-l.cursor,l.in_grouping_b(m,98,122)?l.slice_del():(l.cursor=l.limit-n,l.eq_s_b(1,"k")&&l.out_grouping_b(a,97,248)&&l.slice_del());break;case 3:l.slice_from("er")}}(),l.cursor=l.limit,n=l.limit-l.cursor,l.cursor>=i&&(r=l.limit_backward,l.limit_backward=i,l.ket=l.cursor,l.find_among_b(o,2)?(l.bra=l.cursor,l.limit_backward=r,l.cursor=l.limit-n,l.cursor>l.limit_backward&&(l.cursor--,l.bra=l.cursor,l.slice_del())):l.limit_backward=r),l.cursor=l.limit,l.cursor>=i&&(d=l.limit_backward,l.limit_backward=i,l.ket=l.cursor,(u=l.find_among_b(s,11))?(l.bra=l.cursor,l.limit_backward=d,1==u&&l.slice_del()):l.limit_backward=d),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}),e.Pipeline.registerFunction(e.no.stemmer,"stemmer-no"),e.no.stopWordFilter=e.generateStopWordFilter("alle at av bare begge ble blei bli blir blitt både båe da de deg dei deim deira deires dem den denne der dere deres det dette di din disse ditt du dykk dykkar då eg ein eit eitt eller elles en enn er et ett etter for fordi fra før ha hadde han hans har hennar henne hennes her hjå ho hoe honom hoss hossen hun hva hvem hver hvilke hvilken hvis hvor hvordan hvorfor i ikke ikkje ikkje ingen ingi inkje inn inni ja jeg kan kom korleis korso kun kunne kva kvar kvarhelst kven kvi kvifor man mange me med medan meg meget mellom men mi min mine mitt mot mykje ned no noe noen noka noko nokon nokor nokre nå når og også om opp oss over på samme seg selv si si sia sidan siden sin sine sitt sjøl skal skulle slik so som som somme somt så sånn til um upp ut uten var vart varte ved vere verte vi vil ville vore vors vort vår være være vært å".split(" ")),e.Pipeline.registerFunction(e.no.stopWordFilter,"stopWordFilter-no")}});

1
assets/javascripts/lunr/lunr.pt.js

File diff suppressed because one or more lines are too long

1
assets/javascripts/lunr/lunr.ro.js

File diff suppressed because one or more lines are too long

1
assets/javascripts/lunr/lunr.ru.js

File diff suppressed because one or more lines are too long

1
assets/javascripts/lunr/lunr.stemmer.support.js

@ -0,0 +1 @@ @@ -0,0 +1 @@
!function(r,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(r.lunr)}(this,function(){return function(r){r.stemmerSupport={Among:function(r,t,i,s){if(this.toCharArray=function(r){for(var t=r.length,i=new Array(t),s=0;s<t;s++)i[s]=r.charCodeAt(s);return i},!r&&""!=r||!t&&0!=t||!i)throw"Bad Among initialisation: s:"+r+", substring_i: "+t+", result: "+i;this.s_size=r.length,this.s=this.toCharArray(r),this.substring_i=t,this.result=i,this.method=s},SnowballProgram:function(){var r;return{bra:0,ket:0,limit:0,cursor:0,limit_backward:0,setCurrent:function(t){r=t,this.cursor=0,this.limit=t.length,this.limit_backward=0,this.bra=this.cursor,this.ket=this.limit},getCurrent:function(){var t=r;return r=null,t},in_grouping:function(t,i,s){if(this.cursor<this.limit){var e=r.charCodeAt(this.cursor);if(e<=s&&e>=i&&t[(e-=i)>>3]&1<<(7&e))return this.cursor++,!0}return!1},in_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e<=s&&e>=i&&t[(e-=i)>>3]&1<<(7&e))return this.cursor--,!0}return!1},out_grouping:function(t,i,s){if(this.cursor<this.limit){var e=r.charCodeAt(this.cursor);if(e>s||e<i)return this.cursor++,!0;if(!(t[(e-=i)>>3]&1<<(7&e)))return this.cursor++,!0}return!1},out_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e>s||e<i)return this.cursor--,!0;if(!(t[(e-=i)>>3]&1<<(7&e)))return this.cursor--,!0}return!1},eq_s:function(t,i){if(this.limit-this.cursor<t)return!1;for(var s=0;s<t;s++)if(r.charCodeAt(this.cursor+s)!=i.charCodeAt(s))return!1;return this.cursor+=t,!0},eq_s_b:function(t,i){if(this.cursor-this.limit_backward<t)return!1;for(var s=0;s<t;s++)if(r.charCodeAt(this.cursor-t+s)!=i.charCodeAt(s))return!1;return this.cursor-=t,!0},find_among:function(t,i){for(var s=0,e=i,n=this.cursor,u=this.limit,o=0,h=0,c=!1;;){for(var a=s+(e-s>>1),f=0,l=o<h?o:h,_=t[a],m=l;m<_.s_size;m++){if(n+l==u){f=-1;break}if(f=r.charCodeAt(n+l)-_.s[m])break;l++}if(f<0?(e=a,h=l):(s=a,o=l),e-s<=1){if(s>0||e==s||c)break;c=!0}}for(;;){if(o>=(_=t[s]).s_size){if(this.cursor=n+_.s_size,!_.method)return _.result;var b=_.method();if(this.cursor=n+_.s_size,b)return _.result}if((s=_.substring_i)<0)return 0}},find_among_b:function(t,i){for(var s=0,e=i,n=this.cursor,u=this.limit_backward,o=0,h=0,c=!1;;){for(var a=s+(e-s>>1),f=0,l=o<h?o:h,_=(m=t[a]).s_size-1-l;_>=0;_--){if(n-l==u){f=-1;break}if(f=r.charCodeAt(n-1-l)-m.s[_])break;l++}if(f<0?(e=a,h=l):(s=a,o=l),e-s<=1){if(s>0||e==s||c)break;c=!0}}for(;;){var m;if(o>=(m=t[s]).s_size){if(this.cursor=n-m.s_size,!m.method)return m.result;var b=m.method();if(this.cursor=n-m.s_size,b)return m.result}if((s=m.substring_i)<0)return 0}},replace_s:function(t,i,s){var e=s.length-(i-t),n=r.substring(0,t),u=r.substring(i);return r=n+s+u,this.limit+=e,this.cursor>=i?this.cursor+=e:this.cursor>t&&(this.cursor=t),e},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>r.length)throw"faulty slice operation"},slice_from:function(r){this.slice_check(),this.replace_s(this.bra,this.ket,r)},slice_del:function(){this.slice_from("")},insert:function(r,t,i){var s=this.replace_s(r,t,i);r<=this.bra&&(this.bra+=s),r<=this.ket&&(this.ket+=s)},slice_to:function(){return this.slice_check(),r.substring(this.bra,this.ket)},eq_v_b:function(r){return this.eq_s_b(r.length,r)}}}},r.trimmerSupport={generateTrimmer:function(r){var t=new RegExp("^[^"+r+"]+"),i=new RegExp("[^"+r+"]+$");return function(r){return"function"==typeof r.update?r.update(function(r){return r.replace(t,"").replace(i,"")}):r.replace(t,"").replace(i,"")}}}}});

1
assets/javascripts/lunr/lunr.sv.js

@ -0,0 +1 @@ @@ -0,0 +1 @@
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,n,t;e.sv=function(){this.pipeline.reset(),this.pipeline.add(e.sv.trimmer,e.sv.stopWordFilter,e.sv.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.sv.stemmer))},e.sv.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.sv.trimmer=e.trimmerSupport.generateTrimmer(e.sv.wordCharacters),e.Pipeline.registerFunction(e.sv.trimmer,"trimmer-sv"),e.sv.stemmer=(r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,t=new function(){var e,t,i=[new r("a",-1,1),new r("arna",0,1),new r("erna",0,1),new r("heterna",2,1),new r("orna",0,1),new r("ad",-1,1),new r("e",-1,1),new r("ade",6,1),new r("ande",6,1),new r("arne",6,1),new r("are",6,1),new r("aste",6,1),new r("en",-1,1),new r("anden",12,1),new r("aren",12,1),new r("heten",12,1),new r("ern",-1,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",18,1),new r("or",-1,1),new r("s",-1,2),new r("as",21,1),new r("arnas",22,1),new r("ernas",22,1),new r("ornas",22,1),new r("es",21,1),new r("ades",26,1),new r("andes",26,1),new r("ens",21,1),new r("arens",29,1),new r("hetens",29,1),new r("erns",21,1),new r("at",-1,1),new r("andet",-1,1),new r("het",-1,1),new r("ast",-1,1)],s=[new r("dd",-1,-1),new r("gd",-1,-1),new r("nn",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1),new r("tt",-1,-1)],a=[new r("ig",-1,1),new r("lig",0,1),new r("els",-1,1),new r("fullt",-1,3),new r("löst",-1,2)],o=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,24,0,32],u=[119,127,149],m=new n;this.setCurrent=function(e){m.setCurrent(e)},this.getCurrent=function(){return m.getCurrent()},this.stem=function(){var r,n=m.cursor;return function(){var r,n=m.cursor+3;if(t=m.limit,0<=n||n<=m.limit){for(e=n;;){if(r=m.cursor,m.in_grouping(o,97,246)){m.cursor=r;break}if(m.cursor=r,m.cursor>=m.limit)return;m.cursor++}for(;!m.out_grouping(o,97,246);){if(m.cursor>=m.limit)return;m.cursor++}(t=m.cursor)<e&&(t=e)}}(),m.limit_backward=n,m.cursor=m.limit,function(){var e,r=m.limit_backward;if(m.cursor>=t&&(m.limit_backward=t,m.cursor=m.limit,m.ket=m.cursor,e=m.find_among_b(i,37),m.limit_backward=r,e))switch(m.bra=m.cursor,e){case 1:m.slice_del();break;case 2:m.in_grouping_b(u,98,121)&&m.slice_del()}}(),m.cursor=m.limit,r=m.limit_backward,m.cursor>=t&&(m.limit_backward=t,m.cursor=m.limit,m.find_among_b(s,7)&&(m.cursor=m.limit,m.ket=m.cursor,m.cursor>m.limit_backward&&(m.bra=--m.cursor,m.slice_del())),m.limit_backward=r),m.cursor=m.limit,function(){var e,r;if(m.cursor>=t){if(r=m.limit_backward,m.limit_backward=t,m.cursor=m.limit,m.ket=m.cursor,e=m.find_among_b(a,5))switch(m.bra=m.cursor,e){case 1:m.slice_del();break;case 2:m.slice_from("lös");break;case 3:m.slice_from("full")}m.limit_backward=r}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return t.setCurrent(e),t.stem(),t.getCurrent()}):(t.setCurrent(e),t.stem(),t.getCurrent())}),e.Pipeline.registerFunction(e.sv.stemmer,"stemmer-sv"),e.sv.stopWordFilter=e.generateStopWordFilter("alla allt att av blev bli blir blivit de dem den denna deras dess dessa det detta dig din dina ditt du där då efter ej eller en er era ert ett från för ha hade han hans har henne hennes hon honom hur här i icke ingen inom inte jag ju kan kunde man med mellan men mig min mina mitt mot mycket ni nu när någon något några och om oss på samma sedan sig sin sina sitta själv skulle som så sådan sådana sådant till under upp ut utan vad var vara varför varit varje vars vart vem vi vid vilka vilkas vilken vilket vår våra vårt än är åt över".split(" ")),e.Pipeline.registerFunction(e.sv.stopWordFilter,"stopWordFilter-sv")}});

1
assets/javascripts/lunr/lunr.tr.js

File diff suppressed because one or more lines are too long

1
assets/javascripts/lunr/tinyseg.js

File diff suppressed because one or more lines are too long

1
assets/javascripts/modernizr.1aa3b519.js

File diff suppressed because one or more lines are too long

1176
assets/stylesheets/application-palette.22915126.css

File diff suppressed because it is too large Load Diff

2552
assets/stylesheets/application.451f80e5.css

File diff suppressed because it is too large Load Diff

17
common.mk

@ -1,17 +0,0 @@ @@ -1,17 +0,0 @@
SHELL=/bin/bash
ifeq ($(shell echo ${POD_CHARLESREID1_DIR}),)
$(error Environment variable POD_CHARLESREID1_DIR not defined. Please run "source environment" in the repo root directory before running make commands)
endif
ifeq ($(shell test -d ${POD_CHARLESREID1_DIR} || echo "nope"), nope)
$(error Environment variable POD_CHARLESREID1_DIR points to a non-existent directory)
endif
ifeq ($(shell which python3),)
$(error Please install python3)
endif
ifeq ($(shell which aws),)
$(error Please install aws-cli)
endif

0
docs/css/custom.css → css/custom.css

34
d-gitea/README.md

@ -1,34 +0,0 @@ @@ -1,34 +0,0 @@
# d-gitea
This directory contains files for the gitea docker container
in the charlesreid1 docker pod.
See [pod-charlesreid1](https://git.charlesreid1.com/docker/pod-charlesreid1).
## Custom Directory
The custom directory contains the gitea configuration file, plus any other
custom files Gitea might need.
The `custom` directory is bind mounted to `/data/gitea` inside the container.
## Data Directory
The data directory contains any instance-specific gitea data.
The data directory is bind-mounted to `/app/gitea/data` in the container.
## Repository Drive
Gitea stores all of its repositories in a separate drive that is at
`/gitea_repositories` on the host machine.
The gitea repositories drive is bind-mounted to `/data/git/repositories` in the container.
### Rendering app.ini Template
The gitea configuration file is located at `custom/conf/app.ini`.
The app.ini configuration file is not provided, only a template is provided.
Use the top-level pod-charlesreid1 Makefile and scripts to render templates.
Use the top-level environment file to set variable values.

106
d-gitea/custom/conf/app.ini.j2

@ -1,106 +0,0 @@ @@ -1,106 +0,0 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; My Amazing Gitea Config File
;;
;; charles reid
;; march 2017
;; https://github.com/go-gitea/gitea/blob/master/conf/app.ini
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
APP_NAME = {{ pod_charlesreid1_gitea_app_name }}
RUN_USER = git
RUN_MODE = prod
[ui]
DEFAULT_THEME = arc-green
[database]
DB_TYPE = sqlite3
HOST =
NAME =
USER =
PASSWD =
SSL_MODE = disable
PATH = /data/gitea/gitea.db
[repository]
ROOT = /data/git/repositories
PREFERRED_LICENSES = MIT License
; This gets rid of the HTTP option to check out repos...
DISABLE_HTTP_GIT = false
[server]
PROTOCOL = http
DOMAIN = git.{{ pod_charlesreid1_server_name }}
#CERT_FILE = /www/gitea/certs/cert.pem
#KEY_FILE = /www/gitea/certs/key.pem
SSH_DOMAIN = git.{{ pod_charlesreid1_server_name }}
HTTP_PORT = 3000
HTTP_ADDR = 0.0.0.0
ROOT_URL = https://git.{{ pod_charlesreid1_server_name }}
;ROOT_URL = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s/
DISABLE_SSH = false
; port to display in clone url:
;SSH_PORT = 222
; port for built-in ssh server to listen on:
SSH_LISTEN_PORT = 22
OFFLINE_MODE = false
; Upper level of template and static file path
; default is the path where Gitea is executed
;;;;STATIC_ROOT_PATH = /www/gitea/static
[mailer]
ENABLED = false
[service]
REGISTER_EMAIL_CONFIRM = false
ENABLE_NOTIFY_MAIL = false
DISABLE_REGISTRATION = true
ENABLE_CAPTCHA = false
REQUIRE_SIGNIN_VIEW = false
[picture]
DISABLE_GRAVATAR = true
ENABLE_FEDERATED_AVATAR = false
AVATAR_UPLOAD_PATH = /data/gitea/avatars
[session]
PROVIDER = file
[log]
MODE = file
; Either "Trace", "Debug", "Info", "Warn", "Error", "Critical", default is "Trace"
LEVEL = Info
ROOT_PATH = /data/gitea/log
; For "file" mode only
[log.file]
LEVEL =
; This enables automated log rotate(switch of following options), default is true
LOG_ROTATE = true
; Max line number of single file, default is 1000000
MAX_LINES = 1000000
; Max size shift of single file, default is 28 means 1 << 28, 256MB
MAX_SIZE_SHIFT = 28
; Segment log daily, default is true
DAILY_ROTATE = true
; Expired days of log file(delete after max days), default is 7
MAX_DAYS = 7
[cron.archive_cleanup]
ENABLED = false
[security]
INSTALL_LOCK = true
SECRET_KEY = {{ pod_charlesreid1_gitea_secretkey }}
MIN_PASSWORD_LENGTH = 6
INTERNAL_TOKEN = {{ pod_charlesreid1_gitea_internaltoken }}
[other]
SHOW_FOOTER_BRANDING = false
; Show version information about Gitea and Go in the footer
SHOW_FOOTER_VERSION = false
; Show time of template execution in the footer
SHOW_FOOTER_TEMPLATE_LOAD_TIME = false

1
d-gitea/custom/public/hello.html

@ -1 +0,0 @@ @@ -1 +0,0 @@
<h2>hallo werld dis is de geeeeeet tea</h2>

3
d-gitea/custom/templates/custom/extra_links.tmpl

@ -1,3 +0,0 @@ @@ -1,3 +0,0 @@
<!--
<a class="item" href="{{AppSubUrl}}/hello.html">Hello World</a>
-->

3
d-gitea/custom/templates/home.tmpl

@ -1,3 +0,0 @@ @@ -1,3 +0,0 @@
{{template "base/head" .}}
<meta http-equiv="Refresh" content="0; url=/explore/repos" />
{{template "base/footer" .}}

63
d-mediawiki/Dockerfile

@ -1,63 +0,0 @@ @@ -1,63 +0,0 @@
FROM mediawiki:1.34
EXPOSE 8989
VOLUME ["/var/www/html"]
# Install ImageMagick
# and math stuff mentioned by Math extension readme
RUN apt-get update && \
apt-get install -y build-essential \
dvipng \
ocaml \
ghostscript \
imagemagick \
texlive-latex-base \
texlive-latex-extra \
texlive-fonts-recommended \
texlive-lang-greek \
texlive-latex-recommended
# Copy skins, config files, and other particulars into container
# WARNING: DOCKER STUPIDITY AHEAD
# MediaWiki needs everything, everything, to be in one folder.
# Docker is totally incapable of mounting a file in a volume.
# I cannot update LocalSettings.php without clearing the cache.
# I cannot clear the cache without reinstalling all of latex.
# I can't bind-mount the skins dir, because then it's owned by root.
# I can't fix the fact that all bind-mounted dirs are owned by root,
# because I can only add commands in THIS DOCKERFILE.
# and when you run the commands in this dockerfile,
# YOU CANNOT SEE THE BIND-MOUNTED STUFF.
# Extensions
COPY charlesreid1-config/mediawiki/extensions/EmbedVideo /var/www/html/extensions/EmbedVideo
COPY charlesreid1-config/mediawiki/extensions/Math /var/www/html/extensions/Math
COPY charlesreid1-config/mediawiki/extensions/ParserFunctions /var/www/html/extensions/ParserFunctions
COPY charlesreid1-config/mediawiki/extensions/SyntaxHighlight_GeSHi /var/www/html/extensions/SyntaxHighlight_GeSHi
RUN chown -R www-data:www-data /var/www/html/*
# Skins
COPY charlesreid1-config/mediawiki/skins /var/www/html/skins
RUN chown -R www-data:www-data /var/www/html/skins
# Settings
COPY charlesreid1-config/mediawiki/LocalSettings.php /var/www/html/LocalSettings.php
RUN chown -R www-data:www-data /var/www/html/LocalSettings*
RUN chmod 600 /var/www/html/LocalSettings.php
# Apache conf file
COPY charlesreid1-config/apache/*.conf /etc/apache2/sites-enabled/
RUN a2enmod rewrite
RUN service apache2 restart
## make texvc
#CMD cd /var/www/html/extensions/Math && make && apache2-foreground
# PHP conf file
# https://hub.docker.com/_/php/
COPY php/php.ini /usr/local/etc/php/
# Start
CMD apache2-foreground

97
d-mediawiki/README.md

@ -1,97 +0,0 @@ @@ -1,97 +0,0 @@
# d-mediawiki
This directory contains files used to run the MediaWiki container
for the charlesreid1.com wiki. The MediaWiki container consists of
a PHP-enabled Apache web server serving the MediaWiki application,
and storing data in a MySQL database (different container).
See [pod-charlesreid1](https://git.charelsreid1.com/docker/pod-charlesreid1).
## Directory Layout
This directory contains `charlesreid1-config`, which has both
MediaWiki and Apache configuration files.
## Creating Extensions Directory
## Summary
This directory contains a Dockerfile that modifies the
official MediaWiki docker container. Before launching
the container, it specifies `/var/www/html` as a mounted volume,
and it copies `LocalSettings.php`, the MediaWiki config file,
from this repo into the container.
See [d-mysql repo](https://charlesreid1.com:3000/docker/d-mysql).
Also see [pod-charlesreid1](https://git.charlesreid1.com/docker/pod-charlesreid1.git)
for a working pod using this container.
## Docker Compose
To use this container as part of a pod, as with the charlesreid1.com wiki,
see [pod-charlesreid1-wiki](https://charlesreid1.com:3000/docker/pod-charlesreid1-wiki).
## Troubleshooting
If you are seeing 404s on every page you try, it may be because
your MediaWiki config file is set to redirect you to `/wiki/Main_Page`
but your web server is not set up to handle it.
See [this lin](https://www.mediawiki.org/wiki/Manual:Short_URL)
and the guide for [apache](https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Short_URL/Apache)
and [nginx](https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Short_URL/Nginx).
## Updating Settings
The LocalSettings.php file must be copied into the
container, because we will end up bind-mounting the
entire MediaWiki directory when the container is run
and we can't bind-mount a file inside a bind-mounted
directory.
Thus, to update LocalSettings.php, skins, or extensions,
you will need to re-make the Docker container.
Use the make rules to remake the Docker container:
```
make clean
make build
make run
```
## Submodule
The submodule `charlesreid1-config/`
contains configuration files for both
MediaWiki and Apache.
See the [wiki/charlesreid1-config](https://git.charlesreid1.com/wiki/charlesreid1-config)
repo for details.
To clone the submodule when you clone the repo,
include the `--recursive` flag:
```
git clone --recursive https://git.charlesreid1.com/docker/d-mediawiki.git
```
To check out the submodule after a shallow clone:
```
git submodule init
# or
git submodule update --init
```
To fetch changes to the submodule from the submodule's remote:
```
git submodule update --remote
```

30
d-mediawiki/Skins.md

@ -1,30 +0,0 @@ @@ -1,30 +0,0 @@
To update the MediaWiki skin:
- See the long angry rant in the Dockerfile
- You have to rebuild the whole container. Yup, stupid.
- Rebuild the MW container while the docker pod is still running (won't effect the docker pod)
- When finished rebuilding the MW container, restart the docker pod.
```
# switch to main pod directory
cd ../
# rebuild all containers
docker-compose build
# stop and start the pod
sudo service pod-charlesreid1 stop
sudo service pod-charlesreid1 start
```
To verify that the skin has correcty been installed, you can check
the skin file inside the container. First, get a shell in the container:
```
docker exec -it stormy_mw /bin/bash
```
Once inside the container, the main web directory is `/var/www/html/`,
so the skins should be in `/var/www/html/skins/`. You can use `cat` to
print the file to the screen and verify it is correct.

11
d-mediawiki/charlesreid1-config/Readme.md

@ -1,11 +0,0 @@ @@ -1,11 +0,0 @@
# charlesreid1-config
Config and other site-specific files
for the charlesreid1.com wiki.
The apache directory contains apache config files
for the apache server runing mediawiki.
The mediawiki directory contains mediawiki
configuration files.

1
d-mediawiki/charlesreid1-config/apache/.gitignore vendored

@ -1 +0,0 @@ @@ -1 +0,0 @@
charlesreid1.wiki.conf

65
d-mediawiki/charlesreid1-config/apache/charlesreid1.wiki.conf.j2

@ -1,65 +0,0 @@ @@ -1,65 +0,0 @@
ServerName {{ pod_charlesreid1_server_name }}
Listen 8989
<VirtualHost *:8989>
# nginx reverse proxy
# talks to apache via 127.0.0.1
# on port 8989
ServerAlias www.{{ pod_charlesreid1_server_name }}
LogLevel warn
ServerAdmin {{ pod_charlesreid1_mediawiki_admin_email }}
DirectoryIndex index.html index.cgi index.php
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
AddHandler php5-script php
# PHP module settings:
<IfModule php5_module>
# Add php type handler
AddType text/html php
# Make index.php a default file
<IfModule dir_module>
DirectoryIndex index.html index.php
</IfModule>
</IfModule>
# =================
# wiki
Alias /wiki /var/www/html/index.php
Alias /w /var/www/html
<Directory /var/www/html>
#
# http://www.mediawiki.org/wiki/Manual:Short_URL/Apache
#
# Enable the rewrite engine
RewriteEngine On
# Short url for wiki pages
RewriteRule ^/?wiki(/.*)?$ %{DOCUMENT_ROOT}/w/index.php [L]
Options FollowSymLinks
AllowOverride None
Require all granted
### # Rewrite / to main page
### RewriteRule ^/*$ %{DOCUMENT_ROOT}/w/index.php [L]
</Directory>
</VirtualHost>

2
d-mediawiki/charlesreid1-config/mediawiki/.gitignore vendored

@ -1,2 +0,0 @@ @@ -1,2 +0,0 @@
LocalSettings.php
extensions

243
d-mediawiki/charlesreid1-config/mediawiki/LocalSettings.php.j2

@ -1,243 +0,0 @@ @@ -1,243 +0,0 @@
<?php
$wgSitename = "charlesreid1";
$wgMetaNamespace = "Charlesreid1";
# from http://www.mediawiki.org/wiki/Manual:Short_URL#Recommended_how-to_guide_.28setup_used_on_Wikipedia.29
$wgScriptPath = "/w"; # Path to the actual files. This should already be there
$wgArticlePath = "/wiki/$1"; # Virtual path. This directory MUST be different from the one used in $wgScriptPath
$wgUsePathInfo = true; # Enable use of pretty URLs
# Protect against web entry
if ( !defined( 'MEDIAWIKI' ) ) {
exit;
}
## The protocol and server name to use in fully-qualified URLs
$wgServer = 'https://{{ pod_charlesreid1_server_name }}';
$wgCanonicalServer = 'https://{{ pod_charlesreid1_server_name }}';
## The URL path to static resources (images, scripts, etc.)
$wgStylePath = "$wgScriptPath/skins";
$wgResourceBasePath = $wgScriptPath;
# The URL path to the logo. Make sure you change this from the default,
# or else you'll overwrite your logo when you upgrade!
$wgLogo = "$wgResourceBasePath/resources/assets/wiki.png";
# UPO means: this is also a user preference option
$wgEnableEmail = true;
$wgEmergencyContact = "charles@charlesreid1.com";
$wgPasswordSender = "charles@charlesreid1.com";
$wgEnableUserEmail = true; # UPO
$wgEnotifUserTalk = false; # UPO
$wgEnotifWatchlist = false; # UPO
$wgEmailAuthentication = true;
# Database settings
$wgDBtype = "mysql";
$wgDBserver = getenv('MYSQL_HOST');
$wgDBname = getenv('MYSQL_DATABASE');
$wgDBuser = getenv('MYSQL_USER');
$wgDBpassword = getenv('MYSQL_PASSWORD');
# MySQL specific settings
$wgDBprefix = "";
$wgDBTableOptions = "ENGINE=InnoDB, DEFAULT CHARSET=binary";
$wgDBmysql5 = true;
# Shared memory settings
$wgMainCacheType = CACHE_ACCEL;
$wgMemCachedServers = [];
# To enable image uploads, make sure the 'images' directory
# is writable, then set this to true:
$wgEnableUploads = true;
$wgMaxUploadSize = 1024*1024*100; # 100 MB
# also set in php.ini
$wgUseImageMagick = true;
$wgImageMagickConvertCommand = "/usr/bin/convert";
# InstantCommons allows wiki to use images from https://commons.wikimedia.org
$wgUseInstantCommons = false;
# Allow specific file extensions
$wgStrictFileExtensions = false;
$wgFileExtensions[] = 'pdf';
$wgFileExtensions[] = 'svg';
$wgFileExtensions[] = 'mm';
$wgFileExtensions[] = 'png';
$wgFileExtensions[] = 'jpg';
$wgFileExtensions[] = 'JPG';
$wgFileExtensions[] = 'jpeg';
$wgFileExtensions[] = 'py';
# Allow any file extensions, but print a warning if not in $wgFileExtensions[]
$wgCheckFileExtensions = false;
# do not send pingback to https://www.mediawiki.org
$wgPingback = false;
# If you use ImageMagick (or any other shell command) on a
# Linux server, this will need to be set to the name of an
# available UTF-8 locale
$wgShellLocale = "en_US.utf8";
# If you have the appropriate support software installed
# you can enable inline LaTeX equations:
$wgUseTeX = true;
$wgTexvc = "$IP/extensions/Math/math/texvc";
#$wgTexvc = '/usr/bin/texvc';
# Set MathML as default rendering option
$wgDefaultUserOptions['math'] = 'mathml';
$wgMathFullRestbaseURL = 'https://en.wikipedia.org/api/rest_';
$wgMathMathMLUrl = 'https://mathoid-beta.wmflabs.org/';
# Site language code, should be one of the list in ./languages/data/Names.php
$wgLanguageCode = "en";
$wgSecretKey = getenv('MEDIAWIKI_SECRETKEY');
# Changing this will log out all existing sessions.
$wgAuthenticationTokenVersion = "1";
# Site upgrade key. Must be set to a string (default provided) to turn on the
# web installer while LocalSettings.php is in place
$wgUpgradeKey = "984c1d9858dabc27";
# No license info
$wgRightsPage = "";
$wgRightsUrl = "";
$wgRightsText = "";
$wgRightsIcon = "";
# Alternative:
$wgEnableCreativeCommonsRdf = true;
$wgRightsPage = "";
$wgRightsUrl = "http://creativecommons.org/licenses/by-nc-nd/3.0/us/";
$wgRightsText = "Attribution-NonCommercial-NoDerivs 3.0 United States";
$wgRightsIcon = "/w/skins/charlesmartinreid/cc.png";
# Path to the GNU diff3 utility. Used for conflict resolution.
$wgDiff3 = "/usr/bin/diff3";
# Boostrap2 skin:
wfLoadSkin( 'Bootstrap2' );
require_once "$IP/skins/Bootstrap2/Bootstrap2.php";
$wgDefaultSkin = 'Bootstrap2';
$wgValidSkinNames['bootstrap2'] = 'Bootstrap2';
# Change to true for debugging
$wgShowExceptionDetails=false;
# When you make changes to this configuration file, this will make
# sure that cached pages are cleared.
session_save_path("tmp");
$wgCacheEpoch = max( $wgCacheEpoch, gmdate( 'YmdHis', @filemtime( __FILE__ ) ) );
############################################################
############# Charles-Modified Settings ####################
# Allow external images (to do this, simply insert the image's URL)
# http://url.for/some/image.png
# But these cannot be resized.
$wgAllowExternalImages = true;
# Use ImageMagick
$wgUseImageMagic=true;
# $wgAllowDisplayTitle - Allow the magic word { { DISPLAYTITLE: } } to override the title of a page.
$wgAllowdisplayTitle=true;
# Log IP addresses in the recentchanges table.
$wgPutIPinRC=true;
# Getting some weird "Error creating thumbnail: Invalid thumbnail parameters" messages w/ thumbnail
# http://www.gossamer-threads.com/lists/wiki/mediawiki/169439
$wgMaxImageArea=64000000;
$wgMaxShellMemory=0;
$wgFavicon="$wgScriptPath/favicon.ico";
######################
# Edit permissions
# only admin can edit
$wgGroupPermissions['*']['edit'] = false;
$wgGroupPermissions['user']['edit'] = false;
$wgGroupPermissions['sysop']['edit'] = true;
# only admin can register new accounts
$wgGroupPermissions['*']['createaccount'] = false;
$wgGroupPermissions['user']['createaccount'] = false;
$wgGroupPermissions['sysop']['createaccount'] = true;
# only admin can upload
$wgGroupPermissions['*']['upload'] = false;
$wgGroupPermissions['user']['upload'] = false;
$wgGroupPermissions['sysop']['upload'] = true;
$wgGroupPermissions['*']['reupload'] = false;
$wgGroupPermissions['user']['reupload'] = false;
$wgGroupPermissions['sysop']['reupload'] = true;
###############################
## GeSHi syntax highlighting/code extension
# https://github.com/wikimedia/mediawiki-extensions-SyntaxHighlight_GeSHi.git
wfLoadExtension( 'SyntaxHighlight_GeSHi' );
$wgSyntaxHighlightDefaultLang = "text";
##############################
# Parser functions
# http://www.mediawiki.org/wiki/Extension:ParserFunctions
# http://en.wikipedia.org/wiki/Template_talk:Navbox
wfLoadExtension( 'ParserFunctions' );
##############################################
# Embed videos extension
# https://github.com/HydraWiki/mediawiki-embedvideo/
# require_once("$IP/extensions/EmbedVideo/EmbedVideo.php");
wfLoadExtension( 'EmbedVideo' );
###########################################
# Math extension
# https://github.com/wikimedia/mediawiki-extensions-Math.git
require_once "$IP/extensions/Math/Math.php";
#############################################
# Fix cookies crap
session_save_path("/tmp");
##############################################
# Secure login
$wgServer = "https://{{ pod_charlesreid1_server_name }}";
$wgSecureLogin = true;
###################################
# Raw html
$wgRawHtml = true;
# but also keep things locked down
$wgUseRCPatrol=true;
$wgNewUserLog=true;
##################################
# Paths
$wgUploadPath = "$wgScriptPath/images";
$wgUploadDirectory = "$IP/images";
$wgMathPath = "$wgUploadPath/math";
$wgMathDirectory = "$wgUploadDirectory/math";
$wgTmpDirectory = "$wgUploadDirectory/tmp";
$wgLatexCommand = "/usr/bin/latex";
#$wgUploadBaseUrl = false; # not sure about why this one too...
$wgVerifyMimeType = false;
#$wgDebugLogFile = "/var/log/apache2/wiki.log";

18
d-mediawiki/charlesreid1-config/mediawiki/README.md

@ -1,18 +0,0 @@ @@ -1,18 +0,0 @@
# mediawiki config files
In the `LocalSettings.php` file, which needs to have the MySQL
account credentials, we have the following:
```
## Database settings
$wgDBtype = "mysql";
$wgDBserver = getenv('MYSQL_HOST');
$wgDBname = getenv('MYSQL_DATABASE');
$wgDBuser = getenv('MYSQL_USER');
$wgDBpassword = getenv('MYSQL_PASSWORD');
```
This information comes from the environment. In our case,
this comes from a MediaWiki docker container (see the
[d-mediawiki](https://git.charlesreid1.com/docker/d-mediawiki)
repo.)

43
d-mediawiki/charlesreid1-config/mediawiki/apply_templates.py

@ -1,43 +0,0 @@ @@ -1,43 +0,0 @@
import os, re, sys
from jinja2 import Environment, FileSystemLoader, select_autoescape
"""
Apply Default Values to Jinja Templates
This script applies default values to
mediawiki LocalSettings.php file.
The configuration templates are useful for Ansible,
but this is useful for experiments/one-offs.
All configuration files are for charlesreid1.com
docker pod, nginx, and realted infrastructure.
"""
# Where templates live
TEMPLATEDIR = '.'
# Where rendered templates will go
OUTDIR = '.'
# Should existing files be overwritten
OVERWRITE = True
env = Environment(loader=FileSystemLoader('.'))
tfile = 'LocalSettings.php.j2'
rfile = 'LocalSettings.php'
content = env.get_template(tfile).render({
"server_name_default" : "charlesreid1.com"
})
# Write to file
if os.path.exists(rfile) and not OVERWRITE:
raise Exception("Error: file %s already exists!"%(rfile))
else:
with open(rfile,'w') as f:
f.write(content)

329
d-mediawiki/charlesreid1-config/mediawiki/sample_LocalSettings.php

@ -1,329 +0,0 @@ @@ -1,329 +0,0 @@
<?php
# This file was automatically generated by the MediaWiki 1.30.0
# installer. If you make manual changes, please keep track in case you
# need to recreate them later.
#
# See includes/DefaultSettings.php for all configurable settings
# and their default values, but don't forget to make changes in _this_
# file, not there.
#
# Further documentation for configuration settings may be found at:
# https://www.mediawiki.org/wiki/Manual:Configuration_settings
# Protect against web entry
if ( !defined( 'MEDIAWIKI' ) ) {
exit;
}
## Uncomment this to disable output compression
# $wgDisableOutputCompression = true;
$wgSitename = "charlesreid1";
$wgMetaNamespace = "Charlesreid1";
# from http://www.mediawiki.org/wiki/Manual:Short_URL#Recommended_how-to_guide_.28setup_used_on_Wikipedia.29
$wgScriptPath = "/w"; # Path to the actual files. This should already be there
$wgArticlePath = "/wiki/$1"; # Virtual path. This directory MUST be different from the one used in $wgScriptPath
$wgUsePathInfo = true; # Enable use of pretty URLs
## The protocol and server name to use in fully-qualified URLs
$wgServer = 'https://';
$wgCanonicalServer = 'https://';
## The URL path to static resources (images, scripts, etc.)
$wgStylePath = "$wgScriptPath/skins";
$wgResourceBasePath = $wgScriptPath;
## The URL path to the logo. Make sure you change this from the default,
## or else you'll overwrite your logo when you upgrade!
$wgLogo = "$wgResourceBasePath/resources/assets/wiki.png";
## UPO means: this is also a user preference option
$wgEnableEmail = true;
$wgEnableUserEmail = true; # UPO
$wgEmergencyContact = "charles@charlesreid1.com";
$wgPasswordSender = "charles@charlesreid1.com";
$wgEnotifUserTalk = false; # UPO
$wgEnotifWatchlist = false; # UPO
$wgEmailAuthentication = true;
## Database settings
$wgDBtype = "mysql";
$wgDBserver = getenv('MYSQL_HOST');
$wgDBname = getenv('MYSQL_DATABASE');
$wgDBuser = getenv('MYSQL_USER');
$wgDBpassword = getenv('MYSQL_PASSWORD');
# MySQL specific settings
$wgDBprefix = "";
# MySQL table options to use during installation or update
$wgDBTableOptions = "ENGINE=InnoDB, DEFAULT CHARSET=binary";
# Experimental charset support for MySQL 5.0.
//$wgDBmysql5 = false; // new version
$wgDBmysql5 = true; // true on charlesreid1.com
## Shared memory settings
$wgMainCacheType = CACHE_ACCEL;
$wgMemCachedServers = [];
## To enable image uploads, make sure the 'images' directory
## is writable, then set this to true:
$wgEnableUploads = true;
$wgMaxUploadSize = 1024*1024*100; # 100 MB
# also set in php.ini
$wgUseImageMagick = true;
$wgImageMagickConvertCommand = "/usr/bin/convert";
# InstantCommons allows wiki to use images from https://commons.wikimedia.org
$wgUseInstantCommons = false;
# Allow specific file extensions
$wgStrictFileExtensions = false;
$wgFileExtensions[] = 'pdf';
$wgFileExtensions[] = 'svg';
$wgFileExtensions[] = 'mm';
$wgFileExtensions[] = 'png';
$wgFileExtensions[] = 'jpg';
$wgFileExtensions[] = 'JPG';
$wgFileExtensions[] = 'jpeg';
$wgFileExtensions[] = 'py';
# Allow any file extensions,
# but print a warning if its not
# in $wgFileExtensions[]
$wgCheckFileExtensions = false;
# do not send pingback to https://www.mediawiki.org
$wgPingback = false;
# If you use ImageMagick (or any other shell command) on a
# Linux server, this will need to be set to the name of an
# available UTF-8 locale
//$wgShellLocale = "C.UTF-8"; // modern
$wgShellLocale = "en_US.utf8"; // charlesreid1.com version
## Set $wgCacheDirectory to a writable directory on the web server
## to make your wiki go slightly faster. The directory should not
## be publically accessible from the web.
#$wgCacheDirectory = "$IP/cache";
## If you have the appropriate support software installed
## you can enable inline LaTeX equations:
$wgUseTeX = true;
$wgTexvc = "$IP/extensions/Math/math/texvc";
//$wgTexvc = '/usr/bin/texvc';
$wgDefaultUserOptions['math'] = 0; //Always render eqns as .pngs
# Site language code, should be one of the list in ./languages/data/Names.php
$wgLanguageCode = "en";
$wgSecretKey = getenv('MEDIAWIKI_SECRETKEY');
# Changing this will log out all existing sessions.
$wgAuthenticationTokenVersion = "1";
# Site upgrade key. Must be set to a string (default provided) to turn on the
# web installer while LocalSettings.php is in place
$wgUpgradeKey = "984c1d9858dabc27";
## no license info
$wgRightsPage = "";
$wgRightsUrl = "";
$wgRightsText = "";
$wgRightsIcon = "";
# Alternative:
$wgEnableCreativeCommonsRdf = true;
$wgRightsPage = ""; # Set to the title of a wiki page that describes your license/copyright
$wgRightsUrl = "http://creativecommons.org/licenses/by-nc-nd/3.0/us/";
$wgRightsText = "Attribution-NonCommercial-NoDerivs 3.0 United States";
$wgRightsIcon = "/w/skins/charlesmartinreid/cc.png";
# $wgRightsCode = "[license_code]"; # Not yet used
#
# Path to the GNU diff3 utility. Used for conflict resolution.
$wgDiff3 = "/usr/bin/diff3";
## Default skin: you can change the default skin. Use the internal symbolic
## names, ie 'vector', 'monobook':
# Boostrap2 skin:
wfLoadSkin( 'Bootstrap2' );
require_once "$IP/skins/Bootstrap2/Bootstrap2.php";
$wgDefaultSkin = 'Bootstrap2';
$wgValidSkinNames['bootstrap2'] = 'Bootstrap2';
$wgShowExceptionDetails=false;
//$wgShowExceptionDetails = true;
//$wgShowDBErrorBacktrace = true;
//$wgShowSQLErrors = true;
$wgDiff3 = "/usr/bin/diff3";
# When you make changes to this configuration file, this will make
# sure that cached pages are cleared.
session_save_path("tmp");
$wgCacheEpoch = max( $wgCacheEpoch, gmdate( 'YmdHis', @filemtime( __FILE__ ) ) );
############################################################
############# Charles-Modified Settings ####################
# Allow external images:
$wgAllowExternalImages = true;
# to do this, simply insert the image's URL:
#http://url.for/some/image.png
# But these cannot be resized. It's better to just put your own version into the wiki
# Use ImageMagick
$wgUseImageMagic=true;
# $wgAllowDisplayTitle - Allow the magic word { { DISPLAYTITLE: } } to override the title of a page.
$wgAllowdisplayTitle=true;
# $wgPutIPinRC - Log IP addresses in the recentchanges table.
$wgPutIPinRC=true;
# Getting some weird "Error creating thumbnail: Invalid thumbnail parameters" messages w/ thumbnail
# http://www.gossamer-threads.com/lists/wiki/mediawiki/169439
$wgMaxImageArea=64000000;
$wgMaxShellMemory=0;
# Also:
# http://www.ipbwiki.com/forums/index.php?showtopic=812
$wgFavicon="$wgScriptPath/favicon.ico";
######################
# Edit permissions
# only admin can edit
$wgGroupPermissions['*']['edit'] = false;
$wgGroupPermissions['user']['edit'] = false;
$wgGroupPermissions['sysop']['edit'] = true;
# only admin can register new accounts
$wgGroupPermissions['*']['createaccount'] = false;
$wgGroupPermissions['user']['createaccount'] = false;
$wgGroupPermissions['sysop']['createaccount'] = true;
# only admin can upload
$wgGroupPermissions['*']['upload'] = false;
$wgGroupPermissions['user']['upload'] = false;
$wgGroupPermissions['sysop']['upload'] = true;
$wgGroupPermissions['*']['reupload'] = false;
$wgGroupPermissions['user']['reupload'] = false;
$wgGroupPermissions['sysop']['reupload'] = true;
###############################
## GeSHi syntax highlighting/code extension
#
# https://github.com/wikimedia/mediawiki-extensions-SyntaxHighlight_GeSHi.git
#
require_once("$IP/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.php");
$wgSyntaxHighlightDefaultLang = "text";
##############################
# Parser functions
#
# http://www.mediawiki.org/wiki/Extension:ParserFunctions
# http://en.wikipedia.org/wiki/Template_talk:Navbox
require_once( "$IP/extensions/ParserFunctions/ParserFunctions.php" );
##############################################
# Embed videos extension
# https://github.com/HydraWiki/mediawiki-embedvideo/
#require_once("$IP/extensions/EmbedVideo/EmbedVideo.php");
wfLoadExtension( 'EmbedVideo' );
###########################################
## Math extension
#
# https://github.com/wikimedia/mediawiki-extensions-Math.git
#
require_once "$IP/extensions/Math/Math.php";
#############################################
## Fix cookies crap
session_save_path("/tmp");
##############################################
#### secure login
$wgServer = "https://";
$wgSecureLogin = true;
###################################
##### raw html
$wgRawHtml = true;
# but also keep things locked down
$wgUseRCPatrol=true;
$wgNewUserLog=true;
##############################################
## Because adding a new extension for every dumb little thing you want to do is dumb
$wgRawHtml = true;
$wgUploadPath = "$wgScriptPath/images";
$wgUploadDirectory = "$IP/images";
$wgMathPath = "$wgUploadPath/math";
$wgMathDirectory = "$wgUploadDirectory/math";
$wgTmpDirectory = "$wgUploadDirectory/tmp";
$wgLatexCommand = "/usr/bin/latex";
#$wgUploadBaseUrl = false; #not sure about why this one too...
$wgVerifyMimeType = false;
# log
$wgDebugLogFile = "/var/log/apache2/wiki.log";

452
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/Bootstrap2.php.j2

@ -1,452 +0,0 @@ @@ -1,452 +0,0 @@
<?php
/**
* Bootstrap2 MediaWiki skin
*
* @file Bootstrap2.php
*/
if( !defined( 'MEDIAWIKI' ) )
die( -1 );
/**
* Inherit main code from SkinTemplate, set the CSS and template filter.
*/
class SkinBootstrap2 extends SkinTemplate {
/** Using Bootstrap2 */
var $skinname = 'Bootstrap2',
$stylename = 'Bootstrap2',
// -------- Start ---------
// making this true, to match the Dash style
$useHeadElement = true,
//$useHeadElement = false,
// -------- End ---------
// cmr 05/08/2014
$template = 'Bootstrap2Template';
function setupSkinUserCss( OutputPage $out ) {
global $wgHandheldStyle;
parent::setupSkinUserCss( $out );
// Append to the default screen common & print styles...
$out->addStyle( 'Bootstrap2/IE50Fixes.css', 'screen', 'lt IE 5.5000' );
$out->addStyle( 'Bootstrap2/IE55Fixes.css', 'screen', 'IE 5.5000' );
$out->addStyle( 'Bootstrap2/IE60Fixes.css', 'screen', 'IE 6' );
$out->addStyle( 'Bootstrap2/IE70Fixes.css', 'screen', 'IE 7' );
$out->addStyle( 'Bootstrap2/rtl.css', 'screen', '', 'rtl' );
$out->addStyle('Bootstrap2/bootstrap.css' );
$out->addStyle('Bootstrap2/slate.css' );
$out->addStyle('Bootstrap2/main.css' );
$out->addStyle('Bootstrap2/dox.css' );
$out->addStyle('Bootstrap2/css/font-awesome.css');
//$out->addStyle('Bootstrap2/cmr-bootstrap-cyborg.css');
//$out->addStyle('Bootstrap2/cmr-bootstrap-cyborg-wiki.css');
//
//$out->addStyle('Bootstrap2/bootstrap-cyborg.css' );
//$out->addStyle('Bootstrap2/bootstrap-responsive-cyborg.css');
//$out->addStyle( 'Bootstrap2/main.css', 'screen' );
}
}
class Bootstrap2Template extends QuickTemplate {
var $skin;
/**
* Template filter callback for Bootstrap2 skin.
* Takes an associative array of data set from a SkinTemplate-based
* class, and a wrapper for MediaWiki's localization database, and
* outputs a formatted page.
*
* @access private
*/
function execute() {
global $wgRequest;
$this->skin = $skin = $this->data['skin'];
$action = $wgRequest->getText( 'action' );
// -------- Start ------------
// Adding the following line makes Geshi work
$this->html( 'headelement' );
// Left this out because the [edit] buttons were becoming right-aligned
// Got around that behavior by changing shared.css
// -------- End ------------
// cmr 01-10-2014
/////////////////////////////
// begin custom
// bootstrap content
$get_override = 'True';
$url_array = explode('/',$_SERVER['REQUEST_URI']);
array_shift($url_array); // remove first value as it's empty
$p = "wiki";
// path, inside container
include('/var/www/html/skins/Bootstrap2/navbar.php');
?>
<!-- favicon -->
<link rel="shortcut icon" href="/favicon.ico">
<div class="container">
<!-- Row: Navigation bar for wiki -->
<div class="row">
<nav class="wiki navbar navbar-default">
<div class="container-fixed">
<div class="navbar-header">
<a href="/wiki/" class="navbar-brand">
{{ pod_charlesreid1_server_name }} wiki
</a>
</div>
<div>
<ul class="wiki nav navbar-nav">
<?php
/*
// Print debug information
echo "\n";
echo "<!--";
echo "\n";
echo print_r($this->data['content_actions']);
echo "\n";
echo "~~~~~~~~~";
echo "\n";
foreach($this->data['content_actions'] as $key => $tab) {
echo $key;
echo "\n";
//echo print_r($tab);
echo $tab['href'];
echo "\n";
echo "\n";
echo "\n";
}
echo "\n";
echo "-->";
echo "\n";
*/
echo "\n";
foreach($this->data['content_actions'] as $key => $tab) {
if( in_array($key, array('nstab-main','edit','history','viewsource','delete','move'))) {
echo '<li class="wiki';
if( $tab['class'] ) {
echo ' ';
echo $tab['class'];
}
echo '" id="' . Sanitizer::escapeId( "ca-$key" ) . '">';
echo '<a href="';
echo htmlspecialchars($tab['href']);
echo '">';
echo $tab['text'];
echo "</a>";
echo "</li>";
//echo '>'.htmlspecialchars($tab['text']).'</a></li>';
echo "\n";
}
} ?>
</ul>
</div>
</div>
</nav>
</div>
<!-- Row: Page content for wiki -->
<div class="row">
<div class="span10 offset1">
<!--
=========================
Begin MediaWiki content
=========================
-->
<div class="mw_content">
<div id="content" <?php $this->html("specialpageattributes") ?>>
<!-- page title -->
<div class="page-header">
<h1 id="firstHeading" class="firstHeading">
<?php $this->html('title') ?>
</h1>
</div><!--div page-header-->
<!-- pre-article stuff -->
<div id="bodyContent">
<h3 id="siteSub"><?php $this->msg('tagline') ?></h3>
<div id="contentSub"<?php $this->html('userlangattributes') ?>><?php $this->html('subtitle') ?>
</div>
<?php
if($this->data['undelete']) { ?>
<div id="contentSub2"><?php $this->html('undelete') ?></div>
<?php
}
if($this->data['newtalk'] ) { ?>
<div class="usermessage"><?php $this->html('newtalk') ?></div>
<?php
}
?>
<!-- article -->
<!-- begin mediawiki content -->
<?php $this->html('bodytext') ?>
<?php
if($this->data['catlinks']) {
$this->html('catlinks');
} ?>
</div><!-- end bodyContent -->
</div><!--div special page attributes-->
</div><!--div mw content-->
<!--
=========================
End MediaWiki content
=========================
-->
</div><!--div span10 -->
</div><!--row-->
<!--
==========================================================
====================== Begin Wiki Footer =================
==========================================================
-->
</div>
<?php
include('/var/www/html/skins/Bootstrap2/footer.php');
?>
<?php
} // end of execute() method
/*************************************************************************************************/
function searchBox() {
global $wgUseTwoButtonsSearchForm;
?>
<div id="p-search" class="portlet">
<div id="searchBody" class="pBody">
<form class="navbar-search pull-left" action="<?php $this->text('wgScript') ?>" id="searchform">
<input type='hidden' name="title" value="<?php $this->text('searchtitle') ?>"/>
<?php
echo Html::input( 'search',
isset( $this->data['search'] ) ? $this->data['search'] : '', 'search',
array(
'id' => 'searchInput',
'class' => 'search-query',
'title' => $this->skin->titleAttrib( 'search' ),
'accesskey' => $this->skin->accesskey( 'search' )
) ); ?>
<!--
<input type='submit' name="go" class="searchButton" id="searchGoButton" value="<?php $this->msg('searcharticle') ?>"<?php echo $this->skin->tooltipAndAccesskey( 'search-go' ); ?> /><?php if ($wgUseTwoButtonsSearchForm) { ?>&nbsp;
-->
<input type='submit' name="fulltext" class="btn btn-large" id="mw-searchButton" value="<?php $this->msg('searchbutton') ?>"<?php echo $this->skin->tooltipAndAccesskey( 'search-fulltext' ); ?> /><?php } else { ?>
<div><a href="<?php $this->text('searchaction') ?>" rel="search"><?php $this->msg('powersearch-legend') ?></a></div><?php } ?>
</form>
</div>
</div>
<?php
}
/*************************************************************************************************/
function personalTools() {
?>
<ul class="nav nav-list">
<li class="nav-header"><?php $this->msg('personaltools') ?></li>
<?php
foreach($this->data['personal_urls'] as $key => $item) {
if( strcmp($key,"userpage") == 0
|| strcmp($key,"preferences") == 0
|| strcmp($key,"logout") == 0 ) { ?>
<li> <a href="<?php
echo htmlspecialchars($item['href']) ?>"<?php echo $skin->tooltipAndAccesskey('pt-'.$key) ?><?php
if(!empty($item['class'])) { ?> class="<?php
echo htmlspecialchars($item['class']) ?>"<?php } ?>><?php
echo htmlspecialchars($item['text']) ?></a></li>
<?php
} else {
}
}
// put a log in button
?>
<li><a href="/wiki/Special:UserLogin">Log in</a></li>
<?php
}
/*************************************************************************************************/
function toolbox() {
?>
<!--
<div class="portlet" id="p-tb">
<div class="pBody">
-->
<ul class="nav nav-list">
<li class="nav-header"><?php $this->msg('toolbox') ?></li>
<?php
/*
if($this->data['notspecialpage']) { ?>
<li id="t-whatlinkshere"><a href="<?php
echo htmlspecialchars($this->data['nav_urls']['whatlinkshere']['href'])
?>"<?php echo $this->skin->tooltipAndAccesskey('t-whatlinkshere') ?>><?php $this->msg('whatlinkshere') ?></a></li>
<?php
if( $this->data['nav_urls']['recentchangeslinked'] ) { ?>
<li id="t-recentchangeslinked"><a href="<?php
echo htmlspecialchars($this->data['nav_urls']['recentchangeslinked']['href'])
?>"<?php echo $this->skin->tooltipAndAccesskey('t-recentchangeslinked') ?>><?php $this->msg('recentchangeslinked-toolbox') ?></a></li>
<?php }
}
if( isset( $this->data['nav_urls']['trackbacklink'] ) && $this->data['nav_urls']['trackbacklink'] ) { ?>
<li id="t-trackbacklink"><a href="<?php
echo htmlspecialchars($this->data['nav_urls']['trackbacklink']['href'])
?>"<?php echo $this->skin->tooltipAndAccesskey('t-trackbacklink') ?>><?php $this->msg('trackbacklink') ?></a></li>
<?php }
if($this->data['feeds']) { ?>
<li id="feedlinks"><?php foreach($this->data['feeds'] as $key => $feed) {
?><a id="<?php echo Sanitizer::escapeId( "feed-$key" ) ?>" href="<?php
echo htmlspecialchars($feed['href']) ?>" rel="alternate" type="application/<?php echo $key ?>+xml" class="feedlink"<?php echo $this->skin->tooltipAndAccesskey('feed-'.$key) ?>><?php echo htmlspecialchars($feed['text'])?></a>&nbsp;
<?php } ?></li><?php
}
*/
// Upload files, and list all files
if($this->data['nav_urls']['upload']) {
?><li id="t-<?php echo 'upload'; ?>"><a href="<?php echo htmlspecialchars($this->data['nav_urls']['upload']['href'])
?>" <?php echo $this->skin->tooltipAndAccesskey('t-upload') ?>><?php $this->msg('upload') ?></a></li>
<?php
}
// Special pages, and list all pages
if( $this->data['nav_urls']['specialpages'] ) {
?><li id="t-<?php echo 'specialpages'; ?>"><a href="<?php echo htmlspecialchars($this->data['nav_urls']['specialpages']['href'])
?>" <?php echo $this->skin->tooltipAndAccesskey('t-specialpages') ?>><?php $this->msg('specialpages') ?></a></li>
<?php
$element_name = 'all_pages';
$element_title = 'List All Pages';
$element_href = "/wiki/Special:AllPages";
$this->data['nav_urls'][$element_name]['href'] = $element_href;
?>
<li id="t-<?php echo $element_name; ?>"><a href="<?php echo htmlspecialchars( $this->data['nav_urls'][$element_name]['href'] )
?>" title="<?php echo $element_title ?>"><?php echo $element_title; ?></a></li>
<?php
}
/*
foreach( array('contributions', 'log', 'blockip', 'emailuser') as $special ) {
if($this->data['nav_urls'][$special]) {
?><li id="t-<?php echo $special ?>"><a href="<?php echo htmlspecialchars($this->data['nav_urls'][$special]['href'])
?>"<?php echo $this->skin->tooltipAndAccesskey('t-'.$special) ?>><?php $this->msg($special) ?></a></li>
<?php }
}
*/
/*
if(!empty($this->data['nav_urls']['print']['href'])) { ?>
<li id="t-print"><a href="<?php echo htmlspecialchars($this->data['nav_urls']['print']['href'])
?>" rel="alternate"<?php echo $this->skin->tooltipAndAccesskey('t-print') ?>><?php $this->msg('printableversion') ?></a></li><?php
}
*/
if(!empty($this->data['nav_urls']['permalink']['href'])) { ?>
<li id="t-permalink"><a href="<?php echo htmlspecialchars($this->data['nav_urls']['permalink']['href'])
?>"<?php echo $this->skin->tooltipAndAccesskey('t-permalink') ?>><?php $this->msg('permalink') ?></a></li><?php
} elseif ($this->data['nav_urls']['permalink']['href'] === '') { ?>
<li id="t-ispermalink"<?php echo $this->skin->tooltip('t-ispermalink') ?>><?php $this->msg('permalink') ?></li><?php
}
//wfRunHooks( 'BootstrapTemplateToolboxEnd', array( &$this ) );
wfRunHooks( 'BootstrapTemplateToolboxEnd', array( &$this ) );
?>
</ul>
<!--
</div>
</div>
-->
<?php
}
/*************************************************************************************************/
function languageBox() {
if( $this->data['language_urls'] ) {
?>
<div id="p-lang" class="portlet">
<h5<?php $this->html('userlangattributes') ?>><?php $this->msg('otherlanguages') ?></h5>
<div class="pBody">
<ul>
<?php foreach($this->data['language_urls'] as $langlink) { ?>
<li class="<?php echo htmlspecialchars($langlink['class'])?>"><?php
?><a href="<?php echo htmlspecialchars($langlink['href']) ?>"><?php echo $langlink['text'] ?></a></li>
<?php } ?>
</ul>
</div>
</div>
<?php
}
}
/*************************************************************************************************/
function customBox( $bar, $cont ) {
?>
<!--
<div class='generated-sidebar portlet' id='<?php echo Sanitizer::escapeId( "p-$bar" ) ?>'<?php echo $this->skin->tooltip('p-'.$bar) ?>>
<div class='pBody'>
-->
<?php if ( is_array( $cont ) ) { ?>
<ul class="nav nav-list">
<li class="nav-header"><?php $out = wfMsg( $bar ); if (wfEmptyMsg($bar, $out)) echo htmlspecialchars($bar); else echo htmlspecialchars($out); ?></li>
<?php foreach($cont as $key => $val) { ?>
<li id="<?php echo Sanitizer::escapeId($val['id']) ?>"<?php
if ( $val['active'] ) { ?> class="active" <?php }
?>><a href="<?php echo htmlspecialchars($val['href']) ?>"<?php echo $this->skin->tooltipAndAccesskey($val['id']) ?>><?php echo htmlspecialchars($val['text']) ?></a></li>
<?php } ?>
</ul>
<?php } else {
# allow raw HTML block to be defined by extensions
print $cont;
}
?>
<!--
</div>
</div>
-->
<?php
}
} // end of class

339
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/COPYING

@ -1,339 +0,0 @@ @@ -1,339 +0,0 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

67
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/IE50Fixes.css

@ -1,67 +0,0 @@ @@ -1,67 +0,0 @@
/*
** IE5.0 Fix Stylesheet
*/
#column-content {
margin: 0 !important;
float: none;
}
#column-content #content {
margin-top: 3em;
height: 1%;
}
#column-one {
position: absolute;
overflow: visible;
top: 0;
left: 0;
z-index: 3;
}
#footer {
margin: 0 0 0 13.6em;
}
/* IE 5 & 5.5 interpret keyword sizes one off */
body { font-size: xx-small; }
/*
** the edit tabs
*/
#p-cactions li {
float: left;
padding-top: 0;
padding-bottom: 0 !important;
height: 0.9em;
}
#p-cactions li a {
display: block;
padding-bottom: 0.045em;
}
#p-cactions li.selected a {
padding-bottom: 0.17em;
}
#p-cactions li a:hover {
padding-bottom: 0.17em;
}
/* 5.0 doesn't like the background icon for external links and user */
.link-external,
.external {
background: none;
padding: 0;
}
#p-personal ul { float: right }
#p-personal li { float: left }
li#pt-userpage,
li#pt-anonuserpage,
li#pt-login,
li#pt-logout {
background: none;
padding-left: none;
}
.visualClear {
width: 100%;
height: 0px;
padding:0;
margin: 0;
}
.firstHeading { margin-bottom: .3em; }
/*div{ border:1px solid Red !important;}*/

88
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/IE55Fixes.css

@ -1,88 +0,0 @@ @@ -1,88 +0,0 @@
/* IE5.5/win- only fixes */
#column-content {
float: none;
margin-left: 0;
height: 1%;
}
#column-content #content {
position: relative;
z-index: 5;
margin-left: 12.2em;
margin-top: 3em;
height: 1%;
}
#column-one {
position: absolute;
top: 0;
left: 0;
z-index: 4;
width: 100%;
}
#footer {
margin-left: 13.6em;
border-left: 1px solid #fabd23;
}
/*#bodyContent div,
#bodyContent pre { overflow: auto; }*/
#p-personal { padding-bottom: .1em; }
body { font-size: xx-small; }
/* WERELATE
#p-cactions {
width: 76% !important;
z-index: 3 !important;
float: none;
}
#p-cactions li {
padding-bottom: 0 !important;
border: none;
background-color: transparent;
cursor: default;
float: none !important;
}
#p-cactions li a {
display: inline-block !important;
vertical-align: top;
padding-bottom: 0;
border: solid #aaa;
border-width: 1px 1px 0;
}
#p-cactions li.selected a {
border-color: #fabd23;
padding-bottom: 0.17em;
}
#p-cactions li a:hover {
padding-bottom: 0.17em;
}
*/
#p-navigation a {
display: inline-block;
width: 100%;
}
.portlet {
overflow: hidden;
}
#bodyContent a.external {
background: url(external.png) center right no-repeat;
padding-right: 13px;
}
/* show the hand */
#p-logo a,
#p-logo a:hover {
cursor: pointer;
}
.visualClear {
width: 90%;
height: 1px;
padding: 0;
margin: 0;
}
#editform {
width: 100%;
}

125
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/IE60Fixes.css

@ -1,125 +0,0 @@ @@ -1,125 +0,0 @@
/* 6.0 - only fixes */
/* content area */
/* workaround for various ie float bugs */
div#column-content {
float: none;
margin-left: 0;
height: 1%;
}
div#column-content .mw-body {
margin-left: 12.2em;
margin-top: 3em;
height: 1%;
}
.rtl div#column-content .mw-body {
margin-right: 12.2em;
margin-left: 0;
}
div#column-one {
position: absolute;
top: 0;
left: 0;
z-index: 4;
}
.rtl div#column-one {
left: auto;
right: 0;
}
div#footer {
margin-left: 13.6em;
border-left: 1px solid #fabd23;
}
.rtl div#footer {
margin-left: 0;
margin-right: 13.6em;
border-left: none;
border-right: 1px solid #fabd23;
}
/* float/negative margin brokenness */
* html div#footer {
margin-top: 0;
}
* html div#column-content {
display: inline;
margin-bottom: 0;
}
/* the tabs */
#p-cactions {
z-index: 3;
}
#p-cactions li {
padding-bottom: 0 !important;
border: none;
background-color: transparent;
cursor: default;
float: none !important;
}
#p-cactions li a {
display: inline-block !important;
vertical-align: top;
padding-bottom: 0;
border: solid #aaa;
border-width: 1px 1px 0;
}
#p-cactions li.selected a {
border-color: #fabd23;
padding-bottom: 0.17em;
}
#p-cactions li a:hover {
padding-bottom: 0.17em;
}
#p-navigation a {
display: inline-block;
width: 100%;
}
#portal-personaltools {
padding-bottom: 0.1em;
}
.rtl a.feedlink {
background-position: right;
padding-right: 0;
padding-left: 16px;
}
/* show the hand */
#p-logo a,
#p-logo a:hover {
cursor: pointer;
}
div.visualClear {
width: 100%;
line-height: 0;
}
textarea {
width: 96%;
}
#catlinks,
div.tright,
div.tleft {
position: relative;
}
/* bug 12846 */
body.rtl #preftoc a, body.rtl #preftoc a:active {
float: left;
}

96
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/IE70Fixes.css

@ -1,96 +0,0 @@ @@ -1,96 +0,0 @@
/* 7.0 - only fixes */
/* content area */
/* workaround for various ie float bugs */
/* This bit is needed to make links clickable... WTF */
div#column-content .mw-body {
margin-left: 12.2em;
margin-top: 3em;
height: 1%;
}
.rtl div#column-content .mw-body {
margin-right: 12.2em;
margin-left: 0;
}
.rtl div#column-one {
/* For some reason it tries to inherit the padding-top into every div,
* and I can't figure out how to get it back off.
* Margin works correctly for this use, though.
*/
padding-top: 0;
margin-top: 160px;
}
/* These elements also have padding-left: 20px; in main.css, but in RTL mode this is flipped.
* That's good in normal browsers, but in IE7 it needs to not be flipped for some daft reason.
* Also clear the right margin (originally margin-left: 1em)
*/
li#pt-userpage, li#pt-anonuserpage, li#pt-login {
padding-left: 20px;
margin-right: 0;
}
.rtl a.feedlink {
background-position: right;
padding-right: 0;
padding-left: 16px;
}
/* the tabs */
#p-cactions {
z-index: 3;
}
#p-cactions li {
padding-bottom: 0 !important;
border: none;
background-color: transparent;
cursor: default;
float: none !important;
}
#p-cactions li a {
display: inline-block !important;
vertical-align: top;
padding-bottom: 0;
border: solid #aaa;
border-width: 1px 1px 0;
}
#p-cactions li.selected a {
border-color: #fabd23;
padding-bottom: 0.17em;
}
#p-cactions li a:hover {
padding-bottom: 0.17em;
}
#p-navigation a {
display: inline-block;
width: 100%;
}
#portal-personaltools {
padding-bottom: 0.1em;
}
textarea {
width: 96%;
}
/*
#catlinks,
div.tright,
div.tleft {
position: relative;
}
*/
div#footer li {
/* Work around bug with inline <li> tags with right margins and nowrap */
margin-right: 0;
}

18
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/_footer.html

@ -1,18 +0,0 @@ @@ -1,18 +0,0 @@
<footer id="contentinfo" class="body">
<hr />
<p style="text-align: center">
<span class="fa-stack fa-lg">
<i class="fa fa-square fa-stack-2x"></i>
<i class="fa fa-terminal fa-stack-1x fa-inverse"></i>
</span>
Made from the command line with vim by
<a href="http://charlesreid1.com">charlesreid1</a><br />
with help from <a href="http://d3js.org">D3.js</a>, <a href="http://angularjs.org">Angular.js</a>, and <a href="http://getpelican.com">Pelican</a>.
</p>
<script type="text/javascript" src="{{ SITEURL }}/theme/js/jquery-1.11.2.js"></script>
<script type="text/javascript" src="{{ SITEURL }}/theme/js/jquery_load_template-1.4.5.min.js"></script>
<script type="text/javascript" src="{{ SITEURL }}/theme/js/bootstrap-3.3.4.js"></script>
</footer><!-- /#contentinfo -->

7
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-3.3.4.js

File diff suppressed because one or more lines are too long

90
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-alert.js vendored

@ -1,90 +0,0 @@ @@ -1,90 +0,0 @@
/* ==========================================================
* bootstrap-alert.js v2.0.4
* http://twitter.github.com/bootstrap/javascript.html#alerts
* ==========================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================== */
!function ($) {
"use strict"; // jshint ;_;
/* ALERT CLASS DEFINITION
* ====================== */
var dismiss = '[data-dismiss="alert"]'
, Alert = function (el) {
$(el).on('click', dismiss, this.close)
}
Alert.prototype.close = function (e) {
var $this = $(this)
, selector = $this.attr('data-target')
, $parent
if (!selector) {
selector = $this.attr('href')
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
}
$parent = $(selector)
e && e.preventDefault()
$parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
$parent.trigger(e = $.Event('close'))
if (e.isDefaultPrevented()) return
$parent.removeClass('in')
function removeElement() {
$parent
.trigger('closed')
.remove()
}
$.support.transition && $parent.hasClass('fade') ?
$parent.on($.support.transition.end, removeElement) :
removeElement()
}
/* ALERT PLUGIN DEFINITION
* ======================= */
$.fn.alert = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('alert')
if (!data) $this.data('alert', (data = new Alert(this)))
if (typeof option == 'string') data[option].call($this)
})
}
$.fn.alert.Constructor = Alert
/* ALERT DATA-API
* ============== */
$(function () {
$('body').on('click.alert.data-api', dismiss, Alert.prototype.close)
})
}(window.jQuery);

96
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-button.js vendored

@ -1,96 +0,0 @@ @@ -1,96 +0,0 @@
/* ============================================================
* bootstrap-button.js v2.0.4
* http://twitter.github.com/bootstrap/javascript.html#buttons
* ============================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============================================================ */
!function ($) {
"use strict"; // jshint ;_;
/* BUTTON PUBLIC CLASS DEFINITION
* ============================== */
var Button = function (element, options) {
this.$element = $(element)
this.options = $.extend({}, $.fn.button.defaults, options)
}
Button.prototype.setState = function (state) {
var d = 'disabled'
, $el = this.$element
, data = $el.data()
, val = $el.is('input') ? 'val' : 'html'
state = state + 'Text'
data.resetText || $el.data('resetText', $el[val]())
$el[val](data[state] || this.options[state])
// push to event loop to allow forms to submit
setTimeout(function () {
state == 'loadingText' ?
$el.addClass(d).attr(d, d) :
$el.removeClass(d).removeAttr(d)
}, 0)
}
Button.prototype.toggle = function () {
var $parent = this.$element.parent('[data-toggle="buttons-radio"]')
$parent && $parent
.find('.active')
.removeClass('active')
this.$element.toggleClass('active')
}
/* BUTTON PLUGIN DEFINITION
* ======================== */
$.fn.button = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('button')
, options = typeof option == 'object' && option
if (!data) $this.data('button', (data = new Button(this, options)))
if (option == 'toggle') data.toggle()
else if (option) data.setState(option)
})
}
$.fn.button.defaults = {
loadingText: 'loading...'
}
$.fn.button.Constructor = Button
/* BUTTON DATA-API
* =============== */
$(function () {
$('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) {
var $btn = $(e.target)
if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
$btn.button('toggle')
})
})
}(window.jQuery);

169
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-carousel.js vendored

@ -1,169 +0,0 @@ @@ -1,169 +0,0 @@
/* ==========================================================
* bootstrap-carousel.js v2.0.4
* http://twitter.github.com/bootstrap/javascript.html#carousel
* ==========================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================== */
!function ($) {
"use strict"; // jshint ;_;
/* CAROUSEL CLASS DEFINITION
* ========================= */
var Carousel = function (element, options) {
this.$element = $(element)
this.options = options
this.options.slide && this.slide(this.options.slide)
this.options.pause == 'hover' && this.$element
.on('mouseenter', $.proxy(this.pause, this))
.on('mouseleave', $.proxy(this.cycle, this))
}
Carousel.prototype = {
cycle: function (e) {
if (!e) this.paused = false
this.options.interval
&& !this.paused
&& (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
return this
}
, to: function (pos) {
var $active = this.$element.find('.active')
, children = $active.parent().children()
, activePos = children.index($active)
, that = this
if (pos > (children.length - 1) || pos < 0) return
if (this.sliding) {
return this.$element.one('slid', function () {
that.to(pos)
})
}
if (activePos == pos) {
return this.pause().cycle()
}
return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))
}
, pause: function (e) {
if (!e) this.paused = true
clearInterval(this.interval)
this.interval = null
return this
}
, next: function () {
if (this.sliding) return
return this.slide('next')
}
, prev: function () {
if (this.sliding) return
return this.slide('prev')
}
, slide: function (type, next) {
var $active = this.$element.find('.active')
, $next = next || $active[type]()
, isCycling = this.interval
, direction = type == 'next' ? 'left' : 'right'
, fallback = type == 'next' ? 'first' : 'last'
, that = this
, e = $.Event('slide')
this.sliding = true
isCycling && this.pause()
$next = $next.length ? $next : this.$element.find('.item')[fallback]()
if ($next.hasClass('active')) return
if ($.support.transition && this.$element.hasClass('slide')) {
this.$element.trigger(e)
if (e.isDefaultPrevented()) return
$next.addClass(type)
$next[0].offsetWidth // force reflow
$active.addClass(direction)
$next.addClass(direction)
this.$element.one($.support.transition.end, function () {
$next.removeClass([type, direction].join(' ')).addClass('active')
$active.removeClass(['active', direction].join(' '))
that.sliding = false
setTimeout(function () { that.$element.trigger('slid') }, 0)
})
} else {
this.$element.trigger(e)
if (e.isDefaultPrevented()) return
$active.removeClass('active')
$next.addClass('active')
this.sliding = false
this.$element.trigger('slid')
}
isCycling && this.cycle()
return this
}
}
/* CAROUSEL PLUGIN DEFINITION
* ========================== */
$.fn.carousel = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('carousel')
, options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
if (!data) $this.data('carousel', (data = new Carousel(this, options)))
if (typeof option == 'number') data.to(option)
else if (typeof option == 'string' || (option = options.slide)) data[option]()
else if (options.interval) data.cycle()
})
}
$.fn.carousel.defaults = {
interval: 5000
, pause: 'hover'
}
$.fn.carousel.Constructor = Carousel
/* CAROUSEL DATA-API
* ================= */
$(function () {
$('body').on('click.carousel.data-api', '[data-slide]', function ( e ) {
var $this = $(this), href
, $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
, options = !$target.data('modal') && $.extend({}, $target.data(), $this.data())
$target.carousel(options)
e.preventDefault()
})
})
}(window.jQuery);

157
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-collapse.js vendored

@ -1,157 +0,0 @@ @@ -1,157 +0,0 @@
/* =============================================================
* bootstrap-collapse.js v2.0.4
* http://twitter.github.com/bootstrap/javascript.html#collapse
* =============================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============================================================ */
!function ($) {
"use strict"; // jshint ;_;
/* COLLAPSE PUBLIC CLASS DEFINITION
* ================================ */
var Collapse = function (element, options) {
this.$element = $(element)
this.options = $.extend({}, $.fn.collapse.defaults, options)
if (this.options.parent) {
this.$parent = $(this.options.parent)
}
this.options.toggle && this.toggle()
}
Collapse.prototype = {
constructor: Collapse
, dimension: function () {
var hasWidth = this.$element.hasClass('width')
return hasWidth ? 'width' : 'height'
}
, show: function () {
var dimension
, scroll
, actives
, hasData
if (this.transitioning) return
dimension = this.dimension()
scroll = $.camelCase(['scroll', dimension].join('-'))
actives = this.$parent && this.$parent.find('> .accordion-group > .in')
if (actives && actives.length) {
hasData = actives.data('collapse')
if (hasData && hasData.transitioning) return
actives.collapse('hide')
hasData || actives.data('collapse', null)
}
this.$element[dimension](0)
this.transition('addClass', $.Event('show'), 'shown')
this.$element[dimension](this.$element[0][scroll])
}
, hide: function () {
var dimension
if (this.transitioning) return
dimension = this.dimension()
this.reset(this.$element[dimension]())
this.transition('removeClass', $.Event('hide'), 'hidden')
this.$element[dimension](0)
}
, reset: function (size) {
var dimension = this.dimension()
this.$element
.removeClass('collapse')
[dimension](size || 'auto')
[0].offsetWidth
this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
return this
}
, transition: function (method, startEvent, completeEvent) {
var that = this
, complete = function () {
if (startEvent.type == 'show') that.reset()
that.transitioning = 0
that.$element.trigger(completeEvent)
}
this.$element.trigger(startEvent)
if (startEvent.isDefaultPrevented()) return
this.transitioning = 1
this.$element[method]('in')
$.support.transition && this.$element.hasClass('collapse') ?
this.$element.one($.support.transition.end, complete) :
complete()
}
, toggle: function () {
this[this.$element.hasClass('in') ? 'hide' : 'show']()
}
}
/* COLLAPSIBLE PLUGIN DEFINITION
* ============================== */
$.fn.collapse = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('collapse')
, options = typeof option == 'object' && option
if (!data) $this.data('collapse', (data = new Collapse(this, options)))
if (typeof option == 'string') data[option]()
})
}
$.fn.collapse.defaults = {
toggle: true
}
$.fn.collapse.Constructor = Collapse
/* COLLAPSIBLE DATA-API
* ==================== */
$(function () {
$('body').on('click.collapse.data-api', '[data-toggle=collapse]', function ( e ) {
var $this = $(this), href
, target = $this.attr('data-target')
|| e.preventDefault()
|| (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
, option = $(target).data('collapse') ? 'toggle' : $this.data()
$(target).collapse(option)
})
})
}(window.jQuery);

6981
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-cyborg.css vendored

File diff suppressed because it is too large Load Diff

100
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-dropdown.js vendored

@ -1,100 +0,0 @@ @@ -1,100 +0,0 @@
/* ============================================================
* bootstrap-dropdown.js v2.0.4
* http://twitter.github.com/bootstrap/javascript.html#dropdowns
* ============================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============================================================ */
!function ($) {
"use strict"; // jshint ;_;
/* DROPDOWN CLASS DEFINITION
* ========================= */
var toggle = '[data-toggle="dropdown"]'
, Dropdown = function (element) {
var $el = $(element).on('click.dropdown.data-api', this.toggle)
$('html').on('click.dropdown.data-api', function () {
$el.parent().removeClass('open')
})
}
Dropdown.prototype = {
constructor: Dropdown
, toggle: function (e) {
var $this = $(this)
, $parent
, selector
, isActive
if ($this.is('.disabled, :disabled')) return
selector = $this.attr('data-target')
if (!selector) {
selector = $this.attr('href')
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
}
$parent = $(selector)
$parent.length || ($parent = $this.parent())
isActive = $parent.hasClass('open')
clearMenus()
if (!isActive) $parent.toggleClass('open')
return false
}
}
function clearMenus() {
$(toggle).parent().removeClass('open')
}
/* DROPDOWN PLUGIN DEFINITION
* ========================== */
$.fn.dropdown = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('dropdown')
if (!data) $this.data('dropdown', (data = new Dropdown(this)))
if (typeof option == 'string') data[option].call($this)
})
}
$.fn.dropdown.Constructor = Dropdown
/* APPLY TO STANDARD DROPDOWN ELEMENTS
* =================================== */
$(function () {
$('html').on('click.dropdown.data-api', clearMenus)
$('body')
.on('click.dropdown', '.dropdown form', function (e) { e.stopPropagation() })
.on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle)
})
}(window.jQuery);

399
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-image-gallery.js vendored

@ -1,399 +0,0 @@ @@ -1,399 +0,0 @@
/*
* Bootstrap Image Gallery 2.10
* https://github.com/blueimp/Bootstrap-Image-Gallery
*
* Copyright 2011, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
* http://www.opensource.org/licenses/MIT
*/
/*jslint nomen: true, regexp: true */
/*global define, window, document, jQuery */
(function (factory) {
'use strict';
if (typeof define === 'function' && define.amd) {
// Register as an anonymous AMD module:
define([
'jquery',
'load-image',
'bootstrap'
], factory);
} else {
// Browser globals:
factory(
window.jQuery,
window.loadImage
);
}
}(function ($, loadImage) {
'use strict';
// Bootstrap Image Gallery is an extension to the Modal dialog of Twitter's
// Bootstrap toolkit, to ease navigation between a set of gallery images.
// It features transition effects, fullscreen mode and slideshow functionality.
$.extend($.fn.modal.defaults, {
// Delegate to search gallery links from, can be anything that
// is accepted as parameter for $():
delegate: document,
// Selector for gallery links:
selector: null,
// The filter for the selected gallery links (e.g. set to ":odd" to
// filter out label and thumbnail linking twice to the same image):
filter: '*',
// The index of the first gallery image to show:
index: 0,
// The href of the first gallery image to show (overrides index):
href: null,
// The range of images around the current one to preload:
preloadRange: 2,
// Offset of image width to viewport width:
offsetWidth: 100,
// Offset of image height to viewport height:
offsetHeight: 200,
// Set to true to display images as canvas elements:
canvas: false,
// Shows the next image after the given time in ms (0 = disabled):
slideshow: 0,
// Defines the image division for previous/next clicks:
imageClickDivision: 0.5
});
var originalShow = $.fn.modal.Constructor.prototype.show,
originalHide = $.fn.modal.Constructor.prototype.hide;
$.extend($.fn.modal.Constructor.prototype, {
initLinks: function () {
var $this = this,
options = this.options,
selector = options.selector ||
'a[data-target=' + options.target + ']';
this.$links = $(options.delegate).find(selector)
.filter(options.filter).each(function (index) {
if ($this.getUrl(this) === options.href) {
options.index = index;
}
});
if (!this.$links[options.index]) {
options.index = 0;
}
},
getUrl: function (element) {
return element.href || $(element).data('href');
},
getDownloadUrl: function (element) {
return $(element).data('download');
},
startSlideShow: function () {
var $this = this;
if (this.options.slideshow) {
this._slideShow = window.setTimeout(
function () {
$this.next();
},
this.options.slideshow
);
}
},
stopSlideShow: function () {
window.clearTimeout(this._slideShow);
},
toggleSlideShow: function () {
var node = this.$element.find('.modal-slideshow');
if (this.options.slideshow) {
this.options.slideshow = 0;
this.stopSlideShow();
} else {
this.options.slideshow = node.data('slideshow') || 5000;
this.startSlideShow();
}
node.find('i').toggleClass('icon-play icon-pause');
},
preloadImages: function () {
var options = this.options,
range = options.index + options.preloadRange + 1,
link,
i;
for (i = options.index - options.preloadRange; i < range; i += 1) {
link = this.$links[i];
if (link && i !== options.index) {
$('<img>').prop('src', this.getUrl(link));
}
}
},
loadImage: function () {
var $this = this,
modal = this.$element,
index = this.options.index,
url = this.getUrl(this.$links[index]),
download = this.getDownloadUrl(this.$links[index]),
oldImg;
this.abortLoad();
this.stopSlideShow();
modal.trigger('beforeLoad');
// The timeout prevents displaying a loading status,
// if the image has already been loaded:
this._loadingTimeout = window.setTimeout(function () {
modal.addClass('modal-loading');
}, 100);
oldImg = modal.find('.modal-image').children().removeClass('in');
// The timeout allows transition effects to finish:
window.setTimeout(function () {
oldImg.remove();
}, 3000);
modal.find('.modal-title').text(this.$links[index].title);
modal.find('.modal-download').prop(
'href',
download || url
);
this._loadingImage = loadImage(
url,
function (img) {
$this.img = img;
window.clearTimeout($this._loadingTimeout);
modal.removeClass('modal-loading');
modal.trigger('load');
$this.showImage(img);
$this.startSlideShow();
},
this._loadImageOptions
);
this.preloadImages();
},
showImage: function (img) {
var modal = this.$element,
transition = $.support.transition && modal.hasClass('fade'),
method = transition ? modal.animate : modal.css,
modalImage = modal.find('.modal-image'),
clone,
forceReflow;
modalImage.css({
width: img.width,
height: img.height
});
modal.find('.modal-title').css({ width: Math.max(img.width, 380) });
if (transition) {
clone = modal.clone().hide().appendTo(document.body);
}
if ($(window).width() > 767) {
method.call(modal.stop(), {
'margin-top': -((clone || modal).outerHeight() / 2),
'margin-left': -((clone || modal).outerWidth() / 2)
});
} else {
modal.css({
top: ($(window).height() - (clone || modal).outerHeight()) / 2
});
}
if (clone) {
clone.remove();
}
modalImage.append(img);
forceReflow = img.offsetWidth;
modal.trigger('display');
if (transition) {
if (modal.is(':visible')) {
$(img).on(
$.support.transition.end,
function (e) {
// Make sure we don't respond to other transitions events
// in the container element, e.g. from button elements:
if (e.target === img) {
$(img).off($.support.transition.end);
modal.trigger('displayed');
}
}
).addClass('in');
} else {
$(img).addClass('in');
modal.one('shown', function () {
modal.trigger('displayed');
});
}
} else {
$(img).addClass('in');
modal.trigger('displayed');
}
},
abortLoad: function () {
if (this._loadingImage) {
this._loadingImage.onload = this._loadingImage.onerror = null;
}
window.clearTimeout(this._loadingTimeout);
},
prev: function () {
var options = this.options;
options.index -= 1;
if (options.index < 0) {
options.index = this.$links.length - 1;
}
this.loadImage();
},
next: function () {
var options = this.options;
options.index += 1;
if (options.index > this.$links.length - 1) {
options.index = 0;
}
this.loadImage();
},
keyHandler: function (e) {
switch (e.which) {
case 37: // left
case 38: // up
e.preventDefault();
this.prev();
break;
case 39: // right
case 40: // down
e.preventDefault();
this.next();
break;
}
},
wheelHandler: function (e) {
e.preventDefault();
e = e.originalEvent;
this._wheelCounter = this._wheelCounter || 0;
this._wheelCounter += (e.wheelDelta || e.detail || 0);
if ((e.wheelDelta && this._wheelCounter >= 120) ||
(!e.wheelDelta && this._wheelCounter < 0)) {
this.prev();
this._wheelCounter = 0;
} else if ((e.wheelDelta && this._wheelCounter <= -120) ||
(!e.wheelDelta && this._wheelCounter > 0)) {
this.next();
this._wheelCounter = 0;
}
},
initGalleryEvents: function () {
var $this = this,
modal = this.$element;
modal.find('.modal-image').on('click.modal-gallery', function (e) {
var modalImage = $(this);
if ($this.$links.length === 1) {
$this.hide();
} else {
if ((e.pageX - modalImage.offset().left) / modalImage.width() <
$this.options.imageClickDivision) {
$this.prev(e);
} else {
$this.next(e);
}
}
});
modal.find('.modal-prev').on('click.modal-gallery', function (e) {
$this.prev(e);
});
modal.find('.modal-next').on('click.modal-gallery', function (e) {
$this.next(e);
});
modal.find('.modal-slideshow').on('click.modal-gallery', function (e) {
$this.toggleSlideShow(e);
});
$(document)
.on('keydown.modal-gallery', function (e) {
$this.keyHandler(e);
})
.on(
'mousewheel.modal-gallery, DOMMouseScroll.modal-gallery',
function (e) {
$this.wheelHandler(e);
}
);
},
destroyGalleryEvents: function () {
var modal = this.$element;
this.abortLoad();
this.stopSlideShow();
modal.find('.modal-image, .modal-prev, .modal-next, .modal-slideshow')
.off('click.modal-gallery');
$(document)
.off('keydown.modal-gallery')
.off('mousewheel.modal-gallery, DOMMouseScroll.modal-gallery');
},
show: function () {
if (!this.isShown && this.$element.hasClass('modal-gallery')) {
var modal = this.$element,
options = this.options,
windowWidth = $(window).width(),
windowHeight = $(window).height();
if (modal.hasClass('modal-fullscreen')) {
this._loadImageOptions = {
maxWidth: windowWidth,
maxHeight: windowHeight,
canvas: options.canvas
};
if (modal.hasClass('modal-fullscreen-stretch')) {
this._loadImageOptions.minWidth = windowWidth;
this._loadImageOptions.minHeight = windowHeight;
}
} else {
this._loadImageOptions = {
maxWidth: windowWidth - options.offsetWidth,
maxHeight: windowHeight - options.offsetHeight,
canvas: options.canvas
};
}
if (windowWidth > 767) {
modal.css({
'margin-top': -(modal.outerHeight() / 2),
'margin-left': -(modal.outerWidth() / 2)
});
} else {
modal.css({
top: ($(window).height() - modal.outerHeight()) / 2
});
}
this.initGalleryEvents();
this.initLinks();
if (this.$links.length) {
modal.find('.modal-slideshow, .modal-prev, .modal-next')
.toggle(this.$links.length !== 1);
modal.toggleClass(
'modal-single',
this.$links.length === 1
);
this.loadImage();
}
}
originalShow.apply(this, arguments);
},
hide: function () {
if (this.isShown && this.$element.hasClass('modal-gallery')) {
this.options.delegate = document;
this.options.href = null;
this.destroyGalleryEvents();
}
originalHide.apply(this, arguments);
}
});
$(function () {
$(document.body).on(
'click.modal-gallery.data-api',
'[data-toggle="modal-gallery"]',
function (e) {
var $this = $(this),
options = $this.data(),
modal = $(options.target),
data = modal.data('modal'),
link;
if (!data) {
options = $.extend(modal.data(), options);
}
if (!options.selector) {
options.selector = 'a[data-gallery=gallery]';
}
link = $(e.target).closest(options.selector);
if (link.length && modal.length) {
e.preventDefault();
options.href = link.prop('href') || link.data('href');
options.delegate = link[0] !== this ? this : document;
if (data) {
$.extend(data.options, options);
}
modal.modal(options);
}
}
);
});
}));

1
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-image-gallery.min.js vendored

File diff suppressed because one or more lines are too long

218
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-modal.js vendored

@ -1,218 +0,0 @@ @@ -1,218 +0,0 @@
/* =========================================================
* bootstrap-modal.js v2.0.4
* http://twitter.github.com/bootstrap/javascript.html#modals
* =========================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================= */
!function ($) {
"use strict"; // jshint ;_;
/* MODAL CLASS DEFINITION
* ====================== */
var Modal = function (content, options) {
this.options = options
this.$element = $(content)
.delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
}
Modal.prototype = {
constructor: Modal
, toggle: function () {
return this[!this.isShown ? 'show' : 'hide']()
}
, show: function () {
var that = this
, e = $.Event('show')
this.$element.trigger(e)
if (this.isShown || e.isDefaultPrevented()) return
$('body').addClass('modal-open')
this.isShown = true
escape.call(this)
backdrop.call(this, function () {
var transition = $.support.transition && that.$element.hasClass('fade')
if (!that.$element.parent().length) {
that.$element.appendTo(document.body) //don't move modals dom position
}
that.$element
.show()
if (transition) {
that.$element[0].offsetWidth // force reflow
}
that.$element.addClass('in')
transition ?
that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) :
that.$element.trigger('shown')
})
}
, hide: function (e) {
e && e.preventDefault()
var that = this
e = $.Event('hide')
this.$element.trigger(e)
if (!this.isShown || e.isDefaultPrevented()) return
this.isShown = false
$('body').removeClass('modal-open')
escape.call(this)
this.$element.removeClass('in')
$.support.transition && this.$element.hasClass('fade') ?
hideWithTransition.call(this) :
hideModal.call(this)
}
}
/* MODAL PRIVATE METHODS
* ===================== */
function hideWithTransition() {
var that = this
, timeout = setTimeout(function () {
that.$element.off($.support.transition.end)
hideModal.call(that)
}, 500)
this.$element.one($.support.transition.end, function () {
clearTimeout(timeout)
hideModal.call(that)
})
}
function hideModal(that) {
this.$element
.hide()
.trigger('hidden')
backdrop.call(this)
}
function backdrop(callback) {
var that = this
, animate = this.$element.hasClass('fade') ? 'fade' : ''
if (this.isShown && this.options.backdrop) {
var doAnimate = $.support.transition && animate
this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
.appendTo(document.body)
if (this.options.backdrop != 'static') {
this.$backdrop.click($.proxy(this.hide, this))
}
if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
this.$backdrop.addClass('in')
doAnimate ?
this.$backdrop.one($.support.transition.end, callback) :
callback()
} else if (!this.isShown && this.$backdrop) {
this.$backdrop.removeClass('in')
$.support.transition && this.$element.hasClass('fade')?
this.$backdrop.one($.support.transition.end, $.proxy(removeBackdrop, this)) :
removeBackdrop.call(this)
} else if (callback) {
callback()
}
}
function removeBackdrop() {
this.$backdrop.remove()
this.$backdrop = null
}
function escape() {
var that = this
if (this.isShown && this.options.keyboard) {
$(document).on('keyup.dismiss.modal', function ( e ) {
e.which == 27 && that.hide()
})
} else if (!this.isShown) {
$(document).off('keyup.dismiss.modal')
}
}
/* MODAL PLUGIN DEFINITION
* ======================= */
$.fn.modal = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('modal')
, options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
if (!data) $this.data('modal', (data = new Modal(this, options)))
if (typeof option == 'string') data[option]()
else if (options.show) data.show()
})
}
$.fn.modal.defaults = {
backdrop: true
, keyboard: true
, show: true
}
$.fn.modal.Constructor = Modal
/* MODAL DATA-API
* ============== */
$(function () {
$('body').on('click.modal.data-api', '[data-toggle="modal"]', function ( e ) {
var $this = $(this), href
, $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
, option = $target.data('modal') ? 'toggle' : $.extend({}, $target.data(), $this.data())
e.preventDefault()
$target.modal(option)
})
})
}(window.jQuery);

98
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-popover.js vendored

@ -1,98 +0,0 @@ @@ -1,98 +0,0 @@
/* ===========================================================
* bootstrap-popover.js v2.0.4
* http://twitter.github.com/bootstrap/javascript.html#popovers
* ===========================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =========================================================== */
!function ($) {
"use strict"; // jshint ;_;
/* POPOVER PUBLIC CLASS DEFINITION
* =============================== */
var Popover = function ( element, options ) {
this.init('popover', element, options)
}
/* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
========================================== */
Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
constructor: Popover
, setContent: function () {
var $tip = this.tip()
, title = this.getTitle()
, content = this.getContent()
$tip.find('.popover-title')[this.isHTML(title) ? 'html' : 'text'](title)
$tip.find('.popover-content > *')[this.isHTML(content) ? 'html' : 'text'](content)
$tip.removeClass('fade top bottom left right in')
}
, hasContent: function () {
return this.getTitle() || this.getContent()
}
, getContent: function () {
var content
, $e = this.$element
, o = this.options
content = $e.attr('data-content')
|| (typeof o.content == 'function' ? o.content.call($e[0]) : o.content)
return content
}
, tip: function () {
if (!this.$tip) {
this.$tip = $(this.options.template)
}
return this.$tip
}
})
/* POPOVER PLUGIN DEFINITION
* ======================= */
$.fn.popover = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('popover')
, options = typeof option == 'object' && option
if (!data) $this.data('popover', (data = new Popover(this, options)))
if (typeof option == 'string') data[option]()
})
}
$.fn.popover.Constructor = Popover
$.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
placement: 'right'
, content: ''
, template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'
})
}(window.jQuery);

1109
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-responsive-cyborg.css vendored

File diff suppressed because it is too large Load Diff

151
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-scrollspy.js vendored

@ -1,151 +0,0 @@ @@ -1,151 +0,0 @@
/* =============================================================
* bootstrap-scrollspy.js v2.0.4
* http://twitter.github.com/bootstrap/javascript.html#scrollspy
* =============================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============================================================== */
!function ($) {
"use strict"; // jshint ;_;
/* SCROLLSPY CLASS DEFINITION
* ========================== */
function ScrollSpy( element, options) {
var process = $.proxy(this.process, this)
, $element = $(element).is('body') ? $(window) : $(element)
, href
this.options = $.extend({}, $.fn.scrollspy.defaults, options)
this.$scrollElement = $element.on('scroll.scroll.data-api', process)
this.selector = (this.options.target
|| ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
|| '') + ' .nav li > a'
this.$body = $('body')
this.refresh()
this.process()
}
ScrollSpy.prototype = {
constructor: ScrollSpy
, refresh: function () {
var self = this
, $targets
this.offsets = $([])
this.targets = $([])
$targets = this.$body
.find(this.selector)
.map(function () {
var $el = $(this)
, href = $el.data('target') || $el.attr('href')
, $href = /^#\w/.test(href) && $(href)
return ( $href
&& href.length
&& [[ $href.position().top, href ]] ) || null
})
.sort(function (a, b) { return a[0] - b[0] })
.each(function () {
self.offsets.push(this[0])
self.targets.push(this[1])
})
}
, process: function () {
var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
, scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
, maxScroll = scrollHeight - this.$scrollElement.height()
, offsets = this.offsets
, targets = this.targets
, activeTarget = this.activeTarget
, i
if (scrollTop >= maxScroll) {
return activeTarget != (i = targets.last()[0])
&& this.activate ( i )
}
for (i = offsets.length; i--;) {
activeTarget != targets[i]
&& scrollTop >= offsets[i]
&& (!offsets[i + 1] || scrollTop <= offsets[i + 1])
&& this.activate( targets[i] )
}
}
, activate: function (target) {
var active
, selector
this.activeTarget = target
$(this.selector)
.parent('.active')
.removeClass('active')
selector = this.selector
+ '[data-target="' + target + '"],'
+ this.selector + '[href="' + target + '"]'
active = $(selector)
.parent('li')
.addClass('active')
if (active.parent('.dropdown-menu')) {
active = active.closest('li.dropdown').addClass('active')
}
active.trigger('activate')
}
}
/* SCROLLSPY PLUGIN DEFINITION
* =========================== */
$.fn.scrollspy = function ( option ) {
return this.each(function () {
var $this = $(this)
, data = $this.data('scrollspy')
, options = typeof option == 'object' && option
if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
if (typeof option == 'string') data[option]()
})
}
$.fn.scrollspy.Constructor = ScrollSpy
$.fn.scrollspy.defaults = {
offset: 10
}
/* SCROLLSPY DATA-API
* ================== */
$(function () {
$('[data-spy="scroll"]').each(function () {
var $spy = $(this)
$spy.scrollspy($spy.data())
})
})
}(window.jQuery);

135
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-tab.js vendored

@ -1,135 +0,0 @@ @@ -1,135 +0,0 @@
/* ========================================================
* bootstrap-tab.js v2.0.4
* http://twitter.github.com/bootstrap/javascript.html#tabs
* ========================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ======================================================== */
!function ($) {
"use strict"; // jshint ;_;
/* TAB CLASS DEFINITION
* ==================== */
var Tab = function ( element ) {
this.element = $(element)
}
Tab.prototype = {
constructor: Tab
, show: function () {
var $this = this.element
, $ul = $this.closest('ul:not(.dropdown-menu)')
, selector = $this.attr('data-target')
, previous
, $target
, e
if (!selector) {
selector = $this.attr('href')
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
}
if ( $this.parent('li').hasClass('active') ) return
previous = $ul.find('.active a').last()[0]
e = $.Event('show', {
relatedTarget: previous
})
$this.trigger(e)
if (e.isDefaultPrevented()) return
$target = $(selector)
this.activate($this.parent('li'), $ul)
this.activate($target, $target.parent(), function () {
$this.trigger({
type: 'shown'
, relatedTarget: previous
})
})
}
, activate: function ( element, container, callback) {
var $active = container.find('> .active')
, transition = callback
&& $.support.transition
&& $active.hasClass('fade')
function next() {
$active
.removeClass('active')
.find('> .dropdown-menu > .active')
.removeClass('active')
element.addClass('active')
if (transition) {
element[0].offsetWidth // reflow for transition
element.addClass('in')
} else {
element.removeClass('fade')
}
if ( element.parent('.dropdown-menu') ) {
element.closest('li.dropdown').addClass('active')
}
callback && callback()
}
transition ?
$active.one($.support.transition.end, next) :
next()
$active.removeClass('in')
}
}
/* TAB PLUGIN DEFINITION
* ===================== */
$.fn.tab = function ( option ) {
return this.each(function () {
var $this = $(this)
, data = $this.data('tab')
if (!data) $this.data('tab', (data = new Tab(this)))
if (typeof option == 'string') data[option]()
})
}
$.fn.tab.Constructor = Tab
/* TAB DATA-API
* ============ */
$(function () {
$('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
e.preventDefault()
$(this).tab('show')
})
})
}(window.jQuery);

275
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-tooltip.js vendored

@ -1,275 +0,0 @@ @@ -1,275 +0,0 @@
/* ===========================================================
* bootstrap-tooltip.js v2.0.4
* http://twitter.github.com/bootstrap/javascript.html#tooltips
* Inspired by the original jQuery.tipsy by Jason Frame
* ===========================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================== */
!function ($) {
"use strict"; // jshint ;_;
/* TOOLTIP PUBLIC CLASS DEFINITION
* =============================== */
var Tooltip = function (element, options) {
this.init('tooltip', element, options)
}
Tooltip.prototype = {
constructor: Tooltip
, init: function (type, element, options) {
var eventIn
, eventOut
this.type = type
this.$element = $(element)
this.options = this.getOptions(options)
this.enabled = true
if (this.options.trigger != 'manual') {
eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'
eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur'
this.$element.on(eventIn, this.options.selector, $.proxy(this.enter, this))
this.$element.on(eventOut, this.options.selector, $.proxy(this.leave, this))
}
this.options.selector ?
(this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
this.fixTitle()
}
, getOptions: function (options) {
options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data())
if (options.delay && typeof options.delay == 'number') {
options.delay = {
show: options.delay
, hide: options.delay
}
}
return options
}
, enter: function (e) {
var self = $(e.currentTarget)[this.type](this._options).data(this.type)
if (!self.options.delay || !self.options.delay.show) return self.show()
clearTimeout(this.timeout)
self.hoverState = 'in'
this.timeout = setTimeout(function() {
if (self.hoverState == 'in') self.show()
}, self.options.delay.show)
}
, leave: function (e) {
var self = $(e.currentTarget)[this.type](this._options).data(this.type)
if (this.timeout) clearTimeout(this.timeout)
if (!self.options.delay || !self.options.delay.hide) return self.hide()
self.hoverState = 'out'
this.timeout = setTimeout(function() {
if (self.hoverState == 'out') self.hide()
}, self.options.delay.hide)
}
, show: function () {
var $tip
, inside
, pos
, actualWidth
, actualHeight
, placement
, tp
if (this.hasContent() && this.enabled) {
$tip = this.tip()
this.setContent()
if (this.options.animation) {
$tip.addClass('fade')
}
placement = typeof this.options.placement == 'function' ?
this.options.placement.call(this, $tip[0], this.$element[0]) :
this.options.placement
inside = /in/.test(placement)
$tip
.remove()
.css({ top: 0, left: 0, display: 'block' })
.appendTo(inside ? this.$element : document.body)
pos = this.getPosition(inside)
actualWidth = $tip[0].offsetWidth
actualHeight = $tip[0].offsetHeight
switch (inside ? placement.split(' ')[1] : placement) {
case 'bottom':
tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
break
case 'top':
tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
break
case 'left':
tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
break
case 'right':
tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
break
}
$tip
.css(tp)
.addClass(placement)
.addClass('in')
}
}
, isHTML: function(text) {
// html string detection logic adapted from jQuery
return typeof text != 'string'
|| ( text.charAt(0) === "<"
&& text.charAt( text.length - 1 ) === ">"
&& text.length >= 3
) || /^(?:[^<]*<[\w\W]+>[^>]*$)/.exec(text)
}
, setContent: function () {
var $tip = this.tip()
, title = this.getTitle()
$tip.find('.tooltip-inner')[this.isHTML(title) ? 'html' : 'text'](title)
$tip.removeClass('fade in top bottom left right')
}
, hide: function () {
var that = this
, $tip = this.tip()
$tip.removeClass('in')
function removeWithAnimation() {
var timeout = setTimeout(function () {
$tip.off($.support.transition.end).remove()
}, 500)
$tip.one($.support.transition.end, function () {
clearTimeout(timeout)
$tip.remove()
})
}
$.support.transition && this.$tip.hasClass('fade') ?
removeWithAnimation() :
$tip.remove()
}
, fixTitle: function () {
var $e = this.$element
if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
$e.attr('data-original-title', $e.attr('title') || '').removeAttr('title')
}
}
, hasContent: function () {
return this.getTitle()
}
, getPosition: function (inside) {
return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), {
width: this.$element[0].offsetWidth
, height: this.$element[0].offsetHeight
})
}
, getTitle: function () {
var title
, $e = this.$element
, o = this.options
title = $e.attr('data-original-title')
|| (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
return title
}
, tip: function () {
return this.$tip = this.$tip || $(this.options.template)
}
, validate: function () {
if (!this.$element[0].parentNode) {
this.hide()
this.$element = null
this.options = null
}
}
, enable: function () {
this.enabled = true
}
, disable: function () {
this.enabled = false
}
, toggleEnabled: function () {
this.enabled = !this.enabled
}
, toggle: function () {
this[this.tip().hasClass('in') ? 'hide' : 'show']()
}
}
/* TOOLTIP PLUGIN DEFINITION
* ========================= */
$.fn.tooltip = function ( option ) {
return this.each(function () {
var $this = $(this)
, data = $this.data('tooltip')
, options = typeof option == 'object' && option
if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
if (typeof option == 'string') data[option]()
})
}
$.fn.tooltip.Constructor = Tooltip
$.fn.tooltip.defaults = {
animation: true
, placement: 'top'
, selector: false
, template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
, trigger: 'hover'
, title: ''
, delay: 0
}
}(window.jQuery);

61
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-transition.js vendored

@ -1,61 +0,0 @@ @@ -1,61 +0,0 @@
/* ===================================================
* bootstrap-transition.js v2.0.4
* http://twitter.github.com/bootstrap/javascript.html#transitions
* ===================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================== */
!function ($) {
$(function () {
"use strict"; // jshint ;_;
/* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
* ======================================================= */
$.support.transition = (function () {
var transitionEnd = (function () {
var el = document.createElement('bootstrap')
, transEndEventNames = {
'WebkitTransition' : 'webkitTransitionEnd'
, 'MozTransition' : 'transitionend'
, 'OTransition' : 'oTransitionEnd'
, 'msTransition' : 'MSTransitionEnd'
, 'transition' : 'transitionend'
}
, name
for (name in transEndEventNames){
if (el.style[name] !== undefined) {
return transEndEventNames[name]
}
}
}())
return transitionEnd && {
end: transitionEnd
}
})()
})
}(window.jQuery);

285
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap-typeahead.js vendored

@ -1,285 +0,0 @@ @@ -1,285 +0,0 @@
/* =============================================================
* bootstrap-typeahead.js v2.0.4
* http://twitter.github.com/bootstrap/javascript.html#typeahead
* =============================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============================================================ */
!function($){
"use strict"; // jshint ;_;
/* TYPEAHEAD PUBLIC CLASS DEFINITION
* ================================= */
var Typeahead = function (element, options) {
this.$element = $(element)
this.options = $.extend({}, $.fn.typeahead.defaults, options)
this.matcher = this.options.matcher || this.matcher
this.sorter = this.options.sorter || this.sorter
this.highlighter = this.options.highlighter || this.highlighter
this.updater = this.options.updater || this.updater
this.$menu = $(this.options.menu).appendTo('body')
this.source = this.options.source
this.shown = false
this.listen()
}
Typeahead.prototype = {
constructor: Typeahead
, select: function () {
var val = this.$menu.find('.active').attr('data-value')
this.$element
.val(this.updater(val))
.change()
return this.hide()
}
, updater: function (item) {
return item
}
, show: function () {
var pos = $.extend({}, this.$element.offset(), {
height: this.$element[0].offsetHeight
})
this.$menu.css({
top: pos.top + pos.height
, left: pos.left
})
this.$menu.show()
this.shown = true
return this
}
, hide: function () {
this.$menu.hide()
this.shown = false
return this
}
, lookup: function (event) {
var that = this
, items
, q
this.query = this.$element.val()
if (!this.query) {
return this.shown ? this.hide() : this
}
items = $.grep(this.source, function (item) {
return that.matcher(item)
})
items = this.sorter(items)
if (!items.length) {
return this.shown ? this.hide() : this
}
return this.render(items.slice(0, this.options.items)).show()
}
, matcher: function (item) {
return ~item.toLowerCase().indexOf(this.query.toLowerCase())
}
, sorter: function (items) {
var beginswith = []
, caseSensitive = []
, caseInsensitive = []
, item
while (item = items.shift()) {
if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
else if (~item.indexOf(this.query)) caseSensitive.push(item)
else caseInsensitive.push(item)
}
return beginswith.concat(caseSensitive, caseInsensitive)
}
, highlighter: function (item) {
var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
return '<strong>' + match + '</strong>'
})
}
, render: function (items) {
var that = this
items = $(items).map(function (i, item) {
i = $(that.options.item).attr('data-value', item)
i.find('a').html(that.highlighter(item))
return i[0]
})
items.first().addClass('active')
this.$menu.html(items)
return this
}
, next: function (event) {
var active = this.$menu.find('.active').removeClass('active')
, next = active.next()
if (!next.length) {
next = $(this.$menu.find('li')[0])
}
next.addClass('active')
}
, prev: function (event) {
var active = this.$menu.find('.active').removeClass('active')
, prev = active.prev()
if (!prev.length) {
prev = this.$menu.find('li').last()
}
prev.addClass('active')
}
, listen: function () {
this.$element
.on('blur', $.proxy(this.blur, this))
.on('keypress', $.proxy(this.keypress, this))
.on('keyup', $.proxy(this.keyup, this))
if ($.browser.webkit || $.browser.msie) {
this.$element.on('keydown', $.proxy(this.keypress, this))
}
this.$menu
.on('click', $.proxy(this.click, this))
.on('mouseenter', 'li', $.proxy(this.mouseenter, this))
}
, keyup: function (e) {
switch(e.keyCode) {
case 40: // down arrow
case 38: // up arrow
break
case 9: // tab
case 13: // enter
if (!this.shown) return
this.select()
break
case 27: // escape
if (!this.shown) return
this.hide()
break
default:
this.lookup()
}
e.stopPropagation()
e.preventDefault()
}
, keypress: function (e) {
if (!this.shown) return
switch(e.keyCode) {
case 9: // tab
case 13: // enter
case 27: // escape
e.preventDefault()
break
case 38: // up arrow
if (e.type != 'keydown') break
e.preventDefault()
this.prev()
break
case 40: // down arrow
if (e.type != 'keydown') break
e.preventDefault()
this.next()
break
}
e.stopPropagation()
}
, blur: function (e) {
var that = this
setTimeout(function () { that.hide() }, 150)
}
, click: function (e) {
e.stopPropagation()
e.preventDefault()
this.select()
}
, mouseenter: function (e) {
this.$menu.find('.active').removeClass('active')
$(e.currentTarget).addClass('active')
}
}
/* TYPEAHEAD PLUGIN DEFINITION
* =========================== */
$.fn.typeahead = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('typeahead')
, options = typeof option == 'object' && option
if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
if (typeof option == 'string') data[option]()
})
}
$.fn.typeahead.defaults = {
source: []
, items: 8
, menu: '<ul class="typeahead dropdown-menu"></ul>'
, item: '<li><a href="#"></a></li>'
}
$.fn.typeahead.Constructor = Typeahead
/* TYPEAHEAD DATA-API
* ================== */
$(function () {
$('body').on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
var $this = $(this)
if ($this.data('typeahead')) return
e.preventDefault()
$this.typeahead($this.data())
})
})
}(window.jQuery);

5
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap.css vendored

File diff suppressed because one or more lines are too long

2027
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap.js vendored

File diff suppressed because it is too large Load Diff

6
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bootstrap.min.js vendored

File diff suppressed because one or more lines are too long

BIN
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/bullet.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 B

490
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/buttons.css

@ -1,490 +0,0 @@ @@ -1,490 +0,0 @@
/* BonBon Buttons 1.1 by simurai.com
1.1 Added unprefixed attributes, :focus style, <button> support
1.0 Released
Usage:
Default button: <a href="" class="button">Label</a>
More fancy with icon: <a href="" class="button orange glossy" data-icon="★">Label</a>
Following additional class names are supported:
Color: orange, pink, blue, green, transparent
Font: serif
Material: glossy, glass
Size: xs, xl
Shape: round, oval, brackets, skew, back, knife, shield, drop, morph
Icon only: icon
Disabled: disabled
*/
@import url(http://fonts.googleapis.com/css?family=Droid+Sans:bold+Lobster);
@import url(http://fonts.googleapis.com/css?family=Lobster);
/* -------------- THE button -------------- */
.button {
/* text */
text-decoration: none;
font: 24px/1em 'Droid Sans', sans-serif;
font-weight: bold;
text-shadow: rgba(255,255,255,.5) 0 1px 0;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
/* layout */
/*
padding: .5em .6em .4em .6em;
margin: .5em;
*/
padding: .4em .4em .4em .4em;
margin: .3em;
display: inline-block;
position: relative;
-webkit-border-radius: 8px;
-moz-border-radius: 8px;
border-radius: 8px;
/* effects */
border-top: 1px solid rgba(255,255,255,0.8);
border-bottom: 1px solid rgba(0,0,0,0.1);
background-image: -webkit-gradient(radial, 50% 0, 100, 50% 0, 0, from( rgba(255,255,255,0) ), to( rgba(255,255,255,0.7) )), url(noise.png);
background-image: -moz-radial-gradient(top, ellipse cover, rgba(255,255,255,0.7) 0%, rgba(255,255,255,0) 100%), url(noise.png);
background-image: gradient(radial, 50% 0, 100, 50% 0, 0, from( rgba(255,255,255,0) ), to( rgba(255,255,255,0.7) )), url(noise.png);
-webkit-transition: background .4s ease-in-out;
-moz-transition: background .4s ease-in-out;
transition: background .4s ease-in-out;
/* color */
color: hsl(0, 0%, 40%) !important;
background-color: hsl(0, 0%, 75%);
-webkit-box-shadow: inset rgba(255,254,255,0.6) 0 0.3em .3em, inset rgba(0,0,0,0.15) 0 -0.1em .3em, /* inner shadow */
hsl(0, 0%, 60%) 0 .1em 3px, hsl(0, 0%, 45%) 0 .3em 1px, /* color border */
rgba(0,0,0,0.2) 0 .5em 5px; /* drop shadow */
-moz-box-shadow: inset rgba(255,254,255,0.6) 0 0.3em .3em, inset rgba(0,0,0,0.15) 0 -0.1em .3em, /* inner shadow */
hsl(0, 0%, 60%) 0 .1em 3px, hsl(0, 0%, 45%) 0 .3em 1px, /* color border */
rgba(0,0,0,0.2) 0 .5em 5px; /* drop shadow */
box-shadow: inset rgba(255,254,255,0.6) 0 0.3em .3em, inset rgba(0,0,0,0.15) 0 -0.1em .3em, /* inner shadow */
hsl(0, 0%, 60%) 0 .1em 3px, hsl(0, 0%, 45%) 0 .3em 1px, /* color border */
rgba(0,0,0,0.2) 0 .5em 5px; /* drop shadow */
}
/* -------------- button (tag) -------------- */
button.button {
border-left: none;
border-right: none;
}
button.button:hover {
cursor: pointer;
}
/* -------------- icon -------------- */
.button:before {
font: 1.2em/0 sans-serif;
content: attr(data-icon); /* gets the icon value from the custom data attribute and puts it infront of the button label */
margin-right: 0.4em;
}
/* icon only */
.icon {
font-weight: normal;
font-style: normal;
text-indent: -999em;
}
.icon:before {
margin-right: 0;
display: block;
height: 0;
text-indent: 0px;
line-height: .75em;
}
/* -------------- colours -------------- */
.button.orange {
color: hsl(39, 100%, 30%) !important;
background-color: hsl(39, 100%, 50%);
-webkit-box-shadow: inset rgba(255,254,255,0.6) 0 0.3em .3em, inset rgba(0,0,0,0.15) 0 -0.1em .3em, /* inner shadow */
hsl(39, 100%, 40%) 0 .1em 3px, hsl(39, 100%, 30%) 0 .3em 1px, /* color border */
rgba(0,0,0,0.2) 0 .5em 5px; /* drop shadow */
-moz-box-shadow: inset rgba(255,254,255,0.6) 0 0.3em .3em, inset rgba(0,0,0,0.15) 0 -0.1em .3em, /* inner shadow */
hsl(39, 100%, 40%) 0 .1em 3px, hsl(39, 100%, 30%) 0 .3em 1px, /* color border */
rgba(0,0,0,0.2) 0 .5em 5px; /* drop shadow */
box-shadow: inset rgba(255,254,255,0.6) 0 0.3em .3em, inset rgba(0,0,0,0.15) 0 -0.1em .3em, /* inner shadow */
hsl(39, 100%, 40%) 0 .1em 3px, hsl(39, 100%, 30%) 0 .3em 1px, /* color border */
rgba(0,0,0,0.2) 0 .5em 5px; /* drop shadow */
}
.button.orange:hover { background-color: hsl(39, 100%, 65%); }
.button.blue {
color: hsl(208, 50%, 40%) !important;
background-color: hsl(208, 100%, 75%);
-webkit-box-shadow: inset rgba(255,254,255,0.6) 0 0.3em .3em, inset rgba(0,0,0,0.15) 0 -0.1em .3em, /* inner shadow */
hsl(208, 50%, 55%) 0 .1em 3px, hsl(208, 50%, 40%) 0 .3em 1px, /* color border */
rgba(0,0,0,0.2) 0 .5em 5px; /* drop shadow */
-moz-box-shadow: inset rgba(255,254,255,0.6) 0 0.3em .3em, inset rgba(0,0,0,0.15) 0 -0.1em .3em, /* inner shadow */
hsl(208, 50%, 55%) 0 .1em 3px, hsl(208, 50%, 40%) 0 .3em 1px, /* color border */
rgba(0,0,0,0.2) 0 .5em 5px; /* drop shadow */
box-shadow: inset rgba(255,254,255,0.6) 0 0.3em .3em, inset rgba(0,0,0,0.15) 0 -0.1em .3em, /* inner shadow */
hsl(208, 50%, 55%) 0 .1em 3px, hsl(208, 50%, 40%) 0 .3em 1px, /* color border */
rgba(0,0,0,0.2) 0 .5em 5px; /* drop shadow */
}
.button.blue:hover { background-color: hsl(208, 100%, 83%); }
.button.green {
color: hsl(88, 70%, 30%) !important;
background-color: hsl(88, 70%, 60%);
-webkit-box-shadow: inset rgba(255,254,255,0.6) 0 0.3em .3em, inset rgba(0,0,0,0.15) 0 -0.1em .3em, /* inner shadow */
hsl(88, 70%, 40%) 0 .1em 3px, hsl(88, 70%, 30%) 0 .3em 1px, /* color border */
rgba(0,0,0,0.2) 0 .5em 5px; /* drop shadow */
-moz-box-shadow: inset rgba(255,254,255,0.6) 0 0.3em .3em, inset rgba(0,0,0,0.15) 0 -0.1em .3em, /* inner shadow */
hsl(88, 70%, 40%) 0 .1em 3px, hsl(88, 70%, 30%) 0 .3em 1px, /* color border */
rgba(0,0,0,0.2) 0 .5em 5px; /* drop shadow */
box-shadow: inset rgba(255,254,255,0.6) 0 0.3em .3em, inset rgba(0,0,0,0.15) 0 -0.1em .3em, /* inner shadow */
hsl(88, 70%, 40%) 0 .1em 3px, hsl(88, 70%, 30%) 0 .3em 1px, /* color border */
rgba(0,0,0,0.2) 0 .5em 5px; /* drop shadow */
}
.button.green:hover { background-color: hsl(88, 70%, 75%); }
.button.pink {
color: hsl(340, 100%, 30%) !important;
background-color: hsl(340, 100%, 75%);
-webkit-box-shadow: inset rgba(255,254,255,0.6) 0 0.3em .3em, inset rgba(0,0,0,0.15) 0 -0.1em .3em, /* inner shadow */
hsl(340, 70%, 50%) 0 .1em 3px, hsl(340, 80%, 40%) 0 .3em 1px, /* color border */
rgba(0,0,0,0.2) 0 .5em 5px; /* drop shadow */
-moz-box-shadow: inset rgba(255,254,255,0.6) 0 0.3em .3em, inset rgba(0,0,0,0.15) 0 -0.1em .3em, /* inner shadow */
hsl(340, 70%, 50%) 0 .1em 3px, hsl(340, 80%, 40%) 0 .3em 1px, /* color border */
rgba(0,0,0,0.2) 0 .5em 5px; /* drop shadow */
box-shadow: inset rgba(255,254,255,0.6) 0 0.3em .3em, inset rgba(0,0,0,0.15) 0 -0.1em .3em, /* inner shadow */
hsl(340, 70%, 50%) 0 .1em 3px, hsl(340, 80%, 40%) 0 .3em 1px, /* color border */
rgba(0,0,0,0.2) 0 .5em 5px; /* drop shadow */
}
.button.pink:hover { background-color: hsl(340, 100%, 83%); }
.button.transparent {
color: rgba(0,0,0,0.5) !important;
}
.button.transparent, .button.transparent:hover, .button.transparent:active {
background-color: transparent;
background-image: none;
}
.button.transparent:hover {
opacity: .9;
}
/* -------------- States -------------- */
.button:hover {
background-color: hsl(0, 0%, 83%);
}
.button:active {
background-image: -webkit-gradient(radial, 50% 0, 100, 50% 0, 0, from( rgba(255,255,255,0) ), to( rgba(255,255,255,0) )), url(noise.png);
background-image: -moz-gradient(radial, 50% 0, 100, 50% 0, 0, from( rgba(255,255,255,0) ), to( rgba(255,255,255,0) )), url(noise.png);
background-image: gradient(radial, 50% 0, 100, 50% 0, 0, from( rgba(255,255,255,0) ), to( rgba(255,255,255,0) )), url(noise.png);
-webkit-box-shadow: inset rgba(255,255,255,0.6) 0 0.3em .3em, inset rgba(0,0,0,0.2) 0 -0.1em .3em, /* inner shadow */
rgba(0,0,0,0.4) 0 .1em 1px, /* border */
rgba(0,0,0,0.2) 0 .2em 6px; /* drop shadow */
-moz-box-shadow: inset rgba(255,255,255,0.6) 0 0.3em .3em, inset rgba(0,0,0,0.2) 0 -0.1em .3em, /* inner shadow */
rgba(0,0,0,0.4) 0 .1em 1px, /* border */
rgba(0,0,0,0.2) 0 .2em 6px; /* drop shadow */
box-shadow: inset rgba(255,255,255,0.6) 0 0.3em .3em, inset rgba(0,0,0,0.2) 0 -0.1em .3em, /* inner shadow */
rgba(0,0,0,0.4) 0 .1em 1px, /* border */
rgba(0,0,0,0.2) 0 .2em 6px; /* drop shadow */
-webkit-transform: translateY(.2em);
-moz-transform: translateY(.2em);
transform: translateY(.2em);
}
.button:focus {
outline: none;
color: rgba(254,255,255,0.9) !important;
text-shadow: rgba(0,0,0,0.2) 0 1px 2px;
}
.button[disabled], .button[disabled]:hover, .button.disabled, .button.disabled:hover {
opacity: .5;
cursor: default;
color: rgba(0,0,0,0.2) !important;
text-shadow: none !important;
background-color: rgba(0,0,0,0.05);
background-image: none;
border-top: none;
-webkit-box-shadow: inset rgba(255,254,255,0.4) 0 0.3em .3em, inset rgba(0,0,0,0.1) 0 -0.1em .3em, /* inner shadow */
rgba(0,0,0,0.3) 0 .1em 1px, /* border */
rgba(0,0,0,0.2) 0 .2em 6px; /* drop shadow */
-moz-box-shadow: inset rgba(255,254,255,0.4) 0 0.3em .3em, inset rgba(0,0,0,0.1) 0 -0.1em .3em, /* inner shadow */
rgba(0,0,0,0.3) 0 .1em 1px, /* border */
rgba(0,0,0,0.2) 0 .2em 6px; /* drop shadow */
box-shadow: inset rgba(255,254,255,0.4) 0 0.3em .3em, inset rgba(0,0,0,0.1) 0 -0.1em .3em, /* inner shadow */
rgba(0,0,0,0.3) 0 .1em 1px, /* border */
rgba(0,0,0,0.2) 0 .2em 6px; /* drop shadow */
-webkit-transform: translateY(5px);
-moz-transform: translateY(5px);
transform: translateY(5px);
}
/* -------------- Fonts -------------- */
.serif {
font-family: 'Lobster', serif;
font-weight: normal;
}
/* -------------- Sizes -------------- */
.xs { font-size: 16px; }
.xl { font-size: 32px; }
/* -------------- Materials -------------- */
.button.glossy:after, .button.glass:after {
content: "";
position: absolute;
width: 90%;
height: 60%;
top: 0;
left: 5%;
-webkit-border-radius: .5em .5em 1em 1em / .5em .5em 2em 2em;
-moz-border-radius: .5em .5em 1em 1em / .5em .5em 2em 2em;
border-radius: .5em .5em 1em 1em / .5em .5em 2em 2em;
background-image: -webkit-gradient(linear, 0% 0, 100% 0, from( rgba(255,255,255,.55) ), to( rgba(255,255,255,.5) ),
color-stop(.5, rgba(255,255,255,0)), color-stop(.8, rgba(255,255,255,0)) );
background-image: -moz-linear-gradient(left, rgba(255,255,255,.55), rgba(255,255,255,0) 50%, rgba(255,255,255,0) 80%, rgba(255,255,255,.5) );
background-image: gradient(linear, 0% 0, 100% 0, from( rgba(255,255,255,.55) ), to( rgba(255,255,255,.5) ),
color-stop(.5, rgba(255,255,255,0)), color-stop(.8, rgba(255,255,255,0)) );
}
.button.glossy:active:after,
.button.glass:active:after,
.button.disabled:after,
.button[disabled]:after
{ opacity: .6; }
.button.icon.glossy:after,
.button.icon.glass:after { height: 75% ; }
/* -------------- Glass + Transparent -------------- */
.button.glass {
text-shadow: rgba(255,255,255,.5) 0 -1px 0, rgba(0,0,0,0.18) 0 .18em .15em;
}
.button.glass:active {
text-shadow: rgba(255,255,255,.3) 0 1px 0, rgba(0,0,0,0.15) 0 .18em .15em;
}
/* -------------- Shapes -------------- */
/* round */
.round, .round.glossy:after, .round.glass:after {
border-top: none;
-webkit-border-radius: 1em;
-moz-border-radius: 1em;
border-radius: 1em;
}
/* oval */
.oval {
border-top: none;
padding-left: .8em;
padding-right: .8em;
-webkit-border-radius: 5em / 2em;
-moz-border-radius: 5em / 2em;
border-radius: 5em / 2em;
}
.oval.glossy:after, .oval.glass:after {
top: 5%;
-webkit-border-radius: 5em / 2em 2em 1em 1em;
-moz-border-radius: 5em / 2em 2em 1em 1em;
border-radius: 5em / 2em 2em 1em 1em;
}
.oval.icon {
padding-left: .8em;
padding-right: .8em;
-webkit-border-radius: 1.5em / 1em;
-moz-border-radius: 1.5em / 1em;
border-radius: 1.5em / 1em;
}
.oval.icon.glossy:after, .oval.icon.glass:after {
-webkit-border-radius: 1.5em / 1em;
-moz-border-radius: 1.5em / 1em;
border-radius: 1.5em / 1em;
}
/* brackets */
.brackets, .brackets.glossy:after, .brackets.glass:after {
border-top: none;
-webkit-border-radius: .5em / 1em;
-moz-border-radius: .5em / 1em;
border-radius: .5em / 1em;
}
/* skew */
.skew {
border-top: none;
padding-right: 1.2em;
padding-left: 0.8em;
-webkit-border-radius: 5em 1em / 5em 1em;
-moz-border-radius: 5em 1em / 5em 1em;
border-radius: 5em 1em / 5em 1em;
}
.skew.glossy:after, .skew.glass:after {
left: 10%;
-webkit-border-radius: 7em 1em / 5em 1em;
-moz-border-radius: 7em 1em / 5em 1em;
border-radius: 7em 1em / 5em 1em;
}
.skew.icon {
padding-right: .9em;
padding-left: .8em;
}
/* back */
.back, .back.glossy:after, .back.glass:after {
border-top-color: rgba(255,255,255,0.5);
-webkit-border-radius: 1.6em 1.6em 1em 1em / 4em 4em 1em 1em;
-moz-border-radius: 1.6em 1.6em 1em 1em / 4em 4em 1em 1em;
border-radius: 1.6em 1.6em 1em 1em / 4em 4em 1em 1em;
}
.back.glossy:after, .back.glass:after {
left: 6%;
width: 88%;
}
/* knife */
.knife {
padding-left: 1.5em;
-webkit-border-radius: .2em .5em .5em 8em / .2em .5em .5em 5em;
-moz-border-radius: .2em .5em .5em 8em / .2em .5em .5em 5em;
border-radius: .2em .5em .5em 8em / .2em .5em .5em 5em;
}
.knife.glossy:after, .knife.glass:after {
left: 3%;
width: 97%;
-webkit-border-radius: .1em .5em .5em 8em / .1em .5em .5em 2em;
-moz-border-radius: .1em .5em .5em 8em / .1em .5em .5em 2em;
border-radius: .1em .5em .5em 8em / .1em .5em .5em 2em;
}
.knife.glossy.icon:after, .knife.glass.icon:after {
left: 5%;
width: 95%;
-webkit-border-radius: .5em .5em 1em 6em / .5em .5em 1em 4em;
-moz-border-radius: .5em .5em 1em 6em / .5em .5em 1em 4em;
border-radius: .5em .5em 1em 6em / .5em .5em 1em 4em;
}
/* shield */
.shield, .shield.glossy:after, .shield.glass:after {
-webkit-border-radius: .4em .4em 2em 2em / .4em .4em 3em 3em;
-moz-border-radius: .4em .4em 2em 2em / .4em .4em 3em 3em;
border-radius: .4em .4em 2em 2em / .4em .4em 3em 3em;
}
.shield {
padding-left: .8em;
padding-right: .8em;
}
.shield.icon {
padding-left: .6em;
padding-right: .6em;
}
/* drop */
.drop {
border-top: none;
-webkit-border-radius: 2em 5em 2em .6em / 2em 4em 2em .6em;
-moz-border-radius: 2em 5em 2em .6em / 2em 4em 2em .6em;
border-radius: 2em 5em 2em .6em / 2em 4em 2em .6em;
}
.drop.glossy:after, .drop.glass:after {
left: 4%;
-webkit-border-radius: 2em 6em 2em 1em / 2em 4em 2em 2em;
-moz-border-radius: 2em 6em 2em 1em / 2em 4em 2em 2em;
border-radius: 2em 6em 2em 1em / 2em 4em 2em 2em;
}
.drop.icon {
padding-right: .6em;
}
/* morph */
.morph {
border-top: none;
-webkit-border-radius: 5em / 2em;
-moz-border-radius: 5em / 2em;
border-radius: 5em / 2em;
-webkit-transition: -webkit-border-radius .3s ease-in-out;
-moz-transition: -moz-border-radius .3s ease-in-out;
transition: -moz-border-radius .3s ease-in-out;
}
.morph:hover {
-webkit-border-radius: .4em .4em 2em 2em / .4em .4em 3em 3em;
-moz-border-radius: .4em .4em 2em 2em / .4em .4em 3em 3em;
border-radius: .4em .4em 2em 2em / .4em .4em 3em 3em;
}
.morph:active {
-webkit-border-radius: .3em;
-moz-border-radius: .3em;
border-radius: .3em;
}
.morph:after {
display: none;
}
/* Some ugly hacks for FF.
Thanks to David Hund for some help - http://valuedstandards.com/static/test/buttons/ */
@-moz-document url-prefix() {
.button { text-align: center; }
.icon { padding: .5em 1em; }
.icon:before { margin-left: -.42em; float: left; }
.social.icon:before { margin-left: -.22em; }
.drop.icon { padding-right: 1.1em; }
.shield.icon { padding-left: 1.1em; padding-right: 1.1em; }
.skew.icon { padding-right: 1.4em; padding-left: 1.3em; }
.oval.icon { padding-left: 1.3em; padding-right: 1.3em; }
.knife { padding-left: 2em; }
}
/* Damn, this became a fat baby.. */

24
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/cleannavbar.php

@ -1,24 +0,0 @@ @@ -1,24 +0,0 @@
<div class="navbar-wrapper">
<div class="container">
<div class="navbar navbar-default navbar-static-top" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="./index.html">ossoc</a>
</div>
<div class="collapse navbar-collapse">
<ul class="nav navbar-nav navbar-right">
<button id="loginbutton" type="button" class="btn btn-primary narbar-btn"><i class="glyphicon glyphicon-log-in"></i>Login</button>
<button type="button" class="btn btn-success navbar-btn"><i class="glyphicon glyphicon-link"></i><a href="./register.jsp">Create account</a></button>
</ul>
</div>
</div>
</div>
</div>
</div>

124
d-mediawiki/charlesreid1-config/mediawiki/skins/Bootstrap2/cmr-bootstrap-cyborg-wiki.css vendored

@ -1,124 +0,0 @@ @@ -1,124 +0,0 @@
blockquote#quote {
margin-top: 30px;
margin-bottom: 30px;
}
@font-face
{
font-family: 'GenBasI';
src: url('/css/font/GenBasI.ttf');
}
blockquote#quote p {
/*
font-family: "HelveticaNeue Light","Helvetica Neue Light","Helvetica Neue","Helvetica";
*/
font-family: 'GenBasI';
font-weight: 100;
font-size: 20px;
line-height: 150%;
}
img {
/*background-color: #fff;*/
padding: 5px;
}
img.tex {
background-color: #ddd;
}
body.mediawiki {
padding-top: 0px;
}
@media (min-width: 981px) {
/*
body.mediawiki {
padding-top: 100px;
}
*/
}
div.wikilink_btn a {
color: #fff;
font-weight: bold;
font-size: 20px;
}
.wikitable th,.wikitable td {
border-top:1px solid #222; background: transparent;
}
.wikitable th,.wikitable td{border-top:1px solid #222;}
.wikitable tbody tr:hover th,.wikitable tbody tr:hover td{background-color:#444;}
.wikitable tbody tr:hover td,.table tbody tr:hover th{background-color:#444;}
.wikitable,.well,.prettyprint,input,textarea,select{-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;}
.wikitable{width:100%;margin-bottom:18px;}.wikitable th,.wikitable td{padding:8px;line-height:18px;text-align:left;vertical-align:top;border-top:1px solid #dddddd;}
.wikitable th{font-weight:bold;}
.wikitable thead th{vertical-align:bottom;}
.wikitable caption+thead tr:first-child th,.wikitable caption+thead tr:first-child td,.wikitable colgroup+thead tr:first-child th,.wikitable colgroup+thead tr:first-child td,.wikitable thead:first-child tr:first-child th,.wikitable thead:first-child tr:first-child td{border-top:0;}
.wikitable tbody+tbody{border-top:2px solid #dddddd;}
.wikitable tbody tr:hover th,.wikitable tbody tr:hover td{background-color:#333;}
.wikitable{width:100%;margin-bottom:18px;}.wikitable th,.wikitable td{padding:8px;line-height:18px;text-align:left;vertical-align:top;border-top:1px solid #dddddd;}
.wikitable th{font-weight:bold;}
.wikitable thead th{vertical-align:bottom;}
.wikitable caption+thead tr:first-child th,.wikitable caption+thead tr:first-child td,.wikitable colgroup+thead tr:first-child th,.wikitable colgroup+thead tr:first-child td,.wikitable thead:first-child tr:first-child th,.wikitable thead:first-child tr:first-child td{border-top:0;}
.wikitable tbody+tbody{border-top:2px solid #dddddd;}
table.wikitable, table.wikitable th {
background: none repeat scroll 0 0 #222;
}
/*
ul, div {
font-size: 18px;
}
*/
div#mw-normal-catlinks {
font-size: 14px;
margin-top: 20px;
margin-bottom: 20px;
}
table, table.navbox,
table ul li, table.navbox ul li,
table ul, table.navbox ul,
table p, table.navbox p,
table a, table.navbox a {
font-size: 14px;
}
h1, h2, h3, h4, h5 {
padding-top: 20px;
}
div.mw-geshi {
font-size: 14px;
}
pre {
font-size: 14px;
}
div.mainarticle {
font-size: 18px;
}
a:visited {
/*
unvisited link color:
color: #33b5e5;
*/
/*
visited link color:
http://www.w3schools.com/tags/ref_colorpicker.asp
*/
color: #2E8AE6;
}
#toc, .toc,
#catlinks, .catlinks {
background-color: #333;
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save