Initial import
This commit is contained in:
commit
55bbe8aaa2
15 changed files with 864 additions and 0 deletions
7
.gitignore
vendored
Normal file
7
.gitignore
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
\.vagrant
|
||||||
|
node_modules
|
||||||
|
_inspiration/
|
||||||
|
*.pdf
|
||||||
|
*.epub
|
||||||
|
*.docx
|
||||||
|
/site
|
39
Makefile
Normal file
39
Makefile
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
|
||||||
|
all: help
|
||||||
|
|
||||||
|
prepare:
|
||||||
|
pipenv install
|
||||||
|
|
||||||
|
watch: ## run development server
|
||||||
|
pipenv run honcho start
|
||||||
|
|
||||||
|
watch-mkdocs:
|
||||||
|
pipenv run mkdocs serve --dev-addr 0.0.0.0:5001
|
||||||
|
|
||||||
|
serve: watch
|
||||||
|
|
||||||
|
tocupdate:
|
||||||
|
while inotifywait -q -e move -e modify -e create -e attrib -e delete -r docs ; do \
|
||||||
|
sleep 1 ; \
|
||||||
|
pipenv run ./scripts/update-toc ; \
|
||||||
|
done
|
||||||
|
|
||||||
|
build:## build static pages
|
||||||
|
pipenv run mkdocs build
|
||||||
|
|
||||||
|
install: ## deploy static pages to github
|
||||||
|
git push
|
||||||
|
pipenv run mkdocs gh-deploy
|
||||||
|
|
||||||
|
help: ## print this help
|
||||||
|
@echo "Usage: make <target>"
|
||||||
|
@echo ""
|
||||||
|
@echo "With one of following targets:"
|
||||||
|
@echo ""
|
||||||
|
@awk 'BEGIN {FS = ":.*?## "} \
|
||||||
|
/^[a-zA-Z_-]+:.*?## / \
|
||||||
|
{ sub("\\\\n",sprintf("\n%22c"," "), $$2); \
|
||||||
|
printf("\033[36m%-20s\033[0m %s\n", $$1, $$2); \
|
||||||
|
}' $(MAKEFILE_LIST)
|
||||||
|
@echo ""
|
||||||
|
|
16
Pipfile
Normal file
16
Pipfile
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
[[source]]
|
||||||
|
name = "pypi"
|
||||||
|
url = "https://pypi.org/simple"
|
||||||
|
verify_ssl = true
|
||||||
|
|
||||||
|
[dev-packages]
|
||||||
|
|
||||||
|
[packages]
|
||||||
|
mkdocs = "*"
|
||||||
|
mkdocs-material = "*"
|
||||||
|
mdx-truly-sane-lists = "*"
|
||||||
|
pymdown-extensions = "*"
|
||||||
|
honcho = "*"
|
||||||
|
|
||||||
|
[requires]
|
||||||
|
python_version = "3.7"
|
193
Pipfile.lock
generated
Normal file
193
Pipfile.lock
generated
Normal file
|
@ -0,0 +1,193 @@
|
||||||
|
{
|
||||||
|
"_meta": {
|
||||||
|
"hash": {
|
||||||
|
"sha256": "911097b967666f1a9771368e2f9bcd8868d417976b12d90ffdfc27ba6f3ae65e"
|
||||||
|
},
|
||||||
|
"pipfile-spec": 6,
|
||||||
|
"requires": {
|
||||||
|
"python_version": "3.7"
|
||||||
|
},
|
||||||
|
"sources": [
|
||||||
|
{
|
||||||
|
"name": "pypi",
|
||||||
|
"url": "https://pypi.org/simple",
|
||||||
|
"verify_ssl": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"default": {
|
||||||
|
"click": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:8a18b4ea89d8820c5d0c7da8a64b2c324b4dabb695804dbfea19b9be9d88c0cc",
|
||||||
|
"sha256:e345d143d80bf5ee7534056164e5e112ea5e22716bbb1ce727941f4c8b471b9a"
|
||||||
|
],
|
||||||
|
"version": "==7.1.1"
|
||||||
|
},
|
||||||
|
"future": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"
|
||||||
|
],
|
||||||
|
"version": "==0.18.2"
|
||||||
|
},
|
||||||
|
"honcho": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:af5806bf13e3b20acdcb9ff8c0beb91eee6fe07393c3448dfad89667e6ac7576",
|
||||||
|
"sha256:c189402ad2e337777283c6a12d0f4f61dc6dd20c254c9a3a4af5087fc66cea6e"
|
||||||
|
],
|
||||||
|
"index": "pypi",
|
||||||
|
"version": "==1.0.1"
|
||||||
|
},
|
||||||
|
"jinja2": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:93187ffbc7808079673ef52771baa950426fd664d3aad1d0fa3e95644360e250",
|
||||||
|
"sha256:b0eaf100007721b5c16c1fc1eecb87409464edc10469ddc9a22a27a99123be49"
|
||||||
|
],
|
||||||
|
"version": "==2.11.1"
|
||||||
|
},
|
||||||
|
"livereload": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:78d55f2c268a8823ba499305dcac64e28ddeb9a92571e12d543cd304faf5817b",
|
||||||
|
"sha256:89254f78d7529d7ea0a3417d224c34287ebfe266b05e67e51facaf82c27f0f66"
|
||||||
|
],
|
||||||
|
"version": "==2.6.1"
|
||||||
|
},
|
||||||
|
"lunr": {
|
||||||
|
"extras": [
|
||||||
|
"languages"
|
||||||
|
],
|
||||||
|
"hashes": [
|
||||||
|
"sha256:1208622930c915a07e6f8e8640474357826bad48534c0f57969b6fca9bffc88e",
|
||||||
|
"sha256:7be69d7186f65784a4f2adf81e5c58efd6a9921aa95966babcb1f2f2ada75c20"
|
||||||
|
],
|
||||||
|
"version": "==0.5.6"
|
||||||
|
},
|
||||||
|
"markdown": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:90fee683eeabe1a92e149f7ba74e5ccdc81cd397bd6c516d93a8da0ef90b6902",
|
||||||
|
"sha256:e4795399163109457d4c5af2183fbe6b60326c17cfdf25ce6e7474c6624f725d"
|
||||||
|
],
|
||||||
|
"version": "==3.2.1"
|
||||||
|
},
|
||||||
|
"markupsafe": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473",
|
||||||
|
"sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161",
|
||||||
|
"sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235",
|
||||||
|
"sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5",
|
||||||
|
"sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42",
|
||||||
|
"sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff",
|
||||||
|
"sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b",
|
||||||
|
"sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1",
|
||||||
|
"sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e",
|
||||||
|
"sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183",
|
||||||
|
"sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66",
|
||||||
|
"sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b",
|
||||||
|
"sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1",
|
||||||
|
"sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15",
|
||||||
|
"sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1",
|
||||||
|
"sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e",
|
||||||
|
"sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b",
|
||||||
|
"sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905",
|
||||||
|
"sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735",
|
||||||
|
"sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d",
|
||||||
|
"sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e",
|
||||||
|
"sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d",
|
||||||
|
"sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c",
|
||||||
|
"sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21",
|
||||||
|
"sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2",
|
||||||
|
"sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5",
|
||||||
|
"sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b",
|
||||||
|
"sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6",
|
||||||
|
"sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f",
|
||||||
|
"sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f",
|
||||||
|
"sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2",
|
||||||
|
"sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7",
|
||||||
|
"sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"
|
||||||
|
],
|
||||||
|
"version": "==1.1.1"
|
||||||
|
},
|
||||||
|
"mdx-truly-sane-lists": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:4600ade0fbd452db8233e25d644b62f59b2798e40595ea2e1923e29bc40c5b98",
|
||||||
|
"sha256:cc8bfa00f331403504e12377a9c94e6b40fc7db031e283316baeeeeac68f1da9"
|
||||||
|
],
|
||||||
|
"index": "pypi",
|
||||||
|
"version": "==1.2"
|
||||||
|
},
|
||||||
|
"mkdocs": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:1e385a70aea8a9dedb731aea4fd5f3704b2074801c4f96f06b2920999babda8a",
|
||||||
|
"sha256:9243291392f59e20b655e4e46210233453faf97787c2cf72176510e868143174"
|
||||||
|
],
|
||||||
|
"index": "pypi",
|
||||||
|
"version": "==1.1"
|
||||||
|
},
|
||||||
|
"mkdocs-material": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:0a3ef09776d8160a1de322065d68cc05672ac47052733665fa405e8c8f263115",
|
||||||
|
"sha256:a16b7dbb2704fc911d9705881a66dba15136e1b8c2b818ba08faabfd60192155"
|
||||||
|
],
|
||||||
|
"index": "pypi",
|
||||||
|
"version": "==5.0.1"
|
||||||
|
},
|
||||||
|
"nltk": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:bed45551259aa2101381bbdd5df37d44ca2669c5c3dad72439fa459b29137d94"
|
||||||
|
],
|
||||||
|
"version": "==3.4.5"
|
||||||
|
},
|
||||||
|
"pygments": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44",
|
||||||
|
"sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324"
|
||||||
|
],
|
||||||
|
"version": "==2.6.1"
|
||||||
|
},
|
||||||
|
"pymdown-extensions": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:71cbc748789959d4b964fe8dc038f5436779d244399fd5ba3a0bbfe9a0e43b1f",
|
||||||
|
"sha256:d27a8bc8bb7ecac589e832465dbefe24d7fedd9792636c6d0ac521e5045bedc0"
|
||||||
|
],
|
||||||
|
"index": "pypi",
|
||||||
|
"version": "==7.0"
|
||||||
|
},
|
||||||
|
"pyyaml": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97",
|
||||||
|
"sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76",
|
||||||
|
"sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2",
|
||||||
|
"sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648",
|
||||||
|
"sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf",
|
||||||
|
"sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f",
|
||||||
|
"sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2",
|
||||||
|
"sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee",
|
||||||
|
"sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d",
|
||||||
|
"sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c",
|
||||||
|
"sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"
|
||||||
|
],
|
||||||
|
"version": "==5.3.1"
|
||||||
|
},
|
||||||
|
"six": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a",
|
||||||
|
"sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c"
|
||||||
|
],
|
||||||
|
"version": "==1.14.0"
|
||||||
|
},
|
||||||
|
"tornado": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:0fe2d45ba43b00a41cd73f8be321a44936dc1aba233dee979f17a042b83eb6dc",
|
||||||
|
"sha256:22aed82c2ea340c3771e3babc5ef220272f6fd06b5108a53b4976d0d722bcd52",
|
||||||
|
"sha256:2c027eb2a393d964b22b5c154d1a23a5f8727db6fda837118a776b29e2b8ebc6",
|
||||||
|
"sha256:5217e601700f24e966ddab689f90b7ea4bd91ff3357c3600fa1045e26d68e55d",
|
||||||
|
"sha256:5618f72e947533832cbc3dec54e1dffc1747a5cb17d1fd91577ed14fa0dc081b",
|
||||||
|
"sha256:5f6a07e62e799be5d2330e68d808c8ac41d4a259b9cea61da4101b83cb5dc673",
|
||||||
|
"sha256:c58d56003daf1b616336781b26d184023ea4af13ae143d9dda65e31e534940b9",
|
||||||
|
"sha256:c952975c8ba74f546ae6de2e226ab3cc3cc11ae47baf607459a6728585bb542a",
|
||||||
|
"sha256:c98232a3ac391f5faea6821b53db8db461157baa788f5d6222a193e9456e1740"
|
||||||
|
],
|
||||||
|
"version": "==6.0.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"develop": {}
|
||||||
|
}
|
2
Procfile
Normal file
2
Procfile
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
web: make watch-mkdocs
|
||||||
|
toc: make tocupdate
|
3
Procfile.watch
Normal file
3
Procfile.watch
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
mkdocs: make watch-mkdocs
|
||||||
|
slides: make watch-slides
|
||||||
|
toc: make tocupdate
|
0
QUESTIONS.md
Normal file
0
QUESTIONS.md
Normal file
42
REFERENCES.md
Normal file
42
REFERENCES.md
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
|
||||||
|
# Kubernetes
|
||||||
|
|
||||||
|
|
||||||
|
## Beginner guides & bootcamps
|
||||||
|
|
||||||
|
|
||||||
|
## Books
|
||||||
|
|
||||||
|
|
||||||
|
## Beginner courses
|
||||||
|
|
||||||
|
|
||||||
|
## Advanced courses
|
||||||
|
|
||||||
|
|
||||||
|
## Focused Articles
|
||||||
|
|
||||||
|
## Cheat Sheet
|
||||||
|
|
||||||
|
## Awesome
|
||||||
|
|
||||||
|
## Free Courses
|
||||||
|
|
||||||
|
## Unsorted Courses
|
||||||
|
|
||||||
|
## Docker?
|
||||||
|
|
||||||
|
## Workshops / Full tutorials
|
||||||
|
|
||||||
|
## Interview questions
|
||||||
|
|
||||||
|
## Video
|
||||||
|
|
||||||
|
## Outils tiers
|
||||||
|
|
||||||
|
## Tags / Topics
|
||||||
|
|
||||||
|
## Infrastructures / test
|
||||||
|
|
||||||
|
## Question
|
||||||
|
|
0
docs/index.md
Normal file
0
docs/index.md
Normal file
181
mkdocs.yml
Normal file
181
mkdocs.yml
Normal file
|
@ -0,0 +1,181 @@
|
||||||
|
site_name: Kubernetes
|
||||||
|
|
||||||
|
# theme_dir: 'themes/mkdocs-material/material'
|
||||||
|
# theme_dir: 'themes/mkdocs-material'
|
||||||
|
|
||||||
|
site_author: 'Glenn Y. Rolland'
|
||||||
|
site_url: 'http://glenux.github.io/teaching-devops-kubernetes'
|
||||||
|
|
||||||
|
# copyright: 'Copyright (c) 2016 El Gadjo Ridículo'
|
||||||
|
|
||||||
|
repo_name: 'GitHub'
|
||||||
|
repo_url: 'https://github.com/glenux/teaching-devops-kubernetes'
|
||||||
|
# site_favicon: 'favicon.ico'
|
||||||
|
|
||||||
|
theme:
|
||||||
|
language: fr
|
||||||
|
# name: 'gitbook'
|
||||||
|
# name: 'alabaster'
|
||||||
|
# name: 'windmill'
|
||||||
|
# name: 'ivory'
|
||||||
|
name: 'material'
|
||||||
|
palette:
|
||||||
|
primary: 'white'
|
||||||
|
accent: 'black'
|
||||||
|
neutral: 'black'
|
||||||
|
feature:
|
||||||
|
tabs: false
|
||||||
|
|
||||||
|
i18n:
|
||||||
|
prev: 'Chapitre précédent'
|
||||||
|
next: 'Chapitre suivant'
|
||||||
|
|
||||||
|
extra_css:
|
||||||
|
- css/extra.css
|
||||||
|
|
||||||
|
extra_javascript:
|
||||||
|
- js/extra.js
|
||||||
|
|
||||||
|
#author:
|
||||||
|
# github: 'elgadjo'
|
||||||
|
# twitter: 'elgadjo'
|
||||||
|
|
||||||
|
# Extensions
|
||||||
|
markdown_extensions:
|
||||||
|
- footnotes
|
||||||
|
- admonition
|
||||||
|
- toc:
|
||||||
|
permalink: '#'
|
||||||
|
- codehilite:
|
||||||
|
guess_lang: false
|
||||||
|
- mdx_truly_sane_lists # pip install mdx_truly_sane_lists
|
||||||
|
- pymdownx.emoji: # pip install pymdown-extensions
|
||||||
|
emoji_generator: !!python/name:pymdownx.emoji.to_svg
|
||||||
|
- pymdownx.superfences: # pip install pymdown-extensions
|
||||||
|
|
||||||
|
extra:
|
||||||
|
search:
|
||||||
|
language: 'fr, en'
|
||||||
|
|
||||||
|
# run the following line to update toc
|
||||||
|
# pipenv run ./script/update-toc
|
||||||
|
|
||||||
|
# BEGIN MKDOCS-TOC
|
||||||
|
nav:
|
||||||
|
- "Préambule":
|
||||||
|
- 000-attic-preambule/010-histoire.md
|
||||||
|
- 000-attic-preambule/020-rappels-docker.md
|
||||||
|
- 000-attic-preambule/030-limites-docker.md
|
||||||
|
- "Rappels sur Docker":
|
||||||
|
- 000-attic-using-docker/010-dockerfile.md
|
||||||
|
- 000-attic-using-docker/020-build.md
|
||||||
|
- 000-attic-using-docker/030-run.md
|
||||||
|
- 000-attic-using-docker/040-registry.md
|
||||||
|
- "Introduction":
|
||||||
|
- 010-about-kubernetes/010-kubernetes.md
|
||||||
|
- 010-about-kubernetes/010-privitives-concepts.md
|
||||||
|
- 010-about-kubernetes/020-yaml-syntax.md
|
||||||
|
- 010-about-kubernetes/030-cli.md
|
||||||
|
- "Installation":
|
||||||
|
- 020-installing/020-local-minikube.md
|
||||||
|
- 020-installing/030-local-kind.md
|
||||||
|
- 020-installing/035-local-docker-client.md
|
||||||
|
- 020-installing/040-baremetal-kubeadm.md
|
||||||
|
- 020-installing/050-baremetal-rancher.md
|
||||||
|
- 020-installing/060-baremetal-openshift.md
|
||||||
|
- 020-installing/070-baremetal-k3s.md
|
||||||
|
- 020-installing/080-cloud-gcp.md
|
||||||
|
- 020-installing/090-kubectl.md
|
||||||
|
- "Premiers pas":
|
||||||
|
- 030-first-steps/005-verif-config.md
|
||||||
|
- 030-first-steps/007-first-steps.md
|
||||||
|
- 030-first-steps/015-namespace.md
|
||||||
|
- 030-first-steps/017-nodes.md
|
||||||
|
- 030-first-steps/020-pods.md
|
||||||
|
- 030-first-steps/030-services.md
|
||||||
|
- 030-first-steps/040-archi.md
|
||||||
|
- "Les bases":
|
||||||
|
- 050-basics/010-scalability.md
|
||||||
|
- 050-basics/020-deployment.md
|
||||||
|
- 050-basics/050-volumes.md
|
||||||
|
- 050-basics/060-autoscaling.md
|
||||||
|
- 050-basics/080-readiness.md
|
||||||
|
- 050-basics/090-events.md
|
||||||
|
- 050-basics/basics-deployments.md
|
||||||
|
- 050-basics/basics-healthchecks.md
|
||||||
|
- 050-basics/basics-labels.md
|
||||||
|
- 050-basics/basics-node-architecture.md
|
||||||
|
- 050-basics/basics-pods-state-lifecycle.md
|
||||||
|
- 050-basics/basics-readiness.md
|
||||||
|
- 050-basics/basics-scaling-pods.md
|
||||||
|
- 050-basics/basics-secrets.md
|
||||||
|
- 050-basics/basics-services.md
|
||||||
|
- 050-basics/basics-webui.md
|
||||||
|
- "Gestion des resources":
|
||||||
|
- 060-resources/060-requests-limits.md
|
||||||
|
- 060-resources/070-quotas.md
|
||||||
|
- "Secrets":
|
||||||
|
- 080-secrets/010-intro.md
|
||||||
|
- 080-secrets/020-configmap.md
|
||||||
|
- 080-secrets/030-secrets.md
|
||||||
|
- 080-secrets/040-security.md
|
||||||
|
- "Ingress & Egress":
|
||||||
|
- 090-ingress-egress/010-ingress.md
|
||||||
|
- 090-ingress-egress/020-egress.md
|
||||||
|
- "Packages et extensions":
|
||||||
|
- 100-packaging/010-helm.md
|
||||||
|
- 100-packaging/020-creating-helm-chars.md
|
||||||
|
- 100-packaging/030-help-repository.md
|
||||||
|
- 100-packaging/040-building-deploying.md
|
||||||
|
- 100-packaging/050-fission.md
|
||||||
|
- "Monitoring":
|
||||||
|
- 800-monitoring/010-dashboard.md
|
||||||
|
- 800-monitoring/020-prometheus.md
|
||||||
|
- 800-monitoring/030-logs.md
|
||||||
|
- "Bonnes pratiques":
|
||||||
|
- 900-good-practices/010-arbo.md
|
||||||
|
- 900-good-practices/020-ci-cd.md
|
||||||
|
- 900-good-practices/025-development.md
|
||||||
|
- 900-good-practices/030-score.md
|
||||||
|
- 900-good-practices/040-troubleshooting.md
|
||||||
|
- 900-good-practices/060-other-tools.md
|
||||||
|
- 900-good-practices/090-pdb.md
|
||||||
|
- "999-3rd-party":
|
||||||
|
- 999-3rd-party/introduction-to-orchestration.md
|
||||||
|
- "999-other":
|
||||||
|
- 999-other/admin-high-availability.md
|
||||||
|
- 999-other/admin-master-services.md
|
||||||
|
- 999-other/admin-namespaces.md
|
||||||
|
- 999-other/admin-networking.md
|
||||||
|
- 999-other/admin-node-maintenance.md
|
||||||
|
- 999-other/admin-quotas-limits.md
|
||||||
|
- 999-other/admin-rbac.md
|
||||||
|
- 999-other/admin-tls-on-elb.md
|
||||||
|
- 999-other/admin-user-management.md
|
||||||
|
- 999-other/adv-auto-discovery.md
|
||||||
|
- 999-other/adv-autoscaling.md
|
||||||
|
- 999-other/adv-configmap.md
|
||||||
|
- 999-other/adv-daemon-sets.md
|
||||||
|
- 999-other/adv-ext-dns.md
|
||||||
|
- 999-other/adv-ingress.md
|
||||||
|
- 999-other/adv-interpod-anti-affinity.md
|
||||||
|
- 999-other/adv-monitoring.md
|
||||||
|
- 999-other/adv-node-affinity.md
|
||||||
|
- 999-other/adv-operators.md
|
||||||
|
- 999-other/adv-pod-presets.md
|
||||||
|
- 999-other/adv-stateful-sets.md
|
||||||
|
- 999-other/adv-taints-tolerations.md
|
||||||
|
- 999-other/adv-volumes.md
|
||||||
|
- 999-other/extra-kubeadm.md
|
||||||
|
- 999-other/extra-tls-cert-manager.md
|
||||||
|
- 999-other/intro-build-container-image.md
|
||||||
|
- 999-other/intro-build-container.md
|
||||||
|
- 999-other/intro-cluster-setup.md
|
||||||
|
- 999-other/intro-run-first-app.md
|
||||||
|
- 999-other/kops.md
|
||||||
|
- 999-other/other.md
|
||||||
|
- 999-other/pimp-k9s.md
|
||||||
|
- 999-other/pimp-tubekit.md
|
||||||
|
# END MKDOCS-TOC
|
||||||
|
|
||||||
|
|
19
package.json
Normal file
19
package.json
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"name": "teaching-framework-nodejs-advanced",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "index.js",
|
||||||
|
"directories": {
|
||||||
|
"doc": "docs"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"@marp-team/marp-cli": "^0.16.2",
|
||||||
|
"foreman": "^3.0.1",
|
||||||
|
"node-sass": "^4.13.0"
|
||||||
|
}
|
||||||
|
}
|
128
scripts/update-toc
Executable file
128
scripts/update-toc
Executable file
|
@ -0,0 +1,128 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import click
|
||||||
|
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import pdb
|
||||||
|
import pprint
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
pp = pprint.PrettyPrinter(indent=4).pprint
|
||||||
|
|
||||||
|
class TocBuilder:
|
||||||
|
def __init__(self, root_path):
|
||||||
|
self.root_path = root_path
|
||||||
|
|
||||||
|
# Helper for titles
|
||||||
|
def __get_title(self, fn):
|
||||||
|
if not os.path.exists(fn):
|
||||||
|
return None
|
||||||
|
f1 = open(fn, "r")
|
||||||
|
for line in f1:
|
||||||
|
m = re.match(r"^#\s(.*)$", line)
|
||||||
|
if m:
|
||||||
|
f1.close()
|
||||||
|
return m.groups()[0]
|
||||||
|
f1.close()
|
||||||
|
return None
|
||||||
|
|
||||||
|
def lookup(self):
|
||||||
|
md_files = []
|
||||||
|
for root, dirs, files in os.walk(self.root_path):
|
||||||
|
for fn in files:
|
||||||
|
# compute absolute and relative path
|
||||||
|
abs_path = os.path.join(root, fn)
|
||||||
|
rel_path = os.path.relpath(abs_path, self.root_path)
|
||||||
|
|
||||||
|
# split name into parts
|
||||||
|
bname = os.path.basename(rel_path)
|
||||||
|
bname_split = os.path.splitext(bname)
|
||||||
|
dname = os.path.dirname(rel_path)
|
||||||
|
|
||||||
|
# skip files in docs/ root
|
||||||
|
if dname == "":
|
||||||
|
continue
|
||||||
|
|
||||||
|
# skip index files
|
||||||
|
if bname_split[0] == 'index':
|
||||||
|
continue
|
||||||
|
|
||||||
|
# keep only .md files
|
||||||
|
if bname_split[1] == '.md':
|
||||||
|
md_files.append(rel_path)
|
||||||
|
return md_files
|
||||||
|
|
||||||
|
def format(self, md_files):
|
||||||
|
lines = ["nav:"]
|
||||||
|
lastdir=""
|
||||||
|
for f in sorted(md_files):
|
||||||
|
bname = os.path.basename(f)
|
||||||
|
bname_split = os.path.splitext(bname)
|
||||||
|
dname = os.path.dirname(f)
|
||||||
|
|
||||||
|
if lastdir != dname:
|
||||||
|
lastdir = dname
|
||||||
|
title = self.__get_title(os.path.join(self.root_path, dname, 'index.md'))
|
||||||
|
if title is not None:
|
||||||
|
lines.append(" - \"%s\":" % title)
|
||||||
|
else:
|
||||||
|
lines.append(" - \"%s\":" % dname)
|
||||||
|
|
||||||
|
lines.append(" - %s" % f)
|
||||||
|
return lines
|
||||||
|
|
||||||
|
class FileInjector:
|
||||||
|
def __init__(self, delimiter):
|
||||||
|
self.delimiter = delimiter
|
||||||
|
|
||||||
|
def inject(self, filename, lines):
|
||||||
|
suffix = '~update_toc'
|
||||||
|
src_fh = open(filename, 'r')
|
||||||
|
dst_fh = open(filename + suffix, 'w')
|
||||||
|
|
||||||
|
inject_mode = False
|
||||||
|
end_pattern = r"^#\s+END {0}\s*$".format(self.delimiter)
|
||||||
|
begin_pattern = r"^#\s+BEGIN {0}\s*$".format(self.delimiter)
|
||||||
|
for src_line in src_fh:
|
||||||
|
if (not inject_mode) and re.match(begin_pattern, src_line):
|
||||||
|
# activate inject_mode, write begin pattern and lines
|
||||||
|
inject_mode = True
|
||||||
|
dst_fh.write(src_line)
|
||||||
|
for line in lines:
|
||||||
|
dst_fh.write(line + "\n")
|
||||||
|
|
||||||
|
elif inject_mode and re.match(end_pattern, src_line):
|
||||||
|
# disable inject_mode and write end pattern
|
||||||
|
inject_mode = False
|
||||||
|
dst_fh.write(src_line)
|
||||||
|
elif inject_mode:
|
||||||
|
# skip line if injection mode is active
|
||||||
|
next
|
||||||
|
else:
|
||||||
|
# simple copy if injection mode is NOT active
|
||||||
|
dst_fh.write(src_line)
|
||||||
|
# si la ligne <
|
||||||
|
# FIXME: error if inject_mode is still True
|
||||||
|
src_fh.close()
|
||||||
|
dst_fh.close()
|
||||||
|
os.rename(filename + suffix, filename)
|
||||||
|
|
||||||
|
# build TOC in-memory
|
||||||
|
#
|
||||||
|
# open mkdocs.yml file
|
||||||
|
# save part before
|
||||||
|
|
||||||
|
@click.command()
|
||||||
|
def build():
|
||||||
|
root_path = Path(__file__).parent.parent
|
||||||
|
toc = TocBuilder(str(root_path / 'docs'))
|
||||||
|
md_files = toc.lookup()
|
||||||
|
md_toc = toc.format(md_files)
|
||||||
|
fi = FileInjector('MKDOCS-TOC')
|
||||||
|
fi.inject(str(root_path / 'mkdocs.yml'), md_toc)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
build()
|
||||||
|
|
BIN
slides/images/0.png
Normal file
BIN
slides/images/0.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 173 KiB |
69
slides/index.md
Normal file
69
slides/index.md
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
# Gestion de projet DATA
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
* De quoi on parle ?
|
||||||
|
|
||||||
|
* C'est quoi les DATA ?
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## L'écosysteme DATA actuel
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Les DATA au sein de votre processus métier
|
||||||
|
|
||||||
|
* Collecte de données et objets connectés
|
||||||
|
|
||||||
|
* Analyse et préparation des données
|
||||||
|
|
||||||
|
* Intelligence Artificielle et Machine Learning
|
||||||
|
|
||||||
|
* Flux de données et actionautomatiques
|
||||||
|
|
||||||
|
## Enjeux, opportunités, coûts et business models
|
||||||
|
|
||||||
|
* Quelle stratégies gagnantes adopter ?
|
||||||
|
|
||||||
|
* Exemples de mise en oeuvre
|
||||||
|
|
||||||
|
## Gestion de la qualité
|
||||||
|
|
||||||
|
* Mise en production
|
||||||
|
|
||||||
|
* Formats, normes et standards
|
||||||
|
|
||||||
|
* Aspects règlementaires (RGPD et données personnelles, etc.)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Collecte de données
|
||||||
|
|
||||||
|
Papier
|
||||||
|
|
||||||
|
Téléphone
|
||||||
|
|
||||||
|
Mesure
|
||||||
|
|
||||||
|
Capteurs
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Préparation des données
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Transformation des données
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Export des données
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Stockage des données
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
##
|
165
slides/intro.md
Normal file
165
slides/intro.md
Normal file
|
@ -0,0 +1,165 @@
|
||||||
|
# Gestion de projet data - Introduction
|
||||||
|
|
||||||
|
## Définition
|
||||||
|
|
||||||
|
* Latin DATUM, DATA | Du latin data (« choses données (au pluriel) »)
|
||||||
|
|
||||||
|
data \da.ta\ féminin
|
||||||
|
(Philosophie) Se dit de faits connus dans le domaine scientifique et servant
|
||||||
|
de
|
||||||
|
départ à des recherches futures. (corrélatif de desiderata)
|
||||||
|
Données.
|
||||||
|
Dans le cadre de l'option à 1,99€/20Mo, la data sera-t-elle décomptée par
|
||||||
|
paliers de 1Mo ? 100Ko ? 20Ko ? 10Ko ? 1Ko ? — (Forum LesMobiles.com)
|
||||||
|
Et si Uber, le premier d’entre eux, y investit (et au sens plein du terme,
|
||||||
|
puisqu’elle se dit prête « à voir ses recettes s’effriter dans un premier
|
||||||
|
temps
|
||||||
|
»), c’est parce que ses data confirment un raccourcissement du trajet moyen
|
||||||
|
des
|
||||||
|
courses réalisées par les chauffeurs. — (Olivier Haralambon , « Un vélo
|
||||||
|
électrique pour tous ? » sur LEquipe.fr. Mis en ligne le 11 septembre 2018)
|
||||||
|
---|---
|
||||||
|
* ce qui est donné
|
||||||
|
* un fait
|
||||||
|
* une information
|
||||||
|
* A quoi sert la data
|
||||||
|
* à des machines
|
||||||
|
* in fine, à d'autres humains
|
||||||
|
|
||||||
|
## Contexte
|
||||||
|
|
||||||
|
* Dans une entreprise capitaliste on veut de la croissance
|
||||||
|
* Vendre plus cher
|
||||||
|
* Vendre plus
|
||||||
|
* Elargir le marché (croissance horizontale)
|
||||||
|
* Mieux cibler sa prospection
|
||||||
|
* connaitre le consommateur
|
||||||
|
* Payer moins cher les ressources
|
||||||
|
* Etre plus efficace / ressource
|
||||||
|
* Produire plus / ressource
|
||||||
|
* Acquérir de nouvelles compétences (croissance verticale)
|
||||||
|
* De plus en plus de projet data
|
||||||
|
* De plus en plus d’entreprises du secteur optent pour des stratégies data-driven et se lancent dans un marathon de projets Data Science et Intelligence artificielle, espérant ainsi profiter des avantages des nouvelles technologies et de la donnée.
|
||||||
|
* Quelle est la meilleure approche pour réussir un projet Data Science ou Intelligence artificielle ?
|
||||||
|
* Quels sont les acteurs nécessaires aux changements ?
|
||||||
|
* Comment se déclinent les différentes étapes de conception et de déploiement de projets dans le temps ?
|
||||||
|
* De plus en plus de demande pour les compétences data
|
||||||
|
* Data scientist
|
||||||
|
* data analyst
|
||||||
|
* data engineer
|
||||||
|
* ...tout le monde peut inclure de l'analyse data dans sa pratique professionnelle.
|
||||||
|
|
||||||
|
## Enjeux de la data et de son analyse
|
||||||
|
|
||||||
|
* Analyse de données
|
||||||
|
* = être capable de collecter, organiser, nettoyer, manipuler, décortiquer, analyser et visualiser des données internes ou externes, qualitatives ou quantitatives, que chaque entreprise a à sa disposition
|
||||||
|
* Nouvelle forme de capital (valeur + levier de pouvoir)
|
||||||
|
* Information
|
||||||
|
* = Valeur
|
||||||
|
* = Influence
|
||||||
|
* = Temps d'avance
|
||||||
|
* Analyse de données
|
||||||
|
* Information... qui produit de l'information
|
||||||
|
* => Levier de pouvoir
|
||||||
|
* => Nouvelle forme de capital
|
||||||
|
|
||||||
|
## Différents types de projets data
|
||||||
|
|
||||||
|
* Les usages sont innombrables.
|
||||||
|
* Objectifs concrets
|
||||||
|
* l’automatisation des processus
|
||||||
|
* l’analyse des insights (soit pour comprendre l’existant, détecter des patterns ou prédire des événements)
|
||||||
|
* l’amélioration du niveau de service et l’engagement vis-à-vis de l’utilisateur final.
|
||||||
|
* Trois grandes classes
|
||||||
|
* 1\. Robotic Process Automation | Le Robotic Process Automation (RPA) est la forme de l’IA la plus facile et la
|
||||||
|
moins coûteuse à mettre en place. En général, elle porte ses fruits à court
|
||||||
|
terme et son ROI est remarquable. Toutefois, malgré la facilité de sa mise en
|
||||||
|
place et ses bénéfices considérables, de nombreuses entreprises ont encore du
|
||||||
|
chemin à faire dans ce domaine.
|
||||||
|
---|---
|
||||||
|
* Le transfert de données et des emails collectés dans divers systèmes d’information pour mettre à jour les bases de données clients ou les opportunités détectées ;
|
||||||
|
* Le rapprochement et contrôle des factures et commandes afin de rendre plus robuste les processus comptables ;
|
||||||
|
* La lecture et analyse des contrats et documents légaux pour extraire des contraintes ou anomalies possibles.
|
||||||
|
* 2\. Analyse de données | La deuxième forme la plus commune et connue de l’IA et de la Data Science est
|
||||||
|
l’analyse de l’information et l’extraction de la valeur depuis un vaste volume
|
||||||
|
de données (Big Data) pour des fins descriptives ou prédictives. Par exemple :
|
||||||
|
|
||||||
|
Les techniques les plus développées de Machine Learning, dites de Deep
|
||||||
|
Learning,
|
||||||
|
permettent de réaliser des fonctions comme la reconnaissance vocale ou d’image
|
||||||
|
ou encore du [Natural Language
|
||||||
|
Processing](https://fr.blog.businessdecision.com/replay-data-science-5-text-
|
||||||
|
mining-nlp/) (NLP).
|
||||||
|
---|---
|
||||||
|
* Faire de la maintenance prédictive sur les chaines d’industrie
|
||||||
|
* Identifier les fraudes possibles dans les systèmes bancaires ou d’assurance ou les systèmes de santé
|
||||||
|
* Automatiser le ciblage clientèle lors des campagnes marketing
|
||||||
|
* Fournir aux assureurs des modèles plus précis sur les potentiels clients
|
||||||
|
* Engagement et prise de décision | La troisième forme consiste à engager l’utilisateur final (employé ou client)
|
||||||
|
dans un processus d’interaction avec la machine afin de récolter de
|
||||||
|
l’information ou de fournir un service.
|
||||||
|
|
||||||
|
La richesse des fonctions que peuvent s’offrir les organisations est très
|
||||||
|
attractive. Toutefois, la mise en place de projets d’Intelligence Artificielle
|
||||||
|
est confrontée à plusieurs obstacles de natures différentes :
|
||||||
|
organisationnelle,
|
||||||
|
financière, technologique ou stratégique.
|
||||||
|
---|---
|
||||||
|
* Les [agents conversationnels](https://fr.blog.businessdecision.com/chatbot-agent-conversationnel-experience-client/) (chatbots) intelligents qui sont sollicités 24/7 et qui couvrent une panoplie de services dépendant du niveau d’apprentissage du robot.
|
||||||
|
* Les [moteurs de recommandation](https://fr.blog.businessdecision.com/moteur-de-recommandation-temps-reel-le-graal-du-marketing-digital/) qui orientent l’utilisateur dans ses choix de services ou produits
|
||||||
|
|
||||||
|
## Limites et enjeux actuels
|
||||||
|
|
||||||
|
* Initiative complexe
|
||||||
|
* En terme de RH
|
||||||
|
* En terme de processus
|
||||||
|
* En terme de technologies
|
||||||
|
* Manque de recul
|
||||||
|
* Des modeles difficilements industrialisables
|
||||||
|
* Encore en POC
|
||||||
|
* Pas de méthodes sur la partie OPS
|
||||||
|
* Approche centrée sur la technologie
|
||||||
|
* Collecte
|
||||||
|
* capable de ratisser tres large mais..
|
||||||
|
* quelle est la qualité de la donnée ?
|
||||||
|
* pertinente ou déchet ?
|
||||||
|
* Chaine opérationnelle
|
||||||
|
* Organisation non mobilisée
|
||||||
|
* Faible collaboration liées aux différences culturelles
|
||||||
|
* Vision transverse aux différentsmétiers
|
||||||
|
* Quels temps de réactions
|
||||||
|
* entre la collecte
|
||||||
|
* le traitement
|
||||||
|
* et l'action
|
||||||
|
* Vision à 360° et humanisme
|
||||||
|
* La machine ne fait pas de prise en compte globale
|
||||||
|
* L'analyse du contexte, une vision à 360° autour de la donnée, importe tout autant que cette dernière
|
||||||
|
* Risque juridique
|
||||||
|
* données perosnnelles dans les modeles (RGPD)
|
||||||
|
* a qui appartient le modele entrainé sur la base de données d'un tiers (propriété intellectuelle / industrielle)
|
||||||
|
|
||||||
|
## Références
|
||||||
|
|
||||||
|
* [READ. La Tribune : Mener à bien un projet data : une route encore semée d'embûches![Flag: url](flags/flag-url.png)](https://www.latribune.fr/opinions/tribunes/mener-a-bien-un-projet-data-une-route-encore-semee-d-embuches-792583.html)
|
||||||
|
* [Data Analytics Post : CHEF DE PROJET DATA : L’EXPERT BUSINESS DE L’ENTREPRISE![Flag: url](flags/flag-url.png)](https://dataanalyticspost.com/fiche-metier/chef-de-projet-data/)
|
||||||
|
* [Op Team : Quelle gestion de projet pour le BIG DATA![Flag: url](flags/flag-url.png)](https://www.opteam.fr/blog/quelle-gestion-de-projet-pour-le-big-data)
|
||||||
|
* [PLB : Formation Big Data : Concevoir et piloter un projet Big Data![Flag: url](flags/flag-url.png)](https://www.plb.fr/formation/aide-%C3%A0-la-d%C3%A9cision/formation-gestion-projet-big-data,31-700375.php)
|
||||||
|
* [READ. Chefdentreprise.com : PME : les 5 étapes clés pour réussir un projet data![Flag: url](flags/flag-url.png)](https://www.chefdentreprise.com/)
|
||||||
|
* ROI
|
||||||
|
* PME
|
||||||
|
* [READ. BusinessDecisions : Data Science et IA : comment bien cadrer vos projets d’entreprise ?![Flag: url](flags/flag-url.png)](https://fr.blog.businessdecision.com/data-science-ia-cadrer-projets-entreprise/)
|
||||||
|
* https://www.s-h.fr/la-data-analytics/
|
||||||
|
|
||||||
|
## Other topics
|
||||||
|
|
||||||
|
* Data visualisation
|
||||||
|
* DATA vs Business intelligence
|
||||||
|
* Big DATA
|
||||||
|
* Data Steward
|
||||||
|
|
||||||
|
* * *
|
||||||
|
|
||||||
|
/home/warbrain/src/Glenux/teaching-mgmt-data/slides/intro.html | 2020-04-08 |
|
||||||
|
[vym 2.6.11](http://www.insilmaril.de/vym)
|
||||||
|
---|---|---
|
||||||
|
|
Loading…
Reference in a new issue