first commit

master
meewan 3 years ago
parent 2ef9e0d321
commit 123eafe84c

@ -0,0 +1,7 @@
from datetime import datetime
context = {
'generated_date': datetime.now(),
'site_name': 'Katzei',
'mail_key': '_fxvwk',
}

@ -0,0 +1,79 @@
#!/usr/bin/python3
import os
import shutil
import tarfile
import time
from argparse import ArgumentParser
from jinja2 import Environment, PackageLoader, select_autoescape
from config import context
def dev(args, output):
while True:
time.sleep(0.5)
render(args, output, quiet=True)
def render(args, output, quiet=False):
# do build folder
if os.path.exists(output):
shutil.rmtree(output)
if not quiet:
print("copying static folder")
try:
shutil.copytree(os.path.join(os.getcwd(), 'static'), output)
except Exception:
pass
# build environement
env = Environment(
loader=PackageLoader(__name__, 'templates'),
autoescape=select_autoescape(['html'])
)
templates_folder = os.path.join(os.getcwd(), 'templates')
for root, dirs, templates in os.walk(templates_folder):
if root == os.path.join(templates_folder, 'meta'):
continue
for template_name in templates:
template_absolute_path = os.path.join(root, template_name)
template_file = template_absolute_path[len(templates_folder) + 1:]
if not quiet:
print('processing ' + template_file)
page = template_name[:-len('.html')]
template = env.get_template(template_file)
compiled_template = template.render(page=page, **context)
create_folder(output, template_file)
with open(os.path.join(output, template_file), mode='w') as fp:
fp.write(compiled_template)
def create_folder(container, template_file):
split_path = template_file.split(os.path.sep)
base_path = container
for folder in split_path[:-1]:
full_path = os.path.join(base_path, folder)
if not os.path.exists(full_path):
os.mkdir(full_path)
parser = ArgumentParser(description="Build website")
parser.add_argument('-o', '--output', default='build',
help="Output folder or file")
parser.add_argument('-f', '--format', default="folder",
choices=("gzip", "folder", 'dev'),
help="Format output (either gzip, dev or folder)")
args = parser.parse_args()
output = args.output if args.format == 'folder' else '_build'
if args.format == 'dev':
output = '/var/www/html'
render(args, output)
# compress
if args.format == 'gzip':
with tarfile.open(args.output, "w:gz") as tar:
tar.add(output, arcname=os.path.basename(output))
shutil.rmtree(output)
elif args.format == 'dev':
dev(args, output)
shutil.rmtree(output)

@ -0,0 +1 @@
jinja2

10832
static/css/bulma.css vendored

File diff suppressed because it is too large Load Diff

@ -0,0 +1,981 @@
/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */
html,
body,
p,
ol,
ul,
li,
dl,
dt,
dd,
blockquote,
figure,
fieldset,
legend,
textarea,
pre,
iframe,
hr,
h1,
h2,
h3,
h4,
h5,
h6{
margin: 0;
padding: 0;
}
h1,
h2,
h3,
h4,
h5,
h6{
font-size: 100%;
font-weight: normal;
}
ul{
list-style: none;
}
button,
input,
select,
textarea{
margin: 0;
}
html{
box-sizing: border-box;
}
*, *::before, *::after{
box-sizing: inherit;
}
img,
video{
height: auto;
max-width: 100%;
}
iframe{
border: 0;
}
table{
border-collapse: collapse;
border-spacing: 0;
}
td,
th{
padding: 0;
}
td:not([align]),
th:not([align]){
text-align: left;
}
html{
background-color: white;
font-size: 16px;
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
min-width: 300px;
overflow-x: hidden;
overflow-y: scroll;
text-rendering: optimizeLegibility;
-webkit-text-size-adjust: 100%;
-moz-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
text-size-adjust: 100%;
}
article,
aside,
figure,
footer,
header,
hgroup,
section{
display: block;
}
body,
button,
input,
select,
textarea{
font-family: BlinkMacSystemFont, -apple-system, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", "Helvetica", "Arial", sans-serif;
}
code,
pre{
-moz-osx-font-smoothing: auto;
-webkit-font-smoothing: auto;
font-family: monospace;
}
body{
color: #4a4a4a;
font-size: 1em;
font-weight: 400;
line-height: 1.5;
}
a{
color: #3273dc;
cursor: pointer;
text-decoration: none;
}
a strong{
color: currentColor;
}
a:hover{
color: #363636;
}
code{
background-color: whitesmoke;
color: #f14668;
font-size: 0.875em;
font-weight: normal;
padding: 0.25em 0.5em 0.25em;
}
hr{
background-color: whitesmoke;
border: none;
display: block;
height: 2px;
margin: 1.5rem 0;
}
img{
height: auto;
max-width: 100%;
}
input[type="checkbox"],
input[type="radio"]{
vertical-align: baseline;
}
small{
font-size: 0.875em;
}
span{
font-style: inherit;
font-weight: inherit;
}
strong{
color: #363636;
font-weight: 700;
}
fieldset{
border: none;
}
pre{
-webkit-overflow-scrolling: touch;
background-color: whitesmoke;
color: #4a4a4a;
font-size: 0.875em;
overflow-x: auto;
padding: 1.25rem 1.5rem;
white-space: pre;
word-wrap: normal;
}
pre code{
background-color: transparent;
color: currentColor;
font-size: 1em;
padding: 0;
}
table td,
table th{
vertical-align: top;
}
table td:not([align]),
table th:not([align]){
text-align: left;
}
table th{
color: #363636;
}
.box:not(:last-child), .content:not(:last-child), .notification:not(:last-child), .progress:not(:last-child), .table:not(:last-child), .table-container:not(:last-child), .title:not(:last-child),
.subtitle:not(:last-child), .block:not(:last-child), .highlight:not(:last-child), .breadcrumb:not(:last-child), .level:not(:last-child), .list:not(:last-child), .message:not(:last-child), .pagination:not(:last-child), .tabs:not(:last-child){
margin-bottom: 1.5rem;
}
.title,
.subtitle{
word-break: break-word;
}
.title{
color: #363636;
font-size: 2rem;
font-weight: 600;
line-height: 1.125;
}
.subtitle{
color: #4a4a4a;
font-size: 1.25rem;
font-weight: 400;
line-height: 1.25;
}
.subtitle.is-6 {
font-size: 1rem;
}
.select:not(.is-multiple):not(.is-loading)::after, .navbar-link:not(.is-arrowless)::after{
border: 3px solid transparent;
border-radius: 2px;
border-right: 0;
border-top: 0;
content: " ";
display: block;
height: 0.625em;
margin-top: -0.4375em;
pointer-events: none;
position: absolute;
top: 50%;
transform: rotate(-45deg);
transform-origin: center;
width: 0.625em;
}
.navbar{
background-color: white;
min-height: 3.25rem;
position: relative;
z-index: 30;
}
.navbar.is-dark{
background-color: #363636;
color: #fff;
}
.navbar.is-dark .navbar-brand > .navbar-item,
.navbar.is-dark .navbar-brand .navbar-link{
color: #fff;
}
.navbar.is-dark .navbar-brand > a.navbar-item:focus, .navbar.is-dark .navbar-brand > a.navbar-item:hover, .navbar.is-dark .navbar-brand > a.navbar-item.is-active,
.navbar.is-dark .navbar-brand .navbar-link:focus,
.navbar.is-dark .navbar-brand .navbar-link:hover,
.navbar.is-dark .navbar-brand .navbar-link.is-active{
background-color: #292929;
color: #fff;
}
.navbar.is-dark .navbar-brand .navbar-link::after{
border-color: #fff;
}
.navbar.is-dark .navbar-burger{
color: #fff;
}
@media screen and (min-width: 1024px){
.navbar.is-dark .navbar-start > .navbar-item,
.navbar.is-dark .navbar-start .navbar-link,
.navbar.is-dark .navbar-end > .navbar-item,
.navbar.is-dark .navbar-end .navbar-link{
color: #fff;
}
.navbar.is-dark .navbar-start > a.navbar-item:focus, .navbar.is-dark .navbar-start > a.navbar-item:hover, .navbar.is-dark .navbar-start > a.navbar-item.is-active,
.navbar.is-dark .navbar-start .navbar-link:focus,
.navbar.is-dark .navbar-start .navbar-link:hover,
.navbar.is-dark .navbar-start .navbar-link.is-active,
.navbar.is-dark .navbar-end > a.navbar-item:focus,
.navbar.is-dark .navbar-end > a.navbar-item:hover,
.navbar.is-dark .navbar-end > a.navbar-item.is-active,
.navbar.is-dark .navbar-end .navbar-link:focus,
.navbar.is-dark .navbar-end .navbar-link:hover,
.navbar.is-dark .navbar-end .navbar-link.is-active{
background-color: #292929;
color: #fff;
}
.navbar.is-dark .navbar-start .navbar-link::after,
.navbar.is-dark .navbar-end .navbar-link::after{
border-color: #fff;
}
.navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,
.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,
.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link{
background-color: #292929;
color: #fff;
}
.navbar.is-dark .navbar-dropdown a.navbar-item.is-active{
background-color: #363636;
color: #fff;
}
}
.navbar > .container{
align-items: stretch;
display: flex;
min-height: 3.25rem;
width: 100%;
}
.navbar.is-fixed-top{
left: 0;
position: fixed;
right: 0;
z-index: 30;
}
.navbar.is-fixed-top{
top: 0;
}
html.has-navbar-fixed-top,
body.has-navbar-fixed-top{
padding-top: 3.25rem;
}
.navbar-brand{
align-items: stretch;
display: flex;
flex-shrink: 0;
min-height: 3.25rem;
}
.navbar-brand a.navbar-item:focus, .navbar-brand a.navbar-item:hover{
background-color: transparent;
}
.navbar-burger{
color: #4a4a4a;
cursor: pointer;
display: block;
height: 3.25rem;
position: relative;
width: 3.25rem;
margin-left: auto;
}
.navbar-burger span{
background-color: currentColor;
display: block;
height: 1px;
left: calc(50% - 8px);
position: absolute;
transform-origin: center;
transition-duration: 86ms;
transition-property: background-color, opacity, transform;
transition-timing-function: ease-out;
width: 16px;
}
.navbar-burger span:nth-child(1){
top: calc(50% - 6px);
}
.navbar-burger span:nth-child(2){
top: calc(50% - 1px);
}
.navbar-burger span:nth-child(3){
top: calc(50% + 4px);
}
.navbar-burger:hover{
background-color: rgba(0, 0, 0, 0.05);
}
.navbar-menu{
display: none;
}
.navbar-item,
.navbar-link{
color: #4a4a4a;
display: block;
line-height: 1.5;
padding: 0.5rem 0.75rem;
position: relative;
}
.navbar-item .icon:only-child,
.navbar-link .icon:only-child{
margin-left: -0.25rem;
margin-right: -0.25rem;
}
a.navbar-item,
.navbar-link{
cursor: pointer;
}
a.navbar-item:focus, a.navbar-item:focus-within, a.navbar-item:hover, a.navbar-item.is-active,
.navbar-link:focus,
.navbar-link:focus-within,
.navbar-link:hover,
.navbar-link.is-active{
background-color: #fafafa;
color: #3273dc;
}
.navbar-item{
display: block;
flex-grow: 0;
flex-shrink: 0;
}
.navbar-item img{
max-height: 1.75rem;
}
.navbar-item.has-dropdown{
padding: 0;
}
.navbar-link:not(.is-arrowless){
padding-right: 2.5em;
}
.navbar-link:not(.is-arrowless)::after{
border-color: #3273dc;
margin-top: -0.375em;
right: 1.125em;
}
.navbar-dropdown{
font-size: 0.875rem;
padding-bottom: 0.5rem;
padding-top: 0.5rem;
}
.navbar-dropdown .navbar-item{
padding-left: 1.5rem;
padding-right: 1.5rem;
}
.navbar-divider{
background-color: whitesmoke;
border: none;
display: none;
height: 2px;
margin: 0.5rem 0;
}
@media screen and (max-width: 1023px){
.navbar > .container{
display: block;
}
.navbar-brand .navbar-item{
align-items: center;
display: flex;
}
.navbar-link::after{
display: none;
}
.navbar-menu{
background-color: white;
box-shadow: 0 8px 16px rgba(10, 10, 10, 0.1);
padding: 0.5rem 0;
}
.navbar-menu.is-active{
display: block;
}
.navbar.is-fixed-top .navbar-menu, .navbar.is-fixed-top-touch .navbar-menu{
-webkit-overflow-scrolling: touch;
max-height: calc(100vh - 3.25rem);
overflow: auto;
}
}
@media screen and (min-width: 1024px){
.navbar,
.navbar-menu,
.navbar-start,
.navbar-end{
align-items: stretch;
display: flex;
}
.navbar{
min-height: 3.25rem;
}
.navbar.is-spaced{
padding: 1rem 2rem;
}
.navbar.is-spaced .navbar-start,
.navbar.is-spaced .navbar-end{
align-items: center;
}
.navbar.is-spaced a.navbar-item,
.navbar.is-spaced .navbar-link{
border-radius: 4px;
}
.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link, .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link, .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link, .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{
background-color: transparent !important;
}
.navbar.is-transparent .navbar-dropdown a.navbar-item:focus, .navbar.is-transparent .navbar-dropdown a.navbar-item:hover{
background-color: whitesmoke;
color: #0a0a0a;
}
.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{
background-color: whitesmoke;
color: #3273dc;
}
.navbar-burger{
display: none;
}
.navbar-item,
.navbar-link{
align-items: center;
display: flex;
}
.navbar-item{
display: flex;
}
.navbar-item.has-dropdown{
align-items: stretch;
}
.navbar-item.has-dropdown-up .navbar-link::after{
transform: rotate(135deg) translate(0.25em, -0.25em);
}
.navbar-item.has-dropdown-up .navbar-dropdown{
border-bottom: 2px solid #dbdbdb;
border-radius: 6px 6px 0 0;
border-top: none;
bottom: 100%;
box-shadow: 0 -8px 8px rgba(10, 10, 10, 0.1);
top: auto;
}
.navbar-item.is-active .navbar-dropdown, .navbar-item.is-hoverable:focus .navbar-dropdown, .navbar-item.is-hoverable:focus-within .navbar-dropdown, .navbar-item.is-hoverable:hover .navbar-dropdown{
display: block;
}
.navbar.is-spaced .navbar-item.is-active .navbar-dropdown, .navbar-item.is-active .navbar-dropdown.is-boxed, .navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown, .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed, .navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown, .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed, .navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown, .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{
opacity: 1;
pointer-events: auto;
transform: translateY(0);
}
.navbar-menu{
flex-grow: 1;
flex-shrink: 0;
}
.navbar-start{
justify-content: flex-start;
margin-right: auto;
}
.navbar-end{
justify-content: flex-end;
margin-left: auto;
}
.navbar-dropdown{
background-color: white;
border-bottom-left-radius: 6px;
border-bottom-right-radius: 6px;
border-top: 2px solid #dbdbdb;
box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1);
display: none;
font-size: 0.875rem;
left: 0;
min-width: 100%;
position: absolute;
top: 100%;
z-index: 20;
}
.navbar-dropdown .navbar-item{
padding: 0.375rem 1rem;
white-space: nowrap;
}
.navbar-dropdown a.navbar-item{
padding-right: 3rem;
}
.navbar-dropdown a.navbar-item:focus, .navbar-dropdown a.navbar-item:hover{
background-color: whitesmoke;
color: #0a0a0a;
}
.navbar-dropdown a.navbar-item.is-active{
background-color: whitesmoke;
color: #3273dc;
}
.navbar.is-spaced .navbar-dropdown, .navbar-dropdown.is-boxed{
border-radius: 6px;
border-top: none;
box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1);
display: block;
opacity: 0;
pointer-events: none;
top: calc(100% + (-4px));
transform: translateY(-5px);
transition-duration: 86ms;
transition-property: opacity, transform;
}
.navbar-dropdown.is-right{
left: auto;
right: 0;
}
.navbar-divider{
display: block;
}
.navbar > .container .navbar-brand,
.container > .navbar .navbar-brand{
margin-left: -.75rem;
}
.navbar > .container .navbar-menu,
.container > .navbar .navbar-menu{
margin-right: -.75rem;
}
a.navbar-item.is-active,
.navbar-link.is-active{
color: #0a0a0a;
}
a.navbar-item.is-active:not(:focus):not(:hover),
.navbar-link.is-active:not(:focus):not(:hover){
background-color: transparent;
}
.navbar-item.has-dropdown:focus .navbar-link, .navbar-item.has-dropdown:hover .navbar-link, .navbar-item.has-dropdown.is-active .navbar-link{
background-color: #fafafa;
}
}
.container{
flex-grow: 1;
margin: 0 auto;
position: relative;
width: auto;
}
@media screen and (min-width: 1024px){
.container{
max-width: 960px;
}
}
@media screen and (min-width: 1216px){
.container{
max-width: 1152px;
}
}
@media screen and (min-width: 1408px){
.container{
max-width: 1344px;
}
}
.button, .input, .textarea, .select select, .file-cta,
.file-name, .pagination-previous,
.pagination-next,
.pagination-link,
.pagination-ellipsis{
-moz-appearance: none;
-webkit-appearance: none;
align-items: center;
border: 1px solid transparent;
border-radius: 4px;
box-shadow: none;
display: inline-flex;
font-size: 1rem;
height: 2.5em;
justify-content: flex-start;
line-height: 1.5;
padding-bottom: calc(0.5em - 1px);
padding-left: calc(0.75em - 1px);
padding-right: calc(0.75em - 1px);
padding-top: calc(0.5em - 1px);
position: relative;
vertical-align: top;
}
.button:focus, .input:focus, .textarea:focus, .select select:focus, .file-cta:focus,
.file-name:focus, .pagination-previous:focus,
.pagination-next:focus,
.pagination-link:focus,
.pagination-ellipsis:focus, .is-focused.button, .is-focused.input, .is-focused.textarea, .select select.is-focused, .is-focused.file-cta,
.is-focused.file-name, .is-focused.pagination-previous,
.is-focused.pagination-next,
.is-focused.pagination-link,
.is-focused.pagination-ellipsis, .button:active, .input:active, .textarea:active, .select select:active, .file-cta:active,
.file-name:active, .pagination-previous:active,
.pagination-next:active,
.pagination-link:active,
.pagination-ellipsis:active, .is-active.button, .is-active.input, .is-active.textarea, .select select.is-active, .is-active.file-cta,
.is-active.file-name, .is-active.pagination-previous,
.is-active.pagination-next,
.is-active.pagination-link,
.is-active.pagination-ellipsis{
outline: none;
}
.button[disabled], .input[disabled], .textarea[disabled], .select select[disabled], .file-cta[disabled],
.file-name[disabled], .pagination-previous[disabled],
.pagination-next[disabled],
.pagination-link[disabled],
.pagination-ellipsis[disabled],
fieldset[disabled] .button,
fieldset[disabled] .input,
fieldset[disabled] .textarea,
fieldset[disabled] .select select,
.select fieldset[disabled] select,
fieldset[disabled] .file-cta,
fieldset[disabled] .file-name,
fieldset[disabled] .pagination-previous,
fieldset[disabled] .pagination-next,
fieldset[disabled] .pagination-link,
fieldset[disabled] .pagination-ellipsis{
cursor: not-allowed;
}
/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */
html,
body,
p,
ol,
ul,
li,
dl,
dt,
dd,
blockquote,
figure,
fieldset,
legend,
textarea,
pre,
iframe,
hr,
h1,
h2,
h3,
h4,
h5,
h6{
margin: 0;
padding: 0;
}
h1,
h2,
h3,
h4,
h5,
h6{
font-size: 100%;
font-weight: normal;
}
ul{
list-style: none;
}
button,
input,
select,
textarea{
margin: 0;
}
html{
box-sizing: border-box;
}
*, *::before, *::after{
box-sizing: inherit;
}
img,
video{
height: auto;
max-width: 100%;
}
iframe{
border: 0;
}
table{
border-collapse: collapse;
border-spacing: 0;
}
td,
th{
padding: 0;
}
td:not([align]),
th:not([align]){
text-align: left;
}
html{
background-color: white;
font-size: 16px;
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
min-width: 300px;
overflow-x: hidden;
overflow-y: scroll;
text-rendering: optimizeLegibility;
-webkit-text-size-adjust: 100%;
-moz-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
text-size-adjust: 100%;
}
article,
aside,
figure,
footer,
header,
hgroup,
section{
display: block;
}
body,
button,
input,
select,
textarea{
font-family: BlinkMacSystemFont, -apple-system, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", "Helvetica", "Arial", sans-serif;
}
code,
pre{
-moz-osx-font-smoothing: auto;
-webkit-font-smoothing: auto;
font-family: monospace;
}
body{
color: #4a4a4a;
font-size: 1em;
font-weight: 400;
line-height: 1.5;
}
a{
color: #3273dc;
cursor: pointer;
text-decoration: none;
}
a strong{
color: currentColor;
}
a:hover{
color: #363636;
}
code{
background-color: whitesmoke;
color: #f14668;
font-size: 0.875em;
font-weight: normal;
padding: 0.25em 0.5em 0.25em;
}
hr{
background-color: whitesmoke;
border: none;
display: block;
height: 2px;
margin: 1.5rem 0;
}
img{
height: auto;
max-width: 100%;
}
input[type="checkbox"],
input[type="radio"]{
vertical-align: baseline;
}
small{
font-size: 0.875em;
}
span{
font-style: inherit;
font-weight: inherit;
}
strong{
color: #363636;
font-weight: 700;
}
fieldset{
border: none;
}
pre{
-webkit-overflow-scrolling: touch;
background-color: whitesmoke;
color: #4a4a4a;
font-size: 0.875em;
overflow-x: auto;
padding: 1.25rem 1.5rem;
white-space: pre;
word-wrap: normal;
}
pre code{
background-color: transparent;
color: currentColor;
font-size: 1em;
padding: 0;
}
table td,
table th{
vertical-align: top;
}
table td:not([align]),
table th:not([align]){
text-align: left;
}
table th{
color: #363636;
}
.is-clearfix::after{
clear: both;
content: " ";
display: table;
}
.is-sr-only{
border: none !important;
clip: rect(0, 0, 0, 0) !important;
height: 0.01em !important;
overflow: hidden !important;
padding: 0 !important;
position: absolute !important;
white-space: nowrap !important;
width: 0.01em !important;
}

@ -0,0 +1,156 @@
.logo
{
margin-right: 10px;
}
.mail {
font-size: 1.5em;
}
.mastodon {
width: 24px;
position: relative;
top: 2px;
}
#menu-toggle:checked + .navbar-menu
{
display: block;
}
#menu-toggle
{
display: none;
}
.menu-selected
{
height: 3px;
position: fixed;
margin-top:2.65em;
}
.centered-text
{
text-align:center;
}
.full-width
{
width:100%;
}
#service_pro li::before, #service_con li::before {
font-size: 1.2em;
font-weight: 500;
display: inline-block;
width: 1em;
}
#service_pro li::before
{
content: "\2295";
color:#25c425;
}
#service_con li::before
{
content: "\2296";
color:#FF0000;
}
#service_pro, #service_con
{
margin-bottom: 1.5em;
}
#service_infobox tr td
{
padding-left:5px;
padding-right:5px;
padding-top:2.5px;
padding-bottom: 2.5px;
}
.service_link{
font-size: 1.2em;
font-weight: 650;
margin: 0.75rem;
}
@media screen and (min-width: 1022px)
{
#main
{
width: 50%;
padding-top: 25px;
padding-bottom: 25px;
}
#service_infobox
{
border-left: 1px solid black;
min-width:300px;
}
.columns {
display: flex;
margin-left: -0.75rem;
margin-right: -0.75rem;
margin-top: -0.75rem;
}
.column {
display: block;
flex-basis: auto;
flex-grow: 1;
flex-shrink: 1;
padding: 0.75rem;
}
}
@media screen and (max-width: 1023px)
{
#main
{
margin-left: 5%;
margin-right: 5%;
padding-top: 25px;
padding-bottom: 25px;
}
}
p
{
margin-bottom: 1.5rem;
}
li
{
margin-left:4ch;
}
#legal-logo
{
width: 10%;
height: 10%;
margin-left: 100px;
}
.small-caps
{
font-variant: small-caps;
}
.hardware
{
border:none;
margin-left: 4ch;
margin-bottom: 1.5rem;
}
.hardware tr td:nth-child(1)
{
width: 10ch;
}
.service-logo
{
min-height:150px;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 376 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generator: Adobe Illustrator 24.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Black_CMYK_Horizontal" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 550.8 90.4" style="enable-background:new 0 0 550.8 90.4;" xml:space="preserve">
<path id="Identity" d="M133,24.6c6.2,0,11.1,2.4,14.6,7.3c3.5,4.8,5.3,11.5,5.3,19.9c0,8.7-1.8,15.4-5.4,20.2 c-3.6,4.8-8.6,7.1-14.8,7.1c-6.2,0-11-2.2-14.5-6.7h-1l-1.9,4.7c-0.3,0.7-1,1.1-1.7,1.1h-7.9c-1,0-1.8-0.8-1.8-1.8V6.8 c0-1,0.8-1.8,1.8-1.8h10.7c1,0,1.8,0.8,1.8,1.8V22c0,2.2-0.2,5.6-0.6,10.4h0.6C121.4,27.2,126.4,24.6,133,24.6z M128.4,36.1 c-3.5,0-6.1,1.1-7.8,3.3c-1.6,2.2-2.5,5.8-2.5,10.8v1.6c0,5.6,0.8,9.7,2.5,12.1c1.7,2.4,4.3,3.7,8,3.7c2.9,0,5.3-1.4,7-4.1 c1.7-2.7,2.6-6.7,2.6-11.8c0-5.2-0.9-9.1-2.6-11.6C133.8,37.4,131.4,36.1,128.4,36.1z M176.5,78.2h-10.7c-1,0-1.8-0.8-1.8-1.8V27.4 c0-1,0.8-1.8,1.8-1.8h10.7c1,0,1.8,0.8,1.8,1.8v48.9C178.3,77.3,177.5,78.2,176.5,78.2z M215.5,67.7c2.1,0,4.6-0.4,7.5-1.2 c0.8-0.2,1.5,0.4,1.5,1.2v8.2c0,0.5-0.3,0.9-0.7,1.1c-3.4,1.4-7.6,2.1-12.4,2.1c-5.7,0-9.9-1.4-12.5-4.4c-2.6-2.9-3.9-7.2-3.9-13 V36.4h-5.6c-0.7,0-1.2-0.5-1.2-1.2v-4.7c0-0.1,0.1-0.2,0.1-0.3l7.8-4.7l3.8-10.3c0.2-0.5,0.6-0.8,1.1-0.8h7.1c0.7,0,1.2,0.5,1.2,1.2 v10h14.1c0.3,0,0.6,0.3,0.6,0.6v8.9c0,0.7-0.5,1.2-1.2,1.2h-13.5v25.3c0,2,0.6,3.5,1.7,4.5C212.2,67.2,213.7,67.7,215.5,67.7z M282.1,78.2c-1.4,0-2.5-0.9-3-2.2l-10.5-32c-0.7-2.3-1.6-5.7-2.8-10.2h-0.3l-1,3.5l-2.1,6.8l-10.7,32c-0.4,1.3-1.6,2.1-3,2.1l0,0 c-1.4,0-2.6-0.9-3-2.3l-13.2-46c-0.4-1.4,0.7-2.9,2.2-2.9h0.3c1,0,1.9,0.7,2.2,1.7l7.7,28c1.9,7.3,3.2,12.7,3.8,16.2h0.3 c1.8-7.3,3.2-12.2,4-14.6L263,29c0.4-1.2,1.5-2,2.8-2l0,0c1.3,0,2.4,0.8,2.8,2l9.4,29.1c2.3,7.4,3.6,12.2,4.1,14.6h0.3 c0.3-2,1.5-7.5,3.8-16.4l7.4-27.7c0.3-1,1.2-1.7,2.2-1.7l0,0c1.5,0,2.6,1.4,2.2,2.9l-12.5,46c-0.4,1.4-1.6,2.3-3,2.3H282.1z M340.8,78.2c-0.9,0-1.7-0.7-1.8-1.6l-0.9-6.5h-0.4c-2.6,3.3-5.2,5.6-7.9,7c-2.7,1.4-5.9,2-9.6,2c-5,0-8.9-1.3-11.7-3.9 c-2.5-2.3-3.9-5.3-4.1-9.2c-0.4-5.1,1.8-10.1,6-13c4.2-2.8,10.2-4.4,18.2-4.5l9.7-0.3v-3.4c0-4.9-1-8.5-3-11c-2-2.5-5.2-3.7-9.5-3.7 c-4.1,0-8.3,1-12.7,3c-1.1,0.5-2.4,0-2.9-1.1v0c-0.5-1.1,0-2.4,1.1-2.8c4.9-2,9.8-3.1,14.7-3.1c5.6,0,9.8,1.5,12.6,4.4 c2.8,2.9,4.2,7.5,4.2,13.6v32.2C342.7,77.3,341.8,78.2,340.8,78.2L340.8,78.2z M320.4,74.9c5.5,0,9.8-1.6,12.9-4.7 c3.2-3.1,4.7-7.5,4.7-13v-5l-8.9,0.4c-7.2,0.3-12.3,1.5-15.4,3.4c-3.1,1.9-4.6,4.9-4.6,8.9c0,3.2,1,5.7,2.9,7.5 C314.1,74,316.8,74.9,320.4,74.9z M378.9,26.1c1.5,0,3,0.1,4.6,0.3c1.3,0.2,2.1,1.4,1.9,2.6v0c-0.2,1.2-1.4,1.9-2.6,1.7 c-1.5-0.2-3-0.4-4.5-0.4c-4.4,0-7.9,1.9-10.7,5.5c-2.8,3.7-4.2,8.4-4.2,14v25.9c0,1.3-1,2.3-2.3,2.3h0c-1.3,0-2.3-1-2.3-2.3V29.1 c0-1.1,0.9-2,2-2l0,0c1.1,0,2,0.8,2,1.9l0.4,7.3h0.3c2.1-3.8,4.3-6.4,6.7-7.9C372.7,26.8,375.6,26.1,378.9,26.1z M413.7,26.1 c3.7,0,6.9,0.7,9.6,2c2.7,1.3,5.1,3.7,7.2,6.9h0.3c-0.2-4-0.3-7.8-0.3-11.6V7.3c0-1.3,1-2.3,2.3-2.3l0,0c1.3,0,2.3,1,2.3,2.3v69.2 c0,0.9-0.7,1.6-1.6,1.6l0,0c-0.8,0-1.5-0.6-1.6-1.4l-1-6.4h-0.4c-3.9,5.8-9.5,8.7-16.7,8.7c-7.1,0-12.4-2.2-16.2-6.6 c-3.7-4.4-5.6-10.8-5.6-19.2c0-8.8,1.8-15.6,5.5-20.3C401.2,28.4,406.6,26.1,413.7,26.1z M413.7,30.3c-5.6,0-9.8,2-12.6,5.9 c-2.8,3.9-4.2,9.6-4.2,17.1c0,14.5,5.6,21.7,16.9,21.7c5.8,0,10-1.7,12.7-5c2.7-3.4,4-8.9,4-16.6v-0.8c0-7.9-1.3-13.6-4-17 C423.9,32,419.6,30.3,413.7,30.3z M472.9,79.1c-7.4,0-13.2-2.3-17.4-6.9c-4.2-4.6-6.2-11-6.2-19.2c0-8.2,2-14.7,6-19.6 c4-4.9,9.4-7.4,16.2-7.4c6,0,10.8,2.1,14.2,6.3c3.5,4.2,5.2,9.9,5.2,17.1v3.8h-36.8c0.1,7,1.7,12.4,4.9,16.1 c3.2,3.7,7.8,5.5,13.8,5.5c2.9,0,5.5-0.2,7.7-0.6c1.6-0.3,3.5-0.8,5.7-1.6c1.3-0.5,2.7,0.5,2.7,1.9l0,0c0,0.8-0.5,1.6-1.3,1.9 c-2.4,1-4.6,1.6-6.7,2C478.6,78.9,475.9,79.1,472.9,79.1z M471.5,30.2c-4.9,0-8.9,1.6-11.9,4.9c-3,3.2-4.7,7.9-5.2,14h31.6 c0-5.9-1.3-10.6-3.9-13.9C479.7,31.9,476.1,30.2,471.5,30.2z M543.1,78.2c-1.3,0-2.3-1-2.3-2.3V45c0-5.1-1.1-8.9-3.2-11.2 c-2.2-2.3-5.5-3.5-10.1-3.5c-6.1,0-10.6,1.5-13.4,4.6c-2.8,3.1-4.3,8.1-4.3,15v25.9c0,1.3-1,2.3-2.3,2.3h0c-1.3,0-2.3-1-2.3-2.3 V29.1c0-1.2,0.9-2.1,2.1-2.1l0,0c1.1,0,1.9,0.8,2.1,1.8L510,34h0.3c3.3-5.3,9.2-8,17.7-8c11.6,0,17.4,6.2,17.4,18.7v31.1 C545.4,77.1,544.3,78.2,543.1,78.2L543.1,78.2z M171.2,4.2L171.2,4.2c-4.6,0-8.4,3.6-8.4,8V13c0,4.4,3.8,8,8.4,8h0 c4.6,0,8.4-3.6,8.4-8v-0.7C179.6,7.8,175.8,4.2,171.2,4.2z M72,6c-0.7-0.7-1.5-1-2.4-1H8.8C7.8,5,7.1,5.3,6.4,6 c-0.7,0.7-1,1.5-1,2.4V49c0,3,0.6,6,1.8,9c1.2,3,2.6,5.6,4.4,7.9c1.7,2.3,3.8,4.6,6.2,6.7c2.4,2.2,4.6,4,6.7,5.4 c2,1.4,4.2,2.8,6.4,4.1c2.2,1.3,3.8,2.2,4.7,2.6c0.9,0.5,1.7,0.8,2.2,1.1c0.4,0.2,0.9,0.3,1.4,0.3c0.5,0,1-0.1,1.4-0.3 c0.6-0.2,1.3-0.6,2.2-1.1c0.9-0.5,2.5-1.3,4.7-2.6c2.2-1.3,4.4-2.7,6.4-4.1c2-1.4,4.3-3.3,6.7-5.4c2.4-2.2,4.5-4.4,6.2-6.7 c1.7-2.3,3.2-5,4.4-7.9c1.2-3,1.8-6,1.8-9V8.4C73,7.5,72.7,6.7,72,6z M64.2,49.3c0,14.7-25,27.4-25,27.4v-63h25 C64.2,13.7,64.2,34.7,64.2,49.3z"/>
</svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="35.75px" height="28.75px" viewBox="0 0 216.4144 232.00976">
<path fill="#2b90d9" d="M211.80734 139.0875c-3.18125 16.36625-28.4925 34.2775-57.5625 37.74875-15.15875 1.80875-30.08375 3.47125-45.99875 2.74125-26.0275-1.1925-46.565-6.2125-46.565-6.2125 0 2.53375.15625 4.94625.46875 7.2025 3.38375 25.68625 25.47 27.225 46.39125 27.9425 21.11625.7225 39.91875-5.20625 39.91875-5.20625l.8675 19.09s-14.77 7.93125-41.08125 9.39c-14.50875.7975-32.52375-.365-53.50625-5.91875C9.23234 213.82 1.40609 165.31125.20859 116.09125c-.365-14.61375-.14-28.39375-.14-39.91875 0-50.33 32.97625-65.0825 32.97625-65.0825C49.67234 3.45375 78.20359.2425 107.86484 0h.72875c29.66125.2425 58.21125 3.45375 74.8375 11.09 0 0 32.975 14.7525 32.975 65.0825 0 0 .41375 37.13375-4.59875 62.915"/>
<path fill="#fff" d="M177.50984 80.077v60.94125h-24.14375v-59.15c0-12.46875-5.24625-18.7975-15.74-18.7975-11.6025 0-17.4175 7.5075-17.4175 22.3525v32.37625H96.20734V85.42325c0-14.845-5.81625-22.3525-17.41875-22.3525-10.49375 0-15.74 6.32875-15.74 18.7975v59.15H38.90484V80.077c0-12.455 3.17125-22.3525 9.54125-29.675 6.56875-7.3225 15.17125-11.07625 25.85-11.07625 12.355 0 21.71125 4.74875 27.8975 14.2475l6.01375 10.08125 6.015-10.08125c6.185-9.49875 15.54125-14.2475 27.8975-14.2475 10.6775 0 19.28 3.75375 25.85 11.07625 6.36875 7.3225 9.54 17.22 9.54 29.675"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.6 KiB

@ -0,0 +1,35 @@
{% extends "/meta/master.html" %}
{% block main %}
<h1 class="title">
Katzei
</h1>
<p>
Katzei est une association proposant un hébergement libre, éthique et auto-hébergé basée à Paris.
</p>
<h2 class="subtitle">
Libre
</h2>
<p>
Katzei n'utilise que des logiciels libres, aussi bien pour les services que pour l'infrastructure. Cela signifie que, si vous n'êtes pas satisfait des services offerts par Katzei, il vous est toujours possible de partir avec vos données et de les héberger ailleurs.
</p>
<p>
Le fait que Katzei utilise des logiciels libres signifie aussi que n'importe qui peut les auditer pour vérifier leur comportement ou en proposer des améliorations.
</p>
<h2 class="subtitle">
Éthique
</h2>
<p>
Katzei ne revend pas vos données. Nous utilisons autant que possible des logiciels où les données sont chiffrées dans votre navigateur, ce qui fait que nous ne pouvons ni les lire ni les modifier.
</p>
<p>
Katzei ne s'approprie pas les données que vous lui confiez. Vous en restez le propriétaire exclusif.
</p>
<h2 class="subtitle">
Auto-hébergé
</h2>
<p>
Les serveurs de Katzei sont hébergés aux domiciles de ses membres. Le résultat est que Katzei ne dépend pas d'un gros hébergeur qui pourrait couper le serveur ou en prendre le contrôle. L'inconvénient est que chaque serveur ne dispose que d'une unique alimentation électrique et d'une seule connexion à Internet, ce qui réduit donc un peu la fiabilité pour gagner en indépendance.
</p>
{% endblock %}

@ -0,0 +1,60 @@
{% extends "/meta/master.html" %}
{% block main %}
<h1 class="title">
Auto-hébergement
</h1>
<p>
Comme indiqué sur la page d'accueil de ce site, Katzei fournit des services auto-hébergés.
</p>
<p>
L'auto-hébergement est simplement le fait de conserver ses machines dans ses propres locaux plutôt que chez un prestataire. Cette façon de faire se retrouve dans le monde professionnel (de moins en moins) et parfois dans le monde amateur.
</p>
<p>
En général, un hébergeur débutant se tournera vers de l'auto-hébergement pour son prix et les faibles contraintes que cela lui impose : on utilisera une machine de récupération reliée à la box ADSL pour faire un hébergement passable. Dans certains cas, plus rares, des particuliers ou des associations font de l'auto-hébergement pour des raisons idéologiques. C'est le cas de Katzei qui a choisi l'auto-hébergement pour l'indépendance et la maîtrise technique qu'il autorise.
</p>
<p>
Dans cette page, nous nous évoquerons les avantages et inconvénients de l'auto-hébergement et des stratégies mises en place au sein de Katzei pour réaliser un auto-hébergement avec la meilleure qualité de service possible.
</p>
<h2 class="subtitle">
Les contraintes
</h2>
<p>
<b>La place :</b> Les domiciles des membres ne sont pas extensibles et nous n'avons pas un espace infini pour stocker des machines (sans parler de la consommation électrique). Nons avons donc recours aux <a href="https://fr.wikipedia.org/wiki/Machine_virtuelle">machines virtuelles</a> pour faire tourner de nombreux services sur une seule machine physique.
</p>
<p>
<b>Le bruit :</b> Les serveurs professionnels sont conçus pour être utilisés dans des salles spéciales où la place est limitée mais où il fait toujours frais. De même, puisqu'il est rare d'y voir passer des humains, les nuisances sonores n'y sont pas un problème. Les machines professionnelles sont donc petites et très bruyantes. À l'inverse, la plupart des machines utilisées par Katzei sont hébergées aux domiciles de ses membres et doivent donc être les plus discrètes possibles. Elles sont de fait construites à partir de composants grand public (moins bruyants et plus tolérants aux fortes chaleurs) et, même si elles prennent plus de place, elles sont alors bien plus discrètes.
</p>
<p>
<b>L'accès à Internet :</b> Pour faire de l'auto-hébergement personnel avec des usages ne consommant pas trop de bande passante, l'utilisation d'une ligne ADSL peut être suffisante. Pour un hébergeur comme Katzei, le besoin en bande passante des services exposés au public implique d'être connecté à Internet via une fibre optique, sans quoi le confort d'utilisation sera réduit.
</p>
<p>
<b>La pénurie d'adresses IP :</b> Une adresse IP est un identifiant unique sur Internet (exactement comme un numéro de téléphone). Ces adresses sont rares, le système principalement utilisé (IPv4) n'en permet que 4 milliards. Ce nombre peut sembler énorme mais, à l'échelle d'Internet, ce n'est pas tant que ça. Un nouveau type d'adresse IP (IPv6) a été créé dans les années 90 mais son adoption est lente et des pans entier d'internautes n'y ont pas accès. Souvent, les opérateurs de téléphonie mobile ne permettent pas de les utiliser. Nous sommes donc obligés d'héberger de multiples services sur la même adresse.
</p>
<h2 class="subtitle">
Les avantages
</h2>
<p>
<b>L'indépendance :</b> Quand votre machine est hébergée chez un prestataire, celui-ci a un accès physique à la machine. Si cela ne lui donne pas forcement accès aux données, il peut débrancher la machine très facilement pour n'importe quelle raison (la plus courante étant le non-paiement du loyer). Si la machine est chez l'un de nos membres, il est peu probable qu'une personne extérieure à l'association vienne débrancher la machine et, le membre en question ayant besoin de son accès à Internet pour son utilisation personnelle, il est très improbable qu'il oublie de le payer. De plus, il est très facile de changer de fournisseur d'accès à Internet en cas de problème avec celui-ci, alors que remonter une machine complète chez un autre prestataire demande bien plus de travail.
</p>
<p>
<b>Le prix :</b> Une machine similaire (processeur 8 cœurs, 48 Go de RAM) à celle hébergeant ce site (et de nombreux autres services pour Katzei) coûte environ 75€/mois chez un hébergeur bon marché (soit 900€ à l'année). En auto-hébergement, la machine neuve coûte 800€ à l'achat et moins de 100€ d'électricité par an. L'investissement sera donc amorti en moins d'un an.
</p>
<p>
<b>L'évolutivité :</b> Quand vous louez une machine chez un prestataire, cette machine ne peut évoluer. Quand vous êtes propriétaire de la machine et qu'elle se trouve à votre domicile (ou éventuellement dans un data-center), il est toujours possible de l'arrêter pour en changer un composant selon les besoins.
</p>
<h2 class="subtitle">
L'auto-hébergement chez Katzei
</h2>
<p>
Comme nous l'avons dit, Katzei est une structure auto-hébergée. La principale raison idéologique de ce choix (outre l'indépendance et la maîtrise matérielle) porte sur la symétrie d'Internet : de par son architecture, il n'y a aucune raison technique qui empêche d'utiliser la connexion à Internet d'un particulier pour héberger des services.
</p>
<p>
Pour résoudre le problème de bande passante consommée, le serveur principal de Katzei est hébergé à Paris (le réseau électrique y est très stable) et derrière un accès Free en fibre optique. Free reste encore aujourd'hui l'un des opérateurs les plus pratiques pour faire de l'auto-hébergement à un prix décent (à titre de comparaison, OVH propose un accès intéressant pour l'auto-hébergement mais à 54€/mois quand Free offre un meilleur débit pour 35€/mois, et les autres opérateurs ne facilitant pas l'auto-hébergement).
</p>
<p>
Pour résoudre le problème des adresses IP limitées (nous n'en avons qu'une seule pour l'instant), nous avons recours aux "<a href="https://fr.wikipedia.org/wiki/H%C3%A9bergement_virtuel">virtual hosts</a>" qui permettent de discriminer les requêtes ciblant un service ou un autre selon le nom de domaine demandé par l'utilisateur.
</p>
{% endblock %}

@ -0,0 +1,88 @@
{% extends "/meta/master.html" %}
{% block main %}
<h1 class="title">
Logiciels
</h1>
<h2 class="subtitle">
Architecture générale
</h2>
<p>
Si l'architecture matériel de Katzei est fortement liée à son coté auto-hébergé. Son architecture logiciel est, à l'inverse, beaucoup plus classique. Tout les services publiques étant rendu via le protocole HTTP(S) il y a un serveur proxy qui reçoit toutes les requêtes destinées aux ports 80 et 443 et les rediriges vers les services concernés. Les autres ports redirigent directement sur les machines gérant les service rendu sur ce port.
</p>
<p>
Par mesure de sécurité, afin de réduire les risques liés à de mauvaises manipulations, et pour réduire les temps dinterruption, chaque service est isolé dans une machine (le plus souvent virtuelle) qui lui est dédié. Un service n'est pas que ce uniquement vous pouvez utiliser directement mais peut aussi être interne. Par exemple nous gérons des services de DNS ou de mail qui ne sont pas proposés au publique.
</p>
<h2 class="subtitle">
Système d'exploitation
</h2>
<p>
Pour le choix du système d'exploitation qui allait être installé sur nos machines il fallait répondre à un cahier des charges classique:
<ul>
<li>
<b>Libre </b>: Katzei n'utilisant que des logiciels libres le système d'exploitation ne doit pas y faire exception;
</li>
<li>
<b>Léger </b>: Comme nous utilisons beaucoup de machines virtuelles, chacune d'elles doit être la plus légère possible;
</li>
<li>
<b>Stable </b>: Les administrateurs travaillant sur katzei sur leur temps libre il ne faut pas utiliser un système d'exploitation qui casse souvent oui qui change en profondeur régulièrement.
</li>
</ul>
</p>
<p>
Un certain nombre de distribution Linux ou de BSD répondent à ce cahier des charges et le choix parmi celle-ci est plus une affaire de goûts que de réel supériorité de l'une ou de l'autre. Nous avons choisi <a href="https://debian.org">Debian</a> qui est relativement léger (il s'installe et tourne très confortablement avec moins de 1Go de RAM) et extrêmement stable (certaines mauvaises langues diront même immobile), chaque version étant maintenue 2 ans puis continuant à recevoir des correctifs de sécurité pendant 2 à 4 ans supplémentaires. Le prix a payer pour cette stabilité est de n'avoir que rarement des logiciels à jour (même si les correctifs de sécurités sont bien entendu portés sur les anciennes versions) et quand une version de logiciel comporte un problème il est courant que ce problème ne soit pas corrigé avant la version suivant de de Debian.
</p>
<p>
D'autres distributions Linux auraient pu êtres utiliser comme <a href="https://www.centos.org/">CentOs</a> (une recompilation gratuite des sources de <a href="https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux">Red Hat Enterprise Linux</a>), <a href="https://ubuntu.com/server">Ubuntu Server</a> ou encore des version de <a href="https://fr.wikipedia.org/wiki/Berkeley_Software_Distribution">BSD</a> (comme <a href="https://www.freebsd.org/fr/">FreeBSD</a>).
<h2 class="subtitle">
Hyperviseur
</h2>
<p>
Un hyperviseur est un logiciel permettant de gérer et d'héberger une ou plusieurs machines virtuelles (guest ou invité) sur une même machine physique (host ou hôte).
</p>
<p>
Nous utilisons l'hyperviseur <a href="https://www.proxmox.com/en/proxmox-ve">Proxmox-ve</a> (généralement simplement désigné par "Proxmox") pour gérer le gros de l'infrastructure de Katzei. Cette distribution Linux est très proche de Debian et se contente d'y rajouter quelque paquets. Proxmox fournit une interface graphique via un serveur web simple permettant de faire toutes les opérations courantes.
</p>
<h2 class="subtitle">
Supervision
</h2>
<p>
Quand on essaye de construire une infrastructure stable a destination du publique il est indispensable de pouvoir être mis au courant quand un problème apparaît sur cette infrastructure. C'est ce qu'on appel la supervision.
</p>
<p>
Il existe beaucoup de systèmes de supervision comme <a href="https://www.nagios.org" >Nagios</a>, le système historique, ou des système très modernes comme <a href="https://https://prometheus.io/">Prometheus</a>, permettant de récolter des centaines de paramètres sur les machines et de les agréger dans le temps. Notre infrastructure restant très simple nous n'avons pas besoin de quelque chose d'aussi puissant que Prometheus et vue le nombre de paramètres remontés le configurer correctement pour nos besoin aurait été bien trop long. Nous avons finalement choisis d'utiliser <a href="https://icinga.com/">Icinga2</a>, un dérivé (complètement réécrit depuis) de Nagios, simple à configurer et avec une jolie interface.
</p>
<p>
<b>Attention :</b> si vous utilisez Icinga2 sous Debian Buster, le paquet présent sur les dépôts de la distribution à un défaut empêchant de l'utiliser comme agent. Pour éviter ce problème il est préférable d'installer la version présente sur le dépôt de Icinga.
</p>
<h2 class="subtitle">
Mail
</h2>
<p>
Même si Katzei ne fournit pas d'adresse mail à ses utilisateurs, il est indispensable de pouvoir envoyer des mails pour les services ou la supervision et de pouvoir en recevoir (au moins pour respecter les obligations légales). Katzei étant auto-hébergé, notre adresse IP est automatiquement rejetés par les gros hébergeurs de mail. Pour contourner ce blocage nous sommes obligés de passer par le relais de Free. Nous perdons donc un peu d'indépendance sur ce point mais c'est, malheureusement, le seul moyen pour envoyer des mails en restant auto-hébergé chez un opérateur grand publique.
</p>
<p>
Même si il existe un grand nombre de logiciels pour envoyer et recevoir des mails, le couple <a href="http://www.postfix.org/">Postfix</a>/<a href="https://www.dovecot.org/">Dovecot</a> est le plus courant. C'est donc logiquement celui que nous avons choisis. Même si il existe de nombreux tutoriels et une grosse documentation sur le sujet, la configuration de Postfix reste compliquée et peu intuitive. Si vous voulez vous lancer dans l'aventure prévoyez qu moins quelque jours pour réussir a le faire marcher convenablement (et avoir une configuration acceptable).
</p>
<h2 class="subtitle">
Domain Name Systeme (DNS)
</h2>
<p>
Dans une vision (très) simplifiée le DNS est l'annuaire qui permet d'associer un nom de domaine (par exemple "katzei.fr") à une adresse IP. Il existe deux type de serveurs DNS:
<ul>
<li>
<b>Les serveur faisant autorité </b>: Ces serveur sont ceux détenant la vérité et la partageant avec les autres. Ils font références sur le réseau et tout résolveurs donnant une réponse en contradiction avec les serveur faisant autorité sont considérer comme menteurs;
</li>
<li>
<b>Les résolveurs DNS </b>: ces serveurs sont ceux que vous contactez pour connaître l'adresse d'un site. Ils contacterons les différents serveurs faisant autorité jusquà trouver l'adresse que vous cherchez. En général vous utiliserez le résolveur DNS de votre fournisseur daccès a internet.
</li>
</ul>
</p>
<p>
Le fait que Katzei soit auto-hébergé rend assez absurde d'héberger nous même les serveurs faisant autorité pour katzei.fr. Nous utilisons donc les serveurs du bureau d'enregistrement à qui nous louons le domaine, à savoir OVH.
</p>
<p>
Comme pour n'importe quel infrastructure un peu compliqué nous avons besoin de définir un grand nombre de sous domaines pour les adresses des différentes machines. Pour ce faire nous utilisons un un résolveur DNS menteur qui au lieu de nous renvoyer les adresses publiques des services (la réponse que vous obtenez quand vous contactez un résolveur DNS publique) nous renvois les adresses privés, et inaccessible de lextérieur, des services. Pour ce résolveur nous utilisons <a href="https://nlnetlabs.nl/projects/unbound/about/">Unbound</a> qui a l'avantage d'être simple a configurer pour cette tâche.